Merge Objects into new Geometry
Hey! long time no post. But, now it’s time to post some stuff again. The first small script I want to share is a script, that has been handy during the last productions. It merges a geo object selection to an new geo and adds it’s material as primitive material. Maybe you were asking, why we sometimes are working like this. Houdini doesn’t display instanced subnets in the viewport and redshift doesn’t render instanced subnets. This is a workaround to fully instance subnet/objects in the viewport and at rendertime. Sure this is just a workflow for small assets, but for smaller products that need to be instanced this can be a solution. Also If you have to do some multi object editing. :).
import hou #Get Houdini Selection oSelection = hou.selectedItems() #Create an empty List oAllObjsforSubnet =  #Create an empty Counter counter = 0 #Check if the selection is empty if oSelection: #The the obj context to the variable obj obj = hou.node("/obj") #create a new Geo Node on /obj level newNode = obj.createNode("geo", str("merged_geo")) #Delete the build in File node of the new Geo newNode.children().destroy() #Create the hero merge node oMergeNode = newNode.createNode("merge") #Loop over the selected node for oNode in oSelection: #Check if the type is geo if oNode.type().name() == "geo": #Create an Obeject Merge node currentOBJMerge = newNode.createNode("object_merge") #Set the path to the base obj currentOBJMerge.parm("objpath1").set(oNode.path()) #Check if there is an Material assigned if(oNode.evalParm("shop_materialpath") != ""): #Create a SOP materail node currentMaterial = newNode.createNode("material") #Convert relative Pathes to absolute pathes relPath = oNode.evalParm("shop_materialpath") relNode = oNode.node(relPath) fullpath = relNode.path() #Fill in the right materail path currentMaterial.parm("shop_materialpath1").set(fullpath) #Connect the current obj merge node the the materail node currentMaterial.setInput(0,currentOBJMerge) #Connect the material node the the hero merge node oMergeNode.setInput(counter,currentMaterial) #If there is no Material assigned else: #Connect the Object Merge to the oMergeNode.setInput(counter,currentOBJMerge) #Increase the ounter, for the next merge node port counter +=1 #Set the diplay Flag oMergeNode.setDisplayFlag(True)