Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  Product Strukturbaum durchlaufen und Hautpkörper im Part umbenennen

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
  
Die Gewinne der Zukunft werden mit intelligenten, autonomen Elektrofahrzeugen eingefahren. (3DEXPERIENCE)
Autor Thema:  Product Strukturbaum durchlaufen und Hautpkörper im Part umbenennen (2591 mal gelesen)
apollo11
Mitglied



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

Beiträge: 47
Registriert: 31.03.2007

erstellt am: 09. Jul. 2007 19:49    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 zusammen!

Ich möchte gerne einen gesamten Strukturbaum durchsuchen und beim Auffinden von Products die zugehörigen Hauptkörper der Parts umbenennen.
Mein Ansatz wäre ein rekursives Durchforsten des Baums, allerdings schaffe ich es nicht auf die Parts zuzugreifen und zu unterscheiden ob das Item ein Part oder Product ist.

Hier mein bisheriger Code:

Code:

Sub CATMain()
    Dim Doc1 As Document
    Set Doc1 = CATIA.ActiveDocument
    Dim Typ As String

        'Abfrage ob aktuelles Dokument ein Part oder Product ist
    Typ = Doc1.Name
    Typ = Right(Typ, Len(Typ) - InStr(Typ, "."))
   
    If StrComp(Typ, "CATPRODUCT", vbTextCompare) = 0 Then
        ' PRODUCT
        Dim Product1 As Product
        Set Product1 = Doc1.Product
        Call RunTree(Product1)
               
    ElseIf StrComp(Typ, "CATPART", vbTextCompare) = 0 Then
        ' PART
        Dim part1 As Part
        Set part1 = Doc1.Part
        Call RenameSolid(part1)
    End If
   
End Sub

Private Sub RunTree(Product1 As Product)
    For i = 1 To Product1.Products.Count
        MsgBox Product1.Products.Item(i).Name

        If ****Product1.Products.Item(i).Type? = "Product" **** Then
            Call RunTree(Product1.Products.Item(i))
        ElseIf ****Product1.Products.Item(i).Type? = "Part" **** Then
            Call RenameSolid(Product1.Products.Item(i))
        Else
            'other
        End If
    Next
End Sub

Private Sub RenameSolid(Part1 As Part)
    ....Hauptkörper umbenennen
End Sub


Ich bekomm das PART Object einfach nicht aus dem Product raus da 'Product1.Products.Item(i)' ja wieder ein Product ist.
Wär toll wenn jemand ne Idee hätte!

gruß ap

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

Lusilnie
Mitglied



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

Beiträge: 1486
Registriert: 13.07.2005

erstellt am: 09. Jul. 2007 22:10    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 apollo11 10 Unities + Antwort hilfreich

Hallo apollo11,

die besagten Zeilen sollten aus meiner Sicht

Code:
If TypeName(Product1.Products.Item(i).referenceProduct.parent) = "ProductDocument" Then
bzw.
Code:
ElseIf TypeName(Product1.Products.Item(i).referenceProduct.parent) = "PartDocument" Then
lauten, dann sollte es funktionieren!


mfg,
Lusilnie

------------------

Alle Aussagen zu DassaultSystemes-Produkten sind sehr optimistisch, selbst diese!!!

frei nach größeren Geistern

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

apollo11
Mitglied



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

Beiträge: 47
Registriert: 31.03.2007

MacBook Leopard 10.5.6 4GB Ram
VMWARE 3
WinXP Pro SP2
V5R16 SP5

erstellt am: 10. Jul. 2007 18:20    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

Funktioniert einwandfrei!
Ich hab dazu noch was im Forum gefunden:
http://ww3.cad.de/foren/ubb/Forum137/HTML/001168.shtml#000004

tomtom1972 schreibt da man soll zuerst alle Nodes deaktivieren, dann die Aktionen durchführen und danach wieder alles aktivieren.
Ich kann den tieferen Sinn dabei nicht erkennen... Es funktioniert auch ohne ?!?

lg ap

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

tomtom1972
Mitglied
dipl ing maschinenbau


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

Beiträge: 602
Registriert: 22.03.2005

NVidia Quadro K4000
Intel Xeon E5-1620, 64GB RAM
Windows10 64bit
R30 <= CATIA V5 > =R19

erstellt am: 11. Jul. 2007 06:35    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 apollo11 10 Unities + Antwort hilfreich

Hallo apollo11,

dein Link funktionoiert zwar bei mir nicht, aber wenn ich mich recht erinnere war das Deaktivieren der Nodes die Lösung eines anderen Problems: Wenn du Geometrie aus einer Struktur kopieren möchtes erhält diese eine falsche Transformation (ist also im Raum falsch positioniert), sofern ein und das selbe Part in einen Product öfter instantiert ist und zudem eine unterschiedliche Transformation hat.

Mit deinen Problem hat das nix zu tun.

Gruss TomTom

------------------
tomtom1972

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

olleiCAD
Mitglied



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

Beiträge: 57
Registriert: 24.04.2018

Catia V5 R29 SP3 | Windows 10 Pro

