FastFiber

Getkword met standaard <Y>

Gestart door Reimer, vr 31 10 2008, 08:36:55

Vorige topic - Volgende topic

Reimer

Beste,

ik duik maar weer eens in de wondere wereld van lisp.
Ik wil graag de volgende regel maken waarbij men ook kan volstaan met alleen Enter voor Yes. Standaard werkt dit niet bij getkword.

(initget 1 "Yes No")
(setq plotje2 (getkword "Wilt u ook direct plotten? [Yes/No] <Y>"))


Reimer


Joop

#1
Je moet geen getkword gebruiken maar grread.
Hieronder de verschillen bij het drukken van enter.
_$ (getkword)
nil
_$ (grread)
(2 13)
_$

Voor de duidelijkheid:
2 >> keyboard input
13 >> Enter toets
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

HofCAD

#2
Citaat van: Reimer op vr 31 10 2008, 08:36:55
Beste,

ik duik maar weer eens in de wondere wereld van lisp.
Ik wil graag de volgende regel maken waarbij men ook kan volstaan met alleen Enter voor Yes. Standaard werkt dit niet bij getkword.

(initget 1 "Yes No")
(setq plotje2 (getkword "Wilt u ook direct plotten? [Yes/No] <Y>"))


Reimer

Beste Reimer,

Bedoel je:

(defun c:test( / plotje2)
(initget "Yes No")
(setq plotje2 (getkword "Wilt u ook direct plotten? [Yes/No] <Y>"))
(if (= plotje2 "No")
(progn (princ (strcat "\nDirect plotten is nee, omdat plotje2 = " plotje2)) (textscr))
(progn (princ "\nDirect plotten is ja, omdat plotje2 niet No is") (textscr)))
(princ)
)


Met vriendelijke groet, HofCAD CSI

PS Joop, ik snap je met mijn blonde haren niet of ik snap de vraagstelling niet.
Je zegt:
_$ (getkword)
nil
_$ (grread)
(2 13)
_$
ACADcadabra

Joop

HofCAD,

Dat je blond bent is niet mijn schuld, maar Reimer wil graag met een druk op een toets (nl. Enter) de optie Yes kiezen.
Citaat van: Reimer op vr 31 10 2008, 08:36:55
Beste,

ik duik maar weer eens in de wondere wereld van lisp.
Ik wil graag de volgende regel maken waarbij men ook kan volstaan met alleen Enter voor Yes. Standaard werkt dit niet bij getkword.

(initget 1 "Yes No")
(setq plotje2 (getkword "Wilt u ook direct plotten? [Yes/No] <Y>"))


Reimer
Met getkword lukt dit niet want deze vraagt om een string (je weet wel word >> woord).
Dus yes of no of pietje.

CiteerPS Joop, ik snap je met mijn blonde haren niet of ik snap de vraagstelling niet.
Je zegt:
_$ (getkword)
nil
_$ (grread)
(2 13)
_$
Met grread lees je een input device (toetsenbord, tablet, muis) uit. In dit geval het toetsenbord (2).
13 is de enter key.

Jouw code wordt dus zoiets als:
(defun c:test (/ ;|plotje2|;)
  (princ "Wilt u ook direct plotten? [Yes/No] <Y>")
  (setq antwoord nil)
  (while (= antwoord nil)
    (setq plotje2 (grread))
    (if (= (car plotje2) 2)
      (cond
((/= (cadr plotje2) 13) (setq antwoord "No"))
((= (cadr plotje2) 13) (setq antwoord "Yes"))
(t nil)
      )
    )
  )
  (if (= antwoord 1)
    (progn
      (princ "\nDirect plotten is ja, omdat antwoord niet Yes is")
      (textscr)
    )
    (progn
      (princ (strcat "\nDirect plotten is nee, omdat antwoord = No"))
      (textscr)
    )
  )
  (princ)
)

Er zijn uiteraard meerdere mogelijkheden.
Hierboven wordt gecontroleerd of de enter toets wordt ingedrukt.
Je kunt bijvoorbeeld ook controleren op de toetsen Y, y, N en n.
13 is de enter key.
110 = n
122 = y
78 = N
89 = Y

En nu is het weekend.
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

Reimer

Beste Joop, dit gaat voor mij als beginneling net iets te snel. Daarnaast ias de oplossing van Hofcad precies wat ik zoek. Net als bij standaard acad commando's wil ik een standaard waarde voorstellen <Y>. Ik zie dat het verschil is dat bij mij achter initget een "1" staat en bij Hofcad niet.
De oplossing van Joop vind ik echter wel mooi omdat dit weer typewerk scheelt. Misschien kan ik dit ook wel gebruiken. Ik krijg echter in alle gevallen als antwoord "Direct plotten is nee, omdat antwoord = No"

