Converting Houdini Not Commercial Files

This task was bothering me for a long time. We have educational license of Houdini in our school which works without any limitation within the school network. But often I want to reuse my asset created in school for other projects, however an attempt to do so transform my .hip file into apprentice version with all of the limitations applied.

By watching Ari Denesh tutorials ( I found a couple very useful commands.



This is an example of usage.

opscript -G -r / > F:/un/objgroups.cmd

And when load all generated .cmd back.

cmdread F:/un/groups.cmd

I didn’t test it with locked digital assets. According to documentation it won’t work.


Unpacking Houdini Files

Just stumble across this thread

It took me some time to figure it out because standard “hexpand” utility doesn’t quite work on Windows. I also fail to solve “Permission denied” error discoursed in the thread.

Finally, I just use “hcpio.exe” utility. It seems work pretty well.

Here is the command.

“C:\Program Files\Side Effects Software\Houdini 14.0.201\bin\hcpio.exe” -idI F:\Projects\test_prj_01\halway

Nuke Custom LUTs


Our post-production facility recessives DPX plates with .3dl LUT file from DaVinci Resolve. The LUTs were for two different cameras one of which is ARRI Alexa and another is RED. The task is to apply this LUTs to every dailies rendered by all artists.


First, we need to create a gizmo for each LUT which contain Vector Field Nuke node with the following expression in the “fectorfield file” field.

[getenv NUKE_LUT]/A_CAM_ArriLogC.3dl

where “getenv NUKE_LUT” will grab session environmental variable with name “NUKE_LUT” which contain path to the LUTs folder.




Now create a “” file inside you .nuke directory.

 C:\Users\User name\.nuke

The “” file should look something like this

import nuke
import os

# Path to executed file
cwd = os.path.dirname(os.path.realpath(__file__))

# Provide env variable for use in vectorfield node as a relative path
os.environ['NUKE_LUT'] = os.path.join(cwd, 'BB_LUT')

# Paths to viewer gizmos
RED_Viewer_LUT = os.path.join(cwd, 'BB_LUT', 'BB_RED_Viewer_LUT.gizmo').replace("\\", "/")
ARRI_Viewer_LUT = os.path.join(cwd, 'BB_LUT', 'BB_ARRI_Viewer_LUT.gizmo').replace("\\", "/")

# Paths to node gizmos
RED_LUT = os.path.join(cwd, 'BB_LUT', 'BB_RED_LUT.gizmo').replace("\\", "/")
ARRI_LUT = os.path.join(cwd, 'BB_LUT', 'BB_ARRI_LUT.gizmo').replace("\\", "/")

# Register custom LUTs
nuke.ViewerProcess.register("BB_ARRI_LUT", nuke.Node, (ARRI_Viewer_LUT, ""))
nuke.ViewerProcess.register("BB_RED_LUT", nuke.Node, (RED_Viewer_LUT, ""))

# Regester costome meny for creatin LUT gizmos'Nodes').addCommand( 'BB_Tools/ARRI_LUT', lambda: nuke.createNode(ARRI_LUT))'Nodes').addCommand( 'BB_Tools/RED_LUT', lambda: nuke.createNode(RED_LUT))


Beside registering gizmo for Nuke Tab menu I also register them as a custom  Nuke display LUTs.



Note how the “” script setting a ‘NUKE_LUT’ environmental variable which is hold the path pointing to the current directory plus LUT sub-directory.

After that we should be able to access that variable through the following TCL expression inside of Nuke.

getenv NUKE_LUT

Now we can copy the folder with our LUTs and gizmos within “” to any Windows or IOS machine without worrying about hard-coded path to our LUTs.


Importing Shotgun Toolkit config

By using standard command line Shotgun (SG) activation SG create project config that attached to the main “studio” configuration thus it’s not localized and not portable.

Command line based activation

By using “localize” Tank command config can be imported into single self contain folder that can be copied anywhere.

But copy of this config have no use until it hooked up with SG project. What if we want to hooked it up with the project that already has a internal studio config. In this example I brought a copy of my config home.

# Create SG instance
base_url = ""
sg = Shotgun(base_url, 'api_test', 'cf1e303b91800d89f596410f25690a41ba21d6211797d1daf')

def create_config(project, config_name, windows_path, mac_path, linux_path):

	data = {'project' : {'type':'Project','id':project_info(project)["id"]},
			'code' : config_name,
    		'windows_path': windows_path,
    		'mac_path' : mac_path,
    		'linux_path' : linux_path}

	create = sg.create("PipelineConfiguration", data)
	return create

create_config('Pipeline Research Project', 'External', 'Z:\software\shotgun\pipeline_research_project', '/Volumes/mnt', '/Volumes/mnt')


You will get permission denied error if you create “sg” object by authenticating “humanUser”. Shotgun object has to be constructed from API script.


Since the path where I want to store my project at home doesnt necessary match my studio setup we want to tell Shotgun where to look bu configure Local File Storage in SH Website Preferences.


There are couple files that need to be corrected in you duplicated config folder that it corresponds with the new Pipeline Configuration on SG website.

config/core/pipeline_configuration.yml should look something like that

{pc_id: 41, pc_name: External, project_id: 278, project_name: pipeline_research_project, published_file_entity_type: PublishedFile,
  use_shotgun_path_cache: true}



primary: {linux_path: /Volumes/mnt/projects, mac_path: /Volumes/mnt/projects, windows_path: 'Z:\projects'}
external: {linux_path: /Volumes/mnt/projects, mac_path: /Volumes/mnt/projects, windows_path: 'Z:\projects'}


I mounted “Z:” network drive to make it consistent among all external artist.