Vítejte !   Přihlášení | Registrace
Hlavní menu
CATIA fórum.cz
Novinky
Seriál CATIA
Obecně o CAD
Novinky ze světa DS
Makra pro CATIA V5
Diskuse
Základy Catia
Ke stažení
Doporučujeme
Pracovní příležitosti
Reklama a kampaně
O fóru
Nápověda

Programujeme: Selekce, interaktivní výběr objektu uživatelem

Publikováno: 6. března 2014 | Zobrazeno: 5115x
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.

Deklarace objektu selekce

Objekt selekce by měl být deklarován jako typ Selection. 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 metoda SelectElement2 (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 metodu SelectElement3, 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.

Panel s funkcemi pro multiselekci

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í