fiesta13310 Posté(e) le 4 juin 2012 Posté(e) le 4 juin 2012 Bonjour à tous! Dans ma programmation, j'insère des commandes dans cet ordre là : commande "inserer"commande "reseau"commande "miroir" Tout d'abord, j'insère un bloc, ensuite je le copie en réseau, puis pour finir, je voudrai faire un miroir de toute ces copies. Voici le passage en question : (command "scu" "3" pt1 (polar pt1 ang0 1)(polar pt1 (+ ang0 (/ pi 2)) 1) "inserer" "B250" "0" "1" "1" "0" "reseau" "d" "" "rec" "1" nbbanche "2.50" "miroir" "d" "" (setq mil1 (getpoint "\n 1er point :" )) (setq mil1 (getpoint "\n 2ème point :" )) "n" ) Sauf qu'en faisant ceci, le miroir s'exécute uniquement pour le dernier bloc et c'est normal car j'ai écris "miroir" "d" (comme dernier). Du coup, je voulais remplacer "d" par une fonction (setq objet (....)). Et justement, quelle est cette fonction qui sert à sélectionner des objets? Je sais que :pour les angles = getanglepour les distances = getdistpour les points = getpoint...et pour les objets??????? Merci d'avance, bonne fin de journée à tous!
Tramber Posté(e) le 4 juin 2012 Posté(e) le 4 juin 2012 Tu as (entlast), équivalent de "D". Mais n'oublie pas une fois ENTREE ou " " pour validerton choix d'objet. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
fiesta13310 Posté(e) le 4 juin 2012 Auteur Posté(e) le 4 juin 2012 Tu as (entlast), équivalent de "D". Mais n'oublie pas une fois ENTREE ou " " pour validerton choix d'objet. Justement, je ne veux pas l'équivalent de "d" puisque "d" c'est que le dernier objet. Moi je veux tous les objets qui ont été copié en réseau.
Patrick_35 Posté(e) le 4 juin 2012 Posté(e) le 4 juin 2012 Salut Une astuce pour retrouver tous les objets qui ont été ajoutés.Après l'insertion d'un bloc, tu utilises (setq dernier (entlast)) pour retrouver le dernier objet de la base de données d'Autocad (en l'occurrence, l'objet inséré)Tu fais toutes tes manips, réseau, miroir, etc... et tu utilises la fonction lisp entnext sur la variable dernier pour retrouver le/les objets qui ont été ajoutés.Tu utilises autant de fois entnext qu'il y a d'objets ajoutés. Un entnext sur le dernier objet devra retourner nil. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
VDH-Bruno Posté(e) le 4 juin 2012 Posté(e) le 4 juin 2012 (modifié) Bonjour,Etudie plus particulièrement les fonctions entlast, entnext et ssadd Tout d'abord, j'insère un bloc, ensuite je le copie en réseau, puis pour finir, je voudrai faire un miroir de toute ces copies. Rapidement l’idée général pour ce que tu souhaite faire : En 1 : Après avoir inséré ton bloc, récupère avec entlast le nom de l’entité dessin que tu viens de créer, puis crée ensuite un jeu de sélection vide dans lequel tu stockera cette entitée (tu viens en quelque sorte d’obtenir un marqueur dans ta base de données)Le code en lisp :(setq e (entlast)); récupère le nom de la dernière entité (setq ss (ssadd)); Crée un jeu de sélection vide (ssadd e ss); place l'entité dans le jeu de sélection En 2 : Tu crées ton réseau comme tu le faisais précédemment, puis avec la fonction entnext et une itération tu liste toutes les entités nouvellement créé, que tu ajoutes à ton jeu de sélection, comme ceci…(while (setq e (entnext e)) (ssadd e ss) ) En 3 : Dans ta ligne de command miroir au lieu de donné "d" en paramètre tu passe ss (ton jeu de sélection de toutes les entités créer précédemment..) A+ et bonne continuation -----------------------Edit : Visiblement je viens de faire de l’écho au message de Patrick_35 qui a été plus rapide.. Modifié le 4 juin 2012 par VDH-Bruno Apprendre => Prendre => Rendre
fiesta13310 Posté(e) le 4 juin 2012 Auteur Posté(e) le 4 juin 2012 génial!! Ca a marché, merci beaucoup!! :D
fiesta13310 Posté(e) le 5 juin 2012 Auteur Posté(e) le 5 juin 2012 bonjour! Encore une question : ca marche, mais à haque fois je dois faire "entrée" au clavier pour exécuter les commandes. Comment faire pour éviter ceci? Merci
fiesta13310 Posté(e) le 11 juin 2012 Auteur Posté(e) le 11 juin 2012 salut, Plus personne ne veut me répondre? :) je répète : quand j'écris ceci dans mon programme, (setq e (entlast)) (setq ss (ssadd)) (ssadd e ss) Pour passer de l'un à l'autre il faut que j'appuis sur entrée à chaque fois. Le passage ne se fait pas automatiquement. Pourquoi? Merci d'avance
Tramber Posté(e) le 11 juin 2012 Posté(e) le 11 juin 2012 Mais ?Tu n'as pas inclus tout cela dans une fonction ? (defun c:maf ()...(setq e (entlast)) (setq ss (ssadd)) (ssadd e ss) ...) A charger avant de lancer MAF ? J'avoue que je ne comprends pas trop la question. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
fiesta13310 Posté(e) le 11 juin 2012 Auteur Posté(e) le 11 juin 2012 ben j'ai fais comme ca moi : (defun c:test9 () (command "scu" "") (setq ACC (getvar "osmode")); désactivation de l'accroch objet (setvar "osmode" 0) (setq long (getdist "\n donner la longueur du voile :" )) (setq larg (getdist "\n donner la largeur du voile :" )) (setvar "OSMODE" ACC) (setq pt1 (getpoint "\n spécifier le point d'insertion : ")) (setq rep (getstring "\n voulez-vous inserer votre banche à gauche? (o/n) : ")) (setq ang0 (getangle pt1 "\n angle d'orientation des banches /Ox :")) (setvar "osmode" 0) (setq nbbanche (rtos (fix (/ long 2.5)) 2 0)) (setq demilarg (/ larg -2)) (setq p1 (list 0 demilarg)) (setq p2 (list 1 demilarg)) (setvar "cmdecho" 0) (if (= rep "o") (command "scu" "3" pt1 (polar pt1 ang0 1)(polar pt1 (+ ang0 (/ pi 2)) 1) "inserer" "B250" "0" "1" "1" "0" "" (setq e (entlast))""; récupère le nom de la dernière entité insérer : soit le bloc (setq ss (ssadd)); Crée un jeu de sélection vide (ssadd e ss); place l'entité dans le jeu de sélection "reseau" "d" "" "rec" "1" nbbanche "2.50" "" (while (setq e (entnext e)) (ssadd e ss) ) "miroir" ss "" p1 p2 "n" ) ;"miroir" (setq NJ (ssget "\n choisir un ensemble d'objet :")) "" (setq mil1 (getpoint "\n 1er point :" )) (setq mil1 (getpoint "\n 2ème point :" )) "n" ) (command "inserer" "B250bis" pt1 "1" "0") ) (command "scu" "g") (setvar "OSMODE" ACC) (setq reponse (strcat "la longueur est de " (rtos long 2 4) " m et la largeur de " (rtos larg 2 4) " m" )) )
Tramber Posté(e) le 11 juin 2012 Posté(e) le 11 juin 2012 Il est INTERDIT de mélanger du code lisp et de l'instruction de commande (COMMAND) Donc je corrige ton IF en prenant PROGN pour grouper tes instructions : (if (= rep "o") (progn (command "scu" "3" pt1 (polar pt1 ang0 1)(polar pt1 (+ ang0 (/ pi 2)) 1) "inserer" "B250" "0" "1" "1" "0") (setq e (entlast)) (setq ss (ssadd)) (ssadd e ss) (command "reseau" "d" "" "rec" "1" nbbanche "2.50" "") (while (setq e (entnext e)) (ssadd e ss) ) (command "miroir" ss "" p1 p2 "n" ) (command "inserer" "B250bis" pt1 "1" "0") ) ) Je n'ai pas débuggé ma propre suggestion, à toi de bien vérifier, tu y es presque maintenant ;) Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
fiesta13310 Posté(e) le 11 juin 2012 Auteur Posté(e) le 11 juin 2012 oui c'est bon merci, tout fonctionne parfaitement bien. C'est cool de m'avoir aidé! merci!! Cordialement!
fiesta13310 Posté(e) le 18 juin 2012 Auteur Posté(e) le 18 juin 2012 Bonsoir!! J'ai encore une question à ce sujet... Une fois que j'ai insérer mon bloc, que j'ai fais un réseau et un miroir, je dispose donc d'un ensemble de bloc.Si j'ai besoin de copier ou de déplacer cet ensemble de bloc, comment je peux faire pour tous les sélectionner? Je crois avoir compris qu'il va falloir que j'utilise ssget...mais après plusieurs tentatives, je sèche... Je sais qu'on peut faire une sélection par nom de bloc, mais je ne peux pas l'utiliser car d'autre bloc du même nom font partis de mon plan, et je ne dois surtout pas les toucher. merci d'avance...
VDH-Bruno Posté(e) le 19 juin 2012 Posté(e) le 19 juin 2012 Bonjour, Si j'ai besoin de copier ou de déplacer cet ensemble de bloc, comment je peux faire pour tous les sélectionner?Comme la demande est assez similaire à la précédente, je t’invite à relire ma réponse précédente que je vais compléter … Donc en partant du postulat que tu as réussi à construire un jeu de sélection contenant toutes les entités créer par ta commande réseau.Tu souhaites compléter ce jeu de sélection par toutes les entités créer par la commande miroir, pour cela tu peux procéder comme précédemment en utilisant un "marqueur" dans la base de donnée ou alors pour compléter ton arsenal de fonction utilise sslength et ssname, ce qui te retournera respectivement le nombre d’éléments de ton jeu de sélection et le nom d’entité à l’indice spécifié. Donc pour récupérer le nom de la dernière entité ajouté à ton jeu de sélection :(setq e (ssname ss (1- (sslength ss)))) Puis pour compléter ton jeu de sélection avec toutes les entités nouvellement créé par ta commande miroir (ou autre):(while (setq e (entnext e)) (ssadd e ss) ) Maintenant tu peux passer ss en argument à la commande copier ou déplacer. A+ Apprendre => Prendre => Rendre
fiesta13310 Posté(e) le 19 juin 2012 Auteur Posté(e) le 19 juin 2012 ok merci, je vais essayer ca. Heu... un truc qui n'a rien à voir... Dans mon programme, j'ai écris : (setq long (getdist "\n donner la longueur du voile :"))(setq L1 (+ long 0.4))(setq N1 (/ L1 2.50))(setq reste (rem L1 2.50)) Pour traduire ceci: long : soit j'entre la valeur numérique au clavier, soit je sélectionne 2 points qui définira ma longueurL1 : à cette longueur j'y ajoute 0.4mN1 : je divise ma nouvelle longueur L1 par 2.50mreste : il me renvoit le reste de la division si elle existe. Un problème s'impose pour cet exemple : Soit: long = 12.1Alors: L1= 12.1+0.4 = 12.5 N1 = 12.5/2.5 = 5Et reste = 0 Quand j'entre au clavier "long" = 12.1, il me renvoit ces valeurs ci-dessus. Seulement, quand je sélectionne 2 points de distance 12.1, il me renvoit toute ces valeurs sauf "reste" où "reste" = 2.5 On dirait qu'il me dit que dans "12.5", il y a "4x2.5" et qu'il reste "2.5". Mais pourtant, pour la division de "12.5/2.5" il me renvoit bien "5" . Donc il traduit bien que dans "12.5", il y a "5x2.5" mais qu'il reste quand même 2.5... c'est incohérent! mais je ne sais pas pourquoi... une idée?
VDH-Bruno Posté(e) le 19 juin 2012 Posté(e) le 19 juin 2012 Re, Quand j'entre au clavier "long" = 12.1, il me renvoit ces valeurs ci-dessus. Seulement, quand je sélectionne 2 points de distance 12.1, il me renvoit toute ces valeurs sauf "reste" où "reste" = 2.5 Je vois que tu bloques toujours sur le même problème à savoir la précision à l’affichage et les arrondies, nous en avons déjà discuté dans ce postil me semble... Je ne sais pas trop ce que je peux ajouter de plus. Peut-être que quelqu’un d’autre saura mieux se faire comprendre que moi... En tentant une dernière explication si tu entre au clavier une distance, tu as vraiment la distance à la précision saisie. Maintenant si tu récupère la distance entre 2 points, il se peut suivant la précision de ton dessin que la distance réelle ne soit pas tout à fait égale à 12.1 même si à l’affichage (ou en mesurant) cela semble être le cas. Il n’y a donc rien de surprenant aux résultats que tu donnes, à toi d’intégrer cela dans tes routines, à la saisie au moyen d’une fonction round (cf lien précèdent) ou dans tes tests de comparaisons au moyen de la fonction equal A+ Apprendre => Prendre => Rendre
fiesta13310 Posté(e) le 19 juin 2012 Auteur Posté(e) le 19 juin 2012 ben en fait si, j'ai tenu compte de notre discussion précédemment car grace a tes conseils, j'ai pu corriger pleins de problèmes, et créer d'autres fonctions. Mais je suis certaine que la distance fait 12.1, car j'ai créé une ligne de distance 12.1, c'est moi qui l'ai faite cette ligne, et qui ai rentré sa longueur... c'est pour ca que je ne comprends pas.
fiesta13310 Posté(e) le 19 juin 2012 Auteur Posté(e) le 19 juin 2012 bon...je pense avoir trouvé...mais il est vrai que j'ai toujours un problème avec les précisions, mais je commence a bien tout comprendre, je pense qu'il fallait juste un petit rappel... Merci
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant