Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  VBA: Constraints (Bedingungen) und Joints von SubAssemblies auslesen?

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: Constraints (Bedingungen) und Joints von SubAssemblies auslesen? (2454 mal gelesen)
cscp
Mitglied



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

Beiträge: 48
Registriert: 10.05.2013

Win 10, CATIA V5R20

erstellt am: 09. Apr. 2014 09:19    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

Hi,

ich hab eine Frage: Ist es möglich, wenn ein CATProduct selbst wieder CATProducts (mit Bedingungen und Joints) enthält, die Constraints und Joints dieses Products ausgehend des Hauptprodukts auszulesen?
Bisher konnte ich leider nur "Existierende Verknüpfungen" auslesen.

Der Debugger markiert immer folgende Zeile:
For i = 0 To QuantityOfConstraints - 1
---> objConstraints.Item(i + 1)

QuantityOfConstraints ist mit 2 gesetzt.

Besten Dank für Eure Hilfe! 
lG
Chris

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: 09. Apr. 2014 09:28    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 cscp 10 Unities + Antwort hilfreich

Servus

Das Subproduct hat seine eigene Constrain-Collection:

Code:
Sub CATMain()

Dim productDocument1 As ProductDocument
Set RootDocument = CATIA.ActiveDocument

Dim Rootproduct As Product
Set Rootproduct = RootDocument.Product

Dim SubProduct As Product
Set SubProduct = Rootproduct.Products.Item(1)

Dim ConstraintsOfSubProduct As Constraints
Set ConstraintsOfSubProduct = SubProduct.Connections("CATIAConstraints")

End Sub


Entweder arbeitest du deine Baum rekursiv ab, und ermittelst so alle Constrains, oder du verwendest die Suche um alle Constrains zu finden (ggf Makrorekorder) zB:
Code:
Sub CATMain()

Dim productDocument1 As ProductDocument
Set productDocument1 = CATIA.ActiveDocument

Dim selection1 As Selection
Set selection1 = productDocument1.Selection

selection1.Search "CATAsmSearch.MfConstraint,all"

End Sub


Gruß
Bernd

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

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

cscp
Mitglied



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

Beiträge: 48
Registriert: 10.05.2013

Win 10, CATIA V5R20

erstellt am: 09. Apr. 2014 09:37    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

Servus Bernd, danke für die schnelle Antwort! Leider funktioniert es glaub ich nicht  
Hab folgenden Code ausprobiert:
Code:
Sub CATMain()
Dim productDocument1 As ProductDocument
Set RootDocument = CATIA.ActiveDocument

Dim Rootproduct As Product
Set Rootproduct = RootDocument.Product

Dim SubProduct As Product
Set SubProduct = Rootproduct.Products.Item(5)

Debug.Print SubProduct.Name

Dim ConstraintsOfSubProduct As Constraints
Set ConstraintsOfSubProduct = SubProduct.Connections("CATIAConstraints")

Debug.Print ConstraintsOfSubProduct.Count

Dim objConstraint As Constraint
Set objConstraint = ConstraintsOfSubProduct.Item(1)
End Sub


Hier wird immer die letzte Zeile markiert mit der Meldung: "Run-time error '9': Subscript out of range"

Weißt Du woran das liegt?

[Diese Nachricht wurde von cscp am 09. Apr. 2014 editiert.]

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

RSchulz
Moderator²
Head of CAD, Content & Collaboration / IT-Manager



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

Beiträge: 5541
Registriert: 12.04.2007

@Work
Lenovo P510
Xeon E5-1630v4
64GB DDR4
Quadro P2000
256GB PCIe SSD
512GB SSD
SmarTeam V5-6 R2016 Sp04
CATIA V5-6 R2016 Sp05
E3.Series V2019
Altium Designer/Concord 19
Win 10 Pro x64

erstellt am: 09. Apr. 2014 09: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 cscp 10 Unities + Antwort hilfreich

Hallo,

vielleicht hilft dir folgendes weiter...

Code:

Sub CATMain()

    Dim oMainProduct As Product
    Dim oProdConstraints As Constraints
    Dim oProdConstraint As Constraint
       
    Set oMainProduct = CATIA.ActiveDocument.Product
    Set oProdConstraints = oMainProduct.Connections("CATIAConstraints")

    If oProdConstraints.Count > 0 Then
        For Each oProdConstraint In oProdConstraints
            If oProdConstraint.IsInactive = False Then
                If oProdConstraint.Status = 1 Or oProdConstraint.Status = 2 Or oProdConstraint.Status = 3 Then
                    MsgBox "Es gibt ein Problem mit " & oProdConstraint.Name
                End If
            Else
                MsgBox "Folgende Bedingung ist deaktiviert: " & oProdConstraint.Name
            End If
            DoEvents
        Next
    End If
   
End Sub


------------------
MFG
Rick Schulz

Nettiquette (CAD.de)  -  Was ist die Systeminfo?  -  Wie man Fragen richtig stellt.  -  Unities

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

cscp
Mitglied



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

Beiträge: 48
Registriert: 10.05.2013

Win 10, CATIA V5R20

erstellt am: 09. Apr. 2014 09:53    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

Vielen Dank Rick! Hab Deinen Code durchlaufen lassen - ohne Meldung.

Es muss doch irgendwie möglich sein, auf die Constraints zuzugreifen?! Im Locals Windows des VBA Editors kann ich sehen, dass die Items in ConstraintsOfSubProduct nicht vorhanden sind!?!?

lG
Chris

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

RSchulz
Moderator²
Head of CAD, Content & Collaboration / IT-Manager



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

Beiträge: 5541
Registriert: 12.04.2007

@Work
Lenovo P510
Xeon E5-1630v4
64GB DDR4
Quadro P2000
256GB PCIe SSD
512GB SSD
SmarTeam V5-6 R2016 Sp04
CATIA V5-6 R2016 Sp05
E3.Series V2019
Altium Designer/Concord 19
Win 10 Pro x64

erstellt am: 09. Apr. 2014 09:58    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 cscp 10 Unities + Antwort hilfreich

Hallo Chris,

ich werde durch deine Ausführungen nicht schlau. Was heist bei dir "zugreifen"? Auslesen kannst du sie wie ich es dir gezeigt habe. Da musst du mal in der Doku nachschauen. Du kannst sogar bis runter auf die Verknüpfung selbst lesen und diese auch neu generieren. Ich selbst mache das z.B. mit einer Fixierung, wenn keine vorhanden ist.

Codeschnipsel nicht angepasst! Dieser Stammt aus dem .Net, womit sich ein leicht anderer Kontext ergibt.

Code:

                oDoc = WorkProduct.Products.Item(1)
                RefPartNo = oDoc.Name
                RefString = WorkProduct.PartNumber & "/" & RefPartNo & "/!" & WorkProduct.PartNumber & "/" & RefPartNo & "/"
                oRef = WorkProduct.CreateReferenceFromName(RefString)
                oProdConstraints = WorkProduct.Connections("CATIAConstraints")
                oProdConstraint = oProdConstraints.AddMonoEltCst(MECMOD.CatConstraintType.catCstTypeReference, oRef)

Du kannst theoretisch alle möglichen Arten von Bedingungen erzeugen. Dafür musst du dich allerdings mit der Referenzstruktur bzw. dem -format auseinandersetzen. Das ist nicht mal eben so erklärt und schaut bei den unterschiedlichen Bedingungstypen auch entsprechend anders aus!

Was mir allerdings nicht klar ist, was du genau machen willst.

------------------
MFG
Rick Schulz

Nettiquette (CAD.de)  -  Was ist die Systeminfo?  -  Wie man Fragen richtig stellt.  -  Unities

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

cscp
Mitglied



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

Beiträge: 48
Registriert: 10.05.2013

Win 10, CATIA V5R20

erstellt am: 09. Apr. 2014 10:03    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

Servus Rick! Sorry wenn ich mich undeutlich ausgedrückt habe 
Also ich will praktisch alle Constraints (auch die der SubAssemblies) auslesen. Dazu will ich neben dem Namen auch beispielsweise mit der SPAWorkbench den Ursprung und die Richtung einer Kongruenz Bedingung abfragen. Mit den Constraints des RootProducts geht das wunderbar! Nur eben leider nicht mit denen der SubAssemblies. Ich verstehe leider nicht, warum die Items in den CATIAConstraints eines SubAssemblys fehlen... 
Ich will keine Bedingungen erzeugen!

So, ich hoffe das war jetzt besser ausgedrückt  Weißt Du Rat?

Besten Dank! 
lG
Chris

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

RSchulz
Moderator²
Head of CAD, Content & Collaboration / IT-Manager



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

Beiträge: 5541
Registriert: 12.04.2007

@Work
Lenovo P510
Xeon E5-1630v4
64GB DDR4
Quadro P2000
256GB PCIe SSD
512GB SSD
SmarTeam V5-6 R2016 Sp04
CATIA V5-6 R2016 Sp05
E3.Series V2019
Altium Designer/Concord 19
Win 10 Pro x64

erstellt am: 09. Apr. 2014 10:17    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 cscp 10 Unities + Antwort hilfreich

Dann musst du das ganze Rekursiv aufbauen! Hierfür musst du eine eigene Prozedur schreiben, an die du da jeweilige Product übergibst...

Ich habe dir das mal eben an Hand des Beispiel zusammen geschrieben...

Code:

Public i As Integer
Sub CATMain()

    Dim oMainProduct As Product
   
    i = 0
    Set oMainProduct = CATIA.ActiveDocument.Product
    Call CheckConstraints(oMainProduct)
    Call CheckChildrens(oMainProduct)
    MsgBox "Es wurden " & i & " Produkte untersucht!"
   
End Sub

Sub CheckChildrens(ByVal oCheckPoduct As Product)

    Dim oProducts As Products
    Dim oProduct As Product
       
    Set oProducts = oCheckPoduct.Products
   
    For Each oProduct In oProducts
        If oProduct.Products.Count > 0 Then
            Call CheckConstraints(oProduct.ReferenceProduct.Parent.Product)
            Call CheckChildrens(oProduct.ReferenceProduct.Parent.Product)
        End If
    Next

   
End Sub

Sub CheckConstraints(ByVal oCheckPoduct As Product)

    Dim oProdConstraints As Constraints
    Dim oProdConstraint As Constraint
   
    i = i + 1
    Set oProdConstraints = oCheckPoduct.Connections("CATIAConstraints")

    If oProdConstraints.Count > 0 Then
        For Each oProdConstraint In oProdConstraints
            If oProdConstraint.IsInactive = False Then
                If oProdConstraint.Status = 1 Or oProdConstraint.Status = 2 Or oProdConstraint.Status = 3 Then
                    MsgBox "Es gibt ein Problem mit " & oProdConstraint.Name
                End If
            Else
                MsgBox "Folgende Bedingung ist deaktiviert: " & oProdConstraint.Name
            End If
            DoEvents
        Next
    End If
   
End Sub


------------------
MFG
Rick Schulz

Nettiquette (CAD.de)  -  Was ist die Systeminfo?  -  Wie man Fragen richtig stellt.  -  Unities

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

cscp
Mitglied



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

Beiträge: 48
Registriert: 10.05.2013

Win 10, CATIA V5R20

erstellt am: 09. Apr. 2014 10:27    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

Wow Rick, vielen Dank für deine Mühe!! Leider geht auch das hier nicht.

Die Zeile 'For Each oProdConstraint In oProdConstraints' wird markiert mit der Meldung "Das Verfahren _NewEnum ist fehlgeschlagen".

Ich denke es liegt daran, dass oProdConstraints von einem SubAssembly zwar Count richtig enthält, aber leider keine Items... Deswegen schlägt auch das foreach fehl.

