Bonjour à la communauté.
J’éssai d’écrire un lisp et je n’arrive pas à utiliser « tblsearch » (ou « tblnext »).
J’aimerai, par exemple, activer tous les calques commençant par « PH_00 », ou les verrouiller, ou les inactiver… Bref, je pense que vous avez compris le truc.
Cordialement.
DenisH…
Alors l’IA te donnes quelques pistes ci-dessous, pas à prendre au pied de la lettre ce n’est qu’une IA mais il te donne le principe, d’utilisation de ces fonctions:
Voici comment fonctionnent ces fonctions :
tblsearchsert à rechercher une entrée dans une table de symboles par nom de manière précise.tblnextpermet de parcourir séquentiellement toutes les entrées d’une table, avec une option pour revenir au début (rewind).
Dans votre cas, pour activer/verrouiller/inactiver tous les calques dont le nom commence par « PH_00 », il faut parcourir la table des calques (LAYER), ce que vous faites avec tblnext, et tester pour chaque entrée si son nom correspond à votre critère (par exemple avec wcmatch qui fait une comparaison avec joker).
Ensuite, on modifie la définition du calque en intervenant dans la liste associée de propriétés retournée par tblnext (par exemple, le groupe DXF 62 pour la couleur, 70 pour les drapeaux comme gelé ou verrouillé, et 290 pour verrouillage, selon les valeurs à changer), puis on applique cette modification avec entmod.
Voici un exemple de script AutoLISP adapté à votre besoin :
(defun c:ActiverCalquesPH00 ( / layerData layerName modData )
(setq layerData (tblnext "LAYER" T)) ; commencer au premier calque
(while layerData
(setq layerName (cdr (assoc 2 layerData))) ; nom du calque
(if (wcmatch layerName "PH_00*") ; test du début du nom
(progn
;; Modification exemple : activer calque (drapeau 70 et état couleur)
;; Remplacez ou ajoutez selon besoin pour verrouiller/inactiver
(setq modData
(subst (cons 70 0) (assoc 70 layerData) layerData) ; dégelé (0 = dégelé)
)
(setq modData
(subst (cons 62 7) (assoc 62 modData) modData) ; couleur = 7 (blanc par défaut)
)
(entmod modData)
)
)
(setq layerData (tblnext "LAYER")) ; calque suivant
)
(princ "\nCalques PH_00 traités.")
(princ)
)
Quelques remarques :
wcmatchest la fonction idéale pour comparer le nom du calque à un patron avec joker*.- Les codes DXF utilisés dans les listes retournées par
tblnextsont documentés dans la référence AutoLISP (par ex. 2=nom, 62=couleur, 70=flags). entmodapplique les modifications à la table des calques (c’est une opération valide même pour des tables symboliques).- Une fois les changements faits, il peut être nécessaire d’exécuter une régénération du dessin (commande AutoCAD®
REGEN) pour que les modifications d’affichage prennent effet visuellement.
Avec ce script, vous pouvez facilement adapter les modifications invoquées dans la partie (subst ...) selon que vous souhaitiez verrouiller, désactiver, ou autre. Par exemple, verrouiller un calque revient à modifier le groupe 290 pour la propriété lock, ou geler via le groupe 70 en utilisant les bits appropriés.
Un grand merci Patrick !
Je ne savais pas qu’on pouvait utiliser tblnext comme créateur de listes !
Je connaissais déjà wcmatch et les paires pointées (merci à Maître Gile C.).
Encore merci, je vais lire ce code avec la plus grande attention.
(il va falloir que je me penche sur l’IA)
Cordialement.
DenisH…
Voir: