Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Inventor VBA
  VB Addin als PDF speichern

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  VB Addin als PDF speichern (2972 mal gelesen)
Ennuira93
Mitglied
Fachinformatiker Systemintegration


Sehen Sie sich das Profil von Ennuira93 an!   Senden Sie eine Private Message an Ennuira93  Schreiben Sie einen Gästebucheintrag für Ennuira93

Beiträge: 16
Registriert: 18.04.2013

Autodesk Inventor
AutoCAD Mechanical 2013

erstellt am: 18. Apr. 2013 09:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Guten Morgen,

ich stell mich mal kurz eben vor, bevor ich zu dem Problem komme, da ich hier neu bin.
Mein Name ist Sebastian, bin 20 Jahre jung und mache gerade meine Lehre als Informatiker Fachrichtung Systemintegration. 

Nun mein Problem : Ich möchte ein VB Addin erstellen, dass die Zeichnungen ( alle Blätter ) als PDF speichert, sobald ich auf das Speichersymbol klicke. Also es soll einmal in seinem Orginalformat speichern und einmal als PDF.

Ich habe ein Vba Script, dass funktioniert. Nun hab ich es in VB umgeschrieben und es funktioniert nicht mehr.

Code:
    Private Sub m_appEvents_OnSaveDocument(ByVal DocumentObject As Inventor._Document, ByVal BeforeOrAfter As Inventor.EventTimingEnum, ByVal Context As Inventor.NameValueMap, ByRef HandlingCode As Inventor.HandlingCodeEnum) Handles m_appEvents.OnSaveDocument

         
            Dim PDFAddIn As TranslatorAddIn
            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
            oDocument = ThisApplication.ActiveDocument


            Dim oContext As TranslationContext
            oContext = ThisApplication.TransientObjects.CreateTranslationContext
            oContext.Type = IOMechanismEnum.kFileBrowseIOMechanism

            ' Create a NameValueMap object
            Dim oOptions As NameValueMap
            oOptions = ThisApplication.TransientObjects.CreateNameValueMap

            ' Create a DataMedium object
            Dim oDataMedium As DataMedium
            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
                'oOptions.Value("Vector_Resolution") = 400
                oOptions.Value("Sheet_Range") = PrintRangeEnum.kPrintAllSheets'<------------ alle Blätter ins PDF drucken
                'oOptions.Value("Custom_Begin_Sheet") = 2
                'oOptions.Value("Custom_End_Sheet") = 4

            End If

            'Set the destination file name
            oDataMedium.FileName = Replace(oDocument.FullFileName, Right(oDocument.FullFileName, 3), ".pdf")

            'Publish document.
            PDFAddIn.SaveCopyAs(oDocument, oContext, oOptions, oDataMedium)

        End Sub


Habe oben im Code noch stehen, damit ThisApplication funktioniert.

Code:
Public ThisApplication As Inventor.Application

Dann würde ich den Code gerne noch erweitern.
Ich möchte den Namen der Datei ändern, dass er Zeichnungsnummer und Revision anzeigt. Kann ich diese Daten mit VB irgendwoher bekommen?
Anschließend möchte ich die Datei verschieben bzw sie direkt in einem Pfad speichern. ( Das ist kein Problem )

Ich Danke schonmal für Antworten.
Ich arbeite nicht mit Inventor, sondern schreibe das Addin für einige Kollegen.
Da ich mich bis gestern gar nicht mit VB und VBA beschäftigt habe hoffe ich , dass ihr mir helfen könnt.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

rkauskh
Moderator
Dipl.-Ing. (FH) Versorgungstechnik




Sehen Sie sich das Profil von rkauskh an!   Senden Sie eine Private Message an rkauskh  Schreiben Sie einen Gästebucheintrag für rkauskh

Beiträge: 2166
Registriert: 15.11.2006

Windows 10 x64, AIP 2022

erstellt am: 18. Apr. 2013 11:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Ennuira93 10 Unities + Antwort hilfreich

