This commit is contained in:
2025-05-06 01:01:22 +08:00
parent d2f182ef36
commit 8d6fa92690
2 changed files with 195 additions and 67 deletions

View File

@@ -440,12 +440,90 @@ def delete():
return False
#========================================== 底部功能按钮 ========================================
def auto_model():
# 拓扑结构相关功能
def update_topology(index):
"""
自动化模型功能
自动处理模型的各种设置
更新拓扑结构
参数:
index: 拓扑结构下拉框的索引
"""
print("自动化模型")
print(f"更新拓扑结构: {index}")
try:
# 获取选择的拓扑结构
topology_types = ["MetaHuman"]
selected_topology = topology_types[index] if index < len(topology_types) else topology_types[0]
print(f"已选择拓扑结构: {selected_topology}")
return True
except Exception as e:
print(f"更新拓扑结构时出错: {e}")
return False
# LOD选择相关功能
def select_lod(index):
"""
选择LOD
参数:
index: LOD下拉框的索引
"""
print(f"选择LOD: {index}")
try:
# 获取选择的LOD
lod_name = f"LOD{index}"
# 显示对应LOD的模型隐藏其他LOD的模型
for i in range(9): # LOD0~LOD8
current_lod = f"LOD{i}"
lod_models = cmds.ls(f"{current_lod}_*")
if lod_models:
visibility = (current_lod == lod_name)
for model in lod_models:
cmds.setAttr(f"{model}.visibility", visibility)
print(f"已选择LOD: {lod_name}")
return True
except Exception as e:
print(f"选择LOD时出错: {e}")
return False
# 创建LOD相关功能
def create_lod():
"""
创建LOD
根据当前选择的LOD创建新的LOD
"""
print("创建LOD")
try:
# 获取当前选择的LOD
selected_lod_index = cmds.optionMenu("lodCombo", query=True, select=True) - 1
selected_lod = f"LOD{selected_lod_index}"
# 创建新的LOD
new_lod_index = selected_lod_index + 1
new_lod = f"LOD{new_lod_index}"
# 复制当前选择的LOD模型
lod_models = cmds.ls(f"{selected_lod}_*")
if lod_models:
for model in lod_models:
# 复制模型
new_model = cmds.duplicate(model, name=model.replace(selected_lod, new_lod))[0]
# 减少模型的多边形数量(简化模型)
cmds.polyReduce(new_model, percentage=80, triangulate=False)
print(f"已创建{new_lod}")
return True
except Exception as e:
print(f"创建LOD时出错: {e}")
return False
# 模型工具相关功能
def separate_model():
"""
模型分离
将选中的模型分离成多个独立的组件
"""
print("模型分离")
try:
# 获取当前选中的模型
selected_models = cmds.ls(selection=True, type="transform")
@@ -453,19 +531,70 @@ def auto_model():
cmds.warning(LANG.get("no_model_selected", "未选中模型"))
return False
# 执行标准化命名
standardize_names()
# 对每个选中的模型进行分离
for model in selected_models:
# 分离模型的各个部分
cmds.polySeparate(model, name=f"{model}_separated")
# 执行自动分组
auto_group()
# 执行优化模型
optimize_model()
print("自动化模型完成")
print("模型分离完成")
return True
except Exception as e:
print(f"自动化模型时出错: {e}")
print(f"模型分离时出错: {e}")
return False
def fix_normals():
"""
修复法线
修复选中模型的法线方向
"""
print("修复法线")
try:
# 获取当前选中的模型
selected_models = cmds.ls(selection=True, type="transform")
if not selected_models:
cmds.warning(LANG.get("no_model_selected", "未选中模型"))
return False
# 对每个选中的模型修复法线
for model in selected_models:
# 先解锁法线
cmds.polyNormalPerVertex(model, unFreezeNormal=True)
# 然后计算法线
cmds.polyNormal(model, normalMode=0, userNormalMode=0, ch=1)
# 最后让法线平滑
cmds.polySoftEdge(model, angle=30, ch=1)
print("法线修复完成")
return True
except Exception as e:
print(f"修复法线时出错: {e}")
return False
def optimize_scene():
"""
优化场景
清理场景中的未使用节点和历史记录
"""
print("优化场景")
try:
# 清理未使用的节点
mel.eval('MLdeleteUnused;')
# 删除所有历史记录
cmds.delete(constructionHistory=True, all=True)
# 优化场景大小
cmds.file(cleanReference=True)
cmds.file(removeReference=True)
cmds.file(optimizeReference=True)
# 清理未使用的材质和纹理
mel.eval('hyperShadePanelMenuCommand("hyperShadePanel1", "deleteUnusedNodes");')
print("场景优化完成")
return True
except Exception as e:
print(f"优化场景时出错: {e}")
return False
def modify_topology():