Aller au contenu

Copie partielle de Pline


lecrabe

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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é par -Olivier-
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

L'ancienne version fonctionne bien sur AutoCAD et MAP 2013 FRA 32 bits

Rappel : 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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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: <_< :(

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

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

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Desole mais j'ai repondu le 15 juillet vers ta messagerie : g.f.... at cim.........fr

As 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

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é