ModelTranslator: Pack 空 Coverages 守卫——RizomUV 未授权静默空跑转为明确报错回退

This commit is contained in:
ud18010
2026-07-20 09:29:56 +08:00
parent 9f4e02265c
commit 78a17e0f92
2 changed files with 27 additions and 4 deletions
+14 -4
View File
@@ -91,6 +91,13 @@ def _call(label, fn, params, timeout=TIMEOUT_S):
return res
def _check_pack_result(res):
"""Pack 返回 Coverages 空列表 = 没有任何平面岛可打包——Unfold 未生效。
实测这是 RizomUV 无有效授权时的静默失败形态(命令全部"成功"但解算不执行)。"""
if isinstance(res, dict) and "Coverages" in res and not res["Coverages"]:
raise RizomError("Pack 无任何平面岛(Unfold 未生效)——请检查 RizomUV 授权是否已激活")
RETRY = 1 # 实例级重试次数:RizomUV IPC 有 2000ms 内部响应窗,偶发 not responding
@@ -137,13 +144,15 @@ def _unwrap_once(mod, exe, fbx_abs, map_res, pad_uv):
"Quality": 0.5,
}})
_call("Cut", link.Cut, {"PrimType": "Edge", "WorkingSet": "Visible"})
_call("Unfold", link.Unfold, {"PrimType": "Edge", "WorkingSet": "Visible",
"BorderIntersections": True,
"TriangleFlips": True})
r = _call("Unfold", link.Unfold, {"PrimType": "Edge", "WorkingSet": "Visible",
"BorderIntersections": True,
"TriangleFlips": True})
if isinstance(r, dict) and r.get("BijectionFailedIslandIDs"):
print("[警告] Unfold 有 %d 个岛双射失败" % len(r["BijectionFailedIslandIDs"]))
# Scaling.Mode=3 (AVG_RATIO_OF_GROUP):官方文档建议首次展开后用该模式统一密度。
# 注:pyd docstring 写的 Global 包装层已被 2025 应用侧拒绝(exe 内 Pack schema
# 无 Global,打包属性直接为顶层参数),故扁平传参。
_call("Pack", link.Pack, {
r = _call("Pack", link.Pack, {
"RootGroup": "RootGroup", "WorkingSet": "Visible",
"ProcessTileSelection": False, "RecursionDepth": 1,
"Translate": True,
@@ -151,6 +160,7 @@ def _unwrap_once(mod, exe, fbx_abs, map_res, pad_uv):
"PaddingSize": pad_uv, "MarginSize": pad_uv,
"Rotate": {"Step": 90.0},
"Scaling": {"Mode": 3}})
_check_pack_result(r)
_call("Save", link.Save, {"File.Path": fbx_abs})
finally:
try:
@@ -72,5 +72,18 @@ class TestRetry(unittest.TestCase):
ru.rizom_unwrap("x.fbx", "rizomuv.exe")
class TestPackCoverageGuard(unittest.TestCase):
def test_empty_coverages_raises(self):
with self.assertRaises(ru.RizomError) as cm:
ru._check_pack_result({"Coverages": []})
self.assertIn("授权", str(cm.exception))
def test_normal_coverages_pass(self):
ru._check_pack_result({"Coverages": [0.72]}) # 不抛
def test_none_result_passes(self):
ru._check_pack_result(None) # 老版本无返回信息时不误伤
if __name__ == "__main__":
unittest.main()