
该教程详解如何修复Adobe Substance Painter导出的Maya Python脚本,使其仅对用户手动选择的几何体(而非全场景所有物体)应用SBSAR材质,核心在于修正cmds.ls()的调用方式并确保正确处理选择层级。
该教程详解如何修复adobe substance painter导出的maya python脚本,使其仅对用户手动选择的几何体(而非全场景所有物体)应用sbsar材质,核心在于修正`cmds.ls()`的调用方式并确保正确处理选择层级。
原始脚本中,_apply_substance_workflow_to_selected()函数使用了:
geometry = cmds.ls(geometry=True)
这一行会无条件列出场景中所有几何体(mesh、nurbsSurface等),导致后续材质绑定逻辑作用于全部对象,完全忽略用户实际选择状态——这正是问题根源。
✅ 正确做法是:显式限定为“当前选择的几何体”,即改用 sl=True(selected=True)参数,并保留 geometry=True 筛选类型:
geometry = cmds.ls(sl=True, geometry=True)
但需注意:sl=True 获取的是变换节点(transform)还是形状节点(shape)?
Maya中材质必须连接到形状节点(shape),而用户通常选择的是物体的变换节点(如 pSphere1)。cmds.ls(sl=True, geometry=True) 会自动返回其底层形状节点(如 pSphere1Shape),因此该写法已兼容常规操作习惯,无需额外转换。
? 同时,为确保流程健壮性,建议补充空选择校验与错误提示:
def _apply_substance_workflow_to_selected(substance_file, workflow):
# ✅ 仅获取当前选中的几何体形状节点
geometry = cmds.ls(sl=True, geometry=True)
# ? 检查是否至少有一个有效选择
if not geometry:
cmds.warning("No geometry selected. Please select at least one mesh or NURBS surface.")
return
# 创建 substance 节点并连接 place2dTexture
substance_node = cmds.shadingNode('substanceNode', asTexture=True)
_connect_place2d(substance_node)
# 加载 SBSAR 文件并应用工作流
cmds.substanceNodeLoadSubstance(substance_node, substance_file)
cmds.substanceNodeApplyWorkflow(substance_node, workflow=workflow)
# 查找 shadingEngine 并分配给选中的几何体
shading_group = _find_shading_group(substance_node)
if not shading_group:
cmds.error("Failed to find a valid shading group from the substance node.")
return
# ✅ 关键:仅将材质赋予 geometry 列表中的每个形状节点
for geo in geometry:
try:
cmds.sets(geo, edit=True, forceElement=shading_group)
except RuntimeError as e:
cmds.warning(f"Could not assign shader to {geo}: {str(e)}")? 重要注意事项:
- 若用户选择的是空组、灯光或控制器等非几何节点,cmds.ls(sl=True, geometry=True) 将返回空列表,脚本会提前退出并提示警告,避免静默失败;
- cmds.sets(..., forceElement=...) 是标准材质分配方式,它将形状节点加入指定的 shadingEngine,安全可靠;
- 不要使用 cmds.select() 或 cmds.hyperShade() 等交互式命令替代直接连接逻辑,以免引入不可控状态;
- 在 Maya 2022+ 中,substanceNode 已逐步被 aiStandardSurface + substance texture workflow 替代,若项目升级至Arnold渲染器,建议同步迁移材质构建逻辑。
通过以上修改,脚本将严格遵循“所选即所得”原则,真正实现一键为当前选中模型精准加载并应用Substance材质。

















