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')