Programujeme: Jednoduché příklady
Publikováno: 12. listopadu 2011 | Zobrazeno: 8467x
V dnešním dílu si ukážeme několik jednoduchých příkladů s základními konstrukcemi, které se dají využít při psaní složitějších maker. Každý příklad bude obsahovat komentáře a podrobnější vysvětlení dané problematiky. Předpokládáná je základní znalost Visual Basicu - k té se v článku již věnovat nebudu.
Skripty samozřejmě nejsou nijak ošetřené, tj. předpokladem pro bezchybný běh je otevřený dokument požadovaného typu.
Stejným způsobem můžeme i obarvit vybrané feature. V kódu pak místo SetShow bude použita metoda SetRealColor.
Příště: Další část ukázek (zjištění počtu instancí v sestavě, práce s výkresy)
Skripty samozřejmě nejsou nijak ošetřené, tj. předpokladem pro bezchybný běh je otevřený dokument požadovaného typu.
I. Spuštění makra z externího souboru
Někdy je třeba spustit makro z externího souboru. V takovém případě použijeme příkaz Call (CATIA.SystemService.ExecuteScript). Proměnná Params je typu Array a slouží k předání případných vstupních parametrů. Musí se uvádět, i když žádné nejsou.Sub CATMain()
Dim params()
' Možné typy umístění skriptu
' catScriptLibraryTypeDirectory (catScript je v adresáři)
' catScriptLibraryDocument (catScript je v dokumentu CATpart)
' catScriptLibraryVBAProject (catScript je ve VBA projektu)
CATIA.SystemService.ExecuteScript "cesta", "typ", "nazev", "CATMain", params
End Sub
Přesunutí feature jednoho typu do NoShow
Tento jednoduchý skript vyhledá všechny elementy určitého v aktivním dokumentu a přesune je do NoShow prostoru. Typ feature specifikujeme jeho názvem (např. pro rovinu je to Plane, pro úsečku Line).Sub CATMain()
Dim oActiveDocument As Document
Dim oSelection As Selection
' vytvorime objekt aktivniho dokumentu
Set oActiveDocument = CATIA.ActiveDocument
' vytvorime objekt vyberu jako vlastnost objektu oActiveDocument
Set oSelection = oActiveDocument.Selection
' zadame typ a vlastnost hledaneho objektu a oblast hledani
oSelection.Search ".Plane.Visibility=Visible;all"
' nastavime vlastnost vyberu VisProperties na 1 (Show)
oSelection.VisProperties.SetShow 1
' zrusime vyber
oSelection.Clear
End Sub
Stejným způsobem můžeme i obarvit vybrané feature. V kódu pak místo SetShow bude použita metoda SetRealColor.
' obarveni elementu - jednotlive parameTry jsou slozky RGB, posledni je dedicnost
oSelection.VisProperties.SetRealColor 255,0,255,0
Interaktivní výběr feature
Velmi často potřebujeme vybrat konkrétní feature, např. jako vstupní objekt makra (skicovací rovina, počáteční bod, atd). Následující příklad ukazuje interaktivní výběr, kdy je uživatel vyzván k výběru feature. Skript pokračuje po výběru objektu nebo při stisku ESC.Sub CATMain()
Dim oSelection As Selection
Dim oSelectedElement As SelectedElement
Set oSelection = Catia.ActiveDocument.Selection
' pole pro definici typu, ktere lze vybirat
Dim sFilter(2)
' povolime vyber bodu, usecky a roviny
Filter(0) = "Point"
Filter(1) = "Line"
Filter(2) = "Plane"
' spustime interaktivni vyber (omezeni typu, vyzva - status ber, predvyber)
Status = oSelection.SelectElement2(Filter, "Vyberte objekt...", False)
' ukoncime pri stisku ESC
If Status = "Cancel" Then
Exit Sub
End If
' provedeme pozadovane operace s vybranym objektem
oSelectedElement = oSelection.Item(1)
' dalsi cast kodu
End Sub
Rekurzivní procházení sestavy
Vysvětlovat programátor co je rekurze asi nemá smysl. Pro ostatní je to situace, kdy funkce v určitém kroku volá sama sebe. Typickým příkladem použití je procházení hierarchického stromu sestavy.
' hlavni procedura
Sub CATMain()
Dim oRootDocument As Product
' nacteme aktivni dokument (sestavu)
Set oRootDocument = Catia.ActiveDocument
' zavolame funkci pro prochazeni sestavy
NavigateProduct oRootDocument.Products
End Sub
' cast kodu pro prochazeni sestavy
Sub NavigateProduct(oProducts)
Dim oSubProducts As Products
' projdeme vsechny instance
For i = 1 to oProducts.Count
' vlastni kod, ktery se vykona na kazdem dokumentu
' ...
' seznam operaci
' ...
' ziskame kolekci vnorenych instanci (partu a podsestav)
Set oSubProducts = oProducts.Item(i).Products
' pokud ma instance (sestava) potomky, spustime rekurzi
If oSubProducts.Count > 0 Then
' vlastni rekurze - volame funkci s konkretni podsestavou
NavigateProduct oProducts.Item(i).Products
Else
Next
End Sub
Zjištění aktvivního partu v sestavě
Pokud máme makro, které pracuje s Partem, nastává problém ve chvíli, kdy máme Part otevřený v rámci sestavy. Makro totiž nějak musí poznat, který (a jestli vůbec nějaký) Part je aktivní, aby si mohlo správně nastavit příslušný objekt oPart. Následující skript to řeší pomocí malé finty.Sub CATMain()
'zjistime typ dokumentu
sDocumentType = TypeName(CATIA.ActiveDocument)
' rozvetveni programu podle typu dokumentu
Select Case sDocumentType
' je otevren samotny Part
Case "PartDocument"
' vytvorime objekt Partu
Set oPart = CATIA.ActiveDocument.Part
MsgBox "Je otevřen part: " & PartName"
' je otevreny Product
Case "ProductDocument"
Set oActiveDocument = CATIA.ActiveDocument
' zjistime typ pracovniho prostredi
WBId = CATIA.GetWorkbenchId()
' je-li aktivni PartDesign (nebo cokoliv, kde se pracuje s Partem)
If WBId = "PrtCfg" Or WBId = "jiny WB" Or ... Then
' zkusime vyhledat rovinu xy v aktivnim Partu
Set oSelection = oActiveDocument.Selection
oSelection.Search "Name='xy plane',in" ' tohle je ta mala finta
' vytvorime instanci Partu - rodice roviny xy
Set oPart = oSelection.Item(1).Value.Parent
MsgBox "Je otevřena sestava, ale aktivní je part " & oPart.Name"
Else
MsgBox "Je aktivní sestava " & oActiveDocument.Name"
End If
' pokud je otevren jiny dokument (napr. vykres)
Case Else
MsgBox "Je aktivní jiný typ dokumentu"
End Select
End Sub
Příště: Další část ukázek (zjištění počtu instancí v sestavě, práce s výkresy)