CADsite forum

AutoCAD => Autolisp => Topic gestart door: Reimer op ma 15 03 2010, 11:34:50

Titel: hoe maak ik een keuzemogelijkheid op de commandoregel
Bericht door: Reimer op ma 15 03 2010, 11:34:50
Beste cadcollega's,

ik ben bezig met een lisproutine om hellingen te tekenen. Hierbij wil ik het verloop laten afhangen van de gebuikersinput.
Een vast uitgangspunt is een wielbasis van 2.70 en een te kiezen Punt1.
Nu wil ik graag dat de gebruiker zonder meer verder kan gaan door een Punt2 aan te klikken of door bewust te kiezen voor de opties Wielbasis of Lengte. Na het klikken van Punt1 heb ik dus 4 mogelijkheden bij de 2e stap (zie bijgaande code).
Mijn vraag is hoe ik onderscheid kan maken tussen een gekozen punt of een opgegeven hoogte?

Reimer

(defun c:Helling ()
  (setq WB 2.7)
  (princ (strcat "\nHELLING. Wielbasis = 2.70"))
  (setq P1 (getpoint "\nSelecteer punt 1: "))
  (setq P2 ("\nSelecteer punt 2 of geef een hoogte op [Wielbasis/Lengte]: "));;HOE MOET IK DEZE REGEL MAKEN??
  (cond
    ((= P2 "W")(princ "start PROG W"))
    ((= P2 "L")(princ "start PROG L"))
    ((= P2 punt)(princ "start PROG P"));;HOE BEPAAL IK HET VERSCHIL TUSSEN EEN PUNT OF EEN LENGTE??
    ((= P2 hoogte)(princ "start PROG H"))
  )
)
Titel: Re:hoe maak ik een keuzemogelijkheid op de commandoregel
Bericht door: roy_043 op ma 15 03 2010, 14:18:24
Volgens mij is het niet mogelijk om te onderscheiden tussen punt-invoer en lengte-invoer.
Je kunt wel onderscheiden tussen keywords, punt-invoer en Enter:
(defun c:Helling ( / P1 P2)
  (setq WB 2.7)
  (princ "\nHELLING. Wielbasis = 2.70")
  (setq P1 (getpoint "\nSelecteer punt 1: "))
  (initget "Wielbasis Lengte")
  (setq P2 (getpoint P1 "\nSelecteer punt 2 of [Enter = Hoogte opgeven/Wielbasis/Lengte]: "))
  (cond
    ((= P2 "Wielbasis")(princ "start PROG W"))
    ((= P2 "Lengte")(princ "start PROG L"))
    ((= (type P2) 'list)(princ "start PROG P"))
    ((not P2)(princ "start PROG H"))
  )
)


Een alternatief kan zijn om de y-coördinaat van punt 2 te vergelijken met die van punt 1. Is het verschil 0 dan wil/moet de de gebruiker een hoogte opgeven (nadat hij de lengte tussen punt 1 en 2 heeft bevestigd).
Titel: Re:hoe maak ik een keuzemogelijkheid op de commandoregel
Bericht door: Reimer op ma 15 03 2010, 14:47:49
Beste Roy,

bedankt voor je antwoord. Ik was er al bang voor dat dit niet zou kunnen. Ik bedacht me net dat het commando Offset wel een punt óf afstand accepteert.
Ondertussen was ik al naar een andere opzet overgegaan. Opgave van een lengte is nu het uitgangspunt. Ik zat alleen even te stoeien met de controle op Enter of niet bedoelde tekst (anders dan P/W/L).
De lengte halen uit het verschil tussen punt1 en punt2 is niet de bedoeling. Dit moet een heel andere functie worden.
Het gebruik van Enter voor een vooringestelde optie vindt ik wel erg handig. Ik ga hier de optie Punt2 aan koppelen.

Reimer.

(defun c:Helling ()
  (setq WB 2.7)
  (princ (strcat "\nHELLING. Wielbasis = 2.70"))
  (setq P1 (getpoint "\nSelecteer punt 1: "))
  (setq P2 (getstring "\nGeef een hoogte op of [Punt2/Wielbasis/Lengte]<Punt2>: "))
  (cond
    ((OR(= P2 "")(= P2 "P")(= P2 "p")(= P2 "Punt2")(= P2 "punt2"))(princ "start PROG P"))
    ((OR(= P2 "W")(= P2 "w")(= P2 "wielbasis")(= P2 "Wielbasis"))(princ "start PROG W"))
    ((OR(= P2 "L")(= P2 "l")(= P2 "lengte")(= P2 "Lengte"))(princ "start PROG L"))
    ((= (distof P2 2) nil)(princ "Geen juiste invoer -EINDE- "))
    ((/= (distof P2 2) nil)(princ "start PROG H"))
  )
)
Titel: Re:hoe maak ik een keuzemogelijkheid op de commandoregel
Bericht door: roy_043 op ma 15 03 2010, 15:13:27
In dat geval zou ik de combinatie initget en getdist benutten:
(defun c:Helling ( / P1 P2)
  (setq WB 2.7)
  (princ "\nHELLING. Wielbasis = 2.70")
  (setq P1 (getpoint "\nSelecteer punt 1: "))
  (initget "Wielbasis Lengte")
  (setq P2 (getdist "\nGeef hoogte of [Enter = 2e punt opgeven/Wielbasis/Lengte]: "))
  (cond
    ((= P2 "Wielbasis")(princ "start PROG W"))
    ((= P2 "Lengte")(princ "start PROG L"))
    ((numberp P2)(princ "start PROG H"))
    ((not P2)(princ "start PROG P"))
  )
)
Titel: Re:hoe maak ik een keuzemogelijkheid op de commandoregel
Bericht door: Reimer op ma 15 03 2010, 16:08:03
Dat is inderdaad weer wat korter en voorkomt onjuiste invoer. Bedankt!  :vreegoe:

Reimer
Titel: Re:hoe maak ik een keuzemogelijkheid op de commandoregel
Bericht door: Reimer op ma 15 03 2010, 17:29:59
Ik kreeg de routine nog niet aan het werken. Het lijkt mij dat ik voor P2 geen getal kan opgeven, het resultaat is dan namelijk nil. Komt dit door initget? In dat geval moet ik weer teruggaan naar mijn eigen optie met COND.

Reimer
Titel: Re:hoe maak ik een keuzemogelijkheid op de commandoregel
Bericht door: roy_043 op ma 15 03 2010, 23:16:15
Het kan zijn dat Bricscad op dit punt niet helemaal compatibel is met AutoCAD.
Probeer dit:
(initget "Wielbasis Lengte")
te vervangen door dit:
(initget 128 "Wielbasis Lengte")

(Ik neem aan dat jij met "resultaat" de return value van (setq P2 ... ) bedoelt en niet de return value van de hele functie.)
Titel: Re:hoe maak ik een keuzemogelijkheid op de commandoregel
Bericht door: Reimer op di 16 03 2010, 09:06:43
 :oops: Sorry, de fout lag bij mij.
Er zat ergens een foutje in mijn overige code. Deze probeer ik altijd op te sporen door de lisproutine in stappen in acad te laden en vervolgens de variabelen te controleren door bijvoorbeeld !P2 op de commandoregel op te geven. Omdat jij de variabelen netjes gedeclareerd had krijg ik altijd P2 = nil. De code werkt dus gewoon goed (en ik heb mijn foutje alweer gevonden).

Reimer