Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  VBA Produktstruktur scannen und GeoSets in Parts erzeugen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  VBA Produktstruktur scannen und GeoSets in Parts erzeugen (2380 mal gelesen)
PAP
Mitglied



Sehen Sie sich das Profil von PAP an!   Senden Sie eine Private Message an PAP  Schreiben Sie einen Gästebucheintrag für PAP

Beiträge: 29
Registriert: 08.08.2012

CATIA V5 R19
Win 7 Prof.
Intel Xeon 3.6Ghz
16Gb RAM
Nvidia Quadro 2000

erstellt am: 05. Jun. 2016 19:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


2016-06-0519_51_11-Watches.png

 
Hallo zusammen,

ich bin neu in der CATIA-Makroprogrammierung und möchte zum Einstieg gern ein VBA-Makro erstellen, das die Produktstruktur scannt.

Meine Struktur enthält auf beliebig vielen Ebenen beliebig viele Parts und Products pro Product.
Bsp.: (pass nicht zum angehängten Screenshot)

Code:

Product1
+Part1.1
+Part2.1
+Product2.1
|  +Part3.1
|  +Part4.1
|  +Product3.1
|  |  +Part3.1 (!) Gleicher Instanzname, da in Subassembly
|  |  +Part4.1 (!) Gleicher Instanzname, da in Subassembly
|  +Part5.1

Ich möchte mit dem Makro nun die gesamte Struktur durchlaufen und, falls es sich um ein Part handelt, darin ein GeoSet erzeugen, dass einen bestimmten Namen erhält.

Trotz Recherche komme ich leider nicht mehr weiter...    

Mein Ansatz ist folgendermaßen:
Ich starte eine "Initial"-Funktion (Sub), die in die Struktur einsteigt und dann mit der Schleife beginnt.
Die "Product"-Funktion enthält auch die Schleife.
Wird in der Schleife ein Product gefunden, wird die Product-Funktion gestartet, bei einem Part, die entsprechende.
PartFunktion: In dem Part wird ein GeoSet erzeugt, das einen bestimmten Namen hat

Code:

Sub ScanStructure()
    Dim objCATIA As Application 'Active "Session"
    Set objCATIA = CATIA
   
    Dim objActiveDoc As Document 'Active "Window" (Contains eg. Selection)
    Set objActiveDoc = objCATIA.ActiveDocument
   
    Dim objProduct As Product 'Open Part or Product (Contains eg. Parameters)
    Set objProduct = objActiveDoc.Product
       
    Dim objProducts As Products 'exists for parts, too, but .count is = 0 (like empty product)
    Set objProducts = objProduct.Products
    
    If TypeName(objActiveDoc) = "PartDocument" Then
        ScanStr_Part(objActiveDoc)       
    ElseIf TypeName(objActiveDoc) = "ProductDocument" Then
        Dim i As Integer
        For i = 1 To objProducts.Count
            'objProducts.Item (i)
            'SCHLEIFE
        Next
    Else
        MsgBox TypeName(objCATIA.ActiveDocument)
    End If
End Sub
Function ScanStr_Product(objProduct As ProductDocument)
        Dim i As Integer
        For i = 1 To objProduct.Products.Count
            'SCHLEIFE
        Next
End Function
Function ScanStr_Part(objPart As PartDocument)
    'objPart...Keine Ahnung...hybridshapes.add
End Function

Das ist was ich bisher habe. Ich habe zur Hilfe einen Watch auf CATIA gemacht (siehe Anhang). Nun meine Fragen:
1. Wie erkenne ich in der Schleife, ob es sich um ein Part oder Product handelt? Ich finde nicht den Sprung vom Objekt des Typs Product, zum "enthaltenen" Objekt des Typs Part- oder ProductDocument (wie beim CATIA.ActiveDocument)
2. Wie komme ich vom CATIA.ActiveDocument in ein beliebiges Part in der Struktur zum hybridshapes Objekt, um ein GeoSet zu erzeugen?
3. Wie erkenne ich, ob ein Part nur eine weitere Instanz eines anderen Parts ist? (Nicht über Namen!)
4. Ich hatte erst das CATIA-Objekt objCATIA usw. in der CATMain, von der aus ich die ScanStructure() starte, die konnte nicht auf die Objekte zugreifen, als public deklarieren konnte ich sie auch nicht. Müssen sie für jede Funktion neu anglegt werden?

