Programujeme: Selekce, interaktivní výběr objektu uživatelem
Publikováno: 6. března 2014 | Zobrazeno: 5323x
Dnes se konečně dostávám na dlouho slibované a zajímavé téma, kterým je selekce. Bez ní bychom se při programování maker většinou daleko nedostali. Pokud tedy neuvažujeme makra, která nevyžadují interaktivitu s uživatelem.
Když si představíte běžnou práci při modelování, každé kliknutí na nějaký objekt ve stromu nebo na modelu znamená v programu (makru) použití selekce. Ve většině případů budeme selekci používat pro určení vstupů (z čeho / na čem se bude tvořit) nebo cílů (kde se to bude tvořit). Výběr uživatelem je první z hlavních funkcionalit selekce. Druhou je vyhledávání objektů v modelu / sestavě podle vyhledávacího dotazu, který musí splňovat určitou syntaxi. Výsledkem obojího je seznam (kolekce) uživatelem vybraných nebo vyhledaných objektů, se kterými můžeme v makru dále pracovat.
Tím máme vytvořený objekt selekce. Dobrým zvykem je ihned po vytvoření selekci vyprázdnit. Pokud je totiž při vytváření nějaký objekt vybrán, automaticky se dostává do kolekce vybraných objektů. Selekci vyprázdníme metodou clear, tedy:
Je to analogické k tomu, jako když v Catia na něco klikneme (tím to vybereme) a poté stikneme Esc - výběr se zruší.
Nyní máme připravený objekt selekce a můžeme s ním začít pracovat.
Pak si ještě připravíme proměnnou
A teď k už k celému kódu výběru. Metoda má tři parametry - seznam typů, výzvu pro uživatele a možnost brát v tu chvíli vybraný objekt. Celý kód vypadá takto:
Tím jsme do objektu selekce vložili objekt, na který jsme ukázali. Pokud s ním chceme dále pracovat, musíme k němu nějak dostat. Protože selekce je kolekce, přistoupíme k vybranému objektu přes metodu Item. Index bude roven 1, protože máme vybraný právě jeden objekt, a ten je ukrytý ve vlastnosti
Kromě vlastnosti Value jsou zde ještě jiné (viz dokumentace k API), z nichž za zmínku stojí např.
V tomhle konkrétním případě se otevře malý dialog (viz obrázek), kde vidíme počet vybraných objektů. Výběr potvrzujeme ikonou se zeleným puntíkem.
Při výběru více objektů se k nim dostaneme procházením kolekce cyklem
S tímto popisem si pro začátek vystačíme, tak hurá zkoušet....
Autor článku: Jan Cinert
Příště: Přidání objektu do výběru a vyhledávání
Když si představíte běžnou práci při modelování, každé kliknutí na nějaký objekt ve stromu nebo na modelu znamená v programu (makru) použití selekce. Ve většině případů budeme selekci používat pro určení vstupů (z čeho / na čem se bude tvořit) nebo cílů (kde se to bude tvořit). Výběr uživatelem je první z hlavních funkcionalit selekce. Druhou je vyhledávání objektů v modelu / sestavě podle vyhledávacího dotazu, který musí splňovat určitou syntaxi. Výsledkem obojího je seznam (kolekce) uživatelem vybraných nebo vyhledaných objektů, se kterými můžeme v makru dále pracovat.
Deklarace objektu selekce
Objekt selekce by měl být deklarován jako typSelection
. U .NET je vše v pořádku, ale kdo pracuje nebo pracoval s VBA, dobře ví, že zde je chyba, o selekce se musí deklarovat jako Variant
. My se však věnujeme .NET, takže zůstaneme u první možnosti. Selekce je vlastnost objektu Document
, a aby fungovala v celém kontextu, měla by být vždy vytvořena z root dokumentu. U partu i sestavy to tedy může být:
Dim oSelection As Selection
oSelection = CATIA.ActiveDocument.Selection
Tím máme vytvořený objekt selekce. Dobrým zvykem je ihned po vytvoření selekci vyprázdnit. Pokud je totiž při vytváření nějaký objekt vybrán, automaticky se dostává do kolekce vybraných objektů. Selekci vyprázdníme metodou clear, tedy:
oSelection.Clear()
Je to analogické k tomu, jako když v Catia na něco klikneme (tím to vybereme) a poté stikneme Esc - výběr se zruší.
Nyní máme připravený objekt selekce a můžeme s ním začít pracovat.
Výběr objektu uživatelem
Výběr objektu v selekci se rovná kliknutí levým tlačítkem na cokoliv ve stomu nebo v modelu, kdy po uvolnění tlačítka zůstane objekt označený - v Catia V5 standardně oranžově podbarvený. Pro tuto funkcionalitu je v selekci metodaSelectElement2
(nevím proč zrovna "2", na jedničku asi zapomněli). Abychom toto metodu mohli použít, potřebuje předem ještě nadefinovat seznam typů, na která nám Catia dovolí kliknout. To je praktické v případech, kdy požadujeme konkrétní typ (rovina, bod, Body, ...) a nechceme to kontrolovat až po vybrání objektu. Pokud seznam omezíme, Catia pak nad nedovolenými typy objektů zobrazuje kurzor "jednosměrky" a objekt nejde vybrat. Seznam se definuje jako pole, ve kterém jsou řetezce s názvy typů. Chceme-li tedy výběr omezit např. pouze na typ Plane a Point, bude to vypadat takto:
Dim ObjType(1)
ObjType(0) = "Plane"
ObjType(1) = "Point"
Pak si ještě připravíme proměnnou
sStatus
typu string, kam bude metoda vracet výsledek výběru. Nesmíme totiž zapomenout, že výběr lze v průběhu zrušit stisknutím Esc a nic nevybereme - to by v makru skončilo chybou.
A teď k už k celému kódu výběru. Metoda má tři parametry - seznam typů, výzvu pro uživatele a možnost brát v tu chvíli vybraný objekt. Celý kód vypadá takto:
sStatus = oSelection.SelectElement2(ObjType, "Vyberte objekt ... (ESC pro ukončení)", False )
If (sStatus = "Cancel") Then ' ukoncime proceduru pri stisku Esc
Exit Sub
End If
Tím jsme do objektu selekce vložili objekt, na který jsme ukázali. Pokud s ním chceme dále pracovat, musíme k němu nějak dostat. Protože selekce je kolekce, přistoupíme k vybranému objektu přes metodu Item. Index bude roven 1, protože máme vybraný právě jeden objekt, a ten je ukrytý ve vlastnosti
Value
.
oVybranyObjekt = oSelection.Item(1).Value
Kromě vlastnosti Value jsou zde ještě jiné (viz dokumentace k API), z nichž za zmínku stojí např.
LeafProduct
, který v případě výběru v sestavě vrací konkrétní instanci, ve které je vybraný objekt - velice praktické.
Vícenásobný výběr
Kromě výběru jednoho objektu existuje ještě možnost vícenásobného výběru. Pro něj použijeme metoduSelectElement3
, která má ještě další dva parametry. Čtvrtý je způsob multiselekce a pátý tooltip nad vybraným objektem. Použití je následovné:
sStatus = oSelection.SelectElement3(ObjType, "Vyberte objekty ... (ESC pro ukončení)", False,
CATMultiSelTriggWhenUserValidatesSelection, False )
V tomhle konkrétním případě se otevře malý dialog (viz obrázek), kde vidíme počet vybraných objektů. Výběr potvrzujeme ikonou se zeleným puntíkem.
Při výběru více objektů se k nim dostaneme procházením kolekce cyklem
For - To
v rozsahu 1 až n, kde n je počet vybraných objektů, v našem případě vlastnost Count
.
For i As Integer = 1 To oSelection.Count
oVybranyObjekt = oSelection.Item(i).Value
' prikazy
Next
Na co si dát pozor
Abychom si ušetřili zbytečné chyby, je dobré pamatovat si tato pravidla:- Před každým výběrem vyprázdnit
- Dovolit vybrat jen to co potřebuje pro další běh makra, popř. kontrolovat zda typ odpovídá očekávanému
- Mít minimální prodlevu mezi výběrem a použitím v kódu. Pokud by netrpělivý uživatel omylem výběr zrušil, skončíme chybou. (Zde se dá jako "ochrana" dočasně vypnou interaktivita Catie, ale nesmíme ji zase zapnout, jinak už si na nic neklikneme
- Pokud procházíme kolekci selekce, nesmíme nic dalšího vybírat - tím bychom zrušili původní výběr -> chyba
S tímto popisem si pro začátek vystačíme, tak hurá zkoušet....
Autor článku: Jan Cinert
Příště: Přidání objektu do výběru a vyhledávání