Přístup k objektům pomocí VisualLISPu

Kategorie » téma: LISP

02.08.2010 11.01 | Jan Panoch | Komentáře: 0 komentářů | Přečteno: 9796x

V předchozím příspěvku “Nástroj pro rychlé zjištění informací o entitě” jsme si vytvořily nástroj, který do příkazové řádky vypíše vlastnosti vybraného objektu. Protože jsme v tomto příspěvku již mírně zasáhli do oblasti VisualLISPu ukážeme si v dalším volném pokračování princip práce s vlastnostmi objektu právě pomocí tohoto programovacího jazyka.

VisualLISP nahrazuje a rozšiřuje původní AutoLISP, přitom ale umí pracovat se staršími programy napsanými v AutoLISPu a i s jeho funkcemi. Hlavní přínos VisualLISPu je umožnění přístupu k objektům AutoCADu a ostatních aplikací na AutoCADu založených pomocí rozhraní ActiveX (což tedy z pohledu roku 2010 není zas taková bomba). Pro uživatele to prakticky přináší mimo jiné daleko pohodlnější přístup k objektům a jejich vlastnostem.

Na začátek vytvoříme ve VisualLispu jednoduchou funkci, která bude podobná nástroji z předchozího příspěvku. Příkazem VLIDE nebo VLISP zobrazíme editor kódu VisualLISPu. Pomocí ikony, přes File / New File nebo pomocí Ctrl+N založíme a uložíme nový soubor, který pojmenujeme třeba VlastnostiEntiy.lsp

Kód prvního programu bude vypadat následovně:

(defun c:info  ()
    (vl-load-com)

    (setq  entity1           (entsel "\nVyberte  objekt: ")
           entity2           (car entity1)
           vla-entity        (vlax-ename->vla-object entity2)
    )
)

K tomu uveďme pár základních informací.

defun        DEFine FUNction definuje jméno funkce, tedy jak budeme funkci volat
c: značí, že se bude jednat o nový příkaz AutoCADu
info je jméno funkce. Funkci budeme tedy volat zadáním příkazu info do příkazového řádku. Kdybychom vynechali c: museli bychom funkci volat následovně: (info)
() do prázdných závorek za jménem funkce se píší lokální a globální proměnné, kterými se prozatím nebudeme zabývat
(vl-load-com)      funkce, kterou jsme použili už v předchozím příspěvku v nástroji toolpalety. Před tím, než použijeme jakoukoliv z ActiveX funkcí VisualLISPu, musíme ActiveX inicializovat, a to se děje právě pomocí funkce (vl-load-com)
setq        zavede proměnnou a zároveň do ní vloží hodnotu. Tato funkce by šla přirovnat k funkci Dim známé z Visual Basicu nebo VBA
entity1, entity2 a vla-entity jsou názvy našich proměnných
entsel  funkce jež vyzve k výběru jednoho objektu z modelového nebo výkresového prostoru
"\nVyberte  objekt: " výzva, která se zobrazí na příkazové řádce, případně u kurzoru – jedná se o parametr funkce entsel  Znak \n zajistí, aby se výzva začala psát na nový řádek
Než přistoupíme k vysvětlení dalších řádků načteme si funkci do otevřeného výkresu AutoCADu, To provedeme ikonou Load Active Edit Window
 
Nyní naši funkci spustíme napsáním příkazu info do příkazové řádky. Objeví se výzva k vybrání objektu. Vybereme jakoukoliv entitu a vrátíme se do editoru VisualLISPu. Zde poklepeme na proměnnou entity1 nebo ji vybereme do bloku a klepneme na ikonu Inspect
 
V samostatném okně se objeví hodnota proměnné. Vidíme, že proměnná je tipu LIST.
 

LIST je specifický tip proměnné charakteristický právě pro Visual nebo AutoLISP. Vždyť LISP pochází s LISt Processing. Jednoduše řečeno je LIST skupina dat, různého typu seskupená pod jednou proměnnou. Proměnná typu LIST může obsahovat celá čísla, reálná čísla, textové řetězce… nebo další LIST.  V našem případě, obsahuje LIST dva elementy. Na prvním místě [0] je to jméno entity a na druhém místě [1] souřadnice výběrového bodu – tedy kam jsme klepli při výběru entity. Tento bod nemusí nutně ležet na vybrané entitě. Mimochodem právě tento element je další list. Poklepeme-li si na něj zobrazí se nám v celé své kráse.


 

 

