Grafikus tervezőrendszerek programozása 6. előadás
Jan 04, 2016
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 !!!
Példa
Kiválasztás és transzformáció
• A nentsel és nentselp fü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ó !
Néhány DXF kód
Kód Megnevezés
-1 Entity name
0 Rajzelem típusa, szöveges formában
5 Rajzelem „handle”
6 Vonal típus
7 Szöveg típusa
8 Layer neve
10 Fő pontok, 3D-s pont
11-18 Egyébb pontok
40 Valós szám, pl. Kör sugara
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 Név Megnevezés
1000 Szöveg
1003 Layer neve
1005 Rajzelem handle
1010 3D-s pont
1040 Valós szám
1070 Egész szám
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 . ”}”)
)
)