Top Banner
Grafikus tervezőrendszerek programozása 6. előadás
29

Grafikus tervezőrendszerek programozása

Jan 04, 2016

Download

Documents

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: - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Grafikus tervezőrendszerek programozása

Grafikus tervezőrendszerek programozása

6. előadás

Page 2: Grafikus tervezőrendszerek programozása

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

Page 3: Grafikus tervezőrendszerek programozása

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)

Page 4: Grafikus tervezőrendszerek programozása

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)

Page 5: Grafikus tervezőrendszerek programozása

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))

Page 6: Grafikus tervezőrendszerek programozása

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)

Page 7: Grafikus tervezőrendszerek programozása

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 !!!

Page 8: Grafikus tervezőrendszerek programozása

Példa

Page 9: Grafikus tervezőrendszerek programozása

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

Page 10: Grafikus tervezőrendszerek programozása

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>

Page 11: Grafikus tervezőrendszerek programozása

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>

Page 12: Grafikus tervezőrendszerek programozása

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

)

Page 13: Grafikus tervezőrendszerek programozása

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 !

Page 14: Grafikus tervezőrendszerek programozása

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))

Page 15: Grafikus tervezőrendszerek programozása

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)

Page 16: Grafikus tervezőrendszerek programozása

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ó !

Page 17: Grafikus tervezőrendszerek programozása

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

Page 18: Grafikus tervezőrendszerek programozása

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

Page 19: Grafikus tervezőrendszerek programozása

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.

Page 20: Grafikus tervezőrendszerek programozása

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)

Page 21: Grafikus tervezőrendszerek programozása

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

Page 22: Grafikus tervezőrendszerek programozása

Ö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.

Page 23: Grafikus tervezőrendszerek programozása

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)

)

Page 24: Grafikus tervezőrendszerek programozása

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>

Page 25: Grafikus tervezőrendszerek programozása

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”)

Page 26: Grafikus tervezőrendszerek programozása

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

Page 27: Grafikus tervezőrendszerek programozása

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”))

Page 28: Grafikus tervezőrendszerek programozása

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")))

)

Page 29: Grafikus tervezőrendszerek programozása

Adatok csoportosítása(-3 (”my-app” (1002 . ”{”)

(1000 . ”hossz”)

(1040 . 5.432)

(1002 . ”}”)

(1002 . ”{”)

(1000 . ”szélesség”)

(1040 . 5.432)

(1002 . ”}”)

)

)