Modellreferenz einer Zeichnung über VBA-Makro ersetzen

Modellreferenz einer Zeichnung über VBA-Makro ersetzen

Tobias_Hornauer
Observer Observer
634 Views
7 Replies
Message 1 of 8

Modellreferenz einer Zeichnung über VBA-Makro ersetzen

Tobias_Hornauer
Observer
Observer

Hallo zusammen,

 

ich habe folgendes Problem. Ich will mithilfe einer Excel-Liste über VBA im Inventor Baugruppen und damit verknüpfte Zeichnungen erstellen lassen. Dazu habe ich für beides eine Vorlage, um für alle Baugruppen dieselbe Formatierung der Bauteilliste auf der Zeichnung zu haben. Das Makro funktioniert bisher so, dass die Baugruppe erstellt wird und unter einem bestimmten Namen abgespeichert wird, (damit sich an der Vorlagen-Baugruppe nichts ändert). Als nächsten Schritt muss in der Zeichnung die Referenz der Ursprungs-Baugruppe, durch die mit dem neuen Namen ersetzt werden. Im Inventor wäre das ja der Button 'Modellreferenz ersetzen'. In VBA sollte das mit der Methode invDwg.ReferencedFileManager.ReplaceReference umzusetzen sein. Allerdings funktioniert das nicht, da ich scheinbar die dafür benötigte Bibliothek 'Autodesk Inventor 1.0 Type Library' in VBA nicht verweisen kann und auch nicht manuell hinzufügen kann (über die Datei Autodesk.Inventor.Interop.dll)

 

Gibt es eine Möglichkeit ohne dieser Bibliothek die Modellreferenz einer Zeichnung zu ersetzen? Ich fand bis dato leider nur read-only-Methoden, über die man nur auslesen kann welche Referenzen bestehen, jedoch leider nicht ändern/umschreiben kann.

 

Anbei der (etwas gekürzte) VBA-Code:

 

Dim invApp As Inventor.Application
Dim invDwg As Object
Dim oOldReference As Document
Dim oReferencedDocs As DocumentsEnumerator

 

Set invDwg = invApp.ActiveDocument
Set oReferencedDocs = invDwg.AllReferencedDocuments

' Suche nach der alten Modellreferenz und ersetze sie
Set oOldReference = oReferencedDocs.Item(1)

' Ersetze die Referenz von der alten Baugruppe zur neuen Baugruppe
invDwg.ReferencedFileManager.ReplaceReference oOldReference.FullFileName, oPath & "\" & BaugruppenName

 

Danke vorab und Grüße aus der Oberpfalz!

0 Likes
Accepted solutions (1)
635 Views
7 Replies
Replies (7)
Message 2 of 8

AndrewHumiston
Advocate
Advocate
Hoi!

Here is some code to change the ref file. it is ilogic and a little hacked together, i wanted to get you something to try. this will enable you to select the reference you want to change and then select what file you want to replace it with.

if you want to hard code the only file in the drawing, essentially remove the choice of model to replace or always replace with a specific model let me know and we can create a variable for you to do that. here is the code. i used google translate i hope it was accurate. i will follow this post in german.

code:

Dim oActiveDwg As DrawingDocument = ThisApplication.ActiveDocument

oReffileDesc = oActiveDwg.File.ReferencedFileDescriptors
MultiValue.List("ModelRefNames") = Nothing
'set up array for names of assets
Dim oReffileDescCount As Integer = oReffileDesc.Count - 1

ReDim oAssetArray(oReffileDescCount)

Dim i As Integer = 0

For Each Asset In oReffileDesc
oAssetArray(i) = Asset.fullfilename
i = i + 1
Next

Dim n As Integer
n = 1
Dim oUserParams As UserParameters = oActiveDwg.Parameters.UserParameters
If oUserParams.Count = 0 Then
oAssetList = oActiveDwg.Parameters.UserParameters.AddByValue("ModelRefNames", "", kTextUnits)
End If
For Each oUserParam In oUserParams
'check against name and if exisiting exit loop
If oUserParam.Name = "ModelRefNames" Then Exit For
'check for all exisitng paramaters and then if not found create it.
If n = oUserParams.Count Then

oAssetList = oActiveDwg.Parameters.UserParameters.AddByValue("ModelRefNames", "", kTextUnits)
End If
n = n + 1
Next

