11 KiB
ARTv2 变更日志
所有重要变更都记录在此文件中。
[2.0.0] - 2024-12-07
🎉 重大更新
- Python 3 完全兼容 - 所有 53 个模块迁移完成
- 代码质量大幅提升 - 修复 49 处问题
- 4 个核心改进 - 增强稳定性和用户体验
严重错误修复
[修复] UnboundLocalError in ART_RigModule.py
问题: returnNetworkNode 方法中变量未初始化导致运行时错误
修复前:
def returnNetworkNode(self):
networkNodes = cmds.ls(type="network")
for node in networkNodes:
if condition:
networkNode = node
return networkNode # 可能未定义
修复后:
def returnNetworkNode(self):
networkNode = None # 初始化
networkNodes = cmds.ls(type="network")
for node in networkNodes:
if condition:
networkNode = node
break # 提前退出
return networkNode
影响:
- 修复了 Publish 流程失败
- 修复了 Edit Setup 失败
- 修复了 aimMode_Setup 错误
提交: 2024-12-07
[修复] SyntaxWarning in ART_ExportWeights.py
问题: 使用 is not 与字面量比较导致 Python 3.8+ 语法警告
修复前:
if fileName.find(":") is not -1:
修复后:
if fileName.find(":") != -1:
影响: 消除 Python 3.8+ 的语法警告
提交: 2024-12-07
[修复] 异常变量作用域问题 in ART_RigModule.py
问题: buildRig 方法中异常变量 e 在 except 块外被引用,导致 "local variable 'e' referenced before assignment" 错误
修复前:
def buildRig(self, textEdit, uiInst):
successfulBuild = True
errorMessage = ""
try:
self.buildRigCustom(textEdit, uiInst)
except Exception as e:
successfulBuild = False
errorMessage = str(traceback.format_exc())
# ... 其他代码 ...
if not successfulBuild:
print(f"Build Rig Failed: {str(e)}") # ❌ e 可能未定义
print(errorMessage)
修复后:
def buildRig(self, textEdit, uiInst):
successfulBuild = True
errorMessage = ""
buildException = None # ✅ 初始化异常变量
try:
self.buildRigCustom(textEdit, uiInst)
except Exception as e:
successfulBuild = False
buildException = e # ✅ 保存异常
errorMessage = str(traceback.format_exc())
# ... 其他代码 ...
if not successfulBuild:
print(f"Build Rig Failed: {str(buildException)}") # ✅ 使用保存的异常
print(errorMessage)
if buildException:
raise buildException # ✅ 重新抛出供上层捕获
影响:
- 修复了 Root 模块构建失败的警告
- 修复了 Torso 模块构建失败的警告
- 修复了 "控制器消失" 的问题
- 确保异常能被正确捕获和处理
提交: 2024-12-07
代码风格优化
[优化] ART_Torso.py - 4 处布尔比较
位置: Lines 388, 491, 723, 735
修复前:
if state == False:
do_something()
if cmds.getAttr(node + ".attr") == True:
do_other()
修复后:
if not state:
do_something()
if cmds.getAttr(node + ".attr"):
do_other()
提交: 2024-12-07
[优化] ART_Leg_Standard.py - 22 处布尔比较
位置: Lines 2126, 2143, 2161, 2245, 2269, 3048, 3082, 3173-3211
修复类型:
- 简单布尔变量 (5处)
- Maya 属性检查 (2处)
- 可见性检查 (15处)
示例:
# 修复前
if state == False:
self.bigToeNum.setValue(0)
if cmds.getAttr(networkNode + ".includeBall") == False:
joint = prefix + "foot" + suffix
if cmds.getAttr(name + "_ball_mover_grp.v") == True:
cmds.aimConstraint(...)
# 修复后
if not state:
self.bigToeNum.setValue(0)
if not cmds.getAttr(networkNode + ".includeBall"):
joint = prefix + "foot" + suffix
if cmds.getAttr(name + "_ball_mover_grp.v"):
cmds.aimConstraint(...)
提交: 2024-12-07
[优化] ART_Arm_Standard.py - 20 处布尔比较
位置: 分布在整个文件中
修复类型:
- 简单布尔变量
- Maya 属性检查
- 手指可见性检查
示例:
# 修复前
if state == False:
self.applyButton.setEnabled(True)
if cmds.getAttr(networkNode + ".includeClavicle") == False:
joint = prefix + "upperarm" + suffix
if cmds.getAttr(name + "_thumb_metacarpal_mover_grp.v") == True:
cmds.aimConstraint(...)
# 修复后
if not state:
self.applyButton.setEnabled(True)
if not cmds.getAttr(networkNode + ".includeClavicle"):
joint = prefix + "upperarm" + suffix
if cmds.getAttr(name + "_thumb_metacarpal_mover_grp.v"):
cmds.aimConstraint(...)
提交: 2024-12-07
功能改进
[新增] 模块构建错误恢复机制
文件: ART_BuildProgressUI.py
功能:
- 单个模块失败不影响其他模块
- 详细的错误日志记录
- 构建完成后显示摘要
代码:
def buildRigs(self):
failed_modules = []
for inst in self.mainUI.moduleInstances:
try:
inst.buildRig()
self.infoText.append(f"✓ Built: {inst.name}")
except Exception as e:
failed_modules.append((inst.name, str(e)))
self.infoText.setTextColor(QtGui.QColor(255, 100, 100))
self.infoText.append(f"✗ Failed: {inst.name}")
self.infoText.append(f" Error: {e}")
self.errors += 1
# 显示摘要
if failed_modules:
self.infoText.append(f"\nBuild Summary:")
self.infoText.append(f" Success: {len(self.mainUI.moduleInstances) - len(failed_modules)}")
self.infoText.append(f" Failed: {len(failed_modules)}")
提交: 2024-12-07
[新增] 安全骨骼删除检查
文件: ART_BuildProgressUI.py
功能:
- 自动解锁节点
- 递归解锁子节点
- 完整的错误处理
代码:
def rebuildSkeleton(self):
if cmds.objExists("root"):
try:
# 解锁根节点
if cmds.lockNode("root", q=True, lock=True)[0]:
cmds.lockNode("root", lock=False)
# 解锁所有子节点
children = cmds.listRelatives("root", allDescendents=True, fullPath=True) or []
for child in children:
if cmds.lockNode(child, q=True, lock=True)[0]:
cmds.lockNode(child, lock=False)
# 删除
cmds.delete("root")
except Exception as e:
self.infoText.setTextColor(QtGui.QColor(255, 100, 100))
self.infoText.append(f"ERROR: Failed to delete root skeleton: {e}")
self.errors += 1
提交: 2024-12-07
[新增] 权重导入错误处理
文件: ART_BuildProgressUI.py
功能:
- 检查网格存在性
- 捕获导入异常
- 导入摘要统计
代码:
def importWeights(self, meshes):
importSuccess = 0
importFailed = 0
for mesh in meshes:
filePath = os.path.join(cmds.internalVar(utd=True), mesh + ".WEIGHTS")
if os.path.exists(filePath):
try:
# 检查网格存在
if not cmds.objExists(mesh):
self.infoText.setTextColor(QtGui.QColor(236, 217, 0))
self.infoText.append(f" Warning: Mesh not found: {mesh}")
importFailed += 1
continue
# 导入权重
riggingUtils.import_skin_weights(filePath, mesh, True)
self.infoText.append(f" Imported Skin Weights for {mesh}")
importSuccess += 1
except Exception as e:
self.infoText.setTextColor(QtGui.QColor(255, 100, 100))
self.infoText.append(f" ERROR: Failed to import weights for {mesh}")
self.infoText.append(f" Reason: {str(e)}")
importFailed += 1
# 显示摘要
self.infoText.append(f"\nWeight Import Summary: {importSuccess} succeeded, {importFailed} failed")
提交: 2024-12-07
[新增] 预检查机制
文件: ART_BuildProgressUI.py
功能:
- 构建前验证场景状态
- 检查必要条件
- 提供清晰的错误提示
代码:
def preflightCheck(self):
"""构建前预检查"""
errors = []
warnings = []
# 检查角色
if not cmds.objExists("ART_RIG_ROOT"):
errors.append("No character found - create a character first")
return errors, warnings
# 检查模块
modules = utils.returnRigModules()
if not modules:
errors.append("No modules found - add modules to your character")
# 检查骨骼
if not cmds.objExists("root"):
errors.append("Skeleton not built - run 'Finalize Setup' first")
# 检查场景状态
state = cmds.getAttr("ART_RIG_ROOT.state")
if state == 0:
errors.append("Character is in Skeleton Placement mode - run 'Finalize Setup' first")
return errors, warnings
提交: 2024-12-07
Python 3 迁移
[迁移] 核心系统模块 (5个)
- ✅ utils.py
- ✅ mathUtils.py
- ✅ riggingUtils.py
- ✅ interfaceUtils.py
- ✅ ART_RigModule.py
主要变更:
- 替换
reload()→importlib.reload() - 替换
xrange()→range() - 修复
print语句 - 修复
except语句
提交: 2024-12-06
[迁移] 系统功能模块 (3个)
- ✅ ART_Settings.py
- ✅ ART_FbxExport.py
- ✅ ART_Reporter.py
提交: 2024-12-06
[迁移] 骨骼模块 (7个)
- ✅ ART_Root.py
- ✅ ART_Chain.py
- ✅ ART_Head.py
- ✅ ART_Leaf.py
- ✅ ART_Torso.py
- ✅ ART_Arm_Standard.py
- ✅ ART_Leg_Standard.py
提交: 2024-12-06
[迁移] UI 界面模块 (35个)
所有 UI 模块已完成迁移,包括:
- 核心 UI (7个)
- 动画工具 (5个)
- 权重工具 (3个)
- 模块管理 (11个)
- 其他工具 (9个)
提交: 2024-12-06
[迁移] 插件入口 (3个)
- ✅ ARTv2.py
- ✅ ART_Updater.py
- ✅ ART_StripFbxNamespace.py
提交: 2024-12-06
统计总结
修复统计
- 严重错误: 2 处
- 语法警告: 1 处
- 代码风格: 46 处
- 总计: 49 处
迁移统计
- 模块总数: 53 个
- reload() 修复: 50+ 处
- except 修复: 100+ 处
- print 修复: 40+ 处
- xrange() 修复: 所有
- long() 修复: 所有
功能改进
- 新增功能: 4 个核心改进
- 错误处理: 大幅增强
- 用户体验: 显著提升
版本历史
[2.0.0] - 2024-12-07
- Python 3 完全兼容
- 代码质量大幅提升
- 核心功能增强
[1.x] - 历史版本
- Python 2 版本
- Epic Games 原始版本
维护者: Cascade AI
格式: Keep a Changelog
版本规范: Semantic Versioning