feat: 完善Face保持关系守门与大模型预判

This commit is contained in:
2026-08-10 16:51:52 +08:00
parent 415e8a0f27
commit 61f0b76e59
11 changed files with 218 additions and 21 deletions
+69 -7
View File
@@ -2466,13 +2466,37 @@ class WindowStateMixin:
root_specs: list[dict[str, object]],
action_info: dict[str, object],
) -> list[dict[str, object]]:
root_rows = self._feature_property_specs(root_specs, action_info)
associated = action_info.get("associated_feature_infos")
if not isinstance(associated, (list, tuple)) or not associated:
return root_rows
def no_editable_feature_dimensions_spec() -> dict[str, object]:
reason = str(
action_info.get("freeform_face_blockers")
or action_info.get("recognition_blockers")
or action_info.get("local_face_deform_blocker")
or action_info.get("feature_edit_actions")
or "当前识别结果没有稳定可修改参数;详细原因请看诊断信息。"
).strip()
if not reason:
reason = "当前识别结果没有稳定可修改参数;详细原因请看诊断信息。"
return {
"key": "no_editable_feature_dimensions",
"label": "可修改参数",
"current_text": "当前无可修改参数",
"current_raw": "",
"target_text": "",
"editable": False,
"enabled": False,
"status_text": "不可修改",
"disabled_tip": reason,
"span_value_columns": True,
"parameter_role": "empty_state",
}
root_rows = self._feature_property_specs(root_specs, action_info)
root_dimensions = [dict(spec) for spec in root_rows if spec.get("parameter_role") == "dimension"]
related_rows: list[dict[str, object]] = []
associated = action_info.get("associated_feature_infos")
if not isinstance(associated, (list, tuple)) or not associated:
return root_dimensions or [no_editable_feature_dimensions_spec()]
for index, related_info in enumerate(associated, start=1):
if not isinstance(related_info, dict):
continue
@@ -2492,7 +2516,8 @@ class WindowStateMixin:
related["association_index"] = index
related_rows.append(related)
return root_dimensions + related_rows
rows = root_dimensions + related_rows
return rows or [no_editable_feature_dimensions_spec()]
def _ordered_property_info_items(self, info: dict[str, object]) -> list[tuple[str, object]]:
items = self._ordered_info_items(info)
@@ -3572,6 +3597,43 @@ class WindowStateMixin:
+ plane_origin[1] * plane_direction[1]
+ plane_origin[2] * plane_direction[2]
)
keep_relation_fields_present = any(
key in action_info
for key in (
"first_level_planar_relation_status",
"first_level_planar_relation_count",
"first_level_planar_relation_angled_count",
"first_level_planar_relation_non_planar_face_ids",
"first_level_adjacent_surface_types",
)
)
keep_relation_enabled = current_plane_position is not None
keep_relation_disabled_tip = "当前平面缺少稳定移动方向或基准点,不能保持一级平面关系。"
if keep_relation_enabled and keep_relation_fields_present:
relation_status = str(action_info.get("first_level_planar_relation_status") or "")
relation_count = _int_or_none(action_info.get("first_level_planar_relation_count")) or 0
angled_count = _int_or_none(action_info.get("first_level_planar_relation_angled_count")) or 0
non_planar_face_ids = _int_values(action_info.get("first_level_planar_relation_non_planar_face_ids"))
adjacent_surfaces = tuple(action_info.get("first_level_adjacent_surface_types") or ())
non_plane_adjacent_surfaces = tuple(
item
for item in adjacent_surfaces
if isinstance(item, (tuple, list))
and len(item) >= 2
and str(item[1]) != "plane"
)
if non_planar_face_ids or non_plane_adjacent_surfaces:
keep_relation_enabled = False
keep_relation_disabled_tip = "一级相邻 Face 中包含非平面/曲面,当前“保持关系”只支持平面邻域。"
elif angled_count > 0:
keep_relation_enabled = False
keep_relation_disabled_tip = "一级相邻平面中存在斜交关系,当前“保持关系”只支持平行/垂直。"
elif relation_status != "ready":
keep_relation_enabled = False
keep_relation_disabled_tip = "当前一级平面关系还不可验证,不能使用“保持关系”。"
elif relation_count <= 0:
keep_relation_enabled = False
keep_relation_disabled_tip = "当前一级邻域没有识别到可保持的平行/垂直平面关系。"
add_scoped_spec(
key="face_target_normal_position",
label="偏移",
@@ -3598,12 +3660,12 @@ class WindowStateMixin:
"label": "保持关系",
"action": "push_pull_face_keep_relations",
"target_attr": "offset_input",
"enabled": current_plane_position is not None,
"enabled": keep_relation_enabled,
"enabled_tip": (
"输入偏移的目标位置;程序会沿当前 Face 法向拉伸/切除,"
"并要求一级相邻平面的平行/垂直关系可验证。"
),
"disabled_tip": "当前平面缺少稳定移动方向或基准点,不能保持一级平面关系。",
"disabled_tip": keep_relation_disabled_tip,
"range_hint": (
"这是带约束守门的拉伸/切除:只支持直接相邻平面关系清楚、且关系为平行/垂直的一级邻域;"
"遇到非平面相邻面、斜交关系或复杂多边界慢计划会直接阻止。"