Blocs-04 : sur calque Zéro ?

bloc sur le calque 0 (zéro)


le redéfinir
s'il est défini sur un autre calque


Il est courant de recevoir des fichiers de l'extérieur ou même de travailler avec ses propres fichiers contenant des blocs définis ailleurs que sur le calque 0 (zéro).
C'est une plaie pour purger ces calques dont AutoCAD a "besoin" et qu'il refuse donc de purger même s'ils ne contiennent aucune entité, puisqu'ils sont nécessaires à une "définition de bloc" ils sont considérés par le logiciel comme utilisés et donc non purgeables.

Le but de cet exercice est donc de lister tous les blocs du dessin, qu'ils soient insérés dans l'interface graphique ou pas - la totalité de la "table des blocs" sera scannée - et de vérifier sur quel calque est dessinée l'entité composant le bloc, si ce n'est pas le calque 0 (zéro) la changer de calque et choisir - cette fois - le calque 0 (zéro).

L'image suivante est un exemple de bloc composé d'entités chacune sur un calque spécifique, et avec ce genre de bloc, même si vous l'insérez dans le calque 0 (zéro) il vous sera impossible de purger les calque1, calque2 ... car si vous deviez le décomposer chaque entité reviendrait dans son calque originel et c'est pour ça que le logiciel refuse de purger ces calques.


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)
Lignes 2 et 3 :
Création d'une variable def-blk qui contient la définition du premier bloc trouvé dans la table des blocs par la fonction (tblnext) et d'une variable compteur initialisée à 1.
Ligne 4 :
Création d'une boucle par la fonction (while) en langage naturel ce serait tant que le test est "VRAI" (ce qui suit le mot "while") tu continues...
dans notre cas, c'est tant qu'on trouve des définitions de blocs.
Nota : je vais par la suite écraser cette variable à plusieurs reprises car elle n'est plus utile en l'état et il est inutile de multiplier les noms de variables dans les programmes.
Ligne 5 :
Écrasement de la valeur de blk par le nom de la première entité contenue dans le bloc.
Ligne 6 :
Boucle qui signifie tant qu'il y a des entités dans le bloc...
Ligne 7 :
Écrasement de la valeur de blk par la liste DXF du bloc.
Ligne 8 :
Début d'une boucle de condition par la fonction (if) qui teste si l'entité est dans le calque 0 (zéro) par la fonction (assoc), 8 étant le code DXF des calques.
Ligne 9 :
Obligation de mettre un (progn) car il y a plusieurs fonctions à la suite du (if)
Ligne 10 :

Écrasement de la valeur de blk par la nouvelle liste DXF du bloc, nouvelle car si l'entité n'était pas dans le calque 0 (zéro) on a substitué par la fonction (subst) le calque 0 (zéro) à l'ancien calque de l'entité, si l'entité est trouvée dans le calque 0 (zéro) le programme continue en l'ignorant en "sautant" à la fin du (if).
Ligne 11 :
Par la fonction (entmod) on réinitialise l'entité
Lignes 12 et 13 :
Fermetures des parenthèses ouvertes pou (progn) et (if)
Ligne 14 :
Écrasement de la valeur de blk par l'entité suivante.
Ligne 15 :
Fermeture de la parenthèse du deuxième (while)
Ligne 16 :

Nouvelle définition de def-blk par la définition du bloc suivant dans le table des blocs et incrémentation de la variable compteur par la fonction (1+).
Ligne 17 :
Fermeture de la parenthèse du premier (while)
Ligne 18 :

Écriture sur l'écran texte d'un message précisant le nombre de blocs traités.


Voilà, si votre programme a bien fonctionné les blocs de votre dessin ne contiennent plus d'entités dessinées sur un autre calque que le 0 (zéro).
Il est nécessaire de faire une REGEN pour voir les modifications et en y pensant je l'ai rajoutée (en ligne 22) dans le fichier texte qui suit mais elle n'apparaît pas dans l'image du code.

Voici le code prêt à copier :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(defun c:blocs-Calque-0 (/ def-blk compteur)
   (setq def-blk (tblnext "block" T)
         compteur 1)
   (while def-blk
      (setq blk (cdr (assoc -2 def-blk)))
      (while blk
         (setq blk (entget blk))
         (if (/= (cdr (assoc 8 blk)) "0")
            (progn
               (setq blk (subst (cons 8 "0") (assoc 8 blk) blk))
               (entmod blk)
            )
         )
      (setq blk (entnext (cdr (assoc -1 blk))))
      )
   (setq def-blk (tblnext "block") compteur (1+ compteur))
)
(princ (strcat "\n "
               (itoa compteur)
               " blocs ont été redéfinis dans le calque 0")
)
(command "_regen")
(princ)
)

À votre disposition par le formulaire CONTACT

 


Haut de page

Retour aux exercices BLOCS


29 juin 2018