Create VEG

Moving away from Nuke over to the world of Katana I wanted to share a script that I’ve been using to automate a part of the lighting process and save some time.
One of the main powers of Katana is working with VEGs (Variable Enabled Groups ) https://learn.foundry.com/katana/8.0/Content/rg/misc_nodes/variableenabledgroup.html
Using this workflow allows files to stay well organized when making adjustments to specific render layers. Since it’s so powerful you are often creating A LOT of these groups in one file.

If we’re going to be making a lot of them. We better automate the process to avoid user error.

Take your selected nodes and create a VEG using the view flag as the pattern value

#::::::::::::::::::::::::::::    
#:::: CREATE VEG ::::
#::::::::::::::::::::::::::::    
# Robert Matier 
# Version: 1.0.0
# Last Updated: 2025/02/10

# Katana Script designed to create Variable Enable Groups faster
# Works for chains of nodes with simple parent child inputs 
# copies selected nodes into a new VEG. Uses the View flag to set the name and the pattern of the VEG
#limitations : node selections with multiple top nodes or bottom nodes cause issue when linking to the VEG ports. 


from PyQt5.QtWidgets import QMessageBox
from Katana import NodegraphAPI

def createVEG():
    
    #setup
    root = NodegraphAPI.GetRootNode()
    pos = NodegraphAPI.GetViewPortPosition(root)
    if NodegraphAPI.GetViewNode() != True:
        name = NodegraphAPI.GetViewNode().getName()
    else:
        QtWidgets.QMessageBox(False, 'Viewer Flag', 'Nothing Viewed', QtWidgets.QMessageBox.Ok).exec_()
    fullname = name + '_000'

    #veg population
    newGrp = NodegraphAPI.CreateNode("VariableEnabledGroup", root)
    newGrp.setName(fullname)
    NodegraphAPI.SetNodePosition(newGrp,  (pos[0][0], pos[0][1]))
    NodegraphAPI.GetNode(fullname).getParameter('variableName').setValue('passname',0) #update the passname to the string ypu need 
    NodegraphAPI.GetNode(fullname).getParameter('pattern').setValue(name,0)
    newGrp.addInputPort('i0')
    newGrp.addOutputPort('o0')
    inPort = newGrp.getSendPort('i0')
    outPort = newGrp.getReturnPort('o0')
    xmlNodes = NodegraphAPI.BuildNodesXmlIO(NodegraphAPI.GetAllSelectedNodes())
    toDelete = NodegraphAPI.GetAllSelectedNodes()
    newNode = KatanaFile.Paste(xmlNodes, newGrp)[0]
    newNodeList = NodegraphAPI.GetAllSelectedNodes()

    #find top and bottom nodes respective ports from the list inside the VEG
    topNode = None
    boottomNode = None
    if len(newNodeList) == 1:
        listInPort = newNodeList[0].getInputPorts()[0]
        listOutPort = newNodeList[0].getOutputPort('out')

    else:
        for node in newNodeList:
            inputPortName = node.getInputPortByIndex(0).getName()
            if not node.getInputPorts():
                continue
            graphState = NodegraphAPI.GetCurrentGraphState()
            srcNode = node.getInputSource(inputPortName, graphState)[0]
            if srcNode != None:
                continue
            topNode = node
            
        for node in newNodeList:
            outConnection = node.getOutputPortByIndex(0).getNumConnectedPorts()
            if outConnection > 0:
                continue
            bottomNode = node


    #cleanup
    listInPort = topNode.getInputPorts()[0]
    listOutPort = bottomNode.getOutputPort('out')
    listOutPort.connect(outPort)
    listInPort.connect(inPort)
    for i in toDelete:
        i.delete()
    NodegraphAPI.SetNodeSelected(newGrp, True)

items = NodegraphAPI.GetAllSelectedNodes()
if len(items) == 0:
    QtWidgets.QMessageBox(False, 'Selection', 'Nothing selected', QtWidgets.QMessageBox.Ok).exec_()
else:
    createVEG()
Previous
Previous

Slit-scan

Next
Next

TCL