Autor
|
Thema: VBA: Constraints (Bedingungen) und Joints von SubAssemblies auslesen? (2454 mal gelesen)
|
cscp Mitglied
Beiträge: 48 Registriert: 10.05.2013 Win 10, CATIA V5R20
|
erstellt am: 09. Apr. 2014 09:19 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 09. Apr. 2014 09:28 <-- editieren / zitieren --> Unities abgeben: Nur für cscp
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
Beiträge: 48 Registriert: 10.05.2013 Win 10, CATIA V5R20
|
erstellt am: 09. Apr. 2014 09:37 <-- editieren / zitieren --> Unities abgeben:
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.ActiveDocumentDim 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
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 / zitieren --> Unities abgeben: Nur für cscp
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
Beiträge: 48 Registriert: 10.05.2013 Win 10, CATIA V5R20
|
erstellt am: 09. Apr. 2014 09:53 <-- editieren / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für cscp
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
Beiträge: 48 Registriert: 10.05.2013 Win 10, CATIA V5R20
|
erstellt am: 09. Apr. 2014 10:03 <-- editieren / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für cscp
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
Beiträge: 48 Registriert: 10.05.2013 Win 10, CATIA V5R20
|
erstellt am: 09. Apr. 2014 10:27 <-- editieren / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für cscp
|
cscp Mitglied
Beiträge: 48 Registriert: 10.05.2013 Win 10, CATIA V5R20
|
erstellt am: 09. Apr. 2014 10:55 <-- editieren / zitieren --> Unities abgeben:
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
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 / zitieren --> Unities abgeben: Nur für cscp
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 |