diff --git a/Tools/ModelTranslator/rizom_unwrap.py b/Tools/ModelTranslator/rizom_unwrap.py index 5326851e..8bcdcf14 100644 --- a/Tools/ModelTranslator/rizom_unwrap.py +++ b/Tools/ModelTranslator/rizom_unwrap.py @@ -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: diff --git a/Tools/ModelTranslator/tests/test_rizom_unwrap.py b/Tools/ModelTranslator/tests/test_rizom_unwrap.py index a8443965..d3769b97 100644 --- a/Tools/ModelTranslator/tests/test_rizom_unwrap.py +++ b/Tools/ModelTranslator/tests/test_rizom_unwrap.py @@ -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()