Zobrazit plnou verzi příspěvku: n-krát
michaelflyer
23.10.2007, 16:22
Dobrý deň.
Neviem si rady v LIPe s funkciou opakovať niečo n krát....
Napr.: Zadám hodnoty výšok, n1 až nk. Potom chcem robiť _offset n1 až nk. k= „nekonečno“
Alebo nanášanie kružníc na priamku v rôznych vzdialenostiach n1 až nk.
Vopred ďakujem.
Vladimír Michl
23.10.2007, 16:55
Těch funkcí pro cyklus je v LISP vícero - např. repeat, while, foreach (viz Nápověda)
michaelflyer
24.10.2007, 12:36
Neviem ako by to malo vlastne vyzerať. Prosím vás mohli by ste mi dať cestu na ten návod? Nejako sa tu moc dobre nevyznám.
Ďakujem...
Vladimír Michl
24.10.2007, 13:52
"Návod na programování" neumím, ale cyklus má vypadat např. takto:
(repeat 37
(command "XY" ....)
)
Základní příklady a pomoc najdete v nápovědě nebo v online příručce Programování AutoCADu (vývojové prostředky).
michaelflyer
05.11.2007, 16:27
Dobrý deň.
Nejako som to pochopil (hádam)...
Len mám problém s while :-(
Vyhlasuje mi po to:
; error: bad argument type: lselsetp nil
a už mi nechce opakovať „výber“...
(defun c:ko ()
(progn
(setq f (open "F:\\kusovník.txt" "W"))
(while (/= vyber "")
(progn
(initget 1 "M S")
(setq vyber (getkword "\nZadaj prvok [Madlo,Stlp]:"))
(if (= vyber "M")
(progn
(princ "\n" f)
(princ "MADA" f)
)
)
(if (= vyber "S")
(progn
(princ "\n" f)
(princ "STLPY" f)
)
)
(while (and (/= nazov "") (/= rozmer ""))
(progn
(prompt "\nVyber nazov dielca:")
(setq nazov (ssget))
(prompt "\nVyber nazov dielca:")
(setq rozmer (ssget))
(setq entita1 (ssname nazov 0))
(setq zoznam_ent1 (entget entita1))
(setq a (cdr (assoc 1 zoznam_ent1)))
(setq entita2 (ssname rozmer 0))
(setq zoznam_ent2 (entget entita2))
(setq a (cdr (assoc 42 zoznam_ent2)))
(princ "\n" f)
(princ a f)
(princ " " f)
(princ b f)
)
)
)
)
(close f)
)
)
Ferdinand
06.11.2007, 11:26
Až tak moc to s lispem neumím, ale nemělo by být
(while (and ((/= nazov "") (/= rozmer "")))
Co znamená "b" v řádku
(princ b f)
Ferdinand2007-11-06 11:27:14
michaelflyer
06.11.2007, 15:21
Ďakujem....to b...
Našli ste mi ďalšiu chybu.
(setq entita2 (ssname rozmer 0))
(setq zoznam_ent2 (entget entita2))
(setq a (cdr (assoc 42 zoznam_ent2))) ;;;TU MABYT NAMIESTO "a" "b".
Ale vrátim sa k:
(while (and ((/= nazov "") (/= rozmer "")))
toto mi nechce vobez zobrať. vyhlasuje mi to chybu
Možno to má niečo spoločné so (ssget)
Ferdinand
06.11.2007, 16:29
Zkusit ten cyklus pomocí příkazu foreach
...anebo (nevím, jestli to takhle lze dohromady)
(while (if (and (....))))Ferdinand2007-11-06 16:31:25
michaelflyer
06.11.2007, 20:47
Problém je v tom že while testuje podmienku (ak podmienka nevyhovuje príkazy sa opakuje). Ale foreach zase vyberá každý prvok zo zoznamu a opakuje danú funkciu naň.
Ja si neviem predstaviť ako by to malo robiť na túto funkciu:
(prompt "\nVyber nazov dielca:")
(setq rozmer (ssget))
(setq entita2 (ssname rozmer 0))
(setq zoznam_ent2 (entget entita2))
(setq a (cdr (assoc 42 zoznam_ent2)))
Mysleli ste asi na funkciu princ, ktorú by mi opakovalo. Lenže to by som musel nejako vytvoriť zoznam vybraných položiek. A to je problém, pretože sú typu a1 až an....
Ja som tiež len začiatočník...
michaelflyer
17.03.2008, 11:26
Dobrý deň.
Prosím Vás o radu. Dávam sem jednoduchý príklad. Nechápem prečo mi to nefunguje :-( Viem, že mi tam niečo chýba, ale neviem sa dopracovať k tomu, že čo :-(
Chcem dosiahnuť aby mi pripočítalo 0.1 k hodnote "a" až do vtedy (sa to bude opakovať), pokiaľ sa nebude "=" hodnote "b".
(defun c:OPAKUJ ()
(setq a (getreal "n\Zadaj hodnotu (a) ktorá je väčšia ako b:"))
(setq b (getreal "n\Zadaj hodnotu (b) ktorej sa to má rovnať:"))
(if (/= a b)
(progn
(while (= a b)
(setq a (+ a 0.1))
(princ a)
)
)
)
)
Vopred Ďakujem.
Vladimír Michl
17.03.2008, 12:05
Pro porovnávání reálných čísel není vhodné při programování testovat přesnou shodu (či neshodu) - dochází k zaokrouhlování reprezentace hodnoty. Použijte > nebo >=.
chlebovsky
17.03.2008, 13:41
začnu od začátku, taková malá chybička v zadávání, a) musí být menší jako b)
dále na začátku né n\ ale \n naopak pro nový řádek
pak if (< a b)
ale hlavně
While = dokud je splněna podmínka.
To znamená že vy potřebujete aby probíhalo tak dlouho dokud a < b
popř. a <= b
takže napsat
(while (<= a b)
pak fungovat bude
a možná na konec bych dal (princ a)(princ "\n")
nebo rovnou (princ (strcat "\nHodnota je : " (rtos a 2 2)))
michaelflyer
18.03.2008, 11:10
To len jeden znak mi tam chýbal?! Mňa šľak trafí!!! Ja sa stým mordujem jeden celý deň a nechápal som prečo to nefunguje!
Ďakujem za pomoc.
Ďakujem aj za opravu „drobných“ chýb. Zbáchal som to narýchlo. Samozrejme, že ma to neospravedlňuje :-)
Ešte raz ďakujem...