Jump to content

Continuer une polyligne


Recommended Posts

Bonjour,

 

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 ...

 

...plus je sais où je suis, moins je sais où je vais....

Extrait d'une double interview simultanée d'une particule élémentaire.

Link to post
Share on other sites

merci

 

je connais bien mpedit

mais on ne reprend pas la main comme si on dessinais une polyligne

 

 

...plus je sais où je suis, moins je sais où je vais....

Extrait d'une double interview simultanée d'une particule élémentaire.

Link to post
Share on other sites

Sinon essaie ça :

;;; 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...

"Chacun compte pour un, et nul ne compte pour plus d'un."

Link to post
Share on other sites

merci

 

ton lisp a l'air génial

mais ne tourne pas

 

il y a peu etre une erreur de frappe?

...plus je sais où je suis, moins je sais où je vais....

Extrait d'une double interview simultanée d'une particule élémentaire.

Link to post
Share on other sites

Cad ?

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]

"Chacun compte pour un, et nul ne compte pour plus d'un."

Link to post
Share on other sites

non

 

en fait je suis aller trop vite

je voudrai continuer la polygne que l'on selectione

la il faut que je la joingne apres

...plus je sais où je suis, moins je sais où je vais....

Extrait d'une double interview simultanée d'une particule élémentaire.

Link to post
Share on other sites
la il faut que je la joingne apres

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...

"Chacun compte pour un, et nul ne compte pour plus d'un."

Link to post
Share on other sites

Voilà un exemple de création de polyligne avec un entmake.

 

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]

"Chacun compte pour un, et nul ne compte pour plus d'un."

Link to post
Share on other sites

Salut Matt2006,

 

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

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Link to post
Share on other sites

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.

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... ;)

 

À part pour l'exercice

Mais c'est exactement pour ça mon ami !!!

 

 

je voudrai continuer la polygne que l'on selectione

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.

"Chacun compte pour un, et nul ne compte pour plus d'un."

Link to post
Share on other sites
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.

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.

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Link to post
Share on other sites

Bonjour,

 

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.

Link to post
Share on other sites

Ah oui mais ok, j'avais pas vu le or !!!!

(or (equal ent (entlast))

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

Oui c'est une bonne idée...

 

je me suis permis de rajouter qq ligne au cas ou PLINETYPE etait à zéro

Toutes les amélios sont les bienvenues !

 

A bientot.

Matt.

 

 

"Chacun compte pour un, et nul ne compte pour plus d'un."

Link to post
Share on other sites

Bonjour,

 

merci pour se nouvel outil

 

cela ne marchais pas car je finissais en tappant echap et non entrée (mauvaise habitude)

 

 

 

...plus je sais où je suis, moins je sais où je vais....

Extrait d'une double interview simultanée d'une particule élémentaire.

Link to post
Share on other sites

Bon, on perd beaucoup en concision, mais ce coup ci, je pense avoir "bétonné", j'ai même intégré la gestion de PLINETYPE -merci Richard-c- (il y en a qui joue encore avec cette variable ?).

 

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

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Link to post
Share on other sites

Pfff, c'est du vlisp...

Déçu... :)

 

il y en a qui joue encore avec cette variable ?

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]

"Chacun compte pour un, et nul ne compte pour plus d'un."

Link to post
Share on other sites
  • 9 years later...

Salut,

 

PPL devrait marcher avec les polylignes et les polylignes 3d

 

(defun c:ppl (/ *error* err echo ptyp pl elst lw ent pt)
 (vl-load-com)

 (defun *error* (msg)
   (if	msg
     (progn
(or (equal ent (entlast)) (entdel (entlast)))
(or (= msg "Fonction annulée")
    (princ (strcat "\nErreur: " msg))
)
     )
   )
   (vla-EndUndoMark
     (vla-get-ActiveDocument (vlax-get-acad-object))
   )
   (setvar "CMDECHO" echo)
   (setvar "PLINETYPE" ptyp)
   (princ)
 )

 (setq	echo (getvar "CMDECHO")
ptyp (getvar "PLINETYPE")
ent (entlast)
 )
 (if
   (and (setq
   pl (entsel "\nSélectionnez la polyligne à prolonger: ")
 )
 (setq elst (entget (car pl)))
 (or
   (setq lw (= (cdr (assoc 0 elst)) "LWPOLYLINE"))
   (and	(= (cdr (assoc 0 elst)) "POLYLINE")
	(= 8 (logand 8 (cdr (assoc 70 elst))))
   )
 )
 (zerop (logand 1 (cdr (assoc 70 elst))))
   )
    (progn
      (vla-StartUndoMark
 (vla-get-ActiveDocument (vlax-get-acad-object))
      )
      (setq 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)
      (if lw
 (command "_.pline" pt)
 (command "_.3dpoly" 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))
      )
    )
 )
 (*error* nil)
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...