Aller au contenu

Déverrouiller/re-verrouiller des calques


(gile)

Messages recommandés

Salut,

 

J'ai essayé de faire une routine générique pour déverrouiller et re-verrouiller des calques.

Ce n'est sûrement pas la routine que tout le monde attendait mais c'était l'occasion de jouer avec la fonction defun-q.

 

Cette fonction permet de définir une fonction tout comme defun, mais au lieu de générer un objet de type SUBR ou USUBR elle génère une liste. Cette particularité permet de redéfinir la fonction dans sa propre définition.

Dans le cas présent, il s'agit de redéfinir la valeur de la variable lst (en début de routine) à chaque appel de la fonction pour y stocker les calques qui auront été déverrouillés ou la vider au re-verrouillage des dits calques.

On peut voir la fonction/liste en entrant !layerunlock à la ligne de commande ou layerunlock dans la console Visual LISP.

 

La fonction requiert un argument (layername) qui peut être :

- soit un nom de calque à déverrouiller (possibilité d'utiliser les caractères génériques pour traiter plusieurs calques)

- soit une liste de noms de calques à verrouiller (ne tient pas compte de la casse)

- soit nil pour re-verrouiller tous les calque précédemment déverrouillés avec layerunlock.

 

Exemples :

(layerunlock "0") déverrouille le calque "0"

(layerunlock '("calque1" "calque2") déverrouille les claques "calque1" et "calque2"

(layerunlock "*") déverrouille tous les calques verrouillés

(layerunlock nil) re-verrouille les calques prédemment déverrouillés.

 

;;; LAYERUNLOCK (gile)
;;; Déverrouille ou reverrouille les calques spécifiés
;;;
;;; Argument
;;; layername :
;;; - un nom de calque (caractères génériques acceptés : "*" pour tous)
;;; - une liste de nom de calques (ne tient pas compte de la casse)
;;; - ou nil pour reverrouiller les calques prédemment déverrouillés

(defun-q
 layerunlock
 (layername / lst layers lay)

 ;; initialisation de la variable lst
 (setq lst nil)
 
 (setq	layers (vla-get-Layers
	 (vla-get-ActiveDocument (vlax-get-acad-object))
       )
 )
 (cond
   ((= (type layername) 'STR)
    (vlax-for l
	 (vla-get-Layers
	   (vla-get-ActiveDocument (vlax-get-acad-object))
	 )
      (and (wcmatch (strcase (vla-get-Name l)) (strcase layername))
    (= (vla-get-Lock l) :vlax-true)
    (setq lst (cons l lst))
    (vla-put-Lock l :vlax-false)
      )
    )
   )
   ((vl-consp layername)
    (foreach n	layername
      (and (not (vl-catch-all-error-p
	   (setq lay (vl-catch-all-apply
		       'vla-item
		       (list layers n)
		     )
	   )
	 )
    )
    (= (vla-get-Lock lay) :vlax-true)
    (setq lst (cons lay lst))
    (vla-put-Lock lay :vlax-false)
      )
    )
   )
   ((null layername)
    (foreach l	lst
      (vla-put-Lock l :vlax-true)
    )
    (setq lst nil)
   )
 )

 ;; Redéfinition de layerunlock
 (setq	layerunlock
 (cons (car layerunlock)
       (cons (list 'setq 'lst (list 'quote lst))
	     (cddr layerunlock)
       )
 )
 )
 lst
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Salut (gile),

merci pour cet exemple et ton explication.

J'en comprends le système...

... pas encore l'utilité.... (mais je n'ai fait que survoler)....

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

Salut Bred,

 

Tu vois, j'ai vu ton message ;)

 

En fait je me suis inspiré d'une routine certainement plus utile : ai_sysvar qui se trouve dans le fichier AutoCAD.mnl des versions antérieure à 2007 et dans acad200Xdoc.lsp depuis 2007.

 

Je pense que cette méthode peut-être utilisée pour faire des routines de protection (mot de passe, clé), je fais quelques essais et ça semble fonctionner aussi après compilation/cryptage du fichier.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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é