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
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ó:
A parancssorba begépelt AutoLISP függvény azonnal kiértékelődik;
(setqa'(12.03.012.5))
Egyes AutoCAD parancsok során az adatok helyére kiértékelhető AutoLISP függvényeket lehet használni;
Az előre megírt szövegfájl betölthető a (load) függvénnyel, például a (load "valami.lsp") betölti az AutoCAD keresési útvonalán lévő valami.lsp nevű fájlt, ha van ilyen;
Automatikus betöltés a rendszer megfelelő konfigurálásával: a rendszer minden induláskor és új rajz nyitásakor lefuttatja az acad.lsp nevű fájlt;
Menübe integrálva kattintással indítható. A legtöbb dd-vel kezdődő AutoCAD parancs ilyen, (pl. dducs) .
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(setqe1(entget(car(entsel)))); eredményeSelectobject:((-1.<Entityname:2a20520>)(0."LINE")(5."4C")(100."AcDbEntity")(67.0)(8."0")(100."AcDbLine")(105.682382.711630.0)(113.892544.659940.0)(2100.00.01.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:
Az előzőekben kiválasztott e1 változóban tárolt objektum színét adja vissza:
(dxf8e1);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(defunkob(a/e1)...függvénytö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:
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(defunc:lj(/layerpickcolorline); LJ = layer jump rövidítése -- ugorj a kiválasztott fóliára(setqpick(entsel)layer(dxf8(entget(carpick)))color(dxf62(entget(carpick)))line(dxf6(entget(carpick))))(ifpick(progn(setvar"CLAYER"layer)(setvar"CECOLOR"(itoacolor))(setvar"CELTYPE"line)))(princ))
; lista megfordíto fuggv.(SETQreverse(LAMBDA(X)(COND((ATOMX)X)(T(APPEND(reverse(CDRX))(CONS(CARX)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(defunmy-err(msg)(if(/=msg"Function cancelled")(alert(strcat"\nError: "msg)))(setq*error*olderr)(prin1)); az x2 nevű parancs definíciója(defunc:x2(); hibakezelő aktiválása(setqolderr*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
Maczkó István -- Nagy György: LISP, AutoLISP programozás AutoCad-ben IBM PC-n LSI, Bp., LSI, 1989, ISBN 9635930291