Valentin-J Posté(e) le 5 septembre 2018 Posté(e) le 5 septembre 2018 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
bonuscad Posté(e) le 5 septembre 2018 Posté(e) le 5 septembre 2018 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) ) 1 Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
lecrabe Posté(e) le 5 septembre 2018 Posté(e) le 5 septembre 2018 Hello Bruno Euh je ne comprend pas bien le fonctionnement de ta routine ! Je pensais selectionner N LWPLINEs !Puis CLIC sur UN point XY DepartPuis 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
bonuscad Posté(e) le 5 septembre 2018 Posté(e) le 5 septembre 2018 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
lecrabe Posté(e) le 5 septembre 2018 Posté(e) le 5 septembre 2018 Hello 1) AH OK j'ai lu et utilise TROP VITE ! 2) Neanmoins SVP serait il possible d'avoir une autre version avec ma demande ? Merci d'avance, Bye, lecrabe Autodesk Expert Elite Team
Valentin-J Posté(e) le 6 septembre 2018 Auteur Posté(e) le 6 septembre 2018 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: Pendant la selection: Resultat attendu: J'espere que les images parlent mieux!
bonuscad Posté(e) le 6 septembre 2018 Posté(e) le 6 septembre 2018 @Valentin-JUne 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. @lecrabeen 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
lecrabe Posté(e) le 6 septembre 2018 Posté(e) le 6 septembre 2018 Hello YES +1 avec Bruno / Bonuscad ! Bye, lecrabe Autodesk Expert Elite Team
bonuscad Posté(e) le 6 septembre 2018 Posté(e) le 6 septembre 2018 @ 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
Valentin-J Posté(e) le 7 septembre 2018 Auteur Posté(e) le 7 septembre 2018 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...
bonuscad Posté(e) le 7 septembre 2018 Posté(e) le 7 septembre 2018 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
Valentin-J Posté(e) le 7 septembre 2018 Auteur Posté(e) le 7 septembre 2018 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!
bonuscad Posté(e) le 7 septembre 2018 Posté(e) le 7 septembre 2018 (modifié) 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é le 7 septembre 2018 par bonuscad Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Valentin-J Posté(e) le 7 septembre 2018 Auteur Posté(e) le 7 septembre 2018 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?
bonuscad Posté(e) le 7 septembre 2018 Posté(e) le 7 septembre 2018 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
Valentin-J Posté(e) le 7 septembre 2018 Auteur Posté(e) le 7 septembre 2018 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.
bonuscad Posté(e) le 7 septembre 2018 Posté(e) le 7 septembre 2018 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
Valentin-J Posté(e) le 7 septembre 2018 Auteur Posté(e) le 7 septembre 2018 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.
bonuscad Posté(e) le 7 septembre 2018 Posté(e) le 7 septembre 2018 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 #13D'autre part pourEnsuite, 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 Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Valentin-J Posté(e) le 10 septembre 2018 Auteur Posté(e) le 10 septembre 2018 Ç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.
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant