| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: abgeleiteten Komponente - Basisteil per VBA ersetzen (750 / mal gelesen)
|
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 13. Apr. 2021 11:54 <-- editieren / zitieren --> Unities abgeben:
Ich habe mal wieder ein VBA-Problem. Ich möchte per VBA in einer abgeleiteten Komponente das Basisteil ersetzen. Das neue Basisteil ist eine Kopie des ursprünglichen Basisteils, so dass der Austausch manuell direkt im Inventor kein Problem ist. Nun soll das aber per VBA passieren. Ich habe es analog dem Ersetzen von Einzelteilen in einer Baugruppe mit Call oOcc.Replace(sPfadNameNew, True) der Occurrences probiert, aber da passiert nichts. Hintergrund ist ein Programm in dem Einzelteile und Unterbaugruppen einer Baugruppe ersetzt werden sollen. Das funktioniert bereits. Nun sollen auch die Basiskomponenten von eventuell abgeleiteten Einzelteilen mit ersetzt werden. Hat jemand eine Idee? . Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 13. Apr. 2021 13:37 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Hallo Frank, tauschen geht nur wenn die neue Basiskomponente eien Kopie der ursprünglichen Basiskomponente ist. Beispiel von hier schnell umgestrickt. Code:
Public Sub DeriveComponentReplace() Dim oApp As Inventor.Application: Set oApp = ThisApplication If oApp.ActiveEditObject.DocumentType <> DocumentTypeEnum.kPartDocumentObject Then Exit Sub Dim oDoc As PartDocument: Set oDoc = ThisApplication.ActiveEditDocument Dim oDef As PartComponentDefinition: Set oDef = oDoc.ComponentDefinition Dim oSubs1 As DerivedPartComponents: Set oSubs1 = oDef.ReferenceComponents.DerivedPartComponents If oSubs1.Count = 0 Then MsgBox "Keine abgeleiteten Komponenten enthalten" Exit Sub End If Dim oRefFile As FileDescriptor Set oRefFile = oSubs1.Item(1).ReferencedDocumentDescriptor.ReferencedFileDescriptor Dim oFileDialog As FileDialog Call oApp.CreateFileDialog(oFileDialog) Call oFileDialog.ShowOpen Dim FilePath As String FilePath = oFileDialog.FileName If FilePath = "" Then Exit Sub End If On Error Resume Next oRefFile.ReplaceReference (FilePath) If err.Number <> 0 Then MsgBox "Das ausgewählte Teil ist keine Kopie des Ursprungsteils. Der InternalName stimmt nicht überein." Exit Sub End If Call oDoc.Update2 End Sub
Bei einer nicht Kopie Basiskomponente musst du eine neue AK einfügen und die ursprüngliche löschen.
Etwa so: Code:
Sub TauscheBasisTeil() Dim oApp As Inventor.Application: Set oApp = ThisApplication Dim oPrtDoc As Inventor.PartDocument: Set oPrtDoc = oApp.ActiveDocument Dim oDerivedPartDef As DerivedPartUniformScaleDef Set oDerivedPartDef = oPrtDoc.ComponentDefinition.ReferenceComponents.DerivedPartComponents.CreateUniformScaleDef("C:\OrdnerNeuesTeil\NeuesTeil.ipt") oDerivedPartDef.ScaleFactor = 1 Call oPrtDoc.ComponentDefinition.ReferenceComponents.DerivedPartComponents.Add(oDerivedPartDef) Call oPrtDoc.ComponentDefinition.ReferenceComponents.DerivedPartComponents.Item(1).Delete End Sub
Grüße
EIBe 3D Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 13. Apr. 2021 13:57 <-- editieren / zitieren --> Unities abgeben:
Hallo ElBe 3D, DerivedPartComponents und oRefFile.ReplaceReference (FilePath) das scheinen mir die fehlenden Stichwörter gewesen zu sein. Das werde ich gleich mal ausprobieren. Danke für den Hinweis. .
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 15. Apr. 2021 14:49 <-- editieren / zitieren --> Unities abgeben:
Hallo, noch eine Ergänzungsfrage. Bevor ich das Basisteil ersetze möchte ich eine Kopie erstellen. Irgendwie mache ich einen Fehler bei der Bestimmung des Namens des Basisteils. oRefDoc ist meine abgeleitete Komponente. Nun will ich mir den Namen des Basisteils anzeigen: MsgBox (oRefDoc.ComponentDefinition.ReferenceComponents.DerivedPartComponents .Item(1).FullFileName) Das ergibt aber eine Fehlermeldung: "Run-time error '438': Object doesn't support this property or method" Auch der folgende Befehl ergibt diese Fehlermeldung: Call oRefDoc.ComponentDefinition.ReferenceComponents.DerivedPartComponents.Item(1).Open Was mache ich falsch? Ich programmiere unter IV2013. Das Programm soll für alle Versionen bis IV2021 funktionieren. . [Diese Nachricht wurde von Frankx am 15. Apr. 2021 editiert.]
[Diese Nachricht wurde von Frankx am 15. Apr. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 15. Apr. 2021 16:36 <-- editieren / zitieren --> Unities abgeben:
|
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 15. Apr. 2021 16:50 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Hallo Frank, Zitat: ...Was mache ich falsch?...
Bitte nicht falsch vertehen: Du nutzt die Möglichkeiten des Editors nicht. Lasse dir das Lokal Fenster im VBA Editor anzeigen. Dort kannst du dann alle Objekte untersuchen z.B. wenn die Ausführung bei der Fehlerzeile stehen bleibt. Dann würdest du sehen, dass das Objekt die Eigenschaft auf welche du zugreifen möchtest schlicht nicht besitzt. Richtig lautet der Zugriff auf den FullFileName eines Ursprungsteils einer AK: Code:
oRefDoc.ComponentDefinition.ReferenceComponents.DerivedPartComponents.Item(1).ReferencedDocumentDescriptor.FullDocumentName
Auch deine Methode zum öffnen existiert nicht. Code:
Call ThisApplication.Documents.Open("Hier FullDocumentName As String")
Willst du weiter relativ frustfrei programmieren ist es sinnvoll sich mit den BasisFunktionen des VBA Editors und der API-Hilfe von Inventor auseinander zu setzen. Viel Erfolg EIBe 3D Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 15. Apr. 2021 17:25 <-- editieren / zitieren --> Unities abgeben:
Mir ist bewusst, dass es noch einige, von mir bisher noch ungenutzte, Möglichkeiten im Editor gibt. Ich stehe erst ziemlich am Anfang und ich bin diesbezüglich kompletter Autodidakt. Aber es ist gut zu wissen, dass einem hier geholfen wird. Danke für die Hinweise. .
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 15. Apr. 2021 22:00 <-- editieren / zitieren --> Unities abgeben:
Ich habe noch eine Frage zum obigen Beispiel: Code: If oSubs1.Count = 0 Then MsgBox "Keine abgeleiteten Komponenten enthalten" Exit Sub End If
Wenn die abgeleitete Komponente ein Basisteil (ipt) hat, dann funktioniert das. Wenn aber die Basis eine iam ist dann ist oSubs1.Count immer 0. Wie kann ich auch solche abgeleiteten Teile berücksichtigen? . Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 16. Apr. 2021 07:52 <-- editieren / zitieren --> Unities abgeben: Nur für Frankx
Hallo Frank, nach oben verlinkten Beispiel ergänzt. Code:
Public Sub DeriveComponentReplace() Dim oApp As Inventor.Application: Set oApp = ThisApplication If oApp.ActiveEditObject.DocumentType <> DocumentTypeEnum.kPartDocumentObject Then Exit Sub Dim oDoc As PartDocument: Set oDoc = ThisApplication.ActiveEditDocument Dim oDef As PartComponentDefinition: Set oDef = oDoc.ComponentDefinition Dim oSubs As Inventor.DerivedAssemblyComponents: Set oSubs = oDef.ReferenceComponents.DerivedAssemblyComponents 'abgeleitete Baugruppen Dim oSubs1 As DerivedPartComponents: Set oSubs1 = oDef.ReferenceComponents.DerivedPartComponents If oSubs.Count = 0 Then 'Hinzu für AK BG If oSubs1.Count = 0 Then MsgBox "Keine abgeleiteten Komponenten enthalten" Exit Sub End If End If Dim oRefFile As FileDescriptor If oSubs.Count > 0 Then 'Hinzu für AK BG Set oRefFile = oSubs.Item(1).ReferencedDocumentDescriptor.ReferencedFileDescriptor Else Set oRefFile = oSubs1.Item(1).ReferencedDocumentDescriptor.ReferencedFileDescriptor End If Dim oFileDialog As FileDialog Call oApp.CreateFileDialog(oFileDialog) Call oFileDialog.ShowOpen Dim FilePath As String FilePath = oFileDialog.FileName If FilePath = "" Then Exit Sub End If On Error Resume Next oRefFile.ReplaceReference (FilePath) If err.Number <> 0 Then MsgBox "Das ausgewählte Teil ist keine Kopie des Ursprungsteils. Der InternalName stimmt nicht überein." Exit Sub End If Call oDoc.Update2 End Sub
Grüße
EIBe 3D Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frankx Mitglied
Beiträge: 53 Registriert: 08.01.2019 Inventor Professional
|
erstellt am: 16. Apr. 2021 08:49 <-- editieren / zitieren --> Unities abgeben:
DerivedAssemblyComponents Na da hätte ich auch selbst drauf kommen können/müssen. Ich hatte irgendwie schlimmeres befürchtet. Ich glaube, ich habe jetzt alles beisammen. Den Rest habe ich schon für mich passend zurecht gestrickt und es funktioniert gut. Danke, auch für den Hinweis zum Locals Window. Ich hatte das zwar schon mal irgendwo gesehen, aber den Sinn noch nicht richtig verstanden. Man lernt eben immer wieder dazu. Schönes WE. .
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |