zebzeb Posté(e) le 2 mai 2012 Posté(e) le 2 mai 2012 Bonjour,Je suis débutant en Lisp (plutôt bidouilleur!!).Je rencontre un soucis récalcitrants, lorsque je test le retour de la boite DCL je ne récupère pas les variables ctb et fmt, ce qui est génant pour la suite des instructions qui ne s'effectuent pas.N'ayant plus de solution je m'en retourne vers vous les ceintures noir, grise et même blanche ;) Voici mon code: (defun liste_imprimantes(/ imp lst) (setq lst (vlax-invoke (vla-get-activelayout doc) 'getplotdevicenames)) (foreach imp (list "Aucun" "None" "Microsoft XPS Document Writer" "HP Designjet T1200 HPGL2" "Fax" "Default Windows System Printer.pc3" "DWF6 ePlot.pc3" "DWFx ePlot (XPS Compatible).pc3" "DWG To PDF.pc3" "PublishToWeb JPG.pc3" "PublishToWeb PNG.pc3" ) (setq lst (vl-remove imp lst)) ) lst ) (defun *error* (msg) (princ "=> ") (princ msg) (terpri) ) (defun c:T2 (/ x y old_cmdecho old_attdia old_osmode doc temp id_dcl file nb fol kt implist trac ctb pt1 pt2 fmt msg) (setq old_cmdecho (getvar "CMDECHO")) (setq old_attdia (getvar "ATTDIA")) (setq old_osmode (getvar "OSMODE")) (setvar "CMDECHO" 1) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (setq TEMP(vl-filename-mkTEMP "Tmp.dcl") file (open TEMP "w")) (write-line (strcat "TraInputbox:dialog{label=\"TRA2012 By Zeb\";initial_focus=\"implistordi\";" "is_cancel = true;" ":popup_list{key=\"implistordi\";value=\"1\";}" ": boxed_column {" "label=\"CTB\";key=\"ctb\";" " :radio_button{" " label=\"Monochrome\";key=\"ctbnb\";value=\"1\";}" " :radio_button{" " label=\"Couleur\";key=\"ctbc\";}}" ": boxed_column {" "label=\"Format du papier\";key=\"fmt\";" " :radio_button{" " label=\"A4\";key=\"A4\";value=\"1\";}" " :radio_button{" " label=\"A3\";key=\"A3\";}}" ":edit_box{" "label=\"Nombre de folios à tracer:\";key=\"nb\";edit_width=5;allow_accept=true;}" ":edit_box{" "label=\"Numéro du folio de départ:\";key=\"fol\";edit_width=5;allow_accept=true;}" "spacer;ok_cancel;}" ) file ) (close file) (setq nb 1 fol 1 dcl_id (load_dialog temp) ) (if (not (new_dialog "TraInputbox" dcl_id)) (exit) ) (setq trac "PDFCreator") (setq implist(liste_imprimantes)) (start_list "implistordi") (mapcar 'add_list implist) (end_list) (set_tile "nb" (itoa nb)) (set_tile "fol" (itoa fol)) (action_tile "nb" "(setq nb (atoi (get_tile \"nb\")))") (action_tile "fol" "(setq fol (atoi (get_tile \"fol\")))") (action_tile "ctb" "(setq ctb (get_tile \"ctb\"))(done_dialog)") (action_tile "fmt" "(setq fmt (get_tile \"fmt\"))(done_dialog)") (action_tile "implistordi" "(setq trac (nth (atoi (get_tile \"implistordi\")) implist))") (action_tile "cancel" "(exit)") (action_tile "accept" "(done_dialog)") (start_dialog) (unload_dialog dcl_id) (vl-file-delete temp) (setq X 400.0 Y 280.0) (if (= ctb "ctbc")(setq table "acad.ctb")(setq table "monochrome.ctb")) (if (= fmt "A3")(setq ech "1=0.97")(setq ech "1=1.42")) (if (/= fmt "A3")(setq fmt "A4")) (if (or (< nb 1)(< fol 1)(< nb fol)) (progns (setq msg (strcat "ERREUR: 1 <= Nombre de folios("(itoa fol)") <= Numéro départ(" (itoa nb) ")\n")) (setq msg (strcat msg "\nLe nombre de folios : Entier réel superieur ou égale à 1 et superieur ou égale au numéro de départ")) (setq msg (strcat msg "\nLe numéro de départ : Entier réel superieur ou égale à 1 et inférieur ou égale au numéro de folios")) (alert msg) (exit) ) ) (setq KT 1) (while (< KT (1+ NB)) (if (= 1 (logand FOL 1)) (setq PT2 (list (* (/ (1+ FOL) 2.0) X) Y)) (setq PT2 (list (* (/ FOL 2.0) X) (* Y 2.0))) ) (setq PT1 (list (- (car PT2) X) (- (cadr PT2) Y))) (setq OLD_OSMODE (getvar "OSMODE")) (setvar "OSMODE" 0) (setvar "ATTDIA" 0) (if (= 0 (getvar "TILEMODE")) (command "-TRACEUR" "Oui" (getvar "CTAB") trac fmt "M" "A" "Non" "F" PT1 PT2 ech "C" "Oui" table "Oui" "Non" "Oui" "Non" "Non" "Oui" "Oui") (command "-TRACEUR" "Oui" (getvar "CTAB") trac fmt "M" "A" "Non" "F" PT1 PT2 ech "C" "Oui" table "Oui" "Non" "Non" "Non" "Oui") ) (setvar "OSMODE" OLD_OSMODE) (setq KT (1+ KT) FOL (1+ FOL)) ) (setvar "CMDECHO" old_cmdecho) (setvar "ATTDIA" old_attdia) (setvar "OSMODE" old_osmode) (princ) ) Pourquoi les if ne fonctionne pas? (action_tile "ctb" "(setq ctb (get_tile \"ctb\"))(done_dialog)") (action_tile "fmt" "(setq fmt (get_tile \"fmt\"))(done_dialog)") ... (if (= ctb "ctbc")(setq table "acad.ctb")(setq table "monochrome.ctb")) (if (= fmt "A3")(setq ech "1=0.97")(setq ech "1=1.42")) (if (/= fmt "A3")(setq fmt "A4")) Est-ce un problème "action_tile"... Je rameGrand merci par avance D'autre part je souhaiterais également exclure dans la liste d'imprimante tous les PC3 car d'un ordinateur à l'autre ce ne sont pas les mêmes: (defun liste_imprimantes(/ imp lst) (setq lst (vlax-invoke (vla-get-activelayout doc) 'getplotdevicenames)) (foreach imp (list "Aucun" "None" "Microsoft XPS Document Writer" "HP Designjet T1200 HPGL2" "Fax" "*.PC3" ; <= Ceci ne fonctionne pas ) (setq lst (vl-remove imp lst)) ) lst ) Merci à vous
Maxence DELANNOY Posté(e) le 2 mai 2012 Posté(e) le 2 mai 2012 A la lecture rapide du code, je vois que tu utilises get_tile pour retrouver la valeur du contrôle. Normalement, on utilise la variable $value. (action_tile "ctb" "(setq ctb $value)(done_dialog)") Je pense que si tu utilises get_tile dans le callback, la valeur du contrôle n'est pas encore mise à jour et donc tu récupère l'ancienne valeur (à vérifier, je n'ai jamais essayé). Maxence DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
Patrick_35 Posté(e) le 2 mai 2012 Posté(e) le 2 mai 2012 Salut Tu n'interroges pas le bouton qui est choisit, mais l'ensembleEn prenant l'exemple que la variable ctb = 0 quand c'est en monochrome(action_tile "ctbnb" "(setq ctb 0)" (action_tile "ctbc" "(setq ctb 1)" ps : non testé Et j'en profite pour optimiser la liste des imprimantes (defun liste_imprimantes() (vl-remove-if '(lambda(x)(member x '( "Aucun" "None" "Microsoft XPS Document Writer" "HP Designjet T1200 HPGL2" "Fax" "Default Windows System Printer.pc3" "DWF6 ePlot.pc3" "DWFx ePlot (XPS Compatible).pc3" "DWG To PDF.pc3" "PublishToWeb JPG.pc3" "PublishToWeb PNG.pc3" ) ) ) (vlax-invoke (vla-get-activelayout doc) 'getplotdevicenames) ) ) Et celle qui vire tout les pc3 (defun liste_imprimantes() (vl-remove-if '(lambda(x)(or (member x '( "Aucun" "None" "Microsoft XPS Document Writer" "HP Designjet T1200 HPGL2" "Fax" "DWF6 ePlot.pc3" ) ) (and (vl-filename-extension x) (eq (strcase (vl-filename-extension x)) ".PC3") ) ) ) (vlax-invoke (vla-get-activelayout doc) 'getplotdevicenames) ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Maxence DELANNOY Posté(e) le 2 mai 2012 Posté(e) le 2 mai 2012 Et quand tu appelles explicitement done_dialog, je pense que tu dois passer 1 (OK) dans le status. (done_dialog 1) Sinon, c'est 0 (Cancel) qui est retourné. Surtout pour le bouton "accept". Extrait de la doc. : Also, an explicit AutoLISP action for the “accept” button must specify a status of 1 (or an application-defined value); otherwise, start_dialog returns the default value, 0, which makes it appear as if the dialog box was canceled. Maxence DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
Maxence DELANNOY Posté(e) le 2 mai 2012 Posté(e) le 2 mai 2012 Sinon, pourquoi est-ce que tu génères à la volée ton fichier DCL ? Maxence DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
zebzeb Posté(e) le 2 mai 2012 Auteur Posté(e) le 2 mai 2012 Merci beaucoup pour vos réponses je teste immédiatement
zebzeb Posté(e) le 2 mai 2012 Auteur Posté(e) le 2 mai 2012 Oups... Le problème des fichiers DCL est que le chemin doit-être dans Autocad... Dans mon entreprise il y a bcp d'ordi est bcp de versions différente d'Autocad...J'ai pensé (peut-être à tord) que ce serais plus facile
Patrick_35 Posté(e) le 2 mai 2012 Posté(e) le 2 mai 2012 Sinon, pourquoi est-ce que tu génères à la volée ton fichier DCL ?Salut Que c'est le lisp qui écrit le DCL ? C'est pour éviter le fichier DCL, n'avoir plus qu'un fichier à gérer et ne plus avoir la questionBen pourquoi le DCL est introuvable, je l'ai bien mis dans le même dossier que le lisp ?Réponse > Regarde dans les chemins de recherche d'Autocad @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Patrick_35 Posté(e) le 2 mai 2012 Posté(e) le 2 mai 2012 Ben décidement, mes messages se croisent avec d'autres ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebzeb Posté(e) le 2 mai 2012 Auteur Posté(e) le 2 mai 2012 Merci ça marche super J'ai remplacé ceci (action_tile "ctb" "(setq ctb (get_tile \"ctb\"))(done_dialog)") (action_tile "fmt" "(setq fmt (get_tile \"fmt\"))(done_dialog)") ... (if (= ctb "ctbc")(setq table "acad.ctb")(setq table "monochrome.ctb")) (if (= fmt "A3")(setq ech "1=0.97")(setq ech "1=1.42")) (if (/= fmt "A3")(setq fmt "A4")) par ça ... c'est bien mieux;) (action_tile "ctbnb" "(setq ctb 0)") (action_tile "ctbc" "(setq ctb 1)") (action_tile "A4" "(setq fmt 0)") (action_tile "A3" "(setq fmt 1)") ... (if (= ctb 1)(setq table "acad.ctb")(setq table "monochrome.ctb")) (if (= fmt 1)(setq ech "1=0.97")(setq ech "1=1.42")) (if (/= fmt 1)(setq fmt "A4")(setq fmt "A3"))
zebzeb Posté(e) le 4 mai 2012 Auteur Posté(e) le 4 mai 2012 Bonjour, J'ajoute juste un petit commentaire pour ceux qui utiliseraient ce lisp, et qui rencontre des problèmes avec l'impression en PDFCreator. En effet avec PDFCreator les folios ne sont pas toujours (et même rarement) dans l'ordre... Ce souci n'est pas dû aux lisp mais à PDFCreator. La solution (il y en a peut-être d'autre)Sous windows: Périphériques et imprimantes / Propriété de l'imprimante / Avancé ...et cochez "Imprimer directement sur l'imprimante" Voili, voilou
Patrick_35 Posté(e) le 4 mai 2012 Posté(e) le 4 mai 2012 Salut On passe la vitesse supérieur ;) Le plus simple est d'utiliser ceci.L'idée est de comparer le nombre d'impression dans la file d'attente de Pdfcreator et le nombre de feuilles que l'on imprime.S'il y a une différence, je fais une boucle d'attente. Supprimer un process.C'est la seul manière de fermer Pdfcreator. Un vlax-release-object de Pdfcreator en lui-même ne suffit pas. (defun kill(qui / item meth1 meth2 obj WMI) (setq WMI (vlax-create-object "WbemScripting.SWbemLocator") meth1 (vlax-invoke WMI 'ConnectServer nil nil nil nil nil nil nil nil) meth2 (vlax-invoke meth1 'ExecQuery "Select * from Win32_Process") ) (vlax-for item meth2 (and (setq obj (vlax-get item 'CommandLine)) (vl-string-search (strcase qui) (strcase obj)) (vlax-invoke item 'Terminate) ) ) (foreach item (list WMI meth1 meth2) (vlax-release-object item) ) ) Ma routine d'impression (kill "PDFCreator.exe") ; Eradiquer PdfCreator si jamais on s'en est déjà servit. (setq pdf (vlax-create-object "PDFCreator.clsPDFCreator")) ; Apeller l'activex PdfCreator (vlax-invoke pdf 'cstart "/NoProcessingAtStartup") ; Ne pas démarrer au lancement (vlax-put pdf 'cPrinterStop :vlax-true) ; Activer la file d'attente (vlax-put pdf 'cWindowState 0) ; Afficher la fenêtre de Pdfcreator (vlax-invoke pdf 'cClearCache) ; Vider la file d'attente (setq tot 0) ; Initialiser mon nombre d'impression (mon_impression) ; Mon Impression en cours... (while (/= (vlax-get pdf 'cCountOfPrintjobs) (1+ tot))) ; Pause tant que la nouvelle impression n'est pas dans la file d'attente (setq tot (1+ tot)) ; Incrémenter mon nombre d'impression pour correspondre à ma file d'attente Pour regrouper mes impressions en un seul (vlax-invoke pdf 'cCombineAll) Et nettoyer (vlax-release-object pdf) @+ 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
zebzeb Posté(e) le 8 mai 2012 Auteur Posté(e) le 8 mai 2012 Bonjour, La vitesse est bien supérieur en effet, merci pour ces précisions... C'est dommage j'ai déployé avant ton dernier message donc je le garde sous le coude pour des applis avenir Bonne journée
famaice Posté(e) le 12 décembre 2014 Posté(e) le 12 décembre 2014 A la lecture rapide du code, je vois que tu utilises get_tile pour retrouver la valeur du contrôle. Normalement, on utilise la variable $value. (action_tile "ctb" "(setq ctb $value)(done_dialog)") Bonjour Maxence, :blink: Une petite explication de texte sur cette variable $value serait bienvenu car j'ai quelques LISP que j'ai commencé à debugger et je vois cette variable apparaitre, souvent en combinaison avec un argument Value. Merci d'avance, :) ""Nous avons un avenir et il sera fait de nos rêves si nous avons le courage de bousculer les idées reçues" - S. HONDA
Patrick_35 Posté(e) le 12 décembre 2014 Posté(e) le 12 décembre 2014 Bonjour Maxence, :blink: Une petite explication de texte sur cette variable $value serait bienvenu car j'ai quelques LISP que j'ai commencé à debugger et je vois cette variable apparaitre, souvent en combinaison avec un argument Value. Merci d'avance, :)Salut $value permet de retourner le résultat dans une variable.Dans l'exemple cité, une valeur via la clé "ctb" du dcl sera renvoyé dans la variable ctb du lisp grace à $value @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 13 décembre 2014 Posté(e) le 13 décembre 2014 Salut, Si tu suis la procédure décrite ici pour avoir accès à l'aide aux développeurs d'avant AutoCAD 2011, tu pourras consulter la rubrique concernant les expression d'action :Working with Programmable Dialog Boxes > Managing Dialog Boxes > Action Expressions and Callbacks > Actions Expressions Ou encore, voir cette page trouvée en cherchant : AutoCAD Action Expressions sur le web (cette page est traductible en français, mais à mon avis la traduction est plus difficile à comprendre que l'original). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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