Povratak / Back

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.

 

 

Free Web Hosting