| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Mit Abhängigkeiten kopieren (2432 / mal gelesen)
|
KAME-WJ Mitglied Maschinenbau-Ingenieur
Beiträge: 22 Registriert: 22.09.2014 Intel Core i9-9900KF, 8-Core @5GHz 16 GB DDR4-2666 MHz NVIDIA Quadro P1000, 4GB GDDR5 ASUS Prime Z390-P WIN10 x64 auf NVME SSD INV2019
|
erstellt am: 30. Sep. 2016 15:39 <-- editieren / zitieren --> Unities abgeben:
Hallo Programmier-Gemeinde, ich arbeite gerade an einem Macro welches ein(e) markierte(s) Bauteil/Baugruppe erneut in die Baugruppe einfügt und diese mit den selben Abhängigkeiten versieht. (Das neu eingefügte Bauteil/Baugruppe befindet sich somit am selben Platz wie das zuvor markierte und die selben Abhängigkeiten aufweist). Nun bin ich aber schon eine Zeit lang am tüfteln wie ich dies realisieren könnte, da ich bis jetzt noch nicht herausgefunden habe, wie ich die in der Abhängigkeit referenzierte Fläche/Ebene/Punkt (genannt EntityOne/EntityTwo) des "alten" Bauteils/Baugruppe mit dem der kopierten ersetzen kann. Ich bin soweit, dass das markierte Bauteil/Baugruppe in die Baugruppe neu eingefügt wird, und dann sollen eben noch die selben Abhängigkeiten wie bei der markierten vergeben werden. Hintergedanke ist dabei, dass man bei unregelmäßig angeordnetetn Bauteilen/Baugruppen nur mehr den Wert der gewünschten Abhängigkeit ändern muss. Weiß jemand ob es so etwas in der richtung schon gibt oder hat jemand eine Idee wie man das programmieren kann? Code:
Public Sub CopyInOrigin() Dim oDoc As Document Set oDoc = ThisApplication.ActiveDocument Dim oSelectSet As SelectSet Set oSelectSet = oDoc.SelectSet
If oDoc.DocumentType <> kAssemblyDocumentObject Then MsgBox "Dieses Makro funktioniert nur in einer Baugruppe!", vbCritical End End If If oSelectSet.Count = 0 Then MsgBox "Keine Komponenten ausgewählt", vbExclamation + vbOKOnly + vbMsgBoxSetForeground, "Achtung" Exit Sub End If Dim oItem As Variant Set oSelectSet = ThisApplication.ActiveDocument.SelectSet Dim oAsmCompDef As AssemblyComponentDefinition Set oAsmCompDef = ThisApplication.ActiveDocument.ComponentDefinition Dim oTG As TransientGeometry Set oTG = ThisApplication.TransientGeometry Dim oMatrix As Matrix Set oMatrix = oTG.CreateMatrix Dim FullDocName As String Dim oOcc As ComponentOccurrence For Each oItem In oSelectSet FullDocName = oItem.ReferencedDocumentDescriptor.FullDocumentName Set oOcc = oAsmCompDef.Occurrences.Add(FullDocName, oMatrix) Dim oEntity As Object Dim oConstraint As Variant For Each oConstraint In oItem.Constraints Dim oInsert As InsertConstraint Dim oEntityOne As Object Set oEntityOne = oConstraint.EntityOne Dim oEntityTwo As Object Set oEntityTwo = oConstraint.EntityTwo Select Case oConstraint.Type Case kAngleConstraintObject ' ... Case kFlushConstraintObject Call oAssConstraints.AddFlushConstraint(oEntity, oEntityTwo, oConstraint.Offset.Expression) Case kInsertConstraintObject ' .... Case ksymentryconstraintobject ' .... End Select ' ...hier sollte es dann iwie weitergehen ;) Next Next End Sub
Also Leute, dann lasst uns mal Brainstormen Greets, Joscha Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 720 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 01. Aug. 2018 08:35 <-- editieren / zitieren --> Unities abgeben: Nur für KAME-WJ
ACHTUNG! Sie antworten auf einen Beitrag der älter als 1 Jahr ist! Hi Joscha,
gibts zu diesem Thema was neues? Bist Du zwischenzeitlich weiter gekommen? Ein derartiges Makro hab ich mir auch schon eine Weile gewünscht / vorgenommen... ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KAME-WJ Mitglied Maschinenbau-Ingenieur
Beiträge: 22 Registriert: 22.09.2014 Intel Core i9-9900KF, 8-Core @5GHz 16 GB DDR4-2666 MHz NVIDIA Quadro P1000, 4GB GDDR5 ASUS Prime Z390-P WIN10 x64 auf NVME SSD INV2019
|
erstellt am: 01. Aug. 2018 08:42 <-- editieren / zitieren --> Unities abgeben:
|
Tacker Mitglied TZ, Tech. MB, Softwareentwickler
Beiträge: 175 Registriert: 23.09.2010 IV 2017 Pro i7-7700K 4x4.2GHz 32GB DDR4-2400 GTX 1060 6GB DDR5
|
erstellt am: 01. Aug. 2018 16:56 <-- editieren / zitieren --> Unities abgeben: Nur für KAME-WJ
Moin Abhängigkeiten mit dem Makro erstellen ist relativ einfach. Die Schwierigkeit ist eher die benötigten Geometrien dafür zu finden. Bei meinen Baugruppenkonfiguratoren artet das ein bisschen aus. Hab in VB.NET ca 1200 Zeilen nur um Geometrien zu finden. Wenn sicher ist, dass es die absolut identische Komponente ist, kann man nach dem Transientkey zur Identifikation gehen, das wäre hier wahrscheinlich der Fall. Dann musst nur durch den entsprechenden Container (Edge, Face...) iterieren und deinen Transientkey wiederfinden, schon hast deine Geometrien und kannst die Abhängigkeit erstellen. → Achtung, Geometrien befinden sich immer im Bauteil, nicht in der Baugruppe Sollte das nicht der Fall sein, dann wirds spaßiger. Dann musst nach Geometrischen Eigenschaften suchen und im Dümmsten Fall sogar abwägen was die richtige Geometrie ist. Deswegen ist das auch etwas umfangreich bei mir. Gruß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 720 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 13. Aug. 2018 10:00 <-- editieren / zitieren --> Unities abgeben: Nur für KAME-WJ
Jetzt stehe ich wohl auch vor dem Problem, die richtige Geometrie zu finden. Gut, dass Tacker schon alle derartigen Probleme gelöst hat Nun etwas ernsthafter. Ich versuche es zunächst textlich zu beschreiben (ohne Code, der vmtl. mehr verwirrt als hilft) anhand dieser beispielhaften Struktur: Assy.iam - UnterBgr.iam:1 -- T1.ipt:1 -- T1.ipt:2 Makro läuft in einer Baugruppe Assy.iam. Diese enthält eine Unterbaugruppe, in der sich zwei Instanzen des gleichen Bauteils befinden. Die UnterBgr. ist mit Abhängigkeiten versehen, die sie platzieren und ausrichten. Z.b. ein "Fluchtend1" zw. xy-Ebene von Assy.iam und der xy-Ebene von T1.ipt:1. Ich möchte also die UnterBgr.iam nochmals in die Assy.iam einfügen (klappt) und die Abhängigkeit "Fluchtend2" erstellen, analog zu "Fluchtend1". Da sehe ich noch keinen Weg, um das richtige Element zu finden. Ich habe die Abhängigkeit "Fluchtend1". Diese liefert mir die Properties .AffectedOccurrenceOne / .AffectedOccurrenceTwo und .EntityOne / .EntityTwo. Ich weiß auch, ob ich ...One oder ...Two ersetzen will. Die Entity wäre im Bsp. ein WorkPlaneProxy-Object, ua. mit der Eigenschaft .Nativeobject das die xy-Ebene der T1.ipt liefert. Mein weiterer Ablauf (der für Einzelteile auch funktioniert) ist: von der Entity (Proxy-Object) über das .NativeObject wieder zu einem Proxy-Object zu kommen, jedoch von der neu eingefügten Occurence (oOccNeu.CreateGeometryProxy(...)). Das schlägt aber im Beispiel (eben bei Unterbaugruppen) fehl. Für mein Verständnis deshalb, weil IV nicht wissen kann, von welcher T1-Instanz die xy-Ebene gemeint ist. Liege ich damit schon mal richtig? Ich bräuchte also noch die Information, zu welcher Instanz von T1 die Ebene gehört. Damit könnte ich ein Proxy-Object bezogen auf die UnterBgr. erzeugen und damit wiederum ein Proxy eine Ebene höher. Oder gibt es direkt Zugriff auf das Proxy-Object in der UnterBgr.? Das Vorgehen sollte dann natürlich auch für weiter verschachtelte Unterbaugruppen funktionieren. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KAME-WJ Mitglied Maschinenbau-Ingenieur
Beiträge: 22 Registriert: 22.09.2014 Intel Core i9-9900KF, 8-Core @5GHz 16 GB DDR4-2666 MHz NVIDIA Quadro P1000, 4GB GDDR5 ASUS Prime Z390-P WIN10 x64 auf NVME SSD INV2019
|
erstellt am: 12. Jun. 2019 12:51 <-- editieren / zitieren --> Unities abgeben:
Hallo KraBBy, sry für die (sehr) verspätete Rückmeldung. Bin leider echt kein Profi sondern mehr ein Trial and Error Programmierer Das übersteigt leider meine Kompetenzen. Vielleicht findet sich ja noch jemand der uns helfen kann. Grüße, J ------------------ "ENGINEER" noun. [en-juh-neer] Someone who does precision guesswork based on unreliable data provided by those of questionable knowledge See also wizard, magician Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dg2405 Mitglied Ingenieur MB
Beiträge: 30 Registriert: 16.06.2011 I7-4960X@4.7Ghz Radeon R9-295X2 Samsung 840EVO Win7-64bit SP1 IV2014 SP1
|
erstellt am: 28. Jul. 2019 13:48 <-- editieren / zitieren --> Unities abgeben: Nur für KAME-WJ
So in der Art funktioniert es bei mir. Allerdings nicht wenn die Abhängigkeiten auf Ursprungsebenen gemacht werden. Aber als ersten Ansatz reicht dir das vlt. Manches ist evtl. umständlich gemacht, der Code ist schon ein paar Jahre alt... Wenn ich Zeit hab kann ich den Code überarbeiten und auch nach den Ursprungsebenen schauen. Beim Winkel ist mit dem Referenzvektor auch noch ein kleiner Fehler drin Sub Teile_identisch_einfuegen() 'Auf Bg zugreifen Dim oApp As Inventor.Application Set oApp = ThisApplication Dim oAsmDoc As AssemblyDocument Set oAsmDoc = oApp.ActiveDocument Dim oAsmCompDef As AssemblyComponentDefinition Set oAsmCompDef = oAsmDoc.ComponentDefinition 'Bg greifen Dim oOcc As ComponentOccurrence Set oOcc = ThisApplication.CommandManager.Pick(kAssemblyOccurrenceFilter, "Teile oder Baugruppe auswählen") Dim oDoc As Document Set oDoc = oOcc.Definition.Document 'Anzahl Teile eingeben Anzahl_Teile = InputBox("Bitte Teileanzahl eingeben", "Eingabe", 1) 'Durchschleifen For i = 1 To Anzahl_Teile Call oAsmDoc.SelectSet.Select(oOcc) oApp.CommandManager.ControlDefinitions.Item("AppCopyCmd").Execute oApp.CommandManager.ControlDefinitions.Item("AppPasteCmd").Execute NewOccName = oAsmCompDef.Occurrences(oAsmCompDef.Occurrences.Count).Name NewOccName = Left(oOcc.Name, InStrRev(oOcc.Name, ":")) & Right(NewOccName, Len(NewOccName) - InStrRev(NewOccName, ":")) oAsmCompDef.Occurrences(oAsmCompDef.Occurrences.Count).Name = NewOccName Dim oConstraint As AssemblyConstraint For Each oConstraint In oOcc.Constraints If oConstraint.Suppressed = False Then Dim oNode As BrowserNode Set oNode = Nothing Dim NewNodePath As String NewNodePath = "" Dim oNewOcc As ComponentOccurrence Set oNewOcc = Nothing Dim oNewObjectProxy As Object Set oNewObjectProxy = Nothing If oConstraint.AffectedOccurrenceTwo Is oOcc Then Set oNode = oAsmDoc.BrowserPanes.ActivePane.GetBrowserNodeFromObject(oConstraint.EntityTwo.ContainingOccurrence) n1 = Left(oNode.FullPath, InStr(oNode.FullPath, oOcc.Name) - 1) n2 = Right(oNode.FullPath, Len(oNode.FullPath) - InStr(oNode.FullPath, oOcc.Name) - Len(oOcc.Name) + 1) NewNodePath = n1 & NewOccName & n2 Set oNode = GetBrowserNodeByFullPath(NewNodePath) Set oNewOcc = oNode.NativeObject Call oNewOcc.CreateGeometryProxy(oConstraint.EntityTwo.NativeObject, oNewObjectProxy) If oConstraint.Type = kInsertConstraintObject Then Call oAsmCompDef.Constraints.AddInsertConstraint(oConstraint.EntityOne, oNewObjectProxy, oConstraint.AxesOpposed, oConstraint.Distance.Expression) End If If oConstraint.Type = kFlushConstraintObject Then Call oAsmCompDef.Constraints.AddFlushConstraint(oConstraint.EntityOne, oNewObjectProxy, oConstraint.Offset.Expression) End If If oConstraint.Type = kMateConstraintObject Then Call oAsmCompDef.Constraints.AddMateConstraint(oConstraint.EntityOne, oNewObjectProxy, oConstraint.Offset.Expression, oConstraint.EntityOneInferredType, oConstraint.EntityTwoInferredType) End If If oConstraint.Type = kAngleConstraintObject Then Call oAsmCompDef.Constraints.AddAngleConstraint(oConstraint.EntityOne, oNewObjectProxy, oConstraint.Angle.Expression, oConstraint.SolutionType, oConstraint.ReferenceVectorEntity) End If End If If oConstraint.AffectedOccurrenceOne Is oOcc Then Set oNode = oAsmDoc.BrowserPanes.ActivePane.GetBrowserNodeFromObject(oConstraint.EntityOne.ContainingOccurrence) n1 = Left(oNode.FullPath, InStr(oNode.FullPath, oOcc.Name) - 1) n2 = Right(oNode.FullPath, Len(oNode.FullPath) - InStr(oNode.FullPath, oOcc.Name) - Len(oOcc.Name) + 1) NewNodePath = n1 & NewOccName & n2 Set oNode = GetBrowserNodeByFullPath(NewNodePath) Set oNewOcc = oNode.NativeObject Call oNewOcc.CreateGeometryProxy(oConstraint.EntityOne.NativeObject, oNewObjectProxy) If oConstraint.Type = kInsertConstraintObject Then Call oAsmCompDef.Constraints.AddInsertConstraint(oNewObjectProxy, oConstraint.EntityTwo, oConstraint.AxesOpposed, oConstraint.Distance.Expression) End If If oConstraint.Type = kFlushConstraintObject Then Call oAsmCompDef.Constraints.AddFlushConstraint(oNewObjectProxy, oConstraint.EntityTwo, oConstraint.Offset.Expression) End If If oConstraint.Type = kMateConstraintObject Then Call oAsmCompDef.Constraints.AddMateConstraint(oNewObjectProxy, oConstraint.EntityTwo, oConstraint.Offset.Expression, oConstraint.EntityOneInferredType, oConstraint.EntityTwoInferredType) End If If oConstraint.Type = kAngleConstraintObject Then Call oAsmCompDef.Constraints.AddAngleConstraint(oNewObjectProxy, oConstraint.EntityTwo, oConstraint.Angle.Expression, oConstraint.SolutionType, oConstraint.ReferenceVectorEntity) End If End If End If Next Next End End Sub 'Get the Main BrowserPane for any type of document Public Function GetDocumentBrowserPane(oDoc As Document) As BrowserPane Dim oModelBP As BrowserPane 'Get the Model BrowserPane for Part If (TypeOf oDoc Is PartDocument) Then Set oModelBP = oDoc.BrowserPanes.Item("PmDefault") End If 'Get the Model BrowserPane for Assembly If (TypeOf oDoc Is AssemblyDocument) Then Set oModelBP = oDoc.BrowserPanes.Item("AmBrowserArrangement") End If 'Get the Model BrowserPane for Drawing If (TypeOf oDoc Is DrawingDocument) Then Set oModelBP = oDoc.BrowserPanes.Item("DlHierarchy") End If Set GetDocumentBrowserPane = oModelBP End Function Public Function GetBrowserNodeByFullPathRecursive(oBrowserNode As BrowserNode, FullPath As String) As BrowserNode If (oBrowserNode.FullPath = FullPath) Then Set GetBrowserNodeByFullPathRecursive = oBrowserNode Exit Function End If Dim oBrowserNodeIterator As BrowserNode For Each oBrowserNodeIterator In oBrowserNode.BrowserNodes Dim oResultNode As BrowserNode Set oResultNode = GetBrowserNodeByFullPathRecursive(oBrowserNodeIterator, FullPath) If Not oResultNode Is Nothing Then Set GetBrowserNodeByFullPathRecursive = oResultNode Exit Function End If Next End Function Public Function GetBrowserNodeByFullPath(FullPath As String) As BrowserNode Dim oModelBP As BrowserPane Set oModelBP = GetDocumentBrowserPane(ThisApplication.ActiveDocument) Set GetBrowserNodeByFullPath = GetBrowserNodeByFullPathRecursive(oModelBP.TopNode, FullPath) End Function Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 720 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 05. Aug. 2019 13:26 <-- editieren / zitieren --> Unities abgeben: Nur für KAME-WJ
Hi dg2405, hatte jetzt Gelegenheit mich mit Deinem Code etwas zu beschäftigen. Läuft durch und löst meinen Problemfall mit der Unterbaugruppe. Vielen Dank dafür! Mit Abhängigkeiten auf Ursprungsebenen hatte ich in meinem kleinen Test übrigens keine Probleme. Kannst Du das noch etwas genauer Beschreiben, in welchen Fällen es Probleme gibt? ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|