sechanbask Posté(e) le 28 avril 2014 Posté(e) le 28 avril 2014 Bonjour, je fais un très grand nombre de nuages de révision et je tente de rendre mon boulot un peu moins long: J'ai mis au point ce lisp (defun c:CVB() ; affiche une boite mais pour l'instant c'est tout ;(setq Id(load_dialog "RVV.dcl")) ;(new_dialog "bienvenue" Id) ;(start_dialog) (setq courant_cvb (getvar "clayer")) (setq accroche_cvb (getvar "osmode")) (setq largeur_pline (getvar "PLINEWID")) (if (= 4 (getvar "INSUNITS")) (setvar "PLINEWID" "50")) (if (= 5 (getvar "INSUNITS")) (setvar "PLINEWID" "5")) (if (= 6 (getvar "INSUNITS")) (setvar "PLINEWID" "0.5")) (setvar "osmode" 0) ;(command "clayer" (vlax-ldata-get "calques" "calque_nuage_rev" )) (command-s "rectangle" pause pause) (setq der_cvb (entlast) js (ssadd)) (if (= 4 (getvar "INSUNITS")) (command-s "NUAGEREV" "longueur" "500" "500" "objet" der_cvb "non")) (if (= 5 (getvar "INSUNITS")) (command-s "NUAGEREV" "longueur" "50" "50" "objet" der_cvb "non")) (if (= 6 (getvar "INSUNITS")) (command-s "NUAGEREV" "longueur" "0.5" "0.5" "objet" der_cvb "non")) (setvar "osmode" accroche_cvb) (setvar "PLINEWID" largeur_pline) (command-s "clayer" courant_cvb ) ) depuis que j'ai rajouté ces trois lignes : (if (= 4 (getvar "INSUNITS")) (setvar "PLINEWID" "50")) (if (= 5 (getvar "INSUNITS")) (setvar "PLINEWID" "5")) (if (= 6 (getvar "INSUNITS")) (setvar "PLINEWID" "0.5")) ça ne marche pas : Commande: APPLOADcvb - Copie.lsp correctement chargé(s)Commande:Impossible d'appeler (command) à partir de *error* sans appeler préalablement (*push-error-using-command*).Il est recommandé de convertir les appels (command) en (command-s). Et je ne vois pas trop pour quelle raison... ATEGIE - Bureau d'Études Fluideshttp://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.pngExécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffragewww.ategie.fr
GEGEMATIC Posté(e) le 28 avril 2014 Posté(e) le 28 avril 2014 Salut,bizare ton message,mais commence par remplacer (setvar "PLINEWID" "50")par (setvar "PLINEWID" 50)plinewid est de type real, pas string ... pour le reste, tu dois être sous 2015, car ton message illustre celui de gile sur command-s ... Gérald ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
sechanbask Posté(e) le 28 avril 2014 Auteur Posté(e) le 28 avril 2014 Merci, je n'ai plus le message d'erreur : (defun c:CVB() ; affiche une boite mais pour l'instant c'est tout ;(setq Id(load_dialog "RVV.dcl")) ;(new_dialog "bienvenue" Id) ;(start_dialog) (setvar "DELOBJ" 3) (setq courant_cvb (getvar "clayer")) (setq accroche_cvb (getvar "osmode")) (setq largeur_pline (getvar "PLINEWID")) (if (= 4 (getvar "INSUNITS")) (setvar "PLINEWID" 50)) (if (= 5 (getvar "INSUNITS")) (setvar "PLINEWID" 5)) (if (= 6 (getvar "INSUNITS")) (setvar "PLINEWID" 0.5)) (setvar "osmode" 0) ;(command "clayer" (vlax-ldata-get "calques" "calque_nuage_rev" )) (command-s "rectangle" pause pause) (setq der_cvb (entlast) js (ssadd)) (if (= 4 (getvar "INSUNITS")) (command-s "NUAGEREV" "longueur" "500" "500" "objet" der_cvb "non")) (if (= 5 (getvar "INSUNITS")) (command-s "NUAGEREV" "longueur" "50" "50" "objet" der_cvb "non")) (if (= 6 (getvar "INSUNITS")) (command-s "NUAGEREV" "longueur" "0.5" "0.5" "objet" der_cvb "non")) (setvar "osmode" accroche_cvb) (setvar "PLINEWID" largeur_pline) (command-s "clayer" courant_cvb ) ) la variable PLINEWID est modifié mais ce n'est pas elle qui change la largeur du nuage de révision, là du coup, je ne sais pas comment faire. ATEGIE - Bureau d'Études Fluideshttp://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.pngExécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffragewww.ategie.fr
(gile) Posté(e) le 28 avril 2014 Posté(e) le 28 avril 2014 Salut, Ce message, bien que a priori incompréhensible, est effectivement dû à une mauvaise utilisation de command-s.command-s ne peut être appelé qu'avec des arguments pré-définis (pas de 'pause'). Voir ce sujet. Par ailleurs, je te recommande de prendre l'habitude de déclarer localement tes variables, d'utiliser les noms de commandes et d'options "globaux" (internationaux). Il est aussi préférable, dès qu'on modifie les valeurs de variables système d'inclure une gestion des erreurs qui garanti que les valeurs initiales des variables seront restaurées même en cas d'erreur (ne pas oublier que Echap est considéré en LISP comme une erreur). (defun c:CVB (/ *error* courant_cvb accroche_cvb largeur_pline der_cvb) ;; affiche une boite mais pour l'instant c'est tout ;;(setq Id(load_dialog "RVV.dcl")) ;;(new_dialog "bienvenue" Id) ;;(start_dialog) ;; redéfinition locale de la fonction *error* (defun *error* (msg) (if (and msg (/= msg "Fonction annulée")) (princ (strcat "\nErreur: " msg)) ) (setvar "osmode" accroche_cvb) (setvar "PLINEWID" largeur_pline) (setvar "clayer" courant_cvb) (princ) ) (setq courant_cvb (getvar "clayer")) (setq accroche_cvb (getvar "osmode")) (setq largeur_pline (getvar "PLINEWID")) (setvar "osmode" 0) (cond ((= 4 (getvar "INSUNITS")) (setvar "PLINEWID" 50) (command "_rectangle" pause pause) (command-s "_revcloud" "_length" 500 500 "_object" "_last" "_no") ) ((= 5 (getvar "INSUNITS")) (setvar "PLINEWID" 5) (command "_rectangle" pause pause) (command-s "_revcloud" "_length" 50 50 "_object" "_last" "_no") ) ((= 6 (getvar "INSUNITS")) (setvar "PLINEWID" 0.5) (command "_rectangle" pause pause) (command-s "_revcloud" "_length" 0.5 0.5 "_object" "_last" "_no") ) ) ;; appel de la fonction *error* locale pour restaurer les variables (*error* nil) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 28 avril 2014 Posté(e) le 28 avril 2014 Hello Gilles Si j'ai bien compris : 1) Les nouvelles routines Lisp/VLisp incluant la nouvelle fonction command-s impliquent un AutoCAD version 2012 MINIMUM !? 2) Lorsque une ancienne routine Lisp/VLisp parfaitement fonctionnelle (sur AutoCAD 2014/2013/etc) se casse la figure sur un appel a "command" ... on peut etre presque sur que en mettant "command-s", cela va fonctionner ? 3) Donc il va falloir avoir 2 versions des routines Lisp/VLisp : - Une pour AutoCAD 20xx-2011 (fonctionnant en principe aussi sur 2012/2013/2014) - Une pour AutoCAD 2015 (fonctionnant en principe aussi sur 2014/2013/2012) Merci d'avance de tes Infos ... Bye, lecrabe Autodesk Expert Elite Team
(gile) Posté(e) le 28 avril 2014 Posté(e) le 28 avril 2014 Salut, 1) Si j'ai bien compris, command-s qui existe depuis A2012 (quoique GEGEMATIC rapporte une erreur avec command-s et A2012), ne peut être vraiment efficient qu'avec A2015 et l'abandon de la fibre qui permet deux approche de l'exécution des commandes appelée par programmation ("sub-routine" avec command-s et "co-routine" avec command et vl-cmdf). 2) c'est à peu près ça, mais d'après les quelques test que j'ai fait, seuls les appels de command dans une fonction passée en argument à mapcar posent problème. D'après l'aide, il faudrait aussi modifier les appels de command dans redéfinitions locales de la fonction *error*. avant 2015 :(defun foo (/ *error*) (defun *error* (msg) (if (/= msg "Fonction annulée") (princ (strcat "Erreur: " msg)) ) (command "_undo" "_end") (princ) ) ;; ici le code de la fonction ) Avec 2015 (et ultérieurs probablement)(defun foo (/ *error*) (defun *error* (msg) (if (/= msg "Fonction annulée") (princ (strcat "Erreur: " msg)) ) (command-s "_undo" "_end") (princ) ) ;; ici le code de la fonction )ou, pour continuer à utiliser command(defun foo (/ *error*) (defun *error* (msg) (if (/= msg "Fonction annulée") (princ (strcat "Erreur: " msg)) ) (command-s "_undo" "_end") (princ) ) (*push-error-using-command*) ;; ici le code de la fonction (*pop-error-mode*) ) 3) La rupture de compatibilité n'est que pour 2015 sauf à utiliser command-s avec des versions précédentes (ce qui, si j'ai bien compris, est parfaitement inutile) et il n'y a de problème que dans les deux cas ci-dessus qui exigent l'utilisation de command-s (avec mapcar et *error*), dans tous les autres cas, command ou vl-cmdf fonctionnent toujours.Le problème de compatibilité, quand il existe, se règle facilement en LISP en testant la version majeur de l'AutoCAD en cours d'utilisation :(if (< 20 (atoi (getvar 'acadver))) (command-s ...) (command ...) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
sechanbask Posté(e) le 28 avril 2014 Auteur Posté(e) le 28 avril 2014 merci pour ces réponses et pour les explications sur mes erreurs. Il me reste encore à comprendre pourquoi mes nuages de révisions ne veulent pas devenir s'adapter à insunits : J'ouvre un plan avec insunits à 5 (cm) les longueur de l'arc du nuage font 50 : okpuis j'ouvre un plan avec insunites à 4 (mm) les longueur de l'arc du nuage font 50 et non pas 500 j'ai dû faire une erreur mais où ? j'ai finalement trouvé, l'option de la commande _revcloud n'est pas _lengh mais _arc le lisp corrigé : (defun c:CVB (/ *error* courant_cvb accroche_cvb largeur_pline der_cvb) ;; redéfinition locale de la fonction *error* (defun *error* (msg) (if (and msg (/= msg "Fonction annulée")) (princ (strcat "\nErreur: " msg)) ) (setvar "osmode" accroche_cvb) (setvar "clayer" courant_cvb) (princ) ) (setq courant_cvb (getvar "clayer")) (setq accroche_cvb (getvar "osmode")) (setvar "osmode" 0) (cond ((= 4 (getvar "INSUNITS")) (command "_rectangle" pause pause) (command-s "_revcloud" "_arc" 500 500 "_object" "_last" "_no") ) ((= 5 (getvar "INSUNITS")) (command "_rectangle" pause pause) (command-s "_revcloud" "_arc" 50 50 "_object" "_last" "_no") ) ((= 6 (getvar "INSUNITS")) (command "_rectangle" pause pause) (command-s "_revcloud" "_arc" 0.5 0.5 "_object" "_last" "_no") ) ) ;; appel de la fonction *error* locale pour restaurer les variables (*error* nil) ) J'ai volontairement supprimer tout ce qui consernait PLINEWID car la largeur du nuage de révision n'est pas géré par cette variable. J'ai malheureusement pas trouvé par quoi c'était géré. ATEGIE - Bureau d'Études Fluideshttp://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.pngExécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffragewww.ategie.fr
GEGEMATIC Posté(e) le 29 avril 2014 Posté(e) le 29 avril 2014 Salut, J'ai volontairement supprimer tout ce qui consernait PLINEWID car la largeur du nuage de révision n'est pas géré par cette variable. J'ai malheureusement pas trouvé par quoi c'était géré. Je ne sais pas non plus, mais tu peut toujours changer ton epaisseur après création de ton nuage: au début du programme, tu mets : (setq elast (entlast)) et à la fin : (if (/= elast (entlast));_ tu teste ainsi que la commande à abouti à la création d'un nuage (vla-put-ConstantWidth (vlax-ename->vla-object (entlast)) 20) ) ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
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