feat: 完善 Face 一级关系编辑和稳定性

This commit is contained in:
2026-08-04 09:35:39 +08:00
parent bb44e3920d
commit 5799d5d813
29 changed files with 6295 additions and 189 deletions
+117
View File
@@ -0,0 +1,117 @@
from __future__ import annotations
import math
from pathlib import Path
import sys
PROJECT_ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(PROJECT_ROOT))
from step_editor.window_state import WindowStateMixin, _feature_dimension_keys
def assert_keys(info: dict[str, object], expected: tuple[str, ...]) -> None:
actual = _feature_dimension_keys(info)
if actual != expected:
raise AssertionError(f"expected {expected}, got {actual} for {info}")
def main() -> int:
assert_keys(
{
"surface": "cylinder",
"feature_guess": "hole/groove candidate",
"angular_span": math.tau,
},
("diameter", "hole_depth_estimate"),
)
assert_keys(
{
"surface": "cylinder",
"feature_guess": "hole/groove candidate",
"angular_span": math.pi,
},
(
"slot_chord_width_estimate",
"slot_sagitta_depth_estimate",
"slot_total_length_estimate",
),
)
assert_keys(
{
"surface": "cylinder",
"feature_guess": "boss/outer-round candidate",
"angular_span": math.tau,
},
("boss_diameter", "boss_height"),
)
assert_keys(
{
"surface": "cylinder",
"feature_guess": "round/fillet candidate",
"angular_span": math.pi / 2.0,
},
("existing_fillet_radius_estimate",),
)
assert_keys(
{"surface": "plane", "shell_region_status": "candidate"},
("shell_thickness_estimate",),
)
assert_keys(
{
"surface": "plane",
"prismatic_profile_status": "candidate",
"prismatic_extrusion_status": "candidate",
},
("local_face_width", "local_face_height", "shell_thickness_estimate"),
)
assert_keys(
{"surface": "torus"},
("torus_major_radius", "torus_minor_radius"),
)
specs = [
{
"key": "area",
"editable": True,
"enabled": True,
"label": "area",
},
{
"key": "diameter",
"editable": True,
"enabled": True,
"label": "diameter",
},
{
"key": "hole_depth_estimate",
"editable": True,
"enabled": False,
"label": "depth",
},
{
"key": "hole_edit_semantics",
"editable": False,
"enabled": False,
"label": "semantics",
},
]
filtered = WindowStateMixin._feature_property_specs(
object(),
specs,
{
"surface": "cylinder",
"feature_guess": "hole/groove candidate",
"angular_span": math.tau,
},
)
filtered_keys = tuple(str(spec.get("key")) for spec in filtered)
if filtered_keys != ("diameter", "hole_edit_semantics"):
raise AssertionError(f"unexpected filtered feature parameters: {filtered_keys}")
print("feature parameter policy ok")
return 0
if __name__ == "__main__":
raise SystemExit(main())