Zobrazit plnou verzi příspěvku: AutoLISP Pomoc

arcHI4
18.11.2017, 17:50
Dobrý deň všetkým,mám jeden problém, ktorý sám neviem vyriešiť kvôli mojej slabej znalosti LISPu v AutoCADE. Potrebujem napísať nasledovné:Užívateľ zadá stred a stranu štvorca. Následne sa ho AutoCAD opýta, či chce kresliť štvorce s menším alebo väčším polomerom a na počet štvorcov. Tie sa potom vykreslia (s pevne daným krokom, napr. 1) každý inou farbou. Pozor na prípad, kedy je dĺžka strany záporná.Našiel by sa tu niekto, kto ovláda LISP a zvládol by niečo podobné ? Veľmi veľmi by ste mi pomohli.Vopred ďakujem.

Vladimír Michl
18.11.2017, 19:06
Asi bude potřeba podrobnější zadání - co je "poloměr čtverce"? co je myšleno krokem a počtem - nějaké pole? jak se mají střídat barvy?

arcHI4
19.11.2017, 13:18
To zadanie je napísané vážne dosť nezrozumiteľne, ale pokúsim sa to nejak zreprodukovať:Celé by sa to malo podľa mňa zaštítiť pod príkazom ''polygon'', s tým, že počet strán bude pevne 4 (aby to bol vždy štvorec), a vždy bude na pevno pokračovať s možnosťou vpisovania kružnice (circumscribed about circle), aby sa vlastne dosiahlo zadávanie toho ''polomeru kružnice''Čiže asi nejaká postupnosť by mohla vyzerať nasledovne:Zadáme príkaz --> (cad si automaticky vyberie polygon a zadá počet strán na 4) --> od nás si vypýta bod odkiaľ bude kresliť dané štvorce ---> (cad automaticky vyberie ''circumscribed about circle'') --> a vypýta si od nás hodnotu, ktorá bude vlastne polomer štvorca ---> tento štvorec sa vykreslíDrúhá časť: cad si vypýta či chceme kresliť štvorce s menším alebo väčším polomerom a potom na ich počet (s pevne daným krokom napr. 1) a každý inou farbou (je úplne jedno aké farby).A treba nejako vyriešiť ešte ten zápor.

arcHI42017-11-19 16:53:31

johny
19.11.2017, 19:16
Někdy je lepší obrázek... Snad jsem to pochopil, jinak si to upravte dle libosti...(vl-load-com)(defun c:Squares ( / *error* adoc pnt rad ckr n i cmd 1+-)  (defun *error* (msg)    (if (not (wcmatch msg "Function cancelled,quit / exit abort,console break,end"))      (princ (strcat "\nError: " msg)))    (if cmd (setvar 'CMDECHO cmd))    (vla-endundomark adoc)    (princ))  (vla-endundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))  (vla-startundomark adoc)    (if (and (setq pnt (getpoint "\nSpecify centre of square: "))    (not (initget (+ 2 3)))    (setq rad (getdist "\nSpecify initial radius: "))    (not (initget 2))    (setq n (getdist (strcat "\nSpecify number of steps (min: -" (itoa (fix rad)) "): ")))    (or (> (+ rad n) 0)        (prompt "\nError: Number of decreasing steps leads radius below zero!"))    (setq 1+- (if (minusp n) 1- 1+) n (abs n)  i 0 clr 1 cmd (getvar 'CMDECHO))    (setvar 'CMDECHO 0)    )    (while (<= (setq i (1+ i)) n)      (command "_.POLYGON" 4 "_non" pnt "_C" rad        "_.CHPROP" "_L" "" "_C" (setq clr (if (= clr 251) 11 (+ clr 10))) "")      (setq rad (1+- rad))))  (*error* "end"))

arcHI4
19.11.2017, 20:38
Je to super ;) mám iba ešte jednu malú prosbu, nevyznám sa vám totižto do toho kódu (to asi do žiadneho) takže neviem čo prepísať.Keď zadávam záporný počet štvorcov (čiže vykresluje dovnútra toho prvého štvorca), tak tá minimálna hodnota trochu nesedí s realitou.Príklad: zadám začiatočný bod, zadám polomer prvého štvorca (povedzme 2), a píše mi, že najmenšia možná hodnota je -2). To znamená že by malo vykresliť ešte jeden štvorec do vnútra (čiže jeho polomer by bol 1).Ale nič sa nevykreslí. Dala by sa ešte táto chybička opraviť, aby vytvorilo to čo na poslednom screen-e ? O:-) Veľmi pekne ďakujem za Váš čas.

johny
20.11.2017, 09:19
Ou, pravdaže. Zkuste to takto.(vl-load-com)(defun c:Squares ( / *error* adoc pnt rad clr n i cmd 1+-)  (defun *error* (msg)    (if (not (wcmatch msg "Function cancelled,quit / exit abort,console break,end"))      (princ (strcat "\nError: " msg)))    (if cmd (setvar 'CMDECHO cmd))    (vla-endundomark adoc)    (princ))  (vla-endundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))  (vla-startundomark adoc)    (if (and (setq pnt (getpoint "\nSpecify centre of square: "))    (not (initget (+ 2 3)))    (setq rad (getdist "\nSpecify initial radius: "))    (not (initget 2))    (setq n (getdist (strcat "\nSpecify number of steps (min: -" (itoa (fix rad)) "): ")))    (or (>= (+ rad n) 0)        (prompt "\nError: Number of decreasing steps leads radius below zero!"))    (setq 1+- (if (minusp n) 1- 1+) n (abs n)  i 0 clr 1 cmd (getvar 'CMDECHO))    (setvar 'CMDECHO 0)    )    (while (<= (setq i (1+ i)) n)      (command "_.POLYGON" 4 "_non" pnt "_C" rad        "_.CHPROP" "_L" "" "_C" (setq clr (if (= clr 251) 11 (+ clr 10))) "")      (setq rad (1+- rad))))  (*error* "end"))

arcHI4
20.11.2017, 09:33
Je to super   Vďaka

arcHI4
23.11.2017, 11:50
Viem, že to bude znieť dosť otravne, ale vedeli by ste/mali by ste čas ten kód iba stručne vysvetliť ? čo ktorý riadok iba tak dvojslovne znamená ?

johny
23.11.2017, 14:41
Snad takto, snad to pomůžeuploads/1045/Squares_-_popis.lsp