Inventor iLogic - ReplaceReference()

Inventor iLogic - ReplaceReference()

mrichstein
Enthusiast Enthusiast
1.663Aufrufe
12Antworten
Nachricht 1 von 13

Inventor iLogic - ReplaceReference()

mrichstein
Enthusiast
Enthusiast

Moin zusammen,

nach dem ich im vergangen Jahr damit angefangen habe vieles im Inventor zu automatisieren und ich durch Jürgen Wagner auf seinen Inventor Programmierkurs hingewiesen wurde, habe ich vieles für den Inventor in VBA umgesetzt.

Da wir in unserem Unternehmen im Anlagenbau tätig sind und bei unseren Anlagen auch in Höhen gehen, müssen wir viele Kilometer an Geländer konstruieren. Durch meine Automatisierung (mittels iLogic und VBA) in der Konstruktion haben wir ein Team gebildet was sich zur Aufgabe gemacht hat Konstruktionen zu Standardisieren und automatisieren.

 

Sreenshot_Geländer_002.PNGSreenshot_Geländer_003.PNG

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Das Geländer habe ich mittels iLogic aufgebaut und mit VBA verknüpft. Nicht benötigte Bauteile werden unterdrückt.
Damit nun das neu erzeugte Geländer keinen Bezug mehr zum iLogic Muttergeländer haben soll, habe ich die Routine ReplaceReference() geschaffen.
ReplaceReference korrigiert die Bezeichnung (die Bezeichnung wird vom Konstrukteur 1x manuell angegeben) aller 3D-Modelle einschl. deren 3D-Referenzen.
Leider werden Bauteile bei denen mehre gleiche Bauteile Unterdrückt sind sowie auch die 3D-Referenzen von ReplaceReference überlesen.
Sind aber alle Bauteile einer Baugruppe nicht Unterdrückt werden die Bezeichnungen der 3D-Modelle sowie Dateireferenzen entsprechend geändert.

Danach speichern des Erzeugten Geländers.

 

Nun meine Frage:
Warum werden Bauteile die Unterdrückt sind von ReplaceReference übersehen auch wenn Unterdrücke zuvor gelöscht wurden?

Wer kann weiterhelfen?

 

********************************************************************************************************

Hier die Rule:

Function ReplaceReference()

    'Setzen der Baugruppe a ls aktuelles Dokument
    Dim oDocAssem As AssemblyDocument    'oDocAssem = gesamte Baugruppe)
    'Dim oDocAssemblyNew As String 'nur für's Debugging
    'oFileAssemblyNew = "d:\Arbeitsbereich\Retek\ERP\29\016\29-016-019\29-016-019.iam<DetailgenauigkeitGeländer>" 'nur für's Debugging
    oFileAssemblyNew = oDocAssemblyNew & "<DetailgenauigkeitGeländer>"
    'MsgBox (oFileAssemblyNew)
    Set oDocAssem = ThisApplication.Documents.Open(oFileAssemblyNew, True)
    
    'Löschen von unterdrücken Bauteilen
    'Call RemoveSuppressed
    
    oFileElementNew = Left(oDocAssem.DisplayName, (Len(oDocAssem.DisplayName) - 32))
    MsgBox (oFileElementNew)
    
    oFileAssemblyNew = Left(oFileAssemblyNew, (Len(oFileAssemblyNew) - 42))
    MsgBox (oFileAssemblyNew)
    
    'oRefDocs (Auflistung aller Documents in der Baugruppe) = AllreferencedDocuments von TypDocumentsEnumerator
    Dim oRefDocs As DocumentsEnumerator
    'AllReferencedDocuments = ALLE enthaltenen Dateien
    Set oRefDocs = oDocAssem.AllReferencedDocuments
    
    'Bauteil als aktuelles Dokument setzen
    Dim oRefDoc As Document
        
    'Es sollen nur Zeichnungen berücksichtigt werden die im gleichen Pfad sind
    'also nur Fullfilename abzüglich der letzten 4 Zeichen gesetzt werden
    '(ohne Dateiendung wie .ipt oder .iam) im gleichen Zeichnungpfad.
    'Left = abschneiden des Linken Teil, Len = Ermittlung der Länge eines Strings.
    'Left (Hallo,2) = Ha.
    'oZeichPath = Left(oRefDoc.FullFileName, (Len(oRefDoc.FullFileName) - 4))
    'FileSystemobject zwecks Prüfung, ob die Zeichnung überhaupt als Datei auf der Festplatte existiert.
    'Siehe googel z.B. nach "VBA prüfen ob Datei existiert" oder sowas 🙂
    'Dim objFso As Object
    'Set objFso = CreateObject("Scripting.FileSystemObject")
    
    Dim oDocRef As Document
    Set oDocRef = ThisApplication.ActiveDocument
    Dim oRefFile As FileDescriptor
    Dim oOrigRefName, oOrigFullFileName, selectedfile As String

    For Each oRefFile In oDocAssem.File.ReferencedFileDescriptors
        'setzen des vollständigen Dateipfades
        oOrigFullFileName = oRefFile.FullFileName
        'MsgBox (oOrigFullFileName)
        'oOrigRefName = oRefDoc.DisplayName
        oOrigRefName = Right(oRefFile.FullFileName, (Len(oRefFile.FullFileName) - 44))
        MsgBox (oOrigRefName)
       
        'oFileElementNew = Left(oDocAssem.DisplayName, (Len(oDocAssem.DisplayName) - 32))
        'Setzen von Objekt Variabeln für Dateiauswahldialog
        Dim oFileDlg As Inventor.FileDialog
        Set oFileDlg = Nothing
        Call ThisApplication.CreateFileDialog(oFileDlg)
        oFileDlg.InitialDirectory = oOrigRefName
        oFileDlg.CancelError = True
        On Error Resume Next
        
        'Legende:
        '_001 = Knieleiste
        '_002 = AnschraubplatteMitte
        '_003 = Pfosten
        '_004 = Fussleiste
        '_005 = AnschraubplattePfosten
        '_006 = Handlauf
        If oOrigRefName = "AnschraubplatteMitte.ipt" Then
            selectedfile = oFileAssemblyNew & "\" & oFileElementNew & "_001.ipt"
            Debug.Print selectedfile
        ElseIf oOrigRefName = "Knieleiste.ipt" Then
            selectedfile = oFileAssemblyNew & "\" & oFileElementNew & "_002.ipt"
            Debug.Print selectedfile
        ElseIf oOrigRefName = "Pfosten.ipt" Then
            selectedfile = oFileAssemblyNew & "\" & oFileElementNew & "_003.ipt"
            Debug.Print selectedfile
        ElseIf oOrigRefName = "Fussleiste.ipt" Then
            selectedfile = oFileAssemblyNew & "\" & oFileElementNew & "_004.ipt"
            'Debug.Print selectedfile
        ElseIf oOrigRefName = "AnschraubplattePfosten.ipt" Then
            selectedfile = oFileAssemblyNew & "\" & oFileElementNew & "_005.ipt"
            'Debug.Print selectedfile
        ElseIf oOrigRefName = "Handlauf.ipt" Then
            selectedfile = oFileAssemblyNew & "\" & oFileElementNew & "_006.ipt"
            'Debug.Print selectedfile
        End If
       
        If Err.Number <> 0 Then
            Return
        'ElseIf oFileDlg.Filename <> "" Then
        ElseIf oOrigRefName.Filename <> "" Then
            selectedfile = oFileElementNew.Filename
            selectedfile = oDocElement.Filename
            MsgBox (selectedfile)
        End If
        
        'Modell-Referenz ersetzen
        oRefFile.ReplaceReference (selectedfile)
        oOrigFullFileName = ""
        oDocAssem.Update
        
    Next
    
    'Löschen von unterdrücken Bauteilen
    'Call RemoveSuppressed
    Call oDocAssem.SaveAs(oDocAssem.FullFileName, True)
    Call oDocAssem.Close(True)
    'iLogicVb.UpdateWhenDone = True

End Function

 

Sobald ich die Funktion ReplaceReference sauber laufen habe würde ich den kompletten Quelltext hier im Forum zur Verfügung stellen. ReplaceReference ist nur ein Teil, aber ein wichtiger Teil für das iLogic Geländer.

 

Gruß

Matthias

0 „Gefällt mir“-Angaben
1.664Aufrufe
12Antworten
Antworten (12)
Nachricht 2 von 13

