AutoCAD LISP : Comment lister et parcourir les tables (calques, blocs) avec (tblnext) ?

Je cherche à comprendre comment utiliser la fonction (tblnext) en AutoLISP pour itérer sur les éléments des tables AutoCAD, comme les calques ou les blocs. J’aimerais un exemple concret pour lister tous les calques d’un dessin.

La fonction (tblnext) en AutoLISP est l’outil idéal pour parcourir séquentiellement les éléments des tables AutoCAD (calques, blocs, styles, etc.), agissant comme un itérateur qui vous ramène les objets un par un.

Voici comment l’utiliser efficacement :

  1. Comprendre le principe « Au Suivant ! » : (tblnext) signifie littéralement « Table Suivante ». Elle plonge dans une table spécifique (par exemple, les calques) et vous retourne les objets un par un. Lors du premier appel, elle renvoie le premier objet ; lors des appels suivants, elle renvoie l’objet suivant. Quand il n’y a plus d’objets à lire, elle renvoie nil.

  2. Maîtriser la syntaxe et le « rembobinage » :

    • Argument 1 : Le nom de la table à parcourir, sous forme de chaîne (ex: "LAYER" pour les calques, "BLOCK" pour les blocs, "STYLE" pour les styles de texte, etc.).
    • Argument 2 (optionnel) : C’est un interrupteur pour « rembobiner » la lecture.
      • Si vous mettez T (True/Vrai) : La lecture repart du tout premier objet de la table. C’est essentiel pour initialiser la lecture ou la recommencer.
      • Si vous ne mettez rien (ou nil) : La fonction continue la lecture et renvoie l’objet suivant dans la séquence.
  3. Exemple pratique : Lister tous les calques d’un dessin :
    Pour lister les noms de tous les calques du dessin courant dans la ligne de commande d’AutoCAD, vous pouvez utiliser une boucle while avec (tblnext).

    • Initialiser la lecture : Le premier appel à (tblnext "LAYER" T) permet de « rembobiner » et d’obtenir le premier calque.
    • Itérer : La boucle while continue tant que (tblnext "LAYER") renvoie un objet (c’est-à-dire tant qu’il y a un calque suivant).
    • Extraire l’information : Chaque objet retourné par (tblnext) est une liste d’association (DXF group codes). Le nom du calque est généralement associé au code DXF 2. Utilisez (cdr (assoc 2 calque)) pour l’extraire.
    • Afficher : Utilisez (princ (strcat "Calque : " nom_calque "\n")) pour afficher le nom du calque dans la ligne de commande.

    Voici le code AutoLISP complet :

    (defun c:LISTECALQUES ()
      (setq calque (tblnext "LAYER" T)) ; Rembobine et prend le 1er calque
      (while calque
        (setq nom_calque (cdr (assoc 2 calque))) ; Récupère le nom du calque (DXF 2)
        (princ (strcat "Calque : " nom_calque "\n"))
        (setq calque (tblnext "LAYER")) ; Passe au calque suivant
      )
      (princ "\nListe des calques terminée.\n")
      (princ) ; Pour éviter d'afficher la dernière valeur de la fonction
    )
    
    • Pour lancer la commande : Copiez ce code dans un fichier .lsp, chargez-le dans AutoCAD (via APPLOAD), puis tapez LISTECALQUES dans la ligne de commande.
  4. Points clés à retenir pour briller :

    • Utilisez (tblnext "NOM_TABLE" T) pour démarrer ou redémarrer la lecture au début de la table.
    • Utilisez (tblnext "NOM_TABLE") (sans le T) à l’intérieur d’une boucle pour avancer pas à pas dans la table.
    • La fonction renvoie nil quand tous les éléments de la table ont été lus, signalant la fin du parcours.
    • C’est un outil fondamental pour créer des listes déroulantes dynamiques, des routines de vérification ou pour traiter par lot des objets spécifiques dans AutoCAD.