Les polylignes 3D présentent quelques différences avec les polylignes 2D.
Du moins les polylignes 2D dites "allégées" apparues depuis quelques temps maintenant.
La polyligne 3D est "mémorisée" dans AutoCAD comme plusieurs entités et il va falloir travailler autrement qu'avec les polylignes 2D qui elles, sont "mémorisées" dans une seule entité sous forme de liste (list).
Dans un premier temps je vais vous montrer un code qui analyse puis qui affiche les coordonnées des sommets de la polyligne 3D avec AutoLISP.
Que fait ce code ?
- Sélection de l'entité
- Vérification que c'est bien une "polyligne 3D",
Si ce n'est pas le cas le programme saute le (progn) et affiche une case d'alerte. - Lancement d'une boucle (while) qui teste que la "prochaine" entité n'est pas un "SEQEND" qui signifie la fin de la polyligne 3D
- Dans cette boucle on stoppe quand on trouve un (assoc 10) qui contient les coordonnées du sommet
- Quand on en tient un, il est mis en forme dans une ligne de texte avec (strcat) qui contient le numéro du sommet, la valeur X, la valeur Y puis la valeur Z, notez qu'il faut transformer en chaîne de caractère (string) en utilisant la fonction (rtos), j'ai choisi arbitrairement trois décimales mais une variable peut faire l'affaire et rendre le résultat paramétrable.
- à la fin n s'incrémente pour tester le prochain (assoc 10)
On est tous OK ?
(defun c:ListPoly3D (/ ent n EntLst ) (setq ent (car (entsel"\Choix de la polyligne3D à traiter ...\n"))) (if (= (cdr (assoc 0 (entget ent))) "POLYLINE") (progn (setq n 0 EntLst (entget ent) ent (cdr (assoc -1 EntLst))) (while (/= (cdr (assoc 0 EntLst)) "SEQEND") (setq EntLst (entget (setq ent (entnext ent)))) (if (assoc 10 EntLst) (princ (strcat "Sommet " (itoa n) " X : " (rtos (cadr (assoc 10 EntLst)) 2 3) " Y = " (rtos (caddr (assoc 10 EntLst)) 2 3) " Z = " (rtos (cadddr (assoc 10 EntLst)) 2 3) "\n") ) ) (setq n (1+ n)) ); fin du WHILE );progn (alert "le choix n'est pas une POLY 3D") );if poly3d (princ) ); fin de DEFUN
Si vous avez correctement tapé le code proposé (ou copié-collé) vous devriez recevoir dans l'écran texte (F2) quelque chose de ce genre :
Commande: LISTPOLY3D
Choix de la polylligne3D à traiter ...
Sommet 0 X : 19.172 Y = 14.761 Z = 3.572
Sommet 1 X : 24.327 Y = 19.970 Z = 5.348
Sommet 2 X : 28.265 Y = 13.691 Z = 7.144
Sommet 3 X : 32.899 Y = 19.420 Z = 8.929
Sommet 4 X : 36.142 Y = 13.922 Z = 10.476
Sommet 5 X : 38.806 Y = 19.825 Z = 12.046
Sommet 6 X : 42.079 Y = 14.443 Z = 13.572
Ceci était pour montrer comment parcourir les sommets de la polyligne 3D mais il est rare qu'on ait besoin de faire apparaître ces sommets à l'écran texte sous cette forme.
La plupart du temps il va être nécessaire de créer une liste (list) de ces sommets pour les traiter ultérieurement, soit modifier un sommet, soit unifier les altitudes, ou supprimer les points colinéaires via une autre programme.
Donc pour faire une liste de ces sommets je vais faire plus simple en code car il n'y a pas besoin de "mise en forme", il suffit de parcourir la liste tant qu'on ne rencontre pas de "SEQEND" comme vu précédemment et ça se fera sous cette forme :
(while (and (setq ent (entnext ent)) (/= "SEQEND" (cdr (assoc 0 (setq entlst (entget ent))))) ) (setq lst (cons (assoc 10 entlst) lst)) )
Une fois cette boucle lancée la variable lst contiendra les sommets sous la forme ((x1 y1 z1) (x2 y2 z2) ... (xn yn zn)) ce qui donne avec un exemple numérique :
((10 32.8986 29.9659 8.92931) (10 28.2651 24.2366 7.14375) (10 24.3267 30.5157 5.34763) (10 19.1719 25.3072 3.57188))
Pour écrire ces sommets dans un fichier texte externe, je vous renvoie à cette PAGE et vous utiliserez la même technique.
Le formulaire CONTACT vous permet de poser des questions le cas échéant.
retour aux exercices sur polylignes
30 Octobre 2019