Aller au contenu

Renommer liste de calques


scake

Messages recommandés

Un petit souci :

 

 
;;scake - remplace Préfixe pour les calques sélectionnés
;;Ici "\u+221e", signe infini


(defun c:lren ()

(setq old_layers "AR-*")
(setq new_layers "\u+221e_*")

(command "_-rename" "_layer" old_layers new_layers)
; Renomme les calques ar - ... en infini-_..

)

 

L'idée est simplement de remplacer les préfixes de calque "AR" par un signe infini

La commande silencieuse n'accepte pas les filtres en "*" avec cette méthode, je suis obligé pour l'instant d'entrer TOUS les noms de calques commençant par AR !

La commande classique (_rename) les accepte et fonctionne à merveille, mais je préfèrerai automatiser ... :casstet:

 

Ce doit être une petite chose, mais je ne trouve pas.

Si quelqu'un à une idée, Merci !

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je te propose une autre méthode, parcourir la table des calques avec la fonction tblnext,

pour chaque calque, tester le préfixe avec la fonction wcmatch, et si besoin, modifier le nom du calque directement dans la base de données (DXF) avec les fonctions entmod, entget et tblobjname.

 

(defun c:toto (/ lay name)
 ;; premier calque de la table (collection)
 (setq lay (tblnext "LAYER" T))

 ;; on parcourt la table des calque
 (while lay
   (setq name (cdr (assoc 2 lay)))

   ;; si le préfixe correspond, on le change
   (if	(wcmatch name "AR-*")
     (entmod
(subst
  (cons	2
	(strcat "\u+221e_" (vl-string-left-trim "AR-" name))
  )
  (assoc 2 lay)
  (entget (tblobjname "LAYER" name))
)
     )
   )
   ;; on passe au claque suivant
   (setq lay (tblnext "LAYER"))
 )
 (princ)
) 

 

On peut aussi faire la même chose en utilisant les fonctions Visual LISP (puisque tu postes dans le forum Visual LISP)

 

(defun c:tata (/ name)
 ;; on charge les fonctions Visual LISP
 (vl-load-com)

 ;; on parcourt la collection des calques
 (vlax-for lay	(vla-get-Layers
	  (vla-get-ActiveDocument
	    (vlax-get-acad-object)
	  )
	)

   (setq name (vla-get-Name lay))

   ;; si le préfixe correspond, on le change
   (if	(wcmatch name "AR-*")
     (vla-put-Name
lay
(strcat "\u+221e_" (vl-string-left-trim "AR-" name))
     )
   )
 )
) 

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

Lien vers le commentaire
Partager sur d’autres sites

Est-il possible de demander le préfixe à remplacer et ensuite le préfixe qui remplace celui-ci à l'utilisateur ?

 

Bien sûr, les fonctions qui permettent de demander des données à l'utilisateur sont les fonctions getXXX.

Pour demander une chaîne (string), c'est la fonction getstring.

 

Je te laisse adapter le code, et essaye de rester disponible pour t'aider si tu as des problèmes.

 

PS : tu aurais peut-être du poster dans le forum "Débuter en LISP".

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

Lien vers le commentaire
Partager sur d’autres sites

Salut Giles et compris pour l'adressage de la prochaine demande.

