CLOSED
Finalité de la routine : vérifier si la polyligne choisie est close ou pas.
Il sera intéressant de faire ce test avant d'interroger la superficie d'une polyligne car selon que cette dernière est close (ou pas) le résultat sera correct (ou pas).
Si le premier et le dernier sommet sont superposés le résultat de la superficie sera correct mais comme la polyligne n'est pas considérée comme "close" par AutoCAD le doute subsiste sur la superficie, il est toujours possible de vérifier les coordonnées des points de but et de fin et en cas d'égalité de calculer la superficié mais travailler avec une polyligne close est plus "propre".
Voici le code et je vais l'expliquer pas à pas :
Dans un premier temps on va vérifier si c'est une polyligne :
(if (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE") |
Si c'est le cas le programme continue et passe au test suivant :
1 2 3 4 5 6 7 | (if (or (= (cdr (assoc 70 (entget ent))) 1) (= (cdr (assoc 70 (entget ent))) 129) ) (alert "Polyligne CLOSE") (alert "Polyligne OUVERTE") ) |
Le test (fonction if) vérifie deux conditions, d'où l'utilisation du or, il faut vérifier si le code 70 est à 1 ou à 129, voir les explications des codes DXF
Donc si le code 70 est à 1 ou 129 (128 +1 en termes de bits) la polyligne est close et on lance le message :Si le test n'est pas vérifié c'est la ligne suivante qui est interprétée et on lance le message :Et enfin si l'entité choisie n'est pas une polyligne le test de "close/non close" est ignoré et c'est la ligne :
(alert "Ce n'est pas une polyligne") |
qui est interprétée pour renvoyer le message :
Ce programme définit une fonction avec un argument et la syntaxe d'utilisation est (nom-de-la-fonction argument) dans notre cas :
1 2 | (setq ent (car(entsel"\nChoix à l'écran...\n"))) (da-poly-close ent) |
ou bien directement :
(da-poly-close (car (entsel "\nSélectionnez une Polyligne ..._n"))) |
Et si on veut en faire une fonction qui renvoie T ou nil, par exemple des test dans un autre programme, il suffit de retirer les appels (alert)
Le code à copier :
1 2 3 4 5 6 7 8 9 10 11 12 | (defun da-poly-close (ent) (if (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE") (if (or (= (cdr (assoc 70 (entget ent))) 1) (= (cdr (assoc 70 (entget ent))) 129) ) (alert "Polyligne CLOSE") (alert "Polyligne OUVERTE") ) (alert "Ce n'est pas une polyligne") ) ) |
1 2 3 | (setq jeu-sel (ssget "_+.:E:S:L" '((0 . "LWPOLYLINE")))) (setq ent (ssname jeu-sel 0)) (da-poly-close ent) |
Ligne 1 - création d'un jeu de sélection (une seule entité) filtré sur les polylignes
Ligne 2 - extraction du nom d'entité (ename) du premier objet (unique) du jeu de sélection
Ligne 3 - lancement de la routine
N'hésitez pas à prendre contact avec moi si quelque chose manque dans ces explications
retour aux exercices sur polylignes
05 mars 2018