CADsite forum

AutoCAD => Autolisp => Topic gestart door: H@rm op do 30 07 2009, 10:31:20

Titel: programeren met dialoogbox
Bericht door: H@rm op do 30 07 2009, 10:31:20
Ik heb een lispje gemaakt met een bijbehorende dialoogbox (.dcl)
In de dialoogbox kan ik drie keuzes aan of uit vinken. Tot zover gaat het goed.
Nu wil ik dat als er een vinkje staat er iets gebeurt, en als er geen vinkje staat natuurlijk niets.
Ik heb de help van Acad al geraadpleegd maar daar kom ik niet verdee mee.
Kan iemand mij helpen??

Michel
Zie bijlagen
Titel: Re:programeren met dialoogbox
Bericht door: WebRacer op do 30 07 2009, 11:28:05
ik zou voor de lisp als volgt te werk gaan:
(defun c:ppe ()
  (setq dialoog (load_dialog "exp.dcl"))
  (new_dialog "exp_mainDialog" dialoog)
  (setq ok_ T)
  (setq exp-plt 1)
  (setq exp-pdf 1)
  (setq exp-et 1)
  (set_tile "exp-plt" "1")
  (set_tile "exp-pdf" "1")
  (set_tile "exp-et" "1")
  (action_tile "exp-plt" "(setq exp-plt (atoi $value))")
  (action_tile "exp-pdf" "(setq exp-pdf (atoi $value))")
  (action_tile "exp-et" "(setq exp-et (atoi $value))")
  (action_tile "cancel" "(SETQ ok_ nil)")
  (start_dialog)
  (done_dialog)
  (unload_dialog dialoog)
  (if (/= ok_ nil)
    (progn
      (setq lo_len (length (layoutlist)))
      (setq layouts (reverse (layoutlist)))
      (setq  x lo_len)
      (while (> x 0)
   ;(princ (strcat "\n " (itoa x) ":"))
   (princ "\n ")
   (setq x (1- x))
   (princ (nth x layouts))
   (if (= exp-plt 1) (princ "\tplot-plt")(princ "\tGeen PLT"))
   (if (= exp-pdf 1) (princ "\tplot-pdf")(princ "\tGeen PDF"))
      )
      (if (= exp-et 1) (princ "\ntransm")(princ "\ngeen Etransmit"))))
(princ)
)

voor de dcl zou ik dit gebruiken:

exp_mainDialog : dialog {
label = "Export tekeningen";
: boxed_radio_column {   
label = "Soorten export";
: toggle {     
label = "&*.PLT";
key = "exp-plt";
}
: toggle {       
label = "&*.PDF";
key = "exp-pdf";
}
: toggle {       
label = "&ETRANSMIT";
key = "exp-et";
}
}
: row {          // defines the OK/Cancel button row
: spacer { width = 1; }
: button {    // defines the OK button
label = "OK";
is_default = true;
key = "accept";
width = 8;
fixed_width = true;
}
: button {    // defines the Cancel button
label = "Cancel";
is_cancel = true;
key = "cancel";
width = 8;
fixed_width = true;
}
: spacer { width = 1;}
}
}

van hieruit kan je vast verder...
Titel: Re:programeren met dialoogbox
Bericht door: H@rm op do 30 07 2009, 11:52:34
WebRacer,

Bedankt voor de snelle reactie. Ik heb het gelijk uitgeprobeerd.
Ik krijg allen de volgende foutmelding: ; error: bad argument type: consp #<SUBR @148a4474 <EXRXSUBR>>

Heb je enig idee wat er fout gaat?

Michel
Titel: Re:programeren met dialoogbox
Bericht door: roy_043 op do 30 07 2009, 11:59:41
Beste Michel,

Ik krijg ook een foutmelding bij de code van WebRacer.

Het probleem waar jij tegenaan loopt wordt veroorzaakt door het gebruikt van action bij de toggles. Of je de toggle nu aan- of uitzet in alle gevallen wordt de action uitgevoerd!

Mijn oplossing:

1. Verwijder de regels met action uit de dcl.

2. Gebruik deze code voor de lisp:


(defun c:ppe ( / dialoog)
   (setq dialoog (load_dialog "exp.dcl"))
   (new_dialog "exp_mainDialog" dialoog)
   (action_tile "accept" "(ppeReadValuesAndAction)")
   (start_dialog)
   (unload_dialog dialoog)
   (princ)
)

(defun ppeReadValuesAndAction ( / exp-plt exp-pdf exp-et)
   (setq
      exp-plt (get_tile "exp-plt")
      exp-pdf (get_tile "exp-pdf")
      exp-et (get_tile "exp-et")
   )
   (done_dialog)
   (princ (strcat "\nexp-plt=" exp-plt "\nexp-pdf=" exp-pdf "\nexp-et=" exp-et))
   (princ "\nAction....")
   (princ)
)


Groet, Roy.
Titel: Re:programeren met dialoogbox
Bericht door: H@rm op do 30 07 2009, 12:00:01
Sorry,

Ik heb de fout al gevonden. Een type fout van mij. Nu werkt het wel. Nog even aanpassen naar het echte programma en dan moet het goed komen.

Michel
Titel: Re:programeren met dialoogbox
Bericht door: H@rm op vr 31 07 2009, 08:26:51
Na het een en ander geprobeerd te hebben wil ik jullie niet het resultaat onthouden. Voor mij werkt het perfect. Wellicht dat jullie er nog opmerkingen op hebben (ter leering) dan hoor ik het graag.

