Search code examples
max3dsmaxscript

Give each object in scene a unique wirecolor?


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! =)


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.