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 szerkesztés
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 szerkesztés
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 szerkesztés
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 szerkesztés
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ó szerkesztés
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 szerkeszté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 szerkesztés
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 szerkesztés
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 szerkesztés
- Maczkó István -- Nagy György: LISP, AutoLISP programozás AutoCad-ben IBM PC-n LSI, Bp., LSI, 1989, ISBN 9635930291
- Zimányi Magdolna -- Kálmán László -- Fadgyas Tibor: A LISP programozási nyelv, Bp., Műszaki, 1989, ISBN 9631081834
- Common Lisp
- Joseph Smith -- Rusty Gesner: Maximizing AutoLISP: The Complete Guide to Programming AutoCAD with AutoLISP! NRP, ISBN 1562050850