Diverse
Codeschnipsel und Funktionen
Aktives Dokument (Part/Product) innerhalb eines
Products ermitteln
Mit diesem Schnipsel
kann man das aktivierte (Blau hinterlegt /
in Bearbeitung) Part bzw. Product ermitteln.
|
Sub
CATMain()
if TypeName(CATIA.ActiveDocument)
= "ProductDocument"
then
set selection1 =
CATIA.ActiveDocument.Selection
selection1.Clear
selection1.Search "(CATProductSearch.Product),in"
if selection1.Count =
0 then
' wenn
ein Part innerhalb des Products aktiv ist ---> Part im Product
selection1.Search "(CATPrtSearch.PartFeature),in"
set
DokumentInst = GetDocumentByName(selection1.item(1).Value.Name) '
Instanz
set
Dokument = DokumentInst.ReferenceProduct.Parent
' Dokument
selection1.Clear
else
' wenn
ein Product innerhalb des Products aktiv ist ---> Product im
Product
set
DokumentInst = selection1.Item(1).Value
' Instanz
set
Dokument = DokumentInst.ReferenceProduct.Parent
' Dokument
selection1.Clear
end if
else
' wenn das aktive Dokument
ein Part ist
set Dokument = CATIA.ActiveDocument
end if
MsgBox TypeName(Dokument) &": "
&Dokument.Name ' Ergebnis = das
aktive Part bzw. Product
End Sub
Function GetDocumentByName(DokName)
On Error Resume Next
set Dokumente = CATIA.Documents
for n = 1
to Dokumente.count
set Produkte = Dokumente.Item(n)
WieOft = 0
WieOft = Produkte.product.products.count
for i = 1
to WieOft
set Produkt = Produkte.product.products.item(i)
if DokName =
Produkt.PartNumber then
set
GetDocumentByName = Produkt
Exit
Function
end if
next
next
End Function |
Alle Dokument-Instanzen des aktiven Products in ein Array
schaufeln (über Selection Search)
|
public DokAnzahl
public DokumentArray()
Sub CATMain()
Call GetElements(1)
' 1 = Parts und Products
for n = 1
to DokAnzahl
set Dokument = DokumentArray(n)
MsgBox Dokument.Name ' gibt den
Instanznamen aus
next
End Sub
Sub GetElements(SearchMode)
' Benötigt !!! Variable: public
DokAnzahl: public DokumentArray()
' Eingabewerte: 1 = Parts und Products; 2 = nur Parts; 3 = nur
Products
if SearchMode =
1 then
SuchString = "Type=Product,all"
if SearchMode =
2 then
SuchString = "(CATProductSearch.Part),all"
if SearchMode =
3 then
SuchString = "(CATProductSearch.Assembly),all"
set Selection1 = CATIA.ActiveDocument.Selection
selection1.Search SuchString
DokAnzahl = selection1.Count
for n = 1
to DokAnzahl
ReDim Preserve DokumentArray(n)
set DokumentArray(n) =
selection1.Item(n).Value
next
End Sub |
Copy & Paste eines Parts in ein neues Product
Diese Funktion erzeugt
ein neues Product und kopiert ein vorhandenes Part
hinein.
|
Sub
CopyPartToNewProduct(PartDoc)
On Error Resume Next
' copy
set PartSelection =
PartDoc.Selection
PartSelection.Clear
PartSelection.Add PartDoc.Part
PartSelection.Copy
' Product erstellen und benennen
set ProductDoc =
CATIA.Documents.Add("Product")
set NeuesProduct =
ProductDoc.Product.Products
n = 0: x =
""
do
n = n +1
Err.Number = 0:
ProductName = "NewProduct" &x
ProductDoc.Product.PartNumber = ProductName
x = "_" &CStr(n)
loop until Err.Number =
0
' paste
set ProductSelection =
ProductDoc.Selection
ProductSelection.Clear
ProductSelection.Add ProductDoc.Product
ProductSelection.Paste
End Sub |
Aufruf: Es muss das
Dokument zum Part angegeben werden.
|
set
PartDoc = CATIA.ActiveDocument
' hier z.B. das aktive Part-Dokument
Call CopyPartToNewProduct(PartDoc) |
Copy
& Paste eines Parts in ein vorhandenes Product
Mit dieser Funktion kann
man ein vorhandenes Part in ein vorhandenes Product
kopieren.
|
Sub
CopyPartToProduct(PartDoc, ProductDoc, TopProduct)
' copy
set PartSelection = PartDoc.Selection
PartSelection.Clear
PartSelection.Add PartDoc.Part
PartSelection.Copy
' paste
set ProductSelection = TopProduct.Selection
ProductSelection.Clear
ProductSelection.Add ProductDoc.Product
ProductSelection.Paste
End Sub |
Aufruf: Es muss jeweils
das Dokument zum Part und Product, sowie das TopProduct angegeben werden.
Bei einstufigen Products ist das Product gleich dem
TopProduct.
|
Call
CopyPartToProduct(PartDoc, ProductDoc, TopProduct) |
Copy & Paste
des PartBody
in ein neues Part - "as result"
Ausgangspunkt ist ein
Produkt mit mindestens einem Part. Zunächst wird ein
neues Product geöffnet. Über dieses Product wird der
PartBody des betreffenden Quell-Parts kopiert. Dann
wird ein neues Part geöffnet und der kopierte
PartBody als "Result As" eingefügt. Anschließend
wird das temporäre Product wieder gelöscht
|
Sub
CATMain()
set QuellPart =
CATIA.ActiveDocument.Product.Products.Item(1)
FensterNr = Catia.Windows.Count +1
set NeuesDokument =
CATIA.Documents.Add("Product")
set TempSelection =
CATIA.ActiveDocument.Selection
TempSelection.Add(QuellPart.ReferenceProduct.Parent.Part.MainBody)
TempSelection.copy
TempSelection.Clear
set NeuesPart = CATIA.Documents.Add("Part")
set PasteSelection = NeuesPart.Selection
PasteSelection.clear
PasteSelection.Add NeuesPart.Part
PasteSelection.PasteSpecial "CATPrtResultWithOutLink"
PasteSelection.Clear
CATIA.Windows.Item(FensterNr).Activate
CATIA.ActiveDocument.Close
End Sub |
Root-Bodies ermitteln
Mit diesem Schnipsel
kann man die Root-Bodies eines Parts ermitteln. Mit
Root-Bodies sind Bodies gemeint, die nicht über eine
Boolesche Operation einem anderen Body zugeordnet
sind und somit in der Root des Strukturbaums stehen.
|
Sub
CATMain()
set Bodies1 =
CATIA.ActiveDocument.Part.Bodies
for n = 1 to
CATIA.ActiveDocument.Part.Bodies.count
set Body1 =
Bodies1.Item(n)
if
Body1.InBooleanOperation = false then
MsgBox Body1.Name
end if
next
End Sub |
Modelltyp erkennen (Part, Product, V4, CGR...)
Mitunter kann es
erforderlich bzw. nützlich sein zu wissen, welcher
Dateityp hinter einer Produktinstanz steht. Die
Unterscheidung zwischen Parts und Products ist auch
mittels TypeName(Dokument) möglich,
jedoch werden V4 Modelle oder CGR-Daten mit dieser
Methode auch aus Products erkannt. Hier ein Weg der
zumindest noch zusätzlich V4 Modelle und andere
Daten erkennen lässt, wobei weitere Daten beim
Einlesen in CGR, also triangulierte Flächenmodell
gewandelt werden und somit beispielsweise auch ein
IGES-File als CGR erkannt wird.
|
Sub
CATMain()
On Error Resume Next
set selection1 =
CATIA.ActiveDocument.Selection
selection1.Search "(CATProductSearch.Product),all"
for i = 1 to selection1.Count
Endung = ""
set Bauteil = selection1.Item(i).Value
Endung = StrReverse(Bauteil.GetMasterShapeRepresentationPathName)
if Endung = ""
then Endung = StrReverse(Bauteil.ReferenceProduct.Parent.Name)
EndungArray = split(Endung,".")
Endung = StrReverse(EndungArray(0))
if Endung = ""
then
DatenFormat = "Dateilink gebrochen"
elseif UCase(Endung) =
"CATPART"
then
DatenFormat = "V5-Part"
elseif UCase(Endung) =
"CATPRODUCT"
then
DatenFormat = "V5-Product"
elseif UCase(Endung) =
"MODEL" then
DatenFormat = "V4-Modell"
else
DatenFormat = "Trianguliertes
Flächenmodell"
end if
MsgBox DatenFormat
next
End Sub |
Prüfen ob ein Parameter
vorhanden ist
|
Function ParameterExists(oParamSet,
sParam)
' anstelle vom ParameterSet kann auch
Part/Product.Parameters angegeben werden
' wenn die Parameter nicht in einem Set zusammengefasst sind
On Error Resume Next
ParameterExists = false
s = ""
s = oParamSet.Item(sParam).Name
if s <> ""
then ParameterExists =
true
End Function |
Aufruf: Im Beispiel wird
geprüft ob ein Parameter mit dem Namen "MeinParameter"
vorhanden ist, wenn nicht, dann wird dieser erzeugt.
|
set
oParameters = CATIA.ActiveDocument.Part.Parameters
if ParameterExists(oParameters,
"MeinParameter")
then
set oParam =
oParameters.Item("MeinParameter")
else
set oParam =
oParameters.CreateString("MeinParameter",
"")
end if |
Eltern
eines Elements finden
|
Function FindParent(Element,
ParentTyp)
set Puffer = Element
fertig = false
do
if TypeName(Puffer) = ParentTyp
then
set FindParent
= Puffer
fertig = true
elseif TypeName(Puffer) = "CNEXT"
then
fertig = true
end if
set Puffer = Puffer.Parent
loop until fertig = true
End Function |
Aufruf: Es muss ein
Element (Objekt) und der zu suchende Eltern-Typ als
String übergeben werden. Der Rückgabewert ist das
gesuchte Elternteil als Objekt.
|
MsgBox FindParent(Element,
"Part").Name |
|