VBA macro to export sketch point coordinates to CSV file
{ width=500 }
This VBA macro allows to export the coordinates of all sketch points from the selected sketch into the CSV file.
CSV file can be opened in Excel
Macro has an option to export coordinates in the sketch space (XY for 2D sketch) or in the model space (XYZ). Macro has an option to convert the points coordinates to system units (meters) or user units, currently assigned to the model.
Configure the macro by changing the constants below.
Const CONVERT_TO_USER_UNIT As Boolean = True 'True to use the current model units, False to use system units (meters)
Const CONVERT_TO_MODEL_SPACE As Boolean = True 'For 2D Sketches, True to export coordinates in the sketch space, False to convert coordinates to the model space
Const OUT_PATH As String = "D:\points.csv" 'Full path to the output file
Const CONVERT_TO_USER_UNIT As Boolean = True
Const CONVERT_TO_MODEL_SPACE As Boolean = True
Const OUT_PATH As String = "D:\points.csv"
Dim swApp As SldWorks.SldWorks
Sub main()
Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2
try_:
On Error GoTo catch_
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
Err.Raise vbError, "", "Please open model"
End If
Dim swSelMgr As SldWorks.SelectionMgr
Set swSelMgr = swModel.SelectionManager
Dim swSketchFeat As SldWorks.Feature
Set swSketchFeat = swSelMgr.GetSelectedObject6(1, -1)
Dim swSketch As SldWorks.sketch
If Not swSketchFeat Is Nothing Then
Set swSketch = swSketchFeat.GetSpecificFeature2
End If
If swSketch Is Nothing Then
Err.Raise vbError, "", "Please select sketch"
End If
Dim vPts As Variant
vPts = ExtractPoints(swModel, swSketch, CONVERT_TO_MODEL_SPACE, CONVERT_TO_USER_UNIT)
WritePointsToCsvFile OUT_PATH, vPts
GoTo finally_
catch_:
swApp.SendMsgToUser2 Err.Description, swMessageBoxIcon_e.swMbStop, swMessageBoxBtn_e.swMbOk
finally_:
End Sub
Function ExtractPoints(model As SldWorks.ModelDoc2, sketch As SldWorks.sketch, convertCoordsToModelSpace As Boolean, convertCoordsToUserUnits As Boolean) As Variant
Dim vSkPts As Variant
vSkPts = sketch.GetSketchPoints2()
Dim i As Integer
If IsEmpty(vSkPts) Then
Err.Raise vbError, "", "Sketch contains no points"
End If
Dim vPts() As Variant
ReDim vPts(UBound(vSkPts))
For i = 0 To UBound(vSkPts)
Dim swSkPt As SldWorks.SketchPoint
Set swSkPt = vSkPts(i)
Dim dPt(2) As Double
dPt(0) = swSkPt.X: dPt(1) = swSkPt.Y: dPt(2) = swSkPt.Z
Dim vPt As Variant
vPt = dPt
If convertCoordsToModelSpace Then
vPt = ConvertPointLocation(vPt, sketch.ModelToSketchTransform.Inverse())
End If
If convertCoordsToUserUnits Then
vPt = ConvertToUserUnits(vPt, model)
End If
vPts(i) = vPt
Next
ExtractPoints = vPts
End Function
Function ConvertPointLocation(pt As Variant, transform As SldWorks.MathTransform) As Variant
Dim swMathUtils As SldWorks.MathUtility
Set swMathUtils = swApp.GetMathUtility
Dim swMathPt As SldWorks.MathPoint
Set swMathPt = swMathUtils.CreatePoint(pt)
Set swMathPt = swMathPt.MultiplyTransform(transform)
ConvertPointLocation = swMathPt.ArrayData
End Function
Function ConvertToUserUnits(pt As Variant, model As SldWorks.ModelDoc2) As Variant
Dim swUserUnits As SldWorks.UserUnit
Set swUserUnits = model.GetUserUnit(swUserUnitsType_e.swLengthUnit)
Dim convFactor As Double
convFactor = swUserUnits.GetConversionFactor
Dim dPt(2) As Double
dPt(0) = pt(0) * convFactor
dPt(1) = pt(1) * convFactor
dPt(2) = pt(2) * convFactor
ConvertToUserUnits = dPt
End Function
Sub WritePointsToCsvFile(filePath As String, vPts As Variant)
Dim fileNmb As Integer
fileNmb = FreeFile
Open filePath For Output As #fileNmb
Dim i As Integer
For i = 0 To UBound(vPts)
Print #fileNmb, vPts(i)(0) & "," & vPts(i)(1) & "," & vPts(i)(2)
Next
Close #fileNmb
End Sub