Aller au contenu

LISP ou méthode pour grouper le point de départ/fin d'un groupe de polyligne


Valentin-J

Messages recommandés

Bonjour,

 

Je suis a la recherche d'un LISP ou d'une méthode me permettant de modifier le point de départ ou de fin d'un groupe de polygones existantes.

 

Ces polylignes me sont utiles pour calculer des longueur de câbles, et elle partent de divers endroits mais arrivent toutes au même endroit.

 

J'ignore si cela est impactant, mais je récupère la longueur de chaque polyligne dans un bloc, elle ne doit donc pas être coupée ou modifié, sinon je perds l'association entre la polyligne et l'attribut.

 

En espérant avoir fourni des explications claires... merci!

 

Valentin

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Si j'ai bien compris la demande ?!Essayes ceci:

(defun c:test ( / js new_pt-end n dxf_obj obj_vlax pt_start pt_end pt_lst)
 (setq js (ssget '((0 . "LWPOLYLINE"))))
 (cond
(js
 	(setq nw_pt-end (trans (getpoint "\nNouveau point final pour l'ensemble des polyligne sélectionnées: ") 1 0))
 	(repeat (setq n (sslength js))
   	(setq
     	dxf_obj (entget (setq obj (ssname js (setq n (1- n)))))
     	obj_vlax (vlax-ename->vla-object obj)
     	pt_start (vlax-curve-getStartPoint obj_vlax)
     	pt_end (vlax-curve-getEndPoint obj_vlax)
     	pt_lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dxf_obj))
   	)
   	(entmod
     	(setq dxf_obj
       	(subst
         	(cons 10 nw_pt-end)
         	(cons 10 (nth (1- (cdr (assoc 90 dxf_obj))) pt_lst))
         	dxf_obj
       	)
     	)
   	)
   	(entmod
     	(subst
       	(cons 10 (trans (getpoint (trans pt_start 0 1) "\nNouveau point de départ") 1 0))
       	(cons 10 (nth 0 pt_lst))
       	dxf_obj
     	)
   	)
 	)
)
 )
 (prin1)
)

  • Upvote 1

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Hello Bruno

 

Euh je ne comprend pas bien le fonctionnement de ta routine !

 

Je pensais selectionner N LWPLINEs !

Puis CLIC sur UN point XY Depart

Puis CLIC sur UN point XY Arrivee

 

Et HOP TOUTES les LWPLINEs sont etirees sur leurs 1er / Derner segment pour correspondre !

 

Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Dans le sujet

Ces polylignes partent de divers endroits mais arrivent toutes au même endroit.

Je suis parti de ce postulat en considérant que le sens de tracé suivait cette règle et donc je demande le point final pour TOUTES les polylignes sélectionnées et pour chacune individuellement le nouveau point de départ.

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

bonuscad; je te dois une bière si ca marche...

 

Je ne sais pas en revanche invoquer la commande, que dois-je taper dans le terminal pour lancer le script?

 

J'ai essayé LWPOLYLINE et nw_pt-end mais ca ne fonctionne pas.

En fait je n'avais pas vu que tu l'avais appelée TEST... ca fonctionne, mais pas comme je voudrais.

 

Ce que je voudrais, c'est pouvoir modifier le premier OU le dernier point de la polyligne, et de tous les grouper au même endroit d'un clic.

 

Les polylignes existent déja dans le dessin, et elle pointent vers un bloc qui donne la longueur de cette polyligne. Je ne peu pas me permettre de mélanger ces informations.

 

Voila le résultat que j'aimerais obtenir en images:

Avant la selection:

1536212763-selection1.png

 

 

Pendant la selection:

1536212763-selection2.png

 

 

Resultat attendu:

1536212763-selection3.png

 

J'espere que les images parlent mieux!

Lien vers le commentaire
Partager sur d’autres sites

@Valentin-J

Une question avant d'aller plus loin!Est ce que tes polylignes sont toutes tracées dans le même sens?Par exemple est ce que le point de départ (ou de fin) est toujours dans le centre du rectangle rouge?

Car si ce n'est pas le cas, ça va compliquer le code et m'obliger à demander quel sommet à déplacer pour chaque polylignes, le lisp deviendrait alors inutile à mon avis car ça ne serait pas plus rapide que d'utiliser les grips pour déplacer le sommet désiré un par un.

 

@lecrabe

en schéma c'est cela que tu voudrait?

 
-------                	/------\
                    	       /  	\
-------    	----> 	----------
                   	       \   	/
-------                	\------/

Avec la même contrainte que ci dessus, que les polylignes aient toutes le même sens de parcours!

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

@ lecrabe, est que ça répond à ton souhait?

(defun draw_pt (pt col / rap)
 (setq rap (/ (getvar "viewsize") 50))
 (foreach n
(mapcar
 	'(lambda (x)
   	(list
     	((eval (car x)) (car pt) rap)
     	((eval (cadr x)) (cadr pt) rap)
     	(caddr pt)
   	)
 	)
 	'((+ +) (+ -) (- +) (- -))
)
(grdraw pt n col)
 )
)
(defun c:fuse_start&end_pline ( / js n dxf_obj obj_vlax pt_start pt_end key new_pt-start new_pt-end pt_lst)
 (setq js (ssget '((0 . "LWPOLYLINE"))))
 (cond
(js
 	(repeat (setq n (sslength js))
   	(setq
     	dxf_obj (entget (setq obj (ssname js (setq n (1- n)))))
     	obj_vlax (vlax-ename->vla-object obj)
     	pt_start (vlax-curve-getStartPoint obj_vlax)
     	pt_end (vlax-curve-getEndPoint obj_vlax)
   	)
   	(draw_pt (trans pt_start 0 1) 3)
   	(draw_pt (trans pt_end 0 1) 1)
 	)
 	(initget "Oui Non _Yes No")
 	(princ "\nPoints de départ en VERT, points d'arrivée en ROUGE")
 	(setq key (getkword "\nProcéder à la fusion des points d'extrèmités [Oui/Non]<Oui>: "))
 	(if (not key) (setq key "Yes"))
 	(cond
   	((eq key "Yes")
     	(initget 1)
     	(setq nw_pt-start (trans (getpoint "\nNouveau point de départ pour l'ensemble des polyligne sélectionnées: ") 1 0))
     	(initget 1)
     	(setq nw_pt-end (trans (getpoint "\nNouveau point final pour l'ensemble des polyligne sélectionnées: ") 1 0))
     	(repeat (setq n (sslength js))
       	(setq
         	dxf_obj (entget (setq obj (ssname js (setq n (1- n)))))
         	pt_lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dxf_obj))
       	)
       	(entmod
         	(setq dxf_obj
           	(subst
             	(cons 10 nw_pt-start)
             	(cons 10 (nth 0 pt_lst))
             	dxf_obj
           	)
         	)
       	)
       	(entmod
         	(subst
           	(cons 10 nw_pt-end)
           	(cons 10 (nth (1- (cdr (assoc 90 dxf_obj))) pt_lst))
           	dxf_obj
         	)
       	)
     	)
   	)
   	(T
     	(princ "\nAbandon de la fusion, Inversez la/les polylignes faisant défaut")
   	)
 	)
 	(redraw)
)
 )
 (prin1)
)

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Bonuscad,

 

Les polylignes sont issues d'un réseau ou d'un copie avec point de base; ce sont essentiellement des clones.

 

J'ai envoyé trois images pour illustrer ma demande, cela ne conviens-t-il pas?

 

Pour reprendre ce que u avais fait ça ressemblerais a ça:

 

Avant:

_________

_________

_________

 

 

Après:

 

_______

_______\_

_______/

 

 

Il est important que je puisse choisir de grouper toutes les extrémités de début OU de fin car si je me trompe dans le sens de dessin de la polyligne au début du dessin, je devrais réimplanter les milliers de lignes...

Lien vers le commentaire
Partager sur d’autres sites

Bonuscad,

 

Les polylignes sont issues d'un réseau ou d'un copie avec point de base; ce sont essentiellement des clones.

 

J'ai envoyé trois images pour illustrer ma demande, cela ne conviens-t-il pas?

 

Pour reprendre ce que u avais fait ça ressemblerais a ça:

 

Avant:

_________

_________

_________

 

 

Après:

 

_______

_______\_

_______/

 

 

Il est important que je puisse choisir de grouper toutes les extrémités de début OU de fin car si je me trompe dans le sens de dessin de la polyligne au début du dessin, je devrais réimplanter les milliers de lignes...

 

