lovecraft Posté(e) le 23 novembre 2008 Posté(e) le 23 novembre 2008 bonjour, Voila j'essaie de faire un lisp pour incrementer un calque cf ci-dessous : (defun c:inclayer (/ nom_calque compteur) (setq nom_calque (getvar "Clayer"));récupere le calque courant (setq compteur 1) (if (= tblsearch "LAYER" (strcat nom_calque (itoa compteur))nil) (command "_-layer" "N" (strcat nom_calque (itoa compteur)) "") ((setq compteur (1+ compteur)) (command "_-layer" "N" (strcat nom_calque (itoa compteur)) "") ) );fin du if );fin du defun Mais il me manque quelques notion en lisp (voir beaucoup)Le but c'est d'incrementer le calque courant ex: calque courant toto =>toto1et que si toto1 existe => toto2.....etc il faudrait aussi que le lisp gere : calque courant toto2 que ca me creé toto3. Voila j'espere que j'ai été clair. @plus LB http://www.youtube.com/user/CADMINATOR?feature=mhee
(gile) Posté(e) le 23 novembre 2008 Posté(e) le 23 novembre 2008 Salut lovecraft, C'est bien ce qu'il m'avait semblé comprendre sur "TheSwamp".Je te propose une fonction plus "générique" qui retourne le premier nom incrémenté qui n'existe pas dans la table. (IncrName (getvar "clayer") "LAYER" 1) retournera "toto1" ou "toto2" etc... ;;; IncrName (gile) ;;; Retourne le premier nom incrémenté qui n'existe pas dans la table ;;; ;;; Arguments ;;; pref : le préfixe du nom (string) ;;; table : une table ("LAYER", "LTYPE", "VIEW", "STYLE", "BLOCK", "UCS", "APPID", "DIMSTYLE", "VPORT) ;;; start : l'incrément de départ (entier) (defun IncrName (pref table start / name) (while (tblsearch table (setq name (strcat pref (itoa start))) ) (setq start (1+ start)) ) name ) La même sous forme récursive : (defun IncrName (pref table start) (if (tblsearch table (strcat pref (itoa start))) (IncrName pref table (1+ start)) (strcat pref (itoa start)) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lovecraft Posté(e) le 23 novembre 2008 Auteur Posté(e) le 23 novembre 2008 merci Gile, Ca marche parfaitement, mais est il possible de la faire sous forme de commande et d'inclure la possibilité suivante. Si le calque toto2 est courant qu'il créé toto3 =>non toto21 comme actuellement. Merci pour la recursive ;) @plus LB http://www.youtube.com/user/CADMINATOR?feature=mhee
(gile) Posté(e) le 23 novembre 2008 Posté(e) le 23 novembre 2008 Si le calque toto2 est courant qu'il créé toto3 =>non toto21 comme actuellement. Dans ce cas, il faut d'abord récupérer le préfixe et le suffixe ("toto" et"2"), convertir "2" en 2, puis utiliser la méthode donnée plus haut (defun c:inclayer (/ pref suff ind) (setq pref (getvar "CLAYER") ind "" ) (while (numberp (read (setq suff (substr pref (strlen pref))))) (setq ind (strcat suff ind) pref (substr pref 1 (1- (strlen pref))) ) ) (setq ind (1+ (atoi ind))) (while (tblsearch "LAYER" (setq name (strcat pref (itoa ind))) ) (setq ind (1+ ind)) ) (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 name) '(70 . 0) ) ) (princ (strcat "\nLe calque \"" name "\" a été créé.")) (princ) ) Merci pour la recursive Cette routine n'apporte rien de plus par rapport à forme itérative (while ...), mais je pense que la compréhension de la récursivité est une étape importante dans l'apprentissage de la programmation (algorithmie). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 23 novembre 2008 Posté(e) le 23 novembre 2008 Re, Après quelques tests je me suis aperçu que la commande ci dessus retourne une erreur si le nom du calque courant ne comporte que des caractères numériques (exemple le calque "0"). Je te propose une autre solution avec la routine incsuff (moins simple à comprendre mais intéressante à décortiquer). (defun c:inclayer (/ name) (setq name (getvar "CLAYER")) (or (numberp (read (substr name (strlen name)))) (setq name (strcat name "1")) ) (while (tblsearch "LAYER" name) (setq name (incsuff name 1 1)) ) (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 name) '(70 . 0) ) ) (princ (strcat "\nLe calque \"" name "\" a été créé.")) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lovecraft Posté(e) le 23 novembre 2008 Auteur Posté(e) le 23 novembre 2008 Ah que dire ....Merci Gile C'est exactement ce que je recherchais, maintenant va falloir que je decortique les différentes routine. @plus LB http://www.youtube.com/user/CADMINATOR?feature=mhee
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