yoin

Lyrix

Hoi mensen.

Ik ben weer aan het lispen geslagen voor een tool te bouwen.
Ik loop alleen tegen een probleempje aan.
Als ik een if comando heb moet ie daarna 3 waardes definieren.
Bij 1 waarde werkt het, maar zet ik er 2 achter geeft de lisp een fout melding.

De volgende regel werkt:

(if (= ip "70 x 70 x 4")(setq dsa 70))

De volgende regen werkt niet:

(if (= ip "70 x 70 x 4")(setq dsa 70)(setq dsd 4)(setq hk1 0))

Wat ik wil bereiken is dat als ip 70 x 70 x 4 is, hij de 3 waardes definieert.
Iemand een oplossing?





H@rm

Citaat van: Lyrix op do 24 09 2009, 11:34:36
De volgende regel werkt:

(if (= ip "70 x 70 x 4")(setq dsa 70))

De volgende regen werkt niet:

(if (= ip "70 x 70 x 4")(setq dsa 70)(setq dsd 4)(setq hk1 0))

Wat ik wil bereiken is dat als ip 70 x 70 x 4 is, hij de 3 waardes definieert.
Iemand een oplossing?



Lyrix,

Je moet daarvooer gebruikmaken van een progn.

(if (= ip "70 x 70 x 4")
  (progn
    (setq dsa 70)
  );progn waar
  (progn
    (setq dsd 4)
    (setq hk1 0)
  );progn niet waar
);if

Als je maar 1 ding in te stellen hebt, zoals bij progn waar mag je het ook laten vervallen.

Michel
Acad 10 t/m 2015
Revit 2010 t/m 2015
autodidact lisp

roy_043

Op het antwoord van H@rm is niets af te dingen. Maar je kunt ook dit doen:
(if (= ip "70 x 70 x 4")(setq dsa 70 dsd 4 hk1 0))

Waarbij ik voor de leesbaarheid liever deze opmaak gebruik:
(if (= ip "70 x 70 x 4")
(setq
dsa 70
dsd 4
hk1 0
)
)

Lyrix

#3
Mannen, beide oplossingen werken!

Ik heb gekozen voor de laatste om het script compacter te houden.
Dit omdat er heel veel opties in het selectie menu komen.

(if (= ip "70 x 70 x 4")(setq dsa 70 dsd 4 hk1 0))
(if (= ip "80 x 80 x 4")(setq dsa 80 dsd 4 hk1 0))

Ik wist niet dat je verschillende setq variabelen mocht samenvoegen in 1 regel.
Dacht altijd dat dit appart moest.
Dit maakt veel andere dingen weer duidelijk! Top bedankt.

Dit stukje script zal onderdeel gaan uitmaken van een lisp om staal profielen 3d uit te tekenen.
waaronder koker, HEM HEB HEA UNP enz...
Als die klaar is zal ik em hier posten.

Voor dit probleem, slotje opgelost!





roy_043

Citaat van: Lyrix op do 24 09 2009, 12:29:25
...heel veel opties in het selectie menu komen.

Het gebruik van cond is dan logischer:
(cond
((= optie "Rond")
(princ "\nU koos voor rond. ")
(setq radius 3.0)
)
((= optie "Vierkant")
(princ "\nU koos voor vierkant. ")
(setq zijde 5.5)
)
((= optie "Driehoek")
(princ "\nU koos voor driehoek. ")
(setq zijde 6.0)
)
)


De voordelen van cond:

  • Als een statement wordt gevonden dat waar is, dan wordt het bijbehorende functieblok uitgevoerd en wordt de rest van de cond overgeslagen. De lisp wordt hierdoor efficiĆ«nter dan bij het gebruik van if.
  • Je hoeft progn niet te gebruiken.

Hetzelfde herschreven met if:
(if (= optie "Rond")
(progn
(princ "\nU koos voor rond. ")
(setq radius 3.0)
)
)
(if (= optie "Vierkant")
(progn
(princ "\nU koos voor vierkant. ")
(setq zijde 5.5)
)
)
(if (= optie "Driehoek")
(progn
(princ "\nU koos voor driehoek. ")
(setq zijde 6.0)
)
)

Lyrix

#5
Klopt inderdaad.
Door de tip van roy_043 kwam ik op het idee om de if functie er uit te gooien en de variabelen bij een eerder stukje al te definieren. Dat scheelt weer een hoop code.

Het stukje ziet er momenteel zo uit:

(defun do_set_ip_HEA()
   (cond
   ( (= ip_no 0)  (setq ip "HEA 100" lna 96 lnb 100 lnc 5 lnd 8 lne 12 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 1)  (setq ip "HEA 120" lna 114 lnb 120 lnc 5 lnd 8 lne 12 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 2)  (setq ip "HEA 140" lna 133 lnb 140 lnc 5.5 lnd 8.5 lne 12 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 3)  (setq ip "HEA 160" lna 152 lnb 160 lnc 6 lnd 9 lne 15 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 4)  (setq ip "HEA 180" lna 171 lnb 180 lnc 6 lnd 9.5 lne 15 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 5)  (setq ip "HEA 200" lna 190 lnb 200 lnc 6.5 lnd 10 lne 18 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 6)  (setq ip "HEA 220" lna 210 lnb 220 lnc 7 lnd 11 lne 18 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 7)  (setq ip "HEA 240" lna 230 lnb 240 lnc 7.5 lnd 12 lne 21 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 8)  (setq ip "HEA 260" lna 250 lnb 260 lnc 7.5 lnd 12.5 lne 24 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 9)  (setq ip "HEA 280" lna 270 lnb 280 lnc 8 lnd 13 lne 24 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 10)  (setq ip "HEA 300" lna 290 lnb 300 lnc 8.5 lnd 14 lne 27 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 11)  (setq ip "HEA 320" lna 310 lnb 320 lnc 9 lnd 15.5 lne 27 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 12)  (setq ip "HEA 340" lna 330 lnb 340 lnc 9.5 lnd 16.5 lne 27 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 13)  (setq ip "HEA 360" lna 350 lnb 360 lnc 10 lnd 17.5 lne 27 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 14)  (setq ip "HEA 400" lna 390 lnb 400 lnc 11 lnd 19 lne 27 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 15)  (setq ip "HEA 450" lna 440 lnb 450 lnc 11.5 lnd 21 lne 27 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 16)  (setq ip "HEA 500" lna 490 lnb 500 lnc 12 lnd 23 lne 27 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 17)  (setq ip "HEA 550" lna 540 lnb 550 lnc 12.5 lnd 24 lne 27 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 18)  (setq ip "HEA 600" lna 590 lnb 600 lnc 13 lnd 25 lne 27 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 19)  (setq ip "HEA 650" lna 640 lnb 650 lnc 13.5 lnd 26 lne 27 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 20)  (setq ip "HEA 700" lna 690 lnb 700 lnc 14.5 lnd 27 lne 27 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 21)  (setq ip "HEA 800" lna 790 lnb 800 lnc 15 lnd 28 lne 30 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 22)  (setq ip "HEA 900" lna 890 lnb 900 lnc 16 lnd 30 lne 30 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 23)  (setq ip "HEA 1000" lna 990 lnb 1000 lnc 16.5 lnd 31 lne 30 hk1 0)   (set_tile "ip" ip)  )
   )

De opties worden straks in een dcl menu zichtbaar waaruit je kan selecteren.

bart

wordt een leuk stukje code denk is maar kijk je boekje er nog even op na
vanaf HEA300 blijft het profiel 300 mm breed.
Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

Lyrix

#7
Scherp opgemerkt.
Ik zag het ook inderdaad. Ik heb deze bovenstaande waardes van iemand anders over genomen uit een data bestand.
Toen ik op internet de catalogus opzocht zag ik inderdaad dat de profielen niet breeder werden dan 300.
Vond het al vreemd een balk van een meter breed. Onderstaande waardes komen rechtstreeks uit de catalogus.

Ik heb de waardes nu ook 2 decimalen gegeven.
In sommige gevallen tekende de lisp de profielen groter dan in dat ze in werkelijkheid waren.
Na het gebruik van 2 decimalen was dat verdwenen.


(defun do_set_ip_HEB()
   (cond
   ( (= ip_no 0)  (setq ip "HEB 100" lna 100.00 lnb 100.00 lnc 6.00 lnd 10.00 lne 12.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 1)  (setq ip "HEB 120" lna 120.00 lnb 120.00 lnc 6.50 lnd 11.00 lne 12.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 2)  (setq ip "HEB 140" lna 140.00 lnb 140.00 lnc 7.00 lnd 12.00 lne 12.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 3)  (setq ip "HEB 160" lna 160.00 lnb 160.00 lnc 8.00 lnd 13.00 lne 15.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 4)  (setq ip "HEB 180" lna 180.00 lnb 180.00 lnc 8.50 lnd 14.00 lne 15.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 5)  (setq ip "HEB 200" lna 200.00 lnb 200.00 lnc 9.00 lnd 15.00 lne 18.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 6)  (setq ip "HEB 220" lna 220.00 lnb 220.00 lnc 9.50 lnd 16.00 lne 18.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 7)  (setq ip "HEB 240" lna 240.00 lnb 240.00 lnc 10.00 lnd 17.00 lne 21.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 8)  (setq ip "HEB 260" lna 260.00 lnb 260.00 lnc 10.00 lnd 17.50 lne 24.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 9)  (setq ip "HEB 280" lna 280.00 lnb 280.00 lnc 10.50 lnd 18.00 lne 24.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 10)  (setq ip "HEB 300" lna 300.00 lnb 300.00 lnc 11.00 lnd 19.00 lne 27.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 11)  (setq ip "HEB 320" lna 320.00 lnb 300.00 lnc 11.50 lnd 20.50 lne 27.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 12)  (setq ip "HEB 340" lna 340.00 lnb 300.00 lnc 12.00 lnd 21.50 lne 27.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 13)  (setq ip "HEB 360" lna 360.00 lnb 300.00 lnc 12.50 lnd 22.50 lne 27.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 14)  (setq ip "HEB 400" lna 400.00 lnb 300.00 lnc 13.50 lnd 24.00 lne 27.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 15)  (setq ip "HEB 450" lna 450.00 lnb 300.00 lnc 14.00 lnd 26.00 lne 27.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 16)  (setq ip "HEB 500" lna 500.00 lnb 300.00 lnc 14.50 lnd 28.00 lne 27.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 17)  (setq ip "HEB 550" lna 550.00 lnb 300.00 lnc 15.00 lnd 29.00 lne 27.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 18)  (setq ip "HEB 600" lna 600.00 lnb 300.00 lnc 15.50 lnd 30.00 lne 27.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 19)  (setq ip "HEB 650" lna 650.00 lnb 300.00 lnc 16.00 lnd 31.00 lne 27.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 20)  (setq ip "HEB 700" lna 700.00 lnb 300.00 lnc 17.00 lnd 32.00 lne 27.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 21)  (setq ip "HEB 800" lna 800.00 lnb 300.00 lnc 17.50 lnd 35.00 lne 30.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 22)  (setq ip "HEB 900" lna 900.00 lnb 300.00 lnc 18.50 lnd 35.00 lne 30.00 hk1 0)   (set_tile "ip" ip)  )
   ( (= ip_no 23)  (setq ip "HEB 1000" lna 1000.00 lnb 300.00 lnc 19.00 lnd 36.00 lne 30.00 hk1 0)   (set_tile "ip" ip)  )
   )
)


HofCAD

#8
Citaat van: Lyrix op ma 28 09 2009, 08:26:28

Ik heb de waardes nu ook 2 decimalen gegeven.
In sommige gevallen tekende de lisp de profielen groter dan in dat ze in werkelijkheid waren.
Na het gebruik van 2 decimalen was dat verdwenen.

Beste Lyrix,

Dat komt waarschijnlijk door een of meer delingen.
(setq x (/ 5 2)) ;geeft 2
(setq x (/ 5.0 2)) ;geeft 2.5

Met vriendelijke groet, HofCAD CSI.

PS Ook http://www.cadsite.be/smf/index.php?topic=3086.msg15854#msg15854 al gezien
ACADcadabra

Lyrix

#9
Ja het rare is dat dat juist wel goed stond.
In het voorbeeld wat ik gebruikt heb werden de getallen eerst uit een excel tabel gelezen.
Deze hadden als cel-eigenschap getallen met 2 decimalen.
Als ik hele getallen definieerde tekende de lisp het profiel te groot. Het verschil zat em in de afronding.
Nu met de 2 decimalen gedefinieerd tekent de lisp het profiel correct.

Citaat van: HofCAD op ma 28 09 2009, 11:49:08
PS Ook http://www.cadsite.be/smf/index.php?topic=3086.msg15854#msg15854 al gezien

Ik heb even gekeken. Ik kan die steel.lsp niet zomaar downloaden. Moet me eerst registreren.
Zal vanavond thuis even kijken. Is dit ook een tool om profielen 3d uit te tekenen?



(if (> lna 300) ;helling in relatie tot hoogte
(setq perc 0.05)
(setq perc 0.08)
)
(setq ds1 (- (/ lnd perc) (* 0.5 lnb)))
(setq ds2 (/ (+ (* 2.0 ds1 perc) (sqrt (+ (* 4.0 (expt ds1 2) (expt perc 2))
(* 4.0 (expt ds1 2))))) 2.0))
(setq ds3 (sqrt (/ (expt lnd 2) (+ 1 (/ 1 (expt perc 2))))))
(setq ds4 (+ lnb ds1 ds3 (- lnc) (- lnd)))
(setq ds5 (* perc ds4))
(setq ds6 (sqrt (+ (expt ds5 2) (expt ds4 2))))
(setq ds7 (/ ds3 perc))
(setq hk2 (+ hk1 (* 0.5 pi)))
(setq hkd2 (/ (* 180.0 hk2) pi))
(setq pt2 (polar pt1 hk1 lnb))
(setq pt3 (polar pt2 hk1 ds1))
(setq pt4 (polar pt3 (- (+ pi hk1) (atan perc)) ds2))
(setq pt5 (polar pt3 (- (+ pi hk1) (atan perc)) ds6))
(setq pt6 (polar pt1 (+ hk1 (atan (/ (+ ds5 ds7) lnc)))
(sqrt (+ (expt lnc 2) (expt (+ ds5 ds7) 2)))))
(setq pt7 (polar pt6 hk2 (- lna (* 2 (+ ds5 ds7)))))
(setq pt8 (polar pt7 (+ hk1 (atan (/ ds7 (- lnd ds3))))
(sqrt (+ (expt ds7 2) (expt (- lnd ds3) 2)))))
(setq pt9 (polar pt8 (+ hk1 (atan perc)) (- ds6 ds2)))
(setq pt11 (polar pt1 (+ hk1 (atan (/ lna lnb)))
(sqrt (+ (expt lna 2) (expt lnb 2)))))
(setq pt12 (polar pt11 (+ pi hk1) lnb))



   

Lyrix

Ik heb de steel lisp geprobeerd.
Deze word niet 3d getekend.

FastFiber