scake Posté(e) le 28 octobre 2008 Posté(e) le 28 octobre 2008 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 infiniLa 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 !
(gile) Posté(e) le 28 octobre 2008 Posté(e) le 28 octobre 2008 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
scake Posté(e) le 29 octobre 2008 Auteur Posté(e) le 29 octobre 2008 Merci pour ta réponse Giles.Cela fonctionne comme un charme. et tout ça à 1h du mat ...
scake Posté(e) le 29 octobre 2008 Auteur Posté(e) le 29 octobre 2008 Je pousse un peu plus loin ...Est-il possible de demander le préfixe à remplacer et ensuite le préfixe qui remplace celui-ci à l'utilisateur ?
(gile) Posté(e) le 29 octobre 2008 Posté(e) le 29 octobre 2008 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
scake Posté(e) le 29 octobre 2008 Auteur Posté(e) le 29 octobre 2008 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]
Patrick_35 Posté(e) le 29 octobre 2008 Posté(e) le 29 octobre 2008 Bonjour Je pense que tu devrais ajouter un astérisque à la fin du préfix lors de ta question. Regarde dans l'aide sur wcmatch, les Wild-cards. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 29 octobre 2008 Posté(e) le 29 octobre 2008 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
scake Posté(e) le 30 octobre 2008 Auteur Posté(e) le 30 octobre 2008 Merci beaucoup à tous les deux.J'expérimente tout cela dès ce soir !
chris_mtp Posté(e) le 20 juin 2009 Posté(e) le 20 juin 2009 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.
(gile) Posté(e) le 20 juin 2009 Posté(e) le 20 juin 2009 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 calquesi_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
chris_mtp Posté(e) le 20 juin 2009 Posté(e) le 20 juin 2009 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.
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant