| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Parameter aus Datei kopieren (580 mal gelesen)
|
Thomas C. Mitglied
Beiträge: 326 Registriert: 20.05.2003 Diverse Inventorsysteme
|
erstellt am: 24. Nov. 2022 09:32 <-- editieren / zitieren --> Unities abgeben:
Hi Leute ist es möglich, per iLogic benutzerdefinierte parameter aus einer Vorlagedatei zu kopieren?? z.B. beim Speichern??? oder gar beim einer Datei???? vielen Dank für die Hilfe!! Cheers Tom ------------------ Inventor ist cool... Inventor ist .... anders... VAULT macht den Braten erst fett.. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 24. Nov. 2022 11:25 <-- editieren / zitieren --> Unities abgeben: Nur für Thomas C.
Hallo Zitat: der gar beim einer Datei????
Beim ...was? Ja, geht. Aber: Das Öffnen dieser Datei verbraucht Zeit und Resourcen bei jedem Speichern. Jedes Mal eine komplette Datei öffnen, nur um Wertepaare auszulesen, ist alles andere als ideal. Dann muss man auch bedenken, das beim Speichern einer Baugruppe viele Bauteile nacheinander gespeichert werden. Das heißt jedes Mal Vorlagendatei öffnen, kopieren, schließen. Das kann spürbar Performance fressen. Die Parameter sind doch immer wieder die Gleichen und haben den selben Wert. Daher könnte man die ebenso gut hart in die iLogic Regel schreiben. Externe iLogicregeln sind reiner Text. Die können notfalls mit jedem x-beliebigen Editor modifiziert werden. Alternativ könnte man eine globale Variable erstellen, wenn das erste Dokument geöffnet wird und die Werte einmal einlesen. Danach, da die Variable bereits existiert, wird diese verwendet. Globale Variablen vermeide ich aber normalerweise, da jede andere iLogicregel die ebenfalls missbrauchen kann.
Von wie vielen Parametern reden wir denn und gibt es Regeln wann welcher davon übertragen werden muss? ------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas C. Mitglied
Beiträge: 326 Registriert: 20.05.2003 Diverse Inventorsysteme
|
erstellt am: 24. Nov. 2022 11:39 <-- editieren / zitieren --> Unities abgeben:
Hi Ralf danke für deinen wertvollen Inpunt. Das wäre sicher was wenns "hardcodiert" wäre - aber ich hätts gern als Pulldownmenü zur Auswahl im Property - Manager Es geht um 3 verschiedene Variablen, einmal mit 12 werten und 2 x mit je 2 Werten. Wie krieg ich dann das ins Formular? danke für deinen Input!! cheers TC
------------------ Inventor ist cool... Inventor ist .... anders... VAULT macht den Braten erst fett.. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 24. Nov. 2022 18:55 <-- editieren / zitieren --> Unities abgeben: Nur für Thomas C.
Hallo Also ich versuche gerade mir zusammen zu reimen was du da machst. - Was für ein Formular? - Wer/was ist der Property-Manager? Ich les mal in der Glaskugel: Du hast ein externes iLogic Formular erstellt und dort 3 Parameter als Pulldowns eingefügt. In einer neuen Datei existieren die Parameter aber noch nicht, daher sind die Pulldowns im Formular deaktiviert. Benötigt würde jetzt also eine Funktion, um die Parameter aus einem Quelldokument auszulesen und im aktuellen Dokument zu erstellen. Die Parameter bereits in die Dateivorlage zu platzieren, geht aus irgendeinem Grund nicht bzw. ist natürlich keine Lösung für Bestandsdaten. Man könnte die Vorlagendatei beim ersten Speichern unsichtbar öffnen und über die Sitzung offen lassen. Dann wird es performanter. Ich gehe mal davon aus, die Vorlage enthält keine Modelldaten usw. Wenn ich mich richtig erinnere liefert der Öffnen Befehl bei einer bereits geöffnete Datei nur eine Referenz darauf zurück. Die Zeit für ein erneutes Öffnen entfällt. Der minimale Code für eine externe Regel könnte so aussehen. Alternativ/zusätzlich zu einem Eventtrigger könnte in dein Formular auch ein Button "Parameter erstellen", der die Regel manuell aufruft. Code:
Dim sPath As String = "C:\Pfad\zur\Vorlage\Vorlagendatei.ipt" '<--- anpassen bitte Dim oApp As Inventor.Application = ThisApplication Dim oTargetDoc As PartDocument=ThisDoc.Document Dim oSourceDoc As PartDocument Try oSourceDoc= oApp.Documents.Open(sPath, False) Catch End Try If oSourceDoc Is Nothing Then Exit Sub Dim oParam As UserParameter Dim oNewParam As UserParameter For Each oParam In oSourceDoc.ComponentDefinition.Parameters.UserParameters Try oNewParam = oTargetDoc.ComponentDefinition.Parameters.UserParameters.Item(oParam.Name) Catch oNewParam= oTargetDoc.ComponentDefinition.Parameters.UserParameters.AddByValue(oParam.Name,oParam.Value,oParam.Units) oNewParam.Comment = oParam.Comment oNewParam.CustomPropertyFormat.Precision = oParam.CustomPropertyFormat.Precision oNewParam.CustomPropertyFormat.PropertyType = oParam.CustomPropertyFormat.PropertyType oNewParam.CustomPropertyFormat.ShowLeadingZeros = oParam.CustomPropertyFormat.ShowLeadingZeros oNewParam.CustomPropertyFormat.ShowTrailingZeros = oParam.CustomPropertyFormat.ShowTrailingZeros oNewParam.CustomPropertyFormat.ShowUnitsString = oParam.CustomPropertyFormat.ShowUnitsString oNewParam.CustomPropertyFormat.Units = oParam.CustomPropertyFormat.Units oNewParam.DisplayFormat = oParam.DisplayFormat oNewParam.ExposedAsProperty = oParam.ExposedAsProperty oNewParam.IsKey = oParam.IsKey oNewParam.ModelValueType=oParam.ModelValueType oNewParam.Precision = oParam.Precision If oParam.ExpressionList IsNot nothign Then If oParam.ExpressionList.Count>0 Then oNewParam.ExpressionList.SetExpressionList(oParam.ExpressionList.GetExpressionList,False) End If End If End Try Next
------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas C. Mitglied
Beiträge: 326 Registriert: 20.05.2003 Diverse Inventorsysteme
|
erstellt am: 25. Nov. 2022 07:18 <-- editieren / zitieren --> Unities abgeben:
Hi Ralf deine Glaskugel ist sensationell - die trifft genau ins Schwarze. Ich werds mal probieren und melde mich sobald ich ein Ergebnis habe vielen Dank für deine immense Unterstützung. lg Tom ------------------ Inventor ist cool... Inventor ist .... anders... VAULT macht den Braten erst fett.. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas C. Mitglied
Beiträge: 326 Registriert: 20.05.2003 Diverse Inventorsysteme
|
erstellt am: 25. Nov. 2022 07:38 <-- editieren / zitieren --> Unities abgeben:
Hi Ralf ich habs jetzt probiert und da kam ne Fehlermeldung - siehe Bilder ich hab dir auch ein Bild meiner Parameter angehängt. Nochmals vielen Dank Tom ------------------ Inventor ist cool... Inventor ist .... anders... VAULT macht den Braten erst fett.. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 25. Nov. 2022 09:00 <-- editieren / zitieren --> Unities abgeben: Nur für Thomas C.
Moin Fehler vom Amt. Die ganzen CustomPropertyFormat Properties existieren nur, wenn die Eigenschaft ExposedAsProperty auf True steht. So müsste es gehen: Code:
Dim sPath As String = "C:\Pfad\zur\Vorlage\Vorlagendatei.ipt" '<--- anpassen bitteDim oApp As Inventor.Application = ThisApplication Dim oTargetDoc As PartDocument=ThisDoc.Document Dim oSourceDoc As PartDocument Try oSourceDoc= oApp.Documents.Open(sPath, False) Catch End Try If oSourceDoc Is Nothing Then Exit Sub Dim oParam As UserParameter Dim oNewParam As UserParameter For Each oParam In oSourceDoc.ComponentDefinition.Parameters.UserParameters Try oNewParam = oTargetDoc.ComponentDefinition.Parameters.UserParameters.Item(oParam.Name) Catch oNewParam= oTargetDoc.ComponentDefinition.Parameters.UserParameters.AddByValue(oParam.Name,oParam.Value,oParam.Units) oNewParam.Comment = oParam.Comment oNewParam.ExposedAsProperty = oParam.ExposedAsProperty If oNewParam.ExposedAsProperty=True Then oNewParam.CustomPropertyFormat.Precision = oParam.CustomPropertyFormat.Precision oNewParam.CustomPropertyFormat.PropertyType = oParam.CustomPropertyFormat.PropertyType oNewParam.CustomPropertyFormat.ShowLeadingZeros = oParam.CustomPropertyFormat.ShowLeadingZeros oNewParam.CustomPropertyFormat.ShowTrailingZeros = oParam.CustomPropertyFormat.ShowTrailingZeros oNewParam.CustomPropertyFormat.ShowUnitsString = oParam.CustomPropertyFormat.ShowUnitsString oNewParam.CustomPropertyFormat.Units = oParam.CustomPropertyFormat.Units End If oNewParam.DisplayFormat = oParam.DisplayFormat oNewParam.IsKey = oParam.IsKey oNewParam.ModelValueType=oParam.ModelValueType oNewParam.Precision = oParam.Precision If oParam.ExpressionList IsNot nothign Then If oParam.ExpressionList.Count>0 Then oNewParam.ExpressionList.SetExpressionList(oParam.ExpressionList.GetExpressionList,False) End If End If End Try Next
------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas C. Mitglied
Beiträge: 326 Registriert: 20.05.2003 Diverse Inventorsysteme
|
erstellt am: 28. Nov. 2022 08:01 <-- editieren / zitieren --> Unities abgeben:
Hi Ralf!! das funktioniert perfekt!!! und kaum spürbar. Vielen Vielen Dank!! eine Frage habe ich noch Wenn ich da weiter rumkonfigurieren muss - und z.B. Parameter verändere resp. ergänze, muss ich dann den bestehenden Parameter zuerst löschen? Wie kann ich das auf einfache Art und Weise up to date halten??? Danke nochmals für deinen Support TC ------------------ Inventor ist cool... Inventor ist .... anders... VAULT macht den Braten erst fett.. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas C. Mitglied
Beiträge: 326 Registriert: 20.05.2003 Diverse Inventorsysteme
|
erstellt am: 28. Nov. 2022 08:25 <-- editieren / zitieren --> Unities abgeben:
Hi Ralf es gibt anscheinend doch noch ein Problem. Wenn ich ein Bauteil aktualisiere gehts gut. Bei einer Baugruppe geht das aber nicht - muss ich dann in dem Fall noch eine Baugruppe anlegen mit denselben Parametern??? die Meldung ist: Das COM-Objekt des Typs "Inventor._DocumentClass" kann nicht in den Schnittstellentyp "Inventor.PartDocument" umgewandelt werden. Dieser Vorgang konnte nicht durchgeführt werden, da der QueryInterface-Aufruf an die COM-Komponente für die Schnittstelle mit der IID "{29F0D463-C114-11D2-B77F-0060B0F159EF}" aufgrund des folgenden Fehlers nicht durchgeführt werden konnte: Schnittstelle nicht unterstützt (Ausnahme von HRESULT: 0x80004002 (E_NOINTERFACE)). Danke vorab TC
------------------ Inventor ist cool... Inventor ist .... anders... VAULT macht den Braten erst fett.. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 28. Nov. 2022 09:32 <-- editieren / zitieren --> Unities abgeben: Nur für Thomas C.
Moin Ich bin davon ausgegangen, das von Bauteil zu Bauteil kopiert werden soll. Ändere die Zeile
Code: Dim oTargetDoc As PartDocument=ThisDoc.Document
in Code: Dim oTargetDoc As Document=ThisDoc.Document
Ist etwas unsauber, sollte aber hier keine Probleme verursachen. Außer du lässt das in einer Zeichnung laufen. Da ist übrigens noch ein Tippfehler in "Nothing" in der Zeile
Code: If oParam.ExpressionList IsNot Nothing Then
Das der keinen Fehler wirft...interessant. Das kommt ein wenig darauf an wie das aktuell halten aussehen soll. Das Löschen von Parametern im Zieldokument, die im Quelldokument gelöscht wurden, funktioniert nicht unbedingt. Im Zieldokument kann nicht zwischen kopierten und anderen, selbst erstellten Parametern unterschieden werden. Hier müsste erst ein Marker, z.B. ein eindeutiger Eintrag im Kommentarfeld oder ein eindeutiger Teil im Parameternamen vorgehalten werden, um fälschliches Löschen zu verhindern. Außerdem lassen sich Parameter in Verwendung nicht löschen. Ein pauschales Drüberbügeln halte ich grundsätzlich für sehr fehleranfällig. Beim Aktualisieren kommt es darauf an was sich ändert. Es müsste jeder Wert erst geprüft und nur die Abweichungen aktualisiert werden. Das ist etwas Schreibarbeit. Ändert sich aber der Typ z.B. von Numerisch in Text, muss meines Wissens gelöscht und neu angelegt werden. Muss ich ausprobieren. Da könnte es auch wieder zu Problemen mit verwendeten Parametern kommen, die sich dann nicht löschen lassen. So eine Typänderung, falls sie direkt möglich ist, könnte auch Folgefehler auslösen, wenn der Parameter als Teil eines anderen Parameters verwendet wurde. Ein paar Entscheidungen muss man auch noch treffen. Soll z.B. in einem Parameter mit Werteliste der aktuelle Wert geändert werden, weil in der Liste einer dazu gekommen ist oder nur die Liste ergänzen? Wenn der selektierte Wert in der Liste im Zieldokument im Quelldokument nicht mehr vorhanden ist und im Zieldokument ebenfalls gelöscht wird, welchen Wert soll der Parameter annehmen? ------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas C. Mitglied
Beiträge: 326 Registriert: 20.05.2003 Diverse Inventorsysteme
|
erstellt am: 28. Nov. 2022 10:00 <-- editieren / zitieren --> Unities abgeben:
Hi Ralf man - was du dir da für ne Arbeit antust - ich krieg langsam ein schlechtes Gewissen!!! das mit dem Parameter updaten bezieht sich nur darauf, falls sich mal ein Eintrag in der Liste ändert. Es soll eigentlich kein Parameter gelöscht werden, auch ändert sich die Art des Parameters (text oder numerisch) nicht. Was sein kann ist, dass es eventuell einen zusätzlichen Parameter gibt. Bei Zeichnungen werden keine Parameter benötigt, da alle relevanten Informationen aus dem Bauteil/der Baugruppe kommen. Nochmals vielen vielen Dank!!! lg Tom ------------------ Inventor ist cool... Inventor ist .... anders... VAULT macht den Braten erst fett.. ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2166 Registriert: 15.11.2006 Windows 10 x64, AIP 2022
|
erstellt am: 30. Nov. 2022 10:54 <-- editieren / zitieren --> Unities abgeben: Nur für Thomas C.
Hallo Sag mir einfach wo ich die Rechnung hinschicken soll, wenn es deinem Gewissen gut tut. Ein neuer, zusätzlicher Parameter wird einfach ergänzt. Ein gelöschter Parameter im Quelldokument wird nicht im Zieldokument gelöscht. Erstens weil das mit verwendeten Parametern nicht funktioniert und zweitens weil ich Löschen im Hintergrund immer für fatal halte. Ich bin mir nicht sicher ob das Aktualisieren der Multivaluelisten so funktioniert. Es sollte eine bestehende Liste mit neuen Werten ergänzt werden. Wurde ein Wert der Werteliste in der Quelldatei gelöscht, wird er im Zieldokument auch entfernt. Ist der zu entfernende Wert der aktuell ausgewählte, bekommt man eine Meldung angezeigt. Code:
Dim sPath As String = "C:\Pfad\zur\Vorlage\Vorlagendatei.ipt" '<--- anpassen bitteDim oApp As Inventor.Application = ThisApplication Dim oTargetDoc As Document=ThisDoc.Document Dim oTargetParams As UserParameters = oTargetDoc.ComponentDefinition.Parameters.UserParameters Dim oSourceDoc As PartDocument Try oSourceDoc= oApp.Documents.Open(sPath, False) Catch End Try If oSourceDoc Is Nothing Then Exit Sub Dim oSourceParams As UserParameters = oSourceDoc.ComponentDefinition.Parameters.UserParameters Dim oSourceParam As UserParameter Dim oNewParam As UserParameter For Each oSourceParam In oSourceParams Try oNewParam = oTargetParams.Item(oSourceParam.Name) Catch oNewParam= oTargetParams.AddByValue(oSourceParam.Name,oSourceParam.Value,oSourceParam.Units) End Try If oNewParam IsNot Nothing Then If oNewParam.ExpressionList IsNot Nothing Then If oSourceParam.ExpressionList IsNot Nothing Then If oSourceParam.ExpressionList.Count>0 Then Dim sNewExList() As String = oNewParam.ExpressionList.GetExpressionList() Dim sOldExList() As String = oSourceParam.ExpressionList.GetExpressionList() If sOldExList.Except(sNewExList) IsNot Nothing Then oNewParam.ExpressionList.SetExpressionList(sOldExList, False) End If Dim dValue As New List(Of String) Dim sEx As String For Each sEx In sOldExList dValue.Add(oTargetDoc.ComponentDefinition.Parameters.GetValueFromExpression(sEx, oNewParam.Units).ToString) Next If dValue.Contains(oNewParam.Value.ToString) = False Then MsgBox("Der aktuelle Wert von Parameter " & oNewParam.Name & " ist nicht mehr in der Werteauswahlliste enthalten. Es wird der erste Listenwert als aktuell gewählt.", MsgBoxStyle.Critical, "iLogic") oNewParam.Expression=oNewParam.ExpressionList.Item(1) End If End If End If Else If oSourceParam.ExpressionList IsNot Nothing Then If oSourceParam.ExpressionList.Count>0 Then oNewParam.ExpressionList.SetExpressionList(oSourceParam.ExpressionList.GetExpressionList,False) End If End If End If oNewParam.Comment = oSourceParam.Comment oNewParam.ExposedAsProperty = oSourceParam.ExposedAsProperty If oNewParam.ExposedAsProperty=True Then oNewParam.CustomPropertyFormat.Precision = oSourceParam.CustomPropertyFormat.Precision oNewParam.CustomPropertyFormat.PropertyType = oSourceParam.CustomPropertyFormat.PropertyType oNewParam.CustomPropertyFormat.ShowLeadingZeros = oSourceParam.CustomPropertyFormat.ShowLeadingZeros oNewParam.CustomPropertyFormat.ShowTrailingZeros = oSourceParam.CustomPropertyFormat.ShowTrailingZeros oNewParam.CustomPropertyFormat.ShowUnitsString = oSourceParam.CustomPropertyFormat.ShowUnitsString oNewParam.CustomPropertyFormat.Units = oSourceParam.CustomPropertyFormat.Units End If oNewParam.DisplayFormat = oSourceParam.DisplayFormat oNewParam.IsKey = oSourceParam.IsKey oNewParam.ModelValueType = oSourceParam.ModelValueType oNewParam.Precision = oSourceParam.Precision End If Next
------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |