| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Ausgabe dxf, pdf -> Dateiname aus iproperties (3011 mal gelesen)
|
Claus59 Mitglied selbständiger Konstrukteur
Beiträge: 9 Registriert: 20.11.2013
|
erstellt am: 20. Nov. 2013 11:03 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich bin neu und habe keine Programmiererfahrung in VBA, jedoch etwas in Basic. Mein Anliegen ist es eine Zeichnung (IDW) als DXF und PDF auszugeben, wobei sich der Dateiname aus den iProperties getrennt von Bindestichen zusammensetzt.(Denn jeder Kunde will etwas anderes) Also: <Projekt>-<Bezeichnung>-<Revisionsnummer>.DXF => B52246-100-02.DXF oder <Benutzerdefinierte Eigenschaft>-<Projekt>-<Bezeichnung>-<Revisionsnummer>.DXF => 8174357-B52246-100-02.DXF Ausprobiert habe ich das Macro "Zeichnung in dxf, pdf und dwfx mit einem Makro ausgeben" Das hat super funktioniert! Leider habe ich kein Beispiel gefunden, wie man an die iProperties gelangt. Für etwas Hilfe, oder einen hilfreichen Link wäre ich dankbar. Grüße
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: 20. Nov. 2013 11:22 <-- editieren / zitieren --> Unities abgeben: Nur für Claus59
Moin Mal eben aus der Hilfe geklaut: Code: Public Sub GetPropertySample() ' Get the active document. Dim invDoc As Document Set invDoc = ThisApplication.ActiveDocument ' Get the design tracking property set. Dim invDesignInfo As PropertySet Set invDesignInfo = invDoc.PropertySets.Item("Design Tracking Properties") ' Get the part number property. Dim invPartNumberProperty As Property Set invPartNumberProperty = invDesignInfo.Item("Part Number") MsgBox "Part Number: " & invPartNumberProperty.value End Sub
Für die passenden Properties und PropertySets entweder googlen oder im VBA-Editor einen Haltepunkt auf die letzte Zeile und eine Überwachung für invDoc einfügen und im Strukturbaum der Überwachung nach unten hangeln. ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Claus59 Mitglied selbständiger Konstrukteur
Beiträge: 9 Registriert: 20.11.2013
|
erstellt am: 20. Nov. 2013 11:45 <-- editieren / zitieren --> Unities abgeben:
|
axi92 Mitglied Konstrukteur
Beiträge: 685 Registriert: 20.02.2010 Inventor 2014 64bit SP2 Vault Basic 2014 64bit SP1 HP Z200 Win 7 64bit 16GB RAM CPU: i5 3,2GHz GPU: Nvidia Quadro K600
|
erstellt am: 20. Nov. 2013 12:17 <-- editieren / zitieren --> Unities abgeben: Nur für Claus59
|
Claus59 Mitglied selbständiger Konstrukteur
Beiträge: 9 Registriert: 20.11.2013
|
erstellt am: 21. Nov. 2013 09:53 <-- editieren / zitieren --> Unities abgeben:
Hallo, habe gestern noch ziemlich lange mit der "Public Sub GetPropertySample()" probiert. Mit der Überwachung und der Einzelschrittausführung habe ich erst mal gesehen, was für eine Datenflut sich hinter Allem verbirgt. Leider habe ich es nicht hinbekommen meine Stücklisteneinträge (Iproperties) in einer MsgBox auszugeben! Geöffnet habe ich eine Einzelteil.IDW. Wo befinden sich Iproperties? In "invDesignInfo", oder in "invPartNumberProperty", oder in beiden? Mein Eintrag bei Projekt ist zum Beispiel "B4711". Dies müsste ich doch eigentlich in der Überwachung in Klartext unter invDesignInfo.item3.??? sehen und auch abfragen können!? Über nochmalige Hilfe wäre ich dankbar!!! Gruß Claus
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
axi92 Mitglied Konstrukteur
Beiträge: 685 Registriert: 20.02.2010 Inventor 2014 64bit SP2 Vault Basic 2014 64bit SP1 HP Z200 Win 7 64bit 16GB RAM CPU: i5 3,2GHz GPU: Nvidia Quadro K600
|
erstellt am: 21. Nov. 2013 14:32 <-- editieren / zitieren --> Unities abgeben: Nur für Claus59
Wie du oben im Code siehst ist "invDesignInfo" vom Typ "PropertySet" Wiederum "invPartNumberProperty" vom Typ "Property" Ich bin auch noch nicht so weit das ich weiß wie das heißt aber sozusagen das PropertySet ist die Hauptkategorie und Property ist dann das eigentliche Feld. Wo auch der Wert drinnen ist. Um deine Frage zu beantworten wo nun die Informationen sind, eigentlich in beiden aber für dich Logisch in getrenten Values findest du sie in "invPartNumberProperty" da du es ja über invDesignInfo.Item("Part Number") zuweist. Wie kommst du auf "invDesignInfo.item3.???" Item3 existiert nicht. Du musst dir nur die 2 Letzten seiten des pdf anschauen damit kommst du an alle iProperties die es gibt und die du erstellen kannst An den Eintrag "Projekt" würdest du mit
Code: invDesignInfo.Item("Project")
kommen Das geht aber auch nur weil du dich noch in der Kategorie "Design Tracking Properties" befindest (Siehe PDF Seite 11) Da du es ja über Code: Set invDesignInfo = invDoc.PropertySets.Item("Design Tracking Properties")
definiert hast ------------------ Grüße aus Wien Philipp 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: 21. Nov. 2013 19:11 <-- editieren / zitieren --> Unities abgeben: Nur für Claus59
Hallo Ja, die API ist umfangreich, aber leider nie vollständig. PropertySets kann man sich ähnlich einem Aktenordner vorstellen, die mehrere Blätter (iProperties) zu einer logischen Einheit zusammenfassen. Da die PropertySets nicht dem Inhalt der Reiter im iPropertydialog entsprechen, frag ich mich schon lange welche Logik da dahinter steckt. Noch ein Tip, benutzt die ellenlange ID-Nummer, statt dem Namen der PropertySets. Nur falls die Namen in irgendeiner Lokalisierung plötzlich mal auf deutsch dastehen. Und sprich die iProperties nie mit Item(x) an. Die Reihenfolge der Standard-iProps ist zwar seit zig Versionen gleich, das heißt aber nicht das es bleibt. Besser mit Item("Propertyname"). Bei benutzerdefnierten iProps sollte man in einer for-each-Schleife durch alle iProps laufen und jeweils den Namen mit dem gesuchten vergleichen. Den Sinn sieht man spätestens wenn man auf ein nicht vorhandenes iProp zugreifen will. Code: Private Sub iProp()Dim iProp As Property For Each iProp In ThisApplication.ActiveDocument.PropertySets.Item("{D5CDD505-2E9C-101B-9397-08002B2CF9AE}") If iProp.Name = "Suchname" Then iProp.Value = "neuerInhalt" End If Next End Sub
------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Claus59 Mitglied selbständiger Konstrukteur
Beiträge: 9 Registriert: 20.11.2013
|
erstellt am: 22. Nov. 2013 10:19 <-- editieren / zitieren --> Unities abgeben:
Danke für Eure Hilfe! Ich komme dem Ziel langsam näher. Das Auslesen und Anzeigen funktioniert jetzt! Problem ist jetzt noch, das beim Auslesen der Revisionsnummer Dim Rev As Property Set Rev = invDesignInfo.Item("Part Property Revision Id") MsgBox "Rev " & Rev.Value nicht wie in den iProperties eigetragen: Revisionnummer: >> 001 << anzeigt wird, sondern: Rev {9C3495A4-F1D8-4500-A22E-9644F4FCF6FC} Dies seht auch so in der Überwachung unter "Item 11" "Value" Beim durchforsten der vielen Beispiele im Forum bin ich nicht weiter gekommen! Bitte gebt mir noch einen Wink! Danke, Gruß Claus
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
axi92 Mitglied Konstrukteur
Beiträge: 685 Registriert: 20.02.2010 Inventor 2014 64bit SP2 Vault Basic 2014 64bit SP1 HP Z200 Win 7 64bit 16GB RAM CPU: i5 3,2GHz GPU: Nvidia Quadro K600
|
erstellt am: 22. Nov. 2013 11:28 <-- editieren / zitieren --> Unities abgeben: Nur für Claus59
Part Property Revision Id ist auch nicht die Revisions Nummer. Revisionsnummer heißt "Revision Number" Und befindet sich in Inventor Summary Information, {F29F85E0-4FF9-1068-AB91-08002B27B3D9} Versuch das mal:
Code:
Private Sub iProp() Dim test_value As String Set Doc = ThisApplication.ActiveDocument test_value = Doc.PropertySets.item("{F29F85E0-4FF9-1068-AB91-08002B27B3D9}").item("Revision Number").Value MsgBox test_value End Sub
------------------ Grüße aus Wien Philipp Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Claus59 Mitglied selbständiger Konstrukteur
Beiträge: 9 Registriert: 20.11.2013
|
erstellt am: 22. Nov. 2013 13:51 <-- editieren / zitieren --> Unities abgeben:
|
Claus59 Mitglied selbständiger Konstrukteur
Beiträge: 9 Registriert: 20.11.2013
|
erstellt am: 11. Dez. 2013 10:46 <-- editieren / zitieren --> Unities abgeben:
Liebe VBA-Gemeinde, danke für die bisherige Hilfe. Ich habe lange probiert und bin fast am Ziel! Hinbekommen habe ich, die IDW als DXF und PDF mit einem Dateinamen, der sich aus den iProperties zusammensetzt zu exportieren. Was ich nicht hinbekomme, ist die IPT unter gleichem Namen wie die DXF und PDF zu speichern. IPT und IDW sind offen, die IDW ist aktiv im Vordergrund. Als Zugabe wären noch Parameter toll, die die PDF "schwarz" mit 4800DPI" rausschreiben. Danke schon mal im voraus Claus Hier nun mein stümperhafter "Kot": Public Sub Claus_Export() ' Get the active document. Dim invDoc As Document Set invDoc = ThisApplication.ActiveDocument Dim oReferencedDoc As Document Set oReferencedDoc = invDoc.ReferencedDocuments.Item(1) ' Get the design tracking property set. Dim invDesignInfo As PropertySet Set invDesignInfo = oReferencedDoc.PropertySets.Item("Design Tracking Properties") Dim Proj As Property Set Proj = invDesignInfo.Item("Project") 'MsgBox "PPP " & Proj.Value Dim Bla As Property Set Bla = invDesignInfo.Item("Description") 'MsgBox "Bla " & Bla.Value Dim Rev As Property Set Rev = oReferencedDoc.PropertySets.Item("{F29F85E0-4FF9-1068-AB91-08002B27B3D9}").Item("Revision Number") 'MsgBox "Rev " & Rev.Value 'MsgBox Proj.Value & "-" & Bla.Value & "-" & Rev.Value Dim DatName As String DatName = Proj.Value & "-" & Bla.Value & "-" & Rev.Value 'MsgBox DatName Dim oApp As Inventor.Application Set oApp = ThisApplication Dim odoc As Inventor.DrawingDocument Dim osource As String Dim odest As String Dim PosBackSlash As Integer Dim Pfad As String If oApp.ActiveDocument Is Nothing Then Exit Sub End If If oApp.ActiveDocumentType <> kDrawingDocumentObject Then Exit Sub End If Set odoc = oApp.ActiveDocument 'MsgBox odoc osource = odoc.FullFileName PosBackSlash = InStrRev(osource, "\") 'Position des letzten "\" Pfad = Left$(osource, PosBackSlash) MsgBox Pfad & DatName Call odoc.SaveAs(Pfad & DatName & ".dxf", True) Call odoc.SaveAs(Pfad & DatName & ".pdf", True) End Sub 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: 11. Dez. 2013 16:10 <-- editieren / zitieren --> Unities abgeben: Nur für Claus59
Hallo Die IPT speichern sollte mit
Code: Call oReferencedDoc.SaveAs("Pfad_und_neuer_Dateiname_samt_Endung",False)
möglich sein. Die Optionen für den PDF-Export stehen mit der SaveAs-Methode nicht zur Verfügung. Dafür wurden die TranslatorAddIn's vorgesehen. Gib mal in der Programmierhilfe "TranslatorAddIn" ein und such die Ergebniszeile "TranslatorAddIn Object", dann findest du auch Beispielcode. ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Claus59 Mitglied selbständiger Konstrukteur
Beiträge: 9 Registriert: 20.11.2013
|
erstellt am: 11. Dez. 2013 16:48 <-- editieren / zitieren --> Unities abgeben:
Hallo Ralf, danke für Deine Hilfe, aber da muss noch ein kleiner Fehler drin sein, denn es gibt eine Fehlermeldung: Laufzeitfehler 5 Ungültiger Prozeduraufruf oder ungültiges Argument Eingfügt hatte ich Deine Zeile so: Call odoc.SaveAs(Pfad & DatName & ".dxf", True) Call odoc.SaveAs(Pfad & DatName & ".pdf", True) Call oReferencedDoc.SaveAs(Pfad & DatName & ".ipt", False) Bitte gebt mir noch einen Wink! Grüße aus dem Ambergau, Claus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Claus59 Mitglied selbständiger Konstrukteur
Beiträge: 9 Registriert: 20.11.2013
|
erstellt am: 11. Dez. 2013 17:40 <-- editieren / zitieren --> Unities abgeben:
Hallo Ralf, ich habe noch etliches probiert und festgestellt, dass Deine Programmzeile beim ersten Mal funktioniert! Aber, wenn ich die erstellten Dateien lösche und die Dateien ein zweites Mal rausschreiben möchte kommt die Fehlermeldung. PDF und DXF werden noch rausgeschrieben, bei der IPT wird abgebrochen! Schließe ich IDW und IPT und öffne beide danach wieder, klappt das rausschreiben 1 mal. Call oReferencedDoc.SaveAs(Pfad & DatName & ".ipt", False) Kann es sein, dass "SaveAs" die gleiche Wirkung hat, als wenn ich in Inventor den Befehl anklicke "Speichern unter"??? Gruß Claus 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: 11. Dez. 2013 19:27 <-- editieren / zitieren --> Unities abgeben: Nur für Claus59
Hallo SaveAs ist, je nach Einstellung True/False das gleiche wie Speichern unter bzw. Kopie speichern unter. Bei dem einen bleibt das Original geöffnet und beim anderen schließt Inventor das Original und öffnet die Kopie. Kann mir nur nie merken welche Option was bewirkt. Mach mal testweise ein True aus dem False. ------------------ MfG Ralf Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Claus59 Mitglied selbständiger Konstrukteur
Beiträge: 9 Registriert: 20.11.2013
|
erstellt am: 12. Dez. 2013 08:50 <-- editieren / zitieren --> Unities abgeben:
|