Aller au contenu

controle des calques en lisp


vms66

Messages recommandés

Bonjour,

 

Pour désactiver tous les calques:

(setq calques (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object))))
(vlax-for calque calques
 (vla-put-LayerOn calque :vlax-false)
)

 

Pour activer un calque:

(vla-put-LayerOn calque :vlax-true)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Pour désactiver tous les calques:

(setq calques (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object))))
(vlax-for calque calques
 (vla-put-LayerOn calque :vlax-false)
)

 

Pour activer un calque:

(vla-put-LayerOn calque :vlax-true)

 

 

merci

mais j'ai ce message d'erreur

; erreur: no function definition: VLAX-GET-ACAD-OBJECT

 

je suis sous autocad2004

et vlax je ne connait point du tout.....

Lien vers le commentaire
Partager sur d’autres sites

Pour utiliser les fonctions Visual Lisp, il faut d'abord les charger avec

(vl-load-com)

 

Si tu ne veux pas utiliser ces fonctions, tu devrais aussi pouvoir t'en tirer avec (command):

(setq expert (getvar "expert")
(setvar "expert" 1)
(command "_-layer" "_off" "*" "")
(setvar "expert" expert)

 

Et pour activer un calque:

(command "_-layer" "_on" "nomducalque" "")

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Si tu ne veux pas utiliser l'interface COM (comme suggéré par Bryce), pour désactiver les calques, avec AutoLISP, il faut que la valeur du groupe DXF 62 (couleur du calque) soit négative.

On peut donc parcourir la table des calques avec tblnext et modifier la liste DXF de chacun des calques (liste complète récupérée avec tblobjname) :

 

(defun alloff (/ layer elst color)
 (while (setq layer (tblnext "layer" (not layer)))
   (setq elst	(entget (tblobjname "layer" (cdr (assoc 2 l))))
  color	(cdr (assoc 62 l))
   )
   (if	(< 0 color)
     (entmod (subst (cons 62 (- color)) (cons 62 color) elst))
   )
 )
)

 

Pour activer un calque d'après son nom :

 

(defun layerOn (layername / layerelst color)
 (if (setq layer (tblobjname "layer" layername))
   (progn
     (setq elst  (entget layer)
    color (cdr (assoc 62 elst))
     )
     (entmod (subst (cons 62 (abs color)) (cons 62 color) elst))
   )
 )
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

(gile), je me permets de te corriger car je crois que tu as oublié de renommer certaines variables :

(defun alloff (/ layer elst color)
 (while (setq layer (tblnext "layer" (not layer)))
   (setq elst  (entget (tblobjname "layer" (cdr (assoc 2 layer))))
         color (cdr (assoc 62 layer))
   )
   (if (< 0 color)
     (entmod (subst (cons 62 (- color)) (cons 62 color) elst))
   )
 )
)

Lien vers le commentaire
Partager sur d’autres sites

  • 8 ans après...

(gile), je me permets de te corriger car je crois que tu as oublié de renommer certaines variables :

(defun alloff (/ layer elst color)
 (while (setq layer (tblnext "layer" (not layer)))
   (setq elst  (entget (tblobjname "layer" (cdr (assoc 2 layer))))
         color (cdr (assoc 62 layer))
   )
   (if (< 0 color)
     (entmod (subst (cons 62 (- color)) (cons 62 color) elst))
   )
 )
)

 

Bonjour, je debute en LISP depuis quelques jours, je cherche à manipuler les noms de calque et je me galérais avec la commande tblnext, du coup je suis tombé sur ce sujet qui m'a permis d'ajouter un préfixe. Par contre je ne comprends pas le (not layer) dans (tblnext "layer" (not layer)), j'avais compris que quel que soit l'argument passé derrière le nom de la table, ca réinitialisait la table à sa première valeur?

 

 

(while (setq layer (tblnext "layer" (not layer)))

(setq elst (entget (tblobjname "layer" (cdr (assoc 2 layer))))

old_nom (cdr (assoc 2 layer))

)

 

(if (/= "0" old_nom)

(entmod (subst (cons 2 (strcat PREFIXE old_nom)) (cons 2 old_nom) elst))

);if

);while

Geometre - Autocad 2016 - Covadis v17.0

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

La 1ère fois que l'on passe dans la boucle, la variable layer est égale à nil, donc (not layer) vaut T donc le tblnext avec le drapeau T te renvoie le 1er objet (le 1er calque).

Lorsque tu passes une seconde fois dans la boucle (et toutes les autres fois), ta variable layer contient quelque chose (la définition du calque précédent) donc (not layer) vaut nil, donc tblnext appelé avec le drapeau nil te renvoie le calque suivant.

C'est une astuce de programmation qui évite de déclarer une variable booléenne à mettre à T pour demander le 1er calque, puis le mettre à nil ensuite.

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité