Macro to create spline CSV file using SOLIDWORKS API
This VBA macro demonstrates how to create spline in the active sketch by loading points data from the CSV file. CSV file should contain 3 columns for the coordinates of spline nodes in meters. Download sample spline data
Specify full path to this file in the CSV_FILE_PATH constant
Const CSV_FILE_PATH As String = "D:\spline-data.csv" Dim swApp As SldWorks.SldWorks Sub main() Set swApp = Application.SldWorks Dim swModel As SldWorks.ModelDoc2 Set swModel = swApp.ActiveDoc Dim swSkMgr As SldWorks.SketchManager Set swSkMgr = swModel.SketchManager If Not swSkMgr.ActiveSketch Is Nothing Then Dim vPts As Variant vPts = ReadCsvFile(CSV_FILE_PATH, True) DrawSpline swSkMgr, vPts Else Err.Raise vbError, "", "Please activate sketch" End If End Sub Sub DrawSpline(skMgr As SldWorks.SketchManager, vPoints As Variant) skMgr.AddToDB = True Dim dSplinePts() As Double ReDim dSplinePts((UBound(vPoints) + 1) * 3 - 1) Dim i As Integer For i = 0 To UBound(vPoints) Dim vPt As Variant vPt = vPoints(i) Dim x As Double Dim y As Double Dim z As Double If UBound(vPt) >= 0 Then x = vPt(0) End If If UBound(vPt) >= 1 Then y = vPt(1) End If If UBound(vPt) >= 2 Then z = vPt(2) End If dSplinePts(i * 3) = x dSplinePts(i * 3 + 1) = y dSplinePts(i * 3 + 2) = z Next Dim swSkSegment As SldWorks.SketchSegment Set swSkSegment = skMgr.CreateSpline2(dSplinePts, False) If swSkSegment Is Nothing Then Err.Raise vbError, "", "Failed to create spline" End If skMgr.AddToDB = False End Sub Function ReadCsvFile(filePath As String, firstRowHeader As Boolean) As Variant 'rows x columns Dim vTable() As Variant Dim fileName As String Dim tableRow As String Dim fileNo As Integer fileNo = FreeFile Open filePath For Input As #fileNo Dim isFirstRow As Boolean isFirstRow = True isTableInit = False Do While Not EOF(fileNo) Line Input #fileNo, tableRow If Not isFirstRow Or Not firstRowHeader Then Dim vCells As Variant vCells = Split(tableRow, ",") Dim i As Integer Dim dCells() As Double ReDim dCells(UBound(vCells)) For i = 0 To UBound(vCells) dCells(i) = CDbl(vCells(i)) Next If (Not vTable) = -1 Then ReDim vTable(0) Else ReDim Preserve vTable(UBound(vTable) + 1) End If vTable(UBound(vTable)) = dCells End If If isFirstRow Then isFirstRow = False End If Loop Close #fileNo ReadCsvFile = vTable End Function