network_kwargs

app/dat principle

In SOPs, I often use the app/dat pair of nodes. This pair is made just by naming the nodes properly, using the naming convention. For example:

Materials:

  • "matapp_earth" will be Material SOP, it applies the materials to the earth geo
  • "matdat_earth" will be Material Network, it contains material builders and VOPs

CHOPnets:

  • "chopapp_lag" will be Channel SOP, it applies the CHOP data
  • "chopdat_lag" will be Chop Network, it creates the CHOP data

Reference system:

  • "refapp_circle" will be Circle SOP, it reads (usually animated) data from the detail attribute of the peer node:
  • "refdat_circle" will be Attribute Wrangle, it creates animated data (Arc Angles)

Preview (draft) system:

  • "preapp_resample" will be Resample SOP, it reads data from the following peer node:
  • "predat_resample" will be Attribute Wrangle, it has the checkbox "Preview". If it is on, then Length is 0.5 if off, then 0.1

app/dat layout

I have my own Network Editor Layout feature that also aligns the DAT node to its APP node.

node_data (node_app, prefix)

Finds a "peer" node that belongs to a pair of APP / DAT.

snippet_preview (parms)

Creates a "preview" snippet to selected parameters.

snippet_reference (parms)

Creates a "reference" snippet to selected parameters.

parm_ref_appdat (node_app, node_dat, parm_name):

Sets the parameter to the APP node so that it reads the detail of the attribute from the appropriate DAT node.

parmmenu_pre (node_app, parms):

Finds DAT peer node and reads kwargs (right button click). Generates a "preview" snippet and puts it in a peer node.

parmmenu_ref (node_app, parms):

Finds DAT peer node and reads kwargs (right button click). Generates a "reference" snippet and puts it in a peer node.

source code

the following code is maintained also on my github
thank you, great people, I couldn't do this without you.

import re
import hou

def node_data_peer (node_app, prefix) :

    node_con      = node_app.parent()
    path_con      = node_con.path()
    name_app      = node_app.name()
    name_app_done = re.findall('.*app_(.*)',name_app)

    if not name_app_done :
        name_app = prefix + "app_" + name_app
        node_app.setName(name_app)

    name_dat  = name_app.replace("app_", "dat_")
    path_dat  = path_con + "/" + name_dat
    node_dat  = hou.node(path_dat)

    if node_dat :
        existed = 1
    else :
        existed = 0
        node_dat = node_con.createNode('attribwrangle',name_dat)
        posx = node_app.position()[0] + 3
        posy = node_app.position()[1] + 0
        node_dat.setPosition( [posx,posy] )
        node_dat.parm("class").set("detail")
    
    return node_dat

def node_data_parent (node_app, parmname) :

    node_dop      = node_app.parent()
    node_con      = node_dop.parent()
    path_con      = node_con.path()
    name_app      = node_app.name()

    name_dat  = name_app + "_" + parmname
    path_dat  = path_con + "/" + name_dat
    node_dat  = hou.node(path_dat)

    if node_dat :
        existed = 1
    else :
        existed = 0
        node_dat = node_con.createNode('attribwrangle',name_dat)
        posx = node_dop.position()[0] + 3
        posy = node_dop.position()[1] + 0
        node_dat.setPosition( [posx,posy] )
        node_dat.parm("class").set("detail")
        node_dat.setUserData("nodeshape", "circle")
        node_dat.setColor(hou.Color(0.0, 0.0, 0.0))
        node_dat.setComment("`")
    
    return node_dat

def snippet_preview (parms) :
    snippet  = 'n'
    snippet += 'qqincn'
    snippet += '// delete one of those:n'
    snippet += 'qqpreview_intn'
    snippet += 'qqpreview_float n'
    snippet += 'n'
    for parm in parms :
        snippet += 'fi@' + parm.name() + 'n' 
    return snippet



def snippet_reference (parms) :
    snippet = 'n'
    for parm in parms :
        snippet += 'qq@f.' + parm.name() + 'n' 
    return snippet



def parm_ref_appdat (node_app, node_dat, parm_name) :
    relpath           = str(node_app.relativePathTo(node_dat))
    expression        = 'detail("' + relpath + '","' + parm_name + '",0)'
    parm              = node_app.parm(parm_name)
    parm.setExpression(expression)


def parmmenu_pre (node_app, parms) :
    prefix    = 'PRE'
    node_dat  = node_data_peer(node_app,prefix)
    snip_parm = node_dat.parm('snippet')
    snippet   = snip_parm.unexpandedString()
    snippet  += snippet_preview (parms)
    snip_parm.set(snippet)

    for parm in parms :
        parm_ref_appdat (node_app, node_dat, parm.name())


def parmmenu_ref_peer (node_app, parms) :
    prefix    = 'REF'
    node_dat  = node_data_peer(node_app,prefix)
    snip_parm = node_dat.parm('snippet')
    snippet   = snip_parm.unexpandedString()
    snippet  += snippet_reference (parms)
    snip_parm.set(snippet)

    for parm in parms :
        parm_ref_appdat (node_app, node_dat, parm.name())

def parmmenu_ref_parent (node_app, parms) :

    node_dat  = node_data_parent(node_app,parms[0].name())
    snip_parm = node_dat.parm('snippet')
    snippet   = snip_parm.unexpandedString()
    snippet  += snippet_reference (parms)
    snip_parm.set(snippet)

    for parm in parms :
        parm_ref_appdat (node_app, node_dat, parm.name())