clore la polyligne si elle ne l'est pas


Sur la page "La polyligne est-elle close ?" nous avons vu comment vérifier  si une polyligne est close.
C'est déjà une bonne chose de savoir si elle l'est ou pas "close", closed pour parler la langue native d'Autocad/Autolisp.
Mais si elle n'est pas "close", on fait quoi ?, on rentre dans les propriétés pour la clore "à la main" comme ça ? :case-de-dialoque-clore-polyligneMais NON, vous êtes sur un site de "programmation" donc programmons...


Finalité de la routine : vérifier si la polyligne choisie est close ou pas et si elle ne l'est pas, proposer à l'utilisateur de la clore.


Le code en image :

Quelques explications :

- defun c:da-poly-close02 est la définition de la fonction avec les variables locales qui suivent
- choix de l'entité
- test si l'entité est une polyligne
- si oui on vérifie le code 70
- s'il est différent de 1 ou 129 c'est que la polyligne n'est pas close
- affichage d'une case (alert) suivant le test du code 70
- affichage d'une case (alert) suivant le test "est-ce une polyligne ?"

On a renseigné une variable "test" au passage du contrôle du code 70 et ses valeurs peuvent être "ouverte" ou "close", il ne reste plus qu'à mettre un (if) qui va tester cette variable.

- test : la valeur de la variable "test" est "ouverte"
- on ouvre un (progn) car il y a plusieurs instructions à traiter et on est dans un (if) qui n'en supporte qu'un ((progn) ne fait qu'une instruction de plusieurs)
- création d'une variable "ent-liste" qui extrait l'entité sous forme d'un liste (list) de codes DXF
- utilisation de (subst) pour substituer le nouveau code 70 à l'ancien
- utilisation de (entmod)
- et enfin utilisation de (entupd) qui va mettre à jour l'entité

Et dorénavant la polyligne est bel et bien "close" (closed) au sens AutoCAD.

Vous noterez l'utilisation de (initget) et (getkword) et je vous invite à aller visiter les pages concernant ces fonctions pour les découvrir ou vous familiariser avec elles.


Limitations de cette fonction :

Si le dernier sommet et le premier sont superposés, AutoCAD ne va pas considérer la polyligne close pour autant et l'utilisation de la routine explicitée dans cette page va créer un sommet superposé au dernier (et au premier aussi donc).
Prenons l'exemple de la polyligne de sommets A B C et D

Soit on dessine A puis B puis C et enfin D et on choisit "c" comme clore
Soit on dessine A puis B puis C puis D et on finit par A, la polyligne n'est pas close (au sens AutoCAD) (code 70)

Dans quelques temps vous trouverez un exemple qui permet de vérifier ces sommets superposés qui nuisent à la qualité et à l'intégrité des dessins.

À bientôt pour de nouvelles aventures...

 


haut de page

retour aux exercices sur polylignes


30 mars 2018