| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: Blattgröße aus IDW auslesen und in IAM/IPT-iProperties eintragen (mit iLogic)? (1020 / mal gelesen)
|
luziano Mitglied
Beiträge: 164 Registriert: 03.02.2005 IV 2016, 2018, 2020, 2023 2024 WIN10(64) Q9450, 32GB Quadro K4200
|
erstellt am: 25. Feb. 2021 10:36 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ein (neuer) Kunde benötigt aus den IDWs die Blattgröße in der zugehörigen IAM/IPT. Da wir das nun nicht alles von Hand eintragen möchten die Frage: Kann ich (z.B. via iLogic) in der zur IAM bzw. IPT gehörenden IDW diesen Wert auslesen und als iProperty in die IAM bzw. IPT eintragen? Möglichst ohne die Zeichnung zu öffnen... Hinweis: Dateiname der IDW ist gleich dem der IAM/IPT. Meine Vorstellung: iLogic könnte den Dateinamen (z.B. ABCDEF.IAM) der IAM/IPT ermitteln und schauen, ob es eine ABCDEF.IDW gibt im gleichen Verzeichnis und dann dort in den Werten "rumschnüffeln"... Hab leider bisher zu wenig mit iLogic gemacht um das beurteilen zu können. DANKE für Ideen/Hinweise/Lösungsvorschläge!!! Ludger Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RolandD Mitglied
Beiträge: 559 Registriert: 07.01.2005 i7-9700k 32GB DDR4-RAM Nvidia RTX 2060 SSD 970 m.2 Win10-64 (21H2) AIP 2020.3 Dell U3417W
|
erstellt am: 25. Feb. 2021 11:45 <-- editieren / zitieren --> Unities abgeben: Nur für luziano
Hallo Ludger, du könntest mit dem Apprentice Server arbeiten, da kann auf Dateien zugegriffen werden, ohne diese zu öffnen. In der IDW die Eigenschaft oDoc.Sheets.Item(1).Size abfragen. Für DIN-A3 erhältst du kA3DrawingSheetSize. Danach das Benutzer iProperty in der IPT oder IAM entsprechend schreiben. (Was passiert, wenn mehrere Sheets vorhanden sind und die verschiedene Größen haben?) Edit: Link ergänzt Infos gibt es z.B. hier zum Nachlesen ------------------ Gruß Roland [Diese Nachricht wurde von RolandD am 25. Feb. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 721 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 25. Feb. 2021 12:10 <-- editieren / zitieren --> Unities abgeben: Nur für luziano
Mein Vorschlag wäre, eine (externe?) iLogic-Regel, die in der Zeichnung ausgelöst wird (z.B. beim Speichern). Blattgröße aus der von Roland genannten Eigenschaft lesen und die Info in das referenzierte Dokument (ipt oder iam; oDoc.ReferencedDocuments.Item(1) ) schreiben. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 721 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 25. Feb. 2021 14:13 <-- editieren / zitieren --> Unities abgeben: Nur für luziano
mein Vorschlag ausgearbeitet: Code: 'iLogic-Regel für die Zg.Datei, evtl. auch als externe RegelAddVbFile "iProp_RW.vb" Sub Main() Dim oDoc As Document 'so könnten auch alle geöffneten Dokumente durchlaufen werden For Each oDoc In ThisApplication.Documents If oDoc.DocumentType = Inventor.DocumentTypeEnum.kDrawingDocumentObject Then 'Call IDW_Formatlesen(oDoc) Else : 'nix End If Next 'hier der einfache Aufruf, nur für das aktive Dokument oDoc = ThisApplication.ActiveDocument If oDoc.DocumentType = Inventor.DocumentTypeEnum.kDrawingDocumentObject Then Call IDW_Formatlesen(oDoc) End Sub Private Sub IDW_Formatlesen(oDoc As DrawingDocument) Dim oRefDoc As Document If Not 0 = oDoc.ReferencedDocuments.Count Then oRefDoc = oDoc.ReferencedDocuments.Item(1) 'Ich nehme hier immer das erste Dokument, auch wenn es mehrere gäbe! ' 'Wenn es Zg. mit mehreren ref.Dokuments gibt, müsste man über die Logik nachdenken 'das iProperty für jedes dieser Dokumente befüllen? Else 'kein referenziertes Dokument ' dann gibts wohl auch nix zu tun ' ggf. MsgBox ... Exit Sub End If Dim sSheetSize As String 'der Text für das iProp mit der "lesbaren Größe" sSheetSize = getSheetSize(oDoc.ActiveSheet) 'hier beschränke ich mich auf das aktive Blatt, auch wenn es mehrere gäbe! 'in iProp schreiben Call WriteiProperty(oRefDoc, "Blattformat", sSheetSize, iProp.iPropSetNameEnum.UserDefProp) 'nur zur Kontrolle, das iProp. wieder lesen (nach Test die Zeilen auskommentieren) Dim tmp tmp = ReadiProperty(oRefDoc, "Blattformat", 4) MsgBox (tmp,,"iProp. Blattformat") End Sub Private Function getSheetSize(oDrwSheet As Sheet) As String 'liefert die Blattgröße als String, z.B. "A3" Dim sSheetSize As String Select Case oDrwSheet.Size Case kA0DrawingSheetSize sSheetSize = "A0" Case kA1DrawingSheetSize sSheetSize = "A1" Case kA2DrawingSheetSize sSheetSize = "A2" Case kA3DrawingSheetSize sSheetSize = "A3" Case kA4DrawingSheetSize sSheetSize = "A4" Case Else sSheetSize = "?" MsgBox ("wtf?", , "SheetSize") End Select Return sSheetSize 'Rückgabewert der Fkt. End Function
In dem File "iProp_RW.vb" (das in einem Verz. für externe iLogic-Regeln liegen muss), habe ich Regeln, um iProperties zu lesen und schreiben.
Code: ' <IsStraightVb>True</IsStraightVb> ' <FireOthersImmediately>False</FireOthersImmediately> ' <SilentOperation>False</SilentOperation>Imports Inventor Module iProp '-------------------- alles nachfolgende, um iProp zu lesen / schreiben ------ ' (kein guter Stil, gerade im Hinblick auf die Moeglichkeiten 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 ueberfluessig, 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 zurueckgegeben (sollten mehrere existieren) ' wird der Name in keinem Set gefunden, Rueckgabe -> "" ' Optional: PropSetName: Es wird nur in dem angegebenen PropSet gesucht 'Default-Rueckgabewert (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 'fuer 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 zurueck 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 'Aufraeumen 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, Rueckgabe -> False ' Optional: PropSetName: Es wird nur in dem angegebenen PropSet gesucht ' wird das PropSet UserDefProp angegeben, wird das Property ggf. auch erstellt 'Default-Rueckgabewert (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 'fuer 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 On Error Goto 0 If PropSet = iPropSetNameEnum.UserDefProp Then 'iProp erstellen prop = customPropSet.Add(PropVal, PropertyName) WriteiProperty = True Else: 'nix tun End If 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 End Module
------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 721 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 25. Feb. 2021 14:21 <-- editieren / zitieren --> Unities abgeben: Nur für luziano
sorry, erst jetzt lese ich "Möglichst ohne die Zeichnung zu öffnen..." da bin jetzt wohl in die falsche Richtung gelaufen (also nicht zu viel Zeit verschwenden mit dem Code oben) Ich kann mir aber auch vorstellen, dass Deine Vorstellung funktioniert ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rkauskh Moderator Dipl.-Ing. (FH) Versorgungstechnik
Beiträge: 2630 Registriert: 15.11.2006 Windows 10 x64, AIP 2020-2025
|
erstellt am: 26. Feb. 2021 13:15 <-- editieren / zitieren --> Unities abgeben: Nur für luziano
Hallo @KraBBy Auch ein Apprentice Server öffnet die Zeichnung, um iProps zu schreiben. Von daher finde ich deinen Vorschlag den Weg umzudrehen richtig, wenn es keinen triftigen Grund für die ursprüngliche Ablaufrichtung gibt. Alle erforderlichen Dokumente sind zu dem Zeitpunkt sowieso geöffnet und nach dem Speichern ändert sich die Blattgröße nicht mehr. ------------------ MfG Ralf RKW Solutions GmbH www.RKW-Solutions.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 721 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 26. Feb. 2021 16:50 <-- editieren / zitieren --> Unities abgeben: Nur für luziano
Vermutlich geht der Wunsch die Richtung: ein Aufruf von der obersten Baugruppe aus, alle UnterBG und Einzelteile durchlaufen, prüfen ob eine Zg existiert, ggf Format auslesen und in iProp vom 3dModell schreiben. mE geht das, vielleicht ein paar mehr Fallstricke (virtuelle Komponenten, Normteile, schreibgeschützte Dokumente weil wiederverwendet, kA was noch alles) Bei meinem Vorschlag muss jede Zg. geöffnet werden. Vielleicht kann man da noch etwas weiter automatisieren: liegen alle fraglichen Zg in einem Verzeichnis oder einer Verz.-Struktur? Das könnte man durchsuchen und alle idw öffnen... ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
luziano Mitglied
Beiträge: 164 Registriert: 03.02.2005 IV 2016, 2018, 2020, 2023 2024 WIN10(64) Q9450, 32GB Quadro K4200
|
erstellt am: 26. Feb. 2021 17:45 <-- editieren / zitieren --> Unities abgeben:
|
luziano Mitglied
Beiträge: 164 Registriert: 03.02.2005 IV 2016, 2018, 2020, 2023 2024 WIN10(64) Q9450, 32GB Quadro K4200
|
erstellt am: 26. Feb. 2021 17:49 <-- editieren / zitieren --> Unities abgeben:
...und nach einigem Nachdenken: Es ist vermutlich sogar sinnvoll die Blattgröße in der geöffneten Zeichnung auszulesen und sie dann in die Bauteile einzutragen. So ist der Wert immer aktuell - was umgekehrt nicht zwingend gegeben ist wenn die Zeichnung geändert und das Modell nicht gleich aktualisiert wird. Sowohl bei der Zeichnungserstellung wie auch bei (Blattgröße-)Änderungen ist sie ja eh offen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|