![]()
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
)
![]()