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...