Aller au contenu

Script en Lisp pour renommer un groupe de calques


Messages recommandés

Posté(e)

Bonjour,

 

Voici un script Lisp très utile qui permet de renommer un groupe de calques en une seule manipulation. Le script renomme les calques en se basant sur un fichier qui donne la conversion calque->nouveau nom. Très utile si on change de "standard" de nom.

 

;Renames layers according to RNL.TBL
;
;(^v^) CAD Studio, 1998
;updated 6-98: optional new colors
;
(defun C:RNL ( / cmde tbf tbl lin lis)
(setq cmde (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq tbf (findfile "RNL.TBL"))
(if tbf
 (progn
  (princ "Renaming from table RNL.TBL ...")
  (setq tbl (open tbf "r"))
  (while (setq lin (read-line tbl))
   (if (/= ";" (substr lin 1 1))
    (progn
     (setq lis (read (strcat "(" lin ")"))) ; (OLD NEW) or (OLD NEW NEWCOLOR)
     (if (tblsearch "LAYER" (car lis))
      (if (tblsearch "LAYER" (cadr lis))
       (princ (strcat "\nCannot rename " (car lis) " to " (cadr lis) " - already exists"))
       (progn
        (princ (strcat "\n" (car lis) "->" (cadr lis)))
        (command "_RENAME" "_LA" (car lis) (cadr lis))
        (if (caddr lis) (command "_LAYER" "_CO" (caddr lis) (cadr lis) ""))
       )
      );if
    );if
   ));if
  );while
  (princ "\nDone.")
 );else
 (prompt "Table RNL.TBL not found!")
);if
(setvar "CMDECHO" cmde)
(princ)
)

(princ "\nRNL - tabular layer renaming,  (^v^) CAD Studio, http://www.cadstudio.cz")
(princ) 

 

Voici le fichier contenant la table des conversions:

;List of renamed layers for RNL.LSP
;format: "ORIGINALNAME" "NEWNAME" "newcolor"
"calque1" "Construction"
"calque2" "pointillés" 

 

Je voulais savoir si un expert en AutoLisp pouvait modifier ce script pour pouvoir l'étendre au renommage automatique des: noms des blocks, types de ligne, etc. ?

 

J'ai essayé de le faire, en modifiant "_LAYERS" par "_STYLES", mais cela ne fontionne pas.

 

Cela permettrait de pouvoir économiser un temps considérable sur des manipulations aussi pénibles que nécessaires.

 

Salutations,

Posté(e)

Salut

 

Un lisp vite fait (pas tout testé)

 

RN.LSP

(defun c:rn(/ fic lec tbl sty typ val)

 (defun creer_liste(val / lec str)
   (while (not (eq val ""))
     (setq lec (append lec (list (setq str 
                 (if (vl-string-search " " val)
                   (substr val 1 (vl-string-search " " val))
                   val
                 )
               )))
           val (substr val (+ (strlen str) 2))
     )
   )
   lec
 )

 (defun verif (table type anc nouv / ok)
   (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list table anc)))
     (princ (strcat "\n" type " " anc " n'existe pas."))
     (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list table nouv)))
       (vla-put-name (vla-item table anc) nouv)
       (princ (strcat "\n" type " " nouv " est déjà existant."))
     )
   )
   ok
 )

 (vl-load-com)
 (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
 (if (setq fic (findfile "rn.tbl"))
   (progn
     (setq fic (open fic "r"))
     (while (setq val (read-line fic))
       (if (and (not (eq val ""))
                (not (eq (substr val 1 1) ";"))
                (member (read val) '(BLOC CALQUE FENETRE SCU COTE TABLEAU TEXTE LIGNE VUE GROUPE))
           )
         (setq tbl (append tbl (list (creer_liste val))))
       )
     )
     (close fic)
     (if tbl
       (foreach val tbl
         (setq lec (strcase (car val)) doc (vla-get-activedocument (vlax-get-acad-object)))
         (cond
           ((eq lec "BLOC")
             (verif (vla-get-blocks doc) "Le Bloc" (cadr val) (caddr val))
           )
           ((eq lec "CALQUE")
             (verif (vla-get-layers doc) "Le Calque" (cadr val) (caddr val))
           )
           ((eq lec "FENETRE")
             (verif (vla-get-viewports doc) "La Fenêtre" (cadr val) (caddr val))
           )
           ((eq lec "SCU")
             (verif (vla-get-usercoordinatesystems doc) "Le Scu" (cadr val) (caddr val))
           )
           ((eq lec "COTE")
             (verif (vla-get-dimstyles doc) "Le Style de Cotes" (cadr val) (caddr val))
           )
           ((eq lec "TABLEAU")
             (verif (vla-item (vla-get-dictionaries doc) "ACAD_TABLESTYLE") "Le Tableau" (cadr val) (caddr val))
           )
           ((eq lec "TEXTE")
             (verif (vla-get-textstyles doc) "Le Style de Textes" (cadr val) (caddr val))
           )
           ((eq lec "LIGNE")
             (verif (vla-get-linetypes doc) "Le Style de Lignes" (cadr val) (caddr val))
           )
           ((eq lec "VUE")
             (verif (vla-get-views doc) "La Vue" (cadr val) (caddr val))
           )
           ((eq lec "GROUPE")
             (verif (vla-get-groups doc) "Le Groupe" (cadr val) (caddr val))
           )
         )
       )
     )
   )
   (princ "\nLe fichier RN.TBL est introuvable")
 )
 (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
 (princ)
)

 

Exemple pour RN.TBL

; Tableau pour renommer les différents éléments d'autocad
; Syntaxe : Type, Nom actuel, Nouveau nom
; Types = Bloc, Calque, Fenetre, Scu, Cote, Tableau, Texte, Ligne, Vue, Groupe
; Exemple Calques calque1 Construction

Bloc Block1 RenBloc1
Bloc Block2 RenBloc2

Calque calque1 Construction1
Calque calque2 Construction2

Fenetre fenetre1 Renfenetre1
Fenetre fenetre2 Renfenetre2

Scu Scu1 Renscu1
Scu Scu2 Renscu2

Cote cote1 Rencote1
Cote cote2 Rencote2

Tableau tab1 Rebtab1
Tableau tab2 Rebtab2

Texte txt1 Rentxt1
Texte txt2 Rentxt2

Ligne Ln1 ligne1
Ligne Ln2 ligne2

Vue vue1 Renvue1
Vue vue2 Renvue2

Groupe grp1 Rengrp1
Groupe grp2 Rengrp2

 

ps : Tu peux les mettre tes lignes dans n'importe quel ordre

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

Posté(e)

Merci beaucoup Patrick, je vais regarder ça de plus près et comprendre comment tu as codé tout ça.

 

C'est dingue comment le Lisp peut soulager le quotidien. Je te tiens au courant, et encore mille fois merci! :D

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

Après tests, il y a des petits bugs qui trainent. Du genre tout n'est pas renommé. Et il ne faut pas renommer 2 fois, sinon il ne trouve plus le nom initial et renvoie une erreur.

 

En tout cas c'est déjà un très bon début, je vais voir si je peux le modifier.

  • 2 ans après...
Posté(e)

étant débutant dans les lisp, je plante sur un truc qui doit vraiment etre simple...

J'ai enregistré le lisp en .lsp et la table de conversion en .tbl

Seulement quand je lance le lisp, la commande m'affiche "Le fichier RN.TBL est introuvable"

Ou doit on enregistrer le fichier .tbl ?

 

n'ayant donc pas encore testé le lisp voila ce que j'en attend.

L'ensemble de mes calques posséde un préfixe XR$1$ (dans le cas présent) que j'aimerais supprimer en conservant le suffixe différent à chaque fois

 

exemple :

 

XR$1$BORDURES

XR$1$CLOTURE

XR$1$ELECTRICITE

XR$1$STANDARD

XR$1$CLOISONS

XR$1$ESCALIER

XR$1$MOBILIER

 

etc...

 

 

pour finalement obtenir ceci

 

BORDURES

CLOTURE

ELECTRICITE

STANDARD

CLOISONS

ESCALIER

MOBILIER

 

merci d'avance.

 

David

poser une question c'est prendre le risque de paraitre bete 5 minutes. ne pas en poser c'est prendre le risque de le rester toute sa vie.

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é