CadFrank Posté(e) le 28 septembre 2012 Posté(e) le 28 septembre 2012 Bonjour, J'ai encore besoin d'un peu d'aide avec un petite routine que je fais. La voici : ;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦; ;¦¦¦ CE PROGRAM EST CONÇU POUR FAIRE ¦¦¦; ;¦¦¦ LA COUPE DE BOIS ¦¦¦; ;¦¦¦ _______________________________________________________________________ ¦¦¦; ;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦; ;¦¦¦ AUTEUR : CadFrank, Copyright ® 2012 ¦¦¦; ;¦¦¦ _______________________________________________________________________ ¦¦¦; ;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦; ;¦¦¦ Ce sous-program défini les calques ¦¦¦; ;¦¦¦ _______________________________________________________________________ ¦¦¦; (defun NouveauCalque () (if (not (tblsearch "LAYER" "-LU BOIS")) (Command "_layer" "_n" "-LU BOIS" "_C" "41" "-LU BOIS" "" "") ) ); fin NouveauCalque ;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦; ;¦¦¦ Ce sous-program défini les dimensions ¦¦¦; ;¦¦¦ _______________________________________________________________________ ¦¦¦; (defun parametre () (setq dist1 20) (setq dist2 38) (setq dist3 64) (setq dist4 90) (setq dist6 140) (setq dist8 190) (setq dist10 241) ); fin parametre ;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦; ;¦¦¦ Ce sous-program défini les questions ¦¦¦; ;¦¦¦ _______________________________________________________________________ ¦¦¦; (defun question ( / val d1 d2) (initget 1 "2x3 2x4 2x6 2x8 2x10 4x4 4x6") (setq val (getkword "\n choisir la dimension du bois [2x3/2x4/2x6/2x8/2x10/4x4/4x6] ")) (if (= val "2x3") (list(setq di1 dist3) (setq di2 dist2))) (if (= val "2x4") (list(setq di1 dist4) (setq di2 dist2))) (if (= val "2x6") (list(setq di1 dist6) (setq di2 dist2))) (if (= val "2x8") (list(setq di1 dist8) (setq di2 dist2))) (if (= val "2x10") (list(setq di1 dist10) (setq di2 dist2))) (if (= val "4x4") (list(setq di1 dist4) (setq di2 dist4))) (if (= val "4x6") (list(setq di1 dist6) (setq di2 dist4))) (setq pt-i (getpoint "\n Déterminer le point d'insertion. ")) (setq p2 (list (+(car pt-i) di1) (+(cadr pt-i) di2))) (setq p3 (list (car pt-i) (+(cadr pt-i) di2))) (setq p4 (list (+(car pt-i) di1) (cadr pt-i))) ); fin question ;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦; ;¦¦¦ Ce sous-program défini les questions ¦¦¦; ;¦¦¦ _______________________________________________________________________ ¦¦¦; (defun Block (/ bent1 bent2 bent3) (setvar "clayer" "-LU BOIS") (command "_rectangle" pt-i "d" di1 di2 pt-i) (setq bent1 (entlast)) (command "_line" pt-i p2 "") (setq bent2 (entlast)) (command "_line" p3 p4 "") (setq bent3 (entlast)) (command "_block" val pt-i bent1 bent2 bent3 "") ; mon problem est ici !!! ); fin block ;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦; ;¦¦¦ PROGRAM PRINCIPAL ¦¦¦; ;¦¦¦ _______________________________________________________________________ ¦¦¦; (defun c:bois () (NouveauCalque) (Parametre) (Question) (Block) (princ) );fin bois le problem survien quand je refais le meme block. j'ai essayé avec tblsearch mais sa ne fonctionne pas Donc, y-aurait-il d'autre moyen pour y parvenir. Merci !
-Olivier- Posté(e) le 28 septembre 2012 Posté(e) le 28 septembre 2012 Bonjour CadFranck, Tu déclares les variables val, d1 et d2 dans ta sous-routine question. Celle-ci sont donc remis à nil avant leur utilisation.Déclares les dans la routine principale pour les supprimer à la fin. Attention tu as d'autres variables non-déclarées. Bonne soirée Olivier
CadFrank Posté(e) le 1 octobre 2012 Auteur Posté(e) le 1 octobre 2012 Merci Olivier pour ton information. Je vais modifier le tout. Par contre, pour le question principale aurait tu une idee de se que je devrais faire ? Bon Matin !
Patrick_35 Posté(e) le 1 octobre 2012 Posté(e) le 1 octobre 2012 Salut Si le bloc existe, Autocad pose la question si tu souhaites le redéfinir.A toi de faire la commande en conséquence. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
CadFrank Posté(e) le 1 octobre 2012 Auteur Posté(e) le 1 octobre 2012 Bonjour Patrick, mon problem n'est pas exactement cela. Je sais comment faire la commande pour redéfinir. Je me suis p-e mal exprimé. En prenant compte que la premiere fois qu'on utilise le program "routine" le block n'existe pas. La commande ci-haut fonctionne. Mais plutard dans le meme dessins si je veux le recréer avec ma routine on me demande de redéfénir. Voila ou sa bloque. Donc, j'ai essayer avec tblsearch et if sa ne marche pas ainsi j'ai essayé Not et Or. Pas plus ! Toujour un message d'erreur qui apparait hehe! Donc je cherche juste a savoir si j'aurais d'autre chemin a utilisé pour m'y rendre ! Voici voila mon problem ! Fin !
(gile) Posté(e) le 1 octobre 2012 Posté(e) le 1 octobre 2012 Salut (defun Block (/ bent1 bent2 bent3) (setvar "clayer" "-LU BOIS") (if (tblsearch "block" val) (command "_insert" val pt-i "" "" "") (progn (command "_rectangle" pt-i "d" di1 di2 pt-i) (setq bent1 (entlast)) (command "_line" pt-i p2 "") (setq bent2 (entlast)) (command "_line" p3 p4 "") (setq bent3 (entlast)) (command "_block" val pt-i bent1 bent2 bent3 "") ) ) ); fin block Par ailleurs, la manière dont tu as structuré ton code te fait utiliser de nombreuses variables globales pour passer des valeurs d'une fonction à une autre. Ce n'est pas une bonne pratique parce que cela peut générer des erreurs difficiles à localiser.Soit tu ne fais qu'une fonction dans laquelle tu pourras déclarer tes variables, soit tu utilise des valeurs de retours pour tes fonctions (sous forme de liste si plusieurs valeurs doivent être retournées) et/ou tu utilises des arguments. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
CadFrank Posté(e) le 1 octobre 2012 Auteur Posté(e) le 1 octobre 2012 Autrement dit faire le moin de sous program possible ?
(gile) Posté(e) le 1 octobre 2012 Posté(e) le 1 octobre 2012 Non, décomposer un programme en plusieurs sous-routines est une bonne pratique tant que cela ne nuit pas à la compréhension (surtout si le programme est long). Mais il faut, à mon avis que les sous routines utilisent des arguments et retournent des valeurs pour ne pas avoir de variables globales qui "trainent". Voilà un exemple de ce qu'on peut faire. J'ai supprimé la sous routine parametre qui ne faisait que définir inutilement des variable globales.J'ai conservé NouveauCalque qui ne requiert pas d'argument et ne retourne rien.J'ai incorporé (et modifié) question à la fonction principale.J'ai modifié block qui est appelé par la fonction principale si le bloc n'existe pas. Les données nécessaires à la création du bloc sont passées à la fonction sous forme d'arguments. ;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦; ;¦¦¦ CE PROGRAM EST CONÇU POUR FAIRE ¦¦¦; ;¦¦¦ LA COUPE DE BOIS ¦¦¦; ;¦¦¦ _______________________________________________________________________ ¦¦¦; ;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦; ;¦¦¦ AUTEUR : CadFrank, Copyright ® 2012 ¦¦¦; ;¦¦¦ _______________________________________________________________________ ¦¦¦; ;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦; ;¦¦¦ Ce sous-program défini les calques ¦¦¦; ;¦¦¦ _______________________________________________________________________ ¦¦¦; (defun NouveauCalque () (if (not (tblsearch "LAYER" "-LU BOIS")) (Command "_layer" "_n" "-LU BOIS" "_C" "41" "-LU BOIS" "" "") ) ); fin NouveauCalque ;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦; ;¦¦¦ Ce sous-program crée le bloc ¦¦¦; ;¦¦¦ _______________________________________________________________________ ¦¦¦; (defun Block (pt-i di1 di2 / p2 p3 p4 bent1 bent2 bent3) (setq p2 (list (+ (car pt-i) di1) (+ (cadr pt-i) di2))) (setq p3 (list (car pt-i) (+ (cadr pt-i) di2))) (setq p4 (list (+ (car pt-i) di1) (cadr pt-i))) (command "_rectangle" pt-i "_d" di1 di2 pt-i) (setq bent1 (entlast)) (command "_line" pt-i p2 "") (setq bent2 (entlast)) (command "_line" p3 p4 "") (setq bent3 (entlast)) (command "_block" val pt-i bent1 bent2 bent3 "") ); fin block ;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦; ;¦¦¦ PROGRAM PRINCIPAL ¦¦¦; ;¦¦¦ _______________________________________________________________________ ¦¦¦; (defun c:bois (/ val di1 di2 pt-i) (NouveauCalque) (initget 1 "2x3 2x4 2x6 2x8 2x10 4x4 4x6") (setq val (getkword "\n choisir la dimension du bois [2x3/2x4/2x6/2x8/2x10/4x4/4x6] ")) (cond ((= val "2x3") (setq di1 64 di2 38 ) ) ((= val "2x4") (setq di1 90 di2 38 ) ) ((= val "2x6") (setq di1 140 di2 38 ) ) ((= val "2x8") (setq di1 190 di2 38 ) ) ((= val "2x10") (setq di1 241 di2 38 ) ) ((= val "4x4") (setq di1 90 di2 90 ) ) ((= val "4x6") (setq di1 90 di2 140 ) ) ) (setq pt-i (getpoint "\n Déterminer le point d'insertion. ")) (setvar "clayer" "-LU BOIS") (if (not (tblsearch "BLOCK" val)) (block pt-i di1 di2) ) (command "_insert" val pt-i "" "" "") (princ) );fin bois Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
CadFrank Posté(e) le 1 octobre 2012 Auteur Posté(e) le 1 octobre 2012 Un gros MERCI Gile. Je vais tanté d'améliorer ma routine avec d'autre option. un jour va falloir que j'y rajoute un DCL hehe mais je dois pour le moment me concentrer sur le Lisp. Bon sur ce je vais analysé le tout et essayer de mieux comprendre. Par contre, tes explications sont clair. Merci encore.
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