Nuke gizmos to groups

Recursively replace all gizmos in Nuke script with a group. The only exception is the Cryptomatte nodes, which will be maintained as gizmos.

Copy-paste the below code into the Nuke script editor and run.


import uuid
import nuke


def is_gizmo(node):
    """Return True if given node is a gizmo (and not allowed gizmo type)"""

    allowed_gizmo_classes = ('Cryptomatte')

    for knob in node.knobs():
        if 'gizmo' in knob and node.Class() not in allowed_gizmo_classes:
            return True


def get_gizmo_names():
    """Return the fullName attribute for all gizmos in script"""
    
    gizmos = []
    all_nodes = nuke.allNodes(recurseGroups=True)

    if all_nodes:
        gizmos = [node.fullName() for node in all_nodes if is_gizmo(node)]

    return gizmos


def deselect_all_nodes():
    """De-select all nodes"""

    for i in nuke.allNodes(recurseGroups=True):
        i.knob('selected').setValue(False)


def convert_gizmo_to_group(gizmo_full_name):
    """Convert given gizmo (gizmo.fullName) to group"""
    
    gizmo = nuke.toNode(gizmo_full_name)

    inputs = []
    for x in range(0, gizmo.maximumInputs()):
        if gizmo.input(x):
            inputs.append(gizmo.input(x))
        else:
            inputs.append(False)

    original_name = gizmo.knob('name').value()
    xpos = gizmo.xpos()
    ypos = gizmo.ypos()
    uid_name = uuid.uuid4()

    gizmo.knob('name').setValue('%s' % uid_name)
    deselect_all_nodes()
    gizmo.knob('selected').setValue(True)

    with gizmo:
        new_group = gizmo.makeGroup()

        deselect_all_nodes()
        nuke.delete(gizmo)

        new_group.knob('name').setValue(original_name)
        new_group['xpos'].setValue(xpos)
        new_group['ypos'].setValue(ypos)

        for x in range(0, new_group.maximumInputs()):
            new_group.setInput(x, None)
            if inputs[x]:
                new_group.connectInput(x, inputs[x])


def main():
    """Main script"""
    # Store the current selection
    current_selection = nuke.selectedNodes()

    while get_gizmo_names():
        gizmo_full_name = get_gizmo_names()[0]
        convert_gizmo_to_group(gizmo_full_name)
        print('Converted %s' % gizmo_full_name)

    # Restore original selection
    for n in current_selection:
        try:
            n['selected'].setValue(True)
        except:
            pass

main()