RSS FEED

Removing Controller with MAXScript

Since there's no built-in MAXScript function to remove controller once you add it to a parameter, here's a function to do that for you. Big thanks to Larry Minton for revealing how to handle ParamBlock2 PB2Values.

fn removeController subAnim = if isKindOf subAnim ::SubAnim and isController subAnim.controller do
(
    local originalValue = subAnim.value
    local REFMSG_CONTROLREF_CHANGE = 0xFA

    if isKindOf subAnim.parent ParamBlock2 then
    (
        local iGlobal = (dotNetClass "Autodesk.Max.GlobalInterface").Instance
        local pBlockNET = iGlobal.Animatable.GetAnimByHandle (getHandleByAnim subAnim.parent)
        local pValNET = pBlockNET.GetPB2Value (pBlockNET.IndexToId (subAnim.index - 1)) 0

        pValNET.Flags = bit.or pValNET.Flags 0x40 -- set the flag on the PB2Value which controls if the parameter is animated - this effectively removes the controller
    )
    else
    (
        local ctrl = subAnim.controller
        local parent = subAnim.parent
        local index = for i = 1 to refs.getNumRefs parent where refs.getReference parent i == ctrl do exit with i

        refs.replaceReference parent index undefined
    )

    if classOf subAnim.value == classOf originalValue do subAnim.value = originalValue
    notifyDependents subAnim.parent msg:REFMSG_CONTROLREF_CHANGE
)
Read more »
Return to top