Saturday, April 12, 2025

intro to usd scripting in Blender - diffuse color example

 #testing in Blender 3.6.5 on pc


#launching blender from command line - so can see print output

& "C:\Program Files\Blender Foundation\Blender 3.6\blender.exe"


#exporting a cube to usd

#first select cube in viewport

import bpy

bpy.ops.wm.usd_export(filepath="C:\\Users\\Nathaniel\\Documents\\blender_projects\\miscTesting\\usdTesting\\usdFiles\\cube_test.usda", selected_objects_only=True)



#importing a cube usd

import bpy

#bpy.ops.wm.usd_import(filepath="//usdFiles\\cube_test.usda", relative_path=True)


bpy.ops.wm.usd_import(filepath="C:\\Users\\Nathaniel\\Documents\\blender_projects\\miscTesting\\usdTesting\\usdFiles\\cube_test.usda")



#using usd api to print all prims in cube usda

from pxr import Usd


filePath = "C:\\Users\\Nathaniel\\Documents\\blender_projects\\miscTesting\\usdTesting\\usdFiles\\cube_test.usda"


stage = Usd.Stage.Open(filePath)


print([x for x in stage.Traverse()])

#[Usd.Prim(</Cube>), Usd.Prim(</Cube/Cube>), Usd.Prim(</_materials>), Usd.Prim(</_materials/Material>), Usd.Prim(</_materials/Material/Principled_BSDF>)]




#using usd api to change color of cube

import bpy

from pxr import Usd


sourceFilePath = "C:\\Users\\Nathaniel\\Documents\\blender_projects\\miscTesting\\usdTesting\\usdFiles\\cube_test.usda" 


destinationFilePath = "C:\\Users\\Nathaniel\\Documents\\blender_projects\\miscTesting\\usdTesting\\usdFiles\\cube_green_test.usda" 


stage = Usd.Stage.Open(sourceFilePath)


materialPrim = stage.GetPrimAtPath('/_materials/Material/Principled_BSDF') #got path from earlier printing of all prims in stage


print(materialPrim)

print(materialPrim.GetPropertyNames())

#['info:id', 'info:implementationSource', 'inputs:clearcoat', 'inputs:clearcoatRoughness', 'inputs:diffuseColor', 'inputs:emissiveColor', 'inputs:ior', 'inputs:metallic', 'inputs:opacity', 'inputs:roughness', 'inputs:specular', 'outputs:surface']

diffuseAttr = materialPrim.GetAttribute('inputs:diffuseColor')


print(diffuseAttr.Get())

#(0.8, 0.8, 0.8)


#set color to green

diffuseAttr.Set( (0.0, 1.0, 0.0) )


print(stage.GetRootLayer().ExportToString())


#save to different file path

stage.GetRootLayer().Export(destinationFilePath)


#in a new blender scene import the newly colored cube

import bpy

destinationFilePath = "C:\\Users\\Nathaniel\\Documents\\blender_projects\\miscTesting\\usdTesting\\usdFiles\\cube_green_test.usda" 

bpy.ops.wm.usd_import(filepath=destinationFilePath)



#inspired by Usd Tutorials in openusd dot org