ilogic batch create flat pattern to individual dxf

ilogic batch create flat pattern to individual dxf

LeanderTorres
Advocate Advocate
1,021 Views
5 Replies
Message 1 of 6

ilogic batch create flat pattern to individual dxf

LeanderTorres
Advocate
Advocate

Hi,

 

I came across the Ilogic code in this forum post made by @JhoelForshav , and it works great and saves me a lot of manual clicking. Solved: Save all sheetmetal parts from assembly to DXF - Autodesk Community - Inventor

 

Is there an easy way let this code make 1 dxf file per flat pattern instead of appending them to the same dxf file?

 

Thanks in advance

Leander Torres

 

the code:

Sub Main
'iLogic Code by Jhoel Forshav - originally posted at https://clintbrown.co.uk/ilogic-export-all-flat-patterns-to-one-dxf
'Check that the active document is an assembly file
If ThisApplication.ActiveDocument.DocumentType <> kAssemblyDocumentObject Then
MessageBox.Show("This rule can only run from an Assembly file", "DXF-creator", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End If
'Dim the active document as AssemblyDocument
Dim oDoc As AssemblyDocument = ThisApplication.ActiveDocument
'Make sure the assembly is saved
If oDoc.FullFileName = ""
MessageBox.Show("Please save the Assembly before running this rule.", "DXF-creator", MessageBoxButtons.OK, MessageBoxIcon.Information)
Exit Sub
End If
'Get the assembly filename without extension
Dim oAsmName As String = System.IO.Path.GetFileNameWithoutExtension(oDoc.FullFileName)
'Get the assembly filepath
Dim oPath As String = System.IO.Path.GetDirectoryName(oDoc.FullFileName)

'Get the parts only BOM.
Dim oBOM As BOM = oDoc.ComponentDefinition.BOM
'Make sure Parts Only is activated
oBOM.PartsOnlyViewEnabled = True
'Parts only will be last BomView (difficult to get by name since it's different depending on your language)
Dim oBOMview As BOMView = oBOM.BOMViews.Item(oBOM.BOMViews.Count)


'Set a reference to the TransientGeometry object
Dim oTG As TransientGeometry = ThisApplication.TransientGeometry
'oX and oY will be used to create points for view placement
Dim oX As Double = 0
Dim oY As Double = 0
'Create the Baseview options to place flatpattern-views
Dim oBaseViewOptions As NameValueMap
oBaseViewOptions = ThisApplication.TransientObjects.CreateNameValueMap
oBaseViewOptions.Add("SheetMetalFoldedModel", False)
'Set a variable for the drawing document
Dim oDrawing As DrawingDocument
'Create a String to return a message if any SM-parts are not saved
Dim unsavedSmParts As String = ""

Dim i As Integer = 1
Dim oInfo As String = ""

'Traverse Parts Only BOM
For Each oRow As BOMRow In oBOMview.BOMRows
Try
'Get the component definition for the part
Dim oDef As ComponentDefinition = oRow.ComponentDefinitions(1)
'Check if the part is SheetMetal
If TypeOf (oDef) Is SheetMetalComponentDefinition
'Set a reference to the partdocument
Dim smPartDoc As PartDocument = oDef.Document
'Check if the part is saved
If smPartDoc.FullFileName = "" Then
If unsavedSmParts = "" Then unsavedSmParts = "The fallowing SM-documents were not saved and therefore " & _
"no drawingviews were created:" & vbCrLf
unsavedSmParts = unsavedSmParts & vbCrLf & oDef.Document.DisplayName
Continue For
End If
'Create flatpattern if it doesn't already exist
If Not oDef.HasFlatPattern
oDef.Unfold()
oDef.FlatPattern.ExitEdit()
End If
'Create the drawing if it doesn't already exist
If oDrawing Is Nothing
oDrawing = ThisApplication.Documents.Add(DocumentTypeEnum.kDrawingDocumentObject, _
, False)
'Set the drawings length units to the same as the assemblys length units
oDrawing.UnitsOfMeasure.LengthUnits = oDoc.UnitsOfMeasure.LengthUnits
End If

'Set a reference to the drawing sheet
Dim oSheet As Sheet = oDrawing.ActiveSheet


'Create the flatpattern view
Dim oView As DrawingView = oSheet.DrawingViews.AddBaseView(smPartDoc, oTG.CreatePoint2d(oX, oY), 1 _
, ViewOrientationTypeEnum.kDefaultViewOrientation, DrawingViewStyleEnum.kHiddenLineRemovedDrawingViewStyle, _
"FlatPattern", , oBaseViewOptions)

oView.Name = smPartDoc.DisplayName & vbNewLine & "Thickness: " & smPartDoc.ComponentDefinition.Thickness.Expression _
& vbNewLine & "Material: " & smPartDoc.PropertySets("Design Tracking Properties")("Material").Value & _
vbCrLf & "Quantity: " & oDoc.ComponentDefinition.Occurrences.AllReferencedOccurrences(smPartDoc).Count
oView.ShowLabel = True

'Set the position with our oX and oY
oView.Position = oTG.CreatePoint2d(oView.Position.X + oView.Width / 2, oView.Position.Y)
'Move oX to place the next view to the right of this one
oX = oView.Left + oView.Width + 1
'Remove the bend lines of the view
RemoveBendLines(oView, oDef.FlatPattern)'You could comment out this line to keep bend lines


oInfo = oInfo & If (i = 1, "", vbCrLf) & i & ". " & smPartDoc.PropertySets.Item("Design Tracking Properties"). _
Item("Part Number").Value & " - Thickness: " & oDef.Thickness.Expression & " - Material: " _
& smPartDoc.PropertySets("Design Tracking Properties")("Material").Value & " - Quantity: " & _
oDoc.ComponentDefinition.Occurrences.AllReferencedOccurrences(smPartDoc).Count

i += 1

'Close the part
smPartDoc.Close(True)
End If
Catch Ex As Exception
MsgBox(Ex.Message)
End Try
Next
If oDrawing IsNot Nothing
'Create the save location string for the DXF
Dim oDXFName As String = oPath & "\" & oAsmName & "_FlatPatterns.dxf"
'Save the DXF
oINI = "C:\TEMP\INI.ini" 'Specify your INI file location here (eg C:\TEMP\DXF Export.ini)

If oINI = "" Then
MessageBox.Show("You need to specify an INI file location in the code - Look for oINI and set the path", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
SaveDXF(oDrawing, oDXFName, oINI)
'Create the save location string for the information txt
Dim oInfoName As String = oPath & "\" & oAsmName & "_FlatPatterns.txt"
'Create the txt
CreateTXT(oInfo, oInfoName)
End If
'Close the drawing
oDrawing.Close

 

'return information about any unsaved parts
If unsavedSmParts <> "" Then _
MessageBox.Show(unsavedSmParts, "Some parts were not saved", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
'Update the assembly (could be dirty if any flatpatterns were created)
oDoc.Update
End Sub

Sub SaveDXF(oDrawing As DrawingDocument, oFileName As String, oIniFile As String)
'Set a reference to the DFX translator
Dim DXFAddIn As TranslatorAddIn
DXFAddIn = ThisApplication.ApplicationAddIns.ItemById("{C24E3AC4-122E-11D5-8E91-0010B541CD80}")
'Create translation context
Dim oContext As TranslationContext = ThisApplication.TransientObjects.CreateTranslationContext
oContext.Type = IOMechanismEnum.kFileBrowseIOMechanism
'Create options for the translation
Dim oOptions As NameValueMap = ThisApplication.TransientObjects.CreateNameValueMap
'Create a DataMedium object
Dim oDataMedium As DataMedium = ThisApplication.TransientObjects.CreateDataMedium
'Set the options (which .ini-file to use)
If DXFAddIn.HasSaveCopyAsOptions(oDrawing, oContext, oOptions) Then
oOptions.Value("Export_Acad_IniFile") = oIniFile
End If
'Set the filename property of the DataMedium object
oDataMedium.FileName = oFileName
Try
'Try to save the DXF
DXFAddIn.SaveCopyAs(oDrawing, oContext, oOptions, oDataMedium)
MessageBox.Show("Dxf saved to: " & oFileName, "DXF SAVED", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch
MessageBox.Show("Couldn't save dxf!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub

Sub RemoveBendLines(oView As DrawingView, oFlattPattern As FlatPattern)
'Get all the bend edges from the FlatPattern
Dim oBendEdgesUp As Edges = oFlattPattern.GetEdgesOfType(FlatPatternEdgeTypeEnum.kBendUpFlatPatternEdge)
Dim oBendEdgesDown As Edges = oFlattPattern.GetEdgesOfType(FlatPatternEdgeTypeEnum.kBendDownFlatPatternEdge)

For Each oEdge As Edge In oBendEdgesUp
'Get the curves representing these edges in the drawing view
For Each oCurve As DrawingCurve In oView.DrawingCurves(oEdge)
For Each oSegment As DrawingCurveSegment In oCurve.Segments
'Set visibility to false
oSegment.Visible = False
Next
Next
Next
For Each oEdge As Edge In oBendEdgesDown
For Each oCurve As DrawingCurve In oView.DrawingCurves(oEdge)
For Each oSegment As DrawingCurveSegment In oCurve.Segments
oSegment.Visible = False
Next
Next
Next
End Sub

Sub CreateTXT(oText As String, oFileName As String)
Dim oTxtWriter As System.IO.StreamWriter = System.IO.File.CreateText(oFileName)
oTxtWriter.WriteLine(oText)
oTxtWriter.Close()
End Sub

 

0 Likes
Accepted solutions (1)
1,022 Views
5 Replies
Replies (5)
Message 2 of 6

WCrihfield
Mentor
Mentor

Hi @LeanderTorres.  That code process creates a drawing view of each sheet metal flat pattern within one sheet, within one drawing document, then exports that drawing document to a DXF file.  It was done that way specifically to get all of the profiles into one DXF file.  The usual process to get one DXF file for each sheet metal flat pattern in an assembly, is to export each flat pattern directly from the model to a DXF file, with no drawing document involved.  There are lots of examples of code like this here on this forum, because it has been a popular topic for many years.  However, when exporting flat patterns directly from the models to DXF files, they use a different method.  This other method lets user specify most of the individual settings for the export process in one (often very long, and complicated looking) String value, instead of only specifying one 'INI' file.  Because of this, there are many different variations of that type of code, because everyone has slightly different needs / requirements, so the settings for the export are often different in each example.

Wesley Crihfield

EESignature

(Not an Autodesk Employee)

Message 3 of 6

LeanderTorres
Advocate
Advocate
Hi, thanks for the response.

The upside of this code is that the QTY and part number are also be mentioned in the dxf wich is easy for ordering plates from a cutting company, this can not be done when creating the dxf from the sheet metal part itself.

This code in its current form already saves me a lot of tedious work, a lot of cutting companies allow uploading of files to their websites for instant quotation and ordering, but they require seperate dxf files.
0 Likes
Message 4 of 6

WCrihfield
Mentor
Mentor

OK.  That makes sense.  It sounds like we would just need to make sure that each flat pattern drawing view is on another sheet then.  When exporting a multi-sheet drawing to DXF, it will usually create a different DXF file for each sheet automatically, with the sheet name usually being at the end of the file name.  I do not think we have much control over the individual file names in that situation though.  But the file names can be changed by the code after they get generated, if required.  This does not sound like too much work to change the way you want it.

Wesley Crihfield

EESignature

(Not an Autodesk Employee)

Message 5 of 6

WCrihfield
Mentor
Mentor
Accepted solution

Give this edited version a try, and see if it works as you expected.  Since the code is so long, I put the code in a text file, and attached it here.  Main change was declaring 'oSheet' variable before loop, then within loop, if Nothing, set to active sheet, but if not Nothing, set to New sheet.

One thing that might also add benefit to this process is assigning a name to each sheet with more meaning, such as something specific to the profile being placed onto it, like Part Number.  But if you do, be careful about any special characters that would not work in a file name / file path, and make sure they are all unique.

 

Wesley Crihfield

EESignature

(Not an Autodesk Employee)

Message 6 of 6

LeanderTorres
Advocate
Advocate

Works like a charm, thank you very much. Super big time saver.

0 Likes