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
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...
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
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.
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
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
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.
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
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
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.
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
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:
- 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).
Groet, Roy.
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:
- Als een hoofdfunctie een subfunctie aanroept dan zijn de variabelen uit de hoofdfunctie ook beschikbaar in de subfunctie (tenzij in de subfunctie locale variabelen met dezelfde naam zijn gedeclareerd). Zie Functie7 en Functie7-SubfunctieA in TestVarLocalAndGlobal.lsp versie B.
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