Update
This commit is contained in:
@@ -304,49 +304,19 @@ class GeometryUI(ui_utils.BaseUI):
|
||||
def create_bottom_buttons(self):
|
||||
"""
|
||||
创建底部功能按钮区域
|
||||
包括自动化模型、标准化名称、自动分组等功能按钮
|
||||
包括模型工具组,其中包含拓扑结构、选择LOD、创建LOD按钮等
|
||||
"""
|
||||
# 创建底部功能区域
|
||||
self.controls["bottom_area"] = QtWidgets.QWidget()
|
||||
self.controls["bottom_area"].setObjectName("geometryBottomArea")
|
||||
self.controls["bottom_area"].setMinimumHeight(150)
|
||||
self.controls["bottom_area"].setMaximumHeight(200)
|
||||
self.controls["bottom_area"].setMinimumHeight(180)
|
||||
self.controls["bottom_area"].setMaximumHeight(250)
|
||||
|
||||
# 创建底部区域布局
|
||||
bottom_layout = QtWidgets.QVBoxLayout(self.controls["bottom_area"])
|
||||
bottom_layout.setContentsMargins(5, 5, 5, 5)
|
||||
bottom_layout.setSpacing(5)
|
||||
|
||||
# 创建三个功能按钮组
|
||||
button_group_layout = QtWidgets.QHBoxLayout()
|
||||
button_group_layout.setSpacing(5)
|
||||
|
||||
# 自动化模型按钮
|
||||
self.buttons["auto_model"] = QtWidgets.QPushButton()
|
||||
self.buttons["auto_model"].setIcon(QtGui.QIcon(os.path.join(ICONS_PATH, "load_meshes.png")))
|
||||
self.buttons["auto_model"].setText(LANG.get("auto_model", "自动化模型"))
|
||||
self.buttons["auto_model"].setObjectName("autoModelButton")
|
||||
self.buttons["auto_model"].setMinimumHeight(40)
|
||||
|
||||
# 标准化名称按钮
|
||||
self.buttons["standardize_names"] = QtWidgets.QPushButton()
|
||||
self.buttons["standardize_names"].setIcon(QtGui.QIcon(os.path.join(ICONS_PATH, "standardized_naming.png")))
|
||||
self.buttons["standardize_names"].setText(LANG.get("standardize_names", "标准化名称"))
|
||||
self.buttons["standardize_names"].setObjectName("standardizeNamesButton")
|
||||
self.buttons["standardize_names"].setMinimumHeight(40)
|
||||
|
||||
# 自动分组按钮
|
||||
self.buttons["auto_group"] = QtWidgets.QPushButton()
|
||||
self.buttons["auto_group"].setIcon(QtGui.QIcon(os.path.join(ICONS_PATH, "automatic_grouping.png")))
|
||||
self.buttons["auto_group"].setText(LANG.get("auto_group", "自动分组"))
|
||||
self.buttons["auto_group"].setObjectName("autoGroupButton")
|
||||
self.buttons["auto_group"].setMinimumHeight(40)
|
||||
|
||||
# 添加按钮到布局
|
||||
button_group_layout.addWidget(self.buttons["auto_model"])
|
||||
button_group_layout.addWidget(self.buttons["standardize_names"])
|
||||
button_group_layout.addWidget(self.buttons["auto_group"])
|
||||
|
||||
# 创建模型工具区域
|
||||
model_tools_group = QtWidgets.QGroupBox(LANG.get("model_tools", "模型工具"))
|
||||
model_tools_group.setObjectName("modelToolsGroup")
|
||||
@@ -356,14 +326,45 @@ class GeometryUI(ui_utils.BaseUI):
|
||||
model_tools_layout.setContentsMargins(5, 5, 5, 5)
|
||||
model_tools_layout.setSpacing(5)
|
||||
|
||||
# 第一行放置拓扑结构、选择LOD和创建LOD按钮
|
||||
# 拓扑结构标签和下拉框
|
||||
topology_label = QtWidgets.QLabel(LANG.get("topology_structure", "拓扑结构") + ":")
|
||||
model_tools_layout.addWidget(topology_label, 0, 0)
|
||||
|
||||
self.controls["topology_combo"] = QtWidgets.QComboBox()
|
||||
self.controls["topology_combo"].setObjectName("topologyCombo")
|
||||
self.controls["topology_combo"].addItem("MetaHuman")
|
||||
self.controls["topology_combo"].setMinimumWidth(100)
|
||||
model_tools_layout.addWidget(self.controls["topology_combo"], 0, 1)
|
||||
|
||||
# 选择LOD标签和下拉框
|
||||
lod_label = QtWidgets.QLabel(LANG.get("select_lod", "选择LOD") + ":")
|
||||
model_tools_layout.addWidget(lod_label, 0, 2)
|
||||
|
||||
self.controls["lod_combo"] = QtWidgets.QComboBox()
|
||||
self.controls["lod_combo"].setObjectName("lodCombo")
|
||||
self.controls["lod_combo"].addItem(LANG.get("all", "全部"))
|
||||
for i in range(8): # LOD0~LOD7
|
||||
self.controls["lod_combo"].addItem(f"LOD{i}")
|
||||
self.controls["lod_combo"].setMinimumWidth(80)
|
||||
model_tools_layout.addWidget(self.controls["lod_combo"], 0, 3)
|
||||
|
||||
# 创建LOD按钮
|
||||
self.buttons["create_lod"] = QtWidgets.QPushButton()
|
||||
self.buttons["create_lod"].setIcon(QtGui.QIcon(os.path.join(ICONS_PATH, "create_lod.png")))
|
||||
self.buttons["create_lod"].setText(LANG.get("create_lod", "创建LOD"))
|
||||
self.buttons["create_lod"].setObjectName("createLodButton")
|
||||
self.buttons["create_lod"].setMinimumHeight(30)
|
||||
model_tools_layout.addWidget(self.buttons["create_lod"], 0, 4)
|
||||
|
||||
# 创建模型工具按钮
|
||||
tool_buttons = [
|
||||
{"name": "modify_topology", "text": LANG.get("modify_topology", "修改拓扑"), "icon": "topology_distribution.png", "row": 0, "col": 0},
|
||||
{"name": "fix_seams", "text": LANG.get("fix_seams", "修复接缝"), "icon": "fix_seams.png", "row": 0, "col": 1},
|
||||
{"name": "generate_face_components", "text": LANG.get("generate_face_components", "生成面部配件"), "icon": "generate_facial_components.png", "row": 0, "col": 2},
|
||||
{"name": "fix_vertex_order", "text": LANG.get("fix_vertex_order", "修复点序"), "icon": "fix_vertex_order.png", "row": 1, "col": 0},
|
||||
{"name": "optimize_model", "text": LANG.get("optimize_model", "优化模型"), "icon": "optimize_model.png", "row": 1, "col": 1},
|
||||
{"name": "generate_uvs", "text": LANG.get("generate_uvs", "生成UVs"), "icon": "generate_uvs.png", "row": 1, "col": 2}
|
||||
{"name": "separate_model", "text": LANG.get("separate_model", "模型分离"), "icon": "polySplitVertex.png ", "row": 1, "col": 0, "colspan": 2},
|
||||
{"name": "generate_face_components", "text": LANG.get("generate_face_components", "生成面部配件"), "icon": "meshes.png", "row": 1, "col": 2, "colspan": 3},
|
||||
{"name": "fix_normals", "text": LANG.get("fix_normals", "修复法线"), "icon": "fix_normals.png", "row": 2, "col": 0, "colspan": 2},
|
||||
{"name": "fix_vertex_order", "text": LANG.get("fix_vertex_order", "修复点序"), "icon": "normalConstraint.png ", "row": 2, "col": 2, "colspan": 3},
|
||||
{"name": "fix_seams", "text": LANG.get("fix_seams", "修复接缝"), "icon": "polyChipOff.png ", "row": 3, "col": 0, "colspan": 2},
|
||||
{"name": "optimize_scene", "text": LANG.get("optimize_scene", "优化场景"), "icon": "singlePerspLayout.png ", "row": 3, "col": 2, "colspan": 3}
|
||||
]
|
||||
|
||||
# 创建并添加按钮到布局
|
||||
@@ -373,11 +374,10 @@ class GeometryUI(ui_utils.BaseUI):
|
||||
button.setIcon(QtGui.QIcon(os.path.join(ICONS_PATH, btn_info["icon"])))
|
||||
button.setObjectName(f"{btn_info['name']}Button")
|
||||
button.setMinimumHeight(30)
|
||||
model_tools_layout.addWidget(button, btn_info["row"], btn_info["col"])
|
||||
model_tools_layout.addWidget(button, btn_info["row"], btn_info["col"], 1, btn_info["colspan"])
|
||||
self.buttons[btn_info["name"]] = button
|
||||
|
||||
# 添加布局到底部区域
|
||||
bottom_layout.addLayout(button_group_layout)
|
||||
bottom_layout.addWidget(model_tools_group)
|
||||
|
||||
#========================================= LAYOUT =======================================
|
||||
@@ -440,20 +440,19 @@ class GeometryUI(ui_utils.BaseUI):
|
||||
# 连接垃圾桶按钮
|
||||
self.buttons["delete"].clicked.connect(utils_geometry.delete)
|
||||
|
||||
# 连接底部功能按钮
|
||||
# 自动化模型按钮
|
||||
self.buttons["auto_model"].clicked.connect(utils_geometry.auto_model)
|
||||
# 连接拓扑结构下拉框
|
||||
self.controls["topology_combo"].currentIndexChanged.connect(utils_geometry.update_topology)
|
||||
|
||||
# 标准化名称按钮
|
||||
self.buttons["standardize_names"].clicked.connect(utils_geometry.standardize_names)
|
||||
# 连接选择LOD下拉框
|
||||
self.controls["lod_combo"].currentIndexChanged.connect(utils_geometry.select_lod)
|
||||
|
||||
# 自动分组按钮
|
||||
self.buttons["auto_group"].clicked.connect(utils_geometry.auto_group)
|
||||
# 连接创建LOD按钮
|
||||
self.buttons["create_lod"].clicked.connect(utils_geometry.create_lod)
|
||||
|
||||
# 模型工具按钮
|
||||
self.buttons["modify_topology"].clicked.connect(utils_geometry.modify_topology)
|
||||
self.buttons["fix_seams"].clicked.connect(utils_geometry.fix_seams)
|
||||
# 连接模型工具按钮
|
||||
self.buttons["separate_model"].clicked.connect(utils_geometry.separate_model)
|
||||
self.buttons["generate_face_components"].clicked.connect(utils_geometry.generate_face_components)
|
||||
self.buttons["fix_normals"].clicked.connect(utils_geometry.fix_normals)
|
||||
self.buttons["fix_vertex_order"].clicked.connect(utils_geometry.fix_vertex_order)
|
||||
self.buttons["optimize_model"].clicked.connect(utils_geometry.optimize_model)
|
||||
self.buttons["generate_uvs"].clicked.connect(utils_geometry.generate_uvs)
|
||||
self.buttons["fix_seams"].clicked.connect(utils_geometry.fix_seams)
|
||||
self.buttons["optimize_scene"].clicked.connect(utils_geometry.optimize_scene)
|
@@ -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():
|
||||
|
Reference in New Issue
Block a user