Skip to main content

Export dimensions information from SOLIDWORKS drawing to CSV file

Dimensions in the drawing view

This VBA macro allows to export information of all dimensions in the active drawing to the CSV file which can be opened by Excel.

Macro includes the following information into the report:

  • Name - full name of the dimension
  • Owner - name of the drawing view or sheet this dimension belongs to
  • Type - type of the dimension (e.g. linear, angular, ordinate, etc.)
  • X - X position of the dimension in the current drawing units
  • Y - Y position of the dimension in the current drawing units
  • Value - value of the dimension in the current units
  • Grid Ref - reference of this dimension in the drawing grid (e.g. A5)
  • Tolerance - type of the tolerance assigned to this dimension (e.g. basic, symmetric, etc.)
  • Min - Minimum value of the tolerance in the current units
  • Max - Maximum value of the tolerance in the current units

Dimensions information opened in Excel{ width=600 }

Output file is saved into the same folder as original drawing and named [drawing name]-dimensions.csv

Dim swApp As SldWorks.SldWorks

Sub main()

Set swApp = Application.SldWorks

try_:
On Error GoTo catch_:

Dim swDraw As SldWorks.DrawingDoc

Set swDraw = swApp.ActiveDoc

If swDraw Is Nothing Then
Err.Raise vbError, "", "Please open drawing"
End If

ExportDrawingDimensions swDraw

GoTo finally_

catch_:
swApp.SendMsgToUser2 Err.Description, swMessageBoxIcon_e.swMbStop, swMessageBoxBtn_e.swMbOk
finally_:

End Sub

Sub ExportDrawingDimensions(draw As SldWorks.DrawingDoc)

Dim vSheets As Variant
vSheets = draw.GetViews

Dim fileNmb As Integer
fileNmb = FreeFile

Dim filePath As String
filePath = draw.GetPathName

If filePath = "" Then
Err.Raise vbError, "", "Please save drawing document"
End If

filePath = Left(filePath, InStrRev(filePath, ".") - 1) & "-dimensions.csv"

Open filePath For Output As #fileNmb

Dim header As String
header = Join("Name", "Owner", "Type", "X", "Y", "Value", "Grid Ref", "Tolerance", "Min", "Max")

Print #fileNmb, header

Dim i As Integer

For i = 0 To UBound(vSheets)

Dim vViews As Variant
vViews = vSheets(i)

Dim j As Integer

For j = 0 To UBound(vViews)

Dim swView As SldWorks.view
Set swView = vViews(j)

ExportViewDimensions swView, draw, fileNmb

Next

Next

Close #fileNmb

End Sub

Sub ExportViewDimensions(view As SldWorks.view, draw As SldWorks.DrawingDoc, fileNmb As Integer)

Dim swDispDim As SldWorks.DisplayDimension
Set swDispDim = view.GetFirstDisplayDimension5

Dim swSheet As SldWorks.Sheet

Set swSheet = view.Sheet

If swSheet Is Nothing Then
Set swSheet = draw.Sheet(view.name)
End If

While Not swDispDim Is Nothing

Dim swAnn As SldWorks.Annotation
Set swAnn = swDispDim.GetAnnotation

Dim vPos As Variant
vPos = swAnn.GetPosition()

Dim swDim As SldWorks.dimension
Set swDim = swDispDim.GetDimension2(0)

Dim drwZone As String
drwZone = swSheet.GetDrawingZone(vPos(0), vPos(1))
vPos = GetPositionInDrawingUnits(vPos, draw)

Dim tolType As String
Dim minVal As Double
Dim maxVal As Double

GetDimensionTolerance draw, swDim, tolType, minVal, maxVal

OutputDimensionData fileNmb, swDim.FullName, view.name, GetDimensionType(swDispDim), CDbl(vPos(0)), CDbl(vPos(1)), _
CDbl(swDim.GetValue3(swInConfigurationOpts_e.swThisConfiguration, Empty)(0)), _
drwZone, tolType, minVal, maxVal

Set swDispDim = swDispDim.GetNext5

Wend

End Sub

Function GetPositionInDrawingUnits(pos As Variant, draw As SldWorks.DrawingDoc) As Variant

Dim dPt(1) As Double
dPt(0) = ConvertToUserUnits(draw, CDbl(pos(0)), swLengthUnit)
dPt(1) = ConvertToUserUnits(draw, CDbl(pos(1)), swLengthUnit)

