zebulon_ Posté(e) le 11 février 2005 Posté(e) le 11 février 2005 Bonjour à tous, je reviens sur un sujet qui a sûrement déjà été abordé ici. Donc, mon but est de faire saisir une polyligne depuis une application lisp. Première idée : (command "_pline" pause pause pause ....) Mais combien faut-il mettre de pause ???? On en vient à l'idée de rajouter une boucle while quelque part... (defun c:mapoly () (command "_pline" (while T (command pause) ) )) Mais comme vous le voyez, je n'ai pas trouvé comment dire à la boucle while de s'arrêter de boucler. Autre idée, faire saisir un point à l'utilisateur et arrêter la boucle quant le getpoint renvoie nil. Cela donnerai quelque chose comme : (defun c:mapoly () (command "_pline") (setq PT (getpoint)) (command PT) (while PT (setq PT (getpoint PT)) (command PT) )) ça marche déjà pas mal mais ça ne prend en compte que les points saisis, pas les options qu'on peut saisir au clavier comme Arc, annUler etc ...Comment faire comprendre à getpoint qu'il doit aussi saisir les textes ? Ma recherche s'est orientée vers initget en règlant les bits à 128. Cela permet de renvoyer des entrées clavier arbitraires, me dit l'aide. C'est mystérieux, mais cela fait en sorte que getpoint renvoie à la fois des points saisis et des textes. Si quelqu'un à des infos un peu plus précises sur initget, je suis preneur... On en vient donc à ce qui suit : (defun c:mypline () (setvar "cmdecho" 0) (command "_PLINE") (setq PT (getpoint "\Spécifiez le point de départ ")) (command PT) (setq oldPT (list PT)) (while PT (if (> (length oldPT) 1) (setq MSG "\nSpécifiez le point suivant ou [Clore/Demi-larg/LOngueur/annUler/LArgeur] ") (setq MSG "\nSpécifiez le point suivant ou [Demi-larg/LOngueur/annUler/LArgeur] ") ) (initget 128) (setq PT (getpoint (car oldPT) MSG)) (if PT (cond ((= (type PT) 'LIST) ;;; c'est un point (command PT) (setq oldPT (cons PT oldPT)) ) ((= (type PT) 'STR) ;;; c'est un texte (setq PT (strcase PT)) (cond ((= PT "C") (if (> (length oldPT) 1) (progn (command PT) (setq PT nil) ) ) ) ((= PT "D") (command PT) (setq laDEP (getdist (strcat "\nSpécifiez la demi-largeur de départ <" (rtos (/ (getvar "PLINEWID") 2)) "> "))) (if (not laDEP) (setq laDEP (/ (getvar "PLINEWID") 2)) ) (command (rtos laDEP 2 10)) (setq laFIN (getdist (strcat "\nSpécifiez la demi-largeur de fin <" (rtos laDEP) "> "))) (if (not laFIN) (setq laFIN laDEP) ) (command (rtos laFIN 2 10)) ) ((= PT "LO") (command PT) (initget 1) (setq LO (getdist "\nSpécifiez la longueur de la ligne : ")) (command (rtos LO 2 10)) (setq oldPT (cons (getvar "LASTPOINT") oldPT)) ) ((= PT "U") (if (> (length oldPT) 1) (progn (command PT) (setq oldPT (cdr oldPT)) ) (prompt "\nTous les segments ont déjà été annulés.") ) ) ((= PT "LA") (command PT) (setq laDEP (getdist (strcat "\nSpécifiez la largeur de départ <" (rtos (getvar "PLINEWID")) "> "))) (if (not laDEP) (setq laDEP (getvar "PLINEWID")) ) (command (rtos laDEP 2 10)) (setq laFIN (getdist (strcat "\nSpécifiez la largeur de fin <" (rtos laDEP) "> "))) (if (not laFIN) (setq laFIN laDEP) ) (command (rtos laFIN 2 10)) ) (T (prompt "\nPoint 2D ou une entrée clavier.")) ) ) ) (command "") ;;; je sors de la commande quand PT est nil ) )) Cela simule une saisie d'une polyligne avec les options hormis les arcs. Avant de creuser plus loin, je viens vers vous pour voir d'une part si je ne fais pas fausse route ou s'il n'y a pas plus simple pour résoudre mon problème. Amitiés Strasbourgeoises C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Patrick_35 Posté(e) le 11 février 2005 Posté(e) le 11 février 2005 Salut Une solution donnée par Didier (setq p (getpoint)) (command "_.pline" p (while p (command (setq p (getpoint p))))) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 11 février 2005 Auteur Posté(e) le 11 février 2005 (setq p (getpoint))(command "_.pline" p (while p (command (setq p (getpoint p))))) c'est dans les grandes lignes la même chose que (defun c:mapoly ()(command "_pline")(setq PT (getpoint))(command PT)(while PT(setq PT (getpoint PT))(command PT))) en plus concis. Mais on n'a toujours pas accès aux options de la commande polyligne. On ne peut saisir que des sommets, on ne peut pas annuler, faire des arcs, définir une épaisseur de polyligne etc ... C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
bonuscad Posté(e) le 11 février 2005 Posté(e) le 11 février 2005 Dire que jusqu'à maintenant je procédais de la même manière que toi, c'est à dire que je reécrivais entièrement la commande que je voulais simulée. Ta question et surtout ton premier exemple avec ton interrogation sur la manière d'interrompre la boucle m'a fais penser à cette formulation: (defun c:my_pline (/) (command "_.pline" (while (not (zerop (getvar "cmdactive"))) (command pause) ) ) (command "_.change" (entlast) "" "_properties" "_color" 3 "") (princ) ) Et cela à l'aire de fonctionner à merveille, même avec des zooms en transparence, à tester encore cependant. Alors MERCI pour ta question, car la solution est vraiment simple. (il faudra que je revoie certaine de mes routines) ;) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
zebulon_ Posté(e) le 11 février 2005 Auteur Posté(e) le 11 février 2005 Pourquoi faire simple quand on peut faire compliqué ???? J'avais essayé en utilisant la variable LASTPROMPT, mais sans succès. CMDACTIVE est bien plus approprié ! Cela marche bien chez moi aussi. Il faut juste veiller à ce que la variable CMDECHO soit à 1, sinon c'est pas terrible au niveau de l'affichage. Voilà une solution élégante qui en intéressera plus d'un. N'est ce pas Tramber ? Cette solution a un autre avantage que la simplicité. Le jour où on change de version d'autocad et que le traducteur nous a joué un ptit tour en n'appellant plus les choses pareil (et nous savons tous que ça arrive toujours), ça continue de fonctionner sans avoir à se repalucher le lisp pour qu'il corresponde aux nouvelles options. [Edité le 11/2/2005 par zebulon_] C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Tramber Posté(e) le 11 février 2005 Posté(e) le 11 février 2005 Vouais, comme tu dis. Mon malheur, c'est que je suis incapable de pondre ces derniers raccourcis, mais je sais les retrouver sur CADxp. En général, quand je veux une poly, je sais comment elle sera à l'avance, donc, bon, ....mais bon ...... Le coup du cmdactive me fait mieux comprendre l'utilité de la variable, enfin ! Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
DenisHen Posté(e) le 9 juin 2006 Posté(e) le 9 juin 2006 Mais alors là, j'avoue que j'ai les yeux du loup de Tex Avery ! ! !Épaté, que je suis... épaté ! ! ! Mais comment faire pour introduire (setq p (getpoint)) (command "_.pline" p (while p (command (setq p (getpoint p))))) Dans ma routine, qui dessine une partie de bâtiment... (<- je n'arrive pas à poser ma capture...) (defun c:PhBatiOuvert () (if (= (setq Ech (vlax-ldata-get "Phalene" "Ech1")) nil) (PhEch1)) (setq p1 (getpoint "\nDébut du bâtiment : ")) (setq p2 (getpoint p1 "\nFin du bâtiment : ")) (setq Ori (angle p1 p2)) (setq Co (getstring "\nCoté bâti (<+> / -): ")) (cond ((= Co "-") (setq p3 (polar p1 (+ (angle p1 p2) (/ pi 2)) 2)) (setq p4 (polar p3 (+ (angle p1 p2) (/ pi 2)) 3)) (setq p5 (polar p2 (+ (angle p1 p2) (/ pi 2)) 2)) (setq p6 (polar p5 (+ (angle p1 p2) (/ pi 2)) 3)) ) (T (setq p3 (polar p1 (- (angle p1 p2) (/ pi 2)) 2)) (setq p4 (polar p3 (- (angle p1 p2) (/ pi 2)) 3)) (setq p5 (polar p2 (- (angle p1 p2) (/ pi 2)) 2)) (setq p6 (polar p5 (- (angle p1 p2) (/ pi 2)) 3)) ) ) (setq js (ssadd)) (command "-calque" "e" "Bâtiments (Contour)" "co" 2 "" "") (command "_.pline" "_non" p3 "_non" p1 "_non" p2 "_non" p5 "") (setq js (ssadd (entlast) js)) (command "-calque" "e" "Bâtiments (non levé)" "co" 2 "" "") (command "_.pline" "_non" p3 "_non" p4 "") (setq js (ssadd (entlast) js)) (command "_.pline" "_non" p5 "_non" p6 "") (setq js (ssadd (entlast) js)) (command "-calque" "e" "Titre Cache" "") (command "_.pline" "_non" p4 "_non" p6 "") (setq js (ssadd (entlast) js)) (command "-calque" "e" "Bâtiments (Hchures)" "co" 8 "" "") (command "hachures" "ansi31" (/ Ech 50) (+ (angle p1 p2) 100) js "") ) Mais cette routine n'accèpte que la saisie de deux point... Je cherche comment faire pour 3 ou plusieurs sommets... ? ( sans compter la perpendiculaire entre les deux extrémités et leur deux anté-nultièmes...)..Je cherche... Mais je pène... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
(gile) Posté(e) le 9 juin 2006 Posté(e) le 9 juin 2006 Je ne suis pas sûr de bien comprendre, mais si tu veux utiliser cette routine et récupérer la liste des sommets de la poly créée : (setq p (getpoint) lst (cons p lst) ;_ le premier point est mis dans la liste ) (command "_.pline" p (while p (command (setq p (getpoint p))) (setq lst (cons p lst)) ;_ chaque nouveau point est ajouté en début de liste ) ) (setq lst (reverse (cdr lst))) ;_ la liste, sans le premier élément (nil) est remise dans l'ordre de saisie Tu peux ensuite traiter les points de la liste avec une fonction itérative. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zebulon_ Posté(e) le 12 juin 2006 Auteur Posté(e) le 12 juin 2006 Bonjour, un bout de code qui permet de dessiner une polyligne, de créer une autre polyligne à partir de la première en faisant un simple décaler et de fermer ce deux polylignes par deux lignes (defun LwEdge (e) (setq LSOM nil) (setq COUNT 0) (setq NBELEM (length e)) (repeat NBELEM (setq ELEM (nth COUNT e)) (if (= (car ELEM) 10) (setq LSOM (append LSOM (list (cdr ELEM)))) ) (setq COUNT (+ COUNT 1)) ) (setq TEMP LSOM) ) ;;; ;;; lancer une commande autocad (defun mycmd (LCMD / CMD ETL LELEM RES OLDCMDECHO) (setq ETL (entlast)) (setq OLDCMDECHO (getvar "CMDECHO")) (setvar "CMDECHO" 1) (foreach CMD LCMD (command CMD) ) (while (not (zerop (getvar "cmdactive"))) (command pause) ) (setvar "CMDECHO" OLDCMDECHO) (setq LELEM nil) (if (not ETL) (setq ETL (entnext)) (setq ETL (entnext ETL)) ) (while ETL (setq LELEM (cons ETL LELEM)) (setq ETL (entnext ETL)) ) (setq RES LELEM) ) (defun c:batiouvert () (setq P (mycmd '("_.pline"))) (if P (progn (setq P (car P)) (setq D (getdist "\nDistance de décalage :")) (setq C (getpoint "\nCôté :")) (command "_.offset" D P C "") (setq L (entlast)) (setq LSOM1 (LwEdge (entget P))) (setq LSOM2 (LwEdge (entget L))) (setq P3 (trans (car LSOM1) 0 1)) (setq P4 (trans (car LSOM2) 0 1)) (setq P5 (trans (car (reverse LSOM1)) 0 1)) (setq P6 (trans (car (reverse LSOM2)) 0 1)) (command "_LINE" P3 P4 "") (setq e3 (entlast)) (command "_LINE" P5 P6 "") (setq e4 (entlast)) ) ) (princ) ) amicalement zebulon_ C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
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