Jistě si kladete otázku: "Má vůbec smysl používat objekty ActiveX v AutoLISPu, není to zbytečné?". Na tuto otázku je jednoduchá odpověď: "Ano, smysl to má". Tyto tvrzení doložíme následujícím příkladem:
(setq výsledek (cdr (assoc 40 (entget circle-entity))))
Z řádku kódu je patrné, že musíme znát práci s entitami, dxf kód poloměru (číslo 40), potom příkazy pro práci se seznamy atd.
(setq výsledek (vla-get-radius circle-object))
Z příkladu je patrné jak jednoduché je použití objektů ActiveX s AutoLISPem. Připočteme-li k jednoduchosti použití ještě podstatné zrychlení chodu programů a zpřehlednění kódu samotného, myslíme že použití ActiveX stojí za úvahu.
Ale to ještě není všechno. Objekty ActiveX umožní AutoLISPu přístup k jiným aplikacím. Tím pádem se AutoLISP vyrovnává programovacím jazykům jako je Visual Basic pro Aplikace.
Doufáme, že výše uvedenými argumenty jsme přesvědčili všechny zastánce klasického AutoLISPu.
Následujících pár odstavců Vás naučí jak pracovat s objekty ActiveX v AutoLISPu. Než je začnete procházet doporučujeme Vám seznámit se s objektovým modelem AutoCADu a způsobem práce s rozhraním ActiveX - část ActiveX automatizace.
Standardní AutoLISP nemá podporu funkcí ActiveX. Abychom mohli používat podporu objektů ActiveX musíme nejprve aktivovat funkce Visual LISPu. Aktivace funkci Visual LISPu se uskuteční napsáním příkazu
(vl-load-com)
Z příkazu je patrné, že nahrává podporu com objektů.
Nyní již můžeme používat funkce ActiveX v AutoLISPu
Abychom si zajistili přístup k objektům AutoCADu musíme nejprve navázat spojení s objektem AutoCAD application. Spojení navážeme pomocí funkce vlax-get-acad-object.
Příklad navázání objektu application:
(setq acadObjekt (vlax-get-acad-object))
Funkce vlax-get-acad-object vrací pointer na objekt aplikace AutoCADu. Hodnota pointru je ve tvaru VLA-object (VLisp ActiveX object).
Pokud se odkazujeme pomocí ActiveX funkcí, musíme specifikovat VLA-object typ. To je důvod proč nemůžeme použít funkci entget pro přístup k objektu a poté se na tento objekt odkazovat pomocí objektů ActiveX. entget totiž vrací datový typ ename.
Abychom mohli přistupovat na objekty uložené ve výkresu AutoCADu musíme si zpřístupnit objekt Document (reprezentuje výkres v AutoCADu). Objekt Document zpřístupňuje většinu negrafických informací obsažených ve výkresu jako například:
Přístup na negrafické vlastnosti se uskuteční pomocí objektů vlastností, které mají podobná jména jako vlastnosti (př. layers).
Pointer na objekt document získáme pomocí vlastnosti objektu application - ActiveDocument. V našem příkladu jsme si pointer na objekt application uložily do proměnné acadObjekt. Zpřístupnění (získání) aktivního dokumentu uskutečníme pomocí příkazu vla-get-ActiveDocument jm_objektu_application.
Příklad získání pointru na aktivní dokument
(setq acadDokument (vla-get-ActiveDocument acadObject))
Abychom mohli přistupovat ke grafickým objektům uloženým ve výkresu musíme si zpřístupnit ještě modelový nebo výkresový prostor výkresu. Výkresový prostor si můžeme zpřístupnit pomocí vlastnosti objektu Document - PaperSpace. Zpřístupnění modelového prostoru je možné pomocí vlastnosti objektu Document - ModelSpace.
Příklad získání pointru na modelový prostor dokumentu:
V našem příkladu požadujeme kreslit objekty do modelového prostoru výkresu - použijeme tedy funkci vla-get-ModelSpace:
(setq modelProstor (vla-get-ModelSpace acadDokument))
Pokud nevíte jaká funkce přidává například objekt do výkresu, podívejte se do referenční příručky Visual Basicu pro Aplikace. Jakmile zjistíte název metody ve VBA přidejte před ní prefix vla-. Tím jste získali jméno funkce použitelné v AutoLISPu.
Příklad nalezení jména funkce pro přidání kružnice do výkresu:
V referenční příručce Visual Basicu pro Aplikace nalezneme funkci pro přidání kružnice: addCircle. K této funkci přidáme prefix používaný v AutoLISPu - prefix vla-. Dostanete jméno funkce vla-addCircle.
Poznámka: V AutoLISPu je jedno jestli jméno funkce napíšete jako vla-AddCircle nebo vla-addcircle. Programovací jazyk AutoLISP není "case-sensitive".
V tuto chvíli máme již všechny potřebné objekty přístupné a můžeme pracovat s objekty ve výkresu.
Sloučíme-li všechny úseky kódu uvedené v předchozích odstavcích a přidáme-li funkci pro vykreslení kružnice dostaneme následující kód funkce:
(vl-load-com) ; aktivování rozhraní ActiveX (defun vykresliKruznici() (setq acadObjekt (vlax-get-acad-object)) ; získání ukazatele na objekt aplikace AutoCAD (setq acadDokument (vla-get-ActiveDocument acadObjekt)) ; získání ukazatele na objekt Document (aktuální výkres) (setq modelProstor (vla-get-ModelSpace acadDokument)) ; získání ukazatele na modelový prostor výkresu (setq kruznice (vla-addCircle modelProstor (vlax-3d-point '(50.0 50.0 0.0)) 10.0 ) ) ; přidání kružnice do modelového prostoru ) ; všimněte si vytvoření 3D bodu - střed kružnice )