Hallo

und Willkommen im Forum 

"Geht nicht" ist keine Fehlermeldung.

Setze deinen Code doch einfach erstmal in eine Try-Catch-Anweisung und setze einen Haltepunkt auf die Catch-Zeile. Dann solltest du den Grund des Fehlers erfahren. Weiterhin wird das OnSave-Event zweimal abgefeuert. Einmal direkt vor und einmal direkt nach dem Speichern. Da du das PDF sicher nicht zweimal hintereinander erstellen willst, prüfe den EventTimengEnumerator.

Code:
Private Sub m_appEvents_OnSaveDocument(ByVal DocumentObject As Inventor._Document, ByVal BeforeOrAfter As Inventor.EventTimingEnum, ByVal Context As Inventor.NameValueMap, ByRef HandlingCode As Inventor.HandlingCodeEnum) Handles m_appEvents.OnSaveDocument

        Try
            If BeforeOrAfter = kAfter Then

            Dim PDFAddIn As TranslatorAddIn
            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
            oDocument = ThisApplication.ActiveDocument


            Dim oContext As TranslationContext
            oContext = ThisApplication.TransientObjects.CreateTranslationContext
            oContext.Type = IOMechanismEnum.kFileBrowseIOMechanism

            ' Create a NameValueMap object
            Dim oOptions As NameValueMap
            oOptions = ThisApplication.TransientObjects.CreateNameValueMap

            ' Create a DataMedium object
            Dim oDataMedium As DataMedium
            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
                'oOptions.Value("Vector_Resolution") = 400
                oOptions.Value("Sheet_Range") = PrintRangeEnum.kPrintAllSheets'<------------ alle Blätter ins PDF drucken
                'oOptions.Value("Custom_Begin_Sheet") = 2
                'oOptions.Value("Custom_End_Sheet") = 4

            End If

            'Set the destination file name
            oDataMedium.FileName = Replace(oDocument.FullFileName, Right(oDocument.FullFileName, 3), ".pdf")

            'Publish document.
            PDFAddIn.SaveCopyAs(oDocument, oContext, oOptions, oDataMedium)

            End If
Catch ex as Exception

End Try

        End Sub


Eine Variable "ThisApplication" zu nennen halte ich für keine gute Idee. Reservierte Namen sollten nicht verwendet werden. Warum nicht z.B. myInventor oder so ähnlich?

------------------
MfG
Ralf

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Ennuira93
Mitglied
Fachinformatiker Systemintegration


Sehen Sie sich das Profil von Ennuira93 an!   Senden Sie eine Private Message an Ennuira93  Schreiben Sie einen Gästebucheintrag für Ennuira93

Beiträge: 16
Registriert: 18.04.2013

erstellt am: 18. Apr. 2013 14:30    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


AlsPDFSpeichern.zip

 
Hallo.
Also ich bekomme ja überhaupt keine Fehlermeldung.
Ich habe das Visual Studio Projekt erstellt und die dll dann in den bin ordner von Inventor kopiert. Er lädt das Addin auch.

Hab mal zum testen verschiedene MsgBox eingefügt. Und er führt nur die aus, die ich vor meinem Code ( Der Speichern soll ) einfüge. Die MsgBox im Code ( Der Speichern soll )  wird nicht ausgeführt.

Code:
Private Sub m_appEvents_OnSaveDocument( _
               ByVal DocumentObject As Inventor._Document, _
               ByVal BeforeOrAfter As Inventor.EventTimingEnum, _
               ByVal Context As Inventor.NameValueMap, _
               ByRef HandlingCode As Inventor.HandlingCodeEnum) _
                                  Handles m_appEvents.OnSaveDocument

            MsgBox("Test")  ' führt er aus
            ' Get the PDF translator Add-In.
            Dim PDFAddIn As TranslatorAddIn
            PDFAddIn = myInventor.ApplicationAddIns.ItemById("{0AC6FD96-2F4D-42CE-8BE0-8AEA580399E4}")

    MsgBox("Test 2") 'führt er nicht aus

            'Set a reference to the active document (the document to be published).
            Dim oDocument As Document
            oDocument = myInventor.ActiveDocument


