From 78a17e0f928971d5c1ae50848b6e1181cf926ce2 Mon Sep 17 00:00:00 2001 From: ud18010 Date: Mon, 20 Jul 2026 09:29:56 +0800 Subject: [PATCH] =?UTF-8?q?ModelTranslator:=20Pack=20=E7=A9=BA=20Coverages?= =?UTF-8?q?=20=E5=AE=88=E5=8D=AB=E2=80=94=E2=80=94RizomUV=20=E6=9C=AA?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E9=9D=99=E9=BB=98=E7=A9=BA=E8=B7=91=E8=BD=AC?= =?UTF-8?q?=E4=B8=BA=E6=98=8E=E7=A1=AE=E6=8A=A5=E9=94=99=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tools/ModelTranslator/rizom_unwrap.py | 18 ++++++++++++++---- .../ModelTranslator/tests/test_rizom_unwrap.py | 13 +++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) 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()