Imports System.Collections.Generic
Imports Grasshopper.Kernel
Imports Rhino.Geometry
Imports Rhino.Display
Imports System.Drawing
Imports Grasshopper
Public Class CustomSprite
Inherits GH_Component
'''
''' Each implementation of GH_Component must provide a public
''' constructor without any arguments.
''' Category represents the Tab in which the component will appear,
''' Subcategory the panel. If you use non-existing tab or panel names,
''' new tabs/panels will automatically be created.
'''
Public Sub New()
MyBase.New("Custom Sprite", "CustomSprite", _
"Creates a customizable oGL sprite visualization ", _
"Vector", "Point")
End Sub
'''
''' Registers all the input parameters for this component.
'''
Protected Overrides Sub RegisterInputParams(ByVal pManager As GH_Component.GH_InputParamManager)
pManager.Register_StringParam("Sprite", "S", "Sprite file route")
pManager.Register_ColourParam("Color", "C", "Sprite color", GH_ParamAccess.list)
pManager.Register_PointParam("Location", "L", "Sprite location", GH_ParamAccess.list)
pManager.Register_DoubleParam("Size", "S", "Sprite size")
End Sub
'''
''' Registers all the output parameters for this component.
'''
Protected Overrides Sub RegisterOutputParams(ByVal pManager As GH_Component.GH_OutputParamManager)
End Sub
Private customSprite As DisplayBitmap
Private clusters As List(Of DisplayBitmapDrawList)
Private size As List(Of Double)
Private imagePath As String
'''
''' This is the method that actually does the work.
'''
''' The DA object can be used to retrieve data from input parameters and
''' to store data in output parameters.
'''
Protected Overrides Sub SolveInstance(ByVal DA As IGH_DataAccess)
Dim ptlist As New List(Of Point3d)
Dim colors As New List(Of Color)
Dim dSize As Double
If (DA.Iteration = 0) Then
clusters = New List(Of DisplayBitmapDrawList)
size = New List(Of Double)
End If
If (Not DA.GetData(Of String)(0, imagePath)) Then Return
If (Not DA.GetDataList(Of Point3d)(2, ptlist)) Then Return
If (Not DA.GetDataList(Of Color)(1, colors)) Then Return
If (Not DA.GetData(Of Double)(3, dSize)) Then Return
If colors.Count <> ptlist.Count Then
If (colors.Count = 1) Then
Do Until (ptlist.Count = colors.Count)
colors.Add(colors.Item(0))
Loop
Else
AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Different number of points and colors supplied")
End If
End If
If ptlist.Count <> 0 Then
Dim disp As New DisplayBitmapDrawList
disp.SetPoints(ptlist, colors)
clusters.Add(disp)
size.Add(dSize)
End If
End Sub
Public Overrides Sub DrawViewportWires(ByVal args As Grasshopper.Kernel.IGH_PreviewArgs)
MyBase.DrawViewportWires(args)
'Checking errors.
If (imagePath = Nothing) Or (size.Count = 0) Or (clusters.Count = 0) Then
Exit Sub
End If
customSprite = New DisplayBitmap(Image.FromFile(imagePath))
If customSprite.ToString <> Nothing Then
For i As Integer = 0 To clusters.Count - 1
args.Display.DrawSprites(customSprite, clusters(i), size(i), True)
Next
End If
End Sub
'''
''' Provides an Icon for every component that will be visible in the User Interface.
''' Icons need to be 24x24 pixels.
'''
Protected Overrides ReadOnly Property Icon() As System.Drawing.Bitmap
Get
'You can add image files to your project resources and access them like this:
' return Resources.IconForThisComponent;
Return My.Resources.CustomSprite_03
'Return Nothing
End Get
End Property
'''
''' Each component must have a unique Guid to identify it.
''' It is vital this Guid doesn't change otherwise old ghx files
''' that use the old ID will partially fail during loading.
'''
Public Overrides ReadOnly Property ComponentGuid() As Guid
Get
Return New Guid("{AEBE070F-10C2-44E7-8C9A-D543B90DEEBD}")
End Get
End Property
End Class