Et avec une adaptation de ce que j'ai proposé à lecrabe

(defun draw_pt (pt col / rap)
 (setq rap (/ (getvar "viewsize") 50))
 (foreach n
   	(mapcar
   	'(lambda (x)
   	(list
   	((eval (car x)) (car pt) rap)
   	((eval (cadr x)) (cadr pt) rap)
   	(caddr pt)
   	)
   	)
   	'((+ +) (+ -) (- +) (- -))
   	)
   	(grdraw pt n col)
 )
)
(defun c:Fuse_StartOrEnd_Pline ( / js n dxf_obj obj_vlax pt_start pt_end key new_pt-start new_pt-end pt_lst)
 (setq js (ssget '((0 . "LWPOLYLINE"))))
 (cond
   	(js
   	(repeat (setq n (sslength js))
   	(setq
   	dxf_obj (entget (setq obj (ssname js (setq n (1- n)))))
   	obj_vlax (vlax-ename->vla-object obj)
   	pt_start (vlax-curve-getStartPoint obj_vlax)
   	pt_end (vlax-curve-getEndPoint obj_vlax)
   	)
   	(draw_pt (trans pt_start 0 1) 3)
   	(draw_pt (trans pt_end 0 1) 1)
   	)
   	(initget "Vert Rouge Aucun _Green Red None")
   	(princ "\nPoints de départ en VERT, points d'arrivée en ROUGE")
   	(setq key (getkword "\nProcéder à la fusion des points d'extrèmités [Vert/Rouge/Aucun]<Aucun>: "))
   	(if (not key) (setq key "None"))
   	(cond
   	((eq key "Green")
   	(initget 1)
   	(setq nw_pt-start (trans (getpoint "\nNouveau point de départ pour l'ensemble des polyligne sélectionnées: ") 1 0))
   	(repeat (setq n (sslength js))
           	(setq
           	dxf_obj (entget (setq obj (ssname js (setq n (1- n)))))
           	pt_lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dxf_obj))
           	)
           	(entmod
           	(subst
           	(cons 10 nw_pt-start)
           	(cons 10 (nth 0 pt_lst))
           	dxf_obj
           	)
           	)
   	)
   	)
   	((eq key "Red")
   	(initget 1)
   	(setq nw_pt-end (trans (getpoint "\nNouveau point final pour l'ensemble des polyligne sélectionnées: ") 1 0))
   	(repeat (setq n (sslength js))
           	(setq
           	dxf_obj (entget (setq obj (ssname js (setq n (1- n)))))
           	pt_lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dxf_obj))
           	)
           	(entmod
           	(subst
           	(cons 10 nw_pt-end)
           	(cons 10 (nth (1- (cdr (assoc 90 dxf_obj))) pt_lst))
           	dxf_obj
           	)
           	)
   	)
   	)
   	(T
   	(princ "\nAbandon de la fusion, Inversez la/les polylignes faisant défaut")
   	)
   	)
   	(redraw)
   	)
 )
 (prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

bonuscad,

 

C'EST ABSOLUMENT PARFAIT!

 

Je suis sérieux concernant cette bière, je t'en dois une! Tu n'imagine pas les milliers d'heures que tu viens de m’épargner!

 

Je vais abuser de toi; si tu le veux bien, en te demandant s'il est possible de rajouter des points a la suite sur un groupe de polylignes. Cela pourrais être un outil différent.

 

Je m'explique; ces polylignes représentent des câbles qui passent par des tranchées, et qui finissent par se rejoindre, formant d'encore plus gros "paquets", pour finir tous ensemble, a la manière d'un arbre (tronc, grosses branches, petites branches, rameaux...)

 

L'idée serait de l'utiliser après FUSE_STARTOREND_PLINE pour grouper les polylignes.

 

MERCI BEAUCOUP!

Lien vers le commentaire
Partager sur d’autres sites

Alors j'ai intégré ta demande en tant que choix supplémentaire.Pas trop testé en profondeur, devrait fonctionner avec des polylignes simples qui ne comportent pas d'arrondis (arcs)

 

(defun add_vtx (obj add_pt ent_name where / bulg)
 (vla-addVertex
obj
(fix add_pt)
(vlax-make-variant
 	(vlax-safearray-fill
   	(vlax-make-safearray vlax-vbdouble (cons 0 1))
   	(list
     	(car (trans where 0 ent_name))
     	(cadr (trans where 0 ent_name))
   	)
 	)
)
 )
 (vla-update obj)
)
(defun draw_pt (pt col / rap)
 (setq rap (/ (getvar "viewsize") 50))
 (foreach n
(mapcar
 	'(lambda (x)
 	(list
   	((eval (car x)) (car pt) rap)
   	((eval (cadr x)) (cadr pt) rap)
   	(caddr pt)
 	)
 	)
 	'((+ +) (+ -) (- +) (- -))
)
(grdraw pt n col)
 )
)
(defun c:Fuse_StartOrEnd_Pline ( / js n dxf_obj obj_vlax pt_start pt_end key key_add new_pt-start new_pt-end pt_tmp pt_supp lst_pt_supp nb pt_lst)
 (setq js (ssget '((0 . "LWPOLYLINE"))))
 (cond
(js
 	(repeat (setq n (sslength js))
   	(setq
     	dxf_obj (entget (setq obj (ssname js (setq n (1- n)))))
     	obj_vlax (vlax-ename->vla-object obj)
     	pt_start (vlax-curve-getStartPoint obj_vlax)
     	pt_end (vlax-curve-getEndPoint obj_vlax)
   	)
   	(draw_pt (trans pt_start 0 1) 3)
   	(draw_pt (trans pt_end 0 1) 1)
 	)
 	(initget "Vert Rouge Aucun _Green Red None")
 	(princ "\nPoints de départ en VERT, points d'arrivée en ROUGE")
 	(setq key (getkword "\nProcéder à la fusion des points d'extrèmités [Vert/Rouge/Aucun]<Aucun>: "))
 	(if (not key) (setq key "None"))
 	(cond
   	((eq key "Green")
     	(initget 1)
     	(setq nw_pt-start (trans (getpoint "\nNouveau point de départ pour l'ensemble des polyligne sélectionnées: ") 1 0))
     	(initget 1 "Oui Non _Yes No")
     	(setq key_add (getkword "\nAjouter un sommet pour avoir un tronc commun [Oui/Non]?: "))
     	(if (eq key_add "Yes")
       	(progn
         	(setq pt_tmp nw_pt-start)
         	(initget 1)
         	(while (setq pt_supp (getpoint (trans pt_tmp 0 1) "\nPosition du point supplémentaire pour le tronc commun: "))
           	(grdraw (trans pt_tmp 0 1) pt_supp 7)
           	(setq lst_pt_supp (cons (trans pt_supp 1 0) lst_pt_supp) pt_tmp (car lst_pt_supp))
         	)
       	)
     	)
     	(repeat (setq n (sslength js))
       	(setq
         	dxf_obj (entget (setq obj (ssname js (setq n (1- n)))))
         	pt_lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dxf_obj))
       	)
       	(entmod
         	(subst
           	(cons 10 nw_pt-start)
           	(cons 10 (nth 0 pt_lst))
           	dxf_obj
         	)
       	)
       	(if (eq key_add "Yes")
         	(foreach el (reverse lst_pt_supp)
           	(add_vtx (vlax-ename->vla-object obj) 0 obj el)
         	)
       	)
     	)
   	)
   	((eq key "Red")
     	(initget 1)
     	(setq nw_pt-end (trans (getpoint "\nNouveau point final pour l'ensemble des polyligne sélectionnées: ") 1 0))
     	(initget 1 "Oui Non _Yes No")
     	(setq key_add (getkword "\nAjouter un sommet pour avoir un tronc commun [Oui/Non]?: "))
     	(if (eq key_add "Yes")
       	(progn
         	(setq pt_tmp nw_pt-end)
         	(initget 1)
         	(while (setq pt_supp (getpoint (trans pt_tmp 0 1) "\nPosition du point supplémentaire pour le tronc commun: "))
           	(grdraw (trans pt_tmp 0 1) pt_supp 7)
           	(setq lst_pt_supp (cons (trans pt_supp 1 0) lst_pt_supp) pt_tmp (car lst_pt_supp))
         	)
       	)
     	)
     	(repeat (setq n (sslength js))
       	(setq
         	dxf_obj (entget (setq obj (ssname js (setq n (1- n)))))
         	pt_lst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) dxf_obj))
       	)
       	(entmod
         	(subst
           	(cons 10 nw_pt-end)
           	(cons 10 (nth (1- (cdr (assoc 90 dxf_obj))) pt_lst))
           	dxf_obj
         	)
       	)
       	(if (eq key_add "Yes")
         	(progn
           	(setq nb (1- (cdr (assoc 90 dxf_obj))))
           	(foreach el (reverse lst_pt_supp)
             	(add_vtx (vlax-ename->vla-object obj) (setq nb (1+ nb)) obj el)
           	)
         	)
       	)
     	)
   	)
   	(T
     	(princ "\nAbandon de la fusion, Inversez la/les polylignes faisant défaut")
   	)
 	)
 	(redraw)
)
 )
 (prin1)
)

