# Add, Modify, and Remove Custom Data Example (VB.NET)

This example shows how to add, modify, and remove custom data from a Circle.

    '--------------------------------------------------------------
    'Preconditions:
    ' 1. Create a VB.NET Windows console project.
    ' 2. Copy and paste this example into the VB.NET IDE.
    ' 3. Add a reference to:
    '    install_dir\APISDK\tlb\DraftSight.Interop.dsAutomation.dll
    ' 4. Open the Immediate window.
    ' 5. Start DraftSight and open a document.
    ' 6. Click Start Debugging.
    '
    'Postconditions:
    ' 1. Circle is constructed.
    ' 2. Custom data is added to, modified, and removed from
    '    the Circle.
    ' 3. Examine the Immediate window to verify.
    '----------------------------------------------------------------

    Imports DraftSight.Interop.dsAutomation

    Module Module1

        Sub Main()

            Dim dsApp As Application

            'Connect to DraftSight application
            dsApp = GetObject(, "DraftSight.Application")
            dsApp.AbortRunningCommand() ' abort any command currently running in DraftSight to avoid nested commands

            'Get active document
            Dim dsDoc As Document = dsApp.GetActiveDocument()
            If dsDoc Is Nothing Then
                MsgBox("There are no open documents in DraftSight.")
                Return
            End If

            'Get model space
            Dim dsModel As Model = dsDoc.GetModel()

            'Get sketch manager
            Dim dsSketchMgr As SketchManager = dsModel.GetSketchManager()

            'Draw a Circle
            Dim centerX As Double = 1, centerY As Double = 1, centerZ As Double = 0
            Dim radius As Double = 5
            Dim dsCircle As Circle = dsSketchMgr.InsertCircle(centerX, centerY, centerZ, radius)

            'Zoom to fit
            dsApp.Zoom(dsZoomRange_e.dsZoomRange_Fit, Nothing, Nothing)

            'Add custom data to the Circle
            Dim applicationName As String = "CircleApp"
            AddCustomDataToCircle(dsCircle, applicationName)

            Debug.Print(Environment.NewLine + "Circle custom data..." + Environment.NewLine)

            'Print custom data
            PrintCustomDataInfo(dsCircle.GetCustomData(applicationName))

            'Change custom data
            Dim dsCustomData As CustomData = dsCircle.GetCustomData(applicationName)
            ChangeCustomData(dsCustomData)

            'Apply the changed custom data to the Circle
            dsCircle.SetCustomData(applicationName, dsCustomData)

            Debug.Print(Environment.NewLine + "Custom data changed..." + Environment.NewLine)

            'Print custom data after changing it
            PrintCustomDataInfo(dsCircle.GetCustomData(applicationName))

            'Remove all string values from custom data
            dsCustomData = dsCircle.GetCustomData(applicationName)
            DeleteStringDataFromCustomData(dsCustomData, dsCustomDataType_e.dsCustomDataType_String)

            'Apply the changed custom data to the Circle
            dsCircle.SetCustomData(applicationName, dsCustomData)

            Debug.Print(Environment.NewLine + "Removed all string values from custom data..." + Environment.NewLine)

            'Print custom data after removing elements
            PrintCustomDataInfo(dsCircle.GetCustomData(applicationName))

            'Delete custom data from the Circle
            dsCircle.DeleteCustomData(applicationName)

            Debug.Print(Environment.NewLine + "The custom data for the circle is removed..." + Environment.NewLine)

            'Print custom data after removing it from the Circle
            PrintCustomDataInfo(dsCircle.GetCustomData(applicationName))

        End Sub

        Sub AddCustomDataToCircle(ByVal dsCircle As Circle, ByVal applicationName As String)
            'Get custom data for the Circle
            Dim dsCustomData As CustomData = dsCircle.GetCustomData(applicationName)

            'Clear existing custom data
            dsCustomData.Empty()

            'Get the index
            Dim index As Integer = dsCustomData.GetDataCount()

            'Add a description of the Circle as a string value to the custom data
            Dim markerForString As Integer = 1000
            dsCustomData.InsertStringData(index, markerForString, "Circle entity")

            'Get the next index
            index = dsCustomData.GetDataCount()

            'Add custom data section to custom data
            Dim dsInnerCustomData As CustomData = dsCustomData.InsertCustomData(index)

            'Get the next index
            index = dsInnerCustomData.GetDataCount()

            'Get the center point of the Circle
            'and add it as point data to the custom data
            Dim markerForPoint As Integer = 1011
            Dim centerX As Double, centerY As Double, centerZ As Double
            dsCircle.GetCenter(centerX, centerY, centerZ)
            dsInnerCustomData.InsertPointData(index, markerForPoint, centerX, centerY, centerZ)

            'Get the next index
            index = dsInnerCustomData.GetDataCount()

            'Get the radius of the Circle
            'and add it as double data to the custom data
            Dim markerForDouble As Integer = 1040
            Dim doubleValue As Double = dsCircle.Radius
            dsInnerCustomData.InsertDoubleData(index, markerForDouble, doubleValue)

            'Get the next index
            index = dsInnerCustomData.GetDataCount()

            'Add the layer name of Circle as layer name data
            'to custom data
            dsInnerCustomData.InsertLayerName(index, dsCircle.Layer)

            'Get the next index
            index = dsInnerCustomData.GetDataCount()

            'Add the name of the LineStyle of the Circle
            'as a string data to custom data
            dsInnerCustomData.InsertStringData(index, markerForString, dsCircle.LineStyle)

            'Get the next index
            index = dsInnerCustomData.GetDataCount()

            'Add Int16 data to custom data
            Dim markerForInt16 As Integer = 1070
            Dim intValue As Int16 = 5
            dsInnerCustomData.InsertInteger16Data(index, markerForInt16, intValue)

            'Get the next index
            index = dsInnerCustomData.GetDataCount()

            'Add Int32 data to custom data
            Dim markerForInt32 As Integer = 1071
            Dim int32Value As Int32 = 7
            dsInnerCustomData.InsertInteger32Data(index, markerForInt32, int32Value)

            'Get the next index
            index = dsInnerCustomData.GetDataCount()

            'Add the handle of the Circle as handle data to custom data
            dsInnerCustomData.InsertHandle(index, dsCircle.Handle)

            'Get the next index
            index = dsInnerCustomData.GetDataCount()

            'Add binary data to custom data
            Dim binaryDataArray As Byte() = New Byte() {0, 1, 0, 1}
            dsInnerCustomData.InsertByteData(index, binaryDataArray)

            'Set custom data
            dsCircle.SetCustomData(applicationName, dsCustomData)
        End Sub

        Sub DeleteStringDataFromCustomData(ByVal dsCustomData As CustomData, ByVal dataType As dsCustomDataType_e)
            'Get custom data count
            Dim count As Integer = dsCustomData.GetDataCount()

            For index As Integer = count - 1 To 0 Step -1
                'Get custom data type
                Dim customDataType As dsCustomDataType_e
                dsCustomData.GetDataType(index, customDataType)

                If customDataType = dataType Then
                    'Delete custom data element
                    dsCustomData.Delete(index)
                End If

                If customDataType = dsCustomDataType_e.dsCustomDataType_CustomData Then
                    'Get inner custom data
                    Dim dsInnerCustomData As CustomData = Nothing
                    dsCustomData.GetCustomData(index, dsInnerCustomData)

                    DeleteStringDataFromCustomData(dsInnerCustomData, dataType)
                End If
            Next
        End Sub

        Sub ChangeCustomData(ByVal dsCustomData As CustomData)
            'Get custom data count
            Dim count As Integer = dsCustomData.GetDataCount()

            For index As Integer = 0 To count - 1
                'Get custom data type
                Dim dataType As dsCustomDataType_e
                dsCustomData.GetDataType(index, dataType)

                Select Case dataType
                    Case dsCustomDataType_e.dsCustomDataType_BinaryData
                        If True Then
                            'Get binary data from custom data
                            Dim binaryDataArray As Byte() = DirectCast(dsCustomData.GetByteData(index), Byte())

                            'Check if binary data is not empty
                            If binaryDataArray IsNot Nothing Then
                                For i As Integer = 0 To binaryDataArray.Length - 1
                                    binaryDataArray(i) += 1
                                Next

                                'Set the updated binary data to custom data
                                dsCustomData.SetByteData(index, binaryDataArray)
                            End If

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_CustomData
                        If True Then
                            'Get the inner custom data
                            Dim dsInnerCustomData As CustomData = Nothing
                            dsCustomData.GetCustomData(index, dsInnerCustomData)

                            ChangeCustomData(dsInnerCustomData)

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_Double
                        If True Then
                            'Get double custom data
                            Dim doubleValue As Double
                            dsCustomData.GetDoubleData(index, doubleValue)

                            'Change double value
                            doubleValue += 1

                            'Set the updated double value to custom data
                            dsCustomData.SetDoubleData(index, doubleValue)

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_Integer16
                        If True Then
                            'Get Int16 custom data
                            Dim intValue As Integer
                            dsCustomData.GetInteger16Data(index, intValue)

                            'Change Int16 value
                            intValue += 1

                            'Set the updated Int16 value to custom data
                            dsCustomData.SetInteger16Data(index, intValue)

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_Integer32
                        If True Then
                            'Get Int32 custom data
                            Dim intValue As Int32
                            dsCustomData.GetInteger32Data(index, intValue)

                            'Change Int32 value
                            intValue += 1

                            'Set the updated Int32 value to custom data
                            dsCustomData.SetInteger32Data(index, intValue)

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_Point
                        If True Then
                            'Get point custom data
                            Dim x As Double, y As Double, z As Double
                            dsCustomData.GetPointData(index, x, y, z)

                            'Change point coordinates
                            x += 2
                            y += 2
                            z += 2

                            'Set the updated point coordinates to custom data
                            dsCustomData.SetPointData(index, x, y, z)

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_String
                        If True Then
                            'Get string custom data
                            Dim stringValue As String = ""
                            dsCustomData.GetStringData(index, stringValue)

                            'Modify string value
                            stringValue += "_Changed"

                            'Set the updated string value to custom data
                            dsCustomData.SetStringData(index, stringValue)

                            Exit Select
                        End If
                    Case Else
                        Exit Select
                End Select
            Next
        End Sub

        Sub PrintCustomDataInfo(ByVal dsCustomData As CustomData)
            'Get custom data count
            Dim count As Integer = dsCustomData.GetDataCount()
            Debug.Print("Custom data count:" + count.ToString())

            For index As Integer = 0 To count - 1
                'Get custom data type
                Dim dataType As dsCustomDataType_e
                dsCustomData.GetDataType(index, dataType)

                'Get custom data marker
                Dim marker As Integer
                dsCustomData.GetDataMarker(index, marker)

                Select Case dataType
                    Case dsCustomDataType_e.dsCustomDataType_BinaryData
                        If True Then
                            'Get binary data from custom data
                            Dim binaryDataArray As Byte() = DirectCast(dsCustomData.GetByteData(index), Byte())
                            Dim binaryDataContent As String = String.Empty

                            If binaryDataArray Is Nothing Then
                                binaryDataContent = "Empty"
                            Else
                                For Each binaryData As Byte In binaryDataArray
                                    binaryDataContent += binaryData.ToString() + ","
                                Next
                            End If

                            'Print custom data index, data type, marker, and binary value
                            PrintCustomDataElement(index, dataType, marker, binaryDataContent)

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_CustomData
                        If True Then
                            'Get inner custom data
                            Dim dsGetCustomData As CustomData = Nothing
                            dsCustomData.GetCustomData(index, dsGetCustomData)

                            PrintCustomDataInfo(dsGetCustomData)

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_Double
                        If True Then
                            'Get double value from custom data
                            Dim doubleValue As Double
                            dsCustomData.GetDoubleData(index, doubleValue)

                            'Print custom data index, data type, marker and double value
                            PrintCustomDataElement(index, dataType, marker, doubleValue)

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_Handle
                        If True Then
                            'Get handle value from custom data
                            Dim handle As String = dsCustomData.GetHandleData(index)

                            'Print custom data index, data type, marker, and handle value
                            PrintCustomDataElement(index, dataType, marker, handle)

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_Integer16
                        If True Then
                            Dim intValue As Integer
                            dsCustomData.GetInteger16Data(index, intValue)

                            'Print custom data index, data type, marker, and Int16 value
                            PrintCustomDataElement(index, dataType, marker, intValue)

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_Integer32
                        If True Then
                            Dim intValue As Int32
                            dsCustomData.GetInteger32Data(index, intValue)

                            'Print custom data index, data type, marker, and Int32 value
                            PrintCustomDataElement(index, dataType, marker, intValue)

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_LayerName
                        If True Then
                            'Get layer name from custom data
                            Dim layerName As String = ""
                            dsCustomData.GetLayerName(index, layerName)

                            'Print custom data index, data type, marker, and layer name value
                            PrintCustomDataElement(index, dataType, marker, layerName)

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_Point
                        If True Then
                            'Get point coordinates from custom data
                            Dim x As Double, y As Double, z As Double
                            dsCustomData.GetPointData(index, x, y, z)

                            'Print custom data index, data type, marker, and point values
                            Dim pointCoordinates As String = x.ToString + "," + y.ToString + "," + z.ToString
                            PrintCustomDataElement(index, dataType, marker, pointCoordinates)

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_String
                        If True Then
                            'Get string value from custom data
                            Dim stringValue As String = ""
                            dsCustomData.GetStringData(index, stringValue)

                            'Print custom data index, data type, marker, and string value
                            PrintCustomDataElement(index, dataType, marker, stringValue)

                            Exit Select
                        End If
                    Case dsCustomDataType_e.dsCustomDataType_Unknown
                        If True Then
                            'Print custom data index, data type, marker and value
                            PrintCustomDataElement(index, dataType, marker, "Unknown value")

                            Exit Select
                        End If
                    Case Else
                        Exit Select
                End Select
            Next
        End Sub

        Sub PrintCustomDataElement(ByVal index As Integer, ByVal dataType As dsCustomDataType_e, ByVal marker As Integer, ByVal customDataValue As Object)
            'Print custom data index, data type, marker and value
            Dim message As String = "Index: " + index.ToString()
            message += " Data type: " + dataType.ToString()
            message += " Marker: " + marker.ToString()
            message += " Value: " + customDataValue.ToString()

            Debug.Print(message)
        End Sub
    End Module