Continuer une polyligne
#1
Posté 25 septembre 2007 - 12:45
y a t'il une astuce pour continuer une polyligne apres interruption
jusqu'a maintenant je joins la nouvelle polyligne
mais des fois j'oublie de le faire :P
alors que si je pouvais simplement la continuer ...
Extrait d'une double interview simultanée d'une particule élémentaire.
#2
Posté 25 septembre 2007 - 13:10
oui c'est possible
tu fais pedit puis M pour modifier puis I pour inserer un nouveau sommet.
@plus
#3
Posté 25 septembre 2007 - 14:00
je connais bien mpedit
mais on ne reprend pas la main comme si on dessinais une polyligne
Extrait d'une double interview simultanée d'une particule élémentaire.
#4
Posté 25 septembre 2007 - 14:21
;;; Continuer une polyligne sans obligation de partir par le dernier point (defun c:copo1 (/ lst cmdecho pol newpol) (setq cmdecho (getvar "cmdecho")) (setvar "cmdecho" 0) (if (and (setq pol (car (entsel "\nSélectionner la polyligne à continuer :"))) (eq "LWPOLYLINE" (cdr (assoc 0 (entget pol)))) ) (progn (princ "\npremier point de la nouvele polyligne : ") (command "_.PLINE") (while (not (zerop (getvar "cmdactive")))(command pause)) (setq newpol (entlast)) (setq lst (append (mapcar 'cdr (remove-if-not '(lambda (x) (= (car x) 10)) (entget pol))) (mapcar 'cdr (remove-if-not '(lambda (x) (= (car x) 10)) (entget pol))) )) (if (doubles lst) (command "pedit" pol "j" newpol "" "") (princ "\nAucun sommet en commun.\nImpossible de continuer la polyligne.") ) )) (setq cmdecho (getvar "cmdecho")) (setvar "cmdecho" 0) ) ;;; Continuer une polyligne avec obligation de partir par le dernier point (defun c:copo2 (/ cmdecho pol newpol) (setq cmdecho (getvar "cmdecho")) (setvar "cmdecho" 0) (if (and (setq pol (car (entsel "\nSélectionner la polyligne à continuer :"))) (eq "LWPOLYLINE" (cdr (assoc 0 (entget pol)))) ) (progn (command "_.PLINE" (cdr (assoc 10 (reverse (entget pol))))) (while (not (zerop (getvar "cmdactive")))(command pause)) (setq newpol (entlast)) (command "pedit" pol "j" newpol "" "") )) (setvar "cmdecho" cmdecho) ) ;;; DOUBLES Retourne la liste des doublons d'une liste (defun doubles (lst) (if lst (if (member (car lst) (cdr lst)) (cons (car lst) (doubles (cdr lst))) (doubles (cdr lst)) ) ) )
Tu dois avoi une préférence pour copo2...
#5
Posté 25 septembre 2007 - 14:44
ton lisp a l'air génial
mais ne tourne pas
il y a peu etre une erreur de frappe?
Extrait d'une double interview simultanée d'une particule élémentaire.
#6
Posté 25 septembre 2007 - 14:58
je comfirme ce lisp est super et chez moi sa fonctionne bien, et j'avoue que ça va pas mal me dépanner
Merci à vous,
Joff
#7
Posté 25 septembre 2007 - 15:00
Chez moi, il fonctionne très bien !
(defun c:COPO (/ cmdecho pol newpol) (setq cmdecho (getvar "cmdecho")) (setvar "cmdecho" 0) (if (and (setq pol (car (entsel "\nSélectionner la polyligne à continuer :"))) (eq "LWPOLYLINE" (cdr (assoc 0 (entget pol)))) ) (progn (command "_.PLINE" (cdr (assoc 10 (reverse (entget pol))))) (while (not (zerop (getvar "cmdactive")))(command pause)) (setq newpol (entlast)) (command "pedit" pol "j" newpol "" "") )) (setvar "cmdecho" cmdecho) )
Tu as besoin de ça uniquement...
Tu as quelle version autoCAD ?
Quelle est l'erreur ?
[Edité le 25/9/2007 par Matt666]
#8
Posté 25 septembre 2007 - 15:47
merci
c'est pil poil se que je voulais
Extrait d'une double interview simultanée d'une particule élémentaire.
#9
Posté 25 septembre 2007 - 15:52
en fait je suis aller trop vite
je voudrai continuer la polygne que l'on selectione
la il faut que je la joingne apres
Extrait d'une double interview simultanée d'une particule élémentaire.
#10
Posté 25 septembre 2007 - 15:53
;)
A bientot.
Matt.
#11
Posté 25 septembre 2007 - 16:07
Citation
Euh normalement non...
Visuellement :
1- tu sélectionnes ta polyligne
2- tu la continues depuis le dernier sommet saisi...
En code ça se passe autrement...
1- Tu sélectionnes
2- Tu créés une deuxième polyligne à partir du dernier pt de la première
3- Commande pedit+joindre pour joindre les deux polylignes...
Il faut utiliser COPO2, ou recharges le dernier code que j'ai mis sur cette page... COPO...
Au fait COPO pour COntinuer POlyligne... Qu'on se le dise !
Sinon on pourrait imaginer une polyligne jointe avec ENTMAKE...
#12
Posté 25 septembre 2007 - 16:28
Par contre je n'arrive pas à reproduire la fermeture de la polyligne...
Si qqn a une idée !
(defun c:COPO_ENTM (/ cmdecho pol newpol lst) (setq cmdecho (getvar "cmdecho")) (setvar "cmdecho" 0) (if (and (setq pol (car (entsel "\nSélectionner la polyligne à continuer :"))) (eq "LWPOLYLINE" (cdr (assoc 0 (entget pol)))) ) (progn (command "_.PLINE" (cdr (assoc 10 (reverse (entget pol))))) (while (not (zerop (getvar "cmdactive")))(command pause)) (setq newpol (entlast)) (setq lst (append (vl-remove-if-not '(lambda (x) (member (car x) '(10 40 41 42))) (entget pol)) (vl-remove-if-not '(lambda (x) (member (car x) '(10 40 41 42))) (entget newpol)) )) (entmake (append (list (cons 0 "LWPOLYLINE") (cons 8 (cdr (assoc 8 (entget pol)))) (cons 62 (cdr (assoc 62 (entget pol)))) (cons 90 (+ (length (vl-remove-if-not '(lambda (x) (eq (car x) 10)) (entget pol))) (length (vl-remove-if-not '(lambda (x) (eq (car x) 10)) (entget newpol))) )) ) lst ) ) (entdel pol) (entdel newpol) (redraw (entlast)) )) (setvar "cmdecho" cmdecho) (princ) )
A bientôt !
Matt.
Edition : Ajout des vl- à remove-if-not... Vive BricsCAD !!
[Edité le 25/9/2007 par Matt666]
#13
Posté 25 septembre 2007 - 18:40
À part pour l'exercice, je ne vois pas l'intérêt de joindre les polylignes avec entmake.
Tu commences avec (command "-.pline" ...) et une boucle sur CMDACTIVE ,ce qui est fort bien pour conserver les options de la commande polyligne. Pourquoi ne pas continuer avec (command "_.pedit" ...) surtout que dans ce cas, il n'y a pas à se soucier de la valeur de PEDITACCEPT, puisqu'il s'agit de joindre deux polylignes.
Ta première routine est mieux, à mon avis, à ceci près qu'il faut mettre CMDECHO à 1 pour avoir les invites pendant la "pause" et qu'il est préférable d'incorporer la gestion de cette variable au progn pour assurer sa remise à sa valeur initiale en cas de choix d'une mauvaise entité ou d'une annulation.
Par sécurité, on peut aussi récupérer la dernière entité créée avant le lancement de la commande pour pouvoir s'assurer qu'une nouvelle polyligne a été créée avant de joindre.
(defun c:ppl (/ pl ent echo) (if (and (setq pl (car (entsel "\nSélectionnez la polyligne à prolonger: ")) ) (= (cdr (assoc 0 (entget pl))) "LWPOLYLINE") ) (progn (setq ent (entlast) echo (getvar "CMDECHO") ) (setvar "CMDECHO" 1) (command "_.pline" (trans (cdr (assoc 10 (reverse (entget pl)))) pl 1) ) (while (/= 0 (getvar "CMDACTIVE")) (command pause) ) (or (equal ent (entlast)) (command "_.pedit" pl "_j" (entlast) "" "") ) (setvar "CMDECHO" echo) ) ) (princ) )
#14
Posté 25 septembre 2007 - 18:51
Citation
J'arrive pas à comprendre cette logique... :o
Je vois vraiment pas.... Peux-tu t'expliquer encore mieux que ce tu as déjà fait ? Chu un peu neuneu des fois... ;)
Citation
Mais c'est exactement pour ça mon ami !!!
Citation
la il faut que je la joingne apres
Sinon, tu n'as vu l'erreur décelée par Fraid non plus ?? Je vois vraiment pas.. Ca fonctionne très bien chez moi !
Désolé Fraid, mais je vois vraiment pas...
En tout cas de me montrer une autre façon de procéder, et de voir les erreurs qui se cachent dans mon code !
C'est cool.
A bientot !
Matt.
#15
Posté 25 septembre 2007 - 19:27
Citation
Citation
J'arrive pas à comprendre cette logique... :o
Je vois vraiment pas.... Peux-tu t'expliquer encore mieux que ce tu as déjà fait ? Chu un peu neuneu des fois... ;)
C'est un peu tordu et la probabilité est faible, je te l'accorde, mais un soucis qu'on doit avoir à l'esprit c'est : maintenant que ma routine marche qu'est-ce qui pourrait se passer si un utilisateur ne procèdait comme je l'imagine.
Imaginons, la dernière entité créée est un arc, un ligne ou une polyligne jointive au départ de la polyligne sélectionnée, l'utilisateur lance ppl (ou copo) mais annule la commande avant de spécifier un point, la dernière entité serait jointe à la polyligne.
Donc si après le (while ...) la dernière entité est la même que celle créée avant le lancement de la fonction on ne joint pas.
#16
Posté 26 septembre 2007 - 07:20
je me suis permis de rajouter qq ligne au cas ou PLINETYPE etait à zéro
(defun c:ppl (/ pl ent echo)
(if
(and (setq
pl (car (entsel "\nSélectionnez la polyligne à prolonger: "))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(if (/= PLINETYPE 2)
(progn
(setvar "PLINETYPE" 2)
(command "_.pedit" pl "" "" "")
(= (cdr (assoc 0 (entget pl))) "LWPOLYLINE")
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
)
(progn
(setq ent (entlast)
echo (getvar "CMDECHO")
)
(setvar "CMDECHO" 1)
(command "_.pline"
(trans (cdr (assoc 10 (reverse (entget pl)))) pl 1)
)
(while (/= 0 (getvar "CMDACTIVE"))
(command pause)
)
(or (equal ent (entlast))
(command "_.pedit" pl "_j" (entlast) "" "")
)
(setvar "CMDECHO" echo)
)
)
(princ)
)
Bonne journée.
#17
Posté 26 septembre 2007 - 10:02
(or (equal ent (entlast))
Citation
Oui c'est une bonne idée...
Citation
Toutes les amélios sont les bienvenues !
A bientot.
Matt.
#18
Posté 26 septembre 2007 - 16:47
merci pour se nouvel outil
cela ne marchais pas car je finissais en tappant echap et non entrée (mauvaise habitude)
Extrait d'une double interview simultanée d'une particule élémentaire.
#19
Posté 26 septembre 2007 - 19:43
Désormais, selon le côté sélectionné sur la polyligne la nouvelle polyligne démarre soit départ soit à la fin de l'ancienne
L'utilisateur peut terminer la nouvelle polylgne en faisant Echap (Fraid) elle sera jointe à l'ancienne.
J'ai aussi ajouté un groupe undo pour pouvoir annuler toute l'opération.
(defun c:ppl (/ err echo ptyp pl ent pt) (vl-load-com) (defun err (msg) (if (= msg "Fonction annulée") (progn (setvar "CMDECHO" 0) (or (equal ent (entlast)) (command "_.pedit" pl "_j" (entlast) "" "") ) (princ) ) (princ (strcat "\nErreur: " msg)) ) (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))) (setvar "CMDECHO" echo) (setvar "PLINETYPE" ptyp) (setq *error* m:err m:err nil ) (princ) ) (setq echo (getvar "CMDECHO") ptyp (getvar "PLINETYPE") m:err *error* *error* err ) (if (and (setq pl (entsel "\nSélectionnez la polyligne à prolonger: ") ) (= (cdr (assoc 0 (entget (car pl)))) "LWPOLYLINE") (zerop (logand 1 (cdr (assoc 70 (entget (car pl)))))) ) (progn (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))) (setq ent (entlast) pt (trans (osnap (cadr pl) "_nea") 1 0) ) (if (< (- (vlax-curve-getDistAtPoint (car pl) (vlax-curve-getEndPoint (car pl)) ) (vlax-curve-getDistAtPoint (car pl) pt) ) (vlax-curve-getDistAtPoint (car pl) pt) ) (setq pt (trans (vlax-curve-getEndPoint (car pl)) 0 1)) (setq pt (trans (vlax-curve-getStartPoint (car pl)) 0 1)) ) (setvar "CMDECHO" 1) (setvar "PLINETYPE" 2) (command "_.pline" pt) (while (/= 0 (getvar "CMDACTIVE")) (command pause) ) (setvar "CMDECHO" 0) (or (equal ent (entlast)) (command "_.pedit" pl "_j" (entlast) "" "") ) (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))) ) ) (setvar "CMDECHO" echo) (setvar "PLINETYPE" ptyp) (setq *error* m:err m:err nil ) (princ) )
[Edité le 26/9/2007 par (gile)]
#20
Posté 27 septembre 2007 - 00:31
Déçu... :)
Citation
En fait BricsCAD comporte un petit bug, qui lorsque la commande pedit a échoué, cette même polyligne devient une polyligne lourde... Donc ce n'ets pas dénué d'intérêt pour les utilisateurs intelliCAD...
Je ferai ptet une version autolisp avec tes améliorations (qui sont d'ailleurs vachement bien !! Surtout selon le coté sélectionné)... Histoire de rendre possible l'utilisation de cette routine pour des intelliCadiens...
A bientot !
Matt.
[Edité le 27/9/2007 par Matt666]