Martin-Winkler-Consulting
Advisor
Advisor

@mrichsteinKönntest du den Quelltext und eine Beispielbaugruppe zur Verfügung stellen?

Versteh ich dich richtig, dass die unterdrückten Bauteile gelöscht werden und dann erst die Referenzersetzung bei den verbliebenen Bauteilen erfolgt?

Mein erster Gedanke ist das unterdrückte Bauteile für den Inventor quasi nicht existieren und möglicherweise deswegen nicht berücksichtig werden. Daher vermeide ich in so einem Fall mit Detailgenauigkeiten zu arbeiten.

Das müsste ich mir aber mal in einem Testlauf ansehen was da passiert.

Ansonsten auf jeden Fall ein interessantes Thema...Geländer kommen ja häufiger vor.

Martin Winkler
CAD Developer
Did you find this post helpful? Feel free to like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.


EESignature

0 „Gefällt mir“-Angaben
Nachricht 3 von 13

mrichstein
Enthusiast
Enthusiast

Hallo Martin,

ja es ist richtig das ich die Unterdrückten Bauteile aus der Baugruppe mittels der Funktion RemoveSuppressed() lösche.

Allerdings wirst Du sehen, dass wenn bei Bauteile die in der Baugruppe Geländer insgesamt drei mal vorkommen (davon aber nur zwei davon Unterdrückt sind) das nicht Unterdrückte Bauteil ebenfalls von ReplaceReference() überlesen wird.

Auch wenn zuvor die Unterdrückten Bauteile aus der Baugruppe mit RemoveSuppressed() entfernt wurden und auch die Hauptansicht wieder aktiviert wurde.

Durch ReplaceReference() will ich Verknüpfungen zur iLogicMutter Geländer entfernen und diese als separate Baugruppe speichern bzw. später in den Vault einfügen und vor allem, alle Parameter stehen nicht mehr in Verknüpfung mit der iLogicMutter!

Wir wollen ja nicht immer neue Geländer machen, sondern auch mal auf vorhandene zurückgreifen.

 

Ich habe Dir das iLogic Paket Geländer zusammen gezippt und habe Dir ebenfalls den kompl. VBA-Teil mit als Dateianhang mit angehängt. Ich habe nicht zu verbergen und will auch hier im Forum offen für andere sein bzw. soll später das iLogic Geländer einschl. des VBA-Teils von mir veröffentlicht werden. Aber erst dann wenn es sauber läuft.

Irgendetwas übersehe ich zur Zeit oder sehe den Wald vor lauter Bäumen nicht!

Du kannst mich hierzu jederzeit gern kontaktieren.

Gruß und vielen Dank

Matthias

PS. Bitte beachte die Verknüpfungen zu den 3D-Modellen in der Baugruppe. Diese müsstes Du Dir an Deine Ordnerstruktur/Pfadstruktur entsprechend anpassen.

Nachricht 4 von 13

Martin-Winkler-Consulting
Advisor
Advisor

Hallo Matthias,

ich schau mir das in den nächsten Tagen mal in Ruhe an.

Schönes Wochenende Smiley (fröhlich)

Martin Winkler
CAD Developer
Did you find this post helpful? Feel free to like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.


EESignature

0 „Gefällt mir“-Angaben
Nachricht 5 von 13

Martin-Winkler-Consulting
Advisor
Advisor

@mrichstein

Hallo Matthias,

ich habe mich jetzt mal etwas mit deinen iLogic Geländern auseinander gesetzt. Zunächst mal ist das ein sehr schönes Tool was sich lohnt weiter zu entwickeln! Hier also ein erstes Feedback:

 

Meine bisherigen Tests haben ergeben das es sich nicht um einen "Fehler" in ReplaceReference handelt sondern eher um eine falsche Reihenfolge der Vorgänge. Dazu kommt das Thema Detailgenauigkeiten und Speicherung des Zustandes in der jeweiligen Baugruppe (Parent / Child) und zu welchem Zeitpunkt das geschieht.

Meiner Ansicht nach müsste der Vorgang in etwa so ablaufen:

  • komplette Kopie inclusive Parts von der Vorlagebaugruppe im Zustand Hauptansicht, also ohne Detailgenauigkeit
  • Aufrufen dieser Kopie (iam.ActiveDocument)
  • Referenzen austauschen mit vorher kopierten Parts, so daß kein Zusammenhang mehr zur Vorlagebaugruppe besteht
  • Einstellungen vornehmen über iLogic Regel
  • Speichern mit Detailgenauigkeit

Ich werde mir das in jedem Fall weiter ansehen und auch andere Wege noch probieren.

 

Weitere Anmerkung:

Für meinen Geschmack finde ich es etwas unglücklich gelöst das ein Teil in iLogic programmiert ist und dann VBA hinzu kommt. Liegt wahrscheinlich in der Historie begründet. Es wäre eine Überlegung wert das komplett in VBA zu programmieren.

 

Noch ein Hinweis:

Du must unterscheiden zwischen referenzierten Dokumenten einer Baugruppe und den Occurrences (Browserbaumeinträgen). Unterdrückt werden die Occurrences bei Detailgenauigkeiten

Martin Winkler
CAD Developer
Did you find this post helpful? Feel free to like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.


EESignature

Nachricht 6 von 13

mrichstein
Enthusiast
Enthusiast

Guten Morgen Martin,

Sorry das ich mich erst jetzt melde, nur leider halte ich mich zur Zeit im Ausland auf meiner Lieblingsbaustelle auf.

Wiedermal, stelle ich fest das es gut ist sich mit anderen Auszutauschen.

Den von Dir vorgeschlagenen Ablauf werde ich mir noch mal anschauen und ggfs. direkt ändern.

 

Zu Deiner Anmerkung:

Ja, ich gebe Dir recht, den kompletten iLogic Teil werde ich zu einem späteren Zeit in VBA umsetzen. Aufgrunder meiner von mir festgelegten Projektzeit für das iLogic Geländer möchte ich zunächst für die Kollegen das Tool zum rennen bringen. Danach den iLogic Teil ab ins VBA, fertig. Die Kollegen werden dieses nicht wirklich dann mitbekommen.

Vielleicht macht es auch erst dann Sinn das ganze Thema hier im Forum dann zu veröffentlichen.

 

Ich danke für Deine Unterstützung und ich würde mich über konstruktive Kritik bzw. Deiner Unterstützung und mich freuen wenn wir weiter in Kontakt hierzu bleiben, da ich aucn gern das Tool veröffentlichen möchte.

 

Gruß

Matthias

0 „Gefällt mir“-Angaben
Nachricht 7 von 13

Tarek_K
Autodesk
Autodesk

Hallo zusammen,

@mrichstein @Martin-Winkler-Consulting,

 

also gerne kann hier, wenn etwas mit der Community geteilt werden soll etwas in einem eigenen Thema veröffentlich werden. Wichtig ist dann so ein Tool nur komplett zu erklären und es darf keine Sales/Marketinginhalte haben sowie muss kostenlos sein. 😉

 

Ansonsten zu diesem Thema - was meint ihr, welcher Post oder Posts wären hier die entsprechenden Beiträge, die man eventuell als Lösung ansehen könnte? Sei doch so gut @mrichstein und markiere entsprechend die Beiträge, die deine Ausgangsfrage beantworten, falls möglich.

You found a post helpful? Then feel free to give likes to these posts!
Your question got successfully answered? Then just click on the 'Mark as solution' button. 


Tarek Khodr
Community Manager

0 „Gefällt mir“-Angaben
Nachricht 8 von 13

Martin-Winkler-Consulting
Advisor
Advisor

@Tarek_K

wir stehen in Kontakt und so wie es die Zeit erlaubt werden wir da wohl eine Lösung erarbeiten

@mrichstein

ich melde mich im Laufe der Woche noch bei dir, zur weiteren Abstimmung

Martin Winkler
CAD Developer
Did you find this post helpful? Feel free to like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.


EESignature

Nachricht 9 von 13

mrichstein
Enthusiast
Enthusiast

Moin Tarek,

