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

Petrš
09.04.2009, 22:30
Dobry den.
Potřeboval bych poradit s programkem.
Program by mel po urceni bodu a prumeru D1
1,Nabreslit kruznici o zadanem prumeru D1.
2,V tom samem bode nakreslit kruznici o prumeru D2=D1*1,7.
3,Nakreslit sestiuhelnik ktery bude opisovat kruznici o prumeru D2.
Hlavni problem mi dela vypocet prumeru D2,
pokusil sem se neco napsat ale jenom na papir.

svarc.vl
10.04.2009, 06:17
budete potřebovat příkazy pro zadání (získání)bodu a pak budete využívat příkazy autocadu. Lisp používá pro výpočty jinou logiku, že zadáte funkci a pak proměnné). pro zápis do proměnné je funkce setq  takže příklad:
zadání hodnoty do proměnné
(setq d1 50.0)
 
získání bodu
(setq bod (getpoint "výběr bodu:"))
nakreslení kružnice, postupojete jako by jste psal hodnoty místo do příkazové řádky tak je píšete za příkaz command, pevné hodnoty do uvozovek proměnné bez nich
 
(command "_circle" bod "D" d1 )
pro výpočet d2 pak máte
(setq d2 (* d1 1,7))
 
pokud píšeteprogram ve visual lispu v autocadu menu pomůcky -> autolisp ->editor a napíšete příkaz tak se vám označí modře  vy po najetí kurzoru na něj a stisknutí CTRL+F1 dostanete nápovědu a příklady k němu

chlebovsky
10.04.2009, 08:55
K přístupu do prostředí programování můžete použít i příkaz "vlide".Ale k problémuTady to je :(defun c:pokus (/ cen rad1 rad2 cir1 cir2 pol pb1 pb2 pb3 pb4 pb5 pb6)  (setq cen (getpoint "\nZadej střed kružnice"))  (if cen    (progn      (setq rad1 (getdist cen "\nZadej poloměr kružnice :"))      (if rad1    (progn      (setq rad2 (* 1.7 rad1))      (setq cir1 (entmake (list (cons 0 "CIRCLE")(cons 10 cen)(cons 40 rad1))))      (setq cir2 (entmake (list (cons 0 "CIRCLE")(cons 10 cen)(cons 40 rad2))))      (setq pb1 (list (cons 10 (list (car (polar cen (* pi 0.000) rad2))(cadr (polar cen (* pi 0.000) rad2))))(cons 40 0.0)(cons 41 0.0)(cons 42 0.0)))      (setq pb2 (list (cons 10 (list (car (polar cen (* pi 0.333) rad2))(cadr (polar cen (* pi 0.333) rad2))))(cons 40 0.0)(cons 41 0.0)(cons 42 0.0)))      (setq pb3 (list (cons 10 (list (car (polar cen (* pi 0.666) rad2))(cadr (polar cen (* pi 0.666) rad2))))(cons 40 0.0)(cons 41 0.0)(cons 42 0.0)))      (setq pb4 (list (cons 10 (list (car (polar cen (* pi 1.000) rad2))(cadr (polar cen (* pi 1.000) rad2))))(cons 40 0.0)(cons 41 0.0)(cons 42 0.0)))      (setq pb5 (list (cons 10 (list (car (polar cen (* pi 1.333) rad2))(cadr (polar cen (* pi 1.333) rad2))))(cons 40 0.0)(cons 41 0.0)(cons 42 0.0)))      (setq pb6 (list (cons 10 (list (car (polar cen (* pi 1.666) rad2))(cadr (polar cen (* pi 1.666) rad2))))(cons 40 0.0)(cons 41 0.0)(cons 42 0.0)))      (setq pol (append (list (cons 0 "LWPOLYLINE")(cons 100 "AcDbEntity")(cons 100 "AcDbPolyline")(cons 90 6)(cons 70 1)(cons 43 0.0)(cons 38 0.0)(cons 39 0.0)) pb1 pb2 pb3 pb4 pb5 pb6 (list (cons 210 (list 0.0 0.0 1.0)))))      (setq pol (entmake pol))    )    (alert "Nebyl zadán poloměr kružnice !")      )    )    (alert "Nebyl zadaný střed kružnice !")  ))Připadá mi to jako hlava šroubu, matičky, pak by taky bylo dobré aby to všechno spojil do jednoho bloku, aby se to chovalo jakoby jeden celek, navíc by to šlo udělat i tak že se zeptá na začátku jaký šroub a z databaze Vám to vytáhne přislušný tvar a rovnou vloží.... ale to jsme někde jinde.S pozdravem Martin.

chlebovsky
10.04.2009, 08:56
Jo načíst do Cadu a spustit příkazem pokus (je to definované na začátku v c:pokus, když dáte c:xxx budete spouštět pomoci příkazu xxx

Vladimír Michl
10.04.2009, 09:23
Neděste začátečníka takovými složitostmi :-)
 
Zcela postačí i:
[CODE]
(defun c:krux ( / D1) (setq D1 (getdist "\nPrůměr D1: ")) (command "_Circle" pause "_D" D1) (command "_Circle" "@" "_D" (* D1 1.7)) (command "_Polygon" 5 "@" "_C" (* D1 1.7 0.5)) (princ))
[/CODE]

svarc.vl
10.04.2009, 09:53
No právě vypadá to jako zadání příkladu ve škole, ale aspoň se kouknu jak to dělá někdo jiny. Zajímalo by mně rozdíl mezi vytvořením kružnice přes příkaz cadu a příkazem lispu entmake.
Jedná se o to , že si můžu definovat další hodnoty ve vlastnostech entity ?

Vladimír Michl
10.04.2009, 11:06
(entmake) je jen rychlejší a složitější...

Cruele
14.04.2009, 16:05
Dobrý Den,ja mam taky takový "školni"problem.Čast programu už mam ,ale ztracim se s vytvořením oblouku.Mam při tom střed oblouku a koncove body.Vím,že bych mel použit funkci arc,ale nemam poneti jak.Stačí mi jen nasmerovat.Děkuji moc

svarc.vl
15.04.2009, 07:26
použijete příkaz autocadu _arc (podtržítko je označení aglického příkazu), pak spouštíte příkazy autocadu v lispu pomocí funkce command a za funkci píšete proměnné a parametry v  pořadí jako jsou v příkazové řádce autocadu. Pokud chcete počkat na vstup uživatele pak napíšete pause , pokud chcete poslední bod napíšete @. Pevné hodnoty píšete do uvozovek, proměnné jménem.
např.
(command "_arc" "S" "0,0" "1,1" "-1,1") ; S znamená, že nejdříve zadáváte střed
pokud máte  hodnotu bodu v proměnné pak
(command "_arc" "S" bod1 bod2 bod3)
a jestli máte  pouze souřadnice bodu pak je "spojíte" příkazem list

(command "_arc" "S" (list x1 y1) bod2 bod3)
zkuste si příkaz v autocadu a koukněte se co Vám autocad píše.
(jinak kreslení oblouku mi dělá proti směru hodinových ručiček těď si nevzpomenu jaká je to proměnná)
 

shortys.ivo
15.04.2009, 15:58

Dobrý den,mám také "školní" problém....Potřebuji vytvořit prográmek:Je dán úhel AVB a vbitřní bod M.Sestrojte kružnici k procházející bodem M,která se dotýká obou ramen úhlu.Už se s tím trápím několik dnů a stále to nemůžu zprovoznit:(
shortys.ivo2009-04-15 16:02:27

Mantlík
15.04.2009, 16:19
A jak jste daleko - co už Vám funguje?
 
Máte-li už nakreslený úhel a bod, tak kružnici sestrojíte např. :
(command "_circle" "_3p" "_nod" pause "_tan" pause "_tan" pause)
 
to  pause  znamená čekání na uživatelský vstup
pak ale musíte znát sekvenci, v jaké budete body zadávat (tady je to bod, tečna, tečna)
 
lepší (a odolnější proti chybám) bude ale uložit na výzvy bod a tečny do proměnných a pak to najednou vykreslit (anebo aspoň vypsat hlášku, v jakém pořadí se to má zadávat)
 

shortys.ivo
15.04.2009, 17:02
Sem to zkousel takhle, nevim jak si poradit s tema tecnama....sem z toho chtel vytvorit entity, ale asi je to spatne zapsany(nefunguje to):(defun C:ukol()   (print "Uhel AVB je dan pomoci bodu A, V, B:")   (setq bod_V (getpoint "Zadejte bod V:"))   (setq bod_A (getpoint "Zadejte bod A:"))  (command "_line" bod_V bod_A "")  (setq primka_VA (entlast)) (setq bod_B (getpoint "Zadejte bod B:"))  (command "_line" bod_V bod_B "")  (setq primka_VB (entlast))    (setq bod_M (getpoint "Zadejte bod M(Podmínka : Musi byt uvnitr uhlu AVB):"))    (command "_circle" "3B" bod_M "tan" primka_VA "tan" primka_VB)        )