| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Regel auf alle geöffnete Dateien (1526 / mal gelesen)
|
Big-Daddy Mitglied Konstrukteur
Beiträge: 51 Registriert: 08.04.2015 IV 2022 Prof.
|
erstellt am: 24. Okt. 2019 11:24 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich versuche gerade eine Ilogic Regel zu basteln die durch alle geöffnete Dateien in Inventor (iam und ipt) durchläuft. Die Aufgabe der Regel ist eine Nummer aus Excel auszulesen und in die Iproperties zu schreiben. Diese läuft bisher auch tadellos. Sobald ich eine Schleife versuche zu Programmieren kommt eine Fehlermeldung.
Code: Dim Doc As DocumentFor Each Doc In ThisApplication.Documents Doc.Activate If iProperties.Value("Project", "Part Number") = "" Then Dim oDoc As Document = ThisDoc.Document oDoc.Close Else V = iProperties.Value("Project", "Part Number") i = GoExcel.FindRow("D:\Artikel.xlsx", "Systemaufbau", "gebogen", "=", v) i2= GoExcel.CurrentRowValue("gepulvert") If i2 = "106165" Then MessageBox.Show("Fehler", "Fehler") iProperties.Value("Project", "Stock Number") = "" End If iProperties.Value("Project", "Stock Number") = i2 ThisDoc.Save Dim oDoc As Document = ThisDoc.Document oDoc.Close End If Next
Weiß jemand woran es liegt und hat mir eine Lösung.
Vielen Dank [Diese Nachricht wurde von Big-Daddy am 24. Okt. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meierjo Mitglied
Beiträge: 358 Registriert: 20.08.2003
|
erstellt am: 25. Okt. 2019 06:58 <-- editieren / zitieren --> Unities abgeben: Nur für Big-Daddy
|
Big-Daddy Mitglied Konstrukteur
Beiträge: 51 Registriert: 08.04.2015 IV 2022 Prof.
|
erstellt am: 25. Okt. 2019 08:01 <-- editieren / zitieren --> Unities abgeben:
|
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 25. Okt. 2019 09:44 <-- editieren / zitieren --> Unities abgeben: Nur für Big-Daddy
Könnte es an der Verwendung von ThisDoc liegen? Ist das nicht ein Verweis auf das Dokument, das die Regel enthält? Ich würde versuchen, alle Verwendungen von ThisDoc und auch oDoc zu ersetzen durch Doc (deine laufvariable der Schleife). Kann es gerade nicht selbst ausprobieren... ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Meierjo Mitglied
Beiträge: 358 Registriert: 20.08.2003
|
erstellt am: 25. Okt. 2019 12:54 <-- editieren / zitieren --> Unities abgeben: Nur für Big-Daddy
|
Big-Daddy Mitglied Konstrukteur
Beiträge: 51 Registriert: 08.04.2015 IV 2022 Prof.
|
erstellt am: 25. Okt. 2019 14:41 <-- editieren / zitieren --> Unities abgeben:
@ Meierjo siehe Anhang Krabby ich hab versucht es soweit umzusetzten was du mir vorgeschlagen hast. Code:
Dim oDoc As DocumentFor Each oDoc In ThisApplication.Documents oDoc.Activate If iProperties.Value("Project", "Part Number") = "" Then oDoc.Close Else V = iProperties.Value("Project", "Part Number") i = GoExcel.FindRow("D:\Artikel.xlsx", "Schubkastendoppel", "gebogen", "=", V) i2= GoExcel.CurrentRowValue("gepulvert") iProperties.Value("Project", "Stock Number") = i2 ThisDoc.Save oDoc.Close End If Next
Mit diesem Code läuft die Regel durch, aber er schreibt mir nur die erste Datei (also die Datei in der ich die Regel starte) etwas in die Iproperties. Die anderen geöffneten Bauteile schließt er einfach. Ich vermute es ist die erste IF Abfrage, aber diese dürfte nicht greifen da bei allen geöffneten Bauteilen die Teilenummer gefüllt ist. Darauf hin habe ich die Regel leicht geändert. Zeile 3 ist anders:
Code: Dim oDoc As DocumentFor Each oDoc In ThisApplication.Documents oDoc = ThisApplication.ActiveDocument If iProperties.Value("Project", "Part Number") = "" Then oDoc.Close Else V = iProperties.Value("Project", "Part Number") i = GoExcel.FindRow("D:\Artikel.xlsx", "Schubkastendoppel", "gebogen", "=", V) i2= GoExcel.CurrentRowValue("gepulvert") iProperties.Value("Project", "Stock Number") = i2 ThisDoc.Save oDoc.Close End If Next
Da kommt die gleiche Fehlermeldung, siehe Anhang. Ach ja nicht verwirren lassen, ich hab übersichtshalber die zweite If Abfrage weggelassen zum testen. [Diese Nachricht wurde von Big-Daddy am 25. Okt. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 26. Okt. 2019 10:17 <-- editieren / zitieren --> Unities abgeben: Nur für Big-Daddy
Könnte es daran liegen, dass nur das erste Dokument gespeichert wird und die anderen nicht? ThisDoc.Save -> oDoc.Save Könntest du vorher auch ausprobieren, indem du die Zeile mit dem .Close auskommentierst und die iProp ansiehst. Kann es leider nicht selbst ausprobieren, deshalb rate ich nur rum. Noch ein kleiner Hinweis: Solche Sachen wie "ich vermute es liegt an der x.ten IF" kann man überprüfen, durch eine MsgBox in der jedem Zweig des Programms. Könnte man sogar dauerhaft im Code lassen durch Const bDebug As Boolean = true ' Schalter für "Debug-Modus" in erster Zeile [... ] If bDebug Then MsgBox("if x") ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Big-Daddy Mitglied Konstrukteur
Beiträge: 51 Registriert: 08.04.2015 IV 2022 Prof.
|
erstellt am: 28. Okt. 2019 07:57 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen Krabby, die Idee war nicht schlecht, nur leider kommt die gleiche Fehlermeldung wie letzte Woche. Ohne die Schleife schreibt er die Werte aus der Excel Tabelle rein, an der Excel Tabelle liegt es also nicht (wollte es nur nochmal testen)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 28. Okt. 2019 15:34 <-- editieren / zitieren --> Unities abgeben: Nur für Big-Daddy
nun konnte ich tatsächlich mal ein wenig rumprobieren. Ich denke, dass die Verwendung von iProperties.Value(...) zum lesen und schreiben nicht so funktioniert wie erwartet. Das liefert wohl immer das iProperty aus dem Dokument mit der Regel (dh. mit jedem Durchlauf der Schleife wird immer ein iProp vom zuerst geöffneten Dokument gelesen und geschrieben) Zumindest in meinem kleinen Test, bei dem ich das oDoc.Close auskommentiert habe (kA, was sonst rauskommen würde, vielleicht "Dein Fehler") Außerdem bin ich darüber gestolpert, dass ThisApplication.Documents alle Docs aus dem Arbeitsspeicher auflistet. Z.B. bei geöffneter Baugruppe sind die Einzelteile enthalten. Bei denen schlägt dann das oDoc.Activate fehl (auch das .Close wird wohl nicht klappen) Jedenfalls bin ich bei der Erkenntnis angelangt, dass es besser wäre, sich vom Document zum iProperty zu hangeln. Hab ich schon in VBA in Verwendung, wird auch in iLogic klappen. So scheint es auch zu sein, das ganze wird nur eben recht länglich. Im folgenden das Ergebnis. Code: Sub Main() Dim oDoc As Document For Each oDoc In ThisApplication.Documents 'oDoc.Activate 'nicht mehr nötig Call T1(oDoc) Next End SubSub T1 (oDoc as Document) Dim V as String = ReadiProperty(oDoc, "Part Number", 3 ) MsgBox (V) 'If iProperties.Value("Project", "Part Number") = "" Then If V = "" Then 'oDoc.Close MsgBox("keine PartNo. bei" & vbCrLf & oDoc.DisplayName) Else 'V = iProperties.Value("Project", "Part Number") 'oben schon gelesen i = GoExcel.FindRow("C:\TEMP\Test.xlsx", "Schubkastendoppel", "gebogen", "=", V) i2= GoExcel.CurrentRowValue("gepulvert") 'iProperties.Value("Project", "Stock Number") = i2 Dim ret As Boolean = WriteiProperty(oDoc, "Stock Number", i2, 3) If ret Then MsgBox("es wurde was geschrieben bei" & vbCrLf _ & oDoc.DisplayName & vbCrLf _ & V & vbCrLf _ & i2) Else MsgBox("WriteiProperty lieferte False zurück, Prop. nicht gefunden") End If 'oDoc.Save 'oDoc.Close End If End Sub '-------------------- alles nachfolgende, um iProp zu lesen / schreiben ------ ' (kein guter Stil, gerade im Hinblick auf die Möglichkeiten mit vb.net ' alles nur schnell aus VBA kopiert und hier zum laufen gebracht ' z.B. "On Error" sollte nicht mehr verwendet werden) Public Enum iPropSetNameEnum ' im Grunde hier überflüssig, hilft nur in VBA mit Intellisense IVSumInfo = 1 DocSumInfo = 2 DesignTrackProp = 3 UserDefProp = 4 End Enum Public Function ReadiProperty(ByRef doc As Document , _ ByRef PropertyName As String, Optional PropSet As iPropSetNameEnum = 0& ) As Object 'Wert aus iProp lesen ' aus beliebiegem PropertySet ' erstes gefundenes Element wird zurückgegeben (sollten mehrere existieren) ' wird der Name in keinem Set gefunden, Rückgabe -> "" ' Optional: PropSetName: Es wird nur in dem angegebenen PropSet gesucht 'Default-Rückgabewert (wenn Prop nicht existiert) ReadiProperty = "" 'Optional PropSet auswerten Dim bAllSets As Boolean, PropSetName As String If 0 = PropSet Then bAllSets = True Else bAllSets = False PropSetName = Get_iPropSetName(PropSet) End If Dim bSetFound As Boolean 'für Info, ob angegebenes Set gefunden wurde bSetFound = False Dim prop As Inventor.Property Dim customPropSet As PropertySet 'Set customPropSet = Doc.PropertySets.Item("Inventor User Defined Properties") For Each customPropSet In doc.PropertySets 'Schleife durch alle PropSets If bAllSets Or customPropSet.Name = PropSetName Then bSetFound = True ' Get the existing property, if it exists. On Error Resume Next prop = customPropSet.Item(PropertyName) ' Check to see if the above call failed. If it failed then the property doesn't exist. If Err.Number <> 0 Then ' Failed to get the existing property Else 'Prop existiert, Wert lesen ReadiProperty = prop.Value Exit For End If On Error Goto 0 'setzt auch Err zurück End If Next 'propSet 'Auswertung bei angegebenem PropSet If Not bAllSets Then If bSetFound Then 'angegebenes Set wurde gefunden Else 'angegebenes Set wurde NICHT gefunden MsgBox( "Das gesuchte iProperty " & vbCrLf _ & vbTab & PropertyName & vbCrLf _ & "konnte nicht gefunden werden, weil schon das angegebene Prop.Set" & vbCrLf _ & vbTab & PropSetName & vbCrLf _ & "nicht existiert!", vbInformation, "Info") End If End If 'Aufräumen (ergänzt) On Error Goto 0 customPropSet = Nothing prop = Nothing End Function Private Function Get_iPropSetName(e As iPropSetNameEnum) As String ' das ist der Versuch die Propsets greifbar zu machen ' in Verbindung mit obigem Enumerator ' 'KraBBy 15.10.2018 Const IVSumInfo As String = "Inventor Summary Information" Const DocSumInfo As String = "Inventor Document Summary Information" Const DesignTrackProp As String = "Design Tracking Properties" Const UserDefProp As String = "Inventor User Defined Properties" Select Case e Case iPropSetNameEnum.DesignTrackProp Get_iPropSetName = DesignTrackProp Case iPropSetNameEnum.DocSumInfo Get_iPropSetName = DocSumInfo Case iPropSetNameEnum.IVSumInfo Get_iPropSetName = IVSumInfo Case iPropSetNameEnum.UserDefProp Get_iPropSetName = UserDefProp Case Else 'sollte nicht auftreten MsgBox( "vmtl. Fehler in Code!" & vbCrLf _ & "Case Else in Function Get_iPropSetName", vbCritical, "Fehler!?") Get_iPropSetName = "" End Select End Function Public Function WriteiProperty(ByRef doc As Document , _ ByRef PropertyName As String, PropVal as Object, Optional PropSet As iPropSetNameEnum = 0& ) As Boolean 'Wert in iProp schreiben ' in beliebiegem PropertySet ' erstes gefundenes Element wird beschrieben (sollten mehrere existieren) ' wird der Name in keinem Set gefunden, Rückgabe -> False ' Optional: PropSetName: Es wird nur in dem angegebenen PropSet gesucht 'Default-Rückgabewert (wenn Prop nicht existiert) WriteiProperty = False 'Optional PropSet auswerten Dim bAllSets As Boolean, PropSetName As String If 0 = PropSet Then bAllSets = True Else bAllSets = False PropSetName = Get_iPropSetName(PropSet) End If Dim bSetFound As Boolean 'für Info, ob angegebenes Set gefunden wurde bSetFound = False Dim prop As Inventor.Property Dim customPropSet As PropertySet For Each customPropSet In doc.PropertySets 'Schleife durch alle PropSets If bAllSets Or customPropSet.Name = PropSetName Then bSetFound = True ' Get the existing property, if it exists. On Error Resume Next prop = customPropSet.Item(PropertyName) ' Check to see if the above call failed. If it failed then the property doesn't exist. If Err.Number <> 0 Then ' Failed to get the existing property Else 'Prop existiert, Wert schreiben prop.Value = PropVal WriteiProperty = True Exit For End If On Error Goto 0 'setzt auch Err zurück End If Next 'propSet 'Auswertung bei angegebenem PropSet If Not bAllSets Then If bSetFound Then 'angegebenes Set wurde gefunden Else 'angegebenes Set wurde NICHT gefunden MsgBox( "Das gesuchte iProperty " & vbCrLf _ & vbTab & PropertyName & vbCrLf _ & "konnte nicht gefunden werden, weil schon das angegebene Prop.Set" & vbCrLf _ & vbTab & PropSetName & vbCrLf _ & "nicht existiert!", vbInformation, "Info") End If End If 'Aufräumen On Error Goto 0 customPropSet = Nothing prop = Nothing End Function
------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|