CVIČENIE 6: Práca so súbormi
Pri vytváraní programov, prípadne nadstavieb AutoCADu, majú dôležitú úlohu dátové súbory, v ktorých môžu byť uložené vstupné a výstupné dáta, ako sú čísla bodov, súradnice bodov, smerové a výškové pomery osi komunikácie, dáta v tvare DXF a pod. Dáta môžu byť v textovom tvare alebo v tvare zoznamov so zátvorkami, pripravené na načítanie programami vytvorenými v AutoLISPe.
6. 1. Otvorenie a uzatvorenie súboru pomocou OPEN a CLOSE
Dátový súbor otvárame funkciou OPEN, pričom musíme zadať meno dátového súboru a operáciu, ktorú požadujeme so súborom vykonať.
Štruktúra funkcie OPEN:
![]() |
kde operácia je: “r“ - čítanie dát zo súboru [Read],
“w“ - zápis dát do prázdneho nového súboru [Write],
“a“ - pridanie dát na koniec súboru [Append],
Napríklad:
(setq f (open “VSTUP.DAT“ “r“)) - otvoríme súbor VSTUP.DAT
na čítanie dát (do premennej F),
(setq g (open “VÝSLEDKY.DAT“ “w“)) - otvoríme súbor VÝSLEDKY.DAT
na uloženie dát do prázdneho súboru,
(setq SÚBOR (open “C:/ACAD/SÚRADNICE.DAT“ “a“))
- otvoríme súbor SÚRADNICE.DAT
na pridanie dát do existujúceho súboru
(do premennej SÚBOR).
Každý súbor, ktorý sme otvorili pomocou programu a pracovali s ním, je potrebné uzavrieť, aby boli presunuté všetky dáta z pamäte počítača do dátového súboru funkciou CLOSE, kde INDEX predstavuje premennú s menom súboru.
Štruktúra funkcie CLOSE:
![]() |
Napríklad:
(close f) - uzatvorenie súboru VSTUP.DAT,
(close g) - uzatvorenie súboru VÝSLEDKY.DAT,
(close SÚBOR) - uzatvorenie súboru SÚRADNICE.DAT.
6. 2. Načítanie dát a uloženie dát do súboru
Uvedieme niekoľko praktických jednoduchých programov typu LSP, kde je potrebné vopred otvoriť súbor, spracovať dáta, uložiť dáta do súboru a nakoniec uzavrieť súbor.
Pr. 6.1. Zadajte súradnice bodu CB [X,Y] a uložte ich do dátového súboru “VSTUP.DAT“. Hodnoty vypíšte aj na obrazovku počítača. Zadajte konkrétne hodnoty pre bod 37 [124.28,235.71]. Vytvorte program DATA.LSP.
a) Otvorte nový súbor DATA.LSP.
b) Napíšte do programu DATA.LSP funkciu VSTUP:
(defun C:VSTUP ( )
; Načítanie údajov
(setq CB (getstring “\nZADAJTE ČÍSLO BODU: “))
(setq x (getreal “\nZADAJTE SÚRADNICU X= “))
(setq y (getreal “\nZADAJTE SÚRADNICU Y= “))
; Otvorenie súboru
(setq f (open “VSTUP.DAT“ “w“))
; Prípadne s adresárom: (setq f (open “C:/ACAD/VSTUP.DAT“ “w“))
; Tlač dát do súboru
(princ “CB: “ f)
(princ CB f)
(princ “\n X=“ f)
(princ x f)
(princ “\n Y=“ f)
(princ y f)
; Uzatvorenie súboru
(close f)
; Tlač údajov na obrazovku
(princ “CB: “)
(princ CB)
(princ “\n X=“)
(princ x)
(princ “\n Y=“)
(princ y)
; Ukončenie funkcie VSTUP a programu DATA.LSP
(prompt “\n^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^“)
(prompt “\nDÁTA SÚ ULOŽENÉ V SÚBORE: VSTUP.DAT. “)
(princ)
)
c) Načítajte program DATA.LSP príkazom LOAD (load “DATA“) a spustite funkciu VSTUP. V prípade, že sú v programe chyby, odstráňte ich, znovu uložte a vyskúšajte.
d) Na záver si prezrite textovým editorom dátový súbor VSTUP.DAT a skontrolujte, či údaje CB, X, Y boli správne uložené.
CB: 37
X= 124.28
Y= 235.71
e) V prípade, že chcete overiť aktuálne hodnoty premenných, zadajte postupne: !CB, !X, !Y na príkazovom riadku AutoCADu.
!CB → “37“
!X → “124.28“
!Y → “235.71“
Pr. 6.2. Vytvorte prázdny dátový súbor SURAD.DAT a zadajte do tohto súboru súradnice CB [X,Y]. Úlohou bude načítať programom dáta z tohto súboru, ktoré by sme mohli využívať na ďalší výpočet. Vypracujte funkciu CITAJ v programe DATA.LSP.
a) Otvorte nový dátový súbor SURAD.DAT a napíšte dáta do súboru:
CB
X
Y
317
1327.775
1071.392
Súbor SURAD.DAT uložte v textovom editore pomocou rolety Súbor [File] položkou Ulož ako [Save as]. Overte, či je súbor uložený na správnom adresári.
b) Napíšte do programu DATA.LSP ďalšiu funkciu CITAJ:
(defun C:CITAJ ( )
; Otvorenie súboru pre čítanie dát
(setq sub “SURAD.DAT“)
(setq f (open sub “r“))
; Načítanie dát, pričom prvé tri riadky načítame do premennej PREC
(repeat 3
(setq PREC (read-line f))
)
(setq CB (read-line f))
(setq x (read-line f))
(setq y (read-line f))
(close f)
(prompt “\n^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^“)
; Výpis dát na obrazovku funkciou PRINT
(print CB)
(print x)
(print y)
; Ukončenie funkcie CITAJ
(prompt “\nDÁTA SÚ NAČÍTANÉ ZO SÚBORU: SURAD.DAT. “)
(princ)
)
c) Zistite hodnoty jednotlivých premenných CB, X, Y výpisom z pamäte počítača:
!CB → “317“
!X → “1327.775“
!Y → “1071.392“
Pozn. 1: Funkcia READ-LINE načíta celý riadok z dátového súboru. V našom prípade bola v každom jednotlivom riadku len jedna hodnota. V prípade, že by v riadku boli viaceré hodnoty, musíme daný riadok rozobrať a priradiť hodnoty jednotlivým premenným funkciou NTH (kap. 6.3).
Pr. 6.3. Do už pripraveného dátového súboru SURAD.DAT z Pr. 6.2 pridajte text, ktorý bude predstavovať popis daného bodu CB [X, Y], napríklad strom, kanál, priepust, roh budovy, lampa, názov, a pod. Vytvorte funkciu PRIDAJ do programu DATA.LSP.
a) Otvorte program DATA.LSP (prepnite na lište WINDOWS) a definujte funkciu PRIDAJ. Vytvorte premennú POPIS, ktorú funkcia PRIDAJ uloží do súboru SURAD.DAT.
(defun C:PRIDAJ ( )
; Zadanie popisu
(setq popis (getstring “\nZADAJTE POPIS BODU: “))
; Otvorenie súboru, uloženie a uzavretie súboru
(setq subor “SURAD.DAT“)
; Prípadne zadajte celú cestu: (setq subor “C:/ACAD/SURAD.DAT“)
(setq g (open subor “a“))
(print popis f)
(close f)
; Ukončenie funkcie PRIDAJ
(prompt “\n^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^“)
(prompt “\nDÁTA SÚ ULOŽENÉ V SÚBORE: SURAD.DAT. “)
(princ)
)
b) Skontrolujte súbor SURAD.DAT (opakovaným načítaním do textového editora), či bol do súboru uložený požadovaný text z premennej POPIS. Ak spustíme funkciu PRIDAJ viackrát, bude v súbore viac popisov, t.j. pridá sa vždy jeden riadok.
Pozn. 1: Ak pracujeme na pracovnom adresári AutoCADu, mená súborov zadávame bez cesty k adresáru. V opačnom prípade musíme zadať celú správnu cestu k súboru, napríklad: “C:/ACAD/SURAD.DAT“ a pod.
Pozn. 2: V príkladoch Pr. 6.1 až Pr. 6.3 sme pracovali len s dátovými súbormi, v ktorých bola uložená len jedna hodnota v jednom riadku.
6. 3. Práca s prvkami v zozname
Doteraz sme využívali hodnoty premenných, ktoré boli uvedené samostatne. V prípade, že sú prvky zlúčené do zoznamov, musíme používať príkazy na extrahovanie prvkov zo zoznamu, alebo naopak, spájanie zoznamov z jednotlivých prvkov. Klasickým príkladom sú prvky súradníc v zozname (X Y Z).
Niektoré funkcie:

- výber prvého prvku zo zoznamu.
(setq bod1 ‘(42.76 65.48 0.00)) - vytvorenie zoznamu BOD1
(setq x (car bod1 )) → 42.76
Pozn. 1: Súradnice premennej BOD1 môžeme vybrať z výkresu funkciou GETPOINT podľa (setq bod1 (getpoint “\nVYBERTE BOD:“)), alebo môžeme súradnice zložiť do zoznamu pomocou apostrofu ” ’ ”, napríklad: ‘(42.76 65.48 0.00), prípadne funkciou LIST.

- vráti zbytok zoznamu bez prvého prvku.
(setq b ‘((1 2 3) (4 5 6) 7 8)) - vytvorenie zoznamu B
(car b) → (1 2 3)
(cdr b) → ((4 5 6) 7 8)
(car (cdr b)) → (4 5 6)
Funkcie je možné spájať:
(caar x) = (car (car x))
(cadr x) = (car (cdr x)), a pod.
Funkcie CAR a CDR spravidla úplne nahrádza funkcia NTH, ako N-tý [Nth] prvok zoznamu. Číslovanie prvkov začína nulou, nakoľko v asociačných zoznamoch prvý prvok predstavuje kód, napríklad súradnice začiatku úsečky (10 421.58 752.891).

- vráti N-tý prvok zo zoznamu.
(setq bod2 ‘(121.68 622.48 42.66)) - vytvorenie zoznamu BOD2
(setq x2 (nth 0 bod2 )) → 121.68
(setq y2 (nth 1 bod2 )) → 622.48
(setq z2 (nth 2 bod2 )) → 42.66
!x2 → 121.68
!y2 → 622.48
!z2 → 42.66
Pr. 6.4. Vytvorte časť programu na príkazovom riadku AutoCADu na výber bodu vo výkrese (môžete využívať aj záchytný režim bodov objektov) a rozložte zoznam uložený v premennej BOD0 na jednotlivé súradnice X0, Y0, Z0.
Výber bodu vo výkrese:
(setq bod0 (getpoint “\nVYBERTE BOD VO VÝKRESE: “))
!bod0 → (106.412 271.249 0.000) v tvare (X Y Z)
Rozloženie zoznamu:
(setq x0 (nth 0 bod0))
(setq y0 (nth 1 bod0))
(setq z0 (nth 2 bod0))
Overte výsledné hodnoty:
!x0 → 106.412
!y0 → 271.249
!z0 → 0.000
Pozn. 1: V prípade výpočtu bodu BodU polárnou metódou funkciou POLAR, zoznam typu LIST pre daný BodS nebudeme rozoberať, nakoľko funkcie podobného typu pracujú na základe súradníc bodu, t.j. známy bod BodS, pričom zadáme ešte uhol UholU a dĺžku sU na určovaný bod BodU (Pr. 7.1, Pozn. 2).
Napríklad: (setq bodU (polar bodS uholU sU)).
6. 4. Funkcie pracujúce s objektami vo výkrese
Dáta entít (objektov) vo výkrese AutoCADu sú
uložené v tvare zoznamov a asociačných zoznamov s kódmi. Na získanie
informácií o nakreslenom objekte z databázy entít AutoCADu použijeme následovné
funkcie ENT****. Vyskúšajte ich na príkazovom riadku Príkaz: [Command:].
Vopred si nakreslite objekty vo výkrese rôznej farby a v rôznych hladinách ako úsečka (Úsečka) [Line], kružnica (Kružnice) [Circle] a text riadkový (Text) [Single Text Line], obr. 6.1.
Obr. 6.1. Objekty vo výkrese AutoCADu
Niektoré funkcie:

- vráti meno entity (objektu) a súradnice
takzvaného výberového bodu.
(entsel “\nVYBERTE OBJEKT VO VÝKRESE: “)
VYBERTE OBJEKT VO VÝKRESE: vyberte kružnicu
→ (<Meno entity: 60000014> (62.28 71.42 0.00))
Pr. 6.5. Nakreslite vo výkrese tri rôzne objekty (entity) v rôznych hladinách a farbách podľa obr. 6.1. Zistite mená objektov a súradnice bodu, pomocou ktorého sme vybrali objekt.
Výber objektu vo výkrese:
(setq en1 (entsel “\nVYBERTE OBJEKT: “))
VYBERTE OBJEKT: vyberte objekt vo výkrese (obr. 6.1)
Zistenie mena entity a súradníc výberového bodu:
(setq meno1 (nth 0 en1))
(setq bod1 (nth 1 en1))
Výsledné hodnoty:
!meno1 → (<Meno entity: 60000014>)
!bod1 → (62.28 71.42 0.00)
Pozn. 1: V prípade, že potrebujeme získať súradnice určitého bodu objektu: koncový (Koncový) [Endpoint], stred (Střed) [Centre], polovica (Polovina) [Midpoint], a pod., výberový bod volíme priamo na ňom, a zároveň pritom využijeme režim uchopenia bodov [Object Snap] podľa CAD I. [21], [33].

- vráti všetky údaje o objekte, ktoré sú uložené
v tvare asociačného zoznamu s kódmi.
Pr. 6.6. Na príkazovom riadku AutoCADu vyskúšajte napísať časť programu LSP na výber objektu, zistenia mena objektu a zobrazte výpis údajov o objekte na obrazovku.
Výber objektu vo výkrese:
(setq en2 (entsel “\nVYBERTE OBJEKT: “))
VYBERTE OBJEKT: vyberte úsečku z výkresu (obr. 6.1)
Zistenie mena entity a zoznamu údajov o objekte:
(setq meno2 (nth 0 en2))
(setq zoznam2 (entget meno2))
Vypíšte údaje, pozrite si tvar asociačného zoznamu a príklad opakujte na ďalšom objekte:
!zoznam2
→ ((-1 . <Meno entity: 60000077>)
(0 . ”LINE”)
(8 . ”OSI”)
(10 177.10 205.07)
(11 221.49 211.62)
)
kde: -1 - meno entity (objektu),
0 - typ entity,
8 - hladina, v ktorej je objekt nakreslený,
10 - začiatok úsečky,
11 - koniec úsečky,
40 - polomer kružnice a oblúka,
62 - farba objektu a pod.
- vráti meno poslednej nakreslenej entity.
- vráti meno nasledujúcej entity.
Pr. 6.7. Vyberte posledný nakreslený objekt (entitu) a vykonajte s nim potrebné úpravy. Ukážka praktického významu funkcie ENTLAST.
Výber posledného nakresleného objektu (vykonať ihneď po vykreslení):
(setq meno3 (entlast))
(setq zoznam3 (entget meno3))
alebo:
(setq zoznam3 (entget (entlast)))
Výpis mena posledného nakresleného objektu:
!meno3 → (<Meno entity: 30000082>)
Praktické použitie funkcie ENTLAST:
a) Počas kreslenia zložitého obrázka si uschováme, napríklad v premenných O1, O2 až ON, jednotlivé mená objektov:
a) nakreslíme objekt,
b) priradíme ho k premennej O1: (setq o1 (entlast)),
c) nakreslíme objekt,
d) priradíme ho k premennej O2: (setq o2 (entlast)).
b) Vykreslíme celý objekt, napríklad oblúk s prechodnicami, a potom položíme otázku v programe, napríklad či objekty vyhovujú projektovaným parametrom:
“\nPRAJETE SI NAKRESLENÝ OBJEKT? [A-ÁNO/N-NIE]: “
c) Ak “NIE“, objekty vymažeme:
(command “_ERASE“ o1 o2 ““)
d) Ak “ÁNO“, zmeníme farbu objektu, napríklad na červenú (projektovaný stav):
(command “_CHANGE“ “_SI“ o1 “_P“ “_C“ “1“ ““)
kde: “_CHANGE“ - príkaz zmena (Změna) [Change] vlastností,
“_SI“ - jeden objekt (JE) [SI],
“_P“ - vlastnosti [Properties],
“_C“ - farba (Barva) [Color, Colour],
“1“ - číslo farby [Color] od 1 do 7, a pod.,
““ - ukončenie opakovania funkcie.
6. 5. Funkcie pracujúce s výberovými množinami
Výberové množiny využívame v prípade výberu objektov z výkresu na základe špecifikácie parametrov výberu, napríklad:
- objekty prechádzajúce daným bodom,
- všetky úsečky vo výkrese,
- všetky objekty nakreslené v danej hladine,
- všetky objekty vybrané výberovým oknom, a pod.
Niektoré funkcie a príklady:

- vráti výberovú množinu s
menami entít.
(ssget ‘(345.22 428.21)) → vráti množinu entít prechádzajúcu
daným bodom (X Y),
(ssget “_W“) → vráti množinu entít vybraných oknom
Okno [Window],
(ssget “_W“ bod1 bod2) → vráti množinu entít vybraných oknom
s dvoma bodmi BOD1 a BOD2,
(ssget “X“ vlastnosti) → vráti množinu entít podľa vlastností,
t.j. filtrovanie výkresu.

- vráti počet prvkov vo
výberovej množine.
(setq vyber2 (ssget “_W“ bod1 bod2))
(setq pocet2 (sslength vyber2))
!pocet2 → 72
Pri práci s výberovými množinami sa používajú aj ďalšie funkcie SS****:
SSGET - výber prvkov do výberovej množiny,
SSLENGTH - počet prvkov vo výberovej množine,
SSNAME - výber prvkov z množiny (s parametrom poradia),
SSADD - pridanie prvku do množiny,
SSDEL - vymazanie prvku z množiny,
SSMEMB - test mena prvku na prítomnosť vo výberovej množine.
Pr. 6.8. Napíšte časť programu na výber objektov, ktoré sú nakreslené v hladine [Layer] “OSI“ a majú farbu (Barva) [Color] žltú [Yellow]. Hladina má kód “8“ a farba “62“. Nakoniec zistite počet vybraných objektov vo výberovej množine funkciou SSLENGTH. Pred tvorbou programu si nakreslite žlté objekty v hladine “OSI“, napríklad podľa obr. 6.1.
Vytvorte výberovú množinu:
(setq vyber1 (ssget “X“ (list (cons 8 “OSI“) (cons 62 2))))
→ <Výberová množina: 22> - číslo výberovej množiny
alebo:
(setq vyber2 (ssget “X“ ‘((8 . “OSI“) (62 . 2))))
→ <Výberová množina: 23>
Zobrazte jej obsah:
!vyber1 → <Výberová množina: 22>
!vyber2 → <Výberová množina: 23>
Zobrazte počet prvkov vo výberovej množine:
(setq pocet1 (sslength vyber1))
(setq pocet2 (sslength vyber2))
!pocet1 → 3
!pocet2 → 3
Pozn. 1: Aj keď vynulujeme danú množinu (setq vyber1 nil), čísla výberových množín majú stúpajúcu tendenciu. Počet prvkov vo výberovej množine zisťujeme príkazom SSLENGTH.
Pozn. 2: Obidva počty prvkov vo výberových množinách VYBER1 a VYBER2 musia byť rovnaké, nakoľko načítame rovnaké entity vo výkrese.