Danke für den Tipp mit dem EventTimengEnumerator.
Hab mal das ganze Projekt als Anhang hochgeladen.

Danke.


Edit: Es macht immernoch nicht was es soll  Bräuchte dringend Hilfe.Danke.


[Diese Nachricht wurde von Ennuira93 am 18. Apr. 2013 editiert.]

[Diese Nachricht wurde von Ennuira93 am 22. Apr. 2013 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Ennuira93
Mitglied
Fachinformatiker Systemintegration


Sehen Sie sich das Profil von Ennuira93 an!   Senden Sie eine Private Message an Ennuira93  Schreiben Sie einen Gästebucheintrag für Ennuira93

Beiträge: 16
Registriert: 18.04.2013

Autodesk Inventor
AutoCAD Mechanical 2013

erstellt am: 24. Apr. 2013 11:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Edit : So es funktioniert und ich möchte euch den Code zur Verfügung stellen. Vielleicht kann mal jmd einen Teil vom Code nutzen.
Zitat:
Imports Inventor
Imports System.Runtime.InteropServices
Imports Microsoft.Win32

Namespace TestSpeichernNeuinstallation
    <ProgIdAttribute("TestSpeichernNeuinstallation.StandardAddInServer"), _
    GuidAttribute("f01145cb-dd0d-411b-9975-e49a219b849d")> _
    Public Class StandardAddInServer
        Implements Inventor.ApplicationAddInServer

        ' Inventor application object.
        Private m_inventorApplication As Inventor.Application
        Private WithEvents m_appEvents As Inventor.ApplicationEvents

#Region "ApplicationAddInServer Members"

        Public Sub Activate(ByVal addInSiteObject As Inventor.ApplicationAddInSite, ByVal firstTime As Boolean) Implements Inventor.ApplicationAddInServer.Activate

            ' This method is called by Inventor when it loads the AddIn.
            ' The AddInSiteObject provides access to the Inventor Application object.
            ' The FirstTime flag indicates if the AddIn is loaded for the first time.

            ' Initialize AddIn members.
            m_inventorApplication = addInSiteObject.Application
            m_appEvents = m_inventorApplication.ApplicationEvents

         

            ' TODO:  Add ApplicationAddInServer.Activate implementation.
            ' e.g. event initialization, command creation etc.

        End Sub

        Public Sub Deactivate() Implements Inventor.ApplicationAddInServer.Deactivate

            ' This method is called by Inventor when the AddIn is unloaded.
            ' The AddIn will be unloaded either manually by the user or
            ' when the Inventor session is terminated.

            ' TODO:  Add ApplicationAddInServer.Deactivate implementation

            ' Release objects.
            Marshal.ReleaseComObject(m_inventorApplication)
            m_inventorApplication = Nothing

            System.GC.WaitForPendingFinalizers()
            System.GC.Collect()

        End Sub

        Public ReadOnly Property Automation() As Object Implements Inventor.ApplicationAddInServer.Automation

            ' This property is provided to allow the AddIn to expose an API
            ' of its own to other programs. Typically, this  would be done by
            ' implementing the AddIn's API interface in a class and returning
            ' that class object through this property.

            Get
                Return Nothing
            End Get

        End Property

        Public Sub ExecuteCommand(ByVal commandID As Integer) Implements Inventor.ApplicationAddInServer.ExecuteCommand

            ' Note:this method is now obsolete, you should use the
            ' ControlDefinition functionality for implementing commands.

        End Sub

 

        Private Sub m_appEvents_OnSaveDocument( _
              ByVal DocumentObject As Inventor._Document, _
              ByVal BeforeOrAfter As Inventor.EventTimingEnum, _
              ByVal Context As Inventor.NameValueMap, _
              ByRef HandlingCode As Inventor.HandlingCodeEnum) _
                                  Handles m_appEvents.OnSaveDocument

            Dim dateiformat As String
            dateiformat = DocumentObject.FullFileName
 
            dateiformat = dateiformat.Substring(dateiformat.Length - 4)

            If dateiformat = ".idw" Then

                If BeforeOrAfter = EventTimingEnum.kBefore Then

                    If DocumentObject.DocumentType = DocumentTypeEnum.kDrawingDocumentObject Then


                     

   


                            Dim sUsername As String = System.Security.Principal.WindowsIdentity.GetCurrent().Name
                            sUsername = sUsername.Substring(3, sUsername.Length - 3)

                            Dim sPartNumber As String
                        sPartNumber = DocumentObject.ReferencedDocuments(1).PropertySets.Item("{32853F0F-3444-11D1-9E93-0060B03C1CA6}").Item("Part Number").Value

                            Dim sRevision As String
                            sRevision = DocumentObject.PropertySets.Item("{F29F85E0-4FF9-1068-AB91-08002B27B3D9}").Item("Revision Number").Value


                            ' Get the filename minus the extension.

                            Dim filename As String
                            filename = DocumentObject.FullFileName
                            filename = Left(filename, Len(filename) - 4)
                            filename = sPartNumber & "_" & sRevision & "_" & sUsername


                            ' Save the current SilentOperation and then turn it on. 
                            ' This will suppress the dwf viewer from being displayed. 
                            Dim currentSetting As Boolean
                            currentSetting = m_inventorApplication.SilentOperation
                            m_inventorApplication.SilentOperation = True


                            ' Save the file as pdf. 
                            ' Überprüft ob Datei bereits vorhanden und fragt ob überschrieben werden soll
                            ' Fragt ob auf Server gespeichert werden soll oder Lokal
                            If MsgBox("Soll die Datei auf den Server gespeichert werden?", vbYesNo, "Speicherort") = vbYes Then
                                If My.Computer.FileSystem.FileExists("C:\ServerpfadTest\" & filename & ".pdf") Then
                                    If MsgBox("Die Datei exisitert bereits. Soll die Datei überschrieben werden?", vbYesNo, "Überschreiben") = vbYes Then

                                        DocumentObject.SaveAs("C:\ServerpfadTest\" & filename & ".pdf", True)
                                        MsgBox("Die Datei wurde auf dem Server gespeichert")

                                    Else
                                        MsgBox("Die Datei wurde nicht überschrieben")
                                        ' eventuell Code hinzfügen : Wollen Sie die Datei unter anderem Namen speichern?
                                    End If

                                Else
                                    DocumentObject.SaveAs("C:\ServerpfadTest\" & filename & ".pdf", True)
                                    MsgBox("Die Datei wurde auf dem Server gespeichert")

                                End If

                            Else

                                If My.Computer.FileSystem.FileExists(filename & ".pdf") Then
                                    If MsgBox("Die Datei exisitert bereits. Soll die Datei überschrieben werden?", vbYesNo, "Überschreiben") = vbYes Then
                                        DocumentObject.SaveAs(filename & ".pdf", True)
                                        MsgBox("Die Datei wurde NICHT auf dem Server gespeichert, sondern lokal")
                                    Else
                                        MsgBox("Die Datei wurde nicht überschrieben")
                                        ' eventuell Code hinzfügen : Wollen Sie die Datei unter anderem Namen speichern?
                                    End If
                                Else
                                    DocumentObject.SaveAs(filename & ".pdf", True)
                                    MsgBox("Die Datei wurde Nicht auf dem Server gespeichert, sondern lokal")
                                End If


                                ' Reset SilentOperation back to its previous value. 
                                m_inventorApplication.SilentOperation = currentSetting
                            End If
                    End If
                End If
            End If
        End Sub

#End Region

    End Class

End Namespace


[Diese Nachricht wurde von Ennuira93 am 08. Mai. 2013 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz