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 bélyegkép|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ó: A parancssorba begépelt AutoLISP függvény azonnal kiértékelődik; (setq a '(12.0 3.0 12.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 (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 Maczkó István -- Nagy György: LISP, AutoLISP programozás AutoCad-ben IBM PC-n LSI, Bp., LSI, 1989, Zimányi Magdolna -- Kálmán László -- Fadgyas Tibor: A LISP programozási nyelv, Bp., Műszaki, 1989, Common Lisp
Joseph Smith -- Rusty Gesner: Maximizing AutoLISP: The Complete Guide to Programming AutoCAD with AutoLISP! NRP,
Külső hivatkozások Tolvay-Rosca Ferenc: A számítógépes tervezés alapjai. AutoLISP ÉS Autodesk Inventor alapismeretek Visual LISP (angol) AutoCAD története (angol) DXF Reference DCL Tutorial
Kategória:Programozási nyelvek Kategória:CAD Kategória:Funkcionális programozási nyelvek