ich habe ein Tool kriert, welches dafür sorgen soll dass die 3D Referenzen aus der Mutter iLogik entkoppelt und nach Vorgabe neu setzen soll. Leider funktioniert dieses noch nicht ganz so wie ich es will. Daher habe ich dieses auch ehr als ein Hilferuf ins Forum gestellt in der Hoffnung das ich einen Tip bekomme wo der Fehler liegen könnte. Wahrscheinlich sehe ich nur im Moment den Wald vor lauter Bäumen nicht. Sobald ich den Fehler gefunden habe und ReplaceReference sauber funktioniert, werde ich es öffentlich stellen. Jeder soll die Möglichkeit haben ReplaceReference an seine Bedürfnisse anzupassen zu können.

Ich habe nicht vor das Tool als ein Sales Produkt hier im Forum anzubieten bzw. zu verkaufen, da ich in gesicherter Armut lebe. 🙂 @Martin-Winkler-Consulting war es gewesen der dieses Thema interessant findet und mir bei der Fehler suche behilflich ist.

@Tarek_Kfalls Du eine Idee hast diese anders zu Posten da wäre ich Dir dankbar dafür. Anderfalls suchen wir erstmal den Fehler und kümmern um das Posten dann später.

Gruß

Matthias

0 „Gefällt mir“-Angaben
Nachricht 10 von 13

Dennis.Ossadnik
Autodesk Support
Autodesk Support

Hallo @mrichstein,

 

für mich sieht das so aus, als wäre das ein Effekt vom Unterdrücken selber.

 

Also die Funktion "Unterdrücken" (Detailgenauigkeiten) haben nur ein einziges Ziel: Speicher sparen.

Wenn man eine Datei unterdrückt, wird diese komplett aus dem Speicher entladen. In diesem Zustand ist es also keine Referenzierte Datei (ReferencedDocuments / AllReferencedDocuments).

Da die Datei aber natürlich noch zum Umfang der Baugruppe an sich gehört, gibt es eine noch einen Verweis auf die Datei (ReferencedDocumentDescriptor).

 

Hier mal eine kleines Beispiel aus dem Debugger:

2018-06-28_13-25-34.jpg

 

In der Baugruppe gibt es 14 unterschiedliche Referenzen. Davon sind gerade 10 verschiedene unterdrückt - also entladen.

Damit gibt es dann "nur" 4 ReferencedDocuments / -Files, aber 14 ReferencedDocumentDescriptors.

 

Man kann das aber auch prüfen, ob der Descriptor auf ein Document verweist, welches gerade entladen ist:

2018-06-28_13-35-39.jpg

 

Ist das der Fall, dann muss das Document erst geladen werden (Unterdrückung entfernen) und dann kann erst ReplaceReference durchgeführt werden.

 

Hilft Dir diese Information ein Stückchen weiter?

 



Dennis Ossadnik
Senior Technical Support Specialist
0 „Gefällt mir“-Angaben
Nachricht 11 von 13

mrichstein
Enthusiast
Enthusiast

Hallo @Dennis.Ossadnik,

genau das ist es, was ich vermute. Ich werde es in den nächsten Tagen ausprobieren.

Bleibt nur zu hoffen, dass es auch bei Bauteilen klappt die merhfach vorkommen, bei denen aber wie in Deinem Beispiel "HANDLE CAP1: = unsupressed" und "HANDLE CAP2: = supressed"

Ich werde Dir und den anderen hierzu ein Rückkopplung geben.

Danke für die Deine Bemühungen und Deinen Tipp.

Matthias

Nachricht 12 von 13

Dennis.Ossadnik
Autodesk Support
Autodesk Support

Hallo @mrichstein,

 

ich wollte einmal nachfragen, ob Du mit den Hinweisen Deinen Code zwischenzeitlich anpassen und die Situation mit den unterdrückten Teilen abfangen konntest.

 

 



Dennis Ossadnik
Senior Technical Support Specialist
0 „Gefällt mir“-Angaben
Nachricht 13 von 13

mrichstein
Enthusiast
Enthusiast

Hallo @Dennis.Ossadnik,

ich werde dazu erst Ende dieser Woche Zeit finden um dieses ausgiebig zu testen.

Soblad ich den Fehler gefunden habe oder den Code habe anpassen können, lasse ich Dir eine Info zukommen.

Egal ob es funktioniert oder nicht, ich melde mich auf jedenfall , da ich glaube das manch einer ReplaceReference() gebrauchen kann.

Gruß und Danke für Deine Nachfrage

Matthias