Aller au contenu

Messages recommandés

Posté(e)

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)

Posté(e)

(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)

Posté(e)

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

Posté(e)

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)

Posté(e)

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

 

./__\.
(.°=°.)
  • 1 an après...
Posté(e)

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)

Posté(e)

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

Posté(e)

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)

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité