290 likes | 378 Views
Grafikus tervezőrendszerek programozása. 6. előadás. Asszociációs listák. Alapesetben két elemű listák listája ( ( kulcs1 érték1) ( kulcs2 érték2) ... ) Például ( ( ”Isaac Asimov” ”Alapitvány”) ( ”Frank Herbert” ”Dűne”) ( ”Ian Fleming” ”Goldfinger”) ) Felhasználás:
E N D
Grafikus tervezőrendszerek programozása 6. előadás
Asszociációs listák • Alapesetben két elemű listák listája ( (kulcs1 érték1) (kulcs2 érték2) ... ) • Például ( (”Isaac Asimov” ”Alapitvány”) (”Frank Herbert” ”Dűne”) (”Ian Fleming” ”Goldfinger”) ) • Felhasználás: • Tudás reprezentációra • AutoLisp változók értékeinek tárolására
Asszociációs listák kezelése 1. • Egy érték lekérdezése (assoc elem lista) • Példa (setq lst ‘((a 1) (b 2) (c 3))) (assoc‘b lst) -> (b 2) (assoc ‘r lst) -> nil • A kulcs bármilyen kifejezés lehet (setq lst ‘((a q) ((b) w))) (assoc ‘(b) lst) -> ((b) w)
Asszociációs listák kezelése 2. • Csak a kulcs első előfordulását adja vissza (assoc‘b ‘((a 1) (b 2) (c 3) (b 4)) ) -> (b 2) • Nem csak két elemű listák lehetnek az elemek (assoc‘b ‘((a 1 2 3) (b q w e) (c 88 99)) ) -> (b q w e)
Lista tagja • Ellenőrzi hogy egy elem szerepel-e egy listában (member elem lista) • Ha az elem szerepel a listában akkor visszaadja a lista maradékát a kifejezés előfordulásától • Példa (member ‘q ‘(a q u a)) -> (q u a) (member ‘b ‘(a q u a)) -> nil (setq lst ‘((a 1) (b 2) (c 3))) (member‘b lst) -> nil (member ‘(b 2) lst) -> ((b 2) (c 3))
Rajzelemek kezelés • A rajzelemek kezeléséhez tudni kell a nevét • A rajzelem neve: <Entity name: 7ef4fe88> • A rajzelem neve nem módosítható • Rajzelem nevet nem lehet létrehozni • A rajzelem név használható a command parancsban rajzelem kiválasztásra: • Az utolsó rajzelem színének pirosra állítása (command ”_chprop” (entlast) ”” ”_color” ”_red” ””) • Az utoljára létrehozott rajzelem nevének lekérdezése: (entlast)
Rajzelem kiválasztás • Egy rajzelem kiválasztása: (entsel [prompt]) • Bemenet: • Egy rajzelemet kell kiválasztani a képernyőn • A függvény visszatérési értéke egy lista: • A rajzelem neve • A kiválasztási pont • Csak egy rajzelem kiválasztását engedi !!!
Kiválasztás és transzformáció • A nentselésnentselpfüggvények hasonlóak az entsel függvényhez de két extra adatot ad vissza • Rajzelem neve • Kiválasztási pont • Lokálisból a globális koordináta rendszerbe való transzformáláshoz szükséges mátrix • A rajzelemet tartalmazó blokkok listája
Példa 1. Command: line Specify first point: 1,1 Specify next point or [Undo]: 3,1 Specify next point or [Undo]: 3,3 Specify next point or [Close/Undo]: 1,3 Specify next point or [Close/Undo]: c Command: block Enter block name or [?]: square Specify insertion base point: 2,2 Select objects:<Négy vonal kiválasztása> Select objects:<ENTER>
Példa 2. Command: ucs Current ucs name: *WORLD* Enter option[New/Move/orthoGraphic/Prev/ Restore/Save/Del/Apply/?/World] <World>: z Specify rotation angle about Z axis <0>: 45 Command: insert Enter block name or [?]: square Specify insertion point or [Scale/X/Y/Z/Rotate/PScale/PX/PY/PZ/PRotate]: 7,0 Enter X scale factor, specify opposite corner, or [Corner/XYZ] <1>:<ENTER> Enter Y scale factor <use X scale factor>:<ENTER> Specify rotation angle <0>:<ENTER>
Példa 3. (setq ndata (nentsel)) (<Entity Name: 400000a0> ; Objektum neve (6.46616 -1.0606 0.0) ; Kiválasztási pont ((0.707107 0.707107 0.0) ; Aktuális koord. (-0.707107 0.707107 0.0) ; rendszerből a világ (0.0 -0.0 1.0) ; koord. rendszerbe (4.94975 4.94975 0.0) ; transzformáló mátrix ) (<Entity name:6000001c>) ; a kiválasztott objektumot ; tartalmazó block )
Rajzelemek definíciója • A rajzelem nevének ismeretében lekérdezhető a rajzelem definíciója (entget ename) • Egy asszociációs listát ad vissza !
Példa 1. (command ”_line” ”1,1” ”2,2” ””) (setq e (entget (entlast))) ((-1 . <Entity name: 7ef72e88>) (0 . "LINE") (330 . <Entity name: 7ef72cf8>) (5 . "89") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 1.0 1.0 0.0) (11 2.0 2.0 0.0) (210 0.0 0.0 1.0) )
Példa 2. • A rajzelem típusa: (cdr (assoc 0 e)) -> ”LINE” • A layer ahol a rajzelem van: (cdr (assoc 8 e)) -> ”0” • A vonal kezdőpontja: (cdr (assoc 10 e)) -> (1.0 1.0 0.0) • A vonal végpontja: (cdr (assoc 11 e)) -> (2.0 2.0 0.0)
DXF • Az asszociációs lista kulcsai DXF kódok • Egy AutoCAD rajz elmenthető DWG és DXF file formátumban • DWG – bináris, nem publikált formátum • DXF – szöveges formátum • A DXF formátum is teljes rajz reprezentáció !
Rajzelemek törlése • Egy rajzelem „törlése” • AutoCAD paranccsal: _erase • AutoLisp: (entdel ename) • A törölt rajzelem megmarad az adatbázisban így visszaállítható: • undo AutoCAD paranccsal • (entdel ename) Másodszori meghívásával
Rajzelemek módosítása (entmod assoc-lista) • assoc-lista: Az entget parancs által visszaadott listához hasonló kell legyen • A rajzelem típusát nem lehet megváltoztatni. • A hivatkozott elemeknek létezniük kell. Pl. blokkok, szövegtípus • A parancs ellenőrzést is végez. Komoly hiba esetén nem végez módosítást a rajzelemen.
Példa (command ”_line” ”0,0” ”1,1” ””) (setq ent (entget (entlast)) opos (assoc 11 ent) npos (11 2.0 0.0 0.0) ; helyettesítsük a régi koordinátát new (subst npos opos ent) ) (entmod new)
entmake • Rajzelem létrehozása: • command • entmake • Az entmake függvény argumentuma egy associációs lista, de nem tartalmazza a rajzelem nevét
Összetett rajzelemek • Összetett rajzelem: • Block • Régi típusú polyline • Több rajzelemet is magukba foglalnak • A rajzelemek szekvenciális (egymás utáni) elérése: (entnext [ename]) • (setq a (entnext)): Az első rajzelemet adja vissza • (entnext a) : Az második rajzelemet adja vissza • Stb.
Teljes rajz adatbázis átnézése (defun count ( / ent c) (setq ent (entnext) c 0) (while ent (setq c (+ c 1) ent (entnext ent)) ) (princ ”Rajzelemek száma: ”) (princ c) (terpri) )
Rajzelem neve és handle • A rajzelemek neve minden egyes rajz megnyitásnál megváltozik!!! • Szükség lehet állandó hivatkozási névre • A handle ilyen név, egy szám szöveges formában • A handle-ből visszakapható a rajzelem neve (handent ”89”) -> <Entity name: 7ef72e67>
Felhasználói alkalmazások • A rajzelemekhez adat(ok) füzhető(k) • Ezek az adatok egy alkalmazáshoz is tartoznak • Az alkalmazásokat be kell jegyezni az AutoCAD-ben: (regapp alkalmazás) • Például: (regapp ”TEST-DATA”)
Felhasználói adatok • A felhasználói adatok is tárolódnak a rajzban • A felhasználói adatokat is asszociációs listában kell tárolni • A listában DXF kódokat kell használni • Néhány DXF kód
Felhasználói adatok, példa (regapp ”TEST-DATA”) (setq lastent (entget (entlast))) (setq exdata '((-3 ( ”TEST-DATA” (1000 . ”Szöveg”) ) ))) ; adatok összefűzése (setq newent (append lastent exdata)) (entmod newent) ; rajzelem definíció és xdata lekérdezése (entget (car (entsel)) '(”TEST-DATA”))
Felhasználói adatok, eredmény ((-1 . <Entity name: 7ef72e88>) (0 . "LINE") (330 . <Entity name: 7ef72cf8>) (5 . "89") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 0.0 0.0 0.0) (11 2.0 0.0 0.0) (210 0.0 0.0 1.0) (-3 ("TEST-DATA" (1000 . "Szöveg"))) )
Adatok csoportosítása (-3 (”my-app” (1002 . ”{”) (1000 . ”hossz”) (1040 . 5.432) (1002 . ”}”) (1002 . ”{”) (1000 . ”szélesség”) (1040 . 5.432) (1002 . ”}”) ) )