Modifié par bonuscad

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

C'est génial! Et pas de probleme pour les arcs, il n'y en a jamais dans les représentations de cheminements de câbles.

 

Est-il possible d'avoir autant de troncs communs que l'on veux? Tous ces câbles vont dans une tranchée, mais cette tranchées est rarement une ligne droite, elle se ballade généralement un peu avant d'arriver a destination.

 

Aussi, dans le cas de câbles existants, et que je ne peu pas re-dessiner, serait-il possible de n'avoir que la fonction "tronc commun multiples" pour un groupe de polyligne?

Lien vers le commentaire
Partager sur d’autres sites

Est-il possible d'avoir autant de troncs communs que l'on veux?

J'ai édité le dernier code publié pour que le tronc puisse être à sommets multiples.

Je n'ai pas bien saisi la deuxième question !?

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Je voulais savoir si l'on peu avoir autant d'itération de tronc commun que désiré.

 

Actuellement, on définit les polyligne que l'on veux grouper, on clique pour définir le point de rassemblement, et on peu faire "tronc commun" sur un segment.

 

J'aimerais que la partie de cheminement de "tronc commun" ait plusieurs points, pour suivre ma tranchée.

Lien vers le commentaire
Partager sur d’autres sites

J'aimerais que la partie de cheminement de "tronc commun" ait plusieurs points, pour suivre ma tranchée.
Ça j'avais compris (enfin je crois), le code a été complété comme dis précédemment

 

