LISP
koji točkama pridružuje najbliže izpisanu visinu i to izpisuje u izlaznu
podatkovnicu
;Izradio Dane
;----- B O G
I H R V A T I -----
;--- Z A D O
M S P R E M N I ---
(defun c:tockovis ()
(setq naziv
(getstring "\nnaziv izpisne podatkovnice:"))
(setq podat
(strcat "c:\\iskol\\" naziv ".mdt"))
(setq d1 (open
podat "w"))
(setq skup
(ssget))
;dobivanje skupa niza svih zaokruzenih predmeta u AutoCAD-u
(setq yt 0)
(setq xt 0)
(setq yv 0)
(setq xv 0)
(setq br 0)
;promjenljivoj vriednosti br pridružuje broj nistica
(setq br2
0)
;brojac za redni broj tocke
(while (< br
(sslength skup))
;petlja koja se vrti u krug
dok br nije jednak duljini skupa
(setq vrsta
(cdr (assoc 0 (entget (ssname skup br)))))
(setq prov 1)
(if (= vrsta
"TEXT")
(progn
(setq prov
2)
(setq vis
(cdr (assoc 1 (entget (ssname skup br)))))
;dobijemo vriednost visine
(setq yv
(nth 1 (assoc 10 (entget (ssname skup br)))))
;dobijemo vriednost polozaja y od proslova
(setq xv
(nth 2 (assoc 10 (entget (ssname skup br)))))
;dobijemo vriednost polozaja x od proslova
))
(setq br1 0)
(setq dnm
30000000) ;najmanja duzina
(if (= prov 2)
(progn
(while (<
br1 (sslength skup))
(setq vrsta
(cdr (assoc 0 (entget (ssname skup br1)))))
(if (= vrsta
"POINT")
(progn
(setq yt
(nth 1 (assoc 10 (entget (ssname skup br1)))))
(setq xt
(nth 2 (assoc 10 (entget (ssname skup br1)))))
(setq d
(sqrt (+ (* (- yt yv) (- yt yv)) (* (- xt xv) (- xt xv)))))
(if (< d
dnm) ;upit za najmanju duzinu
(progn
(setq dnm
d)
(setq ytnm
yt)
(setq xtnm
xt)
)) ))
(setq br1 (+
br1 1))
)
(setq br2 (+
br2 1))
(princ (strcat
"\n" (rtos br2 2 0) "
" (rtos ytnm 2 3) " " (rtos xtnm 2 3) " " vis) d1)
))
(setq br (+ br
1))
;brojacu br se pridodaje vriednost 1
)
(close d1)
)
Naputak za uporabu ovog LISP-a:
- prvo se mora napraviti pohranilište na tvrdom pamtilu ,,c:'' pod nazivom
,,iskol'' gdje će se stvarati izlazna podatkovnica.
- U AutoCAD-u na crtežu ostavi odtvorenima samo one slojeve gdje se nalaze
točke i visine. Također provjeri jesu li visine položajno najbliže
odgovarajućim točkama.
- odi na Tools->Load Application...->odaberi podporu
,,tockovis.lsp''->pritisni ,,Load''->Ubodi mišem na ,,Close''
- upiši u naredbeni prostor ,,tockovis''
- ,,naziv izpisne podatkovnice'' - tu upišeš ime podatkovnice u koju će se
izbaciti vriednosti položaja točaka i visine.
- zatim zaokruži sve predmete od jednom i stisni tipku ENTER. Nakon toga
pogledaj u pohranilište ,,iskol'' gdje bi trebala biti ta izlazna podatkovnica.
Razčlanba podpore red po red:
1) ;Izradio Dane
Sve što dolazi poslije znaka ,,;'' u AutoLISP-u prilikom izvršenja podpore
ne ima nikakvu ulogu. To služi tek kano podsjetnik za izraditelja podpore ili
kano naputak proučavatelju podpore.
2) ;----- B O G I H R V A T I -----
Isto kano i prvi
redak.
3) ;--- Z A D O M
S P R E M N I ---
Isto kano i prvi
redak.
4)
Prazan redak ne
ima nikakvu ulogu u podpori.
5) (defun c:tockovis ()
Ovaj red zadaje podpodporu ,,tockovis'' pomoću naredbe ,,defun''. Znak
,,c:'' koji stoji prije ,,tockovis'' omogućuje da u naredbenom prostoru od
AutoCAD-a upišemo samo ,,tockovis'' kad želimo pozvati ovu podporu.
6) (setq naziv (getstring
"\nnaziv izpisne podatkovnice:"))
Naredba ,,getstring'' traži od koristnika da u
naredbeni prostor od AutoCAD-a upiše znakoniz (string), ter ga od tamo i
preuzima. Proslov pod navodnicima je tek naputak, a izraz ,,\n'' stavlja
proslov u novi red.
Naredba ,,setq'' pridružuje preuzeti znakoniz
promjenljivoj vriednosti ,,naziv''.
7) (setq podat (strcat
"c:\\iskol\\" naziv ".mdt"))
Naredba ,,strcat'' spaja više znakonizova u jedan znakoniz. U ovom slučaju
se oblikuje naziv bivališta izlazne podatkovnice.
Naredba ,,setq'' pridružuje taj čitavi znakoniz promjenljivoj vriednosti
,,podat''.
8) (setq d1 (open podat
"w"))
Naredba ,,open'' služi za odtvaranje, t. j. stvaranje nove podatkovnice.
Oznaka ''w'' znači kako će ta podatkovnica biti za upisivanje podataka.
Sve te osobine pridružuju se pomoću naredbe ,,setq'' promjenljivoj
vriednosti ,,d1''. Znači, ,,d1'' nam je ovdje oznaka za podatkovnicu, s kojom u
ovoj podpori izvodimo razne radnje.
9) (setq skup (ssget))
;dobivanje skupa niza svih zaokruzenih predmeta u AutoCAD-u
Naredba ,,ssget'' traži od uporabitelja da označi jedan ili više nacrtanih
predmeta u AutoCAD-u, ter onda skup tih označenih predmeta sprema u niz.
Naredba ,,setq'' taj niz predmeta pridružuje promjenljivoj vriednosti
,,skup''.
Sve što dolazi napisano poslije točkezarez ,,;'', služi tek kano pripomena
ter ne ima nikakvu ulogu u izvršenju podpore.
10) (setq yt 0)
Naredba ,,setq''
pridružuje ništicu promjenljivoj vriednosti ,,yt''.
11) (setq xt 0)
Isto kano i
deseti redak.
12) (setq yv 0)
Isto kano i
deseti redak.
13) (setq xv 0)
Isto kano i
deseti redak.
14) (setq br 0)
;promjenljivoj vriednosti br pridružuje broj nistica
Isto kano i
deseti redak. Ima nadodan pripomenak koji pojašnjava čemu ova naredba služi.
15) (setq br2 0)
;brojac za redni broj tocke
Isto kano i
deseti redak. Ima pripomenak koji govori čemu služi promjenljiva vriednost.
16) (while (< br (sslength
skup))
;petlja koja se vrti u krug dok br nije jednak duljini skupa
Naredba ,,sslength'' vraća ukupan broj odabranih jedinki (predmeta) na
zaslonu pomoću naredbe ,,ssget'', a koje su pohranjene kano niz u promjenljivu
vriednost ,,skup''.
Izraz ,,(< br (sslength skup))'' je istinit, ukoliko je promjenljiva
vriednost ,,br'' manja od broja zaokruženih predmeta pohranjenih u
promjenljivoj vriednosti ,,skup''.
Naredba ,,while'' je petlja koja se vrti u krug sve dok je uvjet ,,(< br
(sslength skup))'' istinit. Petlja od ,,while'' se zatvara sa zagradom ,,)''.
17) (setq vrsta (cdr (assoc 0
(entget (ssname skup br)))))
Za dobivanje naziva člana pod rednim brojem ,,br'' u nizu od premdeta
,,skup'' rabi se naredba ,,ssname''. Naredbom ,,(entget (ssname skup br))'',
dobije se ovako nešto (pogledaj dodatak 1.), ali naravno ovisno o tome kakvu
vrstu izcrtanog predmeta smo u AutoCAD-u označili. U ovom slučaju to je
proslov.
Dodatak 1.
((-1 . <Entity name: 7ef60f68>) (0 . "TEXT") (330 .
<Entity name: 7ef60cf8>) (5 . "E5") (100 .
"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")
(100 . "AcDbText") (10 680.475 498.677 0.0) (40 . 2.5) (1 .
"125.5") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "Standard")
(71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 .
"AcDbText") (73 . 0))
Kano što vidimo, ovo se može proglasiti kano niz od puno nizova. Svaki niz
unutar sebe ima na početku neki broj, koji predstavlja zaporku za neku osobinu.
Tako na pr. zaporka ,,0'' označava vrstu predmeta (proslov, krug, crta,
mnogocrta...). Zaporka ,,1'' ovdje predstavlja sadržaj proslova, što je u ovom
slučaju ''125.5'' i t. d. Uglavnom na ovaj način se mogu izvuči mnogi koristni
podatci o pojedinom predmetu, kano što su položaj, vrsta, sadržaj predmeta i t.
d., a to se radi najbolje s naredbom ,,assoc''.
Naredba ,,assoc'' traži niz unutar niza s obzirom na početni član pojedinog
niza. U ovom slučaju su to zaporke za osobine. U našem slučaju je to 0, ter će
nam izbaciti ,,(0 . "TEXT").
Kako nas zanima samo vrsta podataka, to ćemo pomoću naredbe ,,cdr''
izbaciti prvi član niza, ter će ostati samo član "TEXT", koji će se
pomoću naredbe ,,setq'' pridružiti promjenljivoj vriednosti ,,vrsta''.
18) (setq prov 1)
Naredba ,,setq'' pridružuje broj 1 promjenljivoj vriednosti ,,prov''.
19) (if (= vrsta
"TEXT")
Naredba ,,(= vrsta "TEXT")'' jest istina ili laž. Ukoliko je to
istina, tada će se izvršavati naredba ,,if''. Znači, ukoliko je označeni
predmet vrste proslov (text), tada će se ova naredba izvršavati. Petlja ,,if''
se na kraju zatvara sa zagradom.
20) (progn
Naredba ,,progn'' omogućuje više naredbi unutar petlje ,,if''. Također se
zatvara sa zagradom ,,)''
21) (setq prov
2)
Isto kano i u redku 18.
22) (setq vis
(cdr (assoc 1 (entget (ssname skup br)))))
;dobijemo vriednost visine
Isto kano i u redku 17., samo što ovdje u naredbi ,,assoc'' tražimo niz
unutar niza koji ima početni član 1, a ne 0. Znači, nas ovdje zanima vriednost
proslova, t. j. što je napisano.
23) (setq yv
(nth 1 (assoc 10 (entget (ssname skup br)))))
;dobijemo vriednost polozaja y od proslova
Isto kano u 17. redku, samo što ovdje umjesto naredbe ,,cdr'' rabimo
naredbu ,,nth'' koja uzima član niza s obzirom na njegov redni broj. Prvi član
u nizu ima redni broj 0.
24) (setq xv (nth 2 (assoc 10 (entget
(ssname skup br))))) ;dobijemo
vriednost polozaja x od proslova
Ista razložba kano i za 23. redak.
25) ))
Prva zagrada zatvara naredbu ,,progn'', a
druga naredbu ,,if''.
26) (setq br1 0)
Naredba ,,setq'' pridružuje ništicu
promjenljivoj vriednosti ,,br1''.
27) (setq dnm 30000000)
;najmanja duzina
Isto kano i 26. redak. Promjenljiva vriednost
,,dnm'' predstavlja najmanju dužinu između točke i upisane visine, koja će biti
uvjet sdruživanja točke i visine.
28) (if (= prov 2)
Ukoliko je zadovoljen uvjet da je
promjenljiva vriednost ,,prov'' jednaka 2, tada će se izvršavati petlja ,,if''.
29) (progn
Isto kano i u redku 20.
30) (while (< br1 (sslength skup))
Slično kano i u redku 16. Dok je ,,br1''
manji od broja označenih predmeta u skupu, dotle će se izvršavati naredba
,,while''.
31) (setq vrsta (cdr (assoc 0 (entget
(ssname skup br1)))))
Isto kano i redak 17.
32) (if (= vrsta "POINT")
Slično kano i redak 19., samo što će ovdje
uvjet biti zadovoljen ako je vrsta podataka točka (point).
33) (progn
Isto kano i redak 20.
34) (setq yt (nth 1 (assoc 10 (entget (ssname
skup br1)))))
Isto kano i redak 23.
35) (setq xt (nth 2 (assoc 10 (entget
(ssname skup br1)))))
Isto kano i redak 24.
36) (setq d (sqrt (+ (* (- yt yv) (- yt yv))
(* (- xt xv) (- xt xv)))))
Ovime se izračunava udaljenost između
položaja od točke i proslova za visinu. Naredbe za sbroj dva broja na pr. 2+2
se pišu ovako u AutoCAD-u: (+ 2 2), a isto vriedi i za množenje i dieljenje.
Naredba ,,sqrt'' uzima korien. Sav taj izračun se pridružuje promjenljivoj
vriednosti ,,d'' pomoću naredbe ,,sqrt''.
37) (if (< d dnm)
;upit za najmanju duzinu
Ukoliko je ,,d'' manje od ,,dnm'' tada će
se izvršiti naredba ,,if''.
38) (progn
Isto kano i redak 20.
39) (setq dnm d)
Naredba ,,setq'' pridružuje promjenljivu
vriednost ,,d'' promjenljivoj vriednosti ,,dnm''.
40) (setq ytnm yt)
Isto kano i redak 39.
41) (setq xtnm xt)
Isto kano i redak 39.
42) )) ))
Prva zagrada je od naredbe ,,progn'' iz
redka 38. Druga zagrada je od naredbe ,,if'' iz redka 37. Treća zagrada je od
naredbe ,,progn'' iz redka 33. Četvrta zagrada je od naredbe ,,if'' iz redka
32.
43) (setq br1 (+ br1 1))
Naredba za brojač unutar petlje ,,while''.
44) )
Kraj od petlje ,,while'' iz redka 30.
45) (setq br2 (+ br2 1))
Naredba za brojač unutar petlje ,,while''.
46) (princ (strcat "\n" (rtos br2 2
0) " " (rtos ytnm 2 3)
" " (rtos xtnm 2 3) "
" vis) d1)
Naredba ,,rtos'' pretvara stvarni broj u
znakoniz. Naredba ,,strcat'' spaja više znakonizova u jedan znakoniz. Naredba
,,princ'' izpisuje znakoniz u podatkovnicu ,,d1''.
47) ))
Prva zagrada je od naredbe ,,progn'' iz
redka 29. Druga zagrada je od naredbe ,,if'' iz redka 28.
48) (setq br (+ br 1)) ;brojacu
br se pridodaje vriednost 1
Naredba za brojač unutar petlje ,,while''.
49) )
Kraj petlje ,,while'' iz redka 16.
50) (close d1)
Naredba za zatvaranje podatkovnice ,,d1''.
51) )
Kraj od naredbe ,,defun'', t. j. kraj
podpore od ovog LISP-a.