Update
This commit is contained in:
479
plug-ins/ARTv2/doc/CHANGELOG.md
Normal file
479
plug-ins/ARTv2/doc/CHANGELOG.md
Normal file
@@ -0,0 +1,479 @@
|
||||
# ARTv2 变更日志
|
||||
|
||||
所有重要变更都记录在此文件中。
|
||||
|
||||
---
|
||||
|
||||
## [2.0.0] - 2024-12-07
|
||||
|
||||
### 🎉 重大更新
|
||||
- **Python 3 完全兼容** - 所有 53 个模块迁移完成
|
||||
- **代码质量大幅提升** - 修复 49 处问题
|
||||
- **4 个核心改进** - 增强稳定性和用户体验
|
||||
|
||||
---
|
||||
|
||||
## 严重错误修复
|
||||
|
||||
### [修复] UnboundLocalError in ART_RigModule.py
|
||||
**问题**: `returnNetworkNode` 方法中变量未初始化导致运行时错误
|
||||
|
||||
**修复前**:
|
||||
```python
|
||||
def returnNetworkNode(self):
|
||||
networkNodes = cmds.ls(type="network")
|
||||
for node in networkNodes:
|
||||
if condition:
|
||||
networkNode = node
|
||||
return networkNode # 可能未定义
|
||||
```
|
||||
|
||||
**修复后**:
|
||||
```python
|
||||
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+ 语法警告
|
||||
|
||||
**修复前**:
|
||||
```python
|
||||
if fileName.find(":") is not -1:
|
||||
```
|
||||
|
||||
**修复后**:
|
||||
```python
|
||||
if fileName.find(":") != -1:
|
||||
```
|
||||
|
||||
**影响**: 消除 Python 3.8+ 的语法警告
|
||||
|
||||
**提交**: `2024-12-07`
|
||||
|
||||
---
|
||||
|
||||
### [修复] 异常变量作用域问题 in ART_RigModule.py
|
||||
**问题**: `buildRig` 方法中异常变量 `e` 在 except 块外被引用,导致 "local variable 'e' referenced before assignment" 错误
|
||||
|
||||
**修复前**:
|
||||
```python
|
||||
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)
|
||||
```
|
||||
|
||||
**修复后**:
|
||||
```python
|
||||
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
|
||||
|
||||
**修复前**:
|
||||
```python
|
||||
if state == False:
|
||||
do_something()
|
||||
if cmds.getAttr(node + ".attr") == True:
|
||||
do_other()
|
||||
```
|
||||
|
||||
**修复后**:
|
||||
```python
|
||||
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
|
||||
|
||||
**修复类型**:
|
||||
1. 简单布尔变量 (5处)
|
||||
2. Maya 属性检查 (2处)
|
||||
3. 可见性检查 (15处)
|
||||
|
||||
**示例**:
|
||||
```python
|
||||
# 修复前
|
||||
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 处布尔比较
|
||||
**位置**: 分布在整个文件中
|
||||
|
||||
**修复类型**:
|
||||
1. 简单布尔变量
|
||||
2. Maya 属性检查
|
||||
3. 手指可见性检查
|
||||
|
||||
**示例**:
|
||||
```python
|
||||
# 修复前
|
||||
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`
|
||||
|
||||
**功能**:
|
||||
- 单个模块失败不影响其他模块
|
||||
- 详细的错误日志记录
|
||||
- 构建完成后显示摘要
|
||||
|
||||
**代码**:
|
||||
```python
|
||||
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`
|
||||
|
||||
**功能**:
|
||||
- 自动解锁节点
|
||||
- 递归解锁子节点
|
||||
- 完整的错误处理
|
||||
|
||||
**代码**:
|
||||
```python
|
||||
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`
|
||||
|
||||
**功能**:
|
||||
- 检查网格存在性
|
||||
- 捕获导入异常
|
||||
- 导入摘要统计
|
||||
|
||||
**代码**:
|
||||
```python
|
||||
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`
|
||||
|
||||
**功能**:
|
||||
- 构建前验证场景状态
|
||||
- 检查必要条件
|
||||
- 提供清晰的错误提示
|
||||
|
||||
**代码**:
|
||||
```python
|
||||
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](https://keepachangelog.com/)
|
||||
**版本规范**: [Semantic Versioning](https://semver.org/)
|
||||
Reference in New Issue
Block a user