Aussi, dans le cas de câbles existants, et que je ne peu pas re-dessiner, serait-il possible de n'avoir que la fonction "tronc commun multiples" pour un groupe de polyligne?
C'est cette partie que je n'ai pas bien compris!

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Dans le LISP que tu as fait, je ne peu faire qu'un seul segment en tronc commun, après, la commande s’arrête.

 

D'ou ma demande de pouvoir en faire plusieurs avant de finir la commande.

 

Ensuite, j'ai parfois déjà des poylignes qui sont placées et groupée, il n'est donc pas nécessaire de ré-utiliser la commande "FUSE_STARTOREND_PLINE".

 

Serait il possible d'avoir un LISP qui ne fasse que la partie "tronc commun", pour grouper les lignes sélectionnées et les faire cheminer le long des tranchées.

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Je crois qu'on ne se comprends pas !!!...Quand je dis:

J'ai édité le dernier code publié pour que le tronc puisse être à sommets multiples.

 

Cela veut dire que j'ai modifié ma réponse, IL FAUT DONC refaire un copier-coller du code publié en réponse #13

D'autre part pour

Ensuite, j'ai parfois déjà des poylignes qui sont placées et groupée, il n'est donc pas nécessaire de ré-utiliser la commande "FUSE_STARTOREND_PLINE".

Pourtant dans ce cas la routine peut être aussi utilisé... Il suffit de désigner comme nouveau point le MÊME point en s'accrochant (Extrémité) à ce point commun aux polyligne et de choisir "Oui" pour "Ajouter un sommet pour avoir un tronc commun [Oui/Non]?:"

Donc il me semble que la routine répond à tes besoins exprimés blink.gif

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Ça m'apprendra a essayer de travailler et de suivre un sujet en parallèle... je n'ai pas correctement lu tes réponses, et OUI, cela fonctionne parfaitement, c'est entièrement de ma faute si on ne s'est pas bien compris.

 

Je te remercie beaucoup! Cet outil vas m’être extrêmement utile, et me faire gagner un temps precieux!

 

Valentin.

Lien vers le commentaire
Partager sur d’autres sites

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é