AutoLISP

a LISP programnyelv egyik változata

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

 
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 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

  • Joseph Smith -- Rusty Gesner: Maximizing AutoLISP: The Complete Guide to Programming AutoCAD with AutoLISP! NRP, ISBN 1562050850

Külső hivatkozások szerkesztés