MultiValue.List("ModelRefNames") = oAssetArray
oReplaceFilePath = InputListBox("Select Model Reference to Replace", oAssetArray)
Dim oModelRefFile As Object
For Each oModelRefFile In oReffileDesc
If oModelRefFile.fullfilename = oReplaceFilePath Then
oReplaceMe = oModelRefFile
Exit For
End If
Next


'set up file dialog
'Dim FileDlg As FileDialog
Call ThisApplication.CreateFileDialog(FileDlg)

FileDlg.Filter = "Replace Model File (*.iam)|*.iam|(*.ipt)|*.ipt|All Files (*.*)|*.*"
FileDlg.FilterIndex = 1
FileDlg.DialogTitle = "Choose Document to insert..."
FileDlg.CancelError = True
FileDlg.MultiSelectEnabled = True
'make dialog appear
On Error Resume Next
FileDlg.ShowOpen

oReplaceWithFilePath = FileDlg.FileName

Call oModelRefFile.ReplaceReference(oReplaceWithFilePath)

i hope this helps!
0 Likes
Message 3 of 8

AndrewHumiston
Advocate
Advocate
Hoi!

Hier ist ein Code zum Ändern der Referenzdatei. Er ist unlogisch und ein wenig zusammengehackt, ich wollte Ihnen etwas zum Ausprobieren geben. Damit können Sie die Referenz auswählen, die Sie ändern möchten, und dann auswählen, durch welche Datei Sie sie ersetzen möchten.

Wenn Sie die einzige Datei in der Zeichnung fest codieren möchten, also im Wesentlichen die Auswahl des zu ersetzenden Modells entfernen oder immer durch ein bestimmtes Modell ersetzen möchten, lassen Sie es mich wissen und wir können eine Variable für Sie erstellen, um das zu tun. Hier ist der Code. Ich habe Google Translate verwendet, ich hoffe, es war richtig. Ich werde diesen Beitrag auf Deutsch verfolgen.

Code:

Dim oActiveDwg As DrawingDocument = ThisApplication.ActiveDocument

oReffileDesc = oActiveDwg.File.ReferencedFileDescriptors
MultiValue.List("ModelRefNames") = Nichts
'Array für Namen von Assets einrichten
Dim oReffileDescCount As Integer = oReffileDesc.Count - 1

ReDim oAssetArray(oReffileDescCount)

Dim i As Integer = 0

Für jedes Asset in oReffileDesc
oAssetArray(i) = Asset.fullfilename
i = i + 1
Weiter

Dim n As Integer
n = 1
Dim oUserParams As UserParameters = oActiveDwg.Parameters.UserParameters
Wenn oUserParams.Count = 0, dann
oAssetList = oActiveDwg.Parameters.UserParameters.AddByValue("ModelRefNames", "", kTextUnits)
End If
Für jeden oUserParam in oUserParams
'Überprüfen Sie den Namen und beenden Sie die Schleife, falls vorhanden.
Wenn oUserParam.Name = "ModelRefNames", dann beenden für
'Überprüfen Sie alle vorhandenen Parameter und erstellen Sie sie, falls sie nicht gefunden werden.
Wenn n = oUserParams.Count, dann

oAssetList = oActiveDwg.Parameters.UserParameters.AddByValue("ModelRefNames", "", kTextUnits)
Ende, wenn
n = n + 1
Weiter

MultiValue.List("ModelRefNames") = oAssetArray
oReplaceFilePath = InputListBox("Modellreferenz zum Ersetzen auswählen", oAssetArray)
Dim oModelRefFile As Object
Für jedes oModelRefFile in oReffileDesc
Wenn oModelRefFile.fullfilename = oReplaceFilePath, dann

oReplaceMe = oModelRefFile
Beenden für
Ende, wenn
Weiter

'Dateidialog einrichten
'Dim FileDlg As FileDialog
Call ThisApplication.CreateFileDialog(FileDlg)

FileDlg.Filter = "Modelldatei ersetzen (*.iam)|*.iam|(*.ipt)|*.ipt|Alle Dateien (*.*)|*.*"
FileDlg.FilterIndex = 1
FileDlg.DialogTitle = "Dokument zum Einfügen auswählen..."
FileDlg.CancelError = True
FileDlg.MultiSelectEnabled = True
'Dialog anzeigen
Bei Fehler Weiter
FileDlg.ShowOpen

