跳到主要内容

从SOLIDWORKS图纸导出尺寸信息到CSV文件

图纸视图中的尺寸

这个VBA宏允许将活动图纸中的所有尺寸信息导出到可以用Excel打开的CSV文件中。

宏将以下信息包含在报告中:

  • 名称 - 尺寸的完整名称
  • 所有者 - 尺寸所属的图纸视图或图纸页的名称
  • 类型 - 尺寸的类型(例如线性、角度、坐标等)
  • X - 尺寸在当前图纸单位中的X位置
  • Y - 尺寸在当前图纸单位中的Y位置
  • 值 - 尺寸在当前单位中的值
  • 网格参考 - 尺寸在图纸网格中的参考(例如A5)
  • 公差 - 分配给该尺寸的公差类型(例如基本、对称等)
  • 最小值 - 公差的最小值(当前单位)
  • 最大值 - 公差的最大值(当前单位)

在Excel中打开的尺寸信息{ width=600 }

输出文件保存在与原始图纸相同的文件夹中,命名为[图纸名称]-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, "", "请打开图纸"
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, "", "请保存图纸文档"
End If

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

Open filePath For Output As #fileNmb

Dim header As String
header = Join("名称", "所有者", "类型", "X", "Y", "值", "网格参考", "公差", "最小值", "最大值")

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 = "角度"
Case swDimensionType_e.swArcLengthDimension
GetDimensionType = "弧长"
Case swDimensionType_e.swChamferDimension
GetDimensionType = "倒角"
Case swDimensionType_e.swDiameterDimension
GetDimensionType = "直径"
Case swDimensionType_e.swDimensionTypeUnknown
GetDimensionType = "未知"
Case swDimensionType_e.swHorLinearDimension
GetDimensionType = "水平线性"
Case swDimensionType_e.swHorOrdinateDimension
GetDimensionType = "水平坐标"
Case swDimensionType_e.swLinearDimension
GetDimensionType = "线性"
Case swDimensionType_e.swOrdinateDimension
GetDimensionType = "坐标"
Case swDimensionType_e.swRadialDimension
GetDimensionType = "半径"
Case swDimensionType_e.swScalarDimension
GetDimensionType = "标量"
Case swDimensionType_e.swVertLinearDimension
GetDimensionType = "垂直线性"
Case swDimensionType_e.swVertOrdinateDimension
GetDimensionType = "垂直坐标"
Case swDimensionType_e.swZAxisDimension
GetDimensionType = "Z轴"
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 = "基本"
Case swTolType_e.swTolBILAT
tolType = "双向"
Case swTolType_e.swTolBLOCK
tolType = "块"
Case swTolType_e.swTolFIT
tolType = "配合"
Case swTolType_e.swTolFITTOLONLY
tolType = "仅配合公差"
Case swTolType_e.swTolFITWITHTOL
tolType = "配合公差"
Case swTolType_e.swTolGeneral
tolType = "常规"
Case swTolType_e.swTolLIMIT
tolType = "极限"
Case swTolType_e.swTolMAX
tolType = "最大"
Case swTolType_e.swTolMETRIC
tolType = "公制"
Case swTolType_e.swTolMIN
tolType = "最小"
Case swTolType_e.swTolNONE
tolType = "无"
Case swTolType_e.swTolSYMMETRIC
tolType = "对称"
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