Hier die Klasse, welche die ganzen Druckvorgänge vom Inventor durchführt. Komplette Anwendungen welche, diese Klasse benutzen finden sich unter den Verweisen.
Mit NEW muss ein Zeichnungsobjekt übergegeben werden, natürlich nur eine IDW-Zeichnung. Die Klasse kann als Addin für Inventor aber auch mit dem Inventor Viewer genutzt werden. Dieser liefert bereits alle nötigen Referenzen, kann aber nicht alle vorhanden Methoden nutzen. GenerateIProperties und UpdatePlotstyles wird nicht gehen. Ich hoffe der Rest ist selbst erklärend.
Properties und Subs
- RotatePlot.Ax: Papierformat x wird um 90° gedreht
- AllColorsAsBlack: Ausdruck in schwarzweiß
- NumberOfCopies: Anzahl der Ausdrucke
- SetSystemPrinter: Ausgabedrucker ("defaultprinter" = Standarddrucker)
- UpdateIProperties: plotuser und plotdate in den IFeatures aktualisieren
- UpdatePlotstyles: Aktualisierung der Stilbibliotheken
- plot: Senden die Zeichnung zum Drucker/Plotter
- SaveAsPDF: aktuelle Zeichnung als PDF speichern
- SaveAsDWF: aktuelle Zeichnung als DWF speichern
Folgende Vorgänge werden von plot automatisiert durchgeführt, wenn die entsprechenden Properties auf true stehen. Sie können allerdings auch direkt aufgerufen werden.
- GenerateIProperties: plotuser und plotdate in den IFeatures aktualisieren
- UpdateStyles: Aktualisierung der Stilbibliotheken
- UpdateDocument: Änderungen an IProperties und Stilbibliothek auf Zeichnung anwenden
Translator Addins
Ab Autodesk Inventor 2009 können die Translator Addins genommen werden. Bisher sind habe ich allerdings noch nicht alle IDs dafür finden können. Folgende können direkt angesprochen werden:
- PDF {0AC6FD96-2F4D-42CE-8BE0-8AEA580399E4}
- DWF {0AC6FD95-2F4D-42CE-8BE0-8AEA580399E4}
Klassen-Diagramm
Changelog
2009 Oktober
- Translator Addins eingefügt
- kleinere Schönheitskorrekturen
2009 Juni
- XML-Kommentare eingefügt
- Property UpdateiFeatures umbenannt in UpdateIProperties
- Updatestile heißt jetzt UpdateStyles
2009 März
- First Release
Beispiel
/trunk/example.vb
'$Id: example.vb 8 2009-10-14 08:34:04Z espendiller $ Dim beispiel As New InventorPlotClass(Inventor.Document.ActiveDocument) beispiel.RotatePlot.A0 = True beispiel.AllColorsAsBlack = True beispiel.NumberOfCopies = 2 beispiel.SetSystemPrinter = "PDFCreator" beispiel.UpdateIFeatures = True beispiel.UpdatePlotstyles = True beispiel.plot()
/trunk/inventorplotclass.vb
'$Id: inventorplotclass.vb 7 2009-10-13 11:42:32Z espendiller $
Imports Inventor
''' <summary>
''' This class do some plotting stuff for Autodesk Inventor
'''
''' Daniel Espendiler - http://www.espend.de
''' </summary>
''' <remarks></remarks>
Public Class InventorPlotClass
Private _UpdatePlotstyles As Boolean = False
Private _AllColorsAsBlack As Boolean = False
Private _UpdateIProperties As Boolean = False
Private _SetSystemPrinter As String = ""
Private _FixedPaperSize As PaperSizeEnum = Nothing
Public RotatePlot As New sRotatePlot
Private _NumberOfCopies As Integer = 1
Private _PrintScaleMode As PrintScaleModeEnum = PrintScaleModeEnum.kPrintBestFitScale
Private _ActiveDocument As Inventor.Document
#Region "sRotatePlot"
''' <summary>
''' Helperclass to change paper rotation
''' </summary>
''' <remarks></remarks>
Public Class sRotatePlot
Private _A0 As Boolean = False
Private _A1 As Boolean = False
Private _A2 As Boolean = False
Private _A3 As Boolean = False
Private _A4 As Boolean = False
Public Property A0() As Boolean
Get
Return _A0
End Get
Set(ByVal value As Boolean)
_A0 = value
End Set
End Property
Public Property A1() As Boolean
Get
Return _A1
End Get
Set(ByVal value As Boolean)
_A1 = value
End Set
End Property
Public Property A2() As Boolean
Get
Return _A2
End Get
Set(ByVal value As Boolean)
_A2 = value
End Set
End Property
Public Property A3() As Boolean
Get
Return _A3
End Get
Set(ByVal value As Boolean)
_A3 = value
End Set
End Property
Public Property A4() As Boolean
Get
Return _A4
End Get
Set(ByVal value As Boolean)
_A4 = value
End Set
End Property
End Class
#End Region
#Region "Properties"
''' <summary>
''' Check if (Plot)Styles different from StylesManager and Update (default=false)
''' </summary>
''' <value></value>
''' <remarks></remarks>
Public WriteOnly Property UpdatePlotstyles() As Boolean
Set(ByVal value As Boolean)
_UpdatePlotstyles = value
End Set
End Property
''' <summary>
''' Plot in back and white (default=false)
''' </summary>
''' <value></value>
''' <remarks></remarks>
Public WriteOnly Property AllColorsAsBlack() As Boolean
Set(ByVal value As Boolean)
_AllColorsAsBlack = value
End Set
End Property
''' <summary>
''' Set plotuser and plotdate (default=false)
''' </summary>
''' <value></value>
''' <remarks></remarks>
Public WriteOnly Property UpdateIProperties() As Boolean
Set(ByVal value As Boolean)
_UpdateIProperties = value
End Set
End Property
''' <summary>
''' Force plotting on definied Papersize (default=auto)
''' </summary>
''' <value></value>
''' <remarks></remarks>
Public WriteOnly Property FixedPaperSize() As PaperSizeEnum
Set(ByVal value As PaperSizeEnum)
_FixedPaperSize = value
End Set
End Property
''' <summary>
''' Set Printer/Plotter to print on
''' </summary>
''' <value></value>
''' <remarks></remarks>
Public WriteOnly Property SetSystemPrinter() As String
Set(ByVal value As String)
_SetSystemPrinter = value
End Set
End Property
''' <summary>
''' Numbers of Copies to plot
''' </summary>
''' <value></value>
''' <remarks></remarks>
Public WriteOnly Property NumberOfCopies() As Integer
Set(ByVal value As Integer)
_NumberOfCopies = value
End Set
End Property
''' <summary>
''' Scalemode for plotting (default=bestfit)
''' </summary>
''' <value></value>
''' <remarks></remarks>
Public WriteOnly Property PrintScaleMode() As PrintScaleModeEnum
Set(ByVal value As PrintScaleModeEnum)
_PrintScaleMode = value
End Set
End Property
#End Region
Structure strings
Dim [empty] As String
Shared PrinterNotFound As String = "Unknown Printer"
Shared NoIDW As String = "No IDW-File"
Shared ErrorPageOrientation As String = "Page orientation unknown"
Shared ErrorPaperSize As String = "Papersize unknown"
End Structure
''' <summary>
'''
''' </summary>
''' <param name="ActiveDocument">should be m_inventorApplication.ActiveDocument</param>
''' <remarks></remarks>
Public Sub New(ByVal ActiveDocument As Inventor.Document)
_ActiveDocument = ActiveDocument
End Sub
''' <summary>
''' Force an update on StylesManger->Drawing
''' </summary>
''' <remarks></remarks>
Sub UpdateStyles()
Dim inv_document As ApprenticeServerDocument = _ActiveDocument
Dim oDrgDoc As DrawingDocument = inv_document
Dim oIDWStyles As Inventor.DrawingStylesManager = oDrgDoc.StylesManager
For i As Integer = 1 To oIDWStyles.DimensionStyles.Count
If oIDWStyles.DimensionStyles.Item(i).UpToDate = False Then
oIDWStyles.DimensionStyles.Item(i).UpdateFromGlobal()
End If
Next
End Sub
''' <summary>
''' Force update/rebuild of Drawing; need after some actions
''' </summary>
''' <remarks></remarks>
Sub UpdateDocument()
_ActiveDocument.Update()
End Sub
''' <summary>
''' Force generating or updating the IProperties: plotuser, plotdate
''' </summary>
''' <remarks></remarks>
Sub GenerateIProperties()
Dim inv_document As ApprenticeServerDocument = _ActiveDocument
Dim oDrgDoc As DrawingDocument = inv_document
For Each opropset As PropertySet In oDrgDoc.PropertySets
If opropset.Name = "Inventor User Defined Properties" Then
Dim oUserPropertySet As PropertySet = opropset
ChangeOrAddProperty("plotuser", System.Environment.UserName, oUserPropertySet)
ChangeOrAddProperty("plotdate", Now, oUserPropertySet)
Exit For
End If
Next opropset
End Sub
''' <summary>
''' OK all done, plotting...
''' </summary>
''' <remarks></remarks>
Sub plot()
Try
If _SetSystemPrinter.ToLower = "defaultprinter" Then _SetSystemPrinter = DefaultPrinterName()
If SystemPrinterContains(_SetSystemPrinter) = False Then
MsgBox(InventorPlotClass.strings.PrinterNotFound & _SetSystemPrinter, MsgBoxStyle.Critical)
Exit Sub
End If
If _ActiveDocument.DocumentType = Inventor.DocumentTypeEnum.kDrawingDocumentObject Then
Dim inv_document As ApprenticeServerDocument = _ActiveDocument
Dim oDrgDoc As DrawingDocument = inv_document
If _UpdateIProperties = True Then Me.GenerateIProperties()
If _UpdatePlotstyles = True Then Me.UpdateStyles()
If _UpdateIProperties = True Or _UpdatePlotstyles = True Then Me.UpdateDocument()
Try
If Me._FixedPaperSize > 0 Then
Me.PlotDin()
Else
Me.plotBestFit()
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
Else
MsgBox(InventorPlotClass.strings.NoIDW)
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
''' <summary>
''' set automatic landscape or portrait orientation or a sheet
''' </summary>
''' <param name="tt"></param>
''' <param name="oDrgPrintMgr"></param>
''' <remarks></remarks>
Private Sub setOrientation(ByVal tt As Sheet, ByVal oDrgPrintMgr As PrintManager)
Select Case tt.Orientation
Case PageOrientationTypeEnum.kLandscapePageOrientation
oDrgPrintMgr.Orientation = PrintOrientationEnum.kLandscapeOrientation
'MsgBox("Querformat")
Case PageOrientationTypeEnum.kPortraitPageOrientation
oDrgPrintMgr.Orientation = PrintOrientationEnum.kPortraitOrientation
'MsgBox("Hochformat")
Case Else ' other values.
MsgBox(InventorPlotClass.strings.ErrorPageOrientation, MsgBoxStyle.Critical)
Exit Sub
End Select
End Sub
''' <summary>
''' automatic get correct paper size and plot
''' </summary>
''' <remarks></remarks>
Private Sub plotBestFit()
Dim inv_document As ApprenticeServerDocument = _ActiveDocument
Dim oDrgDoc As DrawingDocument = inv_document
Dim oDrgPrintMgr As PrintManager = oDrgDoc.PrintManager
oDrgPrintMgr.Printer = Me._SetSystemPrinter
Dim tt As Sheet = oDrgDoc.ActiveSheet
setOrientation(tt, oDrgPrintMgr)
Select Case tt.Size
Case DrawingSheetSizeEnum.kA4DrawingSheetSize
'MsgBox("A4")
oDrgPrintMgr.PaperSize = PaperSizeEnum.kPaperSizeA4
If Me.RotatePlot.A4 = True Then oDrgPrintMgr.Rotate90Degrees = True
Case DrawingSheetSizeEnum.kA3DrawingSheetSize
'MsgBox("A3")
oDrgPrintMgr.PaperSize = PaperSizeEnum.kPaperSizeA3
If Me.RotatePlot.A3 = True Then oDrgPrintMgr.Rotate90Degrees = True
Case DrawingSheetSizeEnum.kA2DrawingSheetSize
'MsgBox("A2")
oDrgPrintMgr.PaperSize = PaperSizeEnum.kPaperSizeA2
If Me.RotatePlot.A2 = True Then oDrgPrintMgr.Rotate90Degrees = True
Case DrawingSheetSizeEnum.kA1DrawingSheetSize
'MsgBox("A1")
oDrgPrintMgr.PaperSize = PaperSizeEnum.kPaperSizeA1
If Me.RotatePlot.A1 = True Then oDrgPrintMgr.Rotate90Degrees = True
Case DrawingSheetSizeEnum.kA0DrawingSheetSize
' MsgBox("A0")
oDrgPrintMgr.PaperSize = PaperSizeEnum.kPaperSizeA0
If Me.RotatePlot.A0 = True Then oDrgPrintMgr.Rotate90Degrees = True
Case Else ' Andere Werte.
MsgBox(InventorPlotClass.strings.ErrorPaperSize, MsgBoxStyle.Critical)
Exit Sub
End Select
Plotting(oDrgPrintMgr)
End Sub
''' <summary>
''' plot on an a fixed paper size
''' </summary>
''' <remarks></remarks>
Private Sub PlotDin()
Dim oDrgDoc As DrawingDocument = _ActiveDocument
Dim tt As Sheet = oDrgDoc.ActiveSheet
Dim oDrgPrintMgr As PrintManager = oDrgDoc.PrintManager
oDrgPrintMgr.Printer = Me._SetSystemPrinter
setOrientation(tt, oDrgPrintMgr)
oDrgPrintMgr.PaperSize = Me._FixedPaperSize
Plotting(oDrgPrintMgr)
End Sub
Private Sub Plotting(ByVal oDrgPrintMgr As PrintManager)
oDrgPrintMgr.AllColorsAsBlack = Me._AllColorsAsBlack
If Me._NumberOfCopies > 1 Then oDrgPrintMgr.NumberOfCopies = 1
oDrgPrintMgr.ScaleMode = _PrintScaleMode
oDrgPrintMgr.SubmitPrint()
End Sub
''' <summary>
''' checks if a printer exists
''' </summary>
''' <param name="drucker">printer name</param>
''' <returns>boolen</returns>
''' <remarks></remarks>
Private Function SystemPrinterContains(ByVal drucker As String) As Boolean
For i As Integer = 0 To System.Drawing.Printing.PrinterSettings.InstalledPrinters.Count - 1
If System.Drawing.Printing.PrinterSettings.InstalledPrinters.Item(i).ToLower = drucker.ToLower Then Return True
Next
Return False
End Function
''' <summary>
''' get the default printer name
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Private Function DefaultPrinterName() As String
Dim oPS As New System.Drawing.Printing.PrinterSettings
Try
DefaultPrinterName = oPS.PrinterName
Catch ex As System.Exception
DefaultPrinterName = ""
Finally
oPS = Nothing
End Try
End Function
#Region "TranslatorFunctions"
''' <summary>
''' Use the Inventor translator Add-In to generate a PDF without any further tools
'''
''' Translating Files with the API
''' http://modthemachine.typepad.com/my_weblog/2009/01/translating-files-with-the-api.html
''' </summary>
''' <param name="ThisApplication">Inventor Application object; a Drawing must be the current Document!</param>
''' <param name="OutFile">FullName with complete Path for PDF-File</param>
''' <remarks></remarks>
Shared Sub SaveAsPDF(ByVal ThisApplication As Inventor.Application, ByVal OutFile As String, Optional ByVal AllColorASBlack As Boolean = True)
' Get the PDF translator Add-In.
Dim oPDFTrans As TranslatorAddIn
oPDFTrans = ThisApplication.ApplicationAddIns.ItemById( _
"{0AC6FD96-2F4D-42CE-8BE0-8AEA580399E4}")
If oPDFTrans Is Nothing Then
MsgBox("Could not access PDF translator.")
Exit Sub
End If
' Create some objects that are used to pass information to the translator Add-In.
Dim oContext As TranslationContext
oContext = ThisApplication.TransientObjects.CreateTranslationContext
Dim oOptions As NameValueMap
oOptions = ThisApplication.TransientObjects.CreateNameValueMap
If oPDFTrans.HasSaveCopyAsOptions(ThisApplication.ActiveDocument, _
oContext, oOptions) Then
' Set to print all sheets. This can also have the value
' kPrintCurrentSheet or kPrintSheetRange. If kPrintSheetRange
' is used then you must also use the CustomBeginSheet and
' Custom_End_Sheet to define the sheet range.
oOptions.Value("Sheet_Range") = Inventor.PrintRangeEnum.kPrintAllSheets
' Other possible options...
'oOptions.Value("Custom_Begin_Sheet") = 1
'oOptions.Value("Custom_End_Sheet") = 5
oOptions.Value("All_Color_AS_Black") = True
'oOptions.Value("Remove_Line_Weights") = True
'oOptions.Value("Vector_Resolution") = 200
' Define various settings and input to provide the translator.
oContext.Type = Inventor.IOMechanismEnum.kFileBrowseIOMechanism
Dim oData As DataMedium
oData = ThisApplication.TransientObjects.CreateDataMedium
oData.FileName = OutFile
' Call the translator.
Call oPDFTrans.SaveCopyAs(ThisApplication.ActiveDocument, _
oContext, oOptions, oData)
End If
End Sub
''' <summary>
''' Save File as DWF
'''
''' Autodesk: Discussion Groups - Publish DWF without partlists and/or revision table
''' http://discussion.autodesk.com/forums/message.jspa?messageID=6183760
''' </summary>
''' <param name="ThisApplication"></param>
''' <param name="OutFile">FileName</param>
''' <param name="Launch_Viewer">Start DWF View after saving</param>
''' <param name="Publish_3D_Models"></param>
''' <param name="Publish_All_Sheets"></param>
''' <param name="Publish_Mode"></param>
''' <param name="Enable_Printing"></param>
''' <remarks></remarks>
Shared Sub SaveAsDWF(ByVal ThisApplication As Inventor.Application, ByVal OutFile As String, Optional ByVal Launch_Viewer As Boolean = False, Optional ByVal Publish_3D_Models As Boolean = False, Optional ByVal Publish_All_Sheets As Boolean = True, Optional ByVal Publish_Mode As Inventor.DWFPublishModeEnum = Inventor.DWFPublishModeEnum.kCustomDWFPublish, Optional ByVal Enable_Printing As Boolean = True)
' Get the DWF translator Add-In.
Dim DWFAddIn As TranslatorAddIn
DWFAddIn = ThisApplication.ApplicationAddIns.ItemById("{0AC6FD95-2F4D-42CE-8BE0-8AEA580399E4}")
If DWFAddIn Is Nothing Then
MsgBox("Could not access DWF translator.")
Exit Sub
End If
' 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 = Inventor.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 DWFAddIn.HasSaveCopyAsOptions(oDataMedium, oContext, oOptions) Then
oOptions.Value("Launch_Viewer") = Launch_Viewer
oOptions.Value("Enable_Printing") = Enable_Printing
If TypeOf oDocument Is DrawingDocument Then
' Drawing options
oOptions.Value("Publish_Mode") = Publish_Mode
oOptions.Value("Publish_All_Sheets") = Publish_All_Sheets
oOptions.Value("Publish_3D_Models") = Publish_3D_Models
End If
End If
oDataMedium.FileName = OutFile
'Publish document.
Call DWFAddIn.SaveCopyAs(oDocument, oContext, oOptions, oDataMedium)
End Sub
#End Region
#Region "IPropertiesHelperFunctions"
''' <summary>
''' get the integer name of an iProperty name
''' </summary>
''' <param name="PropName"></param>
''' <param name="oUserPropertySet"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Function chkPropInt(ByVal PropName As String, ByVal oUserPropertySet As PropertySet) As Integer
For i As Integer = 1 To oUserPropertySet.Count
If oUserPropertySet.Item(i).Name = PropName Then Return i
Next i
Return -1
End Function
''' <summary>
''' add a new iProperty item or change the current value
''' </summary>
''' <param name="PropName"></param>
''' <param name="value"></param>
''' <param name="oUserPropertySet"></param>
''' <remarks></remarks>
Private Sub ChangeOrAddProperty(ByVal PropName As String, ByVal value As Object, ByVal oUserPropertySet As PropertySet)
If Me.chkProp(PropName, oUserPropertySet) = True Then
oUserPropertySet(Me.chkPropInt(PropName, oUserPropertySet)).Value = value
Else
oUserPropertySet.Add(value, PropName)
End If
End Sub
''' <summary>
''' checks if a iProperty exists
''' </summary>
''' <param name="PropName">name of the iProperty</param>
''' <param name="oUserPropertySet"></param>
''' <returns>true or false</returns>
''' <remarks></remarks>
Private Function chkProp(ByVal PropName As String, ByVal oUserPropertySet As PropertySet) As Boolean
For i As Integer = 1 To oUserPropertySet.Count
If oUserPropertySet.Item(i).Name = PropName Then Return True
Next i
Return False
End Function
#End Region
End Class
