Aller au contenu

DCL/LISP Récupération de valeur(s)


zebzeb

Messages recommandés

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 rame

Grand 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

Lien vers le commentaire
Partager sur d’autres sites

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 DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Tu n'interroges pas le bouton qui est choisit, mais l'ensemble

En 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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 DELANNOY

Développement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAO

WIIP - http://wiip.fr

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 question

Ben 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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"))

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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)

 

@+

  • Upvote 1

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

  • 2 ans après...

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

Lien vers le commentaire
Partager sur d’autres sites

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

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

 

%24value.png

 

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

Lien vers le commentaire
Partager sur d’autres sites

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é