Aller au contenu

Continuer une polyligne


Messages recommandés

Posté(e)

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

Posté(e)

Salut,

 

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

Le ridicule ne tue pas, il te rend plus fort!

Posté(e)

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

Posté(e)
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."

Posté(e)

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

Posté(e)

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 - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

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

Posté(e)
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 - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

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.

Posté(e)

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

Posté(e)

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 - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

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

  • 9 ans après...
Posté(e)

Bonjour à tous!

Je remonte un peu sur ce sujet vieux de 10ans!

ppl.lsp et copo2.lsp marche très bien sur les polylignes 2D mais j'aimerais savoir si on peut les adapter sur les polylignes 3D.

Merci

A+

AutoCad MAP 2023 - Covadis + Autopiste 18.3b

www.colas-mayotte.fr

Posté(e)

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 - GitHub
Développements sur mesure pour AutoCAD

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é