Toujours dans un but d'exercice et d'entrainement je vais faire un programme une routine qui va me dire si la polyligne sélectionnée contient ou ne contient pas de segments courbes.
Le principe est de balayer tous les codes renvoyés par (entget) et de vérifier les codes 42, le code 42 servant à stocker les valeurs de bulge (segment courbe) dans une liste DXF de définition de polyligne (renvoyée par (entget))
Si la valeur contenue dans le code 42 est différente de 0 (zéro) c'est que le vertex (segment) est courbe (un arc).
Je vais bientôt créer un article où je vous expliquerai comment est renseigné ce code 42 quand il est différent de 0 (zéro) car ce n'est pas tout à fait intuitif.
Voici le code sous forme d'image pour ceux qui veulent bien taper au clavier les lignes de code pour apprendre efficacement :
Et le voici copiable pour les flemmards :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ;routine qui va tester si la polyligne contient un ou des arcs ;argument ent sous forme de ename ; syntaxe (da-poly-arc? ent) ;------------------------------- (defun da-poly-arc? (ent / ent-liste n arc) (setq ent-liste (entget ent) n 0 ) ;_ Fin de setq (repeat (length ent-liste) (if (= 42 (car (nth n ent-liste))) (if (/= 0.0 (cdr (nth n ent-liste))) (setq arc T) );_ Fin de if - le code 42 est différent de 0.0 ) ;_ Fin de if - il y a un code 42 (setq n (+ 1 n)) ) ;_ Fin de repeat (if arc (alert "la polyligne contient au moins un raccord courbe") (alert "la polyligne ne contient pas de raccord courbe") );fin de if la variable est renseignée ou pas ) ;_ Fin de defun |
Les explications :
- trois lignes de commentaires car c'est bien de mettre des commentaires
- définition de la commande da-poly-arc? avec une variable locale ent et trois variables qui seront effacées à la fin de la routine
- on renseigne les variables, la première est l'argument de la fonction, viennent ensuite :
n nombre entier (integer) qu'on met à 0 (zéro) et qui va servir à se situer dans la liste élément par élément , (nth) servant à se positionner dans le nombre d'éléments de la liste. le premier élément d'une liste (list) est en position 0 (zéro),
puis "arc" qui est une chaîne (string) et qu'on renseigne par "non" comme ça si on ne trouve pas d'arc ce sera la valeur retenue par défaut.
- départ d'une boucle de (repeat) qui va "durer" tant qu'il y a des éléments dans "ent-liste", (length) donnant le nombre d'éléments dans la liste.
- SI on trouve un code 42 on analyse la ligne suivante sinon on saute à l'incrémentation de n.
- SI ce code 42 contient autre chose que 0.0 la variable "arc" se trouve renseignée par T (true)
- incrémentation de n d'une valeur de 1
- la boucle continue
- SI la variable "arc" est T (true) afficher une case de dialogue avec le texte
"la polyligne contient au moins un raccord courbe" sinon afficher une case de dialogue avec le texte "la polyligne ne contient pas de raccord courbe" par l'entremise de la fonction (alert)
- fin de la fonction
C'est clair pour tout le monde ?
il suffit de définir une variable avec un (ename) de polyligne puis de lancer la fonction avec cette variable en argument :
1 2 | (setq tempo (car (entsel "\ncliquez une polyligne\n"))) (da-poly-arc? tempo) |
Si la polyligne a au moins un raccord courbe (si petit soit-il) vous devriez voir ça :Sinon ça :
Il se trouve que j'ai utilisé dans cet exemple un (repeat) pour balayer la liste mais il peut être avantageusement remplacé par un (foreach) en changeant la ligne
(repeat (length ent-liste)
comme ceci :
Pour améliorer le code il faut vérifier si l'entité est bien de type " polyligne" mais je vous laisse faire car je l'ai expliqué par ailleurs.
retour aux exercices sur polylignes
10 mars 2018