erstellt am: 14. Jul. 2021 08:44    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 apollo11 10 Unities + Antwort hilfreich

Etwas alt aber ich habe da ein Problem:

Code:
Sub CATMain()
    Dim Doc1 As Document
    Set Doc1 = CATIA.ActiveDocument
 
    Dim UserSelection As Object
    Dim AlleKoerper As Integer
    Dim a          As Integer
    Dim Speicherpfad As String
    Dim Dateiname As String
   
    Dim Typ        As String

   
    '-- Speicherpfad
    Speicherpfad = InputBox("Bitte den Pfad eigeben, wo das Versandmodell gespeichert werden soll.", "Eingabe Dateipfad und Name")
    Speicherpfad = Speicherpfad & "\"
   
    '-- Product, Parts rekursiv durchgehen
    '-- Abfrage ob aktuelles Dokument ein Part oder Product ist
    Typ = Doc1.Name
    Typ = Right(Typ, Len(Typ) - InStr(Typ, "."))
   
    If StrComp(Typ, "CATPRODUCT", vbTextCompare) = 0 Then
        ' PRODUCT
        Dim Product1 As Product
        Set Product1 = Doc1.Product
        Call RunTree(Product1)
       
    ElseIf StrComp(Typ, "CATPART", vbTextCompare) = 0 Then
        ' PART
        Dim part1 As Part
        Set part1 = Doc1.Part
        Call KoerperToeten(part1)
    End If
   
End Sub

Private Sub RunTree(Product1 As Product)
    For i = 1 To Product1.Products.Count
        MsgBox Product1.Products.Item(i).Name
       
        If TypeName(Product1.Products.Item(i).ReferenceProduct.Parent) = "ProductDocument" Then
            Call RunTree(Product1.Products.Item(i))
        ElseIf TypeName(Product1.Products.Item(i).ReferenceProduct.Parent) = "PartDocument" Then
            Call KoerperToeten(Product1.Products.Item(i))
        Else
            'other
        End If
    Next
End Sub

Private Sub KoerperToeten(part1 As Part)
   
    '-- Part
   
    Dim partDocument1 As PartDocument
    Set partDocument1 = CATIA.ActiveDocument
   
    Set part2 = partDocument1.Part
    Dim bodies1    As Bodies        'solids
    Set bodies1 = part2.Bodies
   
    Dim shapeFactory1 As ShapeFactory        'solids
    Set shapeFactory1 = part2.ShapeFactory
   
    Dim hybridBodies1 As HybridBodies
    Set hybridBodies1 = part2.HybridBodies
   
    Dim hybridShapeFactory1 As HybridShapeFactory
    Set hybridShapeFactory1 = part2.HybridShapeFactory

    Set UserSelection = partDocument1.Selection
    UserSelection.Clear
   
    AlleKoerper = bodies1.Count
    Dateiname = partDocument1.Product.PartNumber
   
   
    Dim BodyArrayAlle()
    ReDim BodyArrayAlle(AlleKoerper)
   
    For a = 1 To AlleKoerper
        Set BodyArrayAlle(a) = bodies1.Item(a)
    Next
    UserSelection.Clear
   
    '-- Alle Koerper kopieren und tot einfügen
    For a = 1 To UBound(BodyArrayAlle)
        If BodyArrayAlle(a).InBooleanOperation = False And Not (BodyArrayAlle(a) Is part2.MainBody) Then
            UserSelection.Add BodyArrayAlle(a)
        End If
       
    Next


Ich bekomme bei Call KoerperToeten(Product1.Products.Item(i)) einen Type mismatch.
Woher kommt der?

Kann ich in  Private Sub KoerperToeten(part1 As Part) einfach so weiter coden, als wie wenn ich ein Makro für ein Part schreiben würde, oder muss ich dieses Part, welches rekursiv gefunden wurde erst mal ansprechen?

Danke schon mal

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: 11411
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 14. Jul. 2021 17: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 apollo11 10 Unities + Antwort hilfreich

Servus

Du übergibst an die Unterroutine ein Product (die Instanz). Erwartet wird aber das Part.
Probier mal:
Call KoerperToeten(Product1.Products.Item(i).ReferenceProduct.Parent.Part)

Zitat:
Kann ich in  Private Sub KoerperToeten(part1 As Part) einfach so weiter coden
Da du das Part übergibst kannst du weitestgehend so programmieren wie wenn du in einem aktiven PartDocument bist.
Vermutlich musst du aber die Selection des aktiven Dokuments (Set UserSelection = Catia.ActiveDocument.Selection) nutzen und nicht die vom PartDocument

Gruß
Bernd

PS: Was passiert wenn das Einzelteil mehrfach in der Baugruppe verbaut ist?

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

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

olleiCAD
Mitglied



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

Beiträge: 57
Registriert: 24.04.2018

Catia V5 R29 SP3 | Windows 10 Pro

erstellt am: 15. Jul. 2021 17: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 apollo11 10 Unities + Antwort hilfreich

Super hat geklappt danke!

Das mit den doppelten Parts ist mir in dem Fall egal, dann überspeichert er die Datei einfach.

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)2021 CAD.de | Impressum | Datenschutz