AutoCAD LISP : Modifier les propriétés d'éléments de table avec (tblobjname)

J’essaie de modifier les propriétés d’éléments de table (comme les calques ou les styles de texte) en AutoLISP, mais (tblsearch) ne me permet que de lire les informations. Comment puis-je obtenir l’objet réel pour le modifier ?

Pour modifier les propriétés d’un élément de table AutoCAD (comme un calque, un style de texte, etc.) via AutoLISP, il est essentiel d’obtenir son adresse mémoire réelle à l’aide de la fonction (tblobjname), car (tblsearch) ne fournit qu’une copie statique des propriétés.

  1. Comprendre la distinction entre (tblsearch) et (tblobjname) :

    • (tblsearch) : Agit comme une « carte de visite ». Elle renvoie une liste de propriétés de l’élément (par exemple, le nom et la couleur d’un calque). Cette liste est une copie statique ; la modifier n’affecte pas l’objet réel dans le dessin AutoCAD.
    • (tblobjname) : Agit comme une « poignée de main » avec l’objet réel. Elle renvoie l’adresse mémoire (ou nom d’entité) de l’élément de table. C’est ce nom d’entité qui permet d’interagir directement avec l’objet et de le modifier.
  2. Utiliser la syntaxe de (tblobjname) :

    • La syntaxe de (tblobjname) est simple et identique à celle de (tblsearch) : (tblobjname "NOM_TABLE" "NOM_ELEMENT").
    • Par exemple, pour obtenir l’adresse mémoire du calque « 0 », vous utiliseriez : (tblobjname "LAYER" "0").
  3. Interpréter le résultat :

    • Lorsque vous exécutez (tblsearch "LAYER" "0"), vous obtenez une liste de propriétés lisible (ex: ((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))).
    • Lorsque vous exécutez (tblobjname "LAYER" "0"), vous obtenez un nom d’entité cryptique (ex: <Nom d'entité: 7ffff7c0060>). Ce code est le « sésame » que vous passerez aux fonctions de modification AutoLISP ou Visual LISP (comme entmod ou vla-put-color) pour appliquer des changements à l’objet réel.
  4. Exemple de démonstration (code AutoLISP) :
    Le code suivant, à exécuter dans la ligne de commande d’AutoCAD, illustre la différence de retour entre les deux fonctions :

    (defun c:TestTblObjName ()
      (princ "\nRecherche du calque \"0\" avec tblsearch : ")
      (setq carte-visite (tblsearch "LAYER" "0"))
      (princ carte-visite) ; Affiche la liste des propriétés
    
      (princ "\nRecherche du calque \"0\" avec tblobjname : ")
      (setq personne-reelle (tblobjname "LAYER" "0"))
      (princ personne-reelle) ; Affiche le nom d'entité
      (princ)
    )
    

    Après avoir chargé et exécuté (c:TestTblObjName), vous verrez dans la ligne de commande les deux types de retours, confirmant que (tblobjname) fournit l’accès à l’objet modifiable.