Suche & Selektion
von Elementen
Grundlegendes
Die Suche und Selektion von
Objekten geschieht in einem Rutsch über die Klasse Selection.
Im hier gezeigten ersten Beispiel soll
eine Suche nach einen Objektnamen gestartet werden. Es
spielt keine Rolle ob das aktive und zu durchsuchende
Dokument ein Part, Product oder
eine Drawing ist.
Syntax: Selektion.Search
"Suchkriterium , Suchoption"
Im Suchkriterium wird
definiert nach was gesucht wird. Hier im Beispiel nach
einem Namen (Name=). Über die Suchoptionen kann
die Suche verfeinert werden.
|
Sub
CATMain()
set Sel = CATIA.ActiveDocument.Selection
' sucht und selektiert
alle Objekte mit dem Namen "Otto", ohne weitere Suchoptionen (all)
Sel.Search
"Name=Otto,all"
End Sub |
Beispiele für
Suchkriterien:
Name=XYZ |
Sucht nach
Element mit dem Namen XYZ |
Name=XYZ &
Visibility=Shown |
Suche nach
Elemente mit dem Namen XYZ, die sich im "Show"
befinden |
Type=XYZ |
Suche nach
Elemente vom Typ XYZ. Type=*
sucht nach allen Elementen
Type=Point,all liefert alle Punkte,
Type=Line,all liefert alle
Linien... |
Über das Suchkriterium
"Type=Point" werden jedoch rigoros alle Punkte in die
Selektion genommen, auch solche die sich bspw. innerhalb
eines Sketchs befinden. Hier kann man die Suche auf
bestimmte Objekttypen (Klassen) einschränken.
CATPrtSearch.XYZ |
Suche nach
Objekten innerhalb eines CATParts.
Beispiel:
CATPrtSearch.Point
liefert
nur reine 3D Punkte (HybridShapes) |
Suchoptionen:
all |
keine weitere
Suchoption, es wird überall gesucht |
from |
sucht innerhalb
des Aktiven Dokuments inklusive der
Unterproducts |
in |
sucht im aktiven
Element. (z.B. bei aktivem Sketch, innerhalb des
Sektchs) |
sel |
sucht nur im
selektierten Bereich. z.B.: Wurde zuvor ein Body
selektiert, so wird nur innerhalb dieses Bodys
gesucht. |
Weitere Möglichkeiten:
Suche auf Objekttyp
begrenzen:
|
selection1.Search
".Point.Name=Otto,all"
' begrenzt die Suche nach dem
Namen Otto nur auf Punkte |
An dieser Stelle sei
bemerkt dass das Aufzeichnen von Suchen erstaunlich gut
funktioniert. Wer also schon einmal versucht hat der
Makroaufzeichnung etwas sinnvolles zu entlocken und
diese zurecht als völlig nutzlos abgestempelt hat sei
ermutigt diese zumindest beim definieren von Suchen zu
nutzen. Hier kommt wirklich was verwertbares heraus.
Ansonsten dient die Makroaufzeichnung bestenfalls für
stumpfe Denkanstösse bei völliger Umnachtung...
Multiselektion zerlegen
Eine Selektion kann
mehrere Objekte (Multiselektion) beinhalten. Sehr
oft muss man eine
Multiselektion zerlegen, das geschieht über eine
Schleife. Tut euch beim nachspielen dieses Beispiels selbst den Gefallen und achtet darauf, dass
die Selektion nicht zu viele Objekte beinhaltet :-)
Man beschäftigt Catia erstaunlich lange wenn die
gefundenen Objekte eine bestimmte Anzahl erreicht...
|
Sub
CATMain()
set Sel = CATIA.ActiveDocument.Selection
Sel.Search
"Type=*,all"
for n = 1
to Sel.Count
set Objekt =
Sel.Item(n).Value
MsgBox Objekt.Name
' gibt den Instanznamen aus
next
End Sub |
Objekttyp eines
Selektierten abfragen
|
Sub
CATMain()
set Sel = CATIA.ActiveDocument.Selection
Sel.Search
"Type=*,all"
for n = 1
to Sel.count
set Objekt =
Sel.Item(n).Value
MsgBox TypeName(Objekt)
next
End Sub |
Weitere Methoden
Objekt zu
einer Selektion hinzufügen
Für XYZ steht ein
Objekt.
|
Sel.Add
XYZ
' fügt der
Selection "Sel" ein Objekt zu |
Beispiel:
|
set
Prd = CATIA.ActiveDocument.Product.Products.Item(1)
' zuweisen
Sel.Add Prd ' fügt das Objekt der Selektion hinzu |
Objekt aus
einer Multiselektion entfernen
Mit .Remove(x)
kann ein Objekt aus einer Multiselektion herausgenommen
werden.
|
selection1.Remove(1)
' entfernt das erste Objekt aus
Selection1 |
Komplette Selektion
aufheben
|
Sel.Clear
' komplette Auswahl aufheben
|
Ein
Objekt
von Hand auswählen (UserSelection)
Unter Umständen kann es
nötig sein, dass ein bestimmtes Objekt vom Benutzer
ausgewählt werden muss, welches im weiteren
Scriptverlauf benötigt wird. Eine händische Auswahl
eines Objekts (hier eine Plane) könnte wie folgt aussehen:
|
Sub
CATMain()
set Sel = CATIA.ActiveDocument.Selection
dim ObjektTyp(0)
ObjektTyp(0) = "Plane"
'* siehe Erklärung weiter unten
Sel.Clear
do
' Do...LOPP-Schleife
Auswahl = Sel.SelectElement2(ObjektTyp,"Wähle
eine Plane aus..." , false)
' Aufforderung Catia-Fenster unten links
if Auswahl =
"Normal" then
' wenn Auswahl erfolgt dann...
set Objekt =
Sel.item(1)
MsgBox Objekt.value.name &
" wurde ausgewählt.",0,"Auswahl"
Fertig = true
else
Box = MsgBox("Die Selektion
wurde abgebrochen" + Chr(10)
+ _
"Das Makro wurde beendet!",
48,
"Benutzerabbruch")
exit
Sub
end if
loop until Fertig =
true
' verbleibe in Do...LOPP-Schleife bis
was ausgewählt wurde
End Sub |
*) In diesem Beispiel
wurde Plane als Objekttyp festgelegt. Dies bedeutet,
dass alle anderen Objekte nicht anwählbar sind, weder
im Baum noch im 3D. Möchte man mehr als nur einen
Objekttyp zur Auswahl stellen, so muss die Feldvariable
ObjektTyp() um die Anzahl der Objekttypen erweitert werden.
|
dim ElementTyp(4)
ElementTyp(0) =
"Point"
ElementTyp(1) =
"Line"
ElementTyp(2) =
"Plane"
ElementTyp(3) =
"Part"
ElementTyp(4) =
"Face" |
Oder einfach:
"AnyObject" wenn jedes
Objekt ausgewählt werden darf.
Als Elementtyp kann jedes
Element welches auch in der Baumstruktur zu finden ist
benutzt werden. Zu beachten ist, dass die Angabe case
sensetive ist. Die Angabe lautet also Plane und nicht
plane, Line und nicht line, Point und nicht point... Der
Elementtyp ist in der Regel gleich dem Elementname wie
er in der Baumstruktur zu finden ist. Eine Ausnahme ist
z.B. das Geometrical Set, welches dem Elementtyp
HybridBody angehört.
|