vinyvince

vinyvince

About Me

Connect

LOCATION
Not Specified

Houdini Engine

Availability

Not Specified

Recent Forum Posts

Modify a Solaris MatLib using Python ... 2025年6月13日6:10

Hello guys!😀
Im trying to build a python script, to read a SOP detail name attribute on my geo in LOP , and in my library to modify the name of my material using that extracted string. I tried with a Python LOP node or a python panel but i can't make it...
Additionnally i was also planning to interractively been able to Create additionnal materialX network if needed by my asset but so far the first step was this one.

The general idea is to bring by FBX material to USD Mat ready material assigned to the correct asset... I can't make sop import to import any material so far so i have to find another approach.

The LOP python Script look like this :

import hou
from pxr import Usd, UsdGeom

# 1. Grab the current LOP and its upstream stage
lop = hou.pwd()
upstream = lop.inputs()[0]
stage = upstream.stage()  # Read‐only; safe from recursion

if not stage:
    # No stage upstream? bail out.
    raise hou.NodeError("No USD stage found on first input!")

# 2. Build a map from the SOP prim paths to their masterasset string
master_map = {}
for prim in stage.Traverse():
    # Look for your attribute on each prim
    attr = prim.GetAttribute("masterasset")
    if attr:
        master_map[prim.GetPath()] = attr.Get()

# 3. Locate your material library and loop its child prims
mat_lib_path = "/stage/Asset_Materiallibrary1/"
mat_lib = stage.GetPrimAtPath(mat_lib_path)
if not mat_lib:
    raise hou.NodeError(f"Material library not found at {mat_lib_path}")

for child in mat_lib.GetChildren():
    old_name = child.GetName()
    # Split by last '_' to isolate suffix (e.g. 'Leaf_02', 'Trunk_01')
    if "_" not in old_name:
        continue  # nothing to do
    prefix, suffix = old_name.rsplit("_", 1)
    # Try to find matching masterasset: 
    # assume your SOP import created a prim at the same path as the material
    # (or adjust this lookup logic to suit your stage layout)
    matching_master = master_map.get(child.GetPath(), None)
    if not matching_master:
        # fallback: maybe match by prefix
        matching_master = master_map.get(prefix, None)
    if not matching_master:
        continue  # no masterasset for this material

    new_name = f"{matching_master}_{suffix}"
    if new_name != old_name:
        child.SetName(new_name, True)  # forceUnique=True

# 4. Done

While the python shelf script looks like this ....

import hou

def rename_materials_from_master():
    sel = hou.selectedNodes()
    if len(sel) != 2:
        hou.ui.displayMessage("Select exactly two LOPs:\n"
                              "1) Your ImportAttributes SOP LOP\n"
                              "2) Your Material Library LOP")
        return

    sop_lop, mat_lop = sel
    stage1 = sop_lop.stage()
    if not stage1:
        hou.ui.displayMessage("1st LOP has no stage!")
        return

    # gather masterasset attrs
    master_map = {}
    for prim in stage1.Traverse():
        a = prim.GetAttribute("masterasset")
        if a: master_map[prim.GetPath()] = a.Get()

    stage2 = mat_lop.stage()
    if not stage2:
        hou.ui.displayMessage("2nd LOP has no stage!")
        return

    # assume root prim name == LOP node name
    root_name = mat_lop.name()
    root_prim = stage2.GetPrimAtPath("/" + root_name)
    if not root_prim:
        hou.ui.displayMessage(f"No prim at /{root_name}")
        return

    renamed = 0
    for child in root_prim.GetChildren():
        old = child.GetName()
        if "_" not in old:
            continue
        prefix, suffix = old.rsplit("_", 1)
        new_prefix = master_map.get(child.GetPath(),
                                   master_map.get(prefix))
        if not new_prefix:
            continue
        new_name = f"{new_prefix}_{suffix}"
        if new_name != old:
            child.SetName(new_name, True)
            renamed += 1

    hou.ui.displayMessage(f"Renamed {renamed} materials under /{root_name}")

rename_materials_from_master()

Have you already face that need? Thanks you!

vincent*

LOP Sop modify output messup after split and merge 2025年6月5日12:27

Hello ? Might i consult your you about few USD basic things please ?

- How to correctly modify an USD asset with a SOP modify without messing the material?
If you look at my example scene here, where i for example try to flatten the leaved to test, as an output, the material assignement is messed... A split and merge just is enought to break it...

https://drive.google.com/file/d/1ks8epsd4E-j6k0dGhJ-olGglTt16_bS9/view?usp=sharing [drive.google.com]

- What will be the best way to overide a certain shading property (like changing the refracting index) of a list on incoming merged asset in Solaris LOP? Do you have an example please?

If you have one answer to this, it would be cool to hear you, cheers guys

File pattern - Specific files selection 2025年5月5日6:51

In case you wan to process a folder with many many imagine, you want to avoid using the filepatern node, i mean filter the item before and not after... Or did i miss something ?