Ich habe oft gesehen, dass in Makros Selection eingesetzt wird, das möchte ich gern vermeiden...

Vielen Dank und viele Grüße!

[Diese Nachricht wurde von PAP am 05. Jun. 2016 editiert.]

[Diese Nachricht wurde von PAP am 05. Jun. 2016 editiert.]

[Diese Nachricht wurde von PAP am 05. Jun. 2016 editiert.]

[Diese Nachricht wurde von PAP am 05. Jun. 2016 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 05. Jun. 2016 20:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für PAP 10 Unities + Antwort hilfreich

Servus
zu 1)
Du kannst für jede Product folgendes prüfen:
Code:
Set oParentDoc = objProduct.Products.item(i).ReferenceProduct.Parent
'Parts'
If TypeName(oParentDoc) = "PartDocument" Then
zu 2)
Vom Product (Instanz) auf das Part und die Hybridbodies:
Code:
Set oPart = oParentDoc.Part
Set oHybridbodies = oPart.Hybridbodies
zu 3)
IMHO nur über den Namen oder ggf alle schon bearbeitete Parts in einer Collection/Dictonary ablegen. Vor dem erneuten bearbeiten des Parts in der Collection nachschauen ob es dies schon gibt/bearbeitet wurde.
zu 4)
Wenn du von überall auf die Objekte zugreifen willst, musst du diese als Global definieren (außerhalb des ersten Sub).
Würde ich nur für sehr wenige Objekte machen und dne rest an eine Funktion/Routine per Parameter übergeben.

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

PAP
Mitglied



Sehen Sie sich das Profil von PAP an!   Senden Sie eine Private Message an PAP  Schreiben Sie einen Gästebucheintrag für PAP

Beiträge: 29
Registriert: 08.08.2012

CATIA V5 R19
Win 7 Prof.
Intel Xeon 3.6Ghz
16Gb RAM
Nvidia Quadro 2000

erstellt am: 05. Jun. 2016 21:01    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo,

vielen Dank! Also geht der Pfad durch ReferenceProduct bis aufs Part, super, Danke!

In der Zwischenzeit hatte ich gesehen, dass ich bei CATIA.Documents.Item(x) auf alle geöffneten Parts zugreifen kann.
Habe dann eine Schleife gemacht, mit der ich die PartNumber aus der Struktur in den CATIA.Documents suche:

Code:

        Dim i As Integer
        For i = 1 To objProducts.Count
            Dim j As Integer
            For j = 1 To CATIA.Documents.Count
                If objProducts.Item(i).PartNumber = CATIA.Documents.Item(j).Product.PartNumber Then
                    MsgBox "Success:" & vbNewLine & objProducts.Item(i).PartNumber & vbNewLine & i & vbNewLine & j & vbNewLine & CATIA.Documents.Item(j).Product.PartNumber
                End If
            Next
        Next


Die lange Message ist zu debugging zwecken. Ich habe festgestellt, dass wenn ein Part aus dem gescannten Product noch mal offen ist (in einem eigenen Fenster) dann "findet" er es doppelt... wie kann das sein? (i war beide mal 2, j meine ich war 3 und 4, aber im watch waren das unterschiedliche Elemente)

Hier funktioniert die ReferenceProduct-Geschichte natürlich hervorragend, danke nochmal.

Kann ich ein Item in einem Products auch komfortabler anhand der PartNumber suchen, als mit einer Schleife? Vllt, eine eigene Funkion?

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 06. Jun. 2016 11:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für PAP 10 Unities + Antwort hilfreich

Servus
Falls du nur in einer Ebene nach der PartNumber suchst geht es noch recht einfach über die Schleife über die Products-Collection.
Über mehrere Ebenen ist es ggf einfacher/schneller über die Selection mit einer Suche (Search). Der Suchstring lässt sich recht einfach über den Makrorekorder aufzeichnen.

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

PAP
Mitglied



Sehen Sie sich das Profil von PAP an!   Senden Sie eine Private Message an PAP  Schreiben Sie einen Gästebucheintrag für PAP

Beiträge: 29
Registriert: 08.08.2012

CATIA V5 R19
Win 7 Prof.
Intel Xeon 3.6Ghz
16Gb RAM
Nvidia Quadro 2000

erstellt am: 06. Jun. 2016 18:04    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo,

danke für die Tipps, hast du noch mehr Infos zur Products-Collection? Das sagt mir gar nichts...