Michel
Titel: Re:programeren met dialoogbox
Bericht door: WebRacer op vr 31 07 2009, 08:35:13
er staat een )  te veel, helemaal op het einde bij defun transm...

het plotten via lisp is leuk, maar niet echt handig om uit te wisselen...
niet iedereen heeft dezelfde plotter, dezelfde doorloop dus van uw plot-commando.
ook voor de PDF zal het bij nogal wat mensen verschillend zijn.

Ik wens u veel plezier aan uw lisp.
Titel: Re:programeren met dialoogbox
Bericht door: H@rm op vr 31 07 2009, 08:48:12
Citaat van: WebRacer op vr 31 07 2009, 08:35:13
er staat een )  te veel, helemaal op het einde bij defun transm...

het plotten via lisp is leuk, maar niet echt handig om uit te wisselen...
niet iedereen heeft dezelfde plotter, dezelfde doorloop dus van uw plot-commando.
ook voor de PDF zal het bij nogal wat mensen verschillend zijn.

Ik wens u veel plezier aan uw lisp.

Webracer,

Daar ben ik mij van bewust dat het voor iedereen anders zal zijn i.v.m. verschillende plotters etc. Daarom had ik hem al een klein beetje aangepast voor het grote publiek en is er een ) blijven staan. Verder denk ik dat het een goede basis is voor een ieder die er mee verder wil gaan.

Michel
Titel: Re:programeren met dialoogbox
Bericht door: H@rm op wo 05 08 2009, 10:48:21
Hallo'

Voor het verfraaien van dit progje ben ik eigenlijk nog opzoek naar het stukje code  dat de reviesie (=atribute) uit de onderhoek (=block) kan lezen en in een variabele zet. Ieder layout/tekeningblad kan dus zijn eigen reviesie hebben.
Kan iemand mij helpen??

Michel
Titel: Re:programeren met dialoogbox
Bericht door: roy_043 op wo 05 08 2009, 16:13:33
Beste Michel,

Is dit wat jij zoekt?


(defun c:AttTest ( / attTag blkName thisLayout ss thisObject thisObjectLst isAttTagCorrect attValue)
(setq
attTag "revisie"     ; LET OP: attTag en blkName zijn HOOFDLETTER-gevoelig!
blkName "onderhoek*" ; alle blocknamen die beginnen met "onderhoek" worden gevonden (onderhoek, onderhoekA4, onderhoekStandaard enz.)
thisLayout "LAYOUT1" ; in jouw geval: (nth x layouts)
)
(if
(and
;; er moet exact 1 insert met blkName (met attributen) in de layout staan:
(setq ss (ssget "_X" (list '(0 . "INSERT") (cons 2 blkName) '(66 . 1) (cons 410 thisLayout))))
(= (sslength ss) 1)
)
(progn
(setq thisObject (entnext (ssname ss 0))) ; thisObject is nu het eerste attribuut
(while
(and
(setq thisObjectLst (entget thisObject))
(= (cdr (assoc 0 thisObjectLst)) "ATTRIB") ; zolang het type "ATTRIB" is en "SEQEND" dus niet bereikt is ...
(not                                       ; en de juiste attTag niet gevonden is ...
(setq isAttTagCorrect (= (cdr (assoc 2 thisObjectLst)) attTag))
)
)
(setq thisObject (entnext thisObject)) ; thisObject instellen op het volgende object en doorgaan met de lus ...
)
(if isAttTagCorrect
(setq attValue (cdr (assoc 1 thisObjectLst)))
(setq attValue nil)
)
)
(progn
(setq attValue nil)
(princ "\nFout: er moet exact 1 onderhoek (met attributen) in de layout staan! ")
)
)
(princ attValue)
(princ)
)


Groet, Roy.
Titel: Re:programeren met dialoogbox
Bericht door: H@rm op do 06 08 2009, 08:26:36
Roy,

Als je mijn vrouw was kreeg je een zoen. Het werkt perfect. :vreegoe:
Ik heb het complete resultaat hier maar gepost. Wie weet heeft iemand anders er ook nog wat aan.

Nog een klein vraagje: de variabele namen die achter de defun tussen de haakje staan worden toch leeg gemaakt na het beeindigen van die defun? Want de variabele attValue gebruik ik in het andere deel van het programma.

Michel
Titel: Re:programeren met dialoogbox
Bericht door: roy_043 op do 06 08 2009, 12:03:28
Beste Michel,

Locale en globale variabelen: dat kan lastig zijn. Voor mijzelf heb ik in het verleden eens TestVarLocalAndGlobal.lsp gemaakt. Naar aanleiding van jouw vraag heb ik Functie5 en Functie6 toegevoegd.

In het algemeen geldt:

Groet, Roy.
Titel: Re:programeren met dialoogbox
Bericht door: roy_043 op vr 07 08 2009, 11:30:17
Citaat van: roy_043 op do 06 08 2009, 12:03:28
In het algemeen geldt:

  • Gebruik zo min mogelijk globale variabelen.
  • Declareer alle locale variabelen.
  • Als je een waarde van de ene functie in de andere wilt gebruiken zorg dan dat deze waarde wordt geretourneerd (zoals gebeurt op het eind van Functie6).

Een toevoeging hierop:
Titel: Re:programeren met dialoogbox
Bericht door: HofCAD op di 01 09 2009, 15:07:16
Als je groot Lisp programma wil analyseren op het gebruik van variabelen,
dan kun je het programma ALLY (ALLYWB.EXE) gebruiken met F5-Analyze.
Het programma is verkrijgbaar op: http://www.wascotech.com/products.html

Met vriendelijke groet, HofCAD CSI