Protože nás více zajímá samotná vybraná entita než výběrový bod, soustředíme se na první element listu. Zavedeme novou proměnnou entity2, do níž pomocí funkce car vložíme první element LISTu z proměnné  entity1. Funkce car obecně slouží k odfiltrování prvního elementu listu.

Doposud jsme s vybranou entitou pracovali jen pomocí funkcí AutoLISPu. Funkcí vlax-ename->vla-object převedeme vybranou entitu na VLA objekt a můžeme na něj tak aplikovat funkce VisualLISPu.

Protože každá funkce musí být ve VisualLISPu uzavřena v závorkách, je závorkou na předposlední řádce ukončena funkce setq a na poslední řádce pak funkce defun   

Jak je tedy vidět pomocí funkce setq lze definovat více proměnných najednou. Stejný význam by měl i následující zápis.

(defun c:info  ()
    (vl-load-com)

    (setq entity1  (entsel "\nVyberte  objekt:  "))
    (setq entity2  (car entity1))
    (setq vla-entity  (vlax-ename->vla-object entity2))
)

Nyní můžeme poklepat na proměnnou vla-entity tak, aby se vybrala do bloku (zamodřila) a klepneme na ikonu Inspect. Objeví se dialogové okno s vlastnostmi entity, které odpovídá výpisu do příkazové řádky nástroje na zjištění vlastností entity z předchozího příspěvku. Vypsané vlastnosti se samozřejmě liší podle toho, jaký objekt vybereme. V případě na obrázku vpravo byla vybrána kružnice.
 

Jak jsme uvedli, každá funkce ve VisualLISPu musí být v závorkách. Za otevírací závorkou je uvedeno jméno funkce (modře) a dále následují její parametry. Parametrem může ovšem být i další funkce. Tímto způsobem lze do sebe jednotlivé funkce vnořovat. Použitím tohoto pravidla můžeme celý program zjednodušit tak, že bude podobný nástroji z předchozího příspěvku.

(defun c:info  ()
    (vl-load-com)

    (setq    vla-entity      (vlax-ename->vla-object(car (entsel "\nVyberte  objekt: "))))
    )

Pokud provedeme jakékoliv změny v kódu funkce, musíme ji před odzkoušením znovu načíst do aktuálního výkresu pomocí ikony Load Active Edit Window

Poklepeme-li na jakoukoliv vlastnost, která se zobrazuje v dialogovém okně Inspect: VLA-OBJECT objeví se další okno s podrobnějšími informacemi.

Asi Vás již napadlo, že jakmile se  dostaneme k takto naservírovaným vlastnostem objektů, je již velice snadné je pomocí VisualLISPu načítat a měnit. To bude obsahem příštího příspěvku.

Jan Panoch

 Související články:

1) "Nástroj pro rychlé zjištění informací o entitě", Jan Panoch, 26.7.2010

2) "Přístup k objektům pomocí VisualLISPu", Jan Panoch, 2.8.2010

3) "Přístup k vlastnostem objektům pomocí VisualLISPu", Jan Panoch, 23.8.2010

4) "Zapsání textu pod kótovací čáru pomocí VisualLISPu", Jan Panoch, 23.8.2010

5) "Opakované zapsání textu pod kótovací čáru pomocí VisualLISPu", Jan Panoch, 23.8.2010

6) "OpenDCL", Jan Panoch, 3.9.2010

7) "Příklad vytvoření dialogu v OpenDCL Studiu", Jan Panoch, 6.9.2010

8) "Obslužný kód pro ovládací prvky OpenDCL", Jan Panoch, 13.9.2010

9) "Spojení lsp funkce a odcl dialogu v jeden soubor", Jan Panoch, 13.9.2010

10) "Co je třeba k běhu funkcí s ODCL dialogy", Jan Panoch, 13.9.2010

11) "Funkce na výpočet průřezových charakteristik s ODCL paletou", Jan Panoch, 13.9.2010

(odkazy se svolením autora článků doplnil JT) 

Komentáře:

Tento článek zatím neobsahuje žádné komentáře.

Přidat komentář

 *
 *
 
 *

*) Povinné položky jsou označeny hvězdičkou.