Import points cloud from CSV file into sketch via SOLIDWORKS API

Edit ArticleEdit Article
More 'Goodies'

Points cloud in the sketch
Points cloud in the sketch

This macro imports the points read from the specified CSV (comma separated values) file into the active sketch using SOLIDWORKS API. Both 2D and 3D Sketches are supported.


Macro has several configuration options which can be modified by changing the values of the constants at the beginning of the macro

Const USE_SYSTEM_UNITS As Boolean = True
Const FIRST_ROW_HEADER As Boolean = True
  • FIRST_ROW_HEADER specifies if the if the first row of the CSV file is considered as a header and should be ignored ignored. If CSV file doesn't contain the header set the value of the constant to False.
  • USE_SYSTEM_UNITS indicates if the coordinate values in the CSV file are in system units (meters). If this option is set to False, macro will use the current document units instead.
  • Macro can also import points relative to coordinate system. Pre-select the target coordinate system before running the macro otherwise the points will be inserted relative to global coordinate system

Input CSV file can contain 3 coordinates (X, Y, Z) or 2 coordinates (X, Y)

Sample Files

How To Run The Macro

  • Open the model and create 2D or 3D sketch (or edit existing sketch)
  • (Optional) Pre select coordinate system if points need to be imported relative to this system
  • Run the macro. Specify the full path to CSV file in the displayed file browse dialog
  • Click OK. Points are created in the active sketch

Const USE_SYSTEM_UNITS As Boolean = True
Const FIRST_ROW_HEADER As Boolean = True

Dim swApp As SldWorks.SldWorks

Sub main()

    On Error GoTo catch_
    Set swApp = Application.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Set swModel = swApp.ActiveDoc
    If Not swModel Is Nothing Then
        Dim swSketch As SldWorks.Sketch
        Set swSketch = swModel.SketchManager.ActiveSketch
        If Not swSketch Is Nothing Then
            Dim vPoints As Variant
            Dim inputFile As String
            inputFile = swApp.GetOpenFileName("Specify the full path to CSV file", "", "CSV Files (*.csv)|*.csv|Text Files (*.txt)|*.txt|All Files (*.*)|*.*|", -1, "", "")
            If inputFile <> "" Then
                vPoints = ReadCsvFile(inputFile, FIRST_ROW_HEADER)
                vPoints = ConvertPointsLocations(vPoints, swModel, USE_SYSTEM_UNITS, GetSelectedCoordinateSystemTransform(swModel))
                DrawPoints swModel, vPoints
            End If
            Err.Raise vbError, "", "Please open 2D or 3D Sketch"
        End If
        Err.Raise vbError, "", "Please open the model"
    End If
    GoTo finally_
    swApp.SendMsgToUser2 Err.Description, swMessageBoxIcon_e.swMbStop, swMessageBoxBtn_e.swMbOk
End Sub

Function GetSelectedCoordinateSystemTransform(model As SldWorks.ModelDoc2) As SldWorks.mathTransform
    Dim swSelMgr As SldWorks.SelectionMgr
    Set swSelMgr = model.SelectionManager
    If swSelMgr.GetSelectedObjectType3(1, -1) = swSelectType_e.swSelCOORDSYS Then
        Dim swCoordSysFeat As SldWorks.Feature
        Set swCoordSysFeat = swSelMgr.GetSelectedObject6(1, -1)
        Set GetSelectedCoordinateSystemTransform = model.Extension.GetCoordinateSystemTransformByName(swCoordSysFeat.Name)
        Set GetSelectedCoordinateSystemTransform = Nothing
    End If
End Function

Sub DrawPoints(model As SldWorks.ModelDoc2, vPoints As Variant)
    model.SketchManager.AddToDB = True
    Dim i As Integer
    For i = 0 To UBound(vPoints)
        Dim swSkPt As SldWorks.SketchPoint
        Dim vPt As Variant
        vPt = vPoints(i)
        Dim x As Double
        Dim y As Double
        Dim z As Double
        x = CDbl(vPt(0))
        y = CDbl(vPt(1))
        z = CDbl(vPt(2))
        Set swSkPt = model.SketchManager.CreatePoint(x, y, z)
        If swSkPt Is Nothing Then
            Err.Raise vbError, "", "Failed to create point at: " & x & "; " & y & "; " & z
        End If
    model.SketchManager.AddToDB = False
End Sub

Function ConvertPointsLocations(points As Variant, model As SldWorks.ModelDoc2, useSystemUnits As Boolean, mathTransform As SldWorks.mathTransform) As Variant
    Dim swMathUtils As SldWorks.MathUtility
    Set swMathUtils = swApp.GetMathUtility
    Dim convFact As Double
    convFact = 1
    If Not useSystemUnits Then
        Dim swUserUnit As SldWorks.UserUnit
        Set swUserUnit = model.GetUserUnit(swUserUnitsType_e.swLengthUnit)
        convFact = 1 / swUserUnit.GetConversionFactor()
    End If
    Dim i As Integer
    For i = 0 To UBound(points)
        Dim vPt As Variant
        vPt = points(i)
        Dim dPt(2) As Double
        If UBound(vPt) >= 0 Then
            dPt(0) = CDbl(vPt(0)) * convFact
            dPt(0) = 0
        End If
        If UBound(vPt) >= 1 Then
            dPt(1) = CDbl(vPt(1)) * convFact
            dPt(1) = 0
        End If
        If UBound(vPt) >= 2 Then
            dPt(2) = CDbl(vPt(2)) * convFact
            dPt(2) = 0
        End If
        If Not mathTransform Is Nothing Then
            Dim swMathPt As SldWorks.MathPoint
            Set swMathPt = swMathUtils.CreatePoint(dPt)
            Set swMathPt = swMathPt.MultiplyTransform(mathTransform)
            vPt = swMathPt.ArrayData
            vPt = dPt
        End If
        points(i) = vPt
    ConvertPointsLocations = points
End Function

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
    Dim isTableInit 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))
            Dim lastRowIndex As Integer
            If Not isTableInit Then
                lastRowIndex = 0
                isTableInit = True
                ReDim Preserve vTable(lastRowIndex)
                lastRowIndex = UBound(vTable, 1) + 1
                ReDim Preserve vTable(lastRowIndex)
            End If
            vTable(lastRowIndex) = dCells
        End If
        If isFirstRow Then
            isFirstRow = False
        End If
    Close #fileNo
    ReadCsvFile = vTable
End Function

Product of Xarial Product of Xarial