ModelTranslator: Pack 空 Coverages 守卫——RizomUV 未授权静默空跑转为明确报错回退
This commit is contained in:
@@ -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",
|
||||
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()
|
||||
|
||||
Reference in New Issue
Block a user