Aller au contenu

changer le nom d\'une couche


Messages recommandés

Posté(e)

Bonjour à tous,

 

je cherche à automatiser le renommage de noms de couches ; le but étant, à la fin, de pouvoir ajouter un préfixe à chaque nom de couche (dans un fichier qui en compte 150). Bref, c'est pas pour aujourd'hui...

 

à partir d'un message posté ici, j'ai trouvé le bout de code suivant posté par (gile) (encore lui :)):

 

(defun C:LAYCHANGE ()

 

(setq lay (tblnext "LAYER" T))

(while lay

(if (member (cdr (assoc 62 lay)) '(2 50 51))

(command "_.-layer" "_color" 7 (cdr (assoc 2 lay)) "" "")

)

(setq lay (tblnext "LAYER"))

)

)

 

ce code permet de changer la couleur (en 7) d'une couche si elle est de couleur 2 ou 50 ou 51. la boucle permet de le faire sur tout le fichier.

 

Partant de là, je veux changer le nom de la couche FGT (qui existe dans mon dessin) en Toto :

 

(defun C:LAYCHANGE ()

(setq lay (tblnext "LAYER" T))

(while lay

(if (member (cdr (assoc 2 lay)) '(FGT))

(command "_.-layer" "_name" "Toto" (cdr (assoc 2 lay)) "" "")

)

(setq lay (tblnext "LAYER"))

)

 

oh surprise! ca ne marche pas. pourquoi donc?

à quoi sert le dernier (cdr (assoc 2 lay))??

 

Merci

Posté(e)

et avec

 

(command "_rename" "_layer" "FGT" "TOTO")

 

Amicalement

 

Zebulon_

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Salut,

 

Ton code ne marche pas parce qu'il n'y a pas d'option "_name" dans la commande "_layer".

 

Il faut utiliser la commande RENOMMER (_rename) :

 

(command "_.rename" "_layer" "FGT" "Toto")

 

Mais je ne comprends pas bien ce que tu veux faire.

Veux-tu changer les noms ou ajouter un suffixe ?

De tous les calques ou seulement de quelques uns ?

 

Suivant le cas il n'est peut-être pas necessaire de parcourir toute la table, parcourir la liste des noms à changer peut suffire.

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

Posté(e)

Merci à toi.

effectivement, je suis tombé sur cette commande dans l'aide

 

si je fais (hors d'une boucle):

 

(command "_rename" "_layer" "FGT" "Toto23" "")

 

ca marche impeccable

 

par contre si je le mets dans une boucle :

 

(defun C:LAYCHANGE ()

(setq lay (tblnext "LAYER" T))

(while lay

(if (member (cdr (assoc 2 lay)) '(FGT))

(command "_rename" "_layer" "FGT" "Toto23" "")

)

(setq lay (tblnext "LAYER"))

)

)

 

ca marche pas... je dois avoir un problème au niveau de :

(if (member (cdr (assoc 2 lay)) '(FGT))

Posté(e)
Salut,

 

Mais je ne comprends pas bien ce que tu veux faire.

Veux-tu changer les noms ou ajouter un suffixe ?

De tous les calques ou seulement de quelques uns ?

 

Suivant le cas il n'est peut-être pas necessaire de parcourir toute la table, parcourir la liste des noms à changer peut suffire.

 

le but à terme : parcourir toute la table des noms de couche et ajouter un préfixe à chaque nom.

Je pensais qu'au départ, fallait d'abord apprendre à changer le nom d'une couche car changer le nom d'une couche n'est pas très éloignée de rajouter un préfixe à une couche non?? ensuite, une fois qu'on sait comment changer le nom d'une couche, il reste plus qu'à ajouter un préfixe au lieu de modifier...

je n'ai surement pas la bonne logique, mais c'est comme ca que je le voyais...

Posté(e)

Re,

 

faut-il absolument faire un lisp ?

 

La commande renommer peut faire l'affaire en utilisant le joker *

 

Renommer

Calque

Ancien nom : *

Nouveau nom : prefixe*

 

Amicalement

 

Zebulon_

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Salut,

 

(setq lay (tblnext "LAYER" T)) te donne la valeur du prmier calque sous la forme

((0 . "LAYER") (2 . "Nom du Calque") (70 . 0) (62 . 7) (6 . "Continuous"))

 

Donc, dans la boucle :

 

(if (member (cdr (assoc 2 lay)) '(FGT)) - ("FGT" serait juste)

= Si "FGT" fait partis du nom du calque (en partie ou en entier)

 

- Alors tu renommes le calque

(command "_rename" "_layer" "FGT" "Toto23" "")

 

- Sinon tu passe au calque suivant

(setq lay (tblnext "LAYER"))

 

... tant qu'il y a un calque.... (while lay ...... (setq lay (tblnext "LAYER"))

(quand lay = nil, c'est fini)

 

Donc tu comprendras que ceci ne te rajoute pas un préfixe....

Pour cela il faut que tu utilise la fonction (strcat "Préfixe" "Nom ancien Calque")

 

Je te laisse un peu chercher....

 

j'édite : Zebulon à trouver la solution ultime, qui plus est peut s'intégrer dans un lisp aussi....

 

 

 

[Edité le 19/12/2006 par Bred]

 

[Edité le 21/12/2006 par Bred]

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

Posté(e)

Si tu veux bien, je vais juste te donner des pistes et te laisser chercher, c'est comme ça qu'on apprend. si tu préfères je te donnes un code, mais c'est dommage.

 

Dans la boucle, tu récupères le nom de chaque calque et tu lui y ajoutes un suffixe avec la commande _.rename (comme dit plus haut). Pour le suffixe, regarde la fonction LISP strcat.

 

 

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

Posté(e)

Salut

Un exemple

 

(defun C:LAYCHANGE ()
 (setq lay (tblnext "LAYER" T))
 (while lay
   (if (not (eq (cdr (assoc 2 lay)) "0"))
     (command "_rename" "_lay" (cdr (assoc 2 lay)) (strcat (cdr (assoc 2 lay)) " - Préfixe"))
   )
   (setq lay (tblnext "LAYER"))
 )
)

 

ps : Je viens de voir vos message, mais je laisse quand même une partie de la solution ;)

 

@+

 

[Edité le 19/12/2006 par Patrick_35]

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

  • 3 semaines après...
Posté(e)

(bonne année à tous!)

 

effectivement, la solution de zebulon est efficace et évite toute programmation dés lors que l'on veut ajouter un préfixe (ou suffixe) à un nom de couche ;

néanmoins, toujours dans le but de m'améliorer, j'ai un lisp pour renommer des couches qui se présente de la manière suivante :

 

; 3 possibilités dans le renommage (3 sous-parties)

; si je veux changer tous les noms, 1è sous-partie

; si je veux changer le nom au cas par cas, 2è sous-partie

; si je veux ajouter un préfixe, 3è sous-partie

 

(defun c:layc (/ x y lay1 lay2 lay3 calque)

(prompt "Bonjour, choisissez ce que vous voulez faire :")

(initget 1 "1 2 3")

(setq x (getkword "\n Renommage total (1) ou Renommage couche par couche (2) ou Ajouter un préfixe (3) ? (1 ou 2 ou 3) "))

 

; 1ère sous-partie

; change le nom des couches

; tout se fait automatiquement, pas de pause, pas d'entrée clavier, pas de choix dans le renommage,

; un remplacement basic

(if (= x "1") (princ "Bienvenue dans le programme qui permet de renommer en 1 coup le nom des couches ")

(setq lay1 (tblnext "LAYER" T))

(while lay1

(if (member (cdr (assoc 2 lay1)) '("FGT"))

(command "_rename" "_layer" "FGT" "Relief") "")

(if (member (cdr (assoc 2 lay1)) '("FA1"))

(command "_rename" "_layer" "FA1" "Batiments") "")

; j'ai sucré le reste des lignes concernant les autres couches, car y'en a 50

 

(setq lay1 (tblnext "LAYER"))

)

(princ "\n Traitement n°1 terminé. Ne pas tenir compte du message d'erreur qui va suivre ")

(princ)

(exit)

 

; 2è sous-partie

; change le nom des couches

; parcourt 1 à 1 la liste des couches

; affiche le nom de la couche

; demande si on veut changer son nom

; demande le nom de remplacement

; => un remplacement plus "évolué" avec intervention de l'utilisateur à chaque nom de couche

 

(if (= x "2") (princ "Bienvenue dans le programme qui permet de renommer 1 à 1 le nom des couches "))

(setq lay2 (tblnext "LAYER" T)) ;parcourir le tableau

(while lay2 ; tant que y'a une couche

(setq calque (cdr (assoc 2 lay2))) ; on affecte à "calque" le nom de la couche

(princ "\n Le nom de la couche est ")

(princ calque)

(princ "\n ")

(initget 1 "Oui Non")

(setq y (getkword "\n Voulez-vous renommer cette couche? (Oui ou Non) "))

(if (= y "Oui")

(command "_rename" "_layer" calque (getstring "\n Entrez le nouveau nom pour la couche ")

)

)

(setq lay2 (tblnext "LAYER")) ; passe à la couche suivante

)

(princ "\n Traitement n°2 terminé. Ne pas tenir compte du message d'erreur qui va suivre ")

(princ)

(exit)

 

; 3è sous-partie

; change le nom des couches en rajoutant un préfixe à toutes les couches

; => un rajout de préfix basic devant chaque nom de couche

(if (= x "3") (princ "Bienvenue dans le programme qui permet de rajouter un préfixe à tous les noms de couches "))

(setq lay3 (tblnext "LAYER" T)) ;parcourir le tableau

(while lay3 ; tant que y'a une couche

(setq calque (cdr (assoc 2 lay3))) ; on affecte à "calque" le nom de la couche

(princ "\n Le nom de la couche est ")

(princ calque)

(princ "\n ")

;(initget 1 "Oui Non")

;(setq y (getkword "\n Voulez-vous renommer cette couche? (Oui ou Non) "))

;(if (= y "Oui")

(setq prefixe (getstring "\n Entrez le préfixe que vous voulez ajouter "))

(command "_rename" "_layer" calque (strcat "calque" "prefixe")) ; concaténation

)

(setq lay3 (tblnext "LAYER")) ; passe à la couche suivante

(princ "\n Traitement n°3 terminé. Ne pas tenir compte du message d'erreur qui va suivre ")

(princ)

(exit)

)

 

les trois sous-parties marchent séparement (c'est-à-dire dans trois fichiers différentes) mais pas lorsque je les mets ensemble, pour avoir le choix du traitement ; j'ai un soucis : quelque soit ma réponse à la question, je n'arrive pas à lui faire faire la 2è sous-partie, ni la 3è, seule la 1ère marche. J'ai un problème avec le choix dans la question posée au départ : il me faudrait un GOTO, mais j'ai cru comprendre que ca n'existait pas en Autolisp. J'ai trop d'arguments pour pouvoir imbriquer tout.

 

je ne sais plus trop comment faire : j'ai pensé à faire 3 sous-fonctions, et a imbriquer les fonctions de la manière suivante, après le choix au tout début :

(if (= x 1) sous_fonction1 (if (= x 2) sous_fonction2 (if (= x 3) sous_fonction3)))

mais je sais pas si ca marcherait.

 

il se pose le soucis aussi de la gestion des messages d'erreur, que je ne préfère pour l'instant pas trop aborder ;

 

je souhaite garder la 3è sous-partie, pour l'améliorer ensuite et travailler sur les chaînes de caractères pour par exemple si on rajoute un préfixe, se débrouiller pour que le nouveau ne contienne qu'une majuscule en début de nom (et pas 2 en conservant celle de l'ancien nom...), des trucs dans le genre... je vais chercher

 

en espérant avoir été clair

Merci de votre aide

Posté(e)

Salut

Tu as essayé le cond ?

 

Pour ma part, j'organiserai le lisp de cette manière

 

(defun c:....()

 (defun gestion_des_erreurs()
   En attente pour l'instant
 )

 (defun renommer_partie_1()
 ....
 )

 (defun renommer_partie_2()
 ....
 )

 (defun renommer_partie_3()
 ....
 )

 Routine principale
 je pose mes questions, fais les vérifications nécessaires et la variable x contient au final mon choix
 (cond
   ((eq x 1)
     (renommer_partie_1)
   )
   ((eq x 2)
     (renommer_partie_2)
   )
   ((eq x 3)
     (renommer_partie_3)
   )
   (T
     (princ "\nValeur X autre que 1 2 ou 3)
   )
 )
 (princ) ; silence
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

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é