Tech-Ecke / CATScript/VBS Inhalt / Suche & Selektion

 

Suche & Selektion von Elementen

Seiteninhalt:  
  Grundlegendes
  Multiselektion zerlegen
  Objekttyp eines Selektierten abfragen
  Objekt zu einer Selektion hinzufügen
  Objekt aus einer Multiselektion entfernen
  Komplette Selektion aufheben
  Ein Objekt von Hand auswählen (UserSelection)
  FindObject-Methode
  Selection.Search beschleunigen (ab R19)



 

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.  

 

 
Mit der FindObject-Methode lassen sich einzelne Objekte einer bestimmten Klasse aus einer Selektion herausziehen. In Verbindung mit der "UserSelection" Methode lassen sich so z.B. direkt Parts ermitteln, ohne über Parent.Parent.Parent... usw. das Part über die selektierte Körperkante oder Fläche zu ermitteln.
 
 
Beispiel 1:
 
Dieser Codeschnipsel sucht zunächst nach allen 3D-Punkten innerhalb eines Parts. Dann durchläuft er die Selektion und gibt zu jedem Fund den Namen des dazugehörigen GeoSets aus.
 
  Sub CATMain()
On Error Resume Next

set Sel = CATIA.ActiveDocument.Selection

Sel.Search "CATPrtSearch.Point,all"

for n = 1 to Sel.Count
   MsgBox Sel.FindObject("CATIAHybridBody").Name
next

End Sub

 


Beispiel 2:

 
Mit Hilfe dieses Codeschnipsel findet man das zur aktuellen Selektion zugehörige CATPart innerhalb einer Product-Struktur.
(Bevor das Makro gestartet wird muss ein Part im Baum selektiert werden !!!)
 
  Sub CATMain()

set Sel = CATIA.ActiveDocument.Selection
set Objekt = Sel.FindObject("CATIAProduct")
set Teil = Objekt.ReferenceProduct.parent.Part   ' oder .Product für Parts und Products

MsgBox Teil.name ' Ausgabe ist Name des Parts

End Sub

 

 

Selection.Search beschleunigen (ab R19)

Läuft die Suche über Selection.Search plötzlich bei R19 gefühlsmäßig zu langsam, so sollte man das hier mal probieren:
 
   CATIA.HSOSynchronized=False   ' kann auch am Anfang des Scripts stehen

   ' hier selection.search ausführen

 CATIA.HSOSynchronized=True  ' kann auch am Ende des Scripts stehen
 

"Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !"

[letzte Aktualisierung 23.09.2009]