Export Face as DXF

I’m using the attached macro to generate DXFs from a multibody part in SolidWorks. It saves each DXF with a specific naming format that pulls info from both the part's custom properties and the cut list.

The DXF filename ends up looking like:
MK1-10382-010-01_5MM_MSPL_1OFF.DXF
That’s made up of: Project No + Number (from the custom properties) and THICKNESS + MATERIAL + QTY (from the cut list properties of the selected body).

It works by

  • I select the face I want to use for the DXF view.
  • Run the macro.
  • It creates a DXF using that face and then hides the body.

The issue: In the multibody part, there might be 5 identical bodies. Right now, the macro only hides the one I selected. I’d like to improve it so that after exporting the DXF, it hides all bodies that are the same as the one selected (based on cut list grouping).

Has anyone tackled something similar or know a way to scan and hide all identical cut list bodies?
 


Option Explicit

Sub main()
Dim swApp               As SldWorks.SldWorks
Dim Part                As SldWorks.ModelDoc2
Dim swFace              As SldWorks.Face2
Dim swBody              As SldWorks.Body2
Dim feat                As SldWorks.Feature
Dim swCustPropMgr       As SldWorks.CustomPropertyManager
Dim SelMgr              As SldWorks.SelectionMgr
Dim BodyFolder          As SldWorks.BodyFolder
Dim CutListBdy          As Body2
Dim strValue(14)        As String
Dim WorkFace            As Face2
Dim WorkSurface         As Surface
Dim savepathdxf         As String
Dim varAlignment        As Variant
Dim dataAlignment(11)   As Double
Dim seltype             As Integer
Dim i                   As Integer
Dim isThisAPlane        As Boolean
Dim vBodies             As Variant
Dim j                   As Integer
Dim wasResolved         As Boolean
Dim itemnumber          As String
Dim config              As SldWorks.Configuration
Dim swCustPropMgr1      As SldWorks.CustomPropertyManager
Dim xlApp               As Excel.Application
Dim xlWorkbook          As Excel.Workbook
Dim intLastRow          As Long
Dim FilePath            As String
Dim MyRange             As Range
Dim DateCreated         As Variant
Dim FilePath2           As String


Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc

'Don't run if no part is loaded
If Part Is Nothing Then
    swApp.SendMsgToUser "There is no part loaded."
    GoTo cleanupandquitnopart
End If

'did the user have the open file saved
If Part.GetPathName = "" Then
        'user does not have open file saved
        swApp.SendMsgToUser "Please save the file before running this script."
        GoTo cleanupandquit
End If

Set swCustPropMgr = Part.Extension.CustomPropertyManager("")
'Get Custom Property Project
swCustPropMgr.Get5 "Project", False, strValue(8), strValue(0), wasResolved
'Get Custom Property Number
swCustPropMgr.Get5 "Number", False, strValue(9), strValue(1), wasResolved

'Get Custom MK Number
Set config = Part.GetActiveConfiguration
Set swCustPropMgr1 = config.CustomPropertyManager
swCustPropMgr1.Get5 "Config No", False, strValue(11), strValue(10), wasResolved

