Drawing circles from array to a Form I've actually been struggling with painting with VB.Net for a few weeks. All I know is that I shouldn't use CreateGraphics if I can avoid it, so I've done just that. One of the community-challenge questions comes from a CodeGolf challenge that requires users to draw sprockets.

This is only my beginning of that. I've never displayed anything I haven't drawn in excel. At first I tried a Class of sprockets, but it wouldn't fill my List properly, so I've boiled it down to 


populating an array 
passing that array to the form 
Painting my circles.


Essentially I read the input, convert it to integer array, send that to the form and draw the circles. I've probably made it way too complicated, but like I said, I've struggled for a few weeks, which is why I'm here. Parsing the input was pretty tricky to me, actually.

Input

Comes in the form of (sets of) 3 integers (x-position, y-position, radius) e.g.


(0, 0, 16),  (100, 0, 16),  (100, 100, 12),  (50, 50, 24),  (0, 100, 12)



Output



Standard Module

Option Explicit On
Option Strict On
Option Infer On
Option Compare Text
Imports System.IO
Module Module1
    Const INPUT_PATH As String = "C:\Temp\gearinput.txt"
    Public delimiter() As String = {"),"}
    Sub Main()
        Dim inputData() As String
        inputData = GetInput()
        Dim sprocketData() As String = Custom_Split(inputData(0))
        Dim paintingdata(,) As Integer = StringToIntArray(sprocketData)
        Dim targetForm As New Form1
        targetForm.Visible = True
        targetForm.DrawSprockets(targetForm, paintingdata)
    End Sub
    Private Function Custom_Split(ByVal stringToSplit As String) As String()
        stringToSplit = stringToSplit.Replace("(", String.Empty)
        stringToSplit = stringToSplit.Replace(" ", String.Empty)
        Dim stringArray() As String = stringToSplit.Split(delimiter, StringSplitOptions.RemoveEmptyEntries)
        stringArray(stringArray.Length - 1) = stringArray(stringArray.Length - 1).Replace(")", String.Empty)
        Return stringArray
    End Function
    Private Function StringToIntArray(ByVal sprocketdata() As String) As Integer(,)
        Dim firstDimensionSize As Integer = sprocketdata.GetUpperBound(0)
        Dim integerArray(firstDimensionSize, 2) As Integer
        Dim tempString() As String
        For i As Integer = 0 To firstDimensionSize
            tempString = sprocketdata(i).Split(","c)
            For j = 0 To 2
                integerArray(i, j) = Convert.ToInt32(tempString(j))
            Next
        Next
        Return integerArray
    End Function

    Private Function GetInput() As String()
        Return File.ReadAllLines(INPUT_PATH)
    End Function
End Module


Form Code

Imports System.Drawing
Imports System.Windows.Forms

Public Class Form1
    Const BUFFER As Integer = 20
 Dim xValue As Integer
    Dim yValue As Integer
    Dim pRadius As Integer
    Dim paintData(,) As Integer
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

    End Sub
Public Shared Sub DrawSprockets(ByVal myForm As Form1, ByVal dataArray(,) As Integer)
        myForm.paintData = dataArray
        For i As Integer = 0 To myForm.paintData.GetUpperBound(0)
            myForm.paintData(i, 0) += 10
            myForm.paintData(i, 1) += 10
        Next
        myForm.Refresh()
    End Sub


    Private Sub Form1_Paint(ByVal sender As Object, e As PaintEventArgs) Handles MyBase.Paint
Dim myPen As Pen

        myPen = New Pen(Brushes.Black)

        For i As Integer = 0 To paintData.GetUpperBound(0)
            e.Graphics.DrawEllipse(myPen, New Rectangle(paintData(i, 0), paintData(i, 1), paintData(i, 2), paintData(i, 2)))
            e.Graphics.FillEllipse(Brushes.Black, New Rectangle(paintData(i, 0), paintData(i, 1), paintData(i, 2), paintData(i, 2)))

        Next

    End Sub

End Class
The overall structure of your code looks good, but the readability is a tad poor. You should always strive to follow the Framework Design Guidelines. Use proper naming and add a few linebreaks.

Rather than using arrays, create a dedicated "Sprocket" class to hold the parsed input data.

Public Class Sprocket
    Public Property X As Integer
    Public Property Y As Integer
    Public Property R As Integer
End Class


Now, if you add the rest of the non-numeric characters to the separator list you could actually read and parse the file in two lines. (Though you ougth to use the line-continuation character for readability as seen at the bottom)

Dim numbers = File.ReadAllText("C:\Temp\gearinput.txt").Split($"{Environment.NewLine} ,)(".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Select(Function(n) Integer.Parse(n)).ToArray()
Dim sprockets = Enumerable.Range(0, (numbers.Length \ 3)).Select(Function(i) New Sprocket With {.X = numbers(((i * 3) + 0)), .Y = numbers(((i * 3) + 1)), .R = numbers(((i * 3) + 2))}).ToArray()






Sprocket.vb

Public Class Sprocket

    Public Property X As Integer
    Public Property Y As Integer
    Public Property R As Integer

    Public Overrides Function ToString() As String
        Return $"{{ X={Me.X}, Y={Me.Y}, R={Me.R} }}"
    End Function

End Class


Program.vb

Public Module Program

    &lt;STAThread&gt;
    Public Sub Main()

        'TODO: Read file
        Dim input = "(0, 0, 16),  (100, 0, 16),  (100, 100, 12),  (50, 50, 24),  (0, 100, 12)"

        Dim numbers = input _
            .Split($"{Environment.NewLine} ,)(".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) _
            .Select(Function(n) Integer.Parse(n)) _
            .ToArray()

        Dim sprockets = Enumerable _
            .Range(0, (numbers.Length \ 3)) _
            .Select(Function(i) New Sprocket With
            {
                .X = numbers(((i * 3) + 0)),
                .Y = numbers(((i * 3) + 1)),
                .R = numbers(((i * 3) + 2))
            }) _
            .ToArray()

        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(False)
        Application.Run(New Window(sprockets))

    End Sub

End Module


Window.vb    

Public Class Window
    Inherits Form

    Private ReadOnly sprockets As Sprocket()

    Public Sub New(sprockets As Sprocket())

        If (sprockets Is Nothing) Then
            Throw New ArgumentNullException(NameOf(sprockets))
        End If

        Me.sprockets = sprockets

        Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer, True)

        Me.Text = "Sprockets"
        Me.AutoScaleMode = AutoScaleMode.Font
        Me.ClientSize = New Size(800, 450)

    End Sub

    Protected Overrides Sub OnPaint(e As PaintEventArgs)

        e.Graphics.Clear(Me.BackColor)
        e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality

        For Each sprocket In Me.sprockets

            Dim diameter = (sprocket.R * 2)
            Dim rect = New Rectangle(sprocket.X, sprocket.Y, diameter, diameter)

            e.Graphics.FillEllipse(Brushes.Black, rect)

        Next

    End Sub

End Class