Autor
|
Thema: Mako Measure Inertia erzeugen (2166 mal gelesen)
|
Aitec Mitglied
Beiträge: 30 Registriert: 25.04.2018 Catia V5-R2016
|
erstellt am: 14. Mai. 2018 15:43 <-- editieren / zitieren --> Unities abgeben:
Hallo CAD Community, ich habe leider wieder ein Problem und komme auch nach ausführlicher Recherche nicht weiter. Dabei befinde ich mich in der Produktstruktur, möchte händisch ein Part auswählen und zu diesem Part soll ein Measure Inertia erzeugt werden. Problem ich bekomme entweder eine Fehlermeldung ("Qbject Required"), außerdem wird die Measure Inertia nicht in der Baumstruktur unter Applications angelegt. Hier mein Code:
Code: Sub CATMain() Dim ADoc As Document Set ADoc = CATIA.ActiveDocument Dim oSelection As Selection Set oSelection = ADoc.Selection Dim ASel As Variant Set ASel = oSelection Dim oProduct As Product Set oProduct = ADoc.Product Dim oInertia As Inertia Dim sSelection As Variant Set sSelection = ADoc.Selection Dim Matrix(8) Dim sFilter(1) Dim A, B, C, D, E, F, G, H, J As String ASel.Clear 'Part auswählen zu welchem die Bounding Box erzeugt werden soll MsgBox "Bitte Part auswählen um Measure Intertia durchzuführen" sFilter(0) = "Product" sFilter(1) = "Part" sSelection = ASel.SelectElement2(sFilter, "Bitte Reifen auswählen", False) If sSelection = "Normal" Then Set Reifen = ASel.Item2(1).Value 'ASel.Item2(1).Value End If 'Measure Inertia zu dem ausgewählten Objekt erzeugen Set oInertia = oProduct.GetTechnologicalObject("Inertia") oInetria.GetPrincipalAxes (Matrix) '--> Fehlermeldung A = Matrix(0) B = Matrix(1) C = Matrix(2) D = Matrix(3) E = Matrix(4) F = Matrix(5) G = Matrix(6) H = Matrix(7) J = Matrix(8) MsgBox A & B & C & D & E & F & G & H & J
Ich hoffe ihr könnt mir weiterhelfen ! Vielen Dank und Grüße! 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: 14. Mai. 2018 15:59 <-- editieren / zitieren --> Unities abgeben: Nur für Aitec
Servus Du hast dich in der Zeile vertippt: es muss oInertia heißen und nicht oInetria. AFAIK kann per Makro nicht eine (Trägheits)Messung im Baum erzeugen/anordnen. (ggf über den Umweg "StartCommands" und "Sendkeys" usw.) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Aitec Mitglied
Beiträge: 30 Registriert: 25.04.2018 Catia V5-R2016
|
erstellt am: 14. Mai. 2018 16:20 <-- editieren / zitieren --> Unities abgeben:
Servus, hey vielen Dank Bernd für die schnelle Antwort! Tut mir leid das ich hier schon wieder Poste weil ich schon wieder einen Schreibfehler gemacht habe! SYR! Leider erhalte ich in der Matrix merkwürdige Werte die sich nicht mit denen Decken, welche ich bei einer manuell erzeugten Measure Inertia bekomme. Weist du woran das liegt? Besten Danke und Grüße! 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: 14. Mai. 2018 16:31 <-- editieren / zitieren --> Unities abgeben: Nur für Aitec
Servus Welche Werte erwartest du? Die von GetPrincipalAxes oder GetPrincipalMoments oder GetInertiaMatrix? Vorsicht nicht das durch die Konvertierung in einen String was schief geht (ggf CStr verwenden). Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Aitec Mitglied
Beiträge: 30 Registriert: 25.04.2018 Catia V5-R2016
|
erstellt am: 14. Mai. 2018 16:36 <-- editieren / zitieren --> Unities abgeben:
Servus, also ich möchte aus der Matrix welche ich mit dem Befehl "GetPrincipalAxes" ermittel, die Werte für BBLx, BBLy und BBLz bekommen. Mit "GetCOGPosition" Analysiere ich ja eigentlich die Position des COG aber auch dieser Stimmt nicht. Die Ergebnisse lasse ich mir gerade so ausgeben MsgBox CStr(A) und A ist zuvor als Integer deklariert. Was mach ich falsch? Viele Grüße! 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: 14. Mai. 2018 16:41 <-- editieren / zitieren --> Unities abgeben: Nur für Aitec
|
Aitec Mitglied
Beiträge: 30 Registriert: 25.04.2018 Catia V5-R2016
|
erstellt am: 14. Mai. 2018 16:48 <-- editieren / zitieren --> Unities abgeben:
Servus, okay Verstehe, ohne Umweg ist hier nichts zu machen. Weist du zufällig trotzdem Warum die Werte von meinem COG welche ich durch das Makro bestimmt habe von den normal ausgelesenen abweichen? Besten Dank und Grüße ! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 15. Mai. 2018 06:42 <-- editieren / zitieren --> Unities abgeben: Nur für Aitec
Moin Aitec, wie bgrittmann schon ganz richtig angemerkt hat: das sind zwei unterschiedliche Dinge. Der COG ist der Massenschwerpunkt. Die BBL-Werte sind Teil der Beschreibung der Trägheitsmatrix, bzw. die LxBxH des minimalen Hüllkörper (der BoundingBox) in Richtung der Trägheitsmatrix. Die können nicht gleich sein. Ein manuell ausgeführtes Measure gibt ein Array mit 15 Werten zurück, die letzten 6 sind die BBLs Mit Script (.GetPrincipalAxes) erhälts du aber nur ein Array mit 9 Werten (A1x, A1y, A1z, A2x, A2y, A2z, A3x, A3y, A3z), die BBLs fehlen. Aber nochmal: Trägheitsmatrix und Schwerpunkt sind was anderes. Gruß tomtom ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Aitec Mitglied
Beiträge: 30 Registriert: 25.04.2018 Catia V5-R2016
|
erstellt am: 22. Mai. 2018 11:17 <-- editieren / zitieren --> Unities abgeben:
Moin tomtom1972, vielen Dank für deine Antwort. Den Unterschiede zwischen den BBLs und COG Werten habe ich verstanden. Ich musste aber feststellen das die COG-Werte welche ich durch meine Makro, mithilfe der .GetCOGPosition Anweisung, erhalte und mir durch eine MsgBox ausgeben lasse von den COG-Werten der Measure Inertia Funktion abweichen. Kann das sein oder habe ich einen Fehler gemacht? Grüße und Dank! 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: 22. Mai. 2018 11:22 <-- editieren / zitieren --> Unities abgeben: Nur für Aitec
Servus Ohne dein Modell und den Code zu kennen ist es schwer zu raten an was es liegen könnte. Hast du mal die Messung/Code in einem einfachen Part (zB nur ein Kugel, Würfel) probiert? Erstellst du manuell und per Code vom gleichen Objekt eine Messung? Gruß Bernd Edit: In deinem geposteten Code wird zB die Messung auf oProduct, also der Baugruppe, angewendet PS: Hier findest du ausführlichen Code und Beispiele dafür. ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Aitec Mitglied
Beiträge: 30 Registriert: 25.04.2018 Catia V5-R2016
|
erstellt am: 22. Mai. 2018 11:43 <-- editieren / zitieren --> Unities abgeben:
Hallo bgrittmann, also ich habe das Makro gerade noch einmal ausgefühlt und jeweils das entsprechende Part im Strukturbaum ausgewählt und trotzdem weichen die Ergebnisse von einander ab. Kann das mit Polarkoordinaten zu tun haben? Anbei der Code:
Code: Sub CATMain() Dim ADoc As Document Set ADoc = CATIA.ActiveDocument Dim oSelection As Selection Set oSelection = ADoc.Selection Dim ASel As Variant Set ASel = oSelection Dim oProduct As Product Set oProduct = ADoc.Product Dim oInertia As AnyObject Dim sSelection As Variant Set sSelection = ADoc.Selection Dim coords(2) Dim Matrix(8) Dim sFilter(1) Dim A, B, C, D, E, F, G, H, J As Double ASel.Clear 'Part auswählen MsgBox "Bitte Bauteil auswählen um Measure Intertia durchzuführen" sFilter(0) = "Product" sFilter(1) = "Part" sSelection = ASel.SelectElement2(sFilter, "Bitte Bauteil auswählen", False) If sSelection = "Normal" Then Set Bauteil = ASel.Item2(1).Value 'ASel.Item2(1).Value End If 'Measure Inertia zu dem ausgewählten Objekt erzeugen Set oInertia = oProduct.GetTechnologicalObject("Inertia") oInertia.GetPrincipalAxes Matrix oInertia.GetCOGPosition coords A = Matrix(0) B = Matrix(1) C = Matrix(2) D = Matrix(3) E = Matrix(4) F = Matrix(5) G = Matrix(6) H = Matrix(7) J = Matrix(8) MsgBox CStr(A) & vbCrLf & CStr(B) & vbCrLf & C & vbCrLf & D & vbCrLf & E & vbCrLf & F & vbCrLf & G & vbCrLf & H & vbCrLf & J MsgBox coords(0) & coords(1) & coords(2) End Sub
Viele Grüße 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: 22. Mai. 2018 12:03 <-- editieren / zitieren --> Unities abgeben: Nur für Aitec
|
Aitec Mitglied
Beiträge: 30 Registriert: 25.04.2018 Catia V5-R2016
|
erstellt am: 22. Mai. 2018 12:41 <-- editieren / zitieren --> Unities abgeben:
Hallo bgrittmann, also ich verstehe deinen Ratschlag und habe mir deine Link durchgelesen. Leider erhalte ich bei Codeanpassung
Code: Set oInertia = Bauteil.GetTechnologicalObject("Inertia")
gar keine Ergebnisse Ich stehe glaube ich ein bisschen auf dem schlauch. 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: 22. Mai. 2018 12:49 <-- editieren / zitieren --> Unities abgeben: Nur für Aitec
Servus Dann versuch mal den Code zu verstehen (ggf auch mal ausprobieren). Du könntest die Funktion GetProductInertia komplett übernehmen und in Test_GetProductInertia_AssyExample() noch deine Userselektion mit aufnehmen Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Aitec Mitglied
Beiträge: 30 Registriert: 25.04.2018 Catia V5-R2016
|
erstellt am: 22. Mai. 2018 16:22 <-- editieren / zitieren --> Unities abgeben:
Hallo bgrittmann, ich habe deinen Ratschlag befolgt und mithilfe des Links folgenden Code gebastelt:
Code: Sub Test_GetProductInertia_AssyExample() Dim sFilter(1) Dim oSel As Variant Set oSel = CATIA.ActiveDocument.Selection oSel.Clear Dim Matrix(8) Dim coords(2) sFilter(0) = "Product" sFilter(1) = "Part" MsgBox "Bitte wählen sie einen Reifen aus" sSelection = oSel.SelectElement2(sFilter, "Bitte Reifen auswählen", False) If sSelection = "Normal" Then Set Urspfelge = oSel.Item2(1).Value End If 'Select a product first, then run this sub. Dim objProd As Product Set objProd = CATIA.ActiveDocument.Selection.Item2(1).Value Set objInertia = GetProductInertia(objProd) If Not (objInertia Is Nothing) Then MsgBox objInertia.Mass MsgBox objInertia.Name objInertia.GetPrincipalAxes Matrix objInertia.GetCOGPosition coords Else MsgBox "The Inertia could not be retrieved!" End If A = Matrix(0) B = Matrix(1) C = Matrix(2) D = Matrix(3) E = Matrix(4) F = Matrix(5) G = Matrix(6) H = Matrix(7) J = Matrix(8) MsgBox A & vbCrLf & B & vbCrLf & C & vbCrLf & D & vbCrLf & E & vbCrLf & F & vbCrLf & G & vbCrLf & H & vbCrLf & J MsgBox coords(0) & coords(1) & coords(2) End SubFunction GetProductInertia(ByRef iProd As Product) As Inertia 'If successful, this function will return an inertia object 'Otherwise, Nothing is returned (you should check the return value) Dim objInertia As Inertia On Error Resume Next Set objInertia = iProd.ReferenceProduct.GetTechnologicalObject("Inertia") If Err.Number = 0 Then Set GetProductInertia = objInertia Else Set GetProductInertia = Nothing End If End Function
Dieser Funktioniert soweit. Leider habe ich noch immer vollkommen unterschiedliche COG-Werte im Vergleich zur händischen Messung. Kannst du mir verraten was ich Falsch mache? Und wie immer, vielen Dank für eure Unterstützung! 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: 22. Mai. 2018 21:36 <-- editieren / zitieren --> Unities abgeben: Nur für Aitec
Servus Kann es sein, dass der Code die Messung zum lokalen Ursprung des Parts/Products bezieht und nicht zum Rootproduct? ggf musst dann auf den Weg mit der SPAWorkbench wechseln (ist auch auf der verlinkten Seite gezeigt) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tomtom1972 Mitglied dipl ing maschinenbau
Beiträge: 605 Registriert: 22.03.2005 NVidia Quadro K4000 Intel Xeon E5-1620, 64GB RAM Windows10 64bit R30 <= CATIA V5 > =R19
|
erstellt am: 23. Mai. 2018 07:55 <-- editieren / zitieren --> Unities abgeben: Nur für Aitec
Moin, ich habe deinen Code getestet. Abgesehen von den unterschiedlichen Einheiten und der daraus resultierenden Kommaverschiebung sind die Werte bei mir mir gleich, also die mittels Script bzw. Händischer Messung ermittelten. Sowohl der COG als auch die anderen angezeigten. Ausprobiert mit wahllosen Beispielen: einzelnen Parts, ganzen Strukturen. Parts mit einem Body, mit mehreren, mit und ohne Materialzuweisung. Bei mir tritt nie ein Unterschied auf, insofern kann ich dein Problem nicht nachvollziehen. Gruß TomTom ------------------ tomtom1972 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Aitec Mitglied
Beiträge: 30 Registriert: 25.04.2018 Catia V5-R2016
|
erstellt am: 23. Mai. 2018 17:48 <-- editieren / zitieren --> Unities abgeben:
Moin tomtom1972, danke für deine Rückmeldung. Auch bei Kommaverschiebung erhalte ich merkwürdige Werte. Ich vermute es liegt daran das ich evtl. auf das falsche Part bzw Product zugreife. Ich werde dem weiter auf den Grund gehen und mich nochmal melden sobald ich etwas herausgefunden habe. Vielen Dank bis dahin! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |