430 likes | 518 Views
Grafikus tervezőrendszerek programozása. Iványi Péter. Lisp programozási nyelv. Kifejlesztése: 1960-ban, John McCarthy, Massachusetts Institut of Technology LISt Processing – Lista feldolgozás Fortran –nal egyidős Szakértői rendszerekben, mesterséges intelligencia kutatásban használj(t)ák
E N D
Grafikus tervezőrendszerek programozása Iványi Péter
Lisp programozási nyelv • Kifejlesztése: 1960-ban, John McCarthy, Massachusetts Institut of Technology • LISt Processing – Lista feldolgozás • Fortran –nal egyidős • Szakértői rendszerekben, mesterséges intelligencia kutatásban használj(t)ák • „Programozható programnyelv”-ként is szokták definiálni
AutoCAD „programozása” • AutoCAD egy alap CAD rendszer • A CAD rendszer szinte minden aspektusa módosítható • ActiveX • Visual Basic • AutoLisp és Visual Lisp • ObjectARX • Menük módosítása • DIESEL – szöveg processzálás, pl. státusz sor
AutoCAD és ActiveX • Microsoft COM (Component Object Model) technológiára épül • A rajzok és rajz elemek megosztása más alkalmazásokkal, Word, Excel • Feladatok automatizálása • Több programozási nyelven elérhető • Visual Basic • Java • C++
AutoCAD és ObjectARX • AutoCAD Runtime Extension • DLL (Dynamic Link Library) • C és C++ nyelven új parancsokat lehet létrehozni • Közvetlenül az AutoCAD objektumokat kezeli
AutoLisp • AutoCAD rendszer hatékonyságát növelheti • Rutin feladatokat automatizálhat • Módosítani lehet rendszerváltozókat • Módosítani lehet rajzokat, rajz elemeket • AutoCAD legrégebbi programozói környezete • Sok AutoCAD parancs maga is AutoLisp függvény
ObjectARX void chngAtt() { ads_name entres; ads_point ptres; AcDbObjectId _Id, _attId; AcDbObjectIterator *pIttr = NULL; if(acedEntSel("Select a Block Reference", entres, ptres) != RTNORM ) { //Selection failed return; } acdbGetObjectId(_Id, entres); AcDbObjectPointer pRef(_Id,AcDb::kForRead); if(pRef.openStatus()!=Acad::eOk) { //Open failed return; }
ObjectARX pIttr = pRef->attributeIterator(); while(!pIttr->done()) { _attId = pIttr->objectId(); AcDbObjectPointer pAtt(_attId,AcDb::kForWrite); if(pAtt.openStatus()==Acad::eOk) { pAtt->setTextString("We changed this"); break; } pIttr->step(); } delete pIttr; }
Visual Basic Option Explicit Sub chngAtt() Dim objEnt As AcadObject Dim objRef As AcadBlockReference Dim varAtts As Variant Dim objAtt As AcadAttributeReference Dim emptyPt As Variant ThisDrawing.Utility.GetEntity objEnt, emptyPt, "Select Block: „ If objEnt.ObjectName = "AcDbBlockReference" Then Set objRef = objEnt If objRef.HasAttributes Then varAtts = objRef.GetAttributes Set objAtt = varAtts(0) objAtt.TextString = "We changed this" End If End If End Sub
AutoLisp (defun C:chngAtt (/ Mainent entList entAtt entNewAttVal) (setq Mainent (entsel)) (setq entList (entget (car Mainent))) (setq entAtt (entget (entnext (cdr (assoc -1 entList))))) (setq entNewAttVal (subst (cons 1 "We changed this") (assoc 1 entAtt) entAtt) ) (entmod entNewAttVal) (entupd (car Mainent)) (princ) )
Visual Lisp • Az AutoLisp „új generációja” • Nem teljesen kompatibilis • Foglalt szimbólumok nem újradefiniálhatók • Függvények nem listák • Fejlesztő környezet • Editor • Szintaxis ellenőrzés és szintaxisnak megfelelő szinezés • Debugger hibakereséshez • Több file menedzselése
Lisp • Language of Infinite Stupid Parantheses (megszámlálhatatlan ostoba zárójelek nyelve) ; megjegyzés (elem1 (elem2 (elem3 elem4) (elem5 ‘(elem6 . elem7)) ) )
Lisp megjegyzések • Egyszerű megjegyzés: pontos vesszőtől ( ; ) a sor végéig • Több soros megjegyzés: két jel közötti rész a megjegyzés ;| szöveg |;
Lisp megjegyzések példa ; Megjegyzés teljes sorban (elema elemb elemc) ; sorvégi megjegyzés (elem1;| megjegyzés |; (elem2 elem3)) (elem4 ;| több soros megjegyzés, akár Lisp is lehet (elem1) |; elem5)
A nyelv jelkészlete • Betűk, számok, szimbólumok • Elválasztó jelek • Szóköz, sor vége, TAB • Speciális jelek • Kettős aposztrof (”), sztring esetén • Vezérlőjelek: backslash ( \ ) • „le nem írható jelek esetén”,
Jelkészlet példa (elem1 ”adat: \”4\”\n”) (elem2 elem3 . elem4) (elem5 ;megjegyzés elem6 elem7 ‘(elem8 elem9) )
AutoLisp alapelemek • A nyelv programok és adatok leírására egyetlen szerkezetet használ, a John Carthy által kidolgozott szimbólikus kifejezéseket, S-kifejezéseket.
AutoLisp alapelemek • Alapelemek: • Listák • Atomok sorozata zárójelek között • Atomok • Definíció: • „minden ami nem lista”, • a nyelv eszközeivel nem bontható tovább • Konstans atomok • Szimbólikus atomok • Speciális atomok nil, t
Konstans atomok • Az atom értéke maga az atom. • Számok: egész (integer), valós (real) szám 1234, 56.78, 123.56e-3 • Szövegek (string), kettős aposztrof között ”abcdefghijk...” • Kiválasztási halmaz (selection set) • Objektum név (entity name) • File leíró (file descriptor)
Szimbólikus atomok • Szimbólikus atomok = Változók • A változó neve betűvel kezdődik és minden jel követheti, kivétel az elválasztó jelek Példa: point1, point2, teljes_hossz • A változó egy értéket jelöl, tárol
Speciális atomok • Értékét nem lehet/szabad felüldefiniálni • t– igaz értéket jelöli • nil– hamis érték és üres lista () (atom amely lista is !!!) • pi– 3.141592 • pause– ”\\”
Listák • Kerek zárójelek között elhelyezett, szóközökkel elválasztott atomok listája. • A listák egymásba ágyazhatók. • Egymásba ágyazás szintjeinek nincs korlátja. • Üres lista: ()vagy nil ( 1 2 3 ) ( 1 ( 2 3 ) ( 4 ( 5 6 ) ) ) ( 1 ”text” 145.67 )
Hibás listák • (ez (nincs befejezve) • (ez mar)(ket lista) • (tul (sok (a)) bezaro) zarojel) • )hibasan kezdodik a lista) • hianyzik a kezdo zarojel • (ez egy list (es egy)) atom
Lista típusok • Adat lista: (123 345.56 ”qwerty” 78e-6) • Pont lista: • 2D:(0.0 1.0) • 3D: (12.3 45.6 0.0) • Függvény lista: (+ 3 4) (setq qq 1.2)
Kiértékelés • LISP = Lista feldolgozás • Feldolgozás folyamata = kiértékelés • AutoLISP egy interpretált nyelv • Interpreter szíve az evaluator = kiértékelő, értelmező • A felhasználó interaktív módon párbeszédet folytat az értelmezőprogrammal.
Kiértékelési ciklus • Az értelmező program beolvas egy S-kifejezlst • A kifejezést kiértékeli • meghatározza a kifejezés értékét • mintha függvény lenne • lehetnek mellékhatások • A kifejezés értékét kiírja, majd kezdi az 1. ponttól
Kiértékelési ciklus • A három lépésnek megfelel egy-egy LISP függvény: READ, EVAL, PRINT • Ezért nevezik ezt a végtelen ciklust: • read-eval-print ciklusnak • A beolvasás előtt még kiírhatja a prompt-ot Parancs: Command:
Kiértékelés sorrendje • Konstans atom értéke: maga az atom • Szimbólikus atom értéke: a szimbólumhoz rendelt értéke • Lista esetén függvényként értékeli ki
AutoLisp függvények • A függvények általános formája: (művelet A ... B) így sohasem kérdés hogy melyik művelet hajtódik végre először • Ellentétben a matematikai kifejezéssel: 3 + 5 * 4 • amit csak megfelelő gyakorlás után tudunk megoldani: először a szorzást majd az összeadást hajtjuk végre
Kezdjünk el programozni! • Az egyik legegyszerűbb számítógép a zsebkalkulátor • Egyszerű számítási műveletek: • (+ 5 5) • (+ -5 5) • (+ 5 -5) • (- 5 5) • (* 3 4) • (/ 8 12)
Függvény lista kiértékelése • A kiértékelés balról jobbra történik • Először az argumentumokat értékeli ki, majd a teljes kifejezést • A kiértékelés eredménye is egy kifejezés: atom vagy lista !!! • Mivel az adat lista és a függvény lista „azonos” ezért megvalósítja a Neumann elvet: adat és program nem különböztethető meg
Műveletek egymásba ágyazása • Egy művelet argumentuma lehet szám vagy egy másik művelet. • Egymásbaágyazás esetén először a legbelső zárójel közötti részt redukáljuk számmá, majd a követkető szintet és így tovább.
Kiértékelési példa 1. (* (+ 2 2) (/ (* (+ 3 5) (/ 30 10)) 2)) = (* 4 (/ (* 8 3) 2)) = (* 4 (/ 24 2)) = (* 4 12) = 48
Kiértékelési példa 2. (+ 2 (/ 12 4) (* 2 2)) • Argumentumok kiértékelése • 2 = 2 • (/ 12 4) = 3 • (* 2 2) = 4 • Kifejezés kiértékelése (+ 2 3 4) = 9
Kiértékelési példa 3. (+ 2 (/ 5 10)) • Argumentumok kiértékelése • 2 = 2 • (/ 5 10) = 0 !!! • Kifejezés kiértékelése (+ 2 0) = 2 • Ha az összes argumentum integer akkor az eredmény is integer !!!
Kiértékelési példa 4. (+ 2 (/ 5.0 10)) • Argumentumok kiértékelése • 2 = 2 • (/ 5.0 10) = 0.5 !!! • Kifejezés kiértékelése (+ 2 0.5) = 2.5
Kiértékelés elkerülése • Kifejezés „szó szerinti, konstansként” való kezelése: • (quote (1 2 3)) = (1 2 3) • ‘(1 2 3) = (1 2 3) • (1 2 3) = error
AutoCAD parancs használata • AutoCAD parancsot hajt végre az AutoLISP programból (command argumentumok ... ) • Vonalat rajzol a 0,0 ponttól vízszintesen (command ”vonal” ”0,0” ”1,0” ””) • Az üres sztring (””) jelentése: a SPACE vagy az ENTER billentyű lett lenyomva • Még visszatérünk rá
Függvények definíciója (defun szimbólum (arg1 arg2 ...) kifejezések ... ) • szimbólum – a függvény neve • arg1, arg2, ... – a függvény argumentumai • kifejezések – a függvény végrehajtása során értékelődnek ki • Még visszatérünk rá
Példa (defun xy () (command ”vonal” ”0,0” ”1,0” ””) (command ”vonal” ”0,0” ”0,1” ””) )
Definiált atomok, függvények listázása • A változók alapértéke: nil(speciális atom) • Definiált atomok, szimbólumok listázása: (atoms-family 0) • Változó definiált-e? (atoms-family 1 ‘(”setq” ”pp”)) • Rendszerváltozók lekérdezése AutoCAD paranccsal: setvar