Liste des blocs
But de l'exercice :
Créer une liste de tous les blocs
insérés dans le fichier dessin
Pour tester cet exercice il faut travailler avec un fichier dessin qui contient des blocs, avec ou sans attributs c'est sans importance, on parlera des attributs plus tard... aujourd'hui on cherche à faire la liste des blocs, si blocs il y a.
Le principe de cette routine est de "scanner" la table des blocs enregistrés dans le fichier dessin.
Puisque le deuxième argument est renseigné à T lors du premier lancement de la fonction (tblnext) la liste va être parcourue jusqu'à la fin de cette liste (des blocs).
Notez qu'on cherche dans la table des "block", eh oui ! on ne trouvera pas de "blocs".
Notez aussi que pour le fonctionnement de ce programme il n'y aura pas de sélection dans l'interface graphique, la sélection va se faire dans une table, un tableau, une zone mémoire réservée par le logiciel où il stocke toutes ces définitions d'entités, pour mémoire il existe des tables pour les noms des calques, pour les types de lignes ...le descriptif complet de la commande ici : page de TBLNEXT.
Le code est là :
(sous forme d'image pour ceux qui veulent batailler avec le clavier)
Quelques explications avant de copier-coller (c'est pas bien de copier-coller !)
Ligne 1 : définition de la commande blo-lst avec deux variables locales bl et bl-nom, variables locales qui ne pourront donc pas être utilisées après la fin de la routine)
Ligne 2 : affectation à la variable bl de la liste de la première entité "bloc" en l'occurrence elle renvoie ce genre d'information :
((0 . "BLOCK") (2 . "A1a") (70 . 0) (4 . "") (10 0.0 0.0 0.0) (-2 . <Nom d'entité: 7f75e41e040>))
(le code DXF qui contient le nom du bloc est 2)
Ligne 3 : début d'une boucle, en langage naturel on dirait : vas-y TANT (while) la variable bl a une valeur (n'est pas à nil).
Ligne 4 : extraction du nom du bloc dans la liste complète
Ligne 5 : écriture sur une ligne de l'écran texte
Ligne 6 : on réinitialise la variable bl avec la prochaine entrée de la table des blocs
Puis on ferme les parenthèses et on souffle un peu devant tant de capacités !!!
il faut passer en mode texte (F2) pour voir le résultat, dans mon fichier qui contient plein de blocs avec des noms simples, ce sont des panneaux de signalisation routière et le nom est la référence du panneau.
Images du dessin utilisé et du résultat du programme :
Allez si vous voulez copier-coller c'est maintenant :
1 2 3 4 5 6 7 8 9 | (defun c:blo-lst (/ bl bl-nom) (setq bl (tblnext "BLOCK" T)) (while bl (setq bl-nom (cdr (assoc 2 bl))) (prompt (strcat "\n" bl-nom)) (setq bl (tblnext "BLOCK")) ) (princ) ) |
Ça c'était la première frappe du code et en le relisant on se rend compte qu'on a créé une variable pas vraiment utile et on peut décider d'optimiser en supprimant bl-nom ainsi :
Et ça fonctionne aussi bien (sinon mieux).
Dans la série on cherche toujours à améliorer :
On va afficher une case de dialogue simple, celle de base d'AutoLISP (alert) qui contiendra trois messages différents suivant le nombre de blocs :
Ça fait plus "propre", non ?
Le code qui fait ça est ici :
(ah oui c'est une image, vous allez devoir le taper vous-même, c'est bien plus formateur (hihi)) ...
Pour la première approche avec les blocs, je m'arrête là mais d'autres exercices arrivent.
22 juin 2018