oReplaceWithFilePath = FileDlg.FileName

Aufruf oModelRefFile.ReplaceReference(oReplaceWithFilePath)

ich hoffe, das hilft!
0 Likes
Message 4 of 8

Tobias_Hornauer
Observer
Observer

Vielen Dank erstmal für die Hilfe. Ich habe zwar noch nie mit iLogic gearbeitet, aber ich schätze das ist dann nur so möglich. Hatte insgeheim die Hoffnung, dass das auch ohne iLogic nur mit VBA ginge. 😅

Ja die Auswahl brauche ich nicht. Stattdessen soll immer mit einer Datei ersetzt werden, dessen Dateinamen ich bereits in VBA zusammengesetzt habe. Dazu wird man diesen String wohl als Parameter im Inventor speichern müssen, um über iLogic darauf zugreifen zu können, nicht wahr?

Wie kann ich dann die iLogic-Funktion von meinem VBA-Code aus starten? Das soll nämlich im selben Zug funktionieren, wie mein VBA-Makro, bzw. dort eingebettet werden.

 

Danke und Gruß

0 Likes
Message 5 of 8

AndrewHumiston
Advocate
Advocate

Guten Morgen,
Hier ist der Code, der in VBA ausgeführt werden soll. Sie müssen auf die neue Datei zugreifen, die die vorhandene als Zeichenfolge ersetzt.

Bitte sehen Sie sich den angehängten Code an. Außerdem dauert das Update etwas lange, also haben Sie bitte Geduld.

Akzeptiere dies auch als Lösung, wenn es dein Problem gelöst hat. Danke!

'Referenz auf aktives Zeichnungsdokument setzen
Dim oActiveDwg As DrawingDocument
Set oActiveDwg = ThisApplication.ActiveDocument

'Referenz auf Modellreferenzdateideskriptor auf aktiven Deskriptor setzen
Set oModelRefFile = oActiveDwg.File.ReferencedFileDescriptors.Item(1)

'Dateipfad als Zeichenfolge abrufen, durch den Sie das Modell ersetzen möchten
oReplaceWithFilePath = "C:\Work\Designs\R and D\8650-8699\8682\8682-ServerTug.iam"

'Modell ersetzen
Call oModelRefFile.ReplaceReference(oReplaceWithFilePath)

schönes Wochenende.

0 Likes
Message 6 of 8

AndrewHumiston
Advocate
Advocate
Accepted solution

Good morning,
Here is the code to run in VBA, you will need to access the new file that will be replacing the exisiting as a string.

Please see the attached code. Also, its a little slow to do the update so please be patient.

Also, accept this as a solution if it solved your need. thank you!


'set ref to active drawing doc
Dim oActiveDwg As DrawingDocument
Set oActiveDwg = ThisApplication.ActiveDocument

'set ref to model refernece file descriptor to active descriptor
Set oModelRefFile = oActiveDwg.File.ReferencedFileDescriptors.Item(1)

'get file path as string that you wil replace the model with
oReplaceWithFilePath = "C:\Work\Designs\R and D\8650-8699\8682\8682-ServerTug.iam"

'replace the model
Call oModelRefFile.ReplaceReference(oReplaceWithFilePath)

have a great weekend.

0 Likes
Message 7 of 8

Tobias_Hornauer
Observer
Observer

Vielen vielen Dank für die Hilfe! Auf diesem Weg funktioniert das Ersetzen der Modellreferenz einwandfrei.

Schönen Tag und liebe Grüße!

Message 8 of 8

AndrewHumiston
Advocate
Advocate

Ich helfe gern!

Würden Sie dies bitte als Lösung akzeptieren, damit andere diese Informationen leichter finden können? Und wenn Ihnen die Lösung gefällt, wäre das großartig.

Ich wünsche Ihnen eine tolle Woche und melden Sie sich in Zukunft gerne, wenn Sie Fragen haben!

 

I'm Gald to help!

would you please accept this as a solution so others can find this information easier. Also, if you can like the solution that would be awesome.

Have a great week and feel free to reach out in the future if you have any questions!

0 Likes