From d44a2fa997a168d4dc839f96c3b5870afed7a5b9 Mon Sep 17 00:00:00 2001 From: ud18010 Date: Tue, 21 Jul 2026 15:21:12 +0800 Subject: [PATCH] =?UTF-8?q?ModelTranslator:=20=5Fuvpm=5Frepack=20=E5=BC=80?= =?UTF-8?q?=E5=90=AF=E6=97=8B=E8=BD=AC(15=C2=B0=E6=AD=A5=E8=BF=9B)+?= =?UTF-8?q?=E5=90=AF=E5=8F=91=E5=BC=8F=E6=90=9C=E7=B4=A2(10s=E4=B8=8A?= =?UTF-8?q?=E9=99=90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 探针确认属性名: rotation_enable/rotation_step/heuristic_enable/heuristic_search_time; pack_op_type 保持 '0'。 Co-Authored-By: Claude Opus 4.8 (1M context) --- Tools/ModelTranslator/bl_decimate.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Tools/ModelTranslator/bl_decimate.py b/Tools/ModelTranslator/bl_decimate.py index a6722ca0..c7831b30 100644 --- a/Tools/ModelTranslator/bl_decimate.py +++ b/Tools/ModelTranslator/bl_decimate.py @@ -141,6 +141,8 @@ PACK_MARGIN = 0.002 # 岛间距 ≈ 2048 图 4px UVPM_EXT = "bl_ext.user_default.uvpackmaster4" # UVPackmaster 4 扩展模块名 UVPM_PIXEL_MARGIN = 4 # UVPM 岛间距(像素),与 PACK_MARGIN * UVPM_TEX_SIZE 同口径 UVPM_TEX_SIZE = 2048 +UVPM_ROTATION_STEP = 15 # UVPM 旋转步进(度);比默认 90 更细,利于薄斜条对齐 +UVPM_HEURISTIC_TIME = 10 # UVPM 启发式搜索秒数上限(默认 0=无限,必须给正值上限) SEAM_ANGLE_SWEEP = (55.0, 45.0, 35.0) # 首选 SEAM_ANGLE_DEG 不过门时依次下探的 seam 角度 STRETCH_ITERS = 30 # minimize_stretch 松弛迭代次数 REL_WELD = 1e-4 # 焊接距离占局部包围盒对角线比例(避免 cm/m 单位差异导致绝对阈值失准) @@ -283,6 +285,18 @@ def _uvpm_enable(): raise RuntimeError("扩展 %s 启用失败(未安装或版本不兼容)" % UVPM_EXT) +def _uvpm_set(p, name, value, warnings): + """防御式设 UVPM 属性:属性存在才设,否则记警告跳过—— + 名字不匹配(UVPM 版本差异)时降级为按原 margin 跑 UVPM,不丢整个排布。""" + if hasattr(p, name): + try: + setattr(p, name, value) + except Exception as e: + warnings.append("UVPM 属性 %s 设置失败(%s),跳过" % (name, e)) + else: + warnings.append("UVPM 属性 %s 不存在,跳过" % name) + + def _uvpm_repack(obj, warnings): """UVPM4 重排当前 UV 布局,成功返回 True;任何失败记警告返回 False, 保底布局(pack_islands/smart_project)原样保留。""" @@ -296,6 +310,10 @@ def _uvpm_repack(obj, warnings): p.pixel_margin_enable = True p.pixel_margin = UVPM_PIXEL_MARGIN p.pixel_margin_tex_size = UVPM_TEX_SIZE + _uvpm_set(p, "rotation_enable", True, warnings) + _uvpm_set(p, "rotation_step", UVPM_ROTATION_STEP, warnings) + _uvpm_set(p, "heuristic_enable", True, warnings) + _uvpm_set(p, "heuristic_search_time", UVPM_HEURISTIC_TIME, warnings) bpy.context.scene.tool_settings.use_uv_select_sync = True bpy.context.view_layer.objects.active = obj bpy.ops.object.mode_set(mode='EDIT')