Liste des blocs (suite)
But de l'exercice :
Créer une liste de tous les blocs
insérés dans le fichier
et les comptabiliser
Savoir quels blocs sont insérés dans le fichier est un renseignement utile à bien des utilisateurs, on a vu précédemment comment savoir si le bloc existe - en tant que "définition de bloc" - dans le fichier dessin, et aujourd'hui on avance en faisant une liste de ces blocs qu'on va afficher sur l'écran texte dans un premier temps mais pourquoi pas dans un fichier externe, fichier texte ou fichier lisible par Excel.
Tout d'abord pour les tests il est évident, mais je préfère le préciser, de travailler dans un fichier dessin qui a des blocs insérés. par exemple :
Voici une image du code et je vais le commenter ensuite pour la compréhension de chaque ligne :
Ligne 1 :
Création du nom de commande par la fonction (defun c:) avec des variables locales (qui perdent leur affectation à la fin du programme)
Ligne 2 :
Création d'un jeu de sélection par la fonction (ssget) dans le cas expliqué c'est un jeu de sélection à l'écran, toutefois c'est un jeu de sélection qui va filtrer les entités pour n'en garder que des entités BLOC (INSERT) un message apparaitra en ligne de commande : Choix des objets:
Ligne 3 :
Création d'une boucle (de répétition) par la fonction (repeat), le nombre de répétition est un nombre entier (integer) affecté à la variable "n"
Ligne 4 :
Création d'une variable blk qui va contenir le nom du bloc (voir assoc 2 dans les exercices précédents), vous remarquez que cette ligne cherche le nom de la nième entité (n qui s'incrémente) du jeu de sélection (ssname) contenu dans la variable sel
Ligne 5 :
Création d'un test par la fonction (if) il y a deux lignes dans ce test ce qui signifie que si la première ligne n'est pas "vraie" c'est la deuxième qui est prise en compte, en langage naturel ça donne
si test est vrai faire ça (première ligne)
si test est faux faire ça (deuxième ligne)
Comme il n'y a que deux lignes pas besoin de (progn) pour associer les lignes de fonctions en une seule interprétée par AutoLISP.
Ligne 6 :
si item n'est pas nil (donc est considéré comme vrai) créer via la fonction (cons) une liste (list) du nom du bloc et de sa position (position de item dans le repeat)
cela signifie que ce nom de bloc a déjà été listé
Ligne 7 :
sinon (deuxième ligne du (if)) créer une liste (list) avec ce nom de bloc.
Lignes 8 et 9 :
Fermeture des parenthèses ouvertes pour le (if) puis pour le (repeat)
Ligne 10 :
Création d'une boucle par la fonction (foreach), qui signifie que pour chacun (foreach) des éléments de la liste, imprimer à l'écran la concaténation du nom du bloc, d'une phase explicative, puis du nombre d'insertion (notez le (itoa) qui transforme un nombre entier (integer) en chaîne de caractères (string))
C'est fini ...
Si votre programme est correct le résultat sera quelque chose comme ça :
Les différentes idées pour améliorer ce programme :
Faire une sélection globale dans le dessin
Faire une sélection suivant le calque d'insertion
Écrire le résultat dans un fichier texte...
Passez par le formulaire de CONTACT pour m'en parler si vous le souhaitez, je vous guiderai le cas échéant
Et voici maintenant le code sous forme copiable pour ceux qui n'arrivent pas à taper leurs codes eux-mêmes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | (defun c:lister-blocs (/ sel n item lst) (setq sel (ssget '((0 . "INSERT")))) (repeat (setq n (sslength sel)) (setq blk (cdr (assoc 2 (entget (ssname sel (setq n (1- n))))))) (if (setq item (assoc blk lst)) (setq lst (subst (cons blk (1+ (cdr item))) item lst)) (setq lst (cons (cons blk 1) lst)) ) ) (foreach item lst (princ (strcat "\n" (car item) " -> Nombre d'insertion -> " (itoa (cdr item)) ) ) ) (princ) ) |
29 juin 2018