| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | Auf dem Weg zur digitalen Auftragsmappe. , ein Anwenderbericht
|
Autor
|
Thema: DWG Eportregel Blattname ändern (972 / mal gelesen)
|
Klingone1234 Mitglied
Beiträge: 14 Registriert: 08.11.2023
|
erstellt am: 08. Nov. 2023 11:30 <-- editieren / zitieren --> Unities abgeben:
Hallo ich bin neu hier , verfolge aber viele Foren zum Thema Inventor. Jetzt habe ich selber ein Thema, wo ich Hilfe bräuchte: Ich möchte eine DWG-Eportregel schreiben. Bei einem Export über "Datei" erstellt Inventor bei mehreren Blätter immer "Zeichnungsnummer":Blatt01" usw. Ich möchte das aber mit einer Exportregel ändern in "Zeichnungsnummer_01" usw. In dieser regel sollte auch noch der Pdf expor stehen Kann mir da jemand helfen? Klingone1234 [Diese Nachricht wurde von Klingone1234 am 08. Nov. 2023 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: 08. Nov. 2023 13:08 <-- editieren / zitieren --> Unities abgeben: Nur für Klingone1234
Zunächst eine etwas naive Frage: Ist hier Hilfe zur Selbsthilfe gefragt, oder soll die fertige Lösung da stehen? Zum Einstieg das Save as DWG Translator Sample API Sample. Das ist VBA Code, aber der funktioniert leicht abgewandelt auch als iLogic. btw warum muss es eine iLogic-Regel sein? (um diese Anwendung zu basteln, fände ich VBA vorteilhafter insbesondere durch die Debugging-Möglichkeiten) Die Optionen für den DWG-Export muss man sich einmal im Dialogfeld zusammenbasteln und mit "Konfiguration speichern" als ini-File abspeichern. Dieses File wird dann der API an die Hand gegeben (siehe API Sample). Das mit den Blättern funktioniert mE nur "zu Fuß". In den Optionen muss man "Alle Blätter" abwählen, so dass je nur das aktive Blatt exportiert wird. Der Code muss dann in einer Schleife alle Blätter einzeln aktivieren und exportieren. Dabei lässt sich der Dateiname jeweils indivduell festlegen. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Klingone1234 Mitglied
Beiträge: 14 Registriert: 08.11.2023
|
erstellt am: 08. Nov. 2023 13:20 <-- editieren / zitieren --> Unities abgeben:
Danke für die Anwtort. Ich bin bin grad dabei, mir VBA anzueignen und möchte dazu eine Regel zum PDF und DWG Export schreiben, wo ich dann die Blattnamen angepaßt herausbekomme. In meinem alten Betrieb war das alles schon fertig, aber jetzt muss ich von Grund auf alles selbst machen und das System aufziehen. Dabei möchte ich auch alle Regeln, die ich so brauche in iLogic und VBA schreiben und bräuchte dafür etwas Hilfe. 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: 08. Nov. 2023 15:03 <-- editieren / zitieren --> Unities abgeben: Nur für Klingone1234
Hier ein erster Wurf. Ausgehend vom Sample habe ich einen Aufruf dafür geschrieben. Frag bitte nach, wenn ich etwas genauer erklären soll! Wenn man diesen Code in ein Modul der Default.ivb kopiert, steht er im IV immer zur Verfügung. Für das Sub "PublishDWG_eachSheet" kann man sich einen Button auf die Benutzeroberfläche legen.
Code: Option Explicit 'erzwingt, dass jede Variable deklariert werden muss Sub PublishDWG_eachSheet()
Dim oDoc As DrawingDocument Set oDoc = ThisApplication.ActiveDocument 'Speicherort Dim sPath As String sPath = "C:\temp\DWG\" 'hier als Zentraler Speicherort ausgeführt, könnte genauso der Pfad vom aktiven Dok. sein ' Das Verzeichnis muss existieren, sonst tritt ein Fehler auf (beim eigentlichen Export)! 'Dateiname Dim sFileName As String sFileName = oDoc.fullFilename If "" = sFileName Then MsgBox "Datei noch nicht gespeichert!" sFileName = "BlaBlub" 'kA, oder abbrechen End If sFileName = GetFileName(sFileName) 'ohne Pfad und Dateiendung, Fkt. siehe unten 'Abhängig von der Blattanzahl If oDoc.Sheets.Count = 1 Then Call PublishDWG_activeSheet(sPath, sFileName, oDoc) 'Aufruf für das Sub unten 'Dateiname ohne Blatt ElseIf oDoc.Sheets.Count > 1 Then Dim oSheet As Sheet, oLastActiveSheet As Sheet Dim i As Integer, sFNinklBlatt As String i = 1 Set oLastActiveSheet = oDoc.ActiveSheet 'aktives Blatt merken For Each oSheet In oDoc.Sheets oSheet.Activate sFNinklBlatt = sFileName & "_" & Format(i, "00") 'BlattNr. zweistellig If Not oSheet.ExcludeFromPrinting Then 'nur exportieren, wenn das Blatt auch gedruckt wird (also NICHT auf "nicht drucken" steht) Call PublishDWG_activeSheet(sPath, sFNinklBlatt, oDoc) Else 'nix tun End If i = i + 1 Next 'oSheet oLastActiveSheet.Activate 'zu Beginn akt. Blatt erneut aktivieren Else MsgBox "Das sollte nicht vorkommen!" Exit Sub End If End Sub ' Save as DWG Translator Sample API Sample ' https://help.autodesk.com/view/INVNTOR/2020/ENU/?guid=GUID-E63CAEA6-9977-4640-A73A-B0BD19D2503C ' ### angepasst, so dass die wichtigsten Parameter beim Aufruf übergeben werden ### Private Sub PublishDWG_activeSheet(sPath As String, sFileName As String, Optional oDocument As Document) ' sPath : Pfad für die exportierte Datei, mit "\" am Ende! ' sFilename : Dateiname für die exportierte Datei, ohne Dateiendung! ' oDocument : das zu exportierende Dokument, Optional, ggf. wird das aktive Dokument verwendet ' Get the DWG translator Add-In. Dim DWGAddIn As TranslatorAddIn Set DWGAddIn = ThisApplication.ApplicationAddIns.ItemById("{C24E3AC2-122E-11D5-8E91-0010B541CD80}") 'Set a reference to the active document (the document to be published). 'Dim oDocument As Document If oDocument Is Nothing Then 'weil optionaler Parameter Set oDocument = ThisApplication.ActiveDocument Else 'nix weiter tun End If Dim oContext As TranslationContext Set oContext = ThisApplication.TransientObjects.CreateTranslationContext oContext.Type = kFileBrowseIOMechanism ' Create a NameValueMap object Dim oOptions As NameValueMap Set oOptions = ThisApplication.TransientObjects.CreateNameValueMap ' Create a DataMedium object Dim oDataMedium As DataMedium Set oDataMedium = ThisApplication.TransientObjects.CreateDataMedium ' Check whether the translator has 'SaveCopyAs' options If DWGAddIn.HasSaveCopyAsOptions(oDocument, oContext, oOptions) Then Dim strIniFile As String strIniFile = "C:\temp\DWGOut.ini" '#### Datei muss existieren und die Optionen enthalten! ua. "All sheets = no" o.ä. ' Create the name-value that specifies the ini file to use. oOptions.value("Export_Acad_IniFile") = strIniFile End If 'Set the destination file name 'oDataMedium.FileName = "c:\temp\dwgout.dwg" oDataMedium.FileName = sPath & sFileName & ".dwg" 'Publish document. Call DWGAddIn.SaveCopyAs(oDocument, oContext, oOptions, oDataMedium) End Sub 'Hilfsfkt. Function GetFileName(sDatei_m_Pfad_u_Endung As String) As String 'liefert den Dateinamen ohne Pfad und Dateiendung 'ausgehend vom vollständigen Dateinamen (inkl. Pfad und Endung) 'rein text-basiert. keine Prüfung, ob Dateiexistiert oä. ' Pfad muss nicht enthalten sein ' der Dateiname darf mehrere Punkte enthalten (es wird nur der Text samt dem letzten Punkt entfernt) ' ' Sonderfälle: ' Eingabe "" -> Rückgabe "" ' kein \ enthalten -> es wird die Dateiendung entfernt ' kein . enthalten -> es wird am Ende nichts entfernt ' kein . nach dem letzten \ aber vorher -> liefert alles nach dem letzten \ ' GetFileName = "" 'Default-Rückgabewert If sDatei_m_Pfad_u_Endung = "" Then Exit Function Dim s As String s = sDatei_m_Pfad_u_Endung 'nur damit nicht der lange VarName mitgeschleppt werden muss Dim lSlash As Long lSlash = InStrRev(s, "\") 'Index von dem letzten BackSlash 'sollte keiner vorhanden sein, ist das im weiteren kein Problem (lSlash=0, später je +1) Dim lDot As Long lDot = InStrRev(s, ".") 'index vom letzten Punkt Dim sReturn As String 'wird am Ende zurückgegeben If lDot = 0 Then 'kein Punkt enthalten! sReturn = Mid$(s, lSlash + 1) 'am Ende nichts entfernen ElseIf lDot < lSlash Then 'Punkt VOR dem letzten Backslash (also im Pfad) sReturn = Mid$(s, lSlash + 1) 'am Ende nichts entfernen Else 'Standardfall: Punkt enthalten, nach dem letzten Backslash sReturn = Mid$(s, lSlash + 1, lDot - lSlash - 1) '+1: Slash soll nicht enthalten sein '-1: Punkt soll nicht enthalten sein End If GetFileName = sReturn 'Rückgabewert der Function End Function
Da stecken jetzt schon jede Menge Annahmen drin: Pfad der Exporte? Zentrales Verzeichnis (*) oder abhängig vom Speicherort des aktiven Dokuments? Dateiname? "Zeichnungsnummer" ist das der Dateiname des aktiven Dokuments (*)? oder ein iProperty? Woher soll die angehängte Blattnummer kommen? Vom Namen des Blattes? Oder einfach hochzählen (*)? Muss die Blatteigenschaft "nicht drucken" berücksichtigt werden? (so dass diese Blätter nicht exportiert werden) (*) Wenn der Dateiname schon existiert, wird per Default ohne Warnung überschrieben (*). Wenn nicht überschrieben werden kann (z.B. Datei geöffnet), gibt es eine Fehlermeldung. Soll nachgefragt werden, bevor überschrieben wird? Mit welchen Optionen? (*) soll heißen, dass diese Variante derzeit im Code enthalten ist Für den Export von PDF gibt es auch ein Beispiel. Wenn der Code soweit verstanden wurde, könntest Du das Bespiel ähnlich anpassen und einen Aufruf dafür schreiben. Das könnte einfacher ausfallen, weil das Gehampel mit den Blättern entfällt (sofern alle Blätter in einem pdf landen dürfen). ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Klingone1234 Mitglied
Beiträge: 14 Registriert: 08.11.2023
|
erstellt am: 08. Nov. 2023 16:23 <-- editieren / zitieren --> Unities abgeben:
|
Klingone1234 Mitglied
Beiträge: 14 Registriert: 08.11.2023
|
erstellt am: 09. Nov. 2023 10:24 <-- editieren / zitieren --> Unities abgeben:
Ich hab mit den code mal angesehen und denke, dass er zu kompliziert für mich ist. Ich möchte einfach nur einen Export von dateiname_Blatt01 in ...01 usw in DWG im selber Odner und PDF mit allen Blättern in eins. Keine Ausnahmen nichts komplziertes.Keine MSGbox Da ich leider nicht so firm in programieren bin, kann ich die Hälfte des Codes gar nicht zuornen. Bis dahin habe ich noch einen weiten Weg vor mir. Danke 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: 09. Nov. 2023 12:54 <-- editieren / zitieren --> Unities abgeben: Nur für Klingone1234
na dann ans Werk! Folgend ein Update: Speicherort ist nun der Ort der aktiven Zg. Die Zg. muss gespeichert sein (sonst gibt es keinen Speicherort), ich breche das Makro dann ab. Pdf fehlt noch. Bekommst Du das zum Laufen? Code: Option Explicit 'erzwingt, dass jede Variable deklariert werden mussSub PublishDWG_eachSheet() Dim oDoc As DrawingDocument Set oDoc = ThisApplication.ActiveDocument 'Dateiname Dim sFileName As String sFileName = GetFileName(oDoc.fullFilename) 'ohne Pfad und Dateiendung, Fkt. siehe unten If "" = sFileName Then MsgBox "Datei noch nicht gespeichert!", vbInformation, "abgebrochen" ' Wo soll jetzt gespeichert werden? ' unter welchem Dateinamen? ' könnte man festlegen, oder auch den User fragen -> FileDialog Object Exit Sub 'ich breche hier ab End If 'Speicherort Dim sPath As String sPath = getPathName(oDoc.fullFilename) ' Pfad vom aktiven Document ' Das Verzeichnis muss existieren, sonst tritt ein Fehler auf (beim eigentlichen Export)! Dim oLastActiveSheet As Sheet Set oLastActiveSheet = oDoc.ActiveSheet 'aktives Blatt merken 'Schleife über alle Blätter: Namen zusammensetzen und exportieren Dim oSheet As Sheet, i As Integer, sFNinklBlatt As String i = 1 For Each oSheet In oDoc.Sheets oSheet.Activate sFNinklBlatt = sFileName & "_" & Format(i, "00") 'BlattNr. zweistellig If Not oSheet.ExcludeFromPrinting Then 'nur exportieren, wenn das Blatt auch gedruckt wird (also NICHT auf "nicht drucken" steht) Call PublishDWG_activeSheet(sPath, sFNinklBlatt, oDoc) Else 'nix tun End If i = i + 1 Next 'oSheet oLastActiveSheet.Activate 'zu Beginn akt. Blatt erneut aktivieren End Sub ' Save as DWG Translator Sample API Sample ' https://help.autodesk.com/view/INVNTOR/2020/ENU/?guid=GUID-E63CAEA6-9977-4640-A73A-B0BD19D2503C ' ### angepasst, so dass die wichtigsten Parameter beim Aufruf übergeben werden ### Private Sub PublishDWG_activeSheet(sPath As String, sFileName As String, Optional oDocument As Document) ' sPath : Pfad für die exportierte Datei, mit "\" am Ende! ' sFilename : Dateiname für die exportierte Datei, ohne Dateiendung! ' oDocument : das zu exportierende Dokument, Optional, ggf. wird das aktive Dokument verwendet ' Get the DWG translator Add-In. Dim DWGAddIn As TranslatorAddIn Set DWGAddIn = ThisApplication.ApplicationAddIns.ItemById("{C24E3AC2-122E-11D5-8E91-0010B541CD80}") 'Set a reference to the active document (the document to be published). 'Dim oDocument As Document If oDocument Is Nothing Then 'weil optionaler Parameter Set oDocument = ThisApplication.ActiveDocument Else 'nix weiter tun End If Dim oContext As TranslationContext Set oContext = ThisApplication.TransientObjects.CreateTranslationContext oContext.Type = kFileBrowseIOMechanism ' Create a NameValueMap object Dim oOptions As NameValueMap Set oOptions = ThisApplication.TransientObjects.CreateNameValueMap ' Create a DataMedium object Dim oDataMedium As DataMedium Set oDataMedium = ThisApplication.TransientObjects.CreateDataMedium ' Check whether the translator has 'SaveCopyAs' options If DWGAddIn.HasSaveCopyAsOptions(oDocument, oContext, oOptions) Then Dim strIniFile As String strIniFile = "C:\temp\DWGOut.ini" '#### Datei muss existieren und die Optionen enthalten! ua. "All sheets = no" o.ä. ' Create the name-value that specifies the ini file to use. oOptions.value("Export_Acad_IniFile") = strIniFile End If 'Set the destination file name 'oDataMedium.FileName = "c:\temp\dwgout.dwg" oDataMedium.FileName = sPath & sFileName & ".dwg" 'Publish document. Call DWGAddIn.SaveCopyAs(oDocument, oContext, oOptions, oDataMedium) End Sub 'Hilfsfkt. Function GetFileName(sDatei_m_Pfad_u_Endung As String) As String 'liefert den Dateinamen ohne Pfad und Dateiendung 'ausgehend vom vollständigen Dateinamen (inkl. Pfad und Endung) 'rein text-basiert. keine Prüfung, ob Dateiexistiert oä. ' Pfad muss nicht enthalten sein ' der Dateiname darf mehrere Punkte enthalten (es wird nur der Text samt dem letzten Punkt entfernt) ' ' Sonderfälle: ' Eingabe "" -> Rückgabe "" ' kein \ enthalten -> es wird die Dateiendung entfernt ' kein . enthalten -> es wird am Ende nichts entfernt ' kein . nach dem letzten \ aber vorher -> liefert alles nach dem letzten \ ' GetFileName = "" 'Default-Rückgabewert If sDatei_m_Pfad_u_Endung = "" Then Exit Function Dim s As String s = sDatei_m_Pfad_u_Endung 'nur damit nicht der lange VarName mitgeschleppt werden muss Dim lSlash As Long lSlash = InStrRev(s, "\") 'Index von dem letzten BackSlash 'sollte keiner vorhanden sein, ist das im weiteren kein Problem (lSlash=0, später je +1) Dim lDot As Long lDot = InStrRev(s, ".") 'index vom letzten Punkt Dim sReturn As String 'wird am Ende zurückgegeben If lDot = 0 Then 'kein Punkt enthalten! sReturn = Mid$(s, lSlash + 1) 'am Ende nichts entfernen ElseIf lDot < lSlash Then 'Punkt VOR dem letzten Backslash (also im Pfad) sReturn = Mid$(s, lSlash + 1) 'am Ende nichts entfernen Else 'Standardfall: Punkt enthalten, nach dem letzten Backslash sReturn = Mid$(s, lSlash + 1, lDot - lSlash - 1) '+1: Slash soll nicht enthalten sein '-1: Punkt soll nicht enthalten sein End If GetFileName = sReturn 'Rückgabewert der Function End Function Function getPathName(sDatei_m_Pfad_u_Endung As String) As String 'liefert den Pfad ohne Dateiname und Dateiendung 'ausgehend vom vollständigen Dateinamen (inkl. Pfad und ggf. Endung) 'rein text-basiert. keine Prüfung, ob Datei oder Pfad existiert oä. ' ' Sonderfälle: ' Eingabe "" -> Rückgabe "" ' kein \ enthalten -> Rückgabe "" ' wird bereits ein Pfad angegeben mit \ am Ende, wird dieser unverändert zurückgegeben ' getPathName = "" 'Default-Rückgabewert If sDatei_m_Pfad_u_Endung = "" Then Exit Function Dim lSlash As Long lSlash = InStrRev(sDatei_m_Pfad_u_Endung, "\") 'Index von dem letzten BackSlash If 0 = lSlash Then Exit Function Dim sReturn As String 'wird am Ende zurückgegeben sReturn = Left$(sDatei_m_Pfad_u_Endung, lSlash) 'Slash am Ende ist enthalten! getPathName = sReturn End Function
------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Klingone1234 Mitglied
Beiträge: 14 Registriert: 08.11.2023
|
erstellt am: 09. Nov. 2023 13:00 <-- editieren / zitieren --> Unities abgeben:
|
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 721 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 09. Nov. 2023 14:35 <-- editieren / zitieren --> Unities abgeben: Nur für Klingone1234
hier nun auch mit PDF. Es kam im Grunde nur das Sub PublishPDF(...) und ein entsprechender Aufruf hinzu. (Außerdem das aufrufende Sub umbenannt und am Ende eine Meldung ergänzt) Lass was hören, wie Du vorankommst! Code: Option Explicit 'erzwingt, dass jede Variable deklariert werden mussSub PublishPDF_DWG_eachSheet() Dim oDoc As DrawingDocument Set oDoc = ThisApplication.ActiveDocument 'Dateiname Dim sFileName As String sFileName = GetFileName(oDoc.fullFilename) 'ohne Pfad und Dateiendung, Fkt. siehe unten If "" = sFileName Then MsgBox "Datei noch nicht gespeichert!", vbInformation, "abgebrochen" ' Wo soll jetzt gespeichert werden? ' unter welchem Dateinamen? ' könnte man festlegen, oder auch den User fragen -> FileDialog Object Exit Sub 'ich breche hier ab End If 'Speicherort Dim sPath As String sPath = getPathName(oDoc.fullFilename) ' Pfad vom aktiven Document ' Das Verzeichnis muss existieren, sonst tritt ein Fehler auf (beim eigentlichen Export)! Dim oLastActiveSheet As Sheet Set oLastActiveSheet = oDoc.ActiveSheet 'aktives Blatt merken 'Schleife über alle Blätter: Namen zusammensetzen und DWG exportieren Dim oSheet As Sheet, i As Integer, sFNinklBlatt As String i = 1 For Each oSheet In oDoc.Sheets oSheet.Activate sFNinklBlatt = sFileName & "_" & Format(i, "00") 'BlattNr. zweistellig If Not oSheet.ExcludeFromPrinting Then 'nur exportieren, wenn das Blatt auch gedruckt wird (also NICHT auf "nicht drucken" steht) Call PublishDWG_activeSheet(sPath, sFNinklBlatt, oDoc) Else 'nix tun End If i = i + 1 Next 'oSheet oLastActiveSheet.Activate 'zu Beginn akt. Blatt erneut aktivieren ' PDF Call PublishPDF(sPath, sFileName, oDoc) 'Fertigmeldung (sonst merkt der User nicht recht, wann er weitermachen kann) MsgBox "Fertig!", , "PDF & DWG" End Sub ' Save as DWG Translator Sample API Sample ' https://help.autodesk.com/view/INVNTOR/2020/ENU/?guid=GUID-E63CAEA6-9977-4640-A73A-B0BD19D2503C ' ### angepasst, so dass die wichtigsten Parameter beim Aufruf übergeben werden ### Private Sub PublishDWG_activeSheet(sPath As String, sFileName As String, Optional oDocument As Document) ' sPath : Pfad für die exportierte Datei, mit "\" am Ende! ' sFilename : Dateiname für die exportierte Datei, ohne Dateiendung! ' oDocument : das zu exportierende Dokument, Optional, ggf. wird das aktive Dokument verwendet ' Get the DWG translator Add-In. Dim DWGAddIn As TranslatorAddIn Set DWGAddIn = ThisApplication.ApplicationAddIns.ItemById("{C24E3AC2-122E-11D5-8E91-0010B541CD80}") 'Set a reference to the active document (the document to be published). 'Dim oDocument As Document If oDocument Is Nothing Then 'weil optionaler Parameter Set oDocument = ThisApplication.ActiveDocument Else 'nix weiter tun End If Dim oContext As TranslationContext Set oContext = ThisApplication.TransientObjects.CreateTranslationContext oContext.Type = kFileBrowseIOMechanism ' Create a NameValueMap object Dim oOptions As NameValueMap Set oOptions = ThisApplication.TransientObjects.CreateNameValueMap ' Create a DataMedium object Dim oDataMedium As DataMedium Set oDataMedium = ThisApplication.TransientObjects.CreateDataMedium ' Check whether the translator has 'SaveCopyAs' options If DWGAddIn.HasSaveCopyAsOptions(oDocument, oContext, oOptions) Then Dim strIniFile As String strIniFile = "C:\temp\DWGOut.ini" '#### Datei muss existieren und die Optionen enthalten! ua. "All sheets = no" o.ä. ' Create the name-value that specifies the ini file to use. oOptions.value("Export_Acad_IniFile") = strIniFile End If 'Set the destination file name 'oDataMedium.FileName = "c:\temp\dwgout.dwg" oDataMedium.FileName = sPath & sFileName & ".dwg" 'Publish document. Call DWGAddIn.SaveCopyAs(oDocument, oContext, oOptions, oDataMedium) End Sub 'Hilfsfkt. Function GetFileName(sDatei_m_Pfad_u_Endung As String) As String 'liefert den Dateinamen ohne Pfad und Dateiendung 'ausgehend vom vollständigen Dateinamen (inkl. Pfad und Endung) 'rein text-basiert. keine Prüfung, ob Dateiexistiert oä. ' Pfad muss nicht enthalten sein ' der Dateiname darf mehrere Punkte enthalten (es wird nur der Text samt dem letzten Punkt entfernt) ' ' Sonderfälle: ' Eingabe "" -> Rückgabe "" ' kein \ enthalten -> es wird die Dateiendung entfernt ' kein . enthalten -> es wird am Ende nichts entfernt ' kein . nach dem letzten \ aber vorher -> liefert alles nach dem letzten \ ' GetFileName = "" 'Default-Rückgabewert If sDatei_m_Pfad_u_Endung = "" Then Exit Function Dim s As String s = sDatei_m_Pfad_u_Endung 'nur damit nicht der lange VarName mitgeschleppt werden muss Dim lSlash As Long lSlash = InStrRev(s, "\") 'Index von dem letzten BackSlash 'sollte keiner vorhanden sein, ist das im weiteren kein Problem (lSlash=0, später je +1) Dim lDot As Long lDot = InStrRev(s, ".") 'index vom letzten Punkt Dim sReturn As String 'wird am Ende zurückgegeben If lDot = 0 Then 'kein Punkt enthalten! sReturn = Mid$(s, lSlash + 1) 'am Ende nichts entfernen ElseIf lDot < lSlash Then 'Punkt VOR dem letzten Backslash (also im Pfad) sReturn = Mid$(s, lSlash + 1) 'am Ende nichts entfernen Else 'Standardfall: Punkt enthalten, nach dem letzten Backslash sReturn = Mid$(s, lSlash + 1, lDot - lSlash - 1) '+1: Slash soll nicht enthalten sein '-1: Punkt soll nicht enthalten sein End If GetFileName = sReturn 'Rückgabewert der Function End Function Function getPathName(sDatei_m_Pfad_u_Endung As String) As String 'liefert den Pfad ohne Dateiname und Dateiendung 'ausgehend vom vollständigen Dateinamen (inkl. Pfad und ggf. Endung) 'rein text-basiert. keine Prüfung, ob Datei oder Pfad existiert oä. ' ' Sonderfälle: ' Eingabe "" -> Rückgabe "" ' kein \ enthalten -> Rückgabe "" ' wird bereits ein Pfad angegeben mit \ am Ende, wird dieser unverändert zurückgegeben ' getPathName = "" 'Default-Rückgabewert If sDatei_m_Pfad_u_Endung = "" Then Exit Function Dim lSlash As Long lSlash = InStrRev(sDatei_m_Pfad_u_Endung, "\") 'Index von dem letzten BackSlash If 0 = lSlash Then Exit Function Dim sReturn As String 'wird am Ende zurückgegeben sReturn = Left$(sDatei_m_Pfad_u_Endung, lSlash) 'Slash am Ende ist enthalten! getPathName = sReturn End Function ' Export to PDF API Sample ' https://help.autodesk.com/view/INVNTOR/2020/ENU/?guid=GUID-CD4C38D2-FD05-4A2F-9FA7-C5EC5F845753 ' ### angepasst, so dass die wichtigsten Parameter beim Aufruf übergeben werden ### Private Sub PublishPDF(sPath As String, sFileName As String, Optional oDocument As Document) ' sPath : Pfad für die exportierte Datei, mit "\" am Ende! ' sFilename : Dateiname für die exportierte Datei, ohne Dateiendung! ' oDocument : das zu exportierende Dokument, Optional, ggf. wird das aktive Dokument verwendet ' Get the PDF translator Add-In. Dim PDFAddIn As TranslatorAddIn Set PDFAddIn = ThisApplication.ApplicationAddIns.ItemById("{0AC6FD96-2F4D-42CE-8BE0-8AEA580399E4}")
'Set a reference to the active document (the document to be published). 'Dim oDocument As Document If oDocument Is Nothing Then 'weil optionaler Parameter Set oDocument = ThisApplication.ActiveDocument Else 'nix weiter tun End If Dim oContext As TranslationContext Set oContext = ThisApplication.TransientObjects.CreateTranslationContext oContext.Type = kFileBrowseIOMechanism ' Create a NameValueMap object Dim oOptions As NameValueMap Set oOptions = ThisApplication.TransientObjects.CreateNameValueMap ' Create a DataMedium object Dim oDataMedium As DataMedium Set oDataMedium = ThisApplication.TransientObjects.CreateDataMedium ' Check whether the translator has 'SaveCopyAs' options If PDFAddIn.HasSaveCopyAsOptions(oDocument, oContext, oOptions) Then ' Options for drawings... oOptions.value("All_Color_AS_Black") = 0 oOptions.value("Remove_Line_Weights") = 0 ' Linienstärken entfernen; 0=NEIN 1=JA oOptions.value("Vector_Resolution") = 300 ' Auflösung 300 dpi sollte reichen, war vorher 400 oOptions.value("Sheet_Range") = kPrintAllSheets ' Values "Sheet_Range": kPrintCurrentSheet kPrintAllSheets kPrintSheetRange 'oOptions.Value("Custom_Begin_Sheet") = 2 'bei kPrintSheetRange 'oOptions.Value("Custom_End_Sheet") = 4 ' End If 'Set the destination file name 'oDataMedium.FileName = "c:\temp\test.pdf" oDataMedium.FileName = sPath & sFileName & ".pdf" 'Publish document. Call PDFAddIn.SaveCopyAs(oDocument, oContext, oOptions, oDataMedium) End Sub
------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Klingone1234 Mitglied
Beiträge: 14 Registriert: 08.11.2023
|
erstellt am: 11. Jan. 2024 12:57 <-- editieren / zitieren --> Unities abgeben:
path_and_name = ThisDoc.PathAndFileName(False) ' without extension PDFAddIn = ThisApplication.ApplicationAddIns.ItemById("{0AC6FD96-2F4D-42CE-8BE0-8AEA580399E4}") oDocument = ThisApplication.ActiveDocument oContext = ThisApplication.TransientObjects.CreateTranslationContext oContext.Type = IOMechanismEnum.kFileBrowseIOMechanism oOptions = ThisApplication.TransientObjects.CreateNameValueMap oDataMedium = ThisApplication.TransientObjects.CreateDataMedium If PDFAddIn.HasSaveCopyAsOptions(oDokument, oContext, oOptions) Then oOptions.Value("All_Color_AS_Black") = 1 oOptions.Value("Remove_Line_Weights") = 1 oOptions.Value("Vector_Resolution") = 600 oOptions.Value("Sheet_Range") = Inventor.PrintRangeEnum.kPrintAllSheets 'oOptions.Value("Custom_Begin_Sheet") = 2 'oOptions.Value("Custom_End_Sheet") = 4 End If 'Set the destination file name oDataMedium.FileName = path_and_name & "-Description" & ".Revision" & ".pdf" 'Publish document PDFAddIn.SaveCopyAs(oDocument, oContext, oOptions,oDataMedium) Dateiname = ThisDoc.PathAndFileName(False) If Dateiname = "" Then Else ThisDoc.Document.SaveAs(ThisDoc.ChangeExtension(".dwg"), True) End If System.Runtime.InteropServices.COMException (0x80020005): Typenkonflikt. (Ausnahme von HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH)) bei Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet(Object o, Type objType, String name, Object[] args, String[] paramnames, Boolean[] CopyBack) bei Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack) bei ThisRule.Main() in Externe Regel: DWG & PDF2:Zeile 18. bei Autodesk.iLogic.Exec.AppDomExec.ExecRuleInAssembly(Assembly assem) bei iLogic.RuleEvalContainer.ExecRuleEval(String execRule) Ich bekomme diese Fehler Meldung bei diesem Code. kanmir da jenand helfen? 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: 11. Jan. 2024 13:32 <-- editieren / zitieren --> Unities abgeben: Nur für Klingone1234
Code: If PDFAddIn.HasSaveCopyAsOptions(oDokument, oContext, oOptions) Then If PDFAddIn.HasSaveCopyAsOptions(oDocument, oContext, oOptions) Then
finde den Unterschied Abhilfe: Option Explicit ON 'erste Zeile im Code Das erzwingt, dass jede Variable deklariert werden muss, z.B.
Code: Dim path_and_name As String = ThisDoc.PathAndFileName(False) ' without extension Dim PDFAddIn As ApplicationAddIn = ThisApplication.ApplicationAddIns.ItemById("{0AC6FD96-2F4D-42CE-8BE0-8AEA580399E4}") Dim oDocument As Document = ThisApplication.ActiveDocument Dim oContext = ThisApplication...
Der Aufwand ist es wert, solche Tippfehler lassen sich nur schwer finden... BTW. bitte füge Code zwischen Code-Tags ein. Das ist besser lesbar. (CODE) ... (/CODE) 'Eckige Klammern [] statt Runde ()
Der Block am Ende "Dateiname = ..." bringt da nix, weil das pdf da schon geschrieben wurde. Das ist klar, oder? ------------------ Gruß KraBBy [Diese Nachricht wurde von KraBBy am 11. Jan. 2024 editiert.] [Diese Nachricht wurde von KraBBy am 11. Jan. 2024 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Klingone1234 Mitglied
Beiträge: 14 Registriert: 08.11.2023
|
erstellt am: 11. Jan. 2024 14:11 <-- editieren / zitieren --> Unities abgeben:
|
Klingone1234 Mitglied
Beiträge: 14 Registriert: 08.11.2023
|
erstellt am: 12. Jan. 2024 09:03 <-- editieren / zitieren --> Unities abgeben:
Es läuft zwar jetzt, aber da ich ein blutiger Anfänger in VBa bin, verstehe ich das meiste nicht. Ich hab nur den Schreibfehler beseitigt. Beim Einfügen der Konstanten erzeuge ich nur mehr Fehler und die letzte Anmerkung kann ich aus Unwissenheit nicht verstehen, was Du meinst. Solange es das macht was ich will, ist alles gut. Danke für deine super Hilfe! 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: 12. Jan. 2024 10:51 <-- editieren / zitieren --> Unities abgeben: Nur für Klingone1234
Du meinst diesen Satz von mir, den Du nicht verstehst? Zitat: Der Block am Ende "Dateiname = ..." bringt da nix, weil das pdf da schon geschrieben wurde. Das ist klar, oder?
Damit habe ich diesen Teil Deines Codes gemeint:
Code: Dateiname = ThisDoc.PathAndFileName(False) If Dateiname = "" Then Else ThisDoc.Document.SaveAs(ThisDoc.ChangeExtension(".dwg"), True) End If
Das bringt deshalb nichts, weil in der Zeile davor die PDF geschrieben wird. Code: 'Publish document PDFAddIn.SaveCopyAs(oDocument, oContext, oOptions,oDataMedium)
Ganz grundsätzlich wird der Code Zeile für Zeile abgearbeitet (davon abweichend gibt es Befehle zur "Ablaufsteuerung", wie Bedingungen (if) oder Schleifen). D.h. wenn das Dokument noch nicht gespeichert ist, dann ist Deine Variable 'path_and_name' aus der ersten Zeile leer (Nullstring / ""). Im weitern kommt nicht das gewünschte Ergebnis beim Dateinamen des PDF raus, nehme ich an. Wenn Du eine beim Code-Aufruf ungespeicherte Datei speichern willst, dann ist es wohl gut, das zu Beginn zu tun (also im Code "oben"). ------------------ 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: 12. Jan. 2024 11:30 <-- editieren / zitieren --> Unities abgeben: Nur für Klingone1234
Noch etwas Klug-Sch...erei und damit wir uns richtig verstehen: Mag sein, dass Du auch Anfänger in VBA bist. Der Code in Deinem Post ist aber iLogic. Ist dieser Unterschied klar? (iLogic benutzt Syntax von VB.NET. Das ist zwar ähnlich zu VB und VBA, aber es gibt Unterschiede. Im Inventor muss der jeweilige Code in ganz unterschiedliche Editoren geklopft werden.) Hast Du meinen VBA-Code nicht zum Laufen bekommen? (weil Du nun PDF per iLogic erzeugen willst) Ich halte gerade zum Lernen VBA für vorteilhaft, z.B. weil Du den Code Zeile für Zeile ablaufen lassen kannst und dabei in die Variablen und Objekte schauen kannst. Im Gegensatz dazu sind die Debugging-Möglichkeiten bei iLogic sehr begrenzt. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Klingone1234 Mitglied
Beiträge: 14 Registriert: 08.11.2023
|
erstellt am: 12. Jan. 2024 13:10 <-- editieren / zitieren --> Unities abgeben:
Danke für das Klug-SCH... Da ich gerade erst am Anfang bin war mir der Unterschied zu Anfang nicht klar, aber nach vielen Recherchen habe ich das erkannt. Ich wollte von Anfang an ein iLogic-Regel erstellen. Ich meinem alten Betrieb war das schon alles fertig und ich konnte diese Tools einfach benutzen. Jetzt bin ich in einer neuen Firma, wo ich das 3D-CAD System neu aufbauen muss.Ich habe also bei Null angefangen und musste alle Eistellung und Templates, Normteile usw. selber erstellen bzw. erweitern. Dabei habe ich viel gelernt und jetzt wollte ich noch die iLogic-regel erstellen, die noch so brauche. Was das Programieren angeht, bin ein absoluter Anfäger und merke, dass ich dort an meine Grenzen stoße. Ich bräuchte eigentlich eine ilogic-Schulung, aber da habe ich noch nichts gefunden. Ich habe auch schon mal in eine VB.NET-Schulung reingeschaut, aber da fehlt mit irgentwie der Zugang. Greetz Klingone1234 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: 12. Jan. 2024 13:35 <-- editieren / zitieren --> Unities abgeben: Nur für Klingone1234
|
Klingone1234 Mitglied
Beiträge: 14 Registriert: 08.11.2023
|
erstellt am: 12. Jan. 2024 14:32 <-- editieren / zitieren --> Unities abgeben:
Ganz ehrlich keine Ahnung. Ich habe auf linkedin eine VBA-Exel Schulung für Anfänger absolviert. Ich kann jetzt eingigermaßen einen Code lesen und verstehen, was er macht, aber selber schreiben ist eine ganz andere Sache. iIch habe mich zuvor noch nie mit Programmierung irgendwelcher art beschäftigt und aus meiner Perspektive ist ein sehr schwieriges Thema, zu dem ich keinen richtigen Zugang finde. Eigentlich bin ich ein mausklickendes Ungeheuer mit viel gefährlichem Halbwissen. Ich bräuchte eine Schulung mit vielen Anwendungsbeispielen, die ich dann durchgehen kann.Leider sind solche Kurse immer mit hohen Kosten verbunden. Daher kommt diese kollosale Unwissenheit. Ich verstehe ja nicht mal genau was da drin steht, was du mir geschickt hast. Dazu fehlt mir die komplette Grundlage. Sorry aber mehr kann ich nicht ------------------ Greetz Klingone1234 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: 15. Jan. 2024 12:43 <-- editieren / zitieren --> Unities abgeben: Nur für Klingone1234
Zitat: Original erstellt von Klingone1234: Ich habe auf linkedin eine VBA-Exel Schulung für Anfänger absolviert.
Das ist noch ein zusätzliches Argument für VBA. Deshalb nochmal meine Empfehlung zum Start mit VBA. Die Entscheidung liegt natürlich bei Dir. Ich helfe Dir auch gern mit iLogic. (Wie schon geschrieben: diese Entscheidung zwischen VBA und iLogic muss ja auch nicht endgültig sein. Wenn etwas mal als VBA funktioniert, kann man das später immer noch mit iLogic aufrufen oder 'übersetzen'.) Angenommen, es darf auch VBA werden: Du kannst den VBA-Editor aufrufen? Du kannst Code in Deine Default.ivb schreiben/kopieren, speichern und ausführen? Damit kannst Du schon viel rumspielen und ausprobieren. Probier dann mal den Befehl "Einzelschritt" im Menü "Debuggen" aus, oder gleich Taste F8. (der Cursor muss dafür in einem Sub stehen.) Damit läuft Dein Code Zeile für Zeile ab. Der Inhalt von Variablen wird angezeigt, wenn du mit der Maus drauf zeigst. Im Kontextmenü findest du den Befehl "Überwachung hinzufügen" bei markiertem Variablennamen. Damit wird im Überwachungsfenster der Inhalt der Variable angezeigt und man kann sich durch Objekte hangeln (ein DrawingDocument hat eine Sheets-Eigenschaft, die enthält die einzelnen Blätter als "item 1/2/..." etc.). Ggf. muss im Menü unter Ansicht das Überwachungsfenster eingeschaltet werden (auch das Lokal-Fenster ist nützlich). F1 und damit die Hilfe ist Dein neuer bester Freund: steht der Cursor in einem Schlüsselwort (egal ob Syntax wie "If" oder Inventor-Object wie "Document") wird mit F1 die entsprechende Hilfeseite angezeigt. In der Hilfe finden sich auch viele Anwendungsbeispiele bzw. sind unter den Objekten verlinkt. ------------------ 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: 15. Jan. 2024 13:57 <-- editieren / zitieren --> Unities abgeben: Nur für Klingone1234
ein Beispiel: Du willst an den Inhalt des iProperty "Revision", bzw. ich denke Du meinst "Revisionsnummer". ausgehend vom Beispiel aus der Hilfe API Sample - Get value of iProperty Liefert leider das iProp "Part Number". Wir wollen aber "Revision" und wissen zunächst nichtmal wie das in der API heißt. Wir sehen ja nur die Benutzeroberfläche ggf. mit deutscher Übersetzung. Man erkennt im Code evtl. auch schon, dass die iProperties in Property-Sets organisiert sind. Den Code kopieren und im Einzelschritt ausführen. Eine Überwachung setzen für das PropSet invDesignInfo. Im Überwachungsfenster kann man dann sehen, dass dieses Set viele "Item 1", 2, usw. hat. Jedes Item hat einen DisplayName (das ist die Bezeichnung auf der Benutzeroberfläche, ggf. deutsch), aber u.a. auch Name (danach suchen wir) und Value (das ist der Inhalt des iProperty). Dann stelle ich fest, dass ich kein Item finde mit dem Displayname "Revisionsnummer". Das heißt, das gesuchte iProperty wird sich in einem anderen Set befinden. Also Überwachung hinzufügen für "invDoc.PropertySets" (oder sich vom invDoc zu PropertySets hangeln), um in die einzelnen PropertySets zu sehen. Ich werde fündig im Set "Inventor Summary Information" unter "Item 7" (kann bei Dir eine andere Nr. sein). Das iProperty heißt "Revision Number". So wird daraus 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") Set invDesignInfo = invDoc.PropertySets.Item("Inventor Summary Information") 'KraBBy ' Get the part number property. Dim invPartNumberProperty As Property ' Set invPartNumberProperty = invDesignInfo.Item("Part Number") Set invPartNumberProperty = invDesignInfo.Item("Revision Number") 'KraBBy MsgBox "Part Number: " & invPartNumberProperty.value End Sub
Nun ist der Name der Variable mit invPartNumberProperty nicht mehr treffend, auch der Text in der MsgBox nicht. Das wäre noch zu ändern. Wenn man nun noch Sub durch Function ersetzt und statt der MsgBox den Inhalt des Property zurückgibt, kann man diese Function schon in anderem Code benutzen. Code: Option ExplicitPublic Function GetRevision() 'liefert den Inhalt des iProperty "Revisionsnummer" vom aktiven Dokument ' 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") Set invDesignInfo = invDoc.PropertySets.Item("Inventor Summary Information") 'KraBBy ' Get the part number property. Dim invPartNumberProperty As Property ' Set invPartNumberProperty = invDesignInfo.Item("Part Number") Set invPartNumberProperty = invDesignInfo.Item("Revision Number") 'KraBBy ' MsgBox "Part Number: " & invPartNumberProperty.value 'Rückgabewert der Function ( [Name der Function] = "Wert" ) GetRevision = invPartNumberProperty.value End Function Sub Test_Aufruf() Dim s As String s = "mein Text + Rev.: " Dim r As String r = GetRevision() 'Aufruf der Function s = s & r 'oder etwas kürzer ohne Variable r s = "mein Text + Rev.: " & GetRevision() MsgBox s End Sub
Edit: "Option Explicit" als erste Codezeile ergänzt. Das Pendant in VBA zum "Option Explicit ON" in iLogic. Den Sinn habe ich ja schonmal geschrieben. Edit 2: Link funktionierte nicht; Link-URL angepasst ------------------ Gruß KraBBy [Diese Nachricht wurde von KraBBy am 15. Jan. 2024 editiert.] [Diese Nachricht wurde von KraBBy am 15. Jan. 2024 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Klingone1234 Mitglied
Beiträge: 14 Registriert: 08.11.2023
|
erstellt am: 15. Jan. 2024 16:00 <-- editieren / zitieren --> Unities abgeben:
Danke, dass Du mit das erklären willst, aber so ist das schon wieder ein weinig mühsam für mich. Ich brauche eine richtige Schulung ,mit Dozent und Übungen. Ich weiß es sehr zu schätzten, dass du versuchst, mir VBA beizubringen, aber so funktioniert das bei mir leider nicht. Die Hälfe sind für mich schon wieder böhmische Dörfer. Danke nochmal für Deine Mühe. ------------------ Greetz Klingone1234 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|