Weißt Du noch eine andere Lösung?

Folgendes ist mir noch aufgefallen. Wenn ich auf ein SubAssembly mit Constraints rechtsklicke, dann auf Objekt, dann auf flexible / starre Unterbaugruppe klicke, dann tauchen MANCHMAL die Constraints diese SubAssemblies in der Constraintliste des RootProducts auf... vielleicht hilft das bei der Lösungsfindung... 

Wenn Ihr noch was wisst oder Vorschläge habt, immer her damit  Ich such mal weiter nach einer Lösung... :/

Danke und lG
Chris

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

RSchulz
Moderator²
Head of CAD, Content & Collaboration / IT-Manager



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

Beiträge: 5541
Registriert: 12.04.2007

@Work
Lenovo P510
Xeon E5-1630v4
64GB DDR4
Quadro P2000
256GB PCIe SSD
512GB SSD
SmarTeam V5-6 R2016 Sp04
CATIA V5-6 R2016 Sp05
E3.Series V2019
Altium Designer/Concord 19
Win 10 Pro x64

erstellt am: 09. Apr. 2014 10: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 cscp 10 Unities + Antwort hilfreich

Kann es sein, dass du "FixTogether" verwendest? Diese führen zu Fehlern.

Ich habe bei mir noch eine Prüfung drin. Wann bzw. ob und wie der Fehler behoben wird, kann ich dir nicht sagen. Fakt ist, FixTogether ein Auslesen der Bedingungen unmöglich machen bzw. eben ein Fehler auftritt.

BTW deine Vermutung kann nicht stimmen, da schon eine Abfrage dafür drin ist ("If oProdConstraints.Count > 0 Then")...

------------------
MFG
Rick Schulz

Nettiquette (CAD.de)  -  Was ist die Systeminfo?  -  Wie man Fragen richtig stellt.  -  Unities

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

cscp
Mitglied



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

Beiträge: 48
Registriert: 10.05.2013

Win 10, CATIA V5R20

erstellt am: 09. Apr. 2014 10:55    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

Ja, du hast Recht!!! Ich verwende FixTogethers. Daran scheint es wohl zu liegen... also sobald ein FixTogether vorhanden ist, dann stimmt meine Vermutung.

Zumindest das Locals Window des VBA Editors enthält dann für die SubProductConstraints einen "Count" Eintrag aber keine Items wie für das RootProduct.

Danke Dir für deine Hilfe!!!!

[Diese Nachricht wurde von cscp am 09. Apr. 2014 editiert.]

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

RSchulz
Moderator²
Head of CAD, Content & Collaboration / IT-Manager



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

Beiträge: 5541
Registriert: 12.04.2007

@Work
Lenovo P510
Xeon E5-1630v4
64GB DDR4
Quadro P2000
256GB PCIe SSD
512GB SSD
SmarTeam V5-6 R2016 Sp04
CATIA V5-6 R2016 Sp05
E3.Series V2019
Altium Designer/Concord 19
Win 10 Pro x64

erstellt am: 09. Apr. 2014 11:03    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 cscp 10 Unities + Antwort hilfreich

Nein. Es enthält die Items, kann diese aber nicht zurück geben!

Wie gesagt, warum weis ich auch nicht. Das scheint für mich ein harter Fehler in der API zu sein. Ich kann mir gut vorstellen, dass die FixTogether mit in diesem Kontainer sind, aber nicht als Object zurück gegeben werden können bzw. verarbeitet werden und dann die Rückgabe in einen Fehler läuft, was ein lehres Object zur Folge hat.

BTW FixTogehter kannst du wie folgt abfragen...

Code:

        Dim oProdFixTogs As FixTogethers
        oProdFixTogs = oCheckProduct.Connections("CATIAFixTogethers")

------------------
MFG
Rick Schulz

Nettiquette (CAD.de)  -  Was ist die Systeminfo?  -  Wie man Fragen richtig stellt.  -  Unities

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