Grafikus tervezőrendszerek programozása 2. előadás AutoLisp alapelemek (ismétlés) • Alapelemek: – Listák – Atomok • Konstans atomok • Szimbólikus atomok – Speciális atomok nil, t.
Download ReportTranscript Grafikus tervezőrendszerek programozása 2. előadás AutoLisp alapelemek (ismétlés) • Alapelemek: – Listák – Atomok • Konstans atomok • Szimbólikus atomok – Speciális atomok nil, t.
Grafikus tervezőrendszerek programozása 2. előadás AutoLisp alapelemek (ismétlés) • Alapelemek: – Listák – Atomok • Konstans atomok • Szimbólikus atomok – Speciális atomok nil, t Lisp interpreter (ismétlés) • Interaktív végrehajtás • Lisp végrehajtási ciklus: read-eval-print – Beolvassa a „programot” (file vagy gépelt) – Kiértékeli – Az eredményt kinyomtatja Kiértékelés sorrendje (ismétlés) • Konstans atom értéke: maga az atom • Szimbólikus atom értéke: a szimbólumhoz rendelt értéke • Lista esetén: – – – – Az első elem a listában egy függvény neve A többi elem az argumentumokat jelenti Függvény lista is lehet argumentum Általános alak: (függvény1 arg1 ... (függvény2 arga) ...) Listák • A lista elemeit el kell érni, ehhez a listát részekre kell szedni – Megkülönböztetjük a lista első elemét (fejét) és maradékát • A lista feje is egy S-kifejezés, így atom vagy lista • A lista maradéka „mindig lista” Lista példa • (ez egy lista) – Lista feje: ez – Lista maradéka: (egy lista) • ((elso elem)(masodik elem)(harmadik)) – Lista feje: (elso elem) – Lista maradéka:((masodik elem)(harmadik)) • (egy-elem) – Lista feje: egy-elem – Lista maradéka: () vagy üres lista Lista példa • Üres lista: () vagy nil • Nem üres lista: (nil) – Lista feje: nil – Lista maradéka !!!: () vagy nil Pontozott párok • Szükség lehet olyan listára, amelynek a maradéka nem lista • Két S-kifejezés, közöttük egy pont • (fej . maradek) – Lista feje: fej – Lista maradéka !!!: maradek Pontozott párok • Maradék is lehet S-kifejezés • (fej . (pont utani lista)) – Lista feje: fej – Lista maradéka: (pont utani lista) • Ami egyenértékű a következővel • (fej (pont utani lista)) – Lista feje: fej – Lista maradéka: (pont utani lista) Pontozott párok • Minden lista egyben pontozott pár is (fej . (pont . (utani . (lista . nil)))) • De általában nem ezt a jelölést hanem a hagyományos jelölést használjuk (fej pont utani lista . nil) Listák reprezentálása 1. • • • • Listák reprezentálhatók bináris faként Bináris fa levelei az atomok Bináris csomópontok (Kétfelé ágaznak el) Egyszerű példa: (a b) Listák reprezentálása 2. • Csomóponttól bal és jobb oldali ág indul – Bal oldali ág lekérdezése: car – Jobb oldali ág lekérdezése: cdr (mindig listát ad vissza !!!) • Az „utolsó” atom egy üres lista vagy nil – Egyszerű példa: (a b) (car ‘(a b)) (cdr ‘(a b)) (car (cdr ‘(a b))) = a = (b) = b (cdr (cdr ‘(a b))) = nil Listák reprezentálása 3. ( (a b) (c d) ) (car ...) = (a b) (car (car ...)) = a (cdr ...) = ((c d)) (car (cdr ...)) = (c d) ( () () ) Listák létrehozása • Kifejezések sorozatából lista: list (list ‘a ‘b ‘c) = (a b c) • Két kifejezésből lista: cons (construct) (cons ‘a ()) = (a) (cons ‘a (cons ‘b (cons ‘c ()))) = (a b c) (cons ‘a ‘(b c)) = (a b c) Pontozott párok 1. • Második argumentum is atom ! (cons ‘a ‘b) = (a . b) (car ‘(a . b)) = a (cdr ‘(a . b)) = b (list ‘a ‘b) = (a b) (car ‘(a b)) = a (cdr ‘(a b)) = (b) Pontozott párok 2. (cons ‘a (cons ‘b ‘c)) = (a b . c) Pont utáni rész a lista cdr része (a . (b . c)) (a . (b . (c . nil))) (a b c) Listakezelő függvények 1. • car és cdr függvények kombinációja: – cadr, cddr, caar, cdar – caaar, caadr, caddr, cdddr • Utolsó elem elérése (last ‘(a b c)) = c • Lista n-edik elemének elérése (nth 2 ‘(0 1 2)) (nth 0 ‘(a b c)) = = 2 a Listakezelő függvények 2. • Elemek sorrendjének megváltoztatása (reverse ‘(a b c)) (reverse ‘(1 2 (3))) = = (c b a) ((3) 2 1) = (m a m a) = = 3 0 • Listák összefűzése (append ‘(m a) ‘(m a)) • Lista hossza (length ‘(1 2 3)) (length ‘()) • Elem kicserélése (subst ‘l ‘k ‘((m a) k i) ) = ((m a) l i) Függvények definíciója (defun szimbólum (arg1 arg2 ... / arg3 ...) kifejezések ... ) – a függvény neve arg1, arg2, ... – a függvény argumentumai arg3 ... – lokális változók kifejezések – a függvény végrehajtása során értékelődnek ki – szimbólum – – – Függvény visszatérési értéke • Minden függvénynek van visszatérési értéke ! – C programozási nyelvben van void típus, itt nincs. – Legfeljebb nem vesszük figyelembe a visszaadott értéket. • A visszatérési érték az utolsó kifejezés értéke ! Függvény példa Visszatérési érték: (defun add23 (x) (+ 23 x) ) (add23 32) (add23 4.0) = = = add23 55 27.00000 (defun masodik (x) (car (cdr x)) ) (masodik ‘(1 2 3)) = = masodik 2 Függvény neve • A függvények neve írja le, hogy mit csinál a függvény: – Jó: rajz_negyszog, doboz – Rossz: xxzedsf, int34 • Beépített függvény nevét ne használjuk, mert így a beépített függvény nem lesz többé használható. Bonyolultabb példa • Egy mozi tulajdonosa szeretné megállapítani a jegyek árát. • Minnél drágább a jegy annál kevesebb a látogató a moziban. • Több előadás alapján sikerült megállapítania egy kapcsolatot a jegy ára és a résztvevők száma között. Összefüggések • 5 dolláros jegy árnál 210 ember néz meg egy filmet. • Ha csökkenti az árat 10 centtel, akkor 15-el több ember jön el. (De több ember több költséggel jár.) • Minden előadás 180 dollárba kerül (film ára). • Minden látogató 4 centbe kerül ezen felül. Kérdések • A mozi tulajdonosa szeretné megtudni, hogy milyen kapcsolat van a profit és a jegy ára között, ill. milyen jegy árnál kereshet a legtöbbet. Kapcsolatok • profit = bevétel – költség • bevétel = látogatók száma * jegy ára – Látogatók száma a jegy árától függ: • 210 ember 5$ -os áron • Ezen felül (eltérés) 0.10$ 5$ – ár x = … 15 ember x • költség = 180$ + 0.04$ * látogatók száma Program 1. (defun profit (price) (- (* (+ 210 (* (/ 15 0.10) (- 5.00 price))) price) (+ 180 (* 0.04 (+ 210 (* (/ 15 0.10) (- 5.00 price))))))) Program 2. (defun profit (ár) (- (bevétel ár) (kiadás ár)) ) (defun bevétel (ár) (* (résztvevők ár) ár) ) (defun kiadás (ár) (+ 180 (* 0.04 (résztvevők ár))) ) (defun résztvevők (ár) (+ 210 (* (/ 15 0.10) (- 5.00 ár))) ) Értékadás, változók • (setq szimbólum kifejezés) • Beállítja a szimbólumot / változót a második argumentum / kifejezés kiértékelésének eredményére • Például: – – – – – (setq radius 2.3) radius (setq lista ‘(1 2)) (setq szam (+ 2 radius)) (setq a 1.2 b 3.4) = = = = = 2.3 2.3 (1 2) 4.3 3.4 Változók típusa • A változóknak nincs előredefiniált típusa • Bármilyen típusú lehet (szám, szöveg, lista, ...) • Típusát menet közben is változtathatja!!! Változó értéke (setq radius 2.3) = 2.3 (setq radius “aa”) = “aa” (setq radius ‘(1 2 3)) = (1 2 3) Változók neve • A változók neve írja le, hogy mit tartalmaz: – Jó: kezdopont, hossz – Rossz: tt, val34 • Beépített függvény vagy változó nevét ne használjuk, mert így a beépített függvény vagy változó eredeti értéke nem lesz többé használható. • Például ne definiáljuk: nil, car, cdr Változók használata • Egy változót csak egy dologra használjunk • Próbáljuk elkerülni a globális változók használatát • Nagyobb programban konstans adatok helyett is használjunk változót, így könnyebb később megváltoztatni Még egy értékadó függvény • (set szimbólum kifejezés) • Beállítja a szimbólum kiértékelésének eredményét a kifejezés kiértékelésének eredményére • Például: – – – – – – – (setq a 6.0) (set ‘b a) b (set ‘c ‘b) (set c 1) c b = = = = = = = 6.0 6.0 6.0 b 1 b 1 Lokális-globális változók • Függvényen kívül használt setq, globális változót definiál • Lokális változó definiálása: set (defun fvg ( / lok1 ) ... ) • Egy lokális változó „eltakarhat” (shadow) egy másik globális vagy lokális változót Példa 1. (defun a () (setq x 2) ) (setq x 1) (a) ;belépésnél (setq x 2) x x x x x 1 1 2 2 Példa 2. (defun a ( x ) ; arg -> új doboz (setq x 2) ) ; kilépésnél elveszünk dobozt (setq x 1) (a 3) ;belépésnél (setq x 2) x x x x x 1 1 1 1 3 2 Példa 3. (defun a ( / x ) ; lokális változó -> új doboz (setq x 2) ) ; kilépésnél elveszünk dobozt (setq x 1) (a) ;belépésnél (setq x 2) x x x x x 1 1 nil 1 2 1 Függvény függvényben • Melyik változó és függvény honnan érhető el ? (defun my_prog ( / Var1 Var2) (defun sub_prog ( ) (list Var1 Var2) ) (setq Var3 (sub_prog)) ) AutoCAD parancs definiálása • A függvény neve speciálisan definiált: C:parancs_nev • A függvény argumentistája üres kell legyen • Az így definiált függvény közvetlenül végrehajtható AutoCAD parancs lesz ! (defun c:ketto () (+ 1 1) ) Összehasonlítás 1. AutoLISP AutoCAD (defun ketto () (+ 1 1) ) (defun c:ketto () (+ 1 1) ) Command: (ketto) 2 Command: ketto 2 Összehasonlítás 2. • Hogyan lehet definiálni egy függvényt ? – – – – – (defun (defun (defun (defun (defun drawline () ... ) drawline (/ pntl pnt2) ... ) drawline (a / pntl pnt2) ... ) C:drawline () ... ) C:drawline (/ pntl pnt2) ... ) AutoCAD parancs használata • AutoCAD parancsot hajt végre az AutoLISP programból (command argumentumok ... ) • Az argumentumok lehetnek számok, sztringek vagy pont listák • Az üres sztring ”” jelentése: a SPACE vagy az ENTER billentyű lett lenyomva • Argumentum nélkül *Cancel* -nek felel meg Magyar AutoCAD parancsok • Az AutoCAD parancsok magyarul is megadhatók, de ebben az esetben más AutoCAD alatt (pl. spanyol) nem lehet használni • Példa – Rossz: (command – Jó: (command ”vonal” ”0,0” ”1,1” ””) ”_line” ”0,0” ”1,1” ””) AutoCAD parancsok formája Helyi, lefordított név (vonal) linetype : _linetype : Nyelv független parancs -linetype : Dialógus ablak nélküli .linetype : Nem definiálható felül ._linetype, _.linetype : Kombináció AutoCAD parancs példa 1. (defun c:xy () (command ”_line” ”0,0” ”1,0” ””) (command ”_line” ‘(0 0) (list 0 1) ””) ) AutoCAD parancs példa 2. • Változók, listák is használhatók (defun c:xy ( / origo ) (setq origo ‘(0 0)) (command ”_line” origo ”1,0” ””) (command ”_line” origo (list 0 1) ””) ) AutoCAD parancs példa 3. • AutoCAD parancs felbontható több lépésre (defun c:xy ( / origo ) (setq origo ‘(0 0)) (command ”_line”) ; vonal rajzolás kezdete (command origo) ; első pont ; bármit lehet csinálni közben, ; kivéve AutoCAD parancsot használni (command ”1,0”) ; második pont (command ””) ; parancs lezárása (command ”_line” origo (list 0 1) ””) )