Zobrazit plnou verzi příspěvku: Programek v LISP

enddys
26.02.2013, 08:40
Dobrý den,jsem absolutním začátečníkem v programovani LISP. Chtěl bych vytvořit jeden program. Už mám udělanou kostru, ale některé věci netusím jak udělat, proto Vás žádam o pomoc :)Kod:;startup for application ACADM, installed xxxxxxx(princ (load "gen/acadm.lsp" "\nError: acadm.lsp not loaded!"));(if acadmappend (setq s::startup (acadmappend s::startup)))(defun MK3 () (setq b11 (getpoint "\n zadej bod")))(defun cti() (setq x (car b11)) (setq y (cadr b11)) (setq x (rtos x 2 3)) (setq y (rtos y 2 3)) (setq xy (strcat "N"cislo "\" "\X=" x "\ " "\Y=" y)) (write-line xy f))(defun C:M4 () (setq f1 (getstring "\nZadej jméno programu ! { max. osum znak… } :") f1 (strcase f1)) (setq b (strcat "0 Testovací hlavika souboru")) (setq f (strcat "C:/Popis/M4/" f1 ".H")) (setq f (open f "w")) (write-line b f)    (while (< i 4)                                          (MK3)        (cti)        ))Potřebná modifikace je nasledující: U setq xy by se měla za písmenem N mělo zvyšovat číslo (viz. 100, 101, 102 atd.) a druha, ze pokud bude během nacitani bodu zmačknuto pismeno R, vyskoci okno s požadavkem na zadání radiusu a pote bude nacitani bodu dal pokracovat.Děkuji za veškeré rady.

Vladimír Michl
26.02.2013, 08:51
Těch zádrhelů k řešení tam ještě bude více, ale navyšování předem nastaveného čísla vyřeší:
[CODE]... (strcat "N" (itoa (setq cislo (1+ cislo))) ... [/CODE]
 
Přerušování smyčky stiskem znaku je trochu složitější, ale pokud se nebojíte výzkumů, mrkněte se na funkci (grread).

enddys
26.02.2013, 09:23
když pouziji Váš kod, vyhodi mi to chybu: "chyba: chybný typ argumentu: numberp: nil" :(

alfred
26.02.2013, 09:33
[QUOTE=enddys].... pokud bude během nacitani bodu zmačknuto pismeno R, vyskoci okno s požadavkem na zadání radiusu a pote bude nacitani bodu dal pokracovat.Děkuji za veškeré rady.[/QUOTE]1. Radím - vzdejte se okna (dialog) - je to zbytečná komplikace. Stačí volba na příkazové řádce.2. nezapoměňte na uzavření souboru (close f) a to i v případě, že funkce zkonší chybou (viz funkce *error* )2. Zkuste popsat co má být cílem LISPu. Třeba už to někdo někdy řešil a nemusíte to programovat. Nebo Vám tady doporučí zcela jiný postup...

enddys
26.02.2013, 09:40
dekuji za upozorneni, close f jsem uz zadefinoval, a co se tyká pouzitelnosti programu, ma za úkol z technického vykresu nacitat souradnice a radiusy. Jde o to, ze ne vždy tam je raius, aproto by bylo nejlepší, kdyby si dialog pro zadaní radiusu vyvoval uživatel

alfred
26.02.2013, 09:52
[QUOTE=enddys]dekuji za upozorneni, close f jsem uz zadefinoval, a co se tyká pouzitelnosti programu, ma za úkol z technického vykresu nacitat souradnice a radiusy. Jde o to, ze ne vždy tam je raius, aproto by bylo nejlepší, kdyby si dialog pro zadaní radiusu vyvoval uživatel[/QUOTE]Ale souřadnice čeho a proč? Z čeho určujete rádius?

enddys
26.02.2013, 09:59
jedna se o výkresy nástroju pro výrobky. Uživatel si na výkresu nakliká body, které potřebuje a radiusy, které jsou ve výkresu zapsany, a program by je mel zapsat do dokumentu. V podstate se jedna o usnadnění PP., aby nemuseli v nastrojárně přepisovat velike množství cisel

alfred
26.02.2013, 10:24
Jedná se tedy o body, které jsou vždy na křivkách apod.? Rádius je zapsán v textu?Nebylo by jednodušší do bodů navkládat bloky s atributem a číslem pořadí, stejně tak rádius popsat blokem s atributem a pak použít extrahování atributů? Pro rozmístění bodů po křivce existují utility, které samy číslují. Velká výhoda je, že při modifikaci výkresu jen posunete bloky a můžete exportovat znovu - není nutné vše znovu odklikávat. Dále máte kontrolu, že se například neukliknete mimo správný bod (například špatným chycením).

Vladimír Michl
26.02.2013, 10:53
[QUOTE=enddys]když pouziji Váš kod, vyhodi mi to chybu: "chyba: chybný typ argumentu: numberp: nil" :([/QUOTE]
 
Velmi pravděpodobně nemáte to "cislo" předem nastavené - tedy např.:
[CODE](setq cislo 1)[/CODE]
 

enddys
26.02.2013, 10:58
po dekladaci (setq cislo 1), chyba chyba: chybná funkce: 1,aneb stejný problém, jako když jsem postupovat podle návodu na internetu. Dle mého testovani je chybná funkce: 1 (kdy číslo je rovno číslu, které je zadano zde: (setq cislo (1 + cislo))

alfred
26.02.2013, 11:22
[QUOTE=enddys]po dekladaci (setq cislo 1), chyba chyba: chybná funkce: 1,aneb stejný problém, jako když jsem postupovat podle návodu na internetu. Dle mého testovani je chybná funkce: 1 (kdy číslo je rovno číslu, které je zadano zde: (setq cislo (1 + cislo))[/QUOTE]Pozor na mezery! Název funkce je "1+" ne "1 +"(1+ číslo) Můžete použít i obyčejné sčítání(setq a 0)(setq a (+ a 1))

enddys
26.02.2013, 12:01
jaj udelal jsem tam nechtene mezeru, ted uz přičítaní jde, nicméně to přičte tu jedničku pouze 1x:(while (< i 4)                  (itoa (setq cislo (1+ cislo)))                       (MK3)        (cti)        )Vystup:;ROLNART102N101 G1 X-300.137 Z-190.877N101 G1 X-317.067 Z-157.284N101 G1 X-349.492 Z-160.155N101 G1 X-350.352 Z-186.571

Vladimír Michl
26.02.2013, 12:44
Předpokládám, že ten výstup čísla chcete v oné funkci (strcat), nikoliv jen tak volně ve smyčce.

enddys
26.02.2013, 12:51
[QUOTE=Vladimír Michl] Předpokládám, že ten výstup čísla chcete v oné funkci (strcat), nikoliv jen tak volně ve smyčce.[/QUOTE] již všechno funguje, největší problémy mi delali ty syntaxe, z C++ jsem zvykly házet to "kde me napadne". Dekuji všem za užitecne informace