Je ne parvients pas à introduire le filtre "*" dans le "if" (je préfère ne pas avoir à expliquer à chacun des membres de l'agence qu'il faut l'écrire en A )

 

 
(defun c:lren2 ()
(setq A (getstring "Préfixe des calques à changer  : "))
(setq B (getstring "Nouveau Préfixe <\u+221e_> : "))

;; on charge les fonctions Visual LISP
(vl-load-com)

;; on parcourt la collection des calques
(vlax-for lay (vla-get-Layers
(vla-get-ActiveDocument
(vlax-get-acad-object)
)
)

(setq name (vla-get-Name lay))

;; si le préfixe correspond, on le change (comment introduire le "*" ?)
(if (wcmatch name A)
(vla-put-Name
lay
(strcat B (vl-string-left-trim A name))
)
)
)
) 

 

[Edité le 29/10/2008 par scake]

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Quelques petits conseils :

 

- déclarer les variables

- \n dans une chaîne équivaut à un saut de ligne

- si tu veux mettre une valeur par défaut ("\nNouveau Préfixe : "), il faut faire un test conditionnel pour savoir si l'utilisateur a fait Entée ou clic droit, ce qui pour la fonction getstring, retourne "" (nil pour les autres fonctions getXXX)

 

(defun c:lren2 (/ A B name)		; Déclarer les variables
 (vl-load-com)

 (setq A (getstring "\nPréfixe des calques à changer : "))

 ;; pour avoir le symbole infini par défaut (entrée ou clic droit)
 (if (= (setq B (getstring "\nNouveau Préfixe  : ")) "")
   (setq B "\u+221e_")
 )

 ;; on parcourt la collection des calques
 (vlax-for lay	(vla-get-Layers
	  (vla-get-ActiveDocument
	    (vlax-get-acad-object)
	  )
	)

   (setq name (vla-get-Name lay))

   ;; si le préfixe correspond, on le change
   (if	(wcmatch name (strcat A "*"))
     (vla-put-Name
lay
(strcat B (vl-string-left-trim A name))
     )
   )
 )
 (princ)
) 

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

Lien vers le commentaire
Partager sur d’autres sites

  • 7 mois après...

Bonjour,

 

J'ai un plan avec certains calques qui ont un préfixe du type ORG et d'autre avec un préfixe du type URG.

Je voudrais mettre en couleur 8 les objets des calques qui ont le préfixe ORG.

J'ai donc essayé d'adapter le code selon mes besoins mais ca ne marceh pas et sérieux je ne vois pas d'ou vient le problème avec la fonction ssget.

 

 

(defun c:color8	(/ lay name ss1)
 ;; premier calque de la table (collection)
 (setq lay (tblnext "LAYER" T))

 ;; on parcourt la table des calque
 (while lay
   (setq name (cdr (assoc 2 lay)))

   ;; si le préfixe correspond, on le change
   (if	(wcmatch name "ORG_*")

     (setq ss1
     (ssget "X"
	    (list (cons 8 lay))
     )
     )

     (command "changer" ss "" "pr" "co" "8" "")
   )
   ;; on passe au claque suivant
   (setq lay (tblnext "LAYER"))
 )
 (princ)
) 

 

Merci par avance de votre aide.

John.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Plusieurs choses.

 

Tout d'abord, il semble que tu n'aies pas bien compris la syntaxe avec la fonction if :

(if condition si_oui [si_non])

Le premier argument argument est l'expression conditionnelle, le second l'expression (une seule) si la condition est remplie et le troisième l'expression (une seule, optionnelle) si la condition n'est pas remplie.

Ce que tu as écrit :

condition : le nom du calsue commence par "ORG_"

si_oui : sélection de tous les objets sur le calque

si_non : changer la couleur des objets contenus dans le jeu de sélection.

 

Pour regrouper plusieurs expressions en une seule, il faut utiliser la fonction progn.

 

Ensuite, je ne comprends pas bien ce que tu veux faire.

 

Si tu veux forcer la couleur d'entités sur certains calques, tu n'as pas besoin de parcourir la table des calques. les filtres de sélection acceptent les caractères génériques :

 

(if (setq ss (ssget "_X" '((8 . "ORG_*"))))
 (command "_chprop" ss "" "_color" 8 "")
)

 

Si tu veux modifier la couleur des calques, dans ta boucle dans la table des calques, il faut utiliser la fonction entmod. Mais cette fonction ne marche pas sur la liste retournée par tblnext qui est incomplète. Il faut modifier la liste DXF complète du calque acquise avec entget :

 

(if (wcmatch name "ORG_*")
 (progn
   (setq ename (tblobjname "LAYER" name)) ; ENAME du calque
   (setq elst (entget ename))		; liste DXF complète
   ;; modifier la liste
   (setq elst
   (subst			; substituer
     '(62 . 8)			; la couleur 8
     (assoc 62 elst)		; à la couleur d'origine
     elst			; dans la liste DXF
   )
   )
   (entmod elst)			; modifier le calque
 )
)

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

Lien vers le commentaire
Partager sur d’autres sites

Merci Gile pour ta réponse.

Non en fait je voulais forcé la couleur des entités des calques qui ont pour préfixe ORG.

 

Mais la seconde fonction me sera utile aussi pour une autre application.

Je ne savais pas qu'on pouvait combiner plusieurs requêtes à la fois dans la fonction if.

 

J'apprend petit à petit.

Merci encore pour ton aide.

John.

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é