Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Inventor VBA
  abgeleiteten Komponente - Basisteil per VBA ersetzen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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



Sehen Sie sich das Profil von Frankx an!   Senden Sie eine Private Message an Frankx  Schreiben Sie einen Gästebucheintrag für Frankx

Beiträge: 53
Registriert: 08.01.2019

Inventor Professional

erstellt am: 13. Apr. 2021 11:54    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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)


Sehen Sie sich das Profil von EIBe 3D an!   Senden Sie eine Private Message an EIBe 3D  Schreiben Sie einen Gästebucheintrag für EIBe 3D

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Frankx 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Frankx an!   Senden Sie eine Private Message an Frankx  Schreiben Sie einen Gästebucheintrag für Frankx

Beiträge: 53
Registriert: 08.01.2019

Inventor Professional

erstellt am: 13. Apr. 2021 13:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von Frankx an!   Senden Sie eine Private Message an Frankx  Schreiben Sie einen Gästebucheintrag für Frankx

Beiträge: 53
Registriert: 08.01.2019

Inventor Professional

erstellt am: 15. Apr. 2021 14:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von Frankx an!   Senden Sie eine Private Message an Frankx  Schreiben Sie einen Gästebucheintrag für Frankx

Beiträge: 53
Registriert: 08.01.2019

Inventor Professional

erstellt am: 15. Apr. 2021 16:36    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

So, wie es scheint, habe ich den Bug gefunden.

Die Variable oRefDoc darf nicht nur als Document definiert werden, sondern muss Typ PartDocument sein.

.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

EIBe 3D
Mitglied
Dipl. - Ing. (FH)


Sehen Sie sich das Profil von EIBe 3D an!   Senden Sie eine Private Message an EIBe 3D  Schreiben Sie einen Gästebucheintrag für EIBe 3D

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Frankx 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Frankx an!   Senden Sie eine Private Message an Frankx  Schreiben Sie einen Gästebucheintrag für Frankx

Beiträge: 53
Registriert: 08.01.2019

Inventor Professional

erstellt am: 15. Apr. 2021 17:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


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



Sehen Sie sich das Profil von Frankx an!   Senden Sie eine Private Message an Frankx  Schreiben Sie einen Gästebucheintrag für Frankx

Beiträge: 53
Registriert: 08.01.2019

Inventor Professional

erstellt am: 15. Apr. 2021 22:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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)


Sehen Sie sich das Profil von EIBe 3D an!   Senden Sie eine Private Message an EIBe 3D  Schreiben Sie einen Gästebucheintrag für EIBe 3D

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Frankx 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von Frankx an!   Senden Sie eine Private Message an Frankx  Schreiben Sie einen Gästebucheintrag für Frankx

Beiträge: 53
Registriert: 08.01.2019

Inventor Professional

erstellt am: 16. Apr. 2021 08:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz