Question

Know of any scripts, or code, to do this?

I've seen several which gives random colors, but I need to make sure no two objects have the same wirecolor..

Thanks! =)

Was it helpful?

Solution

I don't know any but it's not so hard to write one.

Here you go, hope it will do what you expected it to:

fn shuffle &arr =
(
    local temp, swapIndex, counter = arr.count + 1
    while counter > 1 do
    (
        swapIndex = random 1 (counter -= 1)
        temp = arr[counter]
        arr[counter] = arr[swapIndex]
        arr[swapIndex] = temp
    )
    OK
)

fn incrementCounters &r &g &b step =
(
    if (b += step) > 256 do
    (
        b = 1
        if (g += step) > 256 do
        (
            g = 1
            if (r += step) > 256 do r = 1
        )
    )
)

fn assignRandomWirecolor objs simple:true =
(
    local stepCount = objs.count^(double 1/3) + 1
    local step = 255./stepCount
    local redArr = #(0) + #{1..255}
    local greenArr = copy redArr #noMap
    local blueArr = copy redArr #noMap
    local r = local g = local b = 1

    if simple then
    (
        shuffle &redArr
        shuffle &greenArr
        shuffle &blueArr
    )
    else shuffle &sel -- slower with many objects

    for obj in objs do
    (
        obj.wirecolor = [redArr[int(r)], greenArr[int(g)], blueArr[int(b)]]
        incrementCounters &r &g &b step
    )
)


sel = selection as array
clearSelection()
assignRandomWirecolor sel --simple:false --> if simple is not so cool, try the other option
select sel

Of course it all also depends on the purpose you want to use it for, this is just a general approach and as such it might not be suitable for that exact task. If that's the case, you can give more details and I'll make some adjustments.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top