Ejemplo n.º 1
0
    def __init__(self, node, rig_subnet):
        print "muscle"
        self.node = node
        self.rig_subnet = rig_subnet

        self.limb_subnet = self.create_rig_node(self.rig_subnet)

        self.node_rename(self.node, self.limb_subnet)
        self.make_color(self.node)
        self.colorize_node(self.limb_subnet, self.color)
        self.position_node(self.node, self.limb_subnet)

        #todo put all this into smaller functions
        copy_self_node = hou.copyNodesTo([self.node], self.node.parent())
        copy_self_node = copy_self_node[0]

        copy_self_node.node("fetch_parent").destroy()
        copy_self_node.node("fetch_parent1").destroy()

        hou.copyNodesTo(copy_self_node.children(), self.limb_subnet)
        copy_self_node.destroy()

        # creating the nodes into variables--------------------------------------------------------------
        fetch = self.create_fetch_import(self.node.parm("hook"), self.limb_subnet)
        fetch_upper = self.create_fetch_import(self.node.parm("hook_upper"), self.limb_subnet)
        list_of_fetchers = [fetch, fetch_upper]

        self.o_position = self.limb_subnet.node("origin_position")
        self.i_position = self.limb_subnet.node("insertion_position")
        self.center_offset = self.limb_subnet.node("center_offset")
        self.muscle_node = self.limb_subnet.node("muscle")
        self.chop_muscle = self.limb_subnet.node("chopnet_muscle")
        self.jiggle_switch_node = self.chop_muscle.node("switch_jiggle_effect")
        self.jiggle_node = self.chop_muscle.node("jiggle_center_muscle")


        list_of_positioners = [self.o_position, self.i_position]

        for index, i in enumerate(list_of_positioners):
            # i.parm("keeppos").set(0)
            i.setInput(0, list_of_fetchers[index])
            # i.parm("keeppos").set(1)

        self.limb_subnet.layoutChildren()

        muscle_node = self.limb_subnet.node("muscle")
        muscle_node.parm("tdisplay").set(1)
        try:
            muscle_node_position = muscle_node.position()
            chop_node = self.limb_subnet.node("chopnet_muscle")
            chop_node.setPosition([muscle_node_position[0], (muscle_node_position[1]-.5)])
        except:
            pass

        self.muscle_view()
        self.promote_parms(self.rig_subnet, ["Rig Parms", self.node.name()])
        self.promote_viz_positioners()

        gv.muscle_deformers_list.append(muscle_node)
Ejemplo n.º 2
0
    def create_snippet_network(self):
        """Create snippet subnetwork at /obj level for user selection."""
        selection = utils_hou.get_selection(1)

        if not selection:
            hou.ui.displayMessage("Please select nodes to send.")
            return

        obj_context = hou.node("/obj")
        selection_type = selection[0].type().category().name()

        snippet_name_prompt = hou.ui.readInput("Enter snippet name:",
                                               ("OK", "Cancel"))
        input_name = snippet_name_prompt[1]
        input_name = input_name.replace(" ", "_")
        snippet_name = "snp_" + input_name

        if not snippet_name:
            hou.ui.displayMessage("Please enter a snippet name")
            return

        snippet_subnet = obj_context.createNode("subnet",
                                                node_name=snippet_name)
        snippet_subnet.setColor(hou.Color(0.97, 0.78, 0.26))
        snippet_subnet.setDisplayFlag(False)

        if utils_hou.HOU_VER >= 16:
            snippet_subnet.setUserData("nodeshape", "circle")

        destination_node = snippet_subnet

        if selection_type == "Sop":
            destination_node = snippet_subnet.createNode("geo")
            destination_node.setName("container_" + input_name)

        if selection_type == "Vop":
            destination_node = snippet_subnet.createNode("matnet")
            destination_node.setName("container_" + input_name)

        if selection_type == "Driver":
            destination_node = snippet_subnet.createNode("ropnet")
            destination_node.setName("container_" + input_name)

        snippet_verif = snippet_subnet.createNode("subnet")
        snippet_verif.setName("snippet_verification")
        snippet_verif.setDisplayFlag(False)
        snippet_verif.hide(True)
        destination_node.setColor(hou.Color(0, 0, 0))

        hou.copyNodesTo(selection, destination_node)
Ejemplo n.º 3
0
def bakeObjectToWorld(startFrame, endFrame):
    selectedNode = hou.selectedNodes()
    selectedNodeName = selectedNode[0].name()
    parent = selectedNode[0].parent()
    bakeNode = hou.copyNodesTo(selectedNode, parent)
    bakeNode[0].setName(selectedNodeName + "_bake")
    bakeNode[0].parm("keeppos").set(0)
    fetchNode = hou.node(parent.path()).createNode("fetch",
                                                   "fetch_" + selectedNodeName)
    hou.node(fetchNode.path()).parm("fetchobjpath").set(selectedNode[0].path())
    hou.node(fetchNode.path()).parm("useinputoffetched").set(1)
    nullNode = hou.node(parent.path()).createNode("null")
    nullNode.setFirstInput(fetchNode)
    nullNodeName = nullNode.name()

    parms = ["tx", "ty", "tz", "rx", "ry", "rz"]
    constant = ["TX", "TY", "TZ", "RX", "RY", "RZ"]

    bakeNode[0].setInput(0, None)

    #delete expresssion in parms and set to 0
    for p in parms:
        bakeNode[0].parm(p).deleteAllKeyframes()
        hou.hscript('objextractpretransform ' + bakeNode[0].path())
        bakeNode[0].parm(p).set(0)

    for p, c in zip(parms, constant):
        #bakeNode[0].parm(p).deleteAllKeyframes()
        hou.node(bakeNode[0].path()).parm(p).setExpression('origin("","../' +
                                                           nullNodeName +
                                                           '",' + c + ')')

    #add dict for hou.Keyframe and values
    key = dict([(x, hou.Keyframe()) for x in parms])
    values = dict([(x, []) for x in constant])

    #bake time range
    timeRange = xrange(startFrame, endFrame + 1)

    #fill values dict
    for t in timeRange:
        hou.setFrame(t)
        for v, p in zip(constant, parms):
            values[v].append(bakeNode[0].parm(p).eval())

    for p in parms:
        bakeNode[0].parm(p).deleteAllKeyframes()
        bakeNode[0].parm(p).set(0)

    #set key by keyframes

    for t in timeRange:
        hou.setFrame(t)
        for v, p, k in zip(constant, parms, key):
            key[k].setValue(values[v][t - startFrame])
            bakeNode[0].parm(p).setKeyframe(key[k])

    fetchNode.destroy()
    nullNode.destroy()
Ejemplo n.º 4
0
def CreateSetImportNode(filepath, indexx):
    global node
    global parentnode
    global grandparentnode
    global generatedNodes
    global mergenode
    fileimportnode = grandparentnode.createNode("file")
    fileimportnode.parm('file').set(filepath)
    templates = hou.copyNodesTo(nodestocopy, grandparentnode)
    templates[0].setInput(0, fileimportnode, 0)
    mergenode.setInput(indexx, templates[1], 0)
    for nodeee in templates:
        generatedNodes.append(nodeee)
    generatedNodes.append(fileimportnode)
Ejemplo n.º 5
0
 def SubMeshesSplitToGeos(submeshNode):
     submeshNode.setHardLocked(True)
     nodeName = submeshNode.name()
     currentHomeNode = submeshNode.parent()
     outWorld = currentHomeNode.parent()
     newHomeNode = outWorld.createNode('geo')
     newHomeNode.setName(nodeName,True)
     currentHomeInputs = currentHomeNode.inputs()
     if currentHomeInputs and len(currentHomeInputs) > 0:
         BasicFunc.connect_node(currentHomeInputs[0], newHomeNode)
         BasicFunc.alignWorldPos(newHomeNode, currentHomeNode)
     BasicFunc.adjustLayout(newHomeNode)
     cpNode = hou.copyNodesTo((submeshNode,), newHomeNode)[0]
     submeshNode.setColor(hou.Color(1, 0, 0))
Ejemplo n.º 6
0
def changeWrangle():
    nodes = hou.selectedNodes()
    for node in nodes:
        try:

            mode = node.parm('mode').eval()
            types = ['attribwrangle', 'volumewrangle', 'deformationwrangle']
            wrangle = types[mode]
            group_parm = 'group{}'.format('2' if mode == 1 else "")
            group = node.parm(group_parm).eval()
            snippet = 'snippet{}'.format(mode + 1)
            code = node.parm(snippet).eval()

            pcodes = [i.asCode() for i in node.parms()]
            new_node = hou.copyNodesTo([node], node.parent())[0]
            new_node = new_node.changeNodeType(wrangle)
            pn = re.compile('.parm\(\"([^\)]+)\"\)')

            for p in pcodes:
                try:
                    exec(p)
                except (AttributeError):
                    pname = pn.search(p).groups()[0]
                    print 'Can\'t set parm {}'.format(pname)

            new_node.parm('group').set(group)
            new_node.parm('snippet').set(code)
            new_node.matchCurrentDefinition()

            for i, inp in enumerate(node.inputs()):
                new_node.setInput(i, inp)

            for c in node.outputConnections():
                out = c.outputNode()
                i = c.inputIndex()
                out.setInput(i, new_node)

            name = node.name()
            node.destroy()
            new_node.setName(name)
            new_node.setColor(hou.Color(colors.wrangle_new))

        except (AttributeError):
            hou.ui.displayMessage(
                "{} is not an actionwrangle instance!".format(node.name()))
Ejemplo n.º 7
0
    def subGeoVersion1(self, FBX, OBJ):
        # Create Geometry node to store FBX parts
        geometry = OBJ.createNode('geo', run_init_scripts=False)
        geometry.setName('GEO_{}'.format(FBX.name()), unique_name=True)
        geometry.moveToGoodPosition()
        # Get all parts inside FBX container
        geometry_FBX = [
            node for node in FBX.children() if node.type().name() == 'geo'
        ]

        # Create merge node for parts
        merge = geometry.createNode('merge')
        merge.setName('master_merge')

        #Create Null Object at the end
        oNull = geometry.createNode('null')
        oNull.setName('OUT_DAZ')
        #Link MergeOut to NullIn
        oNull.setInput(0, merge)

        ####
        for geo in geometry_FBX:
            # Create Object Merge node
            objectMerge = geometry.createNode('object_merge')
            objectMerge.setName(geo.name())

            # Set path to FBX part object
            objectMerge.parm('objpath1').set(geo.path())
            objectMerge.parm('xformtype').set(1)

            ## MATERIAL HANDLING
            matName = hou.node("obj/" + FBX.name() + "/" + geo.name() + "/" +
                               geo.name() + "_material")
            if matName is not None:
                parentH = hou.node("obj/" + geometry.name())
                hou.copyNodesTo([matName], parentH)
                material = hou.node("obj/" + geometry.name() + "/" +
                                    geo.name() + "_material")

                ############------------############
                #Call process to convert materials.
                #From Older Version Un-Implemented
                ############------------############
            else:
                # Create Material node if none exist. No materials are added if none are detected.
                material = geometry.createNode('material')
                material.setName('MAT_{}'.format(geo.name()))

            # LINK NODES

            # Link Material to Object MergeName
            material.setNextInput(objectMerge)
            # Link part to Merge
            merge.setNextInput(material)

        # Set Null Node flags to Render
        oNull.setDisplayFlag(1)
        oNull.setRenderFlag(1)
        # Layout geometry content in Network View
        geometry.layoutChildren()

        ####
        # Set Null Node flags to Render
        oNull.setDisplayFlag(1)
        oNull.setRenderFlag(1)

        # Layout geometry content in Network View
        geometry.layoutChildren()
Ejemplo n.º 8
0
    def __createBuildingNodes__(self):
        # Inicialize for LoD function
        firstNode = self.__geo__.children()[0]
        firstNode.setSelected(True)
        LoD.LoD_max().recorrer(LoD.connexioDescendent(),
                               LoD.obtenirNodesArrels().obtenir())
        # Last added node(node from LoD import function) which contains the original building
        originalBuilding = self.__geo__.children()[len(self.__geo__.children())
                                                   - 1]
        originalBuilding.moveToGoodPosition()
        # We create the condition node and connect it with the nodes
        # which input nodes were connected
        conditionNodeInserts = self.__geo__.createNode(
            'destructionConditional')
        conditionNodeInserts.setName('conditionNodeInserts', True)
        conditionNodeGeneric = self.__geo__.createNode(
            'destructionConditional')
        conditionNodeGeneric.setName('conditionNodeGeneric', True)
        mergeToInserts = self.__geo__.createNode('merge')
        mergeToInserts.setName('mergeToInserts', True)
        mergeFromGeneric = self.__geo__.createNode('merge')
        mergeFromGeneric.setName('mergeFromGeneric', True)
        fuseToInserts = self.__geo__.createNode('fuse')
        fuseToInserts.setName('fuseToInserts', True)
        fuseToInserts.parm('dist').set(0.01)
        fuseFromGeneric = self.__geo__.createNode('fuse')
        fuseFromGeneric.setName('fuseFromGeneric', True)
        fuseFromGeneric.parm('dist').set(0.01)
        conditionNodeInserts.moveToGoodPosition()
        conditionNodeGeneric.moveToGoodPosition()
        # pattern to find the correct parm in the "object_merge" node
        # wich is the original building
        pattern = nameParmObjPath + '[0-9]*'
        patternCompiled = re.compile(pattern)
        '''
        Added and modified 19/05/2011
        '''
        geo = self.__geo__
        listOfParmsGroup = self.__conditionGroupsParm__
        # Create merge node
        mergeNode = geo.createNode('merge')
        mergeNode.setNextInput(conditionNodeInserts)
        mergeNode.setNextInput(conditionNodeGeneric)
        # Connect groupNode partDes shop to condition nodes
        combineGroupPartDes = geo.createNode('group')
        combineGroupPartDes.setNextInput(mergeNode)
        # rename node
        combineGroupPartDes.setName('combinedGroupPartDes', True)
        # Connect groupNode totDes shop to groupPartDes node
        combineGroupTotDes = geo.createNode('group')
        combineGroupTotDes.setNextInput(combineGroupPartDes)
        # rename node
        combineGroupTotDes.setName('combinedGroupTotDes', True)

        combineGroupNotDes = geo.createNode('group')
        combineGroupNotDes.setNextInput(combineGroupTotDes)
        # rename node
        combineGroupNotDes.setName('combinedGroupNotDes', True)

        totDesInsertName = conditionNodeInserts.evalParm(listOfParmsGroup[0])
        partiDesInsertName = conditionNodeInserts.evalParm(listOfParmsGroup[1])
        notDesInsertName = conditionNodeInserts.evalParm(listOfParmsGroup[2])

        totDesGenericName = conditionNodeGeneric.evalParm(listOfParmsGroup[0])
        partiDesGenericName = conditionNodeGeneric.evalParm(
            listOfParmsGroup[1])
        notDesGenericName = conditionNodeGeneric.evalParm(listOfParmsGroup[2])

        # Inicialize combined groups
        combineGroupPartDes.parm('crname').set('combinedPartDes')
        combineGroupPartDes.parm('grpequal').set('combinedPartDes')
        combineGroupPartDes.parm('grp1').set(partiDesInsertName)
        combineGroupPartDes.parm('grp2').set(partiDesGenericName)
        combineGroupPartDes.parm('op1').set('or')

        combineGroupTotDes.parm('crname').set('combinedTotDes')
        combineGroupTotDes.parm('grpequal').set('combinedTotDes')
        combineGroupTotDes.parm('grp1').set(totDesInsertName)
        combineGroupTotDes.parm('grp2').set(totDesGenericName)
        combineGroupTotDes.parm('op1').set('or')

        combineGroupNotDes.parm('crname').set('combinedNotDes')
        combineGroupNotDes.parm('grpequal').set('combinedNotDes')
        combineGroupNotDes.parm('grp1').set(notDesInsertName)
        combineGroupNotDes.parm('grp2').set(notDesGenericName)
        combineGroupNotDes.parm('op1').set('or')

        labeler = self.__geo__.createNode('Labeler')
        labeler.setNextInput(combineGroupNotDes)
        '''
        End modification 19/05/2011
        '''
        for parm in originalBuilding.parms():
            if patternCompiled.match(parm.name()):
                posibleNode = hou.node(parm.eval())
                if posibleNode.type().name() == 'Insert':
                    logging.debug('INSERTS:' + str(posibleNode))
                    self.__inserts__.append(posibleNode)
                    tempInputs = posibleNode.inputs()
                    # we delete the connections from input nodes to not duplicated geometry
                    '''
                    Added and modified 12/05/2011, Labeler
                    '''
                    posibleNode.setInput(0, labeler, 0)
                    '''
                    End modification 12/05/2011, Labeler
                    '''

                    for i in range(len(tempInputs) - 1):
                        posibleNode.setInput(i + 1, None, 0)
                    for input in tempInputs:
                        # We have to ensure that "input" is not None(in houdini it's allowed None inputs) and not repeat
                        if input != None and input not in mergeToInserts.inputs(
                        ):
                            mergeToInserts.setNextInput(input, 0)

        fuseToInserts.setNextInput(mergeToInserts, 0)
        conditionNodeInserts.setNextInput(fuseToInserts, 0)
        mergeToInserts.moveToGoodPosition()
        fuseToInserts.moveToGoodPosition()
        conditionNodeInserts.moveToGoodPosition()
        for output in conditionNodeInserts.outputs():
            output.moveToGoodPosition()
        # we create the nodes which will contain the destroyed building. They will be a copy
        # of the original building, and later we will change some parameters to convert it to
        # a destroyed building

        # "group" of nodes to copy. We need only the original building, but, for houdini software reasons
        # it must be a group.
        tempGroup = [originalBuilding]
        listPartsInserts = []
        listPartsGeneric = []
        for name in self.__listNamesInserts__:
            tempNode = hou.copyNodesTo(tempGroup, originalBuilding.parent())[0]
            tempNode.setName(name, True)
            listPartsInserts.append(tempNode)
        for name in self.__listNamesGeneric__:
            tempNode = hou.copyNodesTo(tempGroup, originalBuilding.parent())[0]
            tempNode.setName(name, True)
            listPartsGeneric.append(tempNode)
        originalBuilding.destroy()

        # Create the final building node
        finalBuilding = self.__geo__.createNode('merge')
        finalBuilding.setName('finalBuilding', True)
        finalBuilding.moveToGoodPosition()
        # Connect the building inserts geometry(modified) with the final building
        for node in listPartsInserts:
            finalBuilding.setNextInput(node)
            node.moveToGoodPosition()
        # Connect the building general(no insert geometry) with the condition node especific for they
        for node in listPartsGeneric:
            mergeFromGeneric.setNextInput(node)
            node.moveToGoodPosition()
        fuseFromGeneric.setNextInput(mergeFromGeneric)
        conditionNodeGeneric.setNextInput(fuseFromGeneric)
        mergeFromGeneric.moveToGoodPosition()
        fuseFromGeneric.moveToGoodPosition()
        conditionNodeGeneric.moveToGoodPosition()

        mergeNode.moveToGoodPosition()
        labeler.moveToGoodPosition()
        combineGroupPartDes.moveToGoodPosition()
        combineGroupTotDes.moveToGoodPosition()
        combineGroupNotDes.moveToGoodPosition()

        # Finally connect the condition node of the general geometry to the final building
        finalBuilding.setNextInput(labeler)
        finalBuilding.moveToGoodPosition()
        # Assign the data
        self.__listPartsInserts__ = listPartsInserts
        self.__listPartsGeneric__ = listPartsGeneric
        self.__conditionNodeInserts__ = conditionNodeInserts
        self.__conditionNodeGeneric__ = conditionNodeGeneric
        self.__finalBuilding__ = finalBuilding
        self.__labeler__ = labeler
    def generateTextures(objNode):
        print("OBJ: \"%s\"" % (objNode.path()))

        vopTypes = hou.vopNodeTypeCategory().nodeTypes()
        vrayVopTypes = sorted(
            [vopType for vopType in vopTypes if vrayVopFilter(vopType)])

        # FOR TESTS
        # vrayVopTypes = vrayVopTypes[:2]

        bbox = objNode.renderNode().geometry().boundingBox()
        bboxWidth = bbox.sizevec().x()
        bboxDepth = bbox.sizevec().z()

        col = 0
        row = 0
        bboxOffsetPerc = 2.0
        offsetX = bboxWidth * bboxOffsetPerc
        offsetY = bboxDepth * bboxOffsetPerc
        cellW = bboxWidth + offsetX
        cellD = bboxDepth + offsetY
        maxColCount = int(math.sqrt(len(vrayVopTypes)))

        matNet = getCreateEmpty(MAT, "vray_material", "TEXTURES_ALL_PER_FRAME")
        objNet = getCreateEmpty(OBJ, "subnet", "TEXTURES_ALL_PER_FRAME")

        fontMat = getCreate(MAT, "VRayNodeBRDFVRayMtl", "font")
        fontMat.setMaterialFlag(True)
        fontMat.parm("diffuser").set(0.05)
        fontMat.parm("diffuseg").set(0.05)
        fontMat.parm("diffuseb").set(0.05)

        uvw = matNet.createNode("VRayNodeUVWGenMayaPlace2dTexture",
                                node_name="channel_uv")
        uvw.parm("repeat_u").set(3)
        uvw.parm("repeat_v").set(3)

        for texType in vrayVopTypes:
            tex = None
            texName = texType.replace(PREFIX, "")

            try:
                mtl = matNet.createNode("VRayNodeBRDFVRayMtl",
                                        node_name="mtl%s" % texName)

                # Attach texture to "diffuse".
                tex = mtl.createInputNode(0, texType, node_name=texName)

                uvwGenIndex = tex.inputIndex("uvwgen")
                if uvwGenIndex >= 0:
                    tex.setNamedInput("uvwgen", uvw, 0)
            except:
                print("Failed: \"%s\"" % (texType))

            if tex:
                objForTex = getCreateEmpty(objNet, "geo", "obj%s" % texName)

                # Copy source geo.
                hou.copyNodesTo(objNode.children(), objForTex)

                testMtl = objForTex.createNode("material")
                testMtl.setNextInput(objForTex.renderNode())

                # Assign material
                objForTex.parm("shop_materialpath").set("")
                testMtl.parm("shop_materialpath1").set(mtl.path())

                # Add text
                font = objForTex.createNode("font")
                font.parm("file").set("Consolas")
                font.parm("text").set(texName)
                font.parm("fontsize").set(0.2)

                fontDivide = objForTex.createNode("divide")
                fontDivide.setNextInput(font)

                fontExt = objForTex.createNode("polyextrude")
                fontExt.parm("dist").set(0.02)
                fontExt.setNextInput(fontDivide)

                fontTm = objForTex.createNode("xform")
                fontTm.setNextInput(fontExt)
                fontTm.parm("tx").set(0.3)
                fontTm.parm("rx").set(-90.0)
                fontTm.parm("ry").set(90.0)

                fontMtl = objForTex.createNode("material")
                fontMtl.setNextInput(fontTm)
                fontMtl.parm("shop_materialpath1").set(fontMat.path())

                merge = objForTex.createNode("merge")
                merge.setNextInput(testMtl)
                merge.setNextInput(fontMtl)
                merge.setDisplayFlag(True)
                merge.setRenderFlag(True)

                objForTex.layoutChildren()

                pos = (row * cellD, 0, col * cellW)

                tm = hou.hmath.buildTranslate(pos)
                objForTex.setWorldTransform(tm)

                if col == maxColCount - 1:
                    col = 0
                    row += 1
                else:
                    col += 1

        matNet.layoutChildren()
        objNet.layoutChildren()
Ejemplo n.º 10
0
gltf_hierarchy_list = []
for nodes in my_network:
    if nodes.type().name() == 'gltf_hierarchy':
        gltf_hierarchy_list.append(nodes)

#create sub_geo for each glTF hierarchy in glTF_Loader
for nodes in gltf_hierarchy_list:
    #create subnet to host all gltf nodes in the glTF_Loader
    geo_node = glTF_Loader.createNode('subnet', nodes.name())
    #find and list all geo node in glTF hierarchy
    sub_geo = nodes.children()
    for i in sub_geo:
        geo_node_list = []
        if i.type().name() == 'geo':
            geo_node_list.append(i)
            new_glTF_node = hou.copyNodesTo(geo_node_list, geo_node)[0]
            GLTF = new_glTF_node.children()[0]
            #get selection class hou.Geometry to find an Attribute value
            geo = GLTF.geometry()
            shd_Prim_Name = geo.findPrimAttrib("shop_materialpath")
            value = shd_Prim_Name.strings()[0]
            #get only shader name
            shd_name = str(value.split("/")[-1])
            new_shd_primattrib = 'setprimattrib(0, "shop_materialpath", @primnum, "/mat/' + shd_name + '","set");'
            #create and set Rrim Wrangler to rename shop_materialpath attribute
            wrang = new_glTF_node.createNode("attribwrangle",
                                             "Set_New_Material_Path")
            wrang.parm('class').set(1)
            wrang.parm('snippet').set(new_shd_primattrib)
            wrang.setFirstInput(GLTF)
            #create normal node and set it to Face Area
def insertGraphSplit():

    print "\n" * 2
    print "_" * 100
    print "Splitting PDG ImageMagick Montage..."

    #hardcoded to 2 for now
    num_splits = 2

    #analyze PDG Graph and get Nodes into object
    pdg_graph_obj = PDGGraphObject()

    #reassign nodes
    pdgchain_nodes = pdg_graph_obj._pdgchain_nodes

    ffmpeg_node = pdg_graph_obj._ffmpeg_node
    imagemagick_node = pdg_graph_obj._imagemagick_node

    wedge_root_node = pdg_graph_obj._wedge_root_node
    parent_topnet = wedge_root_node.parent()
    render_node = pdg_graph_obj._render_node
    render_node_pdg = pdg_graph_obj._render_node_pdg

    #get wedge count from first root wedge node
    root_wedge_count = wedge_root_node.parm("wedgecount").eval()

    #create new split node and position
    new_split_node = parent_topnet.createNode("split", "split_montage")
    new_split_node.setPosition(render_node_pdg.position())
    new_split_node.move([0, -2])
    new_split_node.setInput(0, render_node_pdg)

    split_expr = new_split_node.parm("splitexpression")
    split_expr.setExpression("@wedgenum<" +
                             str((root_wedge_count / num_splits)))

    #make sure ffmpeg node and image_magick node end with split postfix _p0, _p1
    if not ffmpeg_node.name().endswith("_p0"):
        ffmpeg_node.setName(ffmpeg_node.name() + "_p0")

    if not imagemagick_node.name().endswith("_p0"):
        imagemagick_node.setName(imagemagick_node.name() + "_p0")

    #copy / paste remaining nodechain
    old_nodes = []
    old_nodes.append(ffmpeg_node)
    for node in pdgchain_nodes:
        #break loop before appending rende ropfetch node
        if node == render_node_pdg:
            break
        #append
        old_nodes.append(node)

    new_nodes = hou.copyNodesTo(old_nodes, parent_topnet)
    #move new stream
    for node in new_nodes:
        node.move([2, -2])
    #set input
    new_nodes[-1].setInput(0, new_split_node, 1)

    #move old stream
    for node in old_nodes:
        node.move([-2, -2])
    #set input
    old_nodes[-1].setInput(0, new_split_node, 0)

    print "_" * 100
    print "Finished splitting PDG ImageMagick Montage successfully"
    print "_" * 100
    print "\n" * 2
Ejemplo n.º 12
0
    def ConvertJointsToBones_Hierachy(rootNode):
        #print 'parent:', rootNode.parent()
        #rootNode.parent().createNode('null','testnull')
        destroyList = []
        stack = []
        realBoneList = []
        newNames = []
        firstAuthority = []
        subnet = rootNode.parent()
        stack.append(rootNode)
        BasicFunc.set_transform_keeppos(rootNode)
        while len(stack) > 0:
            nullNode = stack.pop()
            # print nullNode
            nodeInputs = nullNode.inputs()
            hierachyParent = None
            if nodeInputs is not None and len(nodeInputs) > 0:
                hierachyParent = nodeInputs[0]

            destroyList.append(nullNode)
            firstFlag = True
            nullNodeOutputs = nullNode.outputs()
            if nullNodeOutputs is not None and len(nullNodeOutputs) > 0:
                for child in nullNode.outputs():
                    BasicFunc.set_transform_keeppos(child)
                    childTypeName = child.type().name()
                    # print childTypeName
                    if childTypeName == 'null':
                        #print 'append', child
                        stack.append(child)
                    elif childTypeName == 'bone':
                        #child 是替代骨骼
                        nodeLookAt = child.node(child.parm('lookatpath').eval())
                        BasicFunc.set_transform_keeppos(nodeLookAt)
                        # create bone node and parent to origin parent
                        realBoneNode = subnet.createNode('bone')
                        realBoneList.append(realBoneNode)
                        #append !!!!!
                        newNames.append(nullNode.name())
                        if firstFlag:
                            firstFlag = False
                            firstAuthority.append(True)
                        else:
                            firstAuthority.append(False)
                        realBoneNode.parm('length').set(child.parm('length').eval())
                        realBoneNode.setColor(hou.Color(1, 0, 0))
                        BasicFunc.connect_node(child, realBoneNode)
                        BasicFunc.alignWorldPos(realBoneNode, nullNode)
                        realBoneNode.parm('keeppos').set(True)
                        BasicFunc.adjustLayout(realBoneNode)
                        if hierachyParent:
                            BasicFunc.connect_node(hierachyParent, realBoneNode)
                        else:
                            realBoneNode.setInput(0, None, 0)
                        BasicFunc.connect_node(realBoneNode,nodeLookAt)
                        destroyList.append(child)
            else:
                endBoneNode = subnet.createNode('bone')
                BasicFunc.connect_node(nullNode, endBoneNode)
                endBoneNode.parm('length').set(0)
                BasicFunc.adjustLayout(endBoneNode)
                BasicFunc.alignWorldPos(endBoneNode, nullNode)
                endBoneNode.parm('keeppos').set(True)
                realBoneList.append(endBoneNode)
                newNames.append(nullNode.name())
                firstAuthority.append(True)
        for deadNode in destroyList:
            deadNode.destroy()
        for i in range(len(realBoneList)):
            if firstAuthority[i]:
                realBoneList[i].setName(newNames[i],True)
            else:
                realBoneList[i].setName(newNames[i]+'_00', True)
        for geoNode in subnet.children():
            if geoNode.type().name() == 'geo':
                # find bone capture node
                currentRenderNode = geoNode.renderNode()
                captureNode = None
                for insideNode in geoNode.children():
                    # print insideNode
                    if insideNode.type().name() == 'capture':
                        captureNode = insideNode
                        break
                if captureNode:
                    print 'capture node:', captureNode
                    cpNode = hou.copyNodesTo((captureNode,), geoNode)[0]
                    cpNode.setHardLocked(False)
                    attrCopyNode = geoNode.createNode('attribcopy')
                    BasicFunc.connect_node(cpNode, attrCopyNode,0,0)
                    BasicFunc.connect_node(captureNode, attrCopyNode,0,1)
                    attrCopyNode.parm('attribname').set('*')
                    BasicFunc.connect_node(attrCopyNode, currentRenderNode)
def charAssetsToHDA():
    this = hou.node('.')
    importNode = hou.hipFile.importFBX(this.parm('char_fbx_file').eval(), suppress_save_prompt=True, merge_into_scene=True, import_cameras=False, import_joints_and_skin=True, import_geometry=True, import_lights=False, import_animation=False, import_materials=False, resample_animation=False, resample_interval=1.0, override_framerate=False,framerate=-1, hide_joints_attached_to_skin=True, convert_joints_to_zyx_rotation_order=False, material_mode=hou.fbxMaterialMode.FBXShaderNodes, compatibility_mode=hou.fbxCompatibilityMode.Maya, single_precision_vertex_caches=False, triangulate_nurbs=False, triangulate_patches=False, import_global_ambient_light=False, import_blend_deformers_as_blend_sops=False, segment_scale_already_baked_in=True, convert_file_paths_to_relative=False, unlock_geometry=True, unlock_deformations=True, import_nulls_as_subnets=False, import_into_object_subnet=True, convert_into_y_up_coordinate_system=False)
    fbxNode = importNode[0]   
    
    if fbxNode:
        # set up the parameters
        
        # CHOP mocap params
        hou_parm_template = hou.StringParmTemplate("fbxfile", "FBX File", 1, default_value=([""]), naming_scheme=hou.parmNamingScheme.Base1, string_type=hou.stringParmType.FileReference, menu_items=([]), menu_labels=([]), icon_names=([]), item_generator_script="", item_generator_script_language=hou.scriptLanguage.Python, menu_type=hou.menuType.StringReplace)
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Character']), create_missing_folders=True)
        
        hou_parm_template = hou.StringParmTemplate("fbxclip", "Clip", 1, default_value=([""]), naming_scheme=hou.parmNamingScheme.Base1, string_type=hou.stringParmType.Regular, menu_items=([]), menu_labels=([]), icon_names=([]), item_generator_script="opmenu -l CHOP/fbxagent/fbximport currentclip", item_generator_script_language=hou.scriptLanguage.Hscript, menu_type=hou.menuType.Normal)
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Character']), create_missing_folders=True)
        
        hou_parm_template = hou.ToggleParmTemplate("mocapswitch", "Use Mocap?", default_value=False)
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Character']), create_missing_folders=True)
        
        # Alembic params
        hou_parm_template = hou.LabelParmTemplate("labelparm", "Alembic", column_labels=([""]))
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.ToggleParmTemplate("use_cache", "Use Cache", default_value=False)
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.FloatParmTemplate("cache_scale", "Cache Scale", 1, default_value=([1]), min=0, max=10, min_is_strict=False, max_is_strict=False, look=hou.parmLook.Regular, naming_scheme=hou.parmNamingScheme.Base1)
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.MenuParmTemplate("trange", "Valid Frame Range", menu_items=(["off","normal","on"]), menu_labels=(["Render Current Frame","Render Frame Range","Render Frame Range Only (Strict)"]), default_value=0, icon_names=([]), item_generator_script="", item_generator_script_language=hou.scriptLanguage.Python, menu_type=hou.menuType.Normal)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.FloatParmTemplate("f", "Start/End/Inc", 3, default_value=([0, 0, 1]), default_expression=(["$FSTART","$FEND",""]), default_expression_language=([hou.scriptLanguage.Hscript,hou.scriptLanguage.Hscript,hou.scriptLanguage.Hscript]), min=0, max=10, min_is_strict=False, max_is_strict=False, look=hou.parmLook.Regular, naming_scheme=hou.parmNamingScheme.Base1)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.StringParmTemplate("cachefile", "Cache File", 1, default_value=(["$HIP/output.abc"]), naming_scheme=hou.parmNamingScheme.Base1, string_type=hou.stringParmType.FileReference, menu_items=([]), menu_labels=([]), icon_names=([]), item_generator_script="opmenu -l exportnet/alembic filename", item_generator_script_language=hou.scriptLanguage.Hscript, menu_type=hou.menuType.StringReplace)
        hou_parm_template.setTags({"autoscope": "0000000000000000", "filechooser_pattern": "*.abc"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.ButtonParmTemplate("cache_btn", "Cache to Disk")
        hou_parm_template.setTags({"autoscope": "0000000000000000", "takecontrol": "always"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        #FBX params
        hou_parm_template = hou.SeparatorParmTemplate("sepparm")
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.LabelParmTemplate("labelparm2", "FBX", column_labels=([""]))
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.MenuParmTemplate("trange2", "Valid Frame Range", menu_items=(["off","normal","on"]), menu_labels=(["Render Current Frame","Render Frame Range","Render Frame Range Only (Strict)"]), default_value=0, icon_names=([]), item_generator_script="", item_generator_script_language=hou.scriptLanguage.Python, menu_type=hou.menuType.Normal)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.FloatParmTemplate("f4", "Start/End/Inc", 3, default_value=([0, 0, 1]), default_expression=(["$FSTART","$FEND",""]), default_expression_language=([hou.scriptLanguage.Hscript,hou.scriptLanguage.Hscript,hou.scriptLanguage.Hscript]), min=0, max=10, min_is_strict=False, max_is_strict=False, look=hou.parmLook.Regular, naming_scheme=hou.parmNamingScheme.Base1)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.StringParmTemplate("take", "Render With Take", 1, default_value=(["_current_"]), naming_scheme=hou.parmNamingScheme.Base1, string_type=hou.stringParmType.Regular, menu_items=([]), menu_labels=([]), icon_names=([]), item_generator_script="opmenu -l exportnet/filmboxfbx1 take", item_generator_script_language=hou.scriptLanguage.Hscript, menu_type=hou.menuType.Normal)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.StringParmTemplate("sopoutput", "Output File", 1, default_value=(["$HIP/out.fbx"]), naming_scheme=hou.parmNamingScheme.Base1, string_type=hou.stringParmType.FileReference, menu_items=([]), menu_labels=([]), icon_names=([]), item_generator_script="opmenu -l exportnet/filmboxfbx1 sopoutput", item_generator_script_language=hou.scriptLanguage.Hscript, menu_type=hou.menuType.StringReplace)
        hou_parm_template.setTags({"autoscope": "0000000000000000", "filechooser_mode": "write"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.ToggleParmTemplate("mkpath", "Create Intermediate Directories", default_value=True, default_expression='on', default_expression_language=hou.scriptLanguage.Hscript)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.ToggleParmTemplate("exportkind", "Export in ASCII Format", default_value=True, default_expression='on', default_expression_language=hou.scriptLanguage.Hscript)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.StringParmTemplate("sdkversion", "FBX SDK Version", 1, default_value=([""]), naming_scheme=hou.parmNamingScheme.Base1, string_type=hou.stringParmType.Regular, menu_items=([]), menu_labels=([]), icon_names=([]), item_generator_script="opmenu -l exportnet/filmboxfbx1 sdkversion", item_generator_script_language=hou.scriptLanguage.Hscript, menu_type=hou.menuType.Normal)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.MenuParmTemplate("vcformat", "Vertex Cache Format", menu_items=(["mayaformat","maxformat"]), menu_labels=(["Maya Compatible (MC)","3DS MAX Compatible (PC2)"]), default_value=0, icon_names=([]), item_generator_script="", item_generator_script_language=hou.scriptLanguage.Python, menu_type=hou.menuType.Normal)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.MenuParmTemplate("invisobj", "Export Invisible Objects", menu_items=(["nullnodes","fullnodes"]), menu_labels=(["As Hidden Null Nodes","As Hidden Full Nodes"]), default_value=0, icon_names=([]), item_generator_script="", item_generator_script_language=hou.scriptLanguage.Python, menu_type=hou.menuType.Normal)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.FloatParmTemplate("polylod", "Conversion Level of Detail", 1, default_value=([1]), min=0, max=5, min_is_strict=True, max_is_strict=False, look=hou.parmLook.Regular, naming_scheme=hou.parmNamingScheme.Base1)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.ToggleParmTemplate("detectconstpointobjs", "Detect Constant Point Count Dynamic Objects", default_value=True, default_expression='on', default_expression_language=hou.scriptLanguage.Hscript)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.ToggleParmTemplate("convertsurfaces", "Convert NURBS and Bezier Surfaces to Polygons", default_value=False, default_expression='off', default_expression_language=hou.scriptLanguage.Hscript)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.ToggleParmTemplate("conservemem", "Conserve Memory at the Expense of Export Time", default_value=False, default_expression='off', default_expression_language=hou.scriptLanguage.Hscript)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.ToggleParmTemplate("deformsasvcs", "Export Deforms as Vertex Caches", default_value=False, default_expression='off', default_expression_language=hou.scriptLanguage.Hscript)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.ToggleParmTemplate("forceblendshape", "Force Blend Shape Export", default_value=False, default_expression='off', default_expression_language=hou.scriptLanguage.Hscript)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.ToggleParmTemplate("forceskindeform", "Force Skin Deform Export", default_value=False, default_expression='off', default_expression_language=hou.scriptLanguage.Hscript)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.ToggleParmTemplate("exportendeffectors", "Export End Effectors", default_value=True, default_expression='on', default_expression_language=hou.scriptLanguage.Hscript)
        hou_parm_template.setTags({"autoscope": "0000000000000000"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        hou_parm_template = hou.ButtonParmTemplate("execute", "Save to Disk")
        hou_parm_template.setTags({"autoscope": "0000000000000000", "takecontrol": "always"})
        fbxNode.addSpareParmTuple(hou_parm_template, in_folder=(['Cache']), create_missing_folders=True)
        
        children = fbxNode.children()
        fbxNodeName = fbxNode.name().rsplit('_', 1)
        
        charGeo = fbxNode.createNode('geo', fbxNodeName[0] + '_geo')
        if len(charGeo.children()) > 0:
            charGeo.children()[0].destroy() # older version of houdini had a lone file node

        ccache = charGeo.createNode('alembic', 'char_abc_cache')
        ccache.parm('fileName').set('`chs("../../cachefile")`')
        cscale = charGeo.createNode('xform', 'cache_scale')
        cscale.setFirstInput(ccache)
        cscale.parm('scale').setExpression('ch("../../cache_scale")')
        cswitch = charGeo.createNode('switch', 'cache_switch')
        cswitch.parm('input').setExpression('ch("../../use_cache")')
        
        exportNet = fbxNode.createNode('ropnet', 'exportnet')
        alembicRop = exportNet.createNode('alembic', 'alembic')
        alembicRop.parm('execute').setExpression('ch("../../cache_btn")')
        alembicRop.parm('trange').setExpression('ch("../../trange")')
        alembicRop.parm('f1').setExpression('ch("../../f1")')
        alembicRop.parm('f2').setExpression('ch("../../f2")')
        alembicRop.parm('f3').setExpression('ch("../../f3")')
        alembicRop.parm('use_sop_path').set(1)
        alembicRop.parm('sop_path').set('../../' + charGeo.name())
        alembicRop.parm('build_from_path').set(1)
        alembicRop.parm('path_attrib').set('path')
        alembicRop.parm('root').set('')

        fbxRop = exportNet.createNode('filmboxfbx', 'fbx')
        fbxRop.parm('startnode').set('`opfullpath("../../")`')
        fbxRop.parm('createsubnetroot').set(0)
        
        fbxRop.parm('trange').setExpression('ch("../../trange2")')
        fbxRop.parm('f1').setExpression('ch("../../f41")')
        fbxRop.parm('f2').setExpression('ch("../../f42")')
        fbxRop.parm('f3').setExpression('ch("../../f43")')
        fbxRop.parm('take').setExpression('ch("../../take")')
        fbxRop.parm('sopoutput').setExpression('ch("../../sopoutput")')
        fbxRop.parm('mkpath').setExpression('ch("../../mkpath")')
        fbxRop.parm('exportkind').setExpression('ch("../../exportkind")')
        fbxRop.parm('sdkversion').setExpression('ch("../../sdkversion")')
        fbxRop.parm('vcformat').setExpression('ch("../../vcformat")')
        fbxRop.parm('invisobj').setExpression('ch("../../invisobj")')
        fbxRop.parm('polylod').setExpression('ch("../../polylod")')
        fbxRop.parm('detectconstpointobjs').setExpression('ch("../../detectconstpointobjs")')
        fbxRop.parm('convertsurfaces').setExpression('ch("../../convertsurfaces")')
        fbxRop.parm('conservemem').setExpression('ch("../../conservemem")')
        fbxRop.parm('deformsasvcs').setExpression('ch("../../deformsasvcs")')
        fbxRop.parm('forceblendshape').setExpression('ch("../../forceblendshape")')
        fbxRop.parm('forceskindeform').setExpression('ch("../../forceskindeform")')
        fbxRop.parm('exportendeffectors').setExpression('ch("../../exportendeffectors")')
        fbxRop.parm('execute').setExpression('ch("../../execute")')
        
        rigBox = fbxNode.createNetworkBox()
        rigBox.setComment('Rig')
                        
        for child in children:
            # for the fbxchop we need to rename it and set up a bclip/agent network to
            # drive animation on the joints
            if child.type().name() == 'chopnet':
                child.destroy()
            
            if child.type().name() == 'null':
                 # we want to set CHOP expressions for nulls so they move the bones with our mocap CHOPs
                 if child.name() is not fbxNodeName[0]: # check to make sure this is not the root null
                    child.parmTuple('t').deleteAllKeyframes()
                    child.parmTuple('r').deleteAllKeyframes()
                    child.parm('rx').setExpression('chop("../CHOP/OUT/$OS:$CH")')
                    child.parm('ry').setExpression('chop("../CHOP/OUT/$OS:$CH")')
                    child.parm('rz').setExpression('chop("../CHOP/OUT/$OS:$CH")')
                    child.parm('tx').setExpression('chop("../CHOP/OUT/$OS:$CH")')
                    child.parm('ty').setExpression('chop("../CHOP/OUT/$OS:$CH")')
                    child.parm('tz').setExpression('chop("../CHOP/OUT/$OS:$CH")')
                    rigBox.addNode(child)
            
            if child.type().name() == 'bone':
                # add the bones to the rig net box
                rigBox.addNode(child)
                    
            if child.type().name() == 'geo':
                if child.name() is not charGeo.name():
                    # we want to convert these to a single geo pointing to a alembic
                    hou.copyNodesTo(child.children(), charGeo)
                    child.destroy()
        
        rigBox.fitAroundContents()
        
        # build the CHOP network
        child = fbxNode.createNode('chopnet', 'CHOP')
        
        #let's fetch the original tpose and place in in a bclip
        fetch = child.createNode('fetch')
        fetch.parm('rate').set(24)
        fetch.parm('nodepath').set('../../* ')
        
        bclip = fetch.clipData(True)
        fileName = this.parm('char_bclip_file').eval()
        
        f = open(hou.expandString(fileName), 'wb')
        f.write(bclip)
        
        f.close()
        
        fetch.destroy()
        
        tposeChop = child.createNode('file', 'tpose_clip')
        tposeChop.parm('file').set(fileName)
        agentChop = child.createNode('agent', 'mocap')
        agentChop.parm('clipname').set('`chs("../../fbxclip")`')
        switch = child.createNode('switch', 'switch')
        switch.parm('index').setExpression('ch("../../mocapswitch")')
        
        outChop = child.createNode('null', 'OUT')
        sopNode = child.createNode('sopnet', 'fbxagent')
        
        switch.setFirstInput(tposeChop)
        switch.setNextInput(agentChop)
        outChop.setFirstInput(switch)
        
        fbxImport = sopNode.createNode('agent', 'fbximport')
        fbxImport.parm('fbxfile').set('`chs("../../../fbxfile")`')
        
        fbxImport.parm('input').set(2)
        
        agentChop.parm('soppath').set('../fbxagent/fbximport')
        
        outChop.setDisplayFlag(True)
        #outChop.setRenderFlag(True)
        
        child.layoutChildren()
        
        # work on the character geo point all the captures to an alembic file
        overMerge = charGeo.createNode('merge', 'merge')
        
        alembic = charGeo.createNode('alembic', 'char_abc_geo')
        fileName = this.parm('char_abc_file').eval()
        alembic.parm('fileName').set(fileName)
        
        unpack = charGeo.createNode('unpack', 'unpack')
        unpack.setFirstInput(alembic)
        unpack.parm('transfer_attributes').set('path shop_materialpath')
        
        children = charGeo.children()
        for child in children:
            if child.type().name() == 'file':
                nodeName = child.name()   
                deleteNode = charGeo.createNode('delete', 'isolate_' + nodeName)
                deleteNode.parm('negate').set(1)
                deleteNode.parm('group').set('@path="/' + nodeName + '/*"')
                deleteNode.setFirstInput(unpack)
                if len(child.outputs()) > 0:
                    delOutput = child.outputs()[0]
                    delOutput.setFirstInput(deleteNode)
                
                child.destroy()
            elif child.type().name() == 'deform':
                child.destroy()
            elif child.type().name() == 'channel':
                child.destroy()
            elif child.type().name() == 'capture':
                child.setGenericFlag(hou.nodeFlag.Lock, False) 
            elif child.type().name() == 'captureoverride':
                overMerge.setNextInput(child)
        
        deform = charGeo.createNode('deform', 'deform')
        deform.setFirstInput(overMerge)
        cswitch.setFirstInput(deform)
        cswitch.setNextInput(cscale)
        
        cswitch.setDisplayFlag(True)
        cswitch.setRenderFlag(True)
        
        charGeo.layoutChildren()

        hdaNode = fbxNode.createDigitalAsset(this.parm('asset_name').eval(), this.parm('hda_location').eval(), this.parm('desc').eval())
        hdaDef = hdaNode.type().definition()
        hdaOptions = hdaDef.options()
        hdaDef.save(hdaDef.libraryFilePath(), hdaNode, hdaOptions)
Ejemplo n.º 14
0
def create_tmp_geoms(mantra):
    """
    Create tmp geoms.
    We use this method when we render objects which are
    just part of the geometry (prim groups).
    For HRST group we create a OBJ node for it.
    """
    objects = mantra.objects
    merge_dict = {}

    for obj in objects:
        if not obj.obj_path == obj.HRST_path:
            tmp_subnet = hou.node(TMP_OBJ_SUBNET_PATH)
            if not tmp_subnet:
                tmp_subnet = hou.node('/obj/').createNode('subnet', TMP_OBJ_SUBNET_PATH.split('/')[-1])
            tmp_subnet.hide(True)
            tmp_subnet.setDisplayFlag(False)

            #Create Object Node
            objNode = tmp_subnet.node(obj.merge_SOP_name)
            if not objNode:
                # We have to copy all the object level settings to our new temp object
                objNode = hou.copyNodesTo( [ hou.node(obj.HRST_path) ], hou.node(TMP_OBJ_SUBNET_PATH) )[0]
                objNode.setName(obj.merge_SOP_name)
                for c in objNode.children(): c.destroy()

            #Create Object Merge SOP
            object_merge_SOP = objNode.node(obj.merge_SOP_name)
            if not object_merge_SOP:
                object_merge_SOP = objNode.createNode('object_merge', obj.merge_SOP_name)

            #Get the group name we want
            prim_group = obj.prim_group.split('_primGroups_')[-1] if obj.prim_group.startswith('_primGroups_') else obj.prim_group

            #Create a useful dictionary so we can put settings on the object_merge SOP easier.
            if not merge_dict.has_key(obj.merge_SOP_name):
                merge_dict[obj.merge_SOP_name] = {}
            if not merge_dict[obj.merge_SOP_name].has_key(obj.HRST_path):
                merge_dict[obj.merge_SOP_name][obj.HRST_path] = []

            merge_dict[obj.merge_SOP_name][obj.HRST_path].append(prim_group)

    #Set objects and groups
    for obj_name in merge_dict:
        for index, HRST_path in enumerate(merge_dict[obj_name]):
            object_merge_SOP = hou.node("{0}/{1}/{2}".format(TMP_OBJ_SUBNET_PATH, obj_name, obj_name))
            object_merge_SOP.parm('numobj').set(len(merge_dict[obj_name]))
            object_merge_SOP.parm('xformtype').set(1)
            object_merge_SOP.setRenderFlag(1)

            object_merge_SOP.parm('objpath{0}'.format(index+1)).set(HRST_path)

            for group in merge_dict[obj_name][HRST_path]:
                group = '{0} {1} '.format(object_merge_SOP.parm('group{0}'.format(index+1)).eval(), group)
                object_merge_SOP.parm('group{0}'.format(index+1)).set(group)

    #Unselect all temp nodes
    try:
        for node in hou.selectedNodes():
            node.setSelected(False)
    except:
        pass
Ejemplo n.º 15
0
def create_tmp_geoms(mantra):
    """
    Create tmp geoms.
    We use this method when we render objects which are
    just part of the geometry (prim groups).
    For HRST group we create a OBJ node for it.
    """
    objects = mantra.objects
    merge_dict = {}

    for obj in objects:
        if not obj.obj_path == obj.HRST_path:
            tmp_subnet = hou.node(TMP_OBJ_SUBNET_PATH)
            if not tmp_subnet:
                tmp_subnet = hou.node('/obj/').createNode(
                    'subnet',
                    TMP_OBJ_SUBNET_PATH.split('/')[-1])
            tmp_subnet.hide(True)
            tmp_subnet.setDisplayFlag(False)

            #Create Object Node
            objNode = tmp_subnet.node(obj.merge_SOP_name)
            if not objNode:
                # We have to copy all the object level settings to our new temp object
                objNode = hou.copyNodesTo([hou.node(obj.HRST_path)],
                                          hou.node(TMP_OBJ_SUBNET_PATH))[0]
                objNode.setName(obj.merge_SOP_name)
                for c in objNode.children():
                    c.destroy()

            #Create Object Merge SOP
            object_merge_SOP = objNode.node(obj.merge_SOP_name)
            if not object_merge_SOP:
                object_merge_SOP = objNode.createNode('object_merge',
                                                      obj.merge_SOP_name)

            #Get the group name we want
            prim_group = obj.prim_group.split(
                '_primGroups_')[-1] if obj.prim_group.startswith(
                    '_primGroups_') else obj.prim_group

            #Create a useful dictionary so we can put settings on the object_merge SOP easier.
            if not merge_dict.has_key(obj.merge_SOP_name):
                merge_dict[obj.merge_SOP_name] = {}
            if not merge_dict[obj.merge_SOP_name].has_key(obj.HRST_path):
                merge_dict[obj.merge_SOP_name][obj.HRST_path] = []

            merge_dict[obj.merge_SOP_name][obj.HRST_path].append(prim_group)

    #Set objects and groups
    for obj_name in merge_dict:
        for index, HRST_path in enumerate(merge_dict[obj_name]):
            object_merge_SOP = hou.node("{0}/{1}/{2}".format(
                TMP_OBJ_SUBNET_PATH, obj_name, obj_name))
            object_merge_SOP.parm('numobj').set(len(merge_dict[obj_name]))
            object_merge_SOP.parm('xformtype').set(1)
            object_merge_SOP.setRenderFlag(1)

            object_merge_SOP.parm('objpath{0}'.format(index +
                                                      1)).set(HRST_path)

            for group in merge_dict[obj_name][HRST_path]:
                group = '{0} {1} '.format(
                    object_merge_SOP.parm('group{0}'.format(index + 1)).eval(),
                    group)
                object_merge_SOP.parm('group{0}'.format(index + 1)).set(group)

    #Unselect all temp nodes
    try:
        for node in hou.selectedNodes():
            node.setSelected(False)
    except:
        pass
Ejemplo n.º 16
0
def convertV1_to_V2(nodes):

    for node in nodes:

        if node.type().name() == "byu_geo":
            node = node.parent().createNode(node.parm("asset_name").evalAsString() + "_main")

        geometry = next((child for child in node.children() if child.type().name() == "geo"), None)
        shopnet = next((child for child in node.children() if child.type().name() == "shopnet"), None)

        print geometry
        # If there's not a geometry network inside that has the same name as the operator,
        # then it's probably not an old BYU asset that we know how to deal with, so skip it.

        if not geometry or not shopnet or geometry.name() not in node.type().name() or geometry.name() not in shopnet.name():
            continue

        root = geometry.node("hide_geo")
        print root
        if not root:
            continue

        checkout.checkout_asset_go(node)

        parent = node.parent()
        output = geometry.displayNode()

        # Find descendants of the root node, these are the old components
        descendants = []
        stack = []
        stack.append(root)
        while len(stack) > 0:
            ancestor = stack.pop()
            descendants.append(ancestor)
            for output in ancestor.outputs():
                stack.append(output)




        # Tab in a V2 Dynamic Content Subnet
        asset_name = geometry.name()

        new_node=None
        new_node = tab_in(parent, asset_name, excluded_departments=[Department.MODIFY, Department.MATERIAL])

        # Copy old components into a modify node
        modify_node = create_hda(asset_name, Department.MODIFY, already_tabbed_in_node=new_node)

        display_out=modify_node.displayNode()
        copied_nodes=hou.copyNodesTo(descendants, modify_node)

        ## TODO: PARSE THROUGH NODES AND CONNECT TO OUTPUT


        hide_geo=None
        descend_out=None
        mat_node=None

        for copied_node in copied_nodes:
            if 'switch' in copied_node.type().name():
                hide_geo=copied_node
            elif 'material' == copied_node.type().name():
                mat_node=copied_node
            elif 'output' == copied_node.type().name():
                descend_out=copied_node
            elif 'null' == copied_node.type().name() and 'OUT' in copied_node.name():
                descend_out=copied_node



        hide_geo.setInput(0,modify_node.indirectInputs()[0])
        display_out.setInput(0,descend_out)



        display_out.setDisplayFlag(True)
        display_out.setRenderFlag(True)

        display_out.setInput(0,descend_out)
        modify_node.layoutChildren()

        descend_out.destroy()
        hide_geo.destroy()
        mat_node.destroy()




        # Copy old components into a material node
        material_node = create_hda(asset_name, Department.MATERIAL, already_tabbed_in_node=new_node)
        hou.copyNodesTo(shopnet.children(), material_node.node("shopnet/shaders"))

        # Do material assignment as much as possible
        # TODO: riley

        material= geometry.node("material1")
        num_groups=material.evalParm('num_materials')

        #map of material to string of group mask
        info={}

        for i in range(1,num_groups+1):
            group=material.evalParm('group'+str(i))
            mat=material.evalParm('shop_materialpath'+str(i))

            mat='../shopnet/shaders/'+'/'.join(mat.split('/')[-2:])

            if mat in info:
                info[mat]+=' '+group
            else:
                info[mat]=group


        mat_assign=material_node.node('material_assign')
        mat_assign.parm('num_materials').set(len(info))


        #transfer material assignments
        for i,key in enumerate(info):
            mat_assign.parm('group'+str(i+1)).set(info[key])
            mat_assign.parm('material_options'+str(i+1)).set(1)
            mat_assign.parm('mat_option'+str(i+1)+'_1').set(key)



        # Name the nodes
        node.setName(asset_name + "_old")
        new_node.setName(asset_name + "_new")

        # Put them both into a network box, so we can see that they are related.
        box = parent.createNetworkBox()
        box.addItem(node)
        box.addItem(new_node)
        box.fitAroundContents()
        box.setComment(node.type().name().replace("_main", "").title())
        parent.layoutChildren()
Ejemplo n.º 17
0
import platform
import subprocess
from subprocess import Popen

num_split = 2
myFile = hou.hipFile.path()
os.chdir(hou.getenv('HIP'))

orgNodes = hou.selectedNodes()
rops = []
if (len(orgNodes)==1):
    orgNode = orgNodes[0]
    startFrame = orgNode.parm('f1').eval()
    #print(startFrame)
    for i in range(num_split):
        hou.copyNodesTo(orgNodes,hou.node('/out/'))
        copiedNode = hou.selectedNodes()[0]
        
        copiedNode.parm('f1').deleteAllKeyframes()
        copiedNode.parm('f3').deleteAllKeyframes()
        
        copiedNode.parm('f1').set(startFrame+i)
        copiedNode.parm('f3').set(num_split)
        copiedNode.moveToGoodPosition()
        rops.append(copiedNode)
        
#print(rops)
print('saved hip file')
hou.hipFile.save()
for rop in rops:
    ropPath = rop.path() 
Ejemplo n.º 18
0
    def selectSubnet(self):
        FBX = hou.selectedNodes()[0]
        #Root Location
        OBJ = hou.node('/obj/')

        if not FBX:
            #Error no fbx sub detected.
            print("Error: No objects selected.")
        elif FBX:
            if FBX.type().name() == "subnet":
                # Create Geometry node to store FBX parts
                geometry = OBJ.createNode('geo', run_init_scripts=False)
                geometry.setName('GEO_{}'.format(FBX.name()))
                geometry.moveToGoodPosition()
                # Get all parts inside FBX container
                geometry_FBX = [
                    node for node in FBX.children()
                    if node.type().name() == 'geo'
                ]

                # Create merge node for parts
                merge = geometry.createNode('merge')
                merge.setName('master_merge')

                #Create Null Object at the end
                oNull = geometry.createNode('null')
                oNull.setName('OUT_DAZ')

                #Link MergeOut to NullIn
                oNull.setInput(0, merge)

                # Replicate FBX structure in Geometry node
                for geo in geometry_FBX:
                    # Create Object Merge node
                    objectMerge = geometry.createNode('object_merge')
                    objectMerge.setName(geo.name())

                    # Set path to FBX part object
                    objectMerge.parm('objpath1').set(geo.path())
                    objectMerge.parm('xformtype').set(1)

                    # MATERIAL HANDLING

                    # Copy Material from Geo
                    matName = hou.node("obj/" + FBX.name() + "/" + geo.name() +
                                       "/" + geo.name() + "_material")
                    if matName is not None:
                        parentH = hou.node("obj/" + geometry.name())
                        hou.copyNodesTo([matName], parentH)
                        material = hou.node("obj/" + geometry.name() + "/" +
                                            geo.name() + "_material")
                        #Call process to convert materials.
                        if self.mw.rdo_Arnold.isChecked() == True:
                            print("Converting to Arnold Materials.")
                            self.convertArnold(material)
                    else:
                        # Create Material node if none exist. No materials are added if none are detected.
                        material = geometry.createNode('material')
                        material.setName('MAT_{}'.format(geo.name()))

                    # LINK NODES

                    # Link Material to Object MergeName
                    material.setNextInput(objectMerge)
                    # Link part to Merge
                    merge.setNextInput(material)

                # Set Null Node flags to Render
                oNull.setDisplayFlag(1)
                oNull.setRenderFlag(1)

                # Layout geometry content in Network View
                geometry.layoutChildren()
            else:
                print(
                    "NON-SUBNET Node Selected. Hint:You may only select one node at a time."
                )
Ejemplo n.º 19
0
    def __init__(self, node, rig_subnet):
        print "muscle"
        self.node = node
        self.rig_subnet = rig_subnet

        self.limb_subnet = self.create_rig_node(self.rig_subnet)

        self.node_rename(self.node, self.limb_subnet)
        self.make_color(self.node)
        self.colorize_node(self.limb_subnet, self.color)
        self.position_node(self.node, self.limb_subnet)

        #todo put all this into smaller functions
        copy_self_node = hou.copyNodesTo([self.node], self.node.parent())
        copy_self_node = copy_self_node[0]

        copy_self_node.node("fetch_parent").destroy()
        copy_self_node.node("fetch_parent1").destroy()

        hou.copyNodesTo(copy_self_node.children(), self.limb_subnet)
        copy_self_node.destroy()

        # creating the nodes into variables--------------------------------------------------------------
        fetch = self.create_fetch_import(self.node.parm("hook"),
                                         self.limb_subnet)
        fetch_upper = self.create_fetch_import(self.node.parm("hook_upper"),
                                               self.limb_subnet)
        list_of_fetchers = [fetch, fetch_upper]

        self.o_position = self.limb_subnet.node("origin_position")
        self.i_position = self.limb_subnet.node("insertion_position")
        self.center_offset = self.limb_subnet.node("center_offset")
        self.muscle_node = self.limb_subnet.node("muscle")
        self.chop_muscle = self.limb_subnet.node("chopnet_muscle")
        self.jiggle_switch_node = self.chop_muscle.node("switch_jiggle_effect")
        self.jiggle_node = self.chop_muscle.node("jiggle_center_muscle")

        list_of_positioners = [self.o_position, self.i_position]

        for index, i in enumerate(list_of_positioners):
            # i.parm("keeppos").set(0)
            i.setInput(0, list_of_fetchers[index])
            # i.parm("keeppos").set(1)

        self.limb_subnet.layoutChildren()

        muscle_node = self.limb_subnet.node("muscle")
        muscle_node.parm("tdisplay").set(1)
        try:
            muscle_node_position = muscle_node.position()
            chop_node = self.limb_subnet.node("chopnet_muscle")
            chop_node.setPosition(
                [muscle_node_position[0], (muscle_node_position[1] - .5)])
        except:
            pass

        self.muscle_view()
        self.promote_parms(self.rig_subnet, ["Rig Parms", self.node.name()])
        self.promote_viz_positioners()

        gv.muscle_deformers_list.append(muscle_node)
Ejemplo n.º 20
0
    def go(self, node=None):
        self.hda = node
        environment = Environment()
        project = Project()
        hda_dir = environment.get_hda_dir()

        if self.hda is None:
            self.hda = get_selected_node()
            if self.hda is None:
                return

        node_path = self.hda.path()
        name = node_path.split('/')[-1]
        tool_name = name.lower()

        if tool_name is None:
            return

        if not self.hda.canCreateDigitalAsset():
            if self.hda.type().definition is not None:
                # we are dealing with an premade self.hda
                result = qd.yes_or_no(
                    'The selected node is already a digial asset. Would you like to copy the definition into the pipeline'
                )
                if not result:
                    return
                else:
                    copyHDA = True
            else:
                qd.error(
                    'You can\'t make a digital asset from the selected node')
                return
        else:
            copyHDA = False

        destination = os.path.join(hda_dir, tool_name + ".hda")

        operatorName = tool_name
        operatorLabel = str(project.get_name()) + '_' + str(tool_name)
        saveToLibrary = destination
        num_inputs = len(self.hda.inputs())

        if copyHDA:
            parent = self.hda.parent()
            subnet = parent.createNode('subnet')
            hda_node = subnet.createDigitalAsset(name=operatorName,
                                                 description=operatorLabel,
                                                 hda_file_name=saveToLibrary,
                                                 min_num_inputs=num_inputs)

            hou.copyNodesTo(self.hda.children(), hda_node)
            hda_nodeDef = hda_node.type().definition()
            hdaDef = self.hda.type().definition()

            #Copy over sections
            sects = hdaDef.sections()
            for sectName in sects:
                hda_nodeDef.addSection(sectName, sects[sectName].contents())

            #Copy over NodeGroups
            nodeGroups = self.hda.nodeGroups()
            for ng in nodeGroups:
                newNg = hda_node.addNodeGroup(ng.name())

                for node in ng.nodes():
                    nodePath = hda_node.path() + '/' + str(node.name())
                    newNode = hou.node(nodePath)

                    if newNode is None:
                        print('Ya that node was null that is a problem')
                        continue

                    newNg.addNode(newNode)

            # Copy over paramters
            oldParms = hdaDef.parmTemplateGroup()
            hda_nodeDef.setParmTemplateGroup(oldParms)
        else:
            try:
                hda_node = self.hda.createDigitalAsset(
                    name=operatorName,
                    description=operatorLabel,
                    hda_file_name=saveToLibrary,
                    min_num_inputs=num_inputs)
            except hou.OperationFailed, e:
                qd.error('There was a problem creating a digital asset',
                         details=str(e))
                return
Ejemplo n.º 21
0
    def ConvertJointsToBones(fbxNode):
        #print 'begin convert fbxNode', fbxNode.name()
        newNodes = []
        parentNullNodes = []
        destroyList = []
        geoList = []
        for child in fbxNode.children():
            childTypeName = child.type().name()
            if childTypeName == 'bone':
                childInputs = child.inputs()
                if childInputs is not None and len(childInputs) > 0:

                    jointParentNode = child.inputs()[0]
                    parentNullNodes.append(jointParentNode)
                    jointParentNode.parm('keeppos').set(True)
                    #jointParentName = jointParentNode.name()
                    #jointRealName = jointParentName.split('_')[-1]

                    #print child.name(), '->' , child.inputs()
                    realBoneNode = fbxNode.createNode('bone')#,'bone_'+jointRealName)
                    realBoneNode.parm('length').set(child.parm('length').eval())
                    realBoneNode.setColor(hou.Color(1,0,0))
                    #realBoneNode.setInput(0,None,0)
                    newNodes.append(realBoneNode)
                    BasicFunc.connect_node(child, realBoneNode)
                    BasicFunc.alignWorldPos(realBoneNode, jointParentNode)
                    realBoneNode.parm('keeppos').set(True)
                    BasicFunc.adjustLayout(realBoneNode)
                    child.setDisplayFlag(False)
                    destroyList.append(child)
            elif childTypeName == 'geo':
                geoList.append(child)

            elif childTypeName == 'null':
                if len(child.outputs()) == 0:
                    childInputs = child.inputs()
                    if childInputs is not None and len(childInputs)>0:
                        if JointsToBones.IsNodeJoint(childInputs[0]):
                            # this is the end joint
                            child.parm('keeppos').set(True)
                            endBone = fbxNode.createNode('bone')
                            endBone.parm('length').set(0)
                            BasicFunc.connect_node(child, endBone)
                            endBone.parm('keeppos').set(True)
                            BasicFunc.adjustLayout(endBone)
                            newNodes.append(endBone)
                            parentNullNodes.append(child)


        #BasicFunc.layoutChildren(fbxNode, newNodes, 0, 1)
        for i in range(len(newNodes)):
            mother = parentNullNodes[i]
            motherInputs = mother.inputs()
            if motherInputs is not None and len(motherInputs)>0:
                grandma = motherInputs[0]
                if grandma in parentNullNodes:
                    father = newNodes[parentNullNodes.index(grandma)]
                    BasicFunc.connect_node(father, newNodes[i])
            else:
                newNodes[i].setInput(0,None,0)
        targetNames = []
        for i in range(len(newNodes)):
            try:
                targetName = parentNullNodes[i].name()
                #parentNullNodes[i].destroy()
                if not parentNullNodes[i] in destroyList:
                    destroyList.append(parentNullNodes[i])
                targetNames.append(targetName)
                # newNodes[i].setName(targetName)
            except:
                print 'exception on:', newNodes[i]
        for dn in destroyList:
            dn.destroy()
        for i in range(len(newNodes)):
            newNodes[i].setName(targetNames[i],True)

        for geoNode in geoList:
            # find bone capture node
            currentRenderNode = geoNode.renderNode()
            captureNode = None
            for insideNode in geoNode.children():
                # print insideNode
                if insideNode.type().name() == 'capture':
                    captureNode = insideNode
                    break
            if captureNode:
                print 'capture node:', captureNode
                cpNode = hou.copyNodesTo((captureNode,), geoNode)[0]
                cpNode.setHardLocked(False)
                attrCopyNode = geoNode.createNode('attribcopy')
                BasicFunc.connect_node(cpNode, attrCopyNode,0,0)
                BasicFunc.connect_node(captureNode, attrCopyNode,0,1)
                attrCopyNode.parm('attribname').set('*')
                BasicFunc.connect_node(attrCopyNode, currentRenderNode)
Ejemplo n.º 22
0
def make_compatible_fbx_hierarchy(character_subnet):
    character_subnet_children = character_subnet.children()
    nulls = utl.nodetypes_in_list(character_subnet_children, "null")
    geos = utl.nodetypes_in_list(character_subnet_children, "geo")
    target_nulls = []
    bones = []
    bone_name_map = {}
    old_to_new_map = {}

    # lock the current mesh deformation
    for geo in geos:
        geo.displayNode().setHardLocked(True)
        utl.nodetype_in_list(geo.children(),
                             "captureoverride").setHardLocked(True)

    # move cregion sops into bones, break the rig (temporarily)
    # writes bone-null correspondance for further bone weight transfer
    for null in nulls:
        cregion = utl.nodetype_in_list(null.children(), "cregion")
        if cregion:
            children = []
            for child in null.outputConnections():
                children.append(child.outputNode())
            children = utl.nodetypes_in_list(children, "bone")

            if len(children) > 1:
                # this is for gathering nulls which have multple bone children
                # later on those bones will get a separate parent null
                # to move the pretransform from the bone
                target_nulls.append(null)
                bones.extend(children)

            for child_bone in children:
                capt = hou.copyNodesTo([cregion], child_bone)[0]
                child_bone.displayNode().setInput(2, capt)
                bone_name_map[child_bone.name()] = null.name()
            old_to_new_map[null.name()] = children
            cregion.destroy()

    # for each bone with non-unique parent add control null
    for bone in bones:
        ctrl_null = bone.parent().createNode("null", bone.name() + "_ctrl")
        ctrl_null.setPosition(bone.position())
        ctrl_null.move([0, 1])
        ctrl_null.setNextInput(bone)
        ctrl_null.parm("keeppos").set(True)
        ctrl_null.setInput(0, None)
        bone.setPreTransform(hou.Matrix4(1))
        ctrl_null.setNextInput(bone.inputConnections()[0].inputNode())
        bone.setInput(0, ctrl_null)
        ctrl_null.parm("keeppos").set(False)
        ctrl_null.setDisplayFlag(False)

    # remove pre-transform from bones and move them to the parent nulls
    bones = utl.nodetypes_in_list(character_subnet_children, "bone")
    for bone in bones:
        world_transform = bone.worldTransform()
        bone.setPreTransform(hou.Matrix4(1))
        bone.inputConnections()[0].inputNode().setWorldTransform(
            world_transform)

    def ordered_bone_names_list(unpacked_attribs_node):
        # get capture paths
        attrib_vals = unpacked_attribs_node.geometry().stringListAttribValue(
            "boneCapture_pCaptPath")
        bone_names = []
        for value in attrib_vals:
            name_parts = value.split("/")
            bone_name = ""
            for x in range(len(name_parts) - 1):
                bone_name += name_parts[x] + "/"
            bone_names.append(bone_name[:-1])
        return bone_names

    # re-capture with the new bones
    for geo in geos:
        capture_source_frozen = utl.nodetype_in_list(geo.children(), "capture")
        bc_names = capture_source_frozen.parm("extraregions").eval().split(" ")

        for x in range(len(bc_names)):
            bc_names[x] = bc_names[x].replace("../../", "")
            bc_names[x] = bc_names[x].replace("/cregion", "")

        capture_source = utl.nodetype_in_list(geo.children(),
                                              "captureoverride")
        unpacked_source = geo.createNode("captureattribunpack",
                                         "unpacked_source")
        unpacked_source.setNextInput(capture_source)
        source_bone_names_ordered = ordered_bone_names_list(unpacked_source)
        bones_parm_list = []
        for source_bone_name in source_bone_names_ordered:
            #if source_bone_name:
            bones_parm_list.extend(old_to_new_map[source_bone_name])

        capture = utl.append_sop_node(geo, "capture")
        parm_val = ""
        for bone in bones_parm_list:
            parm_val += "../../" + bone.name() + "/cregion "
        capture.parm("extraregions").set(parm_val)
        capture.setParms({"extraregions": parm_val})

        unpacked_dst = utl.append_sop_node(geo, "captureattribunpack",
                                           "unpacked_source")
        dst_bone_names_ordered = ordered_bone_names_list(unpacked_dst)

        snippet = ""
        for idx, point in enumerate(unpacked_dst.geometry().points()):

            indices = []
            data = []

            unpacked_source_point = unpacked_source.geometry().iterPoints(
            )[idx]
            source_indices = unpacked_source_point.intListAttribValue(
                "boneCapture_index")
            source_data = unpacked_source_point.floatListAttribValue(
                "boneCapture_data")
            for x in range(len(source_data)):
                weight = source_data[x]
                target_bone = source_bone_names_ordered[source_indices[x]]
                new_bones = old_to_new_map[target_bone]
                for new_bone in new_bones:
                    new_bone_name = new_bone.name()
                    new_bone_list_id = dst_bone_names_ordered.index(
                        new_bone_name)
                    indices.append(new_bone_list_id)
                    data.append(weight)

            data_str = ""
            idx_str = ""
            for idx, d in enumerate(data):
                data_str += str(d) + ","
                idx_str += str(indices[idx]) + ","

            data_str = "array(" + data_str[:-1] + ")"
            idx_str = "array(" + idx_str[:-1] + ")"
            snippet += 'setpointattrib(geoself(), "boneCapture_data", ' + str(
                point.number()) + ", float[](" + data_str + "));"
            snippet += 'setpointattrib(geoself(), "boneCapture_index", ' + str(
                point.number()) + ", int[](" + idx_str + "));"

        attribwrangle = utl.append_sop_node(geo, "attribwrangle")
        attribwrangle.setNextInput(unpacked_dst)
        attribwrangle.setParms({"class": 0, "snippet": snippet})

        utl.append_sop_node(geo, "captureattribpack")
        utl.append_sop_node(geo, "deform")
        unpacked_source.destroy()
Ejemplo n.º 23
0
def convertSubnet(node, ignoreUnlock=0, Only_FeEHDA=1, ignore_SideFX_HDA=1):
    nodeType = node.type()

    if nodeType.name() == 'subnet':
        convertSubnet_recurseSubChild(node, node, '', ignoreUnlock,
                                      Only_FeEHDA, ignore_SideFX_HDA)

    definition = nodeType.definition()
    if definition is None:
        return

    if ignoreUnlock and not node.matchesCurrentDefinition():
        #print(node)
        convertSubnet_recurseSubChild(node, node, '', ignoreUnlock,
                                      Only_FeEHDA)
        return

    if ignore_SideFX_HDA:
        defaultLibPath = hou.getenv('HFS') + r'/houdini/otls/'
        if definition.libraryFilePath().startswith(defaultLibPath):
            convertSubnet_recurseSubChild(node, node, '', ignoreUnlock,
                                          Only_FeEHDA)
            return

    node.allowEditingOfContents()

    parent = node.parent()
    #print(parent.childTypeCategory().name())
    if parent.childTypeCategory().name() != 'Sop':
        raise ('error')
    if node.isHardLocked():
        raise ('isHardLocked')
    if node.isSoftLocked():
        raise ('isSoftLocked')

    displayFlag = node == parent.displayNode()
    renderFlag = node == parent.renderNode()
    bypass = node.isBypassed()
    isTemplateFlagSet = node.isTemplateFlagSet()
    isHighlightFlagSet = node.isHighlightFlagSet()
    isSelectableTemplateFlagSet = node.isSelectableTemplateFlagSet()
    isUnloadFlagSet = node.isUnloadFlagSet()

    inputConnectors = node.inputConnectors()
    nInputs = len(inputConnectors)

    if nInputs > 4:
        shiftVector2 = hou.Vector2(0.0, -1.0)
        nulls = []
        for idx in range(4, nInputs):  #算出nulls列表的所有元素,后面有用
            if len(inputConnectors[idx]) == 0:
                nulls.append(None)  #没有连
                continue
            inputConnection = inputConnectors[idx][0]
            #inputItem = inputConnection.inputItem()

            subnetIndirectInput = inputConnection.subnetIndirectInput()
            if subnetIndirectInput is None:
                nulls.append(inputConnection.inputNode())
            else:
                null = None
                for outputConnection in subnetIndirectInput.outputConnections(
                ):
                    outputNode = outputConnection.outputNode()
                    if outputNode.type().name() == 'null':
                        if outputNode.parm('copyinput').evalAsInt() == 1:
                            null = outputNode
                            nulls.append(null)
                            break

                if null is None:
                    if 1:
                        null = subnetIndirectInput.createOutputNode(
                            'null', exact_type_name=True)
                    else:
                        null = parent.createNode('null', exact_type_name=True)
                        null.setInput(0, subnetIndirectInput, output_index=0)
                    # null.setPosition(subnetIndirectInput.position().__add__(shiftVector2))
                    null.setPosition(subnetIndirectInput.position() +
                                     shiftVector2)
                    nulls.append(null)

        indirectInputs = node.indirectInputs()
        for idx in range(4, nInputs):
            if nulls[idx - 4] is None:  #没有连
                continue
            objectMerge = node.createNode('object_merge', exact_type_name=True)
            objectMerge.parm('objpath1').set('../../' + nulls[idx - 4].name())
            objectMerge.setPosition(indirectInputs[idx].position())
            for outputConnection in indirectInputs[idx].outputConnections():
                outputNode = outputConnection.outputNode()
                outputNode.setInput(outputConnection.inputIndex(), objectMerge)

    #origNodeshape = node.userData('nodeshape')

    copyOrigNode = hou.copyNodesTo([node], parent)[0]
    newNode = node.changeNodeType('subnet', keep_parms=False)
    newNode.removeSpareParms()
    # newNode.parm('label1').hide(True)
    # newNode.parm('label2').hide(True)
    # newNode.parm('label3').hide(True)
    # newNode.parm('label4').hide(True)

    copyParms_NodetoNode(copyOrigNode, newNode)

    #if origNodeshape is not None:
    #这个是自动的啦
    #pass
    #newNode.setUserData('nodeshape', origNodeshape)

    newNodeParmTemplateGroup = newNode.parmTemplateGroup()
    # folder = newNodeParmTemplateGroup.findFolder('Standard')
    # folder.endsTabGroup()
    #print(folder)
    #newNodeParmTemplateGroup.hideFolder('Standard', True)
    #newNode.setParmTemplateGroup(newNodeParmTemplateGroup, rename_conflicting_parms=False)

    #newNode.removeSpareParmFolder(('Standard', ))
    #newNode.removeSpareParmTuple(newNode.parmTuple('Standard'))

    newNode.setDisplayFlag(displayFlag)
    newNode.setRenderFlag(renderFlag)
    newNode.bypass(bypass)
    newNode.setTemplateFlag(isTemplateFlagSet)
    newNode.setHighlightFlag(isHighlightFlagSet)
    newNode.setSelectableTemplateFlag(isSelectableTemplateFlagSet)
    newNode.setUnloadFlag(isUnloadFlagSet)

    copyOrigNode.destroy()

    convertSubnet_recurseSubChild(newNode, newNode, '', ignoreUnlock,
                                  Only_FeEHDA, ignore_SideFX_HDA)
Ejemplo n.º 24
0
def bakeObjectToWorld(startFrame, endFrame):
    selectedNode=hou.selectedNodes()
    selectedNodeName=selectedNode[0].name()
    parent=selectedNode[0].parent()
    bakeNode=hou.copyNodesTo(selectedNode,parent)
    bakeNode[0].setName(selectedNodeName + "_bake")
    bakeNode[0].parm("keeppos").set(0)
    fetchNode=hou.node(parent.path()).createNode("fetch","fetch_"+selectedNodeName)
    hou.node(fetchNode.path()).parm("fetchobjpath").set(selectedNode[0].path())
    hou.node(fetchNode.path()).parm("useinputoffetched").set(1)
    nullNode=hou.node(parent.path()).createNode("null")
    nullNode.setFirstInput(fetchNode)
    nullNodeName=nullNode.name()
    
    
    parms=["tx","ty","tz","rx","ry","rz"]
    constant=["TX","TY","TZ","RX","RY","RZ"]
    
    
    bakeNode[0].setInput(0,None)
    
    #delete expresssion in parms and set to 0
    for p in parms:
      bakeNode[0].parm(p).deleteAllKeyframes()
      hou.hscript('objextractpretransform '+ bakeNode[0].path())
      bakeNode[0].parm(p).set(0)
    
    
    
    for p, c in zip(parms, constant):
        #bakeNode[0].parm(p).deleteAllKeyframes()
        hou.node(bakeNode[0].path()).parm(p).setExpression('origin("","../'+nullNodeName+'",'+c+')')
    
    
    
    #add dict for hou.Keyframe and values    
    key = dict([(x, hou.Keyframe()) for x in parms])
    values = dict([(x, []) for x in constant])
          
    #bake time range
    timeRange = xrange(startFrame,endFrame+1)
    
    
    #fill values dict
    for t in timeRange:
        hou.setFrame(t)
        for v, p in zip(constant,parms):
	    values[v].append(bakeNode[0].parm(p).eval())
	    
    
    for p in parms:
      bakeNode[0].parm(p).deleteAllKeyframes()
      bakeNode[0].parm(p).set(0)
    
    #set key by keyframes
    
    for t in timeRange:
	hou.setFrame(t)
	for v, p, k in zip(constant,parms,key):
	  key[k].setValue(values[v][t-startFrame])
	  bakeNode[0].parm(p).setKeyframe(key[k])
    
    fetchNode.destroy()
    nullNode.destroy()
Ejemplo n.º 25
0
# 09
materiallibrary2 = materiallibrary.copyTo(stage)
materiallibrary2.parm("geopath1").set("/soccerball_sim/piece*")
materiallibrary2.setInput(0,rendergeometrysettings)

# 10
domelight = hou.node("/stage/camera2")
domelight.setSelected(True,True)
node = domelight.outputs()
while(len(node) > 0):
    node = node[0]
    node.setSelected(True)
    node = node.outputs()
    
copyNodes = hou.copyNodesTo(hou.selectedNodes(), stage)

# 11
camera = copyNodes[0]
camera.setInput(0,materiallibrary2)
karma = copyNodes[-1]
karma.parm("camera").set(camera.parm("primpath").eval())
karma.parm("picture").set("$HIP/render/soccerbal_sim_$F.exr")
karma.setDisplayFlag(True)
karma.parm("execute").pressButton()


# 全ノードをいい位置に移動
for node in hou.node("/").allSubChildren():
    node.moveToGoodPosition()
    def results(self, value):
        self.asset_name = value[0]

        body = Project().get_asset(self.asset_name)
        if not body:
            body = self.project.create_asset(self.asset_name)
        if not body:
            qd.error("Something broke :'(")
            return
        self.element = body.get_element(Asset.MATERIALS)

        self.path = os.path.join(self.element._filepath, "temp.usda")

        selection = hou.selectedNodes()
        if len(selection) != 1:
            qd.error("Please select only the material node and try again.")
            return
        shader = selection[0]
        if shader.type().name == "materiallibrary":
            qd.error(
                "Changes have been made to this publishing tool. Now you must select the material node itself, NOT the material library, to publish it. Please try again."
            )
            return

        #check where we are and move shader node accordingly
        deleteLib = False
        path = shader.path()
        first = path.split("/")[1]
        if first != "stage":
            lib = hou.node("/stage").createNode("materiallibrary")
            deleteLib = True
            shader = hou.copyNodesTo([shader], lib)[0]
        else:
            lib = shader.parent()

        lib.setInput(0, None)
        lib.parm("matpath1").set(value[0])

        #create and save material hda
        if shader.canCreateDigitalAsset():
            hdaPath = os.path.join(self.element._filepath,
                                   self.asset_name + "_main.hda")
            shader = shader.createDigitalAsset(name=re.sub(
                r'\W+', '', self.asset_name),
                                               description=self.asset_name,
                                               hda_file_name=hdaPath,
                                               min_num_inputs=0,
                                               max_num_inputs=0)
            shaderDef = shader.type().definition()
            shaderOptions = shaderDef.options()
            shaderOptions.setUnlockNewInstances(True)
            shaderOptions.setSaveInitialParmsAndContents(True)
            shaderDef.setOptions(shaderOptions)
            shaderDef.save(hdaPath, shader, shaderOptions)
        elif shader.type().name() == re.sub(r'\W+', '', self.asset_name):
            shader.type().definition().updateFromNode(shader)
            shader.type().definition().save(
                shader.type().definition().libraryFilePath())
        else:
            qd.error("Error creating/saving hda. Continuing to save USDA...")

        shader.setName(value[0])

        rop = hou.node("/stage").createNode("usd_rop")
        rop.setInput(0, lib)
        rop.parm("lopoutput").set(self.path)
        rop.parm("enableoutputprocessor_simplerelativepaths").set(0)
        rop.parm("execute").pressButton()

        rop.destroy()
        if deleteLib:
            lib.destroy()

        publishes = self.element.list_publishes()
        publishes_string_list = ""
        for publish in publishes:
            label = publish[0] + " " + publish[1] + " " + publish[2] + "\n"
            publishes_string_list += label

        self.input = qd.HoudiniInput(parent=hou.qt.mainWindow(),
                                     title="Comment ",
                                     info=publishes_string_list)
        self.input.submitted.connect(self.comment_results)
Ejemplo n.º 27
0
import hou, os
sel = hou.selectedNodes()
if sel:
    for s in sel:
        out = s.parent().createNode('geo', run_init_scripts=0)
        out.moveToGoodPosition()
        new_shop = out.createNode('shopnet', 'SHADERS')

        geo = [x for x in s.children() if x.type().name() == 'geo']
        old_shop = hou.node(s.path() + '/materials')
        hou.copyNodesTo(old_shop.children(), new_shop)

        m = out.createNode('merge')
        delete = []
        delete.append(m)

        material_dict = {}
        for g in geo:
            material = g.parm('shop_materialpath').eval()
            if material != '':
                material = material.split('/')[-1]
                material_dict[g.name()] = material
            else:
                mat_nodes = [
                    x for x in g.children() if x.type().name() == 'material'
                ]
                for i in mat_nodes:
                    num_materials = i.parm('num_materials').eval()
                    num = 0
                    while num < num_materials:
                        num += 1
Ejemplo n.º 28
0
def idConvertROP(node):
    new = hou.copyNodesTo((node, ), hou.node("/out"))[0]
    oldName = node.name()
    oldPos = node.position()
    #new.moveToGoodPosition()
    oldPos += hou.Vector2((1, 1))
    new.setPosition(oldPos)
    new.setName(oldName + "_id", unique_name=True)
    new.setColor(hou.Color((0, .2, .8)))

    # disable params
    planes = new.parm("vm_numaux")
    planes.revertToDefaults()
    planes = new.parmsInFolder(("Images", "Extra Image Planes"))
    for plane in planes:
        if "quick" in plane.name():
            plane.revertToDefaults()

    idParms = {
        "vm_exportcomponents": "",
        "sololight": "",
        "alights": "",
        "forcelights": "",
        "excludelights": "",
        "vm_reflectlimit": "",
        "vm_reflectlimit": 0,
        "vm_refractlimit": 0,
        "vm_diffuselimit": 0,
        "vm_volumelimit": 0,
        "vm_maxraysamples": 1,
        "vm_subpixel": 1
    }
    new.setParms(idParms)

    # add Prim_Id and Obj_Id planes
    planes = new.parm("vm_numaux")
    planes.insertMultiParmInstance(0)
    planes.insertMultiParmInstance(0)

    idPlanes = {
        "vm_variable_plane1": "Op_Id",
        "vm_vextype_plane1": "float",
        "vm_quantize_plane1": "float",
        "vm_variable_plane2": "Prim_Id",
        "vm_vextype_plane2": "float",
        "vm_quantize_plane2": "float"
    }
    new.setParms(idPlanes)

    # add deep params, enable deep output
    cmd = "opproperty -f " + new.path() + " mantra* *dcm*"
    #hou.hscript(cmd)

    deepSettings = {
        "vm_deepresolver": "camera",
        "vm_dcmpzstorage": "real16",
        "vm_dcmzbias": 0.00025,
        "vm_dcmofsize": "1"
    }
    #new.setParms(deepSettings)

    # set image and deep paths
    #deepFile = new.parm("vm_dcmfilename")
    flatFile = new.parm("vm_picture")
    ifdFile = new.parm("soho_diskfile")
    oldPath = node.path()
    #deepFile.setExpression("hou.session.hpipe.idPath(hou.node(\"" + oldPath + "\"), \"deep\")", language=hou.exprLanguage.Python)
    flatFile.setExpression("hou.session.hpipe.idPath(hou.node(\"" + oldPath +
                           "\"), \"id\")",
                           language=hou.exprLanguage.Python)
    ifdFile.setExpression("hou.session.hpipe.idPath(hou.node(\"" + oldPath +
                          "\"), \"id\", src=\"ifd\" )",
                          language=hou.exprLanguage.Python)
Ejemplo n.º 29
0
    def create_hda(self, value):
        tool_name = create_window.result

        if tool_name is None:
            return

        if not self.hda.canCreateDigitalAsset():
            if self.hda.type().definition is not None:
                # we are dealing with an premade self.hda
                result = qd.yes_or_no(
                    'The selected node is already a digial asset. Would you like to copy the definition into the pipeline'
                )
                if not result:
                    return
                copyHDA = True
            else:
                qd.error(
                    'You can\'t make a digital asset from the selected node')
                return
        else:
            copyHDA = False

        project = Project()
        environment = Environment()
        username = project.get_current_username()
        tool = project.get_tool(tool_name)
        hda_element = tool.get_element(Department.HDA)

        checkout_file = hda_element.checkout(username)

        operatorName = hda_element.get_short_name()
        operatorLabel = (project.get_name() + ' ' + tool.get_name()).title()
        saveToLibrary = checkout_file

        num_inputs = len(self.hda.inputs())

        if copyHDA:
            parent = self.hda.parent()

            subnet = parent.createNode('subnet')

            hda_node = subnet.createDigitalAsset(name=operatorName,
                                                 description=operatorLabel,
                                                 hda_file_name=saveToLibrary,
                                                 min_num_inputs=num_inputs)

            hou.copyNodesTo(self.hda.children(), hda_node)
            hda_nodeDef = hda_node.type().definition()
            hdaDef = self.hda.type().definition()

            #Copy over sections
            sects = hdaDef.sections()
            for sectName in sects:
                print 'Copying over section: ' + str(sectName)
                hda_nodeDef.addSection(sectName, sects[sectName].contents())

            #Copy over NodeGroups
            nodeGroups = self.hda.nodeGroups()
            for ng in nodeGroups:
                newNg = hda_node.addNodeGroup(ng.name())
                print 'New group: ' + str(newNg)
                for node in ng.nodes():
                    nodePath = hda_node.path() + '/' + str(node.name())
                    print 'The Node path is:' + str(nodePath)
                    newNode = hou.node(nodePath)
                    if newNode is None:
                        print('Ya that node was null that is a problem')
                        continue
                    print 'The new Node is: ' + str(newNode)
                    newNg.addNode(newNode)

            # Copy over paramters
            oldParms = hdaDef.parmTemplateGroup()
            hda_nodeDef.setParmTemplateGroup(oldParms)
        else:
            try:
                hda_node = self.hda.createDigitalAsset(
                    name=operatorName,
                    description=operatorLabel,
                    hda_file_name=saveToLibrary,
                    min_num_inputs=num_inputs)
            except hou.OperationFailed, e:
                print qd.error('There was a problem creating a digital asset',
                               details=str(e))
                return
Ejemplo n.º 30
0
    viewport.homeAll()
'''

# 02
pointsfromvolume = geo.createNode('pointsfromvolume')

pointsfromvolume.setInput(0, testgeometry_rubbertoy)
pointsfromvolume.setDisplayFlag(True)

# 03
geo_box = hou.node("/obj/box_object")
polybevel = hou.node("/obj/box_object/polybevel1")

testgeometry_rubbertoy.setSelected(True, True)
pointsfromvolume.setSelected(True)
copyNodes = hou.copyNodesTo(hou.selectedNodes(), geo_box)
geo.destroy()
geo = geo_box
testgeometry_rubbertoy = copyNodes[0]
pointsfromvolume = copyNodes[1]

# 04
polybevel.setDisplayFlag(True)

# 05
copytopoints = geo.createNode('copytopoints')
copytopoints.parm("pack").set(True)
copytopoints.setInput(0, polybevel)
copytopoints.setInput(1, pointsfromvolume)
copytopoints.setDisplayFlag(True)
Ejemplo n.º 31
0
    def megaObjDuplicate(node=None, mode="lod"):
        """
        duplicates selected node with selected LODs
        """
        if not node:
            node = hou.pwd()

        if mode == "lod":
            set_parm = "asset_lod"
            select_message = "Select LODs to be created"
            select_title = "Select LODs"
        elif mode == "asset":
            set_parm = "asset"
            select_message = "Select asset variations to be created"
            select_title = "Select variations"
        else:
            log.error("wrong mode set")
            return

        node_pos = node.position()

        mega_load_node = MegaUtils.getChildMegaLoad(node)
        if not mega_load_node:
            log.error("no mega load node found inside of this node")
            return

        editor = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor)
        orig_path = editor.pwd().path()

        my_shader_node = MegaUtils.getChildMaterialAssign(node)
        my_shader_multiparm = my_shader_node.parm("num_materials")
        my_shader_multiparms = my_shader_multiparm.multiParmInstances()

        my_matnet = MegaUtils.getChildMatnet(node)
        my_matnet_children = my_matnet.children()

        my_lods_parm = mega_load_node.parm(set_parm)
        lods = my_lods_parm.menuItems()
        my_lod = lods[my_lods_parm.eval()]
        lods = list(set(lods) - set([my_lod]))
        lods.sort()

        selected = hou.ui.selectFromList(choices=lods,
                                         message=select_message,
                                         title=select_title,
                                         clear_on_cancel=True)
        if len(selected) == 0:
            return

        lods = [lods[i] for i in selected]

        for i, lod in enumerate(lods):
            new_node = hou.copyNodesTo((node, ), node.parent())[0]
            new_node.setPosition(node_pos +
                                 hou.Vector2((1 * i + 1, -1 * i - 1)))
            mega_node_child = MegaUtils.getChildMegaLoad(new_node)

            child_lods = mega_node_child.parm(set_parm).menuItems()
            mega_node_child.parm(set_parm).set(child_lods.index(lod))
            mega_node_child.parm("reload").pressButton()
            new_node.parm("rename").pressButton()

            new_node_shader = MegaUtils.getChildMaterialAssign(new_node)
            new_node_shader_multiparm = new_node_shader.parm("num_materials")
            new_node_shader_multiparm.setFromParm(my_shader_multiparm)
            new_node_shader_multiparms = new_node_shader_multiparm.multiParmInstances(
            )
            for i, parm in enumerate(new_node_shader_multiparms):
                try:
                    if parm.parmTemplate().stringType(
                    ) == hou.stringParmType.NodeReference:
                        path = my_shader_multiparms[i].evalAsNode().path()
                        parm.set(path)
                    else:
                        parm.setFromParm(my_shader_multiparms[i])
                except AttributeError:
                    parm.setFromParm(my_shader_multiparms[i])

            new_matnet = MegaUtils.getChildMatnet(new_node)
            new_matnet_children = new_matnet.children()
            for new_matnet_child in new_matnet_children:
                new_matnet_child.destroy()
            new_matnet.copyItems(my_matnet_children)

        node.setColor(hou.Color((0, 0, 0)))

        editor.cd(orig_path)
def import_objects():            
    obj_path = ""
    obj_folder = None
    objsImported = []
    this = hou.node('.')
    
    use_mat_path = this.parm('use_mat_path')
    
    # if path is to a directory then we list everything in the directory
    # otherwise we'll create a list with one file
    is_dir = this.parm('is_dir')
    
    if(is_dir.eval() == True):   
        obj_path = this.evalParm('file_dir_path')
        obj_folder = os.listdir(obj_path)
    else:
        path_tokens = os.path.split(this.evalParm('file_dir_path'))
        obj_path = path_tokens[0] + "/"
        obj_folder = [path_tokens[1]]
    
    import_node = hou.node(this.evalParm('path_prefix')).createNode('subnet', this.evalParm('network_name'))
    mat_path = this.evalParm('mat_dir_path')
    
    # let's get the path for the instances set up
    pntsNodePath = ""
    
    processInstance = this.evalParm('enable_instances')
    unpackGeo = this.evalParm('unpack')
    
    if processInstance :
        if(this.evalParm('is_file') == False):
            pntsNodePath = this.evalParm('instance_pnts_obj')
    
    # create a scene object for copypnts style layout
    sceneNode = import_node.createNode('geo', 'scene')
    sceneNode.children()[-1].destroy() # delete the file node
    sceneNodeMerge = sceneNode.createNode('merge')
    
    # load up the objects
    for file in obj_folder:
        mmat = None
        main_node = None
        shaderNames = None
    
        if file.endswith(".abc") or file.endswith(".fbx") or file.endswith(".obj") or file.endswith(".bgeo"):
            filename = file.split('.')
    
            obj_node = import_node.createNode("geo", filename[0])
            
            obj_node.createNode("shopnet", "materials");
            
            isPntsNode = False
            
            # if the points node is a file we have to see if the node we're creating here is it
            if(processInstance):
                if(this.evalParm('is_file') == True):
                    path_tokens = os.path.split(this.evalParm('instance_pnts_file'))
                    pntsName = path_tokens[1].split('.')
                    if(pntsName[0] == obj_node.name()):
                        pntsNodePath = obj_node.path()
                        isPntsNode = True
                        obj_node.parm('vm_renderpoints').set(0) # turn off point rendering
            
            if(not isPntsNode):
                objsImported.append(obj_node)
                
            file_node = None
            
            print "Processing " + filename[0]
            
            # if the file is an abc node we'll create an alembic node instead of using the file node
            if file.endswith(".abc"):
                obj_node.node("file1").destroy()
            
                file_node = obj_node.createNode("alembic")
                file_node.parm("fileName").set(obj_path + file)
                
                # we can only do the material assignment stuff on abc files, because that's the only type of file that has paths
                xform = obj_node.createNode("xform")
                xform.setFirstInput(file_node)
                xform.parm('scale').set(this.parm('import_scale').eval())
                xform.setDisplayFlag(True)
                xform.setRenderFlag(True)
                
                geoNode = None
                if unpackGeo or isPntsNode:
                    unpack = obj_node.createNode("unpack")
                    unpack.setFirstInput(xform)
                    unpack.parm('transfer_attributes').set("path")
                    unpack.setDisplayFlag(True)
                    unpack.setRenderFlag(True)
                    geoNode = unpack
                else:
                    geoNode = xform
            
                # see if materials exist and if so load them
                matfile = mat_path + filename[0] + ".json"
                if os.path.isfile(matfile):
                    #print "Processing " + matfile
                    # Import material assignments
                    mmat = obj_node.createNode('material', 'geo_material')
                    gmat = obj_node.createNode('material', 'pgrp_material')
            
                    mmat.setFirstInput(geoNode)
                    gmat.setFirstInput(mmat)
                    shaderNames = material_assign_import(file_node.path(), mmat.path(), gmat.path(), matfile, use_mat_path)
                    gmat.setDisplayFlag(True)
                    gmat.setRenderFlag(True)            
            else:
                file_node = obj_node.node("file1")
                file_node.parm("file").set(obj_path + file)
                    
            obj_node.layoutChildren()
            
            # see if arnold materials exist and if so load them
            assfile = mat_path + filename[0] + ".ass"
            if os.path.isfile(assfile):
                #print "Processing " + assfile
                arnold_material_import(assfile, obj_node.path() + "/materials", shaderNames)
            
            hou.node(obj_node.path() + "/materials").layoutChildren()
            #print "Processed " + filename[0]
    
    # now that the objects are loaded we can actually run through creating instance nodes for them
    if processInstance:
        pntsNode = hou.node(pntsNodePath)
        
        # add our name loading and transform extract chain to the points network
        hou.copyNodesTo(hou.node(this.path() + "/pnts_node_chain").children(), pntsNode)
        hou.node(pntsNode.path() + "/attribwrangle2").setFirstInput(hou.node(pntsNode.path() + "/unpack1"))
            
        pntsNode.layoutChildren()
        
        # create the object merge used to bring in instanced points
        # for new style instances
        objMergePnts = sceneNode.createNode('object_merge', pntsNode.name())
        objMergePnts.parm('objpath1').set('../../' + pntsNode.name())
        objMergePnts.parm('xformtype').set(1) # into this object
        
        instanceObjs = []
        # loop through instance objects
        for obj in objsImported:
            obj.setDisplayFlag(False)
            
            # creates new style instances
            
            objMergeAsset = sceneNode.createNode('object_merge', obj.name())
            objMergeAsset.parm('objpath1').set('../../' + obj.name())
            objMergeAsset.parm('xformtype').set(1) # into this object
            
            pntsDelete = sceneNode.createNode("delete")
            pntsDelete.setFirstInput(objMergePnts)
            
            pntsDelete.parm('negate').set(1) # delete non selected
            pntsDelete.parm('entity').set(1) # points
            pntsDelete.parm('group').set('@name="' + obj.name() + '*"') # set group
            
            copyToPnts = sceneNode.createNode('copytopoints')
            copyToPnts.setFirstInput(objMergeAsset)
            copyToPnts.setNextInput(pntsDelete)
            sceneNodeMerge.setNextInput(copyToPnts)
                    
            # creates old style instances
            instance = import_node.createNode('instance', 'instance_' + obj.name())
            print instance.children()[-1]
            instance.children()[-1].destroy() # delete the add node
            
            instance.parm('ptinstance').set(2) # fast point instancing
            instance.parm('instancepath').set('../' + obj.name())
            
            instance_merge = instance.createNode('object_merge')
            instance_merge.parm('xformtype').set(1) # into this object
            instance_merge.parm('objpath1').set('../../' + pntsNode.name())
            
            instance_delete = instance.createNode("delete")
            instance_delete.setFirstInput(instance_merge)
            
            instance_delete.parm('negate').set(1) # delete non selected
            instance_delete.parm('entity').set(1) # points
            instance_delete.parm('group').set('@name="' + obj.name() + '*"') # set group
            instance_delete.setDisplayFlag(True)
            instance_delete.setRenderFlag(True)
            instance.layoutChildren()
            
            instanceObjs.append(instance)
        
        import_node.layoutChildren(instanceObjs)    
        instancesBox = import_node.createNetworkBox()
        instancesBox.setComment('Instances')
        for instance in instanceObjs:
            instancesBox.addNode(instance)
            instancesBox.fitAroundContents()
            
    import_node.layoutChildren()
Ejemplo n.º 33
0
                child.parm('rx').setExpression('chop("../CHOP/OUT/$OS:$CH")')
                child.parm('ry').setExpression('chop("../CHOP/OUT/$OS:$CH")')
                child.parm('rz').setExpression('chop("../CHOP/OUT/$OS:$CH")')
                child.parm('tx').setExpression('chop("../CHOP/OUT/$OS:$CH")')
                child.parm('ty').setExpression('chop("../CHOP/OUT/$OS:$CH")')
                child.parm('tz').setExpression('chop("../CHOP/OUT/$OS:$CH")')
                rigBox.addNode(child)

        if child.type().name() == 'bone':
            # add the bones to the rig net box
            rigBox.addNode(child)

        if child.type().name() == 'geo':
            if child.name() is not charGeo.name():
                # we want to convert these to a single geo pointing to a alembic
                hou.copyNodesTo(child.children(), charGeo)
                child.destroy()

    rigBox.fitAroundContents()

    # build the CHOP network
    child = selNode.createNode('chopnet', 'CHOP')

    #let's fetch the original tpose and place in in a bclip
    fetch = child.createNode('fetch')
    fetch.parm('rate').set(24)
    fetch.parm('nodepath').set('../../* ')

    bclip = fetch.clipData(True)
    fileName = hou.ui.selectFile(None, "Select tpose export location...")