Below I have combined code for creating a pdf and printing and drawing. I need to add code to do a border swap with prompted entry text and then after creating the pdf and printing revert the border back to the original. So ideally I would run the rule and it would switch to a border with prompted entry text for Signature, Date, Job No, and Rev. The user would fill out that info and then the rule would continue and create the pdf and then print, after that the border would revert back to the original. Also it would be nice if during the prompted text entry, if a rev is entered that is anything other than a "blank, zero or an A" the code would add an additional static stamp onto the drawing as another visual indicator that the drawing has been revised.
If a border swap isn't doable just adding a stamp with the prompted entry text before pdf and printing would work as well but would still need the additional static stamp if an additional rev is entered. Then after pdf and printing the code would remove the stamps.
Edit: The more I think about it, it would probably make more sense to use a stamp instead of swapping out drawing borders because the drawing templates we use vary.
Option Explicit On Imports System.IO
Sub Main CreatePDF() Printing() End Sub Sub CreatePDF() Dim oDrgDoc As DrawingDocument = ThisDoc.Document iProperties.Value("Custom", "PlotDate&Time") = Now.ToString() ' Set reference to drawing print manager' DrawingPrintManager has more options than PrintManager' as it's specific to drawing document Dim oDrgPrintMgr As DrawingPrintManager = oDrgDoc.PrintManager Dim pdfname = ThisDoc.FileName(False) Dim filePath = ThisDoc.Path ' Set the printer name' comment this line to use default printer or assign another one oDrgPrintMgr.Printer = "Microsoft Print To PDF" 'Set the paper size , scale and orientation oDrgPrintMgr.ScaleMode = PrintScaleModeEnum.kPrintBestFitScale oDrgPrintMgr.PaperSize = PaperSizeEnum.kPaperSize11x17 oDrgPrintMgr.PrintRange = PrintRangeEnum.kPrintAllSheets oDrgPrintMgr.Orientation = kLandscapeOrientation 'oDrgPrintMgr.PaperSource = 2 oDrgPrintMgr.AllColorsAsBlack = False Dim pdfFileName = System.IO.Path.Combine(filePath, pdfname + ".pdf") If Not CanSaveToFile(pdfFileName) Then MessageBox.Show("Folder or file is read only", "Save PDF") Dim oFileDlg As Inventor.FileDialog Call ThisApplication.CreateFileDialog(oFileDlg) oFileDlg.FilterIndex = 1 oFileDlg.DialogTitle = "Save file" 'oFileDlg.InitialDirectory = oFileDlg.CancelError = False oFileDlg.FileName = pdfname + ".pdf" Call oFileDlg.ShowSave() pdfFileName = oFileDlg.FileName If String.IsNullOrEmpty(pdfFileName) Then Logger.Info("No file specified") Return End If End If oDrgDoc.SaveAs(pdfFileName, True) End Sub Sub Printing() Dim oDrgDoc As DrawingDocument = ThisDoc.Document 'Plot Stamp 'Applies current filename & path, Date & time, and current user stamp to edge of border to be printed with the drawing '[ iProperties.Value("Custom", "PlotDate&Time") = Now iProperties.Value("Custom", "CurrentUser") = System.Security.Principal.WindowsIdentity.GetCurrent.Name InventorVb.DocumentUpdate() 'Dim oCtrlDef As ControlDefinition 'oCtrlDef = ThisApplication.CommandManager.ControlDefinitions.Item("AppFilePrintCmd") 'oCtrlDef.Execute '] 'Print Setup '[ ' Set reference to drawing print manager' DrawingPrintManager has more options than PrintManager' as it's specific to drawing document Dim oDrgPrintMgr As DrawingPrintManager = oDrgDoc.PrintManager ' Set the printer name' comment this line to use default printer or assign another one 'oDrgPrintMgr.Printer = "\\kcidc2012\EngineeringSharp_Ledger" 'oDrgPrintMgr.Printer = "EngineeringSharp_Ledger" 'oDrgPrintMgr.Printer = "\\kcidc2012\EngineeringSharp_Ledger_Color" oDrgPrintMgr.Printer = "\\kcipdc2019\Engineering_Ledger_Color" 'Set the paper size , scale and orientation 'oDrgPrintMgr.ScaleMode = PrintScaleModeEnum.kPrintCustomScale oDrgPrintMgr.ScaleMode = PrintScaleModeEnum.kPrintBestFitScale 'oDrgPrintMgr.PaperSize = PaperSizeEnum.kPaperSizeLedger 'oDrgPrintMgr.PaperSize = PaperSizeEnum.14338 'oDrgPrintMgr.PaperSize = PaperSizeLedger oDrgPrintMgr.PrintRange = kPrintCurrentSheet oDrgPrintMgr.Orientation = kLandscapeOrientation oDrgPrintMgr.PaperSource = 2 oDrgPrintMgr.AllColorsAsBlack = False oDrgPrintMgr.SubmitPrint '] End Sub Function CanSaveToFile(fileName As String) Dim FileInfo As New FileInfo(fileName) If FileInfo.Exists Then If FileInfo.IsReadOnly Then Return False ElseIf FileIsLocked(FileInfo) Then ' We can't write to it. It might be open in Adobe Acrobat Reader Return False End If End If ' make sure we can write to the directory Dim folderName = System.IO.Path.GetDirectoryName(fileName) Dim tempName = System.IO.Path.Combine(folderName, System.Guid.NewGuid().ToString() + ".txt") Try System.IO.File.WriteAllText(tempName, "test") System.IO.File.Delete(tempName) Catch Return False End Try Return True End Function ' from https://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use Function FileIsLocked(FileInfo As FileInfo) As Boolean Dim Stream As FileStream = Nothing Try Stream = FileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.None) Catch ex As IOException 'the file is unavailable because it is: 'still being written To 'or being processed By another thread 'or does Not exist (has already been processed) Return True Finally If (Stream IsNot Nothing) Then Stream.Close() End If End Try Return False End Function
Hi @Jason.Rugg. One way to tackle this kind of situation might be to simply create a copy of the drawing, then make all the needed changes to that copy, export & print it, then delete that copy, leaving your original unchanged. This would likely be much less challenging to set-up than trying to retain lots of original data, changing borders/stamps twice, and restoring original data back in place later. Just a thought.
Wesley Crihfield
(Not an Autodesk Employee)
@WCrihfield I don't disagree with you, we essentially just need a one button click with minimal user interface that's simple. Currently it is making the pdf and printing, just need to get it to add the stamp(s) beforehand and then remove them after. It can even be simplified more I think by instead of it trying to detect a rev, have it pop up a question and ask if it is a revised drawing and if "yes" it adds the additional stamp.
If I can get this to work, the user clicks the button, fills in the text, it pdf's and prints and then maybe at the very end when its done it displays a completed message and reminds the user to place a copy of the pdf in vault.
Hi @Jason.Rugg
See these examples.
I hope this helps.
Best of luck to you in all of your Inventor pursuits,
Curtis
http://inventortrenches.blogspot.com
Sub main
Call PlaceStamp
End Sub
Sub PlaceStamp
' reference to the sketched symbol definition.
Dim oSymbolDef As SketchedSymbolDefinition
oSymbolDef = ThisDrawing.Document.SketchedSymbolDefinitions.Item("Release Stamp")
Dim oSheet As Sheet = ThisDrawing.Document.ActiveSheet
'create insertion point, coordinates - in cm !
Dim oTG As TransientGeometry = ThisApplication.TransientGeometry
Dim oPoint As Point2d = oTG.CreatePoint2d(10, 10)
Dim sPromptStrings(3) As String
'get prompt values, this example just uses hardcoded values
sPromptStrings(0) = "CDW" 'Signature
sPromptStrings(1) = DateString 'Date
sPromptStrings(2) = "12345" 'Job
sPromptStrings(3) = "1.1" 'Rev
' Add an instance of the sketched symbol to the sheet.
' Rotate angle = 0 radians, scale = 1
Dim oSymbol As SketchedSymbol
oSymbol = oSheet.SketchedSymbols.Add(oSymbolDef, oPoint, 0, 1, sPromptStrings)
Call PrintPDF
oSymbol.Delete
End Sub
Sub PrintPDF
'your PDF code here
MsgBox("PDF")
End Sub
Sub main
Call SwapBorder
End Sub
Sub SwapBorder
'get current border
oCurrentBorderName = ThisDrawing.ActiveSheet.Border.ToString
oNewBorderName = "Release Border"
'get prompt values, this example just uses hardcoded values
oPromptedEntry1 = "CDW" 'Signature
oPromptedEntry2 = DateString 'Date
oPromptedEntry3 = "12345" 'Job
oPromptedEntry4 = "1.1" 'Rev
'place new border ( with prompted entry
ActiveSheet.SetBorder(oNewBorderName, oPromptedEntry1, oPromptedEntry2, oPromptedEntry3, oPromptedEntry4)
Call PrintPDF
'place original border (no prompted entry)
ActiveSheet.SetBorder(oCurrentBorderName)
End Sub
Sub PrintPDF
'your PDF code here
MsgBox("PDF")
End Sub
Hey @Curtis_Waguespack I have been working with the PlaceStamp example you showed. I have it incorporated into my code and is working with hardcoded entry. How do I make them prompted entry? Also when I print it makes a print with the stamp and a second without the stamp, I don't need the second print, how do I adjust the code to fix that?
Option Explicit On Imports System.IO
Sub Main PlaceStamp() CreatePDF() Printing() End Sub Sub PlaceStamp ' reference to the sketched symbol definition. Dim oSymbolDef As SketchedSymbolDefinition oSymbolDef = ThisDrawing.Document.SketchedSymbolDefinitions.Item("KCI APPROVED FOR FABRICATION STAMP") Dim oSheet As Sheet = ThisDrawing.Document.ActiveSheet 'create insertion point, coordinates - in cm ! Dim oTG As TransientGeometry = ThisApplication.TransientGeometry Dim oPoint As Point2d = oTG.CreatePoint2d(10, 10) ' Add an instance of the sketched symbol definition to the sheet. ' Rotate angle = 0 radians, scale = 1 when adding Dim sPromptStrings(3) As String 'get prompt values, this example just uses hardcoded values sPromptEntry1(0) = "CDW" 'Signature sPromptStrings(1) = DateString 'Date sPromptStrings(2) = "12345" 'Job sPromptStrings(3) = "1.1" 'Rev Dim oSymbol As SketchedSymbol oSymbol = oSheet.SketchedSymbols.Add(oSymbolDef, oPoint, 0, 1, sPromptStrings) Call CreatePDF Call Printing oSymbol.Delete End Sub Sub CreatePDF() Dim oDrgDoc As DrawingDocument = ThisDoc.Document iProperties.Value("Custom", "PlotDate&Time") = Now.ToString() ' Set reference to drawing print manager' DrawingPrintManager has more options than PrintManager' as it's specific to drawing document Dim oDrgPrintMgr As DrawingPrintManager = oDrgDoc.PrintManager Dim pdfname = ThisDoc.FileName(False) Dim filePath = ThisDoc.Path ' Set the printer name' comment this line to use default printer or assign another one oDrgPrintMgr.Printer = "Microsoft Print To PDF" 'Set the paper size , scale and orientation oDrgPrintMgr.ScaleMode = PrintScaleModeEnum.kPrintBestFitScale oDrgPrintMgr.PaperSize = PaperSizeEnum.kPaperSize11x17 oDrgPrintMgr.PrintRange = PrintRangeEnum.kPrintAllSheets oDrgPrintMgr.Orientation = kLandscapeOrientation 'oDrgPrintMgr.PaperSource = 2 oDrgPrintMgr.AllColorsAsBlack = False Dim pdfFileName = System.IO.Path.Combine(filePath, pdfname + ".pdf") If Not CanSaveToFile(pdfFileName) Then MessageBox.Show("Folder or file is read only", "Save PDF") Dim oFileDlg As Inventor.FileDialog Call ThisApplication.CreateFileDialog(oFileDlg) oFileDlg.FilterIndex = 1 oFileDlg.DialogTitle = "Save file" 'oFileDlg.InitialDirectory = oFileDlg.CancelError = False oFileDlg.FileName = pdfname + ".pdf" Call oFileDlg.ShowSave() pdfFileName = oFileDlg.FileName If String.IsNullOrEmpty(pdfFileName) Then Logger.Info("No file specified") Return End If End If oDrgDoc.SaveAs(pdfFileName, True) End Sub Sub Printing() Dim oDrgDoc As DrawingDocument = ThisDoc.Document 'Plot Stamp 'Applies current filename & path, Date & time, and current user stamp to edge of border to be printed with the drawing '[ iProperties.Value("Custom", "PlotDate&Time") = Now iProperties.Value("Custom", "CurrentUser") = System.Security.Principal.WindowsIdentity.GetCurrent.Name InventorVb.DocumentUpdate() 'Dim oCtrlDef As ControlDefinition 'oCtrlDef = ThisApplication.CommandManager.ControlDefinitions.Item("AppFilePrintCmd") 'oCtrlDef.Execute '] 'Print Setup '[ ' Set reference to drawing print manager' DrawingPrintManager has more options than PrintManager' as it's specific to drawing document Dim oDrgPrintMgr As DrawingPrintManager = oDrgDoc.PrintManager ' Set the printer name' comment this line to use default printer or assign another one 'oDrgPrintMgr.Printer = "\\kcidc2012\EngineeringSharp_Ledger" 'oDrgPrintMgr.Printer = "EngineeringSharp_Ledger" 'oDrgPrintMgr.Printer = "\\kcidc2012\EngineeringSharp_Ledger_Color" oDrgPrintMgr.Printer = "\\kcipdc2019\Engineering_Ledger_Color" 'Set the paper size , scale and orientation 'oDrgPrintMgr.ScaleMode = PrintScaleModeEnum.kPrintCustomScale oDrgPrintMgr.ScaleMode = PrintScaleModeEnum.kPrintBestFitScale 'oDrgPrintMgr.PaperSize = PaperSizeEnum.kPaperSizeLedger 'oDrgPrintMgr.PaperSize = PaperSizeEnum.14338 'oDrgPrintMgr.PaperSize = PaperSizeLedger oDrgPrintMgr.PrintRange = kPrintCurrentSheet oDrgPrintMgr.Orientation = kLandscapeOrientation oDrgPrintMgr.PaperSource = 2 oDrgPrintMgr.AllColorsAsBlack = False oDrgPrintMgr.SubmitPrint '] End Sub Function CanSaveToFile(fileName As String) Dim FileInfo As New FileInfo(fileName) If FileInfo.Exists Then If FileInfo.IsReadOnly Then Return False ElseIf FileIsLocked(FileInfo) Then ' We can't write to it. It might be open in Adobe Acrobat Reader Return False End If End If ' make sure we can write to the directory Dim folderName = System.IO.Path.GetDirectoryName(fileName) Dim tempName = System.IO.Path.Combine(folderName, System.Guid.NewGuid().ToString() + ".txt") Try System.IO.File.WriteAllText(tempName, "test") System.IO.File.Delete(tempName) Catch Return False End Try Return True End Function ' from https://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use Function FileIsLocked(FileInfo As FileInfo) As Boolean Dim Stream As FileStream = Nothing Try Stream = FileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.None) Catch ex As IOException 'the file is unavailable because it is: 'still being written To 'or being processed By another thread 'or does Not exist (has already been processed) Return True Finally If (Stream IsNot Nothing) Then Stream.Close() End If End Try Return False End Function
Hi @Jason.Rugg
See this updated example.
I hope this helps.
Best of luck to you in all of your Inventor pursuits,
Curtis
http://inventortrenches.blogspot.com
Sub main
Call PlaceStamp
Call CreatePDF
Call Printing
Call DeleteStamp
End Sub
Sub PlaceStamp
' reference to the sketched symbol definition.
Dim oSymbolDef As SketchedSymbolDefinition
oSymbolDef = ThisDrawing.Document.SketchedSymbolDefinitions.Item("Release Stamp")
Dim oSheet As Sheet = ThisDrawing.Document.ActiveSheet
'create insertion point, coordinates - in cm !
Dim oTG As TransientGeometry = ThisApplication.TransientGeometry
Dim oPoint As Point2d = oTG.CreatePoint2d(10, 10)
Dim sPromptStrings(3) As String
sPromptStrings(0) = InputBox("Enter Signature", "iLogic", "")
sPromptStrings(1) = InputBox("Enter Date", "iLogic", "")
sPromptStrings(2) = InputBox("Enter Job #", "iLogic", "")
sPromptStrings(3) = InputBox("Enter Rev", "iLogic", "")
' Add an instance of the sketched symbol to the sheet.
' Rotate angle = 0 radians, scale = 1
Dim oSymbol As SketchedSymbol
oSymbol = oSheet.SketchedSymbols.Add(oSymbolDef, oPoint, 0, 1, sPromptStrings)
End Sub
Sub DeleteStamp
Dim oSymbol As SketchedSymbol
For Each oSymbol In ThisDrawing.Document.ActiveSheet.SketchedSymbols
If oSymbol.Name = "Release Stamp" Then oSymbol.Delete
Next
End Sub
Sub CreatePDF
'your PDF code here
MsgBox("PDF")
End Sub
Sub Printing
'your printng code here
MsgBox("Printing")
End Sub
@Jason.Rugg, I'm not sure if you have had success with @Curtis_Waguespack 's latest update, but I have a workflow suggestion which might require less iLogic.
We had a RFP "Stamp" that was requested for our drawings to clearly identify if a drawing on the shop floor is true RFP status. Instead of creating a sketch symbol with prompted entries, I created a custom iProperty and set it up in my Border sketch where I wanted it to show up. When the iProperty is left blank, it appears as if it don't exist. Then when you add text to the iProperty, it populates to every sheet because they all use the same border. I do this manually because I just have 1 entry and don't want to revert my drawing, but you could set up a form linked to the iProperty values for the user to fill out then press a "Process" button which calls an iLogic rule to print and then clear the iProperty values to return it to original.
I'm not sure if you work with multi-sheet drawings, but I found this approach to be very easy to manage for the multi-sheet drawings we produce.
Can't find what you're looking for? Ask the community or share your knowledge.