'did the user pre-select a face?
Set SelMgr = Part.SelectionManager
If SelMgr.GetSelectedObjectCount2(1) <> 1 Then
seltype = SelMgr.GetSelectedObjectType3(1, 0)
    If seltype <> SwConst.swSelFACES Then
        'user did not preselect one face
        swApp.SendMsgToUser "Please select a (one) 2D face before running this command."
        GoTo cleanupandquit
     Else
           
    Set swFace = SelMgr.GetSelectedObject6(1, -1)
    Set swBody = swFace.GetBody
        
    Set feat = Part.FirstFeature
    While Not feat Is Nothing
        If feat.GetTypeName = "CutListFolder" Or feat.GetTypeName = "SubWeldFolder" Then
            Set BodyFolder = feat.GetSpecificFeature2
            vBodies = BodyFolder.GetBodies
            If Not IsEmpty(vBodies) Then
            For j = LBound(vBodies) To UBound(vBodies)
                Set CutListBdy = vBodies(j)
                If CutListBdy.Name = swBody.Name Then
                Set swCustPropMgr = feat.CustomPropertyManager
                    'Get Custom Property THICKNESS from cut list
                        swCustPropMgr.Get5 "THICKNESS", False, strValue(5), strValue(2), wasResolved
                    'Get Custom Property MATERIAL from cut list
                        swCustPropMgr.Get5 "MATERIAL", False, strValue(6), strValue(3), wasResolved
                    'Get Custom Property QUANTITY from cut list
                        swCustPropMgr.Get5 "QUANTITY", False, strValue(7), strValue(4), wasResolved
                    'Get Custom Property LENGTH from cut list
                        swCustPropMgr.Get5 "LENGTH", False, strValue(8), strValue(5), wasResolved
                    'Get Custom Property SECTION from cut list
                        swCustPropMgr.Get5 "SECTION", False, strValue(9), strValue(6), wasResolved
                'Part.FeatureManager.HideBodies
                itemnumber = feat.Name
                End If
            Next j
            End If
        End If
        Set feat = feat.GetNextFeature()
        
    Wend
       
    End If
    
End If

'Determine if the selected face is a true 2D plane... exit if not
isThisAPlane = False  'initalize variable to false
'make sure that what is selected is a face... exit if not


If SelMgr.GetSelectedObjectType3(1, -1) <> 2 Then
    swApp.SendMsgToUser "Item selected is not a face. You must select a (one) complete 2D Face to export."
    GoTo cleanupandquit
End If

Set WorkFace = SelMgr.GetSelectedObject5(1)
Set WorkSurface = WorkFace.GetSurface
isThisAPlane = WorkSurface.IsPlane

If isThisAPlane = False Then
    swApp.SendMsgToUser "The face selected is not 2D. Please select a (one) 2D face before running this command."
    GoTo cleanupandquit
End If
            
'Save a DXF
    dataAlignment(0) = 0#
    dataAlignment(1) = 0#
    dataAlignment(2) = 0#
    dataAlignment(3) = 1#
    dataAlignment(4) = 0#
    dataAlignment(5) = 0#
    dataAlignment(6) = 0#
    dataAlignment(7) = 1#
    dataAlignment(8) = 0#
    dataAlignment(9) = 0#
    dataAlignment(10) = 0#
    dataAlignment(11) = 1#
    varAlignment = dataAlignment

'Clean off the file name so that we can add our desired name
savepathdxf = "C:\Working\1. Profiles & Images\"

