Autor
|
Thema: Part in Baugruppe deckungsgleich auf anderem Part positionieren (2457 mal gelesen)
|
Florian Held Mitglied Teamleiter CAD-Solutions
Beiträge: 81 Registriert: 07.09.2006 Catia V5 R19 WinXP 64Bit unter VBA
|
erstellt am: 19. Aug. 2011 09:44 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich weis ich habe hier so etwas in der Art schon gelesen aber meine Suchen führen zu keinem Ergebnis. Ich habe eine Baugruppe wie diese im Bild und ich möchte einfach das Part2 im Raum postionieren, wo Part1 liegt. Ohne Bedingungen oder Verknüpfung etc. einfach die "Koordinaten/Ausrichtungen von Part1 für Part2" übernehmen. Quasi in etwa so etwas: oPart2.LageImRaum = oPart1.LageImRaum Das müsste doch gehen, oder? Danke für alle Antworten!
------------------ MfG, Florian Held 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: 19. Aug. 2011 09:51 <-- editieren / zitieren --> Unities abgeben: Nur für Florian Held
Hallo Florian, muss das denn per Makro geschehen? Einfachste Methode wäre eigentlich auf jedes ein Fix zu setzen und jedes Fix auf den Nullpunkt zu definieren. Evtl. geht das auch per Makro. Deine Anstrebung die LAgeposition zu finden, geht allerdings in die Falsche Richtung, da die einzelnen Parts keine Informationen von den Teileverwendungen haben. Daher auch nicht die Lageposition innerhalb eines Produktes. Wenn, dann könnte der Wert nur über das Produkt selbst zufinden sein. ------------------ 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 |
Florian Held Mitglied Teamleiter CAD-Solutions
Beiträge: 81 Registriert: 07.09.2006
|
erstellt am: 19. Aug. 2011 14:24 <-- editieren / zitieren --> Unities abgeben:
Hallo, danke für die Infos. 1. per Makro nicht unbedingt. Habe das Szenario im Rahmen von Datenaufbereitungen nur öfters und wollte mir Arbeit sparen. 2. Wenn ich dich richtig verstehe meinst du auf jedes ein Fix zu setzen und anschließend das Fix zu definieren? Diese Variante wäre natürlich auch möglich nur wie kann ich dann die Definition des Fix vom einen Part auf die definition des Fix des anderen Parts zu ändern. 3. Klar, die Position des Exemplar des Parts bekomme ich nur über das gemeinsamme Product. Vielleicht etwas schlecht von mir formuliert, mein Imaginärcode wäre also eigentlich eher wie folgt: oProduct.oPart2.LageImRaum = oProduct.oPart1.LageImRaum oder wie vorgeschlagen über das Fix vom oPart2 und dem fix von oPart1 im gemeinsamen Produkt oProduct wenn ich dich richtig verstanden habe und das so ginge? Habe auch schon mit dem Gedanken gespielt per Makro das Part mit der Zielpostion zu fixieren, die 3 Achsen beider Parts kongruent zu setzen, eine aktualisierung auszulsen und danach diese temporär erzeugten Bedingungen wieder zu löschen. Allerdings sind dann manchmal die Achsen teilweise nicht konkruent sondern genau invers (Z-Achse 1 180deg zu Z-Achse 2 etc.) ------------------ MfG, Florian Held 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: 19. Aug. 2011 14:34 <-- editieren / zitieren --> Unities abgeben: Nur für Florian Held
Die Frage ist doch, von welchem Punkt aus du die Teile ineinander lagern möchtest. Wenn du vom Nullpunkt des Parts ausgehst, dann brauchst du nur das Fix auf 0,0,0 zu setzen. Das bedeutet folgende Reihenfolge... > Part einfügen > 2. Part einfügen > Fix auf das erste Part > rechte Maustaste auf das Fix > Definition > Koordinaten auf 0 setzen > Fix2 auf das zeweite Part > rechte Maustaste auf das Fix2 > Definition > Koordinaten auf 0 setzen Die Makroaufzeichnung hat folgendes ergeben beim setzen eines Fixes... Code:
Sub CATMain()Dim productDocument1 As ProductDocument Set productDocument1 = CATIA.ActiveDocument Dim product1 As Product Set product1 = productDocument1.Product Dim constraints1 As Constraints Set constraints1 = product1.Connections("CATIAConstraints") Dim reference1 As Reference Set reference1 = product1.CreateReferenceFromName("Product1/Teil1.1/!Product1/Teil1.1/") Dim constraint1 As Constraint Set constraint1 = constraints1.AddMonoEltCst(catCstTypeReference, reference1) Dim dimension1 As Dimension Set dimension1 = constraint1.Dimension dimension1.Value = 0# Dim parameters1 As Parameters Set parameters1 = product1.Parameters Dim dimension2 As Dimension Set dimension2 = parameters1.Item("Product1\Bedingungen\Fixieren.1\Fixieren.1\pos_y") dimension2.Value = 0# Dim parameters2 As Parameters Set parameters2 = product1.Parameters Dim dimension3 As Dimension Set dimension3 = parameters2.Item("Product1\Bedingungen\Fixieren.1\Fixieren.1\pos_z") dimension3.Value = 0# constraint1.ReferenceType = catCstRefTypeFixInSpace End Sub
Daher sollte es ohne Probleme möglich sein, das auch per Makro zu verwirkliche. Allerdings geht es eben auch manuell sehr schnell... ------------------ 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 |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 19. Aug. 2011 14:41 <-- editieren / zitieren --> Unities abgeben: Nur für Florian Held
Servus Eigentlich sollte dein Vorhaben mit den Befehlen GetPositon und SetPosition gehen: (ungetestet) Code:
Sub CATMain() dim Part1 as Product dim Part2 as ProductSet Part1 = CATIA.ActiveDocument.Product.Products.item(1) Set Part2 = CATIA.ActiveDocument.Product.Products.item(2) Part1.Position.GetComponents oAxisComponentsArray Part2.Position.SetComponents oAxisComponentsArray End Sub
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tberger Mitglied Application Manager CATIA V5 / V6
Beiträge: 1385 Registriert: 13.01.2007 WIN 7 64bit V5R21SP3HF49 3DX/V6 R2016x
|
erstellt am: 19. Aug. 2011 14:44 <-- editieren / zitieren --> Unities abgeben: Nur für Florian Held
Damit sollte es gehen: Sub CATMain() Dim OPENED_PRODUCT As Document Set OPENED_PRODUCT = CATIA.ActiveDocument Dim Selection As Object Set Selection = OPENED_PRODUCT.Selection Selection.Clear Dim status As String Dim InputObjectType(0) Dim selectedElement1 As Product Dim selectedElement2 As Product InputObjectType(0) = "Product" status = Selection.SelectElement2(InputObjectType, "Bitte das erste Teil anklicken, das die Position vorgibt . . .", False) If (status <> "Normal") Then Exit Sub Else Set selectedElement1 = Selection.Item(1).Value Selection.Clear End If status = Selection.SelectElement2(InputObjectType, "Bitte das zweite Teil anklicken, das die Position des 1.Teils einnehmen soll . . .", False) If (status <> "Normal") Then Exit Sub Else Set selectedElement2 = Selection.Item(1).Value Selection.Clear End If Dim Matrix1(11) Dim PositionObject1 As Position Set PositionObject1 = selectedElement1.Position PositionObject1.GetComponents Matrix1 'restricted in vba! Dim PositionObject2 As Position Set PositionObject2 = selectedElement2.Position PositionObject2.SetComponents Matrix1 MsgBox "Fertig" End Sub Voraussetzung: deine zu bewegende Komponente hat keine Bedingungen. Das Script läuft nur als CATScript, nicht im vba (GetComponents ist restricted). ------------------ Grüße aus dem Thurgau Thomas +++++++++++++++++++++++++++++++++ CATIA - eine Laune der Natur ...
[Diese Nachricht wurde von tberger am 19. Aug. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Florian Held Mitglied Teamleiter CAD-Solutions
Beiträge: 81 Registriert: 07.09.2006
|
erstellt am: 24. Aug. 2011 10:39 <-- editieren / zitieren --> Unities abgeben:
Hallo, erstmal Danke an an alle, besonders an bgrittmann (das war was ich schon mal gelesen hatte aber nicht mehr finden konnte) und nochmals besonderen Dank an tberger für das lauffähige Beispiel. Es funktioniert genau so wie ich dass wollte und was ich gesucht hatte. Durch das restricted in VBA jedoch eher suboptimal, möchte eher ungern aus meinem VBA heraus ein CATScript anstoßen nur um die Restriktion zu umgehen. Das Beispiel von RSchulz mit dem Fix funktioniert für mich dahingehend nicht, da das Teil nicht auf 0,0,0 gesetzt werden darf sondern auf die Koordinaten (x,Y,Z) UND die Ausrichtung (RotX, RotY, RotZ) des anderen Parts. Aber folgendes müsste dann funktionieren: Wenn ich das Zielpart Fixiere habe ich ein oTargetFix mit den 6 Werten. Nun Fixiere ich das zu positionierende Part als oSourceFix und kann die 6 Werte von diesem Fix gleich denen des oTargetFix setzen. Das oTargetFix aktualisieren und beide Fixes wieder löschen - Fertig (zumindest in der Theorie). Werde dies im Laufe der Woche mal umsetzen und ausprobieren und mich wieder melden (mit dem Skript). Außer jemand hat derweil noch eine bessere Idee oder weis dass dies so nicht funktioniert wie ich mir dies denke? ------------------ MfG, Florian Held 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: 24. Aug. 2011 17:24 <-- editieren / zitieren --> Unities abgeben: Nur für Florian Held
Versuch mal das Tool aus dem beitrag http://ww3.cad.de/foren/ubb/Forum137/HTML/004670.shtml wenn das tut, was Du willst, wenn Du manuell die Zahlen überträgst, dann baue ich demnächst noch einen Button ein um die gleich zu setzen. ------------------ 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 |
Florian Held Mitglied Teamleiter CAD-Solutions
Beiträge: 81 Registriert: 07.09.2006
|
erstellt am: 29. Aug. 2011 18:28 <-- editieren / zitieren --> Unities abgeben:
Hallo, also hat soweit geklappt wie ich mir das gedacht habe. Anbei der Code in Rohform (z.B. Beide Parts müssen in gleichem Product und nicht in Unterbaugruppe sein ist nicht abgefangen etc.) Code:
Public Sub Assembly_PositionierePartByPart() 'Umgebendes Product Dim oProduct As Product Dim oProductConstraints As Constraints Set oProduct = CATIA.ActiveDocument.Product Set oProductConstraints = oProduct.Connections("CATIAConstraints") 'Falls nicht wie in meinem Fall bereits zuvor überprüft: Beide Parts müssen in diesem Product sein kein Unterproduct! 'Zielpostition Dim oRefZielPos As Reference Dim oFixZielPos As Constraint Dim sZPath As String Set oRefZielPos = oProduct.CreateReferenceFromName("PosPartByPart/Zielposition/!PosPartByPart/Zielposition/") Set oFixZielPos = oProductConstraints.AddMonoEltCst(catCstTypeReference, oRefZielPos) oFixZielPos.ReferenceType = catCstRefTypeFixInSpace sZPath = "PosPartByPart\Bedingungen\" & oFixZielPos.Name & "\" & oFixZielPos.Name 'Startpostion Dim oRefSourcePos As Reference Dim oFixSourcePos As Constraint Dim sSPath As String Set oRefSourcePos = oProduct.CreateReferenceFromName("PosPartByPart/Startposition/!PosPartByPart/Startposition/") Set oFixSourcePos = oProductConstraints.AddMonoEltCst(catCstTypeReference, oRefSourcePos) sSPath = "PosPartByPart\Bedingungen\" & oFixSourcePos.Name & "\" & oFixSourcePos.Name 'Startpostition: Koordinaten/Ausrichtung von Fixierung des Zielparts übernehmen oProduct.Parameters.Item(sSPath & "\pos_x").Value = oProduct.Parameters.Item(sZPath & "\pos_x").Value oProduct.Parameters.Item(sSPath & "\pos_rotx").Value = oProduct.Parameters.Item(sZPath & "\pos_rotx").Value oProduct.Parameters.Item(sSPath & "\pos_y").Value = oProduct.Parameters.Item(sZPath & "\pos_y").Value oProduct.Parameters.Item(sSPath & "\pos_roty").Value = oProduct.Parameters.Item(sZPath & "\pos_roty").Value oProduct.Parameters.Item(sSPath & "\pos_z").Value = oProduct.Parameters.Item(sZPath & "\pos_z").Value oProduct.Parameters.Item(sSPath & "\pos_rotz").Value = oProduct.Parameters.Item(sZPath & "\pos_rotz").Value 'Fertig, Zweites Fix aktualisieren ' ' wie ??? ' 'Aufräumen Dim oSelection As Selection Set oSelection = CATIA.ActiveDocument.Selection oSelection.Clear
oSelection.Add oProduct.Connections("CATIAConstraints").Item(oFixSourcePos.Name) oSelection.Add oProduct.Connections("CATIAConstraints").Item(oFixZielPos.Name) oSelection.Delete End Sub
Weis vielleicht noch jemand wie ich meinem zweiten Fix oFixSourcePos nach dessen Erstellung sagen kann dass es sich bitte aktualisieren möchte? ------------------ MfG, Florian Held 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: 29. Aug. 2011 19:26 <-- editieren / zitieren --> Unities abgeben: Nur für Florian Held
Servus Du könntest doch auch einfach in Thomas Makro die Variablen PositionObject1 und PositionObject2 als Object dimensionieren. Dann sollte das Makro auch in VBA durchlaufen. (siehe auch hier) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Florian Held Mitglied Teamleiter CAD-Solutions
Beiträge: 81 Registriert: 07.09.2006
|
erstellt am: 30. Aug. 2011 09:14 <-- editieren / zitieren --> Unities abgeben:
|