lecrabe Posté(e) le 12 juillet 2012 Posté(e) le 12 juillet 2012 Hello J'ai de nombreuses routines (Merci a Gilles, Patrick_35, Bonuscad, Brice, Fabcad, etc) qui tripatouillent les polylignes mais je ne retrouve pas une routine simple pour generer une Pline a partir d'une autre Pline en cliquant simplement 2 points !? Il y a une routine qui serait vraiment sympa et utile (a mon avis) a beaucoup de gens !? --- Traitement SVP sur des Plines 2D (closes ou non) avec segments/arcs ---(et peut etre aussi si possible sur des Plines 3D !?) L'utilisateur est sur un calque courant et les nouvelles Plines seont generees sur CE calque courant alors que l'on va aller selectionner une par une des Plines sur d'autres calques ... Principe :Clic sur UN point (Vertex donc accrochage extremite) de la Pline puis Clic sur UN AUTRE point (Vertex) de la Pline et le programme genere immediatement par une COPIE une nouvelle Pline sur le calque courant qui est en fait un "extrait" entre les 2 points cliques ! Pourquoi une COPIE (de la Pline originale et non pas en creer une nouvelle) puis suppression des Points avant le 1er Clic et suppression des points apres le 2eme Clic car ainsi on va CONSERVER AUTOMATIQUEMENT les XDATAs et les ODs (Object Data de MAP) eventuellement presents ! Cas particulier : si on clique 2 fois sur le MEME point alors on veut garder TOUTE la Pline donc on fait une Copie simple (toujours sur le calque courant) ! Routine en boucle automatique donc on sort par Avec ce genre de routine, on prepare avec rapidite des nouvelles Plines a partir de N autres Plines !Ces nouvelles Plines seront d'ailleurs sans doute jointes plus tard ...(avec perte ou pas des XDATAs et/ou ODs, c un autre probleme !) Merci d'avance de votre aide, lecrabe Autodesk Expert Elite Team
-Olivier- Posté(e) le 12 juillet 2012 Posté(e) le 12 juillet 2012 (modifié) Bonjour lecrabe, Comme personne n'a encore répondu, voici un petit essai :(defun c:cpolypart (/ *error* echo accro pt1 pt2 ent_dxf pt_dxf deb_dxf pt1_dxf pt2_dxf pt3_dxf rpt_dxf fin_dxf) (vl-load-com) (defun *error* (errmsg) (setvar "cmdecho" echo) (setvar "osmode" accro) (princ errmsg) ) (setq echo (getvar 'cmdecho) accro (getvar 'osmode)) (setvar "cmdecho" 0) (initget 1) (setq pt1 (reverse (cdr (reverse (getpoint "\n Sélectionnez le 1er point de la polyligne"))))) (initget 1) (setq pt2 (reverse (cdr (reverse (getpoint "\n Sélectionnez le 2nd point de la polyligne"))))) (setvar "osmode" 0) (if (and (= (sslength (ssget "_C" pt1 pt2)) 1) (= (cdr (assoc 0 (entget (ssname (ssget "_C" pt1 pt2) 0)))) "LWPOLYLINE") (/= (vl-member-if '(lambda (x) (equal (cdr x) pt1 1e-009)) (entget (ssname (ssget "_C" pt1 pt2) 0))) nil) (/= (vl-member-if '(lambda (x) (equal (cdr x) pt2 1e-009)) (entget (ssname (ssget "_C" pt1 pt2) 0))) nil) ) (progn (if (equal pt1 pt2 1e-009) (command "_copytolayer" (ssget "_C" pt1 pt2) "" (getvar 'clayer) "Q") (progn (command "_copytolayer" (ssget "_C" pt1 pt1) "" (getvar 'clayer) "Q") (setq ent_dxf (entget (entlast)) pt_dxf (vl-member-if '(lambda (x) (= (car x) 10)) ent_dxf) deb_dxf (reverse (vl-member-if '(lambda (x) (= (car x) 39)) (reverse ent_dxf))) pt1_dxf (vl-member-if '(lambda (x) (equal (cdr x) pt1 1e-009)) pt_dxf) pt2_dxf (vl-member-if '(lambda (x) (equal (cdr x) pt2 1e-009)) pt_dxf) ) (if (> (length pt1_dxf) (length pt2_dxf)) (progn (setq fin_dxf (vl-member-if '(lambda (x) (= (car x) 10)) (cdr pt2_dxf)) rpt_dxf (reverse pt1_dxf) pt3_dxf (reverse (repeat (length fin_dxf) (setq rpt_dxf (cdr rpt_dxf)) ) ) ent_dxf (append deb_dxf (if (= pt3_dxf nil) pt1_dxf pt3_dxf)) ) ) (progn (setq fin_dxf (vl-member-if '(lambda (x) (= (car x) 10)) (cdr pt1_dxf)) rpt_dxf (reverse pt2_dxf) pt3_dxf (reverse (repeat (length fin_dxf) (setq rpt_dxf (cdr rpt_dxf)) ) ) ent_dxf (append deb_dxf (if (= pt3_dxf nil) pt1_dxf pt3_dxf)) ) ) ) (entmod ent_dxf) ) ) ) (princ) ) (setvar "osmode" accro) (setvar "cmdecho" echo) (princ) ) Ce lisp fonctionne sur les LWPOLYLIGNE et conserve les XDATA. Je n'ai pas testé pour ODs n'ayant pas MAP.Je suis encore débutant donc il reste quelques soucis.Je n'ai pas encore réussi à mettre une sortie propre si les points ne sont pas sur une polyligne ou sur une polyligne différente. Enfin, je ne sais pas faire les boucles automatiques donc... Je pense que d'autres feront beaucoup mieux, il reste encore du (command...) ! Olivier Edité le 12/07/2012 à 17h12 Modifié le 12 juillet 2012 par -Olivier-
lecrabe Posté(e) le 12 juillet 2012 Auteur Posté(e) le 12 juillet 2012 Hello 1er test rapide (Plines Closes ou Non avec Segments et Arcs) sur MAP 2013 32 bits FRA, cela fonctionne comme prevu !et comme tu fais une copie, les XDATAs et ODs sont conserves ! Merci bien, c deja un Super Debut !! Pas de boucle sans fin (pas grave) donc je tape sur la barre espace pour relancer ... lecrabe PS1: je suis curieux de voir eventuellement d'autres routines !? PS2: as tu corrige qq chose a 17h12 ? Autodesk Expert Elite Team
-Olivier- Posté(e) le 12 juillet 2012 Posté(e) le 12 juillet 2012 J'ai modifié le lisp ci-dessus pour supprimer les problèmes d'erreurs lorsque les points ne sont pas bien sélectionnés. J'ai repéré aussi que lorsque l'on sélectionne le dernier point de la polyligne, la commande ne fonctionne pas. Je suis ouvert à tous commentaires sur ce lisp.
lecrabe Posté(e) le 12 juillet 2012 Auteur Posté(e) le 12 juillet 2012 Hello L'ancienne version fonctionne bien sur AutoCAD et MAP 2013 FRA 32 bitsRappel : bien que tu fasses une COPIE, ce cretin d'AutoCAD ne copie pas les ODs ! Tant pis ...Seuls MAP et CIVIL savent copier (et creer / modifier) les ODs Mais la nouvelle version 1.01 ne marche pas quand je clique sur 2 vertex separes par des Arcs et non pas par des Segments ! Aie Aie, il y a plein d'autres cas ou la vs 1.01 ne fait RIEN !! lecrabe PS: petit bug subtil, si on clique 2 points sur une Pline close, on obtient en retour un extrait de la Pline MAIS Close ce qui n'est pas correct mais pas tres grave, on ouvre immediatement la Pline juste creee ... Autodesk Expert Elite Team
-Olivier- Posté(e) le 12 juillet 2012 Posté(e) le 12 juillet 2012 Hello, Rappel : bien que tu fasses une COPIE, ce cretin d'AutoCAD ne copie pas les ODs ! Tant pis ...Une copie de l'objet en passant par les fonctions vlisp que je métrise pas changera peut-être le résultat. Mais la nouvelle version 1.01 ne marche pas quand je clique sur 2 vertex separes par des Arcs et non pas par des Segments ! Je n'ai pas de problème avec les polylignes contenants des segements.Curieux, j'ai simplement ajouté 4 conditions pour le fonctionnement :- Un et un seul objet sélectionné.- Cet objet est une LWPOLYLIGNE- Le point 1 est un des points de la polyligne- Le point 2 est un des points de la polyligne Supprime les 2 lignes suivantes (correspond au 2 dernières conditions) pour voir si cela s'arrange. (/= (vl-member-if '(lambda (x) (equal (cdr x) pt1 1e-009)) (entget (ssname (ssget "_C" pt1 pt2) 0))) nil) (/= (vl-member-if '(lambda (x) (equal (cdr x) pt2 1e-009)) (entget (ssname (ssget "_C" pt1 pt2) 0))) nil) Comme je l'ai dit lors du premier message je suis encore débutant (j'ai commencé le lisp il y a 4 mois en amateur). :D
lecrabe Posté(e) le 12 juillet 2012 Auteur Posté(e) le 12 juillet 2012 Hello Amateur Amateur, moi je dirais Amateur tres eclaire !!! Euh NON, en supprimant les 2 lignes cela ne change RIEN alors que avec la vers 1.00 tout va bien (ou presque) !? lecrabe Autodesk Expert Elite Team
-Olivier- Posté(e) le 12 juillet 2012 Posté(e) le 12 juillet 2012 Routine modifiée pour tenir compte du problème avec le dernier point. Olivier
-Olivier- Posté(e) le 12 juillet 2012 Posté(e) le 12 juillet 2012 Amateur Amateur, moi je dirais Amateur tres eclaire !!! Heureusement que les cadxpiens étaient là sinon je n'aurais pas encore ouvert ma première parenthèse. Cela faisait longtemps que je voulais automatiser certaine tâches au boulot mais avec l'aide au programmeur d'Autocad :unsure: :blink: <_< :(
-Olivier- Posté(e) le 23 juillet 2012 Posté(e) le 23 juillet 2012 Bonjour à tous, Dans l'attente du résultat des tests du Crabe, (ça doit être la marée haute... de boulot)voici la version 1.5 qui tient compte des polylignes fermées. ;;; COMMANDE CPOLYPART v1.5 ;;; EFFECTUE UNE COPIE D'UNE PARTIE DE POLYLIGNE ENTRE LES POINTS SELECTIONNES SUR LE CALQUE COURRANT ;;; PAR -Olivier- le 15/07/2012 (defun c:cpolypart (/ *error* echo accro pt1 pt2 ent_dxf pt_dxf deb_dxf pt1_dxf pt2_dxf pt3_dxf rpt_dxf fin_dxf) (vl-load-com) (defun *error* (errmsg) (setvar "cmdecho" echo) (setvar "osmode" accro) (princ errmsg) ) (setq echo (getvar 'cmdecho) accro (getvar 'osmode)) (setvar "cmdecho" 0) (initget 1) (setq pt1 (reverse (cdr (reverse (getpoint "\n Sélectionnez le 1er point de la polyligne"))))) (initget 1) (setq pt2 (reverse (cdr (reverse (getpoint "\n Sélectionnez le 2nd point de la polyligne"))))) (setvar "osmode" 0) (if (and (= (sslength (ssget "_C" pt1 pt2)) 1) (= (cdr (assoc 0 (entget (ssname (ssget "_C" pt1 pt2) 0)))) "LWPOLYLINE") (/= (vl-member-if '(lambda (x) (equal (cdr x) pt1 1e-009)) (entget (ssname (ssget "_C" pt1 pt2) 0))) nil) (/= (vl-member-if '(lambda (x) (equal (cdr x) pt2 1e-009)) (entget (ssname (ssget "_C" pt1 pt2) 0))) nil) ) (progn (if (equal pt1 pt2 1e-009) (command "_copytolayer" (ssget "_C" pt1 pt2) "" (getvar 'clayer) "Q") (progn (command "_copytolayer" (ssget "_C" pt1 pt1) "" (getvar 'clayer) "Q") (setq ent_dxf (entget (entlast))) (if (= (cdr (assoc 70 ent_dxf)) 1) (progn (setq pt_dxf (vl-member-if '(lambda (x) (= (car x) 10)) ent_dxf) pt1_dxf (vl-member-if '(lambda (x) (equal (cdr x) pt1 1e-009)) pt_dxf) deb_dxf (reverse (vl-member-if '(lambda (x) (= (car x) 39)) (reverse ent_dxf))) pt0_dxf (reverse (cdr (vl-member-if '(lambda (x) (equal (cdr x) pt1 1e-009)) (reverse pt_dxf)))) ent_dxf (append deb_dxf pt1_dxf pt0_dxf) ent_dxf (subst (cons 70 0) (assoc 70 ent_dxf) ent_dxf) ) ) ) (setq pt_dxf (vl-member-if '(lambda (x) (= (car x) 10)) ent_dxf) deb_dxf (reverse (vl-member-if '(lambda (x) (= (car x) 39)) (reverse ent_dxf))) pt1_dxf (vl-member-if '(lambda (x) (equal (cdr x) pt1 1e-009)) pt_dxf) pt2_dxf (vl-member-if '(lambda (x) (equal (cdr x) pt2 1e-009)) pt_dxf) ) (if (> (length pt1_dxf) (length pt2_dxf)) (progn (setq fin_dxf (vl-member-if '(lambda (x) (= (car x) 10)) (cdr pt2_dxf)) rpt_dxf (reverse pt1_dxf) pt3_dxf (reverse (repeat (length fin_dxf) (setq rpt_dxf (cdr rpt_dxf)) ) ) ent_dxf (append deb_dxf (if (= pt3_dxf nil) pt1_dxf pt3_dxf)) ) ) (progn (setq fin_dxf (vl-member-if '(lambda (x) (= (car x) 10)) (cdr pt1_dxf)) rpt_dxf (reverse pt2_dxf) pt3_dxf (reverse (repeat (length fin_dxf) (setq rpt_dxf (cdr rpt_dxf)) ) ) ent_dxf (append deb_dxf (if (= pt3_dxf nil) pt1_dxf pt3_dxf)) ) ) ) (entmod ent_dxf) ) ) ) (princ) ) (setvar "osmode" accro) (setvar "cmdecho" echo) (princ) ) Olivier
lecrabe Posté(e) le 23 juillet 2012 Auteur Posté(e) le 23 juillet 2012 Hello Desole mais j'ai repondu le 15 juillet vers ta messagerie : g.f.... at cim.........frAs tu recu ? Depuis ma messagerie Free ... Est ce une bonne adresse courriel ? Ta version 1.5 (ou autre) n'est pas bonne "pour moi" !Je suis presque content de la 1.00 !! lecrabe Autodesk Expert Elite Team
-Olivier- Posté(e) le 23 juillet 2012 Posté(e) le 23 juillet 2012 Bonjour Lecrabe, Escuse-moi je n'ai pas reçu ton message, l'adresse que tu indiques ne correspond en rien à celle enregistrée.Essaye celle-ci : Si tu as encore la version 1.0, peut-tu me la retransmettre. Je comprend pas pourquoi cela ne fonctionne plus chez toi. Olivier
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