GetPositionInDrawingUnits = dPt

End Function

Function ConvertToUserUnits(model As SldWorks.ModelDoc2, val As Double, unitType As swUserUnitsType_e) As Double

Dim swUserUnit As SldWorks.UserUnit
Set swUserUnit = model.GetUserUnit(unitType)

Dim convFactor As Double
convFactor = swUserUnit.GetConversionFactor()

ConvertToUserUnits = val * convFactor

End Function


Function GetDimensionType(dispDim As SldWorks.DisplayDimension) As String

Select Case dispDim.Type2
Case swDimensionType_e.swAngularDimension
GetDimensionType = "Angular"
Case swDimensionType_e.swArcLengthDimension
GetDimensionType = "ArcLength"
Case swDimensionType_e.swChamferDimension
GetDimensionType = "Chamfer"
Case swDimensionType_e.swDiameterDimension
GetDimensionType = "Diameter"
Case swDimensionType_e.swDimensionTypeUnknown
GetDimensionType = "Unknown"
Case swDimensionType_e.swHorLinearDimension
GetDimensionType = "HorLinear"
Case swDimensionType_e.swHorOrdinateDimension
GetDimensionType = "HorOrdinate"
Case swDimensionType_e.swLinearDimension
GetDimensionType = "Linear"
Case swDimensionType_e.swOrdinateDimension
GetDimensionType = "Ordinate"
Case swDimensionType_e.swRadialDimension
GetDimensionType = "Radial"
Case swDimensionType_e.swScalarDimension
GetDimensionType = "Scalar"
Case swDimensionType_e.swVertLinearDimension
GetDimensionType = "VertLinear"
Case swDimensionType_e.swVertOrdinateDimension
GetDimensionType = "VertOrdinate"
Case swDimensionType_e.swZAxisDimension
GetDimensionType = "ZAxis"
End Select

End Function

Sub GetDimensionTolerance(draw As SldWorks.DrawingDoc, swDim As SldWorks.dimension, ByRef tolType As String, ByRef minVal As Double, ByRef maxVal As Double)

Dim swTol As SldWorks.DimensionTolerance
Set swTol = swDim.Tolerance

Select Case swTol.Type
Case swTolType_e.swTolBASIC
tolType = "Basic"
Case swTolType_e.swTolBILAT
tolType = "Bilat"
Case swTolType_e.swTolBLOCK
tolType = "Block"
Case swTolType_e.swTolFIT
tolType = "Fit"
Case swTolType_e.swTolFITTOLONLY
tolType = "FitTolOnly"
Case swTolType_e.swTolFITWITHTOL
tolType = "FitWithTol"
Case swTolType_e.swTolGeneral
tolType = "General"
Case swTolType_e.swTolLIMIT
tolType = "Limit"
Case swTolType_e.swTolMAX
tolType = "Max"
Case swTolType_e.swTolMETRIC
tolType = "Metric"
Case swTolType_e.swTolMIN
tolType = "Min"
Case swTolType_e.swTolNONE
tolType = "None"
Case swTolType_e.swTolSYMMETRIC
tolType = "Symmetric"
End Select

swTol.GetMinValue2 minVal
swTol.GetMaxValue2 maxVal

Dim unitType As swUserUnitsType_e

If swDim.GetType() = swDimensionParamType_e.swDimensionParamTypeDoubleAngular Then
unitType = swUserUnitsType_e.swAngleUnit
Else
unitType = swUserUnitsType_e.swLengthUnit
End If

minVal = ConvertToUserUnits(draw, minVal, unitType)
maxVal = ConvertToUserUnits(draw, maxVal, unitType)

End Sub

Sub OutputDimensionData(fileNmb As Integer, dimName As String, owner As String, dimType As String, x As Double, y As Double, value As Double, gridRef As String, tol As String, min As Double, max As Double)

Dim line As String
line = Join(dimName, owner, dimType, x, y, value, gridRef, tol, min, max)

Print #fileNmb, line

End Sub

Function Join(ParamArray parts() As Variant) As String

Dim res As String

If Not IsEmpty(parts) Then
Dim i As Integer
For i = 0 To UBound(parts)
res = res & IIf(i = 0, "", ", ") & parts(i)
Next
End If

Join = res

End Function