Aller au contenu

Transformer des lignes en polylignes 3D


Marc Blancher

Messages recommandés

Tous les outils concernant les polylignes sont pour les polylignes 2D, rien pour la 3D.

 

Dans covadis, cela fonctionne mais toutes mes lignes deviennent des poly 2D. J'ai rien trouvé non plus du côté lisp.

 

Tant pis, je vais tenté de me bricoler ça avec du vba.

 

Sinon pour ce qui ait de repasser dessus, ça marche mais comme là j'avais 20km à faire avec un tronçon tous les 100m. :(

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Un petit LISP vite fait, il faut sélectionner successivement chaque ligne une par une (pour un contrôle de "jointivité" des segments) et taper "Enter" (ou clic droit) pour terminer la commande.

 

(defun c:Line->3dPoly (/ v1 v2 l1 l2 pts)
 (setq v1 (getvar "osmode")
v2 (getvar "cmdecho")
)
 (while (not
   (setq l1 (car (entsel "\nSélectionnez le premier segment: ")))
 )
 )
 (cond
   ((= (cdr (assoc 0 (entget l1))) "LINE")
    (setq pts (list	(cdr (assoc 11 (entget l1)))
		(cdr (assoc 10 (entget l1)))
	  )
    )
    (command "_undo" "_begin")
    (while (setq l2 (car (entsel "\nSélectionnez le segment suivant ou : ")))
      (if (= (cdr (assoc 0 (entget l1))) "LINE")
 (cond
   ((equal (cdr (assoc 10 (entget l2))) (car pts))
     (setq pts (cons (cdr (assoc 11 (entget l2))) pts))
     (entdel l1)
     (setq l1 l2)
   )
   ((equal (cdr (assoc 11 (entget l2))) (car pts))
     (setq pts (cons (cdr (assoc 10 (entget l2))) pts))
     (entdel l1)
     (setq l1 l2)
   )
   ((equal (cdr (assoc 11 (entget l2))) (car (reverse pts)))
    (setq pts (reverse (cons (cdr (assoc 10 (entget l2))) (reverse pts))))
     (entdel l1)
     (setq l1 l2)
    )
   ((equal (cdr (assoc 10 (entget l2))) (car (reverse pts)))
    (setq pts (reverse (cons (cdr (assoc 11 (entget l2))) (reverse pts))))
     (entdel l1)
     (setq l1 l2)
    )
   (T (alert "Segment non jointif"))
 )
 (alert "L'objet sélectionné n'est pas une ligne")
      )
    )
    (setvar "osmode" 0)
    (setvar "cmdecho" 0)
    (entdel l1)
    (command "_3dpoly")
    (mapcar 'command pts)
    (command "")
    (command "_undo" "_end")
    (setvar "osmode" v1)
    (setvar "cmdecho" v2)
   )
   (T (alert "L'objet sélectionné n'est pas une ligne"))
 )
 (princ)
) 

 

[Edité le 1/2/2006 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Là tu m'étonnes Blancherm :

-Covadis Edition

-Polylignes

-Polylignes 2D - 3D

 

C'est vrai que tu obtiens des poly 3D avec le Z à 0

 

Mais dans ta question tu ne précises pas que tes lignes sont en 3D

 

Quoique, j'aurais pu deviner que si tu as besoin de poly 3D............ ;)

Lien vers le commentaire
Partager sur d’autres sites

Voici une nouvelle version au fonctionnement plus proche de _PEDIT.

 

Après la sélection du premier segment (pas forcément à une extrémité de la future polyligne 3D), il est demandé à l'utilisateur de sélectionner toutes les autres lignes à ajouter. Tous les segments jointifs sont intégrés à la polyligne 3D.

 

Nouvelle version (accepte une ligne ou une polyligne 3D comme entité de départ)

 

(defun c:Line2Poly (/ v1 v2 ent pts pt ss cnt e_lst l_lst sub_lst)
 (setq	v1 (getvar "osmode")
v2 (getvar "cmdecho")
 )
 (prompt "\nSélectionnez une ligne ou une polyligne 3D")
 (setq ent (ssname (ssget "_:S" '((0 . "LINE,POLYLINE"))) 0))
 (cond
   ((= (cdr (assoc 0 (entget ent))) "LINE")
    (setq pts (list (cdr (assoc 11 (entget ent)))
	     (cdr (assoc 10 (entget ent)))
       )
    )
   )
   ((= (cdr (assoc 0 (entget ent))) "POLYLINE")
    (while (setq pt (cdr (assoc 10 (entget (entnext ent)))))
      (setq ent (entnext ent)
     pts (cons pt pts)
      )
    )
    (setq ent (cdr (assoc -2 (entget (entnext ent)))))
   )
   (T (prompt "Erreur: Entité non valide") (exit))
 )
 (prompt
   "\nSélectionnez les lignes à transformer en polyligne 3D"
 )
 (setq	ss  (ssget '((0 . "LINE")))
cnt 0
 )
 (repeat (sslength ss)
   (setq e_lst (cons (ssname ss cnt) e_lst))
   (setq cnt (1+ cnt))
 )
 (setq	l_lst (mapcar 'entget (vl-remove ent e_lst))
e_lst nil
 )
 (while
   (setq
     sub_lst (vl-member-if
	'(lambda (x)
	   (or (equal (cdr (assoc 10 x)) (car pts))
	       (equal (cdr (assoc 11 x)) (car pts))
	       (equal (cdr (assoc 10 x)) (car (reverse pts)))
	       (equal (cdr (assoc 11 x)) (car (reverse pts)))
	   )
	 )
	l_lst
      )
   )
    (cond
      ((equal (cdr (assoc 10 (car sub_lst))) (car pts))
(setq pts (cons (cdr (assoc 11 (car sub_lst))) pts))
      )
      ((equal (cdr (assoc 11 (car sub_lst))) (car pts))
(setq pts (cons (cdr (assoc 10 (car sub_lst))) pts))
      )
      ((equal (cdr (assoc 11 (car sub_lst))) (car (reverse pts)))
(setq
  pts (reverse
	(cons (cdr (assoc 10 (car sub_lst))) (reverse pts))
      )
)
      )
      ((equal (cdr (assoc 10 (car sub_lst))) (car (reverse pts)))
(setq
  pts (reverse
	(cons (cdr (assoc 11 (car sub_lst))) (reverse pts))
      )
)
      )
    )
    (setq l_lst (vl-remove (car sub_lst) l_lst)
   e_lst (cons (cdr (assoc -1 (car sub_lst))) e_lst)
    )
 )
 (setq	cnt   (length e_lst)
e_lst (cons ent e_lst)

 )
 (command "_undo" "_begin")
 (setvar "osmode" 0)
 (setvar "cmdecho" 0)
 (command "_erase")
 (mapcar 'command e_lst)
 (command "")
 (command "_3dpoly")
 (mapcar 'command pts)
 (command "")
 (command "_undo" "_end")
 (setvar "osmode" v1)
 (setvar "cmdecho" v2)
 (prompt (strcat "\n"
	  (itoa cnt)
	  " objets on été ajoutés à la polyligne 3D."
  )
 )
 (princ)
) 

 

[Edité le 1/2/2006 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Super,

 

Ca me rappelle que j'avais vu sur un forum US une fonction interressante pour faire une sélection "bout à bout", c'est à dire que tu sélectionnais par exemple la 1ère ligne et le programme se chargait de faire la sélection comme si c'était un polyligne jointe.

 

Couplé a ton code, cela pourrait être d'enfer :cool:

 

J'essayes de retrouver les liens si ça t'interresse.

 

 

Voilà c'est ici, la fonction :

SSEnd2End

 

[Edité le 2/2/2006 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

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é