CadXP: Continuer une polyligne - CadXP

Aller au contenu

  • 2 Pages +
  • 1
  • 2
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Continuer une polyligne

#1 L'utilisateur est hors-ligne   Fraid 

  • ceinture noire 4em dan
  • Groupe : Membres
  • Messages : 2 028
  • Inscrit(e) : 08-août 05
  • LocationST Malo 35

Posté 25 septembre 2007 - 12:45

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

#2 L'utilisateur est hors-ligne   lovecraft 

  • ceinture noire 2em dan
  • Groupe : Moderateurs
  • Messages : 1 212
  • Inscrit(e) : 22-février 05
  • LocationChateaurenard(13)

Posté 25 septembre 2007 - 13:10

Bonjour,
oui c'est possible
tu fais pedit puis M pour modifier puis I pour inserer un nouveau sommet.
@plus
0

#3 L'utilisateur est hors-ligne   Fraid 

  • ceinture noire 4em dan
  • Groupe : Membres
  • Messages : 2 028
  • Inscrit(e) : 08-août 05
  • LocationST Malo 35

Posté 25 septembre 2007 - 14:00

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

#4 L'utilisateur est hors-ligne   Matt666 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 724
  • Inscrit(e) : 05-juin 07
  • LocationRennes

Posté 25 septembre 2007 - 14:21

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

#5 L'utilisateur est hors-ligne   Fraid 

  • ceinture noire 4em dan
  • Groupe : Membres
  • Messages : 2 028
  • Inscrit(e) : 08-août 05
  • LocationST Malo 35

Posté 25 septembre 2007 - 14:44

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

#6 L'utilisateur est hors-ligne   Joffoon 

  • ceinture marron
  • Groupe : Membres
  • Messages : 231
  • Inscrit(e) : 21-juillet 06
  • LocationCaen (14)

Posté 25 septembre 2007 - 14:58

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
0

#7 L'utilisateur est hors-ligne   Matt666 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 724
  • Inscrit(e) : 05-juin 07
  • LocationRennes

Posté 25 septembre 2007 - 15:00

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

#8 L'utilisateur est hors-ligne   Fraid 

  • ceinture noire 4em dan
  • Groupe : Membres
  • Messages : 2 028
  • Inscrit(e) : 08-août 05
  • LocationST Malo 35

Posté 25 septembre 2007 - 15:47

sa marche

merci

c'est pil poil se que je voulais
...plus je sais où je suis, moins je sais où je vais....
Extrait d'une double interview simultanée d'une particule élémentaire.
0

#9 L'utilisateur est hors-ligne   Fraid 

  • ceinture noire 4em dan
  • Groupe : Membres
  • Messages : 2 028
  • Inscrit(e) : 08-août 05
  • LocationST Malo 35

Posté 25 septembre 2007 - 15:52

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

#10 L'utilisateur est hors-ligne   Matt666 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 724
  • Inscrit(e) : 05-juin 07
  • LocationRennes

Posté 25 septembre 2007 - 15:53

Et bien tu n'as plus qu'à marquer ce sujet comme résolu !

;)

A bientot.
Matt.
"Chacun compte pour un, et nul ne compte pour plus d'un."
0

#11 L'utilisateur est hors-ligne   Matt666 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 724
  • Inscrit(e) : 05-juin 07
  • LocationRennes

Posté 25 septembre 2007 - 16:07

Citation

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

#12 L'utilisateur est hors-ligne   Matt666 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 724
  • Inscrit(e) : 05-juin 07
  • LocationRennes

Posté 25 septembre 2007 - 16:28

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

#13 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11 438
  • Inscrit(e) : 02-septembre 05

Posté 25 septembre 2007 - 18:40

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
Image IPB
0

#14 L'utilisateur est hors-ligne   Matt666 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 724
  • Inscrit(e) : 05-juin 07
  • LocationRennes

Posté 25 septembre 2007 - 18:51

Citation

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

Citation

À part pour l'exercice

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


Citation

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

#15 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11 438
  • Inscrit(e) : 02-septembre 05

Posté 25 septembre 2007 - 19:27

Citation

Citation

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
Image IPB
0

#16 L'utilisateur est hors-ligne   richard-c 

  • ceinture marron
  • Groupe : Membres
  • Messages : 233
  • Inscrit(e) : 04-octobre 05

Posté 26 septembre 2007 - 07:20

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

#17 L'utilisateur est hors-ligne   Matt666 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 724
  • Inscrit(e) : 05-juin 07
  • LocationRennes

Posté 26 septembre 2007 - 10:02

Ah oui mais ok, j'avais pas vu le or !!!!
(or (equal ent (entlast))

Citation

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

Citation

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

#18 L'utilisateur est hors-ligne   Fraid 

  • ceinture noire 4em dan
  • Groupe : Membres
  • Messages : 2 028
  • Inscrit(e) : 08-août 05
  • LocationST Malo 35

Posté 26 septembre 2007 - 16:47

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

#19 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11 438
  • Inscrit(e) : 02-septembre 05

Posté 26 septembre 2007 - 19:43

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 (< (- (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)]
Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#20 L'utilisateur est hors-ligne   Matt666 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 724
  • Inscrit(e) : 05-juin 07
  • LocationRennes

Posté 27 septembre 2007 - 00:31

Pfff, c'est du vlisp...
Déçu... :)

Citation

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

Partager ce sujet :


  • 2 Pages +
  • 1
  • 2
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

2 utilisateur(s) en train de lire ce sujet
0 membre(s), 2 invité(s), 0 utilisateur(s) anonyme(s)