I have few questions:
- The functions inside the python module are not called by any parameter of the wedge. There's no callback script in any of the parms. I thought you should invoke the functions of the python module by using something like ‘hou.phm().myFunction()’
How are the functions in that python module invoked when you press the Render Wedges button? - Render Wadges button has a tag “takecontrol” set to “always”. What does it mean?
- In the python module I see a lot of ‘node.parm(“myparm”).eval()’, but I can't find anywhere the node object being defined with the classic ‘node = hou.pwd()’. Same for ‘rendernode’. How is that possible?
- Could you create an environment variable with python or you can only do it through hou.hscript()
- How does the wedge actually launch the output driver? I guess it's that ‘rendernode.render()’ in the last lines of the python module, right? Is this ‘render()’ function documented anywhere? I can't happen to find it under the hou.Node help page [www.sidefx.com]
Thanks for any help!
I copy paste the pyhton module of the Wedge Node, so you can have a look at the code I'm talking about.
Cheers
import random def setenvvariable(var, val): hou.hscript("set %s = %s" % (var, val)) hou.hscript("varchange") def createwedge(channame, englishname, min, max, steps): if englishname == "": # Extract the raw channel name # to use as our name if the user # provided none englishname = channame.rpartition("/")[2] result = [] for i in range(steps): if steps > 1: v = ((max - min) / (steps-1)) * i else: v = (max - min) / 2.0 v += min; prefix = "_%s_%f" % (englishname, v) result.append( (channame, prefix, v) ) return result def mergewedge(allwedge, wedge): result = [] for w in wedge: for a in allwedge[:]: a = a[:] a.append(w) result.append(a) return result def getwedgenames(node): wedges, stashedparms, errormsg = getwedges(node) names = [] for wedge in wedges: names.append(_calculatewedgename(node, wedge)) return names def _calculatewedgename(node, wedge_channels): wedge_name = node.parm("prefix").eval() for channel in wedge_channels: channel_prefix = channel[1] wedge_name += channel_prefix return wedge_name def applyspecificwedge(node, wl): wedgestring = _calculatewedgename(node, wl) for wedge in wl: (cname, prefix, val) = wedge parm = node.parm(cname) if parm is not None: # Check if the parm is integer. ptype = parm.parmTemplate().type() if ptype == hou.parmTemplateType.Int: val = int(val) if ptype == hou.parmTemplateType.Menu: val = int(val) if ptype == hou.parmTemplateType.Toggle: val = int(val) parm.set(val) # Set the wedge environment variable setenvvariable("WEDGE", wedgestring) def buildrandom(chanlist, namelist, rangelist): wedge = [] # A sure sign I should have passed a list of tuples... for (chan, englishname, r) in zip(chanlist, namelist, rangelist): (a, b) = r v = random.uniform(a, b) if englishname == "": # Extract the raw channel name # to use as our name if the user # provided none englishname = chan.rpartition("/")[2] prefix = "_%s_%f" % (englishname, v) wedge.append( (chan, prefix, v) ) return wedge def getwedges(node): numparam = node.parm("wedgeparams").eval() stashedparms = [] errormsg = "" if node.parm("wedgemethod").eval() == 0: if node.parm("random").eval() == 0: allwedge = [[]] for p in range(numparam): chan = node.parm("chan%d" % (p+1,)).eval() name = node.parm("name%d" % (p+1,)).eval() if chan != "": parm = node.parm(chan) if parm is None: errormsg += "Cannot find channel %s\n" % (chan, ) continue wedge = createwedge( chan, name, node.parm("range%dx" % (p+1,)).eval(), node.parm("range%dy" % (p+1,)).eval(), node.parm("steps%d" % (p+1,)).eval()) stashedparms.append((chan, parm.eval())) # more an outerproduct than a merge. allwedge = mergewedge(allwedge, wedge) else: allwedge = [] chanlist = [] namelist = [] rangelist = [] for p in range(numparam): chan = node.parm("chan%d" % (p+1,)).eval() name = node.parm("name%d" % (p+1,)).eval() if chan != "": parm = node.parm(chan) if parm is None: errormsg += "Cannot find channel %s\n" % (chan, ) continue chanlist.append(chan) namelist.append(name) rangelist.append( (node.parm("range%dx" % (p+1,)).eval(), node.parm("range%dy" % (p+1,)).eval()) ) stashedparms.append((chan, parm.eval())) random.seed(node.parm("seed").eval()) nsample = node.parm("numrandom").eval() for lvar in range(nsample): wedge = buildrandom(chanlist, namelist, rangelist) allwedge.append(wedge) else: # Must be by take. allwedge = [] rendernode = None if len(node.inputs()) > 0: rendernode = node.inputs()[0] if rendernode: renderpath = rendernode.path() if rendernode is None: renderpath = node.parm("driver").eval() rendernode = node.node(renderpath) basetake = node.parm("roottake").eval() (takelist, e) = hou.hscript("takels -i -q -p %s" % (basetake,)) takelist = takelist.strip() if takelist == "": errormsg += "No takes found as child of \"%s\".\n" % (basetake,) takelist = takelist.split("\n") chan = renderpath + "/take" stashedparms.append((chan, node.parm(chan).eval())) for take in takelist: allwedge.append( [(chan, "_" + take, take)] ) return allwedge, stashedparms, errormsg def applywedge(node): allwedge, stashedparms, errormsg = getwedges(node) rendernode = None if len(node.inputs()) > 0: rendernode = node.inputs()[0] if rendernode: renderpath = rendernode.path() if rendernode is None: renderpath = node.parm("driver").eval() rendernode = node.node(renderpath) if rendernode is None: errormsg += "Cannot find output driver %s\n" % (renderpath,) # Extract specified single wedge wedgenum = 0 if node.parm("wrange").eval() == 1: wedgenum = node.parm("wedgenum").eval() if wedgenum >= len(allwedge): errormsg += "Requested wedge %d greater than total wedges %d.\n" % (wedgenum, len(allwedge)) else: allwedge = [allwedge[wedgenum]] if errormsg != "": if hou.isUIAvailable(): hou.ui.displayMessage("Errors:\n" + errormsg) else: print "Errors: " + errormsg return # Disable background rendering fgparm = None if node.parm("blockbackground").eval() == 1: fgparm = rendernode.parm("soho_foreground") if fgparm is not None: oldfgval = fgparm.eval() fgparm.set(True) # apply individual wedge for wl in allwedge: setenvvariable("WEDGENUM", str(wedgenum)) applyspecificwedge(node, wl) rendernode.render() wedgenum = wedgenum + 1 # Restore background rendering if fgparm is not None: fgparm.set(oldfgval) # Restore our settings to pre-wedge states. for (chan, val) in stashedparms: parm = node.parm(chan) parm.set(val) # Clear out the environment setenvvariable("WEDGE", "")