GJulien Posté(e) le 26 mars 2015 Posté(e) le 26 mars 2015 Bonjour à tous, Je suis un grand débutant en ce qui concerne les LISP, j'ai suivi le PDF de (gile) à cette adresse [ http://gilecad.azurewebsites.net/Tutorials/Introduction_a_AutoLISP.pdf ]pour commencer mais je suis arrivé sur un problème que je ne vois pas comment résoudre. Voici le code que j'ai fait (il redéfinit 3 variables dans mon dessin, propose de réconcilier les calques, purger le dessin et sauvegarder)Quand il y a des éléments à réconcilier et à purger, je n'ai aucun souci mais par contre si l'utilisateur rentre "Y" alors qu'il n'y a rien, le LISP m'indique une erreur. Pouvez-vous m'aider ? (Si vous avez sous la main d'autre tutoriels, je suis également preneur. Actuellement je suis en train de lire http://www.ai.univ-paris8.fr/~hw/lisp/letout.pdf ) Merci d'avance,GJulien (defun c:cscc () (command "_MSLTSCALE" 0) (command "_PSLTSCALE" 0) (command "_LTSCALE" 1) (initget 1 "Yes No") (setq LaRec (getkword "Voulez-vous réconcilier les calques ? [Yes/No] : ")) (if (= "Yes" LaRec) (progn (command "-LAYER" "RECONCILE" "*") (princ "\nCalques réconciliés") ) (princ "\nCalques non-réconciliés") ) (initget 1 "Yes No") (setq Purge (getkword "\nVoulez-vous purger votre dessin ? [Yes/No] : ")) (if (= "Yes" Purge) (progn (command "-PURGE" "A" "*") (princ "\nDessin purgé") ) (princ "\nDessin non-purgé") ) (initget 1 "Yes No") (setq Save (getkword "\nVoulez-vous sauvegarder ? [Yes/No] : ")) (if (= "Yes" Save) (progn (command "_QSAVE") ) ) (alert (princ "Configuration modifiée, dessin purgé, réconcilié et sauvegardé !") ) ) EDIT : J'ai oublié de préciser que je travaille sur AutoCAD Architecture 2013.
GJulien Posté(e) le 27 mars 2015 Auteur Posté(e) le 27 mars 2015 Bonjour à tous, J'ai un peu modifié le code (légèrement). En fait le souci venait apparement du fait qu'après la commande -LAYER, il restait dans les choix d'option quand il n'y avait rien à réconcilier. J'ai rajouté le (Command) qui correspond à échap pour palier le problème. J'ai également rajouté le "N" à la fin du Purge car ça causait aussi un problème, la purge ne se faisait pas (il restait sur la vérification avant suppression). Voila, désolé d'avoir posé une question pour pas grand chose, mais si ce bout de code peut aider quelqu'un éventuellement je dis tant mieux :)(Tout n'est peut-être pas correct donc si certains on l'envie et/ou la patience de l'améliorer, je n'y vois aucun inconvénient). Cordialement,GJulien (defun c:cscc () (command "_MSLTSCALE" 0) (command "_PSLTSCALE" 0) (command "_LTSCALE" 1) (initget 1 "Yes No") (setq LaRec (getkword "Voulez-vous réconcilier les calques ? [Yes/No] : ")) (if (= "Yes" LaRec) (progn (command "-LAYER" "RECONCILE" "*") (command) (princ "\nCalques réconciliés") ) (princ "\nCalques non-réconciliés") ) (initget 1 "Yes No") (setq Purge (getkword "\nVoulez-vous purger votre dessin ? [Yes/No] : ")) (if (= "Yes" Purge) (progn (command "-PURGE" "A" "*" "N") (command) (princ "\nDessin purgé") ) (princ "\nDessin non-purgé") ) (initget 1 "Yes No") (setq Save (getkword "\nVoulez-vous sauvegarder ? [Yes/No] : ")) (if (= "Yes" Save) (command "_QSAVE") ) (alert (princ "Configuration modifiée, dessin purgé, réconcilié et sauvegardé !") ) ) EDIT : Réflexion et test faits, il ne fonctionne pas encore comme il devrait, désolé :(
Patrick_35 Posté(e) le 27 mars 2015 Posté(e) le 27 mars 2015 J'ai un peu modifié le code (légèrement). En fait le souci venait apparement du fait qu'après la commande -LAYER, il restait dans les choix d'option quand il n'y avait rien à réconcilier. J'ai rajouté le (Command) qui correspond à échap pour palier le problème.Salut En général, on met un "" pour terminer une commande quand c'est nécessaire. @+ 1 Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
VDH-Bruno Posté(e) le 27 mars 2015 Posté(e) le 27 mars 2015 Bonjour et bienvenu Gjulien Si tu me permet deux ou trois petites remarques pour tes débuts:- Je te conseil d'internationaliser tes commandes et options de commandes, surtout que tu travailles avec une version anglaise.- Pense à localiser tes variables après ton defun ex: (defun c:cscc (/ LaRec Purge Save)-Pour paramétrer tes variables AutoCAD tu peux passer par la fonction lisp setvar Si tu veux t'amuser à comparer, voici comment j'aurais écrit ce code: (defun c:cscc (/ question) (setvar "MSLTSCALE" 0) (setvar "PSLTSCALE" 0) (setvar "LTSCALE" 1) (defun question (msg rep) (initget "Oui Non") (getkword (strcat msg " [Oui/Non] <" rep ">: "))) (alert (strcat "Configuration modifiée: " (if (= "Oui" (question "Voulez-vous rapprocher les calques ?" "Oui")) (progn (command "_-LAYER" "_RECONCILE" "*" "") "\n -> Calques rapprochés") "\n -> Calques non rapprochés" ) (if (= "Oui" (question "Voulez-vous purger votre dessin ?" "Oui")) (progn (command "_-PURGE" "_A" "*" "_N") "\n -> Dessin purgé") "\n -> Dessin non purgé" ) (if (= "Oui" (question "Voulez-vous sauvegarder votre dessin ?" "Oui")) (progn (command "_QSAVE") "\n -> Dessin sauvegardé") "\n -> Dessin non sauvegardé" ) ) ) ) A+(Ps: code non testé car il n'y a pas l'option rapproché sur ma version 2007 d'AutoCAD) 1 Apprendre => Prendre => Rendre
GJulien Posté(e) le 28 mars 2015 Auteur Posté(e) le 28 mars 2015 Bonjour, Tout d'abord merci pour vos réponses ;) @Patrick_35 : Merci pour le conseil, il est vrai qu'avec le "RECONCILE" des calques, la commande restait toujours active à la fin c'est pour ça que j'ai rajouté le "(command)", et donc tu me conseillerais de terminer la commande comme ceci ? (command "-LAYER" "RECONCILE" "*" "") par exemple et d'enlever le (command) ? @VDH-Bruno : Merci également de me montrer la différence des deux :) Actuellement je suis en train de décortiquer ton code afin de mieux le comprendre, je ferais un essai dès lundi pour voir si effectivement il fonctionne.Je ne sais pas si tu as revu les commandes pour faire ce code-ci ou si tu t'es basé sur celui que j'avais écrit mais après quelques essais supplémentaires, quand l'utilisateur rentre "Yes" pour le rapprochement des calques alors qu'il n'y en a pas, le LISP saute tout le reste du programme et le termine donc (je sais pas si j'arrive à bien me faire comprendre).nb : Je parle bien sur du code que j'ai écrit, pas le tien. Je suis toujours en recherche pour essayer de comprendre pourquoi ça ne va pas, mais lundi en essayant le tien et que ça fonctionne, je te remercie déjà :) Une excellente soirée à tous. Cordialement, GJulien
GJulien Posté(e) le 30 mars 2015 Auteur Posté(e) le 30 mars 2015 Bonjour et bienvenu Gjulien Si tu me permet deux ou trois petites remarques pour tes débuts:- Je te conseil d'internationaliser tes commandes et options de commandes, surtout que tu travailles avec une version anglaise.- Pense à localiser tes variables après ton defun ex: (defun c:cscc (/ LaRec Purge Save)-Pour paramétrer tes variables AutoCAD tu peux passer par la fonction lisp setvar Si tu veux t'amuser à comparer, voici comment j'aurais écrit ce code: (defun c:cscc (/ question) (setvar "MSLTSCALE" 0) (setvar "PSLTSCALE" 0) (setvar "LTSCALE" 1) (defun question (msg rep) (initget "Oui Non") (getkword (strcat msg " [Oui/Non] <" rep ">: "))) (alert (strcat "Configuration modifiée: " (if (= "Oui" (question "Voulez-vous rapprocher les calques ?" "Oui")) (progn (command "_-LAYER" "_RECONCILE" "*" "") "\n -> Calques rapprochés") "\n -> Calques non rapprochés" ) (if (= "Oui" (question "Voulez-vous purger votre dessin ?" "Oui")) (progn (command "_-PURGE" "_A" "*" "_N") "\n -> Dessin purgé") "\n -> Dessin non purgé" ) (if (= "Oui" (question "Voulez-vous sauvegarder votre dessin ?" "Oui")) (progn (command "_QSAVE") "\n -> Dessin sauvegardé") "\n -> Dessin non sauvegardé" ) ) ) ) A+(Ps: code non testé car il n'y a pas l'option rapproché sur ma version 2007 d'AutoCAD) Bonjour, Je viens d'essayer ton LISP, le problème est pareil que le mien. C'est à dire qu'à partir du moment ou il n'y a pas de calques à rapprocher et que l'utilisateur entre "Oui", la procédure s'arrête en ignorant les autres étapes. De plus, j'ai pu voir que tu avais entré le "Oui" par défaut sur les commandes, mais étrangement ça ne fonctionne pas, il faut tout de même l'écrire. Cordialement,GJulien EDIT : j'ai encore fait des essais, apparement sur un dessin que je viens d'ouvrir ou il n'y a pas de calques à rapprocher et que l'utilisateur rentre "Oui", il n'y a pas de soucis. Par contre si je fait 2 fois le rapprochement des calques sur le même dessin, le LISP saute. Actuellement ça me convient donc mais serait-il possible de savoir pourquoi ? Sinon je vous remercie pour vos réponses ;)
(gile) Posté(e) le 30 mars 2015 Posté(e) le 30 mars 2015 Salut, Pour le mot clé avec valeur par défaut, essaye comme ça : (defun question (msg rep) (initget "Oui Non") (cond ((getkword (strcat msg " [Oui/Non] <" rep ">: "))) (rep) ) ) Pour l'histoire des calques rapprochés (ou pas), ça risque d'être beaucoup plus complexe...D'ailleurs, je ne vois pas l'intérêt de "rapprocher" les calques systématiquement, s'il s'agit juste d'empécher la notification, regarde les variables système LAYEREVALCTL, LAYEREVAL et LAYERNOTIFY. 1 Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
GJulien Posté(e) le 30 mars 2015 Auteur Posté(e) le 30 mars 2015 Bonjour Gile, Merci pour le mot clé, ça fonctionne parfaitement. Pour le changement des variables systèmes, j'étais un peu sceptique (je pensais que ça ne ferait que disparaitre la notification comme quoi il y avait des calques non rapprochés) mais effectivement ça disparait également dans le gestionnaire des calques donc c'est magnifique. Merci à tous pour votre aide.
VDH-Bruno Posté(e) le 30 mars 2015 Posté(e) le 30 mars 2015 Re, De plus, j'ai pu voir que tu avais entré le "Oui" par défaut sur les commandes, mais étrangement ça ne fonctionne pas, il faut tout de même l'écrire.Oui et (gile) t'as donné la correction pour s'affranchir du réglage de la variable SHORTCUTMENU, si paramétré par exemple à 11 (sa valeur initial), tu as le "focus" sur la valeur par défaut dans ton menu contextuel (renseigné avec tes valeurs entre crochet), donc si tu valide ce choix, c'est ce dernier qui t'est retourné… Voilà pour le complément. Pour ce qui est de mon exemple, je voulais montrer que pour un usage unique il n'est pas nécessaire d'introduire des variables dans le code (je sais que l'emploi de variable cela aide au début). En prime avec la correction apporté sur la fonction question, tu as une illustration de l'intérêt d'écrire des fonctions spécialisés car il est plus agréable de faire la correction sur une ligne qui se répercutera dans tout le code, que de répéter la modification plusieurs fois dans le programme. A+ Apprendre => Prendre => Rendre
GJulien Posté(e) le 30 mars 2015 Auteur Posté(e) le 30 mars 2015 Re-bonjour, En effet, je confirme que le code que tu as écrit a l'air tout de même plus simple et compréhensible. Au moins c'est vrai qu'en cas de modification, il ne faut pas répercuter le changement partout mais juste une fois (tout dépend de quelle modification, j'en suis conscient). Je pense qu'il me reste pas mal de travail à accomplir pour en saisir toutes les ficelles mais déjà avec ça je pense que je vais pouvoir approfondir un peu plus, je commence à bien mieux cerner les différentes parties (avec cet avantage d'avoir le même code de deux manière différentes, ça aide à la compréhension). Merci pour tes renseignements VDH-Bruno. Cordialement, GJulien
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