How can I make a tool like IDTool using Maxscript in 3Ds Max?

94 Views Asked by At

I am gonna improve the IDTool in 3Ds Max. To do this, I installed IDTool. Then, I can see .mcr file in maxscript folder. But I don't know to run this file. How can I change this script file to improve IDTool?

This code is a script that is descripting IDTool.

    `macroScript IDTool
        category:"IllusionBoxStudio"
        tooltip:"IDTool"
        

( local ver = "v2.34" -- v2.34 - Add "Assign ID by Layers" button -- v2.33 - Add Option to Assign Wirecolor by ID -- v2.32 - Add "Create Vray MultiMatteElement" button -- v2.31 - Add "Assign Incremental ID" button

--Closedialog
try(destroydialog IDToolDialogTEST)catch()

--Globals
global IDToolDialogTEST
global ShowIDFn

--Locals

if (getfiles ((GetDir #plugcfg) + "\\requiem_id_tool.ini")).count == 0 then
(
    setinisetting ((GetDir #plugcfg) + "\\requiem_id_tool.ini") "IDTool" "pos_x" "300"
    setinisetting ((GetDir #plugcfg) + "\\requiem_id_tool.ini") "IDTool" "pos_y" "300"
    setinisetting ((GetDir #plugcfg) + "\\requiem_id_tool.ini") "IDTool" "id" "1"
    setinisetting ((GetDir #plugcfg) + "\\requiem_id_tool.ini") "IDTool" "autocolor" "true"
)
local getIEdir = getFilenamePath sysInfo.windowsdir + "Program Files\\Internet Explorer\\iexplore.exe"
local DPosX = getinisetting ((GetDir #plugcfg) + "\\requiem_id_tool.ini") "IDTool" "pos_x" as integer
local DPosY = getinisetting ((GetDir #plugcfg) + "\\requiem_id_tool.ini") "IDTool" "pos_y" as integer
local getIDNum = getinisetting ((GetDir #plugcfg) + "\\requiem_id_tool.ini") "IDTool" "id" as integer

-- local InfoLineCount = 15 local getAutoColor = if (getinisetting ((GetDir #plugcfg) + "\requiem_id_tool.ini") "IDTool" "autocolor") != "" then ( (getinisetting ((GetDir #plugcfg) + "\requiem_id_tool.ini") "IDTool" "autocolor") as BooleanClass ) else (true)

--FN
-- Collect ObjectsID
fn getObjectsIDArray sel =
(
    local GBufferArray = #()
    for o in (if sel == false then objects else selection) where o.gbufferchannel != 0 do
    (
        if (findItem GBufferArray (o.gbufferchannel as string)) == 0 then append GBufferArray (o.gbufferchannel as string)
    )   
    
    if GBufferArray.count > 1 then
    (
        fn sort_array p1 p2 =
        (
            local check_value = (p2 as integer) - (p1 as integer)
            case of
            (
                (check_value < 0.): 1
                (check_value > 0.): -1
                default: 0
            )
        )
        qsort GBufferArray sort_array
    )
    return GBufferArray
)

fn getIDGroupColor arr = 
(
    if arr.count == 1 then return arr[1].wirecolor
    else if arr.count > 1 then
    (
        local CheckArrNum = 0
        local ArrNum = 1
        local Res = 0
        local CheckRes = 0
        for i in arr do
        (
            Res = 0
            for a in arr do
            (
                if i.wirecolor == a.wirecolor then Res += 1
            )
            if Res > CheckRes then 
            (
                CheckRes = Res
                CheckArrNum = ArrNum
            )
            ArrNum += 1
        )
        return arr[CheckArrNum].wirecolor
    )   
)


--Rollout
rollout IDToolDialogTEST ("IDTool " + ver) width:200
(
    Group ""
    (
        multiListBox mlb_IDList "" height:10 width:75 across:2
        button btn_HighlightID "Highlight" width:95 height:20 offset:[0,0] tooltip:"Highlight ID by Selected Objects"
        button btn_ClearSelectionID "Clear Sel. ID" width:95 height:20 offset:[43,-117] tooltip:"Clear ID on Selected Objects"
        button btn_ClearAllID "Clear All ID" width:95 height:20 offset:[43,1]
        button btn_ShowID "Show ID Viewport" width:95 height:20 offset:[43,1] tooltip:"Show Info on VIEWPORT"
        button btn_HideID "Hide ID Viewport" width:95 height:20 offset:[44,1]
        button btn_Refresh "Refresh List" width:175 height:20 offset:[0,14]--align:#right
    )
    
    Group "Assign ID"
    (
        spinner spn_IDValue "ID: " range:[1,65535,getIDNum] align:#left type:#integer scale:1
        button btn_AssignID "Assign ID" width:140 height:24 across:2 align:#left
        button btn_AssignIncrementalID "+" height:24 width:32 offset:[0,0] align:#right
        button btn_AssignIDByLayer "Assign ID by Layers" width:175 height:16 align:#center
    )
    Group "Wirecolor by ID"
    (
        checkbox chk_AssignWirecolorByID "Auto Assign Wirecolor by ID" checked:getAutoColor
        button btn_ReassignWirecolorByID "Reassign Wirecolor by ID" width:175 height:16
    )
    
    Group "Assign Random ID"
    (
        spinner spn_RandomMin "min:" range:[1,65534,1] across:2 type:#integer align:#left
        spinner spn_RandomMax "max:" range:[2,65535,6] type:#integer align:#left offset:[-15,0]
        button btn_AssignRandomID "Assign Random ID" width:175 height:16
        button btn_AssignToSelCount "Assign ID To Selection Count" width:175 height:16
    )
    
    Group "Render Elements"
    (
        button btn_CreateVrayElements "Create Vray MultiMatteElement" height:16 width:175
    )
    button btn_Help "info..." height:16 width:40 across:2 align:#left

-- Open Dialog
    on IDToolDialogTEST open do
    (
        mlb_IDList.items = (getObjectsIDArray false)
        completeRedraw()
    )
    
-- Close Dialog
    on IDToolDialogTEST close do
    (
        getIDNum = spn_IDValue.value
        setinisetting ((GetDir #plugcfg) + "\\requiem_id_tool.ini") "IDTool" "id" (spn_IDValue.value as string)
        setinisetting ((GetDir #plugcfg) + "\\requiem_id_tool.ini") "IDTool" "autocolor" (chk_AssignWirecolorByID.state as string)
        setinisetting ((GetDir #plugcfg) + "\\requiem_id_tool.ini") "IDTool" "pos_x" ((GetDialogPos IDToolDialogTEST).x as string)
        setinisetting ((GetDir #plugcfg) + "\\requiem_id_tool.ini") "IDTool" "pos_y" ((GetDialogPos IDToolDialogTEST).y as string)
    )
    
-- Reassign Wirecolor By ID
    on btn_ReassignWirecolorByID pressed do
    (
        undo "IDTool" on
        (
            if mlb_IDList.items.count != 0 then
            (
                ClearSelection()
                for i in mlb_IDList.items do
                (
                    local Arr = for o in objects where (o.gbufferchannel == i as integer) collect o
                    local getColor = getIDGroupColor Arr
                    for i in Arr do i.wirecolor = getColor
                )
            )
            completeRedraw()
        )
    )
    
-- Vray MultiMatteElements
    on btn_CreateVrayElements pressed do
    (
        if matchpattern (renderers.current as string) pattern:"v_ray*" == true or matchpattern (renderers.current as string) pattern:"vray*" == true then
        (
            get_elements = maxOps.GetCurRenderElementMgr()
            if (getObjectsIDArray false).count != 0 then
            (
                get_elements_count = get_elements.NumRenderElements()
                num = 1
                check_element_count = 3
                for i in (getObjectsIDArray false) do
                (
                    check_element_count += 1
                    if check_element_count > 2 do
                    (
                        get_elements.AddRenderElement (MultiMatteElement elementname:("MME_IDTool_" + (num as string)))
                        a = get_elements.GetRenderElement get_elements_count
                        a.R_gbufIDOn = false
                        a.G_gbufIDOn = false
                        a.B_gbufIDOn = false
                        a.MatID = false
                        num += 1
                        check_element_count = 0
                        get_elements_count += 1
                    )
                    local a = get_elements.GetRenderElement (get_elements_count-1)
                    case check_element_count of
                    (
                        0:
                        (
                            a.R_gbufIDOn = true
                            a.R_gbufID = i as integer
                            
                        )
                        1:
                        (
                            a.G_gbufIDOn = true
                            a.G_gbufID = i as integer
                        )
                        2:
                        (
                            a.B_gbufIDOn = true
                            a.B_gbufID = i as integer
                        )
                    )
                )
            )
        )
        else
        (
            messagebox "Use Vray Render"
        )
    )
    
-- Assign ID Incremental
    on btn_AssignIncrementalID pressed do
    (
        undo "IDTool" on
        (
            if selection.count != 0 then
            (
                for i in selection do i.gbufferchannel = spn_IDValue.value + 1
                if chk_AssignWirecolorByID.state == true then
                (
                    wcolor = random white black
                    for i in selection do i.wirecolor = wcolor
                )
                mlb_IDList.items = (getObjectsIDArray false)
                spn_IDValue.value += 1
                completeRedraw()
            )
        )
    )

-- Assign ID
    on btn_AssignID pressed do
    (
        undo "IDTool" on
        (
            if selection.count != 0 then
            (
                for i in selection do i.gbufferchannel = spn_IDValue.value
                if chk_AssignWirecolorByID.state == true then
                (
                    wcolor = random white black
                    for i in selection do i.wirecolor = wcolor
                )
                mlb_IDList.items = (getObjectsIDArray false)
                completeRedraw()
            )
        )
    )
    
    on btn_AssignIDByLayer pressed do
    (
        undo "IDTool" on
        (
            try
            (
                disableSceneRedraw()
                num = 1
                for i = 0 to layerManager.count-1 do
                (
                    getLayer = layerManager.getLayer i
                    getLayer.select on
                    getLayerName = getLayer.name
                    if selection.count != 0 then
                    (
                        for i in selection where superclassof i == GeometryClass do i.gbufferchannel = num
                    )
                    num += 1
                    ClearSelection()
                )
                enableSceneRedraw()
                completeRedraw()
                mlb_IDList.items = (getObjectsIDArray false)
            )
            catch
            (
                enableSceneRedraw()
                completeRedraw()
            )
        )
    )
    
-- Assign Random ID
    on btn_AssignRandomID pressed do
    (
        undo "IDTool" on
        (
            if selection.count != 0 then
            (
                for i in selection do
                (
                    i.gbufferchannel = random spn_RandomMin.value spn_RandomMax.value
                )
                mlb_IDList.items = (getObjectsIDArray false)
                completeRedraw()
            )
        )
    )
    
-- Assign Random ID To Selection Count
    on btn_AssignToSelCount pressed do
    (
        undo "IDTool" on
        (
            if selection.count != 0 then
            (
                local IDArr = #()
                num = 0
                for i in selection do
                (
                    append IDArr (num += 1)
                )
                for i in selection do
                (
                    random_id = random 1 IDArr.count
                    i.gbufferchannel = IDArr[random_id]
                    deleteitem IDArr random_id
                )
                
            )
            mlb_IDList.items = (getObjectsIDArray false)
            completeRedraw()
        )
    )
    
-- Random Spinner
    on spn_RandomMin changed val do
    (
        if spn_RandomMin.value >= spn_RandomMax.value then
        (
            spn_RandomMin.value = (spn_RandomMax.value - 1)
        )
    )
    
    on spn_RandomMax changed val do
    (
        if spn_RandomMax.value <= spn_RandomMin.value then
        (
            spn_RandomMax.value = (spn_RandomMin.value + 1)
        )
    )

-- Refresh
    on btn_Refresh pressed do
    (
        mlb_IDList.items = (getObjectsIDArray false)
        completeRedraw()
    )
    
-- Highlight
    on btn_HighlightID pressed do
    (
        if selection.count != 0 then
        (
            local getListboxPosition = #()
            if mlb_IDList.items.count != 0 then
            (
                for i = 1 to mlb_IDList.items.count do
                (
                    for o in (getObjectsIDArray true) do
                    (
                        if mlb_IDList.items[i] == o then
                        (
                            append getListboxPosition i
                        )
                    )
                )
            )
            mlb_IDList.selection = getListboxPosition
        )
    )
    
-- Clear All ID
    on btn_ClearAllID pressed do
    (
        if queryBox "Clear All ID's?" beep:true then
        (
            for i in objects do
            (
                i.gbufferchannel = 0
            )
            mlb_IDList.items = (getObjectsIDArray false)
            completeRedraw()
        )
    )
    
-- Clear Selected ID
    on btn_ClearSelectionID pressed do
    (
        if queryBox "Clear Selected ID?" beep:true then
        (
            if selection.count != 0 then
            (
                for i in selection do
                (
                    i.gbufferchannel = 0
                )
            )
            mlb_IDList.items = (getObjectsIDArray false)
            completeRedraw()
        )
    )
    
-- Select ID
    on mlb_IDList selectionEnd do
    (
        local SelectObjIDArray = #()
        for i in (mlb_IDList.selection as array) do
        (
            for o in objects where (o.gbufferchannel == mlb_IDList.items[i] as integer) do append SelectObjIDArray o
        )
        select SelectObjIDArray
    )
    
-- Viewport
    on btn_ShowID pressed do
    (
        UnRegisterRedrawViewsCallback ShowIDFn
        --FN
        fn ShowIDFn =
        (
            for i in objects where i.gbufferChannel != 0 do
            (
                gw.setTransform i.transform
                gw.text [0,0,0] (i.gbufferChannel as string) color:white
                gw.enlargeUpdateRect #whole
                gw.updateScreen()
            )
        )
        ShowIDFn()
        RegisterRedrawViewsCallback ShowIDFn
        completeRedraw()

-- UnRegisterRedrawViewsCallback ShowIDFn -- fn ShowIDFn = -- ( -- gw.setTransform(Matrix3 1) -- gw.wtext [50,((getViewSize()).y/2)-10,0] "IDTool Info:" color:yellow -- num = 1 -- for i in mlb_IDList.items do -- ( -- if num < InfoLineCount then -- ( -- local count = 0 -- for o in objects where o.gbufferchannel == (i as integer) do count += 1 -- gw.wtext [50,((getViewSize()).y/2)+(num16),0] ("ID " + i + " - " + (count as string) + " Objects") color:yellow -- num += 1 -- ) -- ) -- if mlb_IDList.items.count > InfoLineCount then -- ( -- count = 0 -- gw.wtext [50,((getViewSize()).y/2)+(InfoLineCount16),0] ("......") color:yellow -- for o in objects where o.gbufferchannel == ((mlb_IDList.items[mlb_IDList.items.count]) as integer) do count += 1 -- gw.wtext [50,((getViewSize()).y/2)+((InfoLineCount+1)*16),0] ("ID " + (mlb_IDList.items[mlb_IDList.items.count]) + " - " + (count as string) + " Objects") color:yellow -- ) -- ) -- RegisterRedrawViewsCallback ShowIDFn -- completeRedraw() )

    on btn_HideID pressed do
    (
        UnRegisterRedrawViewsCallback ShowIDFn
        completeRedraw()
    )
    on btn_Help pressed do
    (
        ShellLaunch getIEdir "http://www.illusionboxstudio.com"
    )
)
createdialog IDToolDialogTEST pos:[DPosX, DPosY]

)`

I want to know how I have to run this script and how I can change. Thank you for your reading

0

There are 0 best solutions below