| | | KISTERS 3DViewStation: Unterstützung für 3D CAD Kollaboration mit Lieferanten, eine Pressemitteilung
|
Autor
|
Thema: Achsensystemkomponenten im Produkt messen (3138 mal gelesen)
|
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 15. Jul. 2013 15:10 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich möchte innerhalb eines Produktes (s. Anhang) Komponenten (Ebenen, Origin-Point) eines Achsensystems von den Parts, die im Produkt hängen, zueinander messen. Leider spuckt mir Catia merkwürdige Ergebnisse aus, die ich mir nicht erklären kann. In diesem Beispiel 0, obwohl die Achsensysteme sehrwohl verschoben sind. Per Hand geht es natürlich, sprich direkt im 3D! Kann mir da jmd helfen oder hat einen Tipp? Zugehöriges Messmakro: Code:
Sub catmain() Dim ac As ProductDocument Set ac = CATIA.ActiveDocument Dim documents1 As Documents Set documents1 = CATIA.Documents Dim partDocument1 As PartDocument Set partDocument1 = documents1.Item("Part1.CATPart") Dim part1 As Part Set part1 = partDocument1.Part Dim axisSystems1 As AxisSystems Set axisSystems1 = part1.AxisSystems Dim axisSystem1 As AxisSystem Set axisSystem1 = axisSystems1.Item("Absolute Axis System") Dim partDocument2 As PartDocument Set partDocument2 = documents1.Item("Part2.CATPart") Dim part2 As Part Set part2 = partDocument2.Part Dim axisSystems2 As AxisSystems Set axisSystems2 = part2.AxisSystems Dim axisSystem2 As AxisSystem Set axisSystem2 = axisSystems2.Item("Absolute Axis System") Dim p1 As Product Set p1 = ac.Product.Products.Item(1) Dim p2 As Product Set p2 = ac.Product.Products.Item(2) Dim ref1 As Reference 'Set ref1 = p1.CreateReferenceFromName(p1.PartNumber & "/!Selection_FVertex:(Vertex:(Neighbours:(Face:(Brp:(" & axisSystem1.Name & ";2);None:();Cf11:());Face:(Brp:(" & axisSystem1.Name & ";3);None:();Cf11:());Face:(Brp:(" & axisSystem1.Name & ";1);None:();Cf11:()));Cf11:());" & axisSystem1.Name & ";InSameTool;Z0;G3491)") Set ref1 = part1.CreateReferenceFromName("Selection_RSur:(Face:(Brp:(AxisSystem.1;2);None:();Cf11:());AxisSystem.1;Z0;G2796)") Dim ref2 As Reference 'Set ref2 = p2.CreateReferenceFromName(p2.PartNumber & "/!Selection_FVertex:(Vertex:(Neighbours:(Face:(Brp:(" & axisSystem2.Name & ";2);None:();Cf11:());Face:(Brp:(" & axisSystem2.Name & ";3);None:();Cf11:());Face:(Brp:(" & axisSystem2.Name & ";1);None:();Cf11:()));Cf11:());" & axisSystem2.Name & ";InSameTool;Z0;G3491)") Set ref2 = part2.CreateReferenceFromName("Selection_RSur:(Face:(Brp:(AxisSystem.1;2);None:();Cf11:());AxisSystem.1;Z0;G2796)") Dim ma As Measurable Set TheSPAWorkbench = ac.GetWorkbench("SPAWorkbench") Set ma = TheSPAWorkbench.GetMeasurable(ref1) Dim MinimumDistance As Double MinimumDistance = ma.GetMinimumDistance(ref2) MsgBox MinimumDistance End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 15. Jul. 2013 16:15 <-- editieren / zitieren --> Unities abgeben: Nur für MarcDe
Ich checke Deine Referenzen nicht. Ich denke hier liegt auch Dein Fehler. Du setzt zwei Mal die gleiche Referenz. Warum setzt Du die Referenzen so kompliziert? ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 15. Jul. 2013 16:34 <-- editieren / zitieren --> Unities abgeben:
Moin Henry, Zitat: Du setzt zwei Mal die gleiche Referenz.
Es ist immer eine Ebene vom Achsensystem in jeweils einem Part. BRep sieht da natürlich gleich aus, wird jedoch in je einem anderen Part erzeugt. Du kannst auch testweise mal den anderen BREP-String über Product einkommentieren, da kommt dasselbe heraus: 0. Zitat: Warum setzt Du die Referenzen so kompliziert?
Wie soll ich sie anders setzen? Vom Achsensystem gibt es keine Member wie XZ-Plane als Referenz. Lediglich die Origin-Point Referenz als Member, aber die ist leider abhängig von der Definition des Achsensystems und somit nicht nutzbar, da zu 90% nicht gesetzt von Catia. Da bleiben nur noch unschöne BREPs. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 12005 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 15. Jul. 2013 20:08 <-- editieren / zitieren --> Unities abgeben: Nur für MarcDe
Servus In deinen Referencen fehlt im Pfad die Instanz des Parts. Leider hat es mit MinimumDistance auch nicht geklappt, alternativ kann man die Koordinaten der Achsensysteme ermitteln und dann den Abstand berechnen. Anbei ein Beispiel: Code: Option ExplicitSub CATMain() Dim RootProduct As Product Dim osel As Selection Dim osel_obj As Object Dim Part1Product As Product Dim Part2Product As Product Dim oRef1 As Reference Dim oRef2 As Reference Dim Measure 'As Measurable Dim TheSPAWorkbench As SPAWorkbench Dim ComponentsAxSys2(11) Dim ComponentsAxSys1(11) Dim Distance As Double 'Allgemein Set RootProduct = CATIA.ActiveDocument.Product Set osel_obj = CATIA.ActiveDocument.Selection Set osel = osel_obj 'zwischen welchen Produkten soll gemessen werden Set Part1Product = RootProduct.Products.Item(1) Set Part2Product = RootProduct.Products.Item(2) 'erstes Achsensystem ermitteln osel.Clear osel.add Part1Product osel.Search "CATPrtSearch.AxisSystem,sel" Set oRef1 = CreateReferenceFromSelection(RootProduct, osel.Item2(1)) 'zweites Achsensystem ermitteln osel.Clear osel.add Part2Product osel.Search "CATPrtSearch.AxisSystem,sel" Set oRef2 = CreateReferenceFromSelection(RootProduct, osel.Item2(1)) 'messen Set TheSPAWorkbench = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench") Set Measure = TheSPAWorkbench.GetMeasurable(oRef1) Measure.GetAxisSystem ComponentsAxSys1 Set Measure = TheSPAWorkbench.GetMeasurable(oRef2) Measure.GetAxisSystem ComponentsAxSys2 Distance = Sqr((ComponentsAxSys1(0) - ComponentsAxSys2(0)) ^ 2 + (ComponentsAxSys1(1) - ComponentsAxSys2(1)) ^ 2 + (ComponentsAxSys1(2) - ComponentsAxSys2(2)) ^ 2) MsgBox Distance End Sub Function CreateReferenceFromSelection(Prod As Product, Selected As AnyObject) As Reference 'Quelle: http://www.gtwiki.org/mwiki/index.php?title=Create_Product_Level_References_for_Constraints_and_Publication Dim ParentProd As Product Dim obj As AnyObject Dim path As String Set ParentProd = Selected.LeafProduct Set obj = Selected.Value path = GetComponentPath(Prod, ParentProd) If path <> "" Then Set CreateReferenceFromSelection = Prod.CreateReferenceFromName(path & "/!" & obj.Name) End If End Function
Function CreateReferenceFromObject(Prod As Product, LeafProduct As Product, obj As AnyObject) As Reference 'Quelle: http://www.gtwiki.org/mwiki/index.php?title=Create_Product_Level_References_for_Constraints_and_Publication Dim path As String Set path = GetComponentPath(Prod, LeafProduct) If path <> "" Then Set CreateReferenceFromObject = Prod.CreateReferenceFromName(path & "/!" & obj.Name) End If End Function Function GetComponentPath(product1 As Product, Product2 As Product) As String 'Quelle: http://www.gtwiki.org/mwiki/index.php?title=Create_Product_Level_References_for_Constraints_and_Publication Dim tempProd As Product Dim i As Integer Dim try As String If product1.Name = Product2.Name Then GetComponentPath = product1.Name Exit Function End If For i = 1 To product1.Products.Count Set tempProd = product1.Products.Item(i) try = GetComponentPath(tempProd, Product2) If try <> "" Then GetComponentPath = product1.Name & "/" & try Exit Function End If Next GetComponentPath = "" End Function
Gruß Bernd------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CadV5UserR Mitglied Dipl.Ing. Maschinenbau
Beiträge: 79 Registriert: 18.04.2008 Windows 7 x64 Professional SP1 Dell Precision T3500 Intel Xeon CPU W3580 3.33GHz 24Gb Ram NVIDIA Qudro 4000 Catia V5R20 Sp6 SmarTeam V5R20 SP6
|
erstellt am: 15. Jul. 2013 20:14 <-- editieren / zitieren --> Unities abgeben: Nur für MarcDe
Hallo MarcDe Leider kann ich Dein script mangels CATIA nicht testen. Allerdings fällt mir grundlegend ein Problem auf. Du fragst das erste Achsensystem in einem Part1.CATPart ab. Das Problem ist nur, wie soll Catia bei deinem Script wissen, welches Part1.CATPart gemeint ist, wenn dieses mehrfach in deinem Produkt oder an anderer stelle verbaut wurde? Um eine Eindeutigkeit zu erreichen musst du die Referenzen der Instanzen des ganzen Pfades vom Produkt zum Part zum Achsensystem angeben. Schau dir mal den Link an. ( Beispiel mit Abstand zwischen Punkten ) http://ww3.cad.de/foren/ubb/Forum137/HTML/005219.shtml#000013 Ein Tipp dazu habe ich aber noch, um die genauen Namen der Teile zu erhalten Speicher dein Hauptprodukt mit Speichern unter als Text ab. Das Ergebnis sollte so aussehen: RootProduct : Product1 | |- Product : Part1 (Part1.1) | |- Product : Part2 (Part2.1) In deinem Beispiel sollte die Referenz in etwa so aussehen:
Set ref1 = p1.CreateReferenceFromName ("product1/Part1.1/!Selection_FVertex.......”) Set ref2 = p1.CreateReferenceFromName ("product1/Part2.1/!..........”) Leider habe noch keine Achsabstände gemessen, und kann es ohne Catia nicht testen. Ich hoffe ich konnte die helfen. Testen kann ich das ganze aber erst ende der Woche. Gruß, Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 16. Jul. 2013 09:21 <-- editieren / zitieren --> Unities abgeben:
Moin, Zitat: In deinen Referencen fehlt im Pfad die Instanz des Parts
Ich dachte die Referenz des Parts ist implizit mit übergeben, da ich die Methode "CreateReferenceFromName" vom Object part1 bzw. part2 jeweils aufgerufen habe? Zitat: Leider hat es mit MinimumDistance auch nicht geklappt
Ich vermute eher, dass ist ein Catia Bug (mal wieder)? Denn ich hab ja jeweils in den BREP-Zeilen eine Alternativzeile, die auch das Part und die Partnumber berücksichtigt und dort kommt ebenfalls 0 raus. Also kann es meiner Meinung nicht daran liegen, dass im BREP-String ein Hinweis auf das Zielpart fehlt. Bin mir jedoch auch nicht 100% sicher, es deutet aber darauf hin, da bei beiden Wegen jeweils 0 rauskommt, sprich: es macht keinen Unterschied ob ich die Referenz mit angebe im BREP-String oder ob ich einen lokalen BREP-String nehmen, jedoch die Methode von part1 bwz. part2 Object aufrufe und somit wieder klar ist, welches System gemeint ist. Zitat: Du fragst das erste Achsensystem in einem Part1.CATPart ab. Das Problem ist nur, wie soll Catia bei deinem Script wissen, welches Part1.CATPart gemeint ist, wenn dieses mehrfach in deinem Produkt oder an anderer stelle verbaut wurde?
Ja prinzipiell hast du natürlich recht, das wäre jedoch schon der nächste Schritt. Ich habe diesen "eindeutigen" BREP-String ja auch in meinem Beispiel - so wie du ihn beschrieben hast - , jedoch auskommentiert, weil er auch nicht funktionierte. Catia liefert egal in welchem Fall immer 0 zurück. @bgrittmann: Danke für das Beispiel. Das Problem ist, ich brauche von einem beliebigen Achsensystem zu einem beliebigen anderen System innerhalb eines Produktes den Origin-Abstand UND auch alle Winkel zwischen allen Ebenen. Ich muss die komplette Verschiebung und Verdrehung beider Achsensysteme ermitteln. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 16. Jul. 2013 09:36 <-- editieren / zitieren --> Unities abgeben: Nur für MarcDe
Hallo MarcDe, sorry, hatte das total übersehen, dass Du zwei Parts hast. :-) So hast Du natürlich vollkommen Recht. :-) Ich vermute jetzt, dass Du die Referenz auf Produktebene bilden musst, statt auf Partebene. Ich denke aber auch, dass Bernds ansatz der beste ist. Also Koordinaten der Achsensysteme holen und dann das problem mathematisch lösen. Geht einfach und aht weniger Fehlerqullen, da weniger CATIA (*wechlach*). Ich mache es so ähnlich bei http://hoblila.wordpress.com/download/ nur, dass ich da die Abstände nicht noch ausgebe. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 16. Jul. 2013 09:55 <-- editieren / zitieren --> Unities abgeben:
Moin Henry, ja ich bin auch so ein Fan von "wechvoncatia", aber manchmal ist das nicht so einfach Ich bin vor einiger Zeit schon mal auf dein Tool gestoßen. Das Problem hier ist: Ich hab das ganze schon versucht mathematisch zu lösen, d.h. bin über Transformationsmatrizen gegangen, aber leider liefert Catia - obwohl eine Verschiebung der Achsensysteme da ist - hier oft auch nur falsche Matrizen zurück, die nicht nutzbar sind. GetComponents lieferter mir schon so oft keine Verschiebung zurück, obwohl die Achsensysteme verschoben waren. Das hat mich stutzig gemacht und mein Ausweg war dann über "Messen" zu gehen und das so zu machen, wie in meinem Eingangspost. Aber das klappt nun auch nicht Was bleibt noch? Mein Ziel ist folgendes: Ich möchte - hört sich einfach an ja - einfach die Snap-Funktionalität per Api nachbauen. D.h. ich möchte per Api ein Part mit seinem Hauptachsensystem auf ein anderes Part snappen können (beide Achsensysteme liegen übereinander). Desweiteren möchte ich die Methode überladen, dass ich auch ein Part auf ein selbstdefiniertes Achsensystem snappen kann. Dafür benötige ich natürlich alle Winkel und Abstände von beiden Achsensystemen. Teilweise funktioniert der Algorithmus bereits (in C# geschrieben), aber manchmal, z. B. über Produktebenen hinweg, macht er einfach nur Probleme, weil Catia die Transformationmatrizzen nicht korrekt liefert! [Diese Nachricht wurde von MarcDe am 16. Jul. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MarcDe Mitglied
Beiträge: 137 Registriert: 11.10.2006 CATIA R18 SP2, BN 18, HF 162 Win 7 64Bit
|
erstellt am: 16. Jul. 2013 11:06 <-- editieren / zitieren --> Unities abgeben:
Moin nochmal, ich glaube das mit den Transformationsmatrizzen war ein Irrtum. Mir ist es entfallen, dass GetComponents jeweils nur die Positionsmatrix zu seinem nächsthöheren ProductDocument liefert. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|