Reimer

HofCAD

#5
Joop en Reimer,

Nu snap ik het t.a.v. (grread), maar ik snap nog steeds niet dat je zegt:
'Je moet geen getkword gebruiken maar grread'.
Is mijn bovenstaande programma 'Test' met getkword dan niet goed?


Een alternatief met ook weer getkword van mijn blonde hersens:

(defun c:test2 (/ plotje2)
  (initget "Yes No")
  (setq plotje2 (getkword "Wilt u ook direct plotten? [Yes/No] <Y>"))
  (cond
    ((eq plotje2 "No")
     (princ
       (strcat "\nDirect plotten is nee, omdat plotje2 = " plotje2)
     )
     (textscr)
    )
    (T
     (princ
       (strcat "\nDirect plotten is ja, omdat plotje2 niet No is")
     )
     (textscr)
    )
  )
  (princ)
)


Met vriendelijke groet, HofCAD CSI

PS 1
Reimer  (initget 1 "Yes No") moet   (initget "Yes No") zijn, omdat de waarde 1
geen enter toestaat.
Uit de help van AutoCAD bij initget
1 (bit 0) Prevents the user from responding to the request by entering only ENTER.

PS 2
In Word geeft Extra->Woorden tellen
bij mijn eerste programma TEST: Tekens (exclusief spaties) 261
bij het programma van Joop: Tekens (exclusief spaties) 398
en bij mijn tweede programma TEST2: Tekens (exclusief spaties) 264.
Nu is deze telling niet eerlijk, omdat we ook teksten laten afdrukken.
Als je echter kijkt bij Joop, dan zie je dat hij een WHILE, twee keer IF en
een keer een COND gebruikt.
Bij mij is de INITGET min of meer de WHILE en gebruik ik slechts een IF.
Dus ik snap met mijn blonde kop niet je zin:
De oplossing van Joop vind ik echter wel mooi omdat dit weer typewerk scheelt.

Ik persoonlijk vind de oplossing van Joop origineel, maar niet direct genoeg.
Joop moet eens uittesten welke van de drie de beste is.

PS 3
Joop 'Je kunt bijvoorbeeld ook controleren op de toetsen Y, y, N en n.'
13 is de enter key.
110 = n
121 = y ; dus niet 122
78 = N
89 = Y

ACADcadabra

Joop

Geplaatst door Joop
Citeerje moet geen getkword gebruiken maar grread.
Bovenstaande trek ik in, hoewel op internet is eens gezegd altijd en voor eeuwig gezegd.
Als je namelijk de nil respons van de entertoets gebruikt lukt het wel.
Eigenlijk gebruik je dus het feit dat je geen antwoord geeft als antwoord. Verwarrend, he? :mrgreen:
AutoCAD gebruikt deze namelijk zelden of nooit om een optie te kiezen, wel voor het kiezen van een standaard waarde, zoals bij donut en pline.
Maar tenslotte is dit wat gevraagd wordt.

Geplaatst door Reimer:
CiteerIk wil graag de volgende regel maken waarbij men ook kan volstaan met alleen Enter voor Yes. Standaard werkt dit niet bij getkword.

Met getkword vraag je aan de gebruiker een voorgedefinieerd antwoord te geven op een vraag, dmv keywords.
Voordefinieren  gebeurd met:
_$ (initget 0 "Yes No")


En dit geeft terug:
nil

Het antwoord vraag je op met behulp van:
_$ (setq x (getkword "Are you sure? (Yes or No)  <Y>:"))

Je hebt nu verschillende mogelijkheden om deze vraag te beantwoorden op de command line.
De belangrijkste zijn:

1) Yes <Enter>    geeft “Yes”
2) No <Enter>    geeft “No”
3) Y <Enter>     geeft “Yes”, alleen als keyword is met hoofdletter
4) y <Enter>     geeft “Yes” , alleen als keyword is met hoofdletter
3) N <Enter>     geeft “No” , alleen als keyword is met hoofdletter   
4) n <Enter>     geeft “No” , alleen als keyword is met hoofdletter
5) <Enter>      geeft nil >> dit is de gevraagde optie
6) <Esc>       geeft >> ; error: Function cancelled
7) <^C>          geeft >> ; error: Function cancelled

De code met getkword is dan:

(defun c:plotje3 (/)
  (initget 0 "Yes No")
  (princ "Wilt u ook direct plotten? [Yes/No] <Y>")
  (setq Antwoord (getkword "Are you sure? (Yes or No) <Y>: "))
  (cond
    ((= Antwoord nil)
     (alert "\nDirect plotten is JA, omdat je direkt de enter toets hebt gedrukt.")
    )
    ((= Antwoord "Yes") (alert "\nDirect plotten is JA, omdat antwoord Yes of Y of y is"))
    ((= Antwoord "No") (alert "\nDirect plotten is NEE, omdat antwoord No of N of n is"))
    (t nil)
  )
)

Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

Reimer

 :D
Ja Joop, je bent wel heel erg stipt.  :vreegoe: Ik merk dat dat met lisproutines ook wel nodig is. Maar een beginner als ik weet niet altijd hoe je de dingen moet omschrijven omdat je ze nog niet kent. Bedankt voor de moeite. Er zullen ook nog wel meer vragen komen.

Reimer.

HofCAD

#8
Joop, had het programma natuurlijk ook nog korter kunnen maken.

(defun c:test3 (/ Antwoord)
  (initget "Yes No")
  (princ "\nWilt u ook direct plotten?")
  (setq Antwoord (getkword "\nAre you sure? [Yes/No] <Y>: "))
  (cond
    ((= Antwoord "No")(alert "\nDirect plotten is NEE, omdat antwoord No of N of n is"))
    (T (alert "\nDirect plotten is JA, omdat antwoord Yes of Y of y of nil is"))
    )
  (princ)
)


Met vriendelijke groet, HofCAD CSI.

PS1 Indien je niet met getkword wilt werken, en je een dialoogbox wil
hebben kan dat met Yes_no.lsp en de bijbehorende dialoogbox Yes_no.dcl
uit de express tools(C:\Program Files\AutoCAD 200#\Express\Yes_n0.lsp).
In het bovenste geval wordt het dan:
(bns_get_yes_no '("Direct plotten" "Wilt U direct plotten?") '(20 5))
Een Enter of een  klik op Yes levert een 1 op, een Escape of  een klik op No
levert een 0 op.
Zie de bijgevoegde Lisp file voor het voorbeeld in test7.

PS2 Ook de User Interface Functie (acet-ui-txted [text [caption [note]]])
uit acetutil.arx geeft min of meer deze mogelijkheid.
Een Cancel of een Escape levert een nil op, en een OK de tekst.
Zie de bijgevoegde Lisp file voor het voorbeeld in test4.

PS3 Een andere mogelijkheid als je niet met getkword wilt werken, en je een
dialoogbox wil hebben is via een VBA message box(vbYesNo, vbCritical, vbQuestion,
vbExclamation en vbInformation)
Zie de bijgevoegde Lisp file voor voorbeelden in test5.

PS4 Ook de User Interface Functie (acet-ui-message message [caption [type]])
uit acetutil.arx geeft deze mogelijkheden(YesNo, Critical, Question, Exclamation
en Information).
Zie de bijgevoegde Lisp file voor voorbeelden in test6.

PS5 In YesOrNo.lsp staan  Test, Test2, Test3, Test4, Test5, Test6, Test7 en Test8.

ACADcadabra

Joop

Je hebt gelijk HofCAD, het kan altijd korter.
Ikzelf vind het altijd prettiger wat ruimer te programmeren. Het vergemakkelijkt namelijk het "debuggen".
En de code is dan voor anderen beter te lezen/volgen.
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

sschevers

De volgende variant gebruik al tijden

(initget "Y N")
   (if (equal (getkword "\nGa we we plotten? [Yes/No] <Y>:")"N")
      (progn
         (alert "We doen het niet")
      ) ;end progn
      (progn
         (alert "We doen het niet")
      ) ;end progn
   ) ;end if


Is ter info

greetz Stephan

HofCAD

#11
Citaat van: sschevers op ma 05 01 2009, 15:08:17
De volgende variant gebruik al tijden

(initget "Y N")
   (if (equal (getkword "\nGa we we plotten? [Yes/No] <Y>:")"N")
      (progn
         (alert "We doen het niet")
      ) ;end progn
      (progn
         (alert "We doen het niet")
      ) ;end progn
   ) ;end if



Is ter info

greetz Stephan

Beste Stephan,

Ik zie 2 foutjes:
1) Ik kan geen Yes en geen No invoeren.
2) Je krijgt altijd We doen het niet
Als je deze foutjes corrigeert, dan is je programma niet
wezenlijk korter of sneller dan mijn test3.
Echte alternatieven kun je vinden in mijn YesOrNo.lsp

Met vriendelijke groet, HofCAD CSI
ACADcadabra

sschevers

Beste Hofcad,

Wat de betreft fout 2 dat is een gevalletje van copy-past en niet goed nakijken. :cry:
Wat betreft foutje 1: Zelf typ ik zelden tot nooit volledig Yes of No. Maar dat is persoonlijke smaak. Maar je hebt een punt.

stephan