AutoLISP

Az AutoLISP a LISP programnyelv (XLISP) egyik változata. Az AutoLISP eredetileg az AutoCAD (egy számítógéppel segített tervezőrendszer) számára készült, ám napjainkra a CAD-rendszerek jelentős része képes az AutoLISP programok futtatására is. Az AutoCAD maga is tartalmaz AutoLISP-ben írt részeket (.lsp kiterjesztésű fájlok). Az AutoLISP-en keresztül el lehet érni az AutoCAD rajzi adatbázisát, rendszerváltozóit és parancsait, ezeket igény szerint módosítani lehet; továbbá önálló, AutoCAD-en belül futó alkalmazásokat készíthetünk vele.

Használata

Fogaskerék gyártás fogasléc-szerszám segítségével. Az eredeti animáció AutoLISP-ben készült és AutoCAD-en belül fut, a Wikipédia kedvéért GIF fájlra lett konvertálva

AutoCAD rendszerben az AutoLISP használatához nincs szükség külön programra. Ha az AutoCAD program aktív, az AutoLISP is rendelkezésre áll, kivéve az AutoCAD LT (light = könnyített) változatait. A rendelkezésünkre álló AutoLISP programkód többféle módon használható:

(setq a '(12.0 3.0 12.5))

Korszerű és jó AutoLISP program írásához alaposan ismerni kell az AutoLISP nyelvet, az AutoCAD-et, a rajzi adatbázis felépítését (DXF-csoportkódokat), a DCL-nyelvet, továbbá a feladatot is egyértelműen kell megfogalmazni.

A nyelv elemei

A nyelv alapvetően kétféle elemet tartalmaz: atomokat és listákat (S-kifejezéseket). Az atomok (azon elemek, melyek tovább már nem bonthatók) lehetnek konstansok és szimbolikusak (változók). A listák atomokból vagy további listákból állhatnak. Különleges elem az üres (érték nélküli) atom, amely speciális nevet kapott nil. Ugyancsak nil értéket kap az üres lista.

A megjegyzés sorok pontosvesszővel kezdődnek és a sor végéig tartanak.

Függvények és változók

A procedurális nyelvekben megszokott parancsok, belső utasítások neveit LISP-ben: függvények-nek hívjuk. Minden függvény zárójellel kezdődik és zárójellel végződik. A függvények részére argumentum(ok) , más szóval paraméterek adhatók át. Néhány függvény paraméter nélküli. A paraméterek száma általában 128 vagy 255 lehet, de ez nem igazi korlátozás, mivel tetszés szerinti felépítésű listák is átadhatók paraméterként.

; paraméter nélküli (princ) ; paraméteres: egy fehér színű vonalra kattintunk (setq e1 (entget (car (entsel)))) ; eredménye Select object: ((-1 . <Entity name: 2a20520>) (0 . "LINE") (5 . "4C") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbLine") (10 5.68238 2.71163 0.0) (11 3.89254 4.65994 0.0) (210 0.0 0.0 1.0))

A felhasználó szabadon definiálhat függvényeket a (defun) függvény hívásával. A következő dxf nevű függvény visszaadja a kiválasztott elem DXF-csoportkódját:

; dxf.lsp (defun dxf(code elist) (cdr (assoc code elist)) ) ; /* eof dxf.lsp */

Az előzőekben kiválasztott e1 változóban tárolt objektum színét adja vissza:

(dxf 8 e1) ;eredménye "0"

A változók élettartam/láthatóság szerint lehetnek globálisak, vagy lokálisak. A létrehozott változó külön intézkedés hiányában globális. A megmaradt változók értékei ismételt futtatáskor hibás eredményt adhatnának, ezért a paraméterlistában a / jel után soroljuk fel azon feleslegessé váltó változókat, melyeket a függvény hívása után törölni kívánunk:

; az a változó paraméter, az e1 változó pedig lokális (defun kob (a / e1) ... függvény törzse ... )

Gyakran azért írunk AutoLISP függvényeket, hogy új AutoCAD parancsokat hozzunk létre. Ehhez nem kell mást tennünk, mint egy paramétert nem váró függvény definíciójában a függvény nevét kiegészíteni a c: előtaggal a következő példák szerint:

; parancssorba ''Hello World''-öt ír (defun c:hw() (princ "\nHello World!") ) ; téglalap rajzolása: (defun c:teglalap ( / p1 hossz szelesseg w p2 p3 p4) (setq p1 (getpoint "\nKezdőpont: ") hossz (getdist p1 "\nHossz: ") szelesseg (getdist p1 "\nSzélesség: ") w (getangle p1 "\nSzög: ") p2 (polar p1 w hossz) p3 (polar p2 (+(/ pi 2)w) szelesseg) p4 (polar p3 (+ pi w) hossz) ) (command "_.LINE" p1 p2 p3 p4 "_c") (princ) )

Ezek után az AutoCAD parancssorába beírt HW parancs mindig kiírja a Hello World! szavakat. Hasonlóan a TEGLALAP parancs kiadására bekéri az adatokat és megrajzolja a kért téglalapot. Figyeljük meg, hogy a (command ""_.LINE" kezdetű sorban angol nyelvű vonal parancsot használtunk! Az aláhúzás és a pont együttesen biztosítják, hogy programunk bármilyen nyelvű AutoCAD alatt működjön, akkor is, ha esetleg a vonalrajzoló parancsot átdefiniálták!

Rajzi adatbázis elérése

Az AutoLISP teljeskörű elérést és lekérdezést biztosít a rajzi adatbázishoz (és az R12-es AutoCAD óta) SQL nyelven is kezelhetünk külső adatokat.

; a kiválasztott elem fóliáját, vonaltípusát és színét állítja be aktuálisnak -- a szín/vtipus nem lehet byblock vagy bylayer (defun c:lj(/ layer pick color line) ; LJ = layer jump rövidítése -- ugorj a kiválasztott fóliára (setq pick (entsel) layer (dxf 8 (entget (car pick))) color (dxf 62 (entget (car pick))) line (dxf 6 (entget (car pick))) ) (if pick (progn (setvar "CLAYER" layer) (setvar "CECOLOR" (itoa color)) (setvar "CELTYPE" line) ) ) (princ) )

Rekurzió

A LISP nyelvcsalád egyik erőssége a rekurzió:

; lista megfordíto fuggv. (SETQ reverse (LAMBDA (X) (COND ((ATOM X) X) (T (APPEND (reverse (CDR X)) (CONS (CAR X) NIL ))))) )

Hibakezelés

Hibás adatok, vagy felhasználói megszakítás esetén zavaró lehet, hogy a várt adatok helyett programtöredék íródik ki. Ennek elkerülésére a felhasználó saját hibakezelő rutint hozhat létre, melyet a program elején aktivál, a program végén pedig visszaállítja az előző állapotot:

;saját hibakezelő, DCL alert-et használ (defun my-err(msg) (if (/= msg "Function cancelled") (alert (strcat "\nError: " msg)) ) (setq *error* olderr) (prin1) ) ; az x2 nevű parancs definíciója (defun c:x2() ; hibakezelő aktiválása (setq olderr *error* *error* my-err ) ... függvénytörzs ... ; hibakezelő visszaállítása (setq *error* olderr) )

Szintén a hibakezelés másik problémája, ha sok elemen kell műveletet végeznünk. Megfelelő hibakezelés híján csak egyesével tudnánk ,,visszacsinálni" a téves változtatást, ami időrabló lehet. Ennek elkerülésére a program elején adjuk ki a

(command "_.UNDO" "_GROUP")

parancsot, a program végén pedig a

(command "_.UNDO" "e")

parancsot. Ha a rendszerváltozókat is megfelelően állítjuk be, pl. CMDECHO=0 , akkor új parancsunk pontosan úgy fog viselkedni mint bármely más ,,tisztességes" AutoCAD parancs.

Párbeszéddobozok, dialógusok

Az R12-es AutoCAD óta lehetőség van párbeszéddobozok programozására, függetlenül az AutoCAD-et futtató operációs rendszertől. A párbeszéddobozok DCL-nyelven íródnak és a DCL-nyelv csak a megjelenítésre korlátozódik. Aktiválásukat kitöltésüket, mezők adatainak lekérdezését az AutoLISP végzi.

Története

Az AutoLISP-et a David Michael Betz által kifejlesztett XLISP korai verziójából alakították ki. A programnyelv az 1986. januárban kihozott AutoCAD 2.18 verzióban jelent meg és folyamatosan fejlesztették az 1995. februárban megjelent R13-ig. Ezután az Autodesk a VBA, .NET és ObjectARX fejlesztéseket részesítette előnyben, de az AutoLISP továbbra is része a programnak és igen sok fejlesztés született általa.

A Visual-LISP az AutoLISP lényegesen továbbfejlesztett változata, ez integrált fejlesztő rendszert (IDE), debuggert, és compilert is tartalmaz. Ezt az eszközt a Basis Softwere cég fejlesztette és az AutoCAD 2000-től a program részévé tette az AutoLISP mellett. Ez a szoftver amellett, hogy a régi forrásnyelvi programok és egyéb eszközök használatát is lehetővé tette, VBA-szerű hozzáférést ad az AutoCAD objektum modelljéhez, reaktorjaihoz és általános ActiveX szolgáltatást nyújtott.

Első megjelenése óta több ezer alkalmazás készült ezzel a fejlesztési eszközzel.

További információk

Külső hivatkozások