'File name in the standard of 70556-061-3_3MM_MILD STEEL PL_2OFF_REVA.DXF (Item 3 was selected)
savepathdxf = savepathdxf & strValue(10) & "-" & strValue(0) & "-" & strValue(1) & "-" & itemnumber & "_" & strValue(2) & "MM_" & strValue(3) & " PL_" & strValue(4) & "OFF_REVA" & ".DXF"

 
     'save Excel File and dxf file names in the Profiles & Images folder on local C drive
     'Save dxf File Name in excel
     
                    FilePath = "C:\Working\1. Profiles & Images\" & strValue(0) & "-DXF FILE NAMES.xlsx"
                    DateCreated = Date
                    If Dir(FilePath) <> "" Then
                        Workbooks.Open FilePath
                
                    With Workbooks
                       
                            intLastRow = Cells(Rows.Count, "A").End(xlUp).Row
                            
                                Cells(intLastRow + 1, 1).Value = strValue(10) & "-" & strValue(0) & "-" & strValue(1) & "-" & itemnumber & "_" & strValue(2) & "MM_" & strValue(3) & " PL_" & strValue(4) & "OFF_REVA" & ".DXF"
                                Cells(intLastRow + 1, 4).Value = strValue(10) & "-" & strValue(0) & "-" & strValue(1)
                                Cells(intLastRow + 1, 5).Value = itemnumber
                                Cells(intLastRow + 1, 6).Value = DateCreated
                                Cells(intLastRow + 1, 8).Value = strValue(5)
                                Cells(intLastRow + 1, 9).Value = strValue(6)
                                Cells(intLastRow + 1, 10).Value = strValue(2)
                                Cells(intLastRow + 1, 11).Value = strValue(4)
                                Cells(intLastRow + 1, 12).Value = strValue(3)
                                Cells(intLastRow + 1, 14).Value = strValue(1)
                    End With
                
                'DELETE DUPLICATES
                    Set MyRange = ActiveSheet.Range("A1:N1" & intLastRow)
                    MyRange.RemoveDuplicates Columns:=1, Header:=xlYes
                
                'SORT
                        Dim oneRange As Range
                        Dim aCellA As Range
                        Dim aCellB As Range
                        Set oneRange = Range("A1:N1000")
                        Set aCellA = Range("E1")
                        Set aCellB = Range("N1")
                        oneRange.Sort Key1:=aCellA, Order1:=xlAscending, Header:=xlYes
                        oneRange.Sort Key1:=aCellB, Order1:=xlAscending, Header:=xlYes
                    ActiveWorkbook.Save
                    Workbooks.Close
                    
                    ElseIf Dir(FilePath) = "" Then
                         
                            Set xlApp = CreateObject("Excel.Application")
                            xlApp.Visible = True
                            Set xlWorkbook = xlApp.Workbooks.Add
                               xlWorkbook.SaveAs FilePath
                               'This is where the excel file is saved.
                                                   
                    With xlWorkbook.Worksheets(1)
                             
                            .Cells(1, 1).Value = "DXF FILE NAME"
                            .Cells(1, 2).Value = "TRANSMISSION"
                            .Cells(1, 4).Value = "PART #"
                            .Cells(1, 5).Value = "ITEM #"
                            .Cells(1, 6).Value = "DATE CREATED"
                            .Cells(1, 8).Value = "LENGTH"
                            .Cells(1, 9).Value = "SECTION"
                            .Cells(1, 10).Value = "THICKNESS"
                            .Cells(1, 11).Value = "QTY"
                            .Cells(1, 12).Value = "MATERIAL"
                            .Cells(1, 14).Value = "NUMBER"
                            
                            .Cells(2, 1).Value = strValue(10) & "-" & strValue(0) & "-" & strValue(1) & "-" & itemnumber & "_" & strValue(2) & "MM_" & strValue(3) & " PL_" & strValue(4) & "OFF_REVA" & ".DXF"
                            .Cells(2, 4).Value = strValue(10) & "-" & strValue(0) & "-" & strValue(1)
                            .Cells(2, 5).Value = itemnumber
                            .Cells(2, 6).Value = DateCreated
                            .Cells(2, 8).Value = strValue(5)
                            .Cells(2, 9).Value = strValue(6)
                            .Cells(2, 10).Value = strValue(2)
                            .Cells(2, 11).Value = strValue(4)
                            .Cells(2, 12).Value = strValue(3)
                            .Cells(2, 14).Value = strValue(1)
                    End With
                    xlWorkbook.Save
                    xlWorkbook.Close
                    xlApp.Quit
                    End If
    
    'save Excel File and dxf file names in running folder on z-drive
    'Save dxf File Name in excel
                    FilePath2 = "Z:\1 Current Work\1. Projects\1. DXF Running Files\" & strValue(0) & "-DXF RUNNING FILES.xlsx"
                    DateCreated = Date
                    If Dir(FilePath2) <> "" Then
                        Workbooks.Open FilePath2
                
                    With Workbooks
                       
                            intLastRow = Cells(Rows.Count, "A").End(xlUp).Row
                            
                                Cells(intLastRow + 1, 1).Value = strValue(10) & "-" & strValue(0) & "-" & strValue(1) & "-" & itemnumber & "_" & strValue(2) & "MM_" & strValue(3) & " PL_" & strValue(4) & "OFF_REVA" & ".DXF"
                                Cells(intLastRow + 1, 4).Value = strValue(10) & "-" & strValue(0) & "-" & strValue(1)
                                Cells(intLastRow + 1, 5).Value = itemnumber
                                Cells(intLastRow + 1, 6).Value = DateCreated
                                Cells(intLastRow + 1, 8).Value = strValue(5)
                                Cells(intLastRow + 1, 9).Value = strValue(6)
                                Cells(intLastRow + 1, 10).Value = strValue(2)
                                Cells(intLastRow + 1, 11).Value = strValue(4)
                                Cells(intLastRow + 1, 12).Value = strValue(3)
                                Cells(intLastRow + 1, 14).Value = strValue(1)
                    End With
                
                'DELETE DUPLICATES
                    Set MyRange = ActiveSheet.Range("A1:N1" & intLastRow)
                    MyRange.RemoveDuplicates Columns:=1, Header:=xlYes
                
                'SORT
                
                        Set oneRange = Range("A1:N1000")
                        Set aCellA = Range("E1")
                        Set aCellB = Range("N1")
                        oneRange.Sort Key1:=aCellA, Order1:=xlAscending, Header:=xlYes
                        oneRange.Sort Key1:=aCellB, Order1:=xlAscending, Header:=xlYes
                    ActiveWorkbook.Save
                    Workbooks.Close
                    
                    ElseIf Dir(FilePath2) = "" Then
                         
                            Set xlApp = CreateObject("Excel.Application")
                            xlApp.Visible = True
                            Set xlWorkbook = xlApp.Workbooks.Add
                               xlWorkbook.SaveAs FilePath2
                    
                    With xlWorkbook.Worksheets(1)
  
                            .Cells(1, 1).Value = "DXF FILE NAME"
                            .Cells(1, 2).Value = "TRANSMISSION"
                            .Cells(1, 4).Value = "PART #"
                            .Cells(1, 5).Value = "ITEM #"
                            .Cells(1, 6).Value = "DATE CREATED"
                            .Cells(1, 8).Value = "LENGTH"
                            .Cells(1, 9).Value = "SECTION"
                            .Cells(1, 10).Value = "THICKNESS"
                            .Cells(1, 11).Value = "QTY"
                            .Cells(1, 12).Value = "MATERIAL"
                            .Cells(1, 14).Value = "NUMBER"
                                                     
                            .Cells(2, 1).Value = strValue(10) & "-" & strValue(0) & "-" & strValue(1) & "-" & itemnumber & "_" & strValue(2) & "MM_" & strValue(3) & " PL_" & strValue(4) & "OFF_REVA" & ".DXF"
                            .Cells(2, 4).Value = strValue(10) & "-" & strValue(0) & "-" & strValue(1)
                            .Cells(2, 5).Value = itemnumber
                            .Cells(2, 6).Value = DateCreated
                            .Cells(2, 8).Value = strValue(5)
                            .Cells(2, 9).Value = strValue(6)
                            .Cells(2, 10).Value = strValue(2)
                            .Cells(2, 11).Value = strValue(4)
                            .Cells(2, 12).Value = strValue(3)
                            .Cells(2, 14).Value = strValue(1)
                    End With
                    xlWorkbook.Save
                    xlWorkbook.Close
                    xlApp.Quit
                    End If
'Export selected face to a DXF
Part.ExportToDWG2 savepathdxf, FilePath, swExportToDWG_ExportSelectedFacesOrLoops, True, varAlignment, False, False, 0, Null

Part.FeatureManager.HideBodies

Part.ClearSelection2 False

GoTo cleanupandquit
   

'#############################################################
'DRAWING (this macro started while a drawing was active )
'#############################################################
GoTo cleanupandquit

cleanupandquit:
Part.DeleteConfiguration (Part.GetActiveConfiguration.Name & "SM-FLAT-PATTERN")
Set swApp = Nothing
Set Part = Nothing
Set SelMgr = Nothing
Set xlWorkbook = Nothing
Set xlApp = Nothing
cleanupandquitnopart:  'only called if no part is loaded
Set swApp = Nothing
Set Part = Nothing
Set SelMgr = Nothing

End Sub