Hier mein Ergebnis. Setzt voraus, dass ein Product geöffnet ist und durchläuft dann rekursiv die Produktstruktur. Für Parts und Products sind unterschiedliche Funktionen definierbar.

Code:

Sub ScanStructure2()
    Dim objCATIA As Application 'Active "Session"
    Set objCATIA = CATIA
   
    Dim objActiveDoc As Document 'Active "Window" (Contains eg. Selection) / ActiveDocument
    Set objActiveDoc = objCATIA.ActiveDocument
   
    Dim objProducts As Products
    Set objProducts = objActiveDoc.Product.Products
         
    If TypeName(objActiveDoc) = "PartDocument" Then
        MsgBox "TypeName: " & TypeName(objActiveDoc.Product)
    ElseIf TypeName(objActiveDoc) = "ProductDocument" Then
        Call ScanStr_Product(objActiveDoc.Product)
    Else
        MsgBox TypeName(objCATIA.ActiveDocument)
    End If
End Sub

Function ScanStr_Product(objTmpProd As Product)
    Dim objTmpProducts As Products
    Set objTmpProducts = objTmpProd.Products
    Dim i As Integer
    For i = 1 To objTmpProducts.Count
        If TypeName(objTmpProducts.Item(i).ReferenceProduct.Parent) = "PartDocument" Then
            'PartDocument
            Call ScanStr_ResPart(objTmpProducts.Item(i))
        ElseIf TypeName(objTmpProducts.Item(i).ReferenceProduct.Parent) = "ProductDocument" Then
            'ProductDocument
            Call ScanStr_ResProduct(objTmpProducts.Item(i))
            Call ScanStr_Product(objTmpProducts.Item(i))
        Else
            MsgBox "Unbekannter Typ:" & vbNewLine & TypeName(objTmpProducts.Item(i).ReferenceProduct.Parent)
        End If
    Next
End Function

Function ScanStr_ResProduct(objTmpProduct As Product)
    'PRODUCTACTIONS
End Function

Function ScanStr_ResPart(objTmpProduct As Product)
    'PARTACTIONS
End Function


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 06. Jun. 2016 18:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für PAP 10 Unities + Antwort hilfreich

Servus
Die Products-Collection ist bei dir zB "objTmpProducts" (siehe auch Doku (V5Automation.chm))
Kleiner Hinweis: was passiert wenn in einem Product bzw Component keine Products enthalten sind (objTmpProducts.Count = 0)

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

PAP
Mitglied



Sehen Sie sich das Profil von PAP an!   Senden Sie eine Private Message an PAP  Schreiben Sie einen Gästebucheintrag für PAP

Beiträge: 29
Registriert: 08.08.2012

CATIA V5 R19
Win 7 Prof.
Intel Xeon 3.6Ghz
16Gb RAM
Nvidia Quadro 2000

erstellt am: 06. Jun. 2016 20:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo,

aber die muss ich doch auch durchlaufen?

Ich glaube vorhin selbst auf die Lösung gestoßen zu sein.
Ich dachte an etwas wie CATIA.Documents.GetItemByPartNumber("Part1"). Ich meine gesehen zu haben, dass man ein Item anstatt mit CATIA.Documents.Item(1) auch mit CATIA.Documents.Item("Part1.CATPart") direkt ansprechen kann.
Ungetestet und ohne Garantie ;-) aber um zu verdeutlichen was ich meinte.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP



GapYear Programm in der Mechanikkonstruktion

Möchten Sie Ihre Ideen in nutzbringende und sinnvolle Technologien verwandeln? Ob im Bereich Mobility Solutions, Consumer Goods, Industrial Technology oder Energy and Building Technology - mit uns verbessern Sie die Lebensqualität der Menschen auf der ganzen Welt. Willkommen bei Bosch.

Die Robert Bosch GmbH freut sich auf Ihre Bewerbung!


Anstellungsart: Befristet
Arbeitszeit: ...
Anzeige ansehenKonstruktion, Visualisierung
bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 07. Jun. 2016 08:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für PAP 10 Unities + Antwort hilfreich

Servus

Leider gibt es diese Möglichkeit nicht.
Das Durchsuchen/Abarbeiten der Documents-Collection hat (je nach Anwendungsfall) folgenden Vor/Nachteil: es werden alle geöffneten Dokumente (auch von einen parallel geöffneten CATProduct) erfasst.

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz