graphic:python:houdini

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
graphic:python:houdini [2023/05/31 06:00] – [HDA Operation (Houdini Digital Asset)] yinggraphic:python:houdini [2024/03/22 06:37] (current) – [HDA Operation (Houdini Digital Asset)] ying
Line 119: Line 119:
 </code> </code>
   * node > definition > all info related   * node > definition > all info related
 +
 +===== Simple hda operation =====
 +
 +  * lock hda node <code python>result_node.matchCurrentDefinition()</code>
 +  * unlock hda node (same like allow edit of content)<code python>
 +if result_node.isLockedHDA():
 +    result_node.allowEditingOfContents()
 +</code>
 +  * open type property dialog of a hda node <code python>hou.ui.openTypePropertiesDialog(result_node)</code>
 +
 +===== Complex hda operation =====
 +
 +
   * node info <code python>   * node info <code python>
 # node # node
Line 172: Line 185:
     # remove action     # remove action
     # os.remove(cur_path)     # os.remove(cur_path)
 +</code>
 +
 +How create new ... HDA works?
 +
 +  - menu calls <code python>
 +import hou
 +import assettools
 +
 +node = kwargs["node"] # it get node from menu click action
 +assettools.createNewVHDAFromSubnet(node)
 +</code>
 +  - assettools.py has function createNewVHDAFromSubnet(), it basically create the dialog
 +  - dialog VHDASaveAsDialog() class show up, the Create button do the node publish
 +    - setMembersFromUI
 +    - namespace_author, namespace_branch, major_version, minor_version = self.getCorrectNamespacesAndVersion()
 +    - library_file = self.getCorrectLibraryFile()
 +    - tablabel = constructVHDALabel(self.tablabel, self.namespace_branch if self.display_branch_in_label_enable else None)
 +    - library_file_path = os.path.join(hou.text.expandString(self.library_dir), library_file)
 +    - vhda_typename = constructVHDATypeName(namespace_author, namespace_branch, self.type_name, major_version, minor_version)
 +    - continue: alert deals with lib path file contains multi- definition
 +    - new asset <code python>
 +createVHDA(node,
 +   namespace_author,
 +   namespace_branch,
 +   self.type_name,
 +   major_version,
 +   minor_version,
 +   tablabel,
 +   self.tabmenu_entry,
 +   self.library_dir,
 +   library_file)
 +</code>
 +    - version up case (a versioned copy of an existing): <code python>
 +copyToVHDAFile(node,
 +   namespace_author,
 +   namespace_branch,
 +   self.type_name,
 +   major_version,
 +   minor_version,
 +   tablabel,
 +   self.tabmenu_entry,
 +   self.library_dir,
 +   library_file)
 +</code>
 +  - details of VHDA function (from assettolls.py) <code python>
 +  def createVHDA(node, namespace_author, namespace_branch, name, major, minor, label, tabmenu, savedir, savefile=None):
 +    hda_name  = constructVHDATypeName(namespace_author, namespace_branch,name,major,minor)
 +    hda_label = label
 +    hda_filename = savefile if savefile else constructVHDAFileName(namespace_author, namespace_branch,name,major,minor)
 +    hda_savedir = savedir
 +    hda_filepath = os.path.join(hda_savedir, hda_filename) if hda_savedir != "Embedded" else "Embedded"
 +
 +    max_num_inputs = 0
 +
 +    # If there are inputs to the node, find the largest index of the input connections and use it as the max_num_inputs
 +    # This will preserve the inputs at the right indexes
 +    if len(node.inputs()) > 0:
 +        for connection in node.inputConnections():
 +            max_num_inputs = max(max_num_inputs,connection.inputIndex())
 +        max_num_inputs = max_num_inputs + 1
 +
 +    vhda_node = node.createDigitalAsset(
 +        name = hda_name,
 +        hda_file_name = hda_filepath,
 +        description = hda_label,
 +        min_num_inputs = 0,
 +        max_num_inputs = max_num_inputs,
 +        save_as_embedded = hda_savedir == "Embedded",
 +        ignore_external_references=True,
 +    )
 +
 +    vhda_node.setName(name, unique_name=True)
 +    vhda_def = vhda_node.type().definition()
 +
 +    # Update and save new HDA
 +    vhda_options = vhda_def.options()
 +    vhda_options.setSaveInitialParmsAndContents(True)
 +    #vhda_options.setSaveSpareParms(True) ####### TO-DO
 +
 +    vhda_def.setOptions(vhda_options)
 +    '''
 +    setVHDASection(vhda_def, False if namespace_author == "" else True,
 +                             False if namespace_branch == "" else True)
 +    '''
 +    setToolSubmenu(vhda_def, tabmenu)
 +
 +    vhda_def.save(hda_filepath, vhda_node, vhda_options)
 +    hou.hda.installFile(hda_filepath)
 +    hou.hda.reloadAllFiles(True)
 +  
 +</code>
 +  - copyToVHDAFile <code python>
 +def copyToVHDAFile(node, namespace_author, namespace_branch, name, major, minor, label, tabmenu, savedir, savefile=None):
 +    hda_name  = constructVHDATypeName(namespace_author, namespace_branch,name,major,minor)
 +    hda_label = label
 +    hda_filename = savefile if savefile else constructVHDAFileName(namespace_author, namespace_branch,name,major,minor)
 +    hda_savedir = savedir
 +    hda_filepath = os.path.join(hda_savedir, hda_filename) if hda_savedir != "Embedded" else "Embedded"
 +    tmp_filepath = os.path.join(hou.text.expandString("$HOUDINI_TEMP_DIR"),"tmphda.hda")
 +
 +    # Update and save new HDA
 +    vhda_def = node.type().definition()
 +    # vhda_options = vhda_def.options()
 +    # vhda_options.setSaveInitialParmsAndContents(True)
 +    # vhda_options.setSaveSpareParms(True) ####### TO-DO
 +
 +    vhda_def.save(tmp_filepath, template_node=node)
 +
 +    created_definition = hou.hda.definitionsInFile(tmp_filepath)[0]
 +    # Sets the tabmenu location only if it differs from the original
 +    if tabmenu:
 +        setToolSubmenu(created_definition, tabmenu)
 +
 +    created_definition.copyToHDAFile(hda_filepath,hda_name,hda_label)
 +
 +    os.remove(tmp_filepath)
 +    hou.hda.installFile(hda_filepath)
 +    hou.hda.reloadAllFiles(True)
 +    node.changeNodeType(hda_name)  
 </code> </code>
 ====== Tutorial ====== ====== Tutorial ======
  • graphic/python/houdini.1685512821.txt.gz
  • Last modified: 2023/05/31 06:00
  • by ying