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