Modifying Object Colors
Windows only
Problem
Changing object colors using Rhino’s properties command can be slow when assigning colors to lots of objects. Imagine you would like to assign randomized colors across multiple objects or pick two colors and have Rhino generate all the blend colors. All of this is possible with RhinoScript.
Solution
All this is possible with the help of RhinoScript’s GetColor
and ObjectColor
methods…
The following sample script contains the following subroutines:
SetObjectColor
- sets object colors.SetObjectColorRandom
- sets random object colors.SetObjectColorGraded
- sets gradient object colors based on the order picked.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ObjectColor.rvb -- February 2009
' If this code works, it was written by Dale Fugier.
' If not, I don't know who wrote it.
' Works with Rhino 4.0.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Option Explicit
Randomize
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Sets object colors
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub SetObjectColor()
Dim objects, color
objects = Rhino.GetObjects("Select objects to change colors", 0, True, True)
If IsNull(objects) Then Exit Sub
color = Rhino.GetColor
If IsNull(color) Then Exit Sub
Rhino.ObjectColor objects, color
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Set random object colors
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub SetObjectColorRandom()
Dim objects, red, green, blue, i
objects = Rhino.GetObjects("Select objects for randomly color change", 0, True, True)
If IsNull(objects) Then Exit Sub
Rhino.EnableRedraw False
For i = 0 To UBound(objects)
red = Int(255 * Rnd)
green = Int(255 * Rnd)
blue = Int(255 * Rnd)
Rhino.ObjectColor objects(i), RGB(red, green, blue)
Next
Rhino.EnableRedraw True
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Sets gradient object colors (based on the order picked)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub SetObjectColorGraded()
Dim objects, color0, color1, color, i, bound
Dim red, red0, red1
Dim green, green0, green1
Dim blue, blue0, blue1, percent
objects = Rhino.GetObjects("Select objects for gradient color change", 0, True, True)
If IsNull(objects) Then Exit Sub
color0 = Rhino.GetColor
If IsNull(color0) Then Exit Sub
color1 = Rhino.GetColor
If IsNull(color1) Then Exit Sub
' Extract red-green-blue components
red0 = color0 And &HFF
red1 = color1 And &HFF
green0 = (color0 \ &H100) And &HFF
green1 = (color1 \ &H100) And &HFF
blue0 = (color0 \ &H10000) And &HFF
blue1 = (color1 \ &H10000) And &HFF
bound = UBound(objects)
Rhino.EnableRedraw False
For i = 0 To bound
' A linearly interpreted gradient just calculates the new RGB values by applying a
' target value percent of the linear range to the each RGB component range.
percent = i/bound
red = red0 + Int(percent * (red1 - red0))
green = green0 + Int(percent * (green1 - green0))
blue = blue0 + Int(percent * (blue1 - blue0))
Rhino.ObjectColor objects(i), RGB(red, green, blue)
Next
Rhino.EnableRedraw True
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Rhino.AddStartupScript Rhino.LastLoadedScriptFile
Rhino.AddAlias "SetObjectColor", "_NoEcho _-RunScript (SetObjectColor)"
Rhino.AddAlias "SetObjectColorRandom", "_NoEcho _-RunScript (SetObjectColorRandom)"
Rhino.AddAlias "SetObjectColorGraded", "_NoEcho _-RunScript (SetObjectColorGraded)"