Aller au contenu

Messages recommandés

Posté(e)

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: APPLOAD

cvb - 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 Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Posté(e)

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 Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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 : ok

puis 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 Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Posté(e)

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.fr

Blog: http://g-eaux.over-blog.com

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité