feat: 完善参数化关系式与SCDM模型修改验证

This commit is contained in:
2026-08-17 18:53:03 +08:00
parent a633b5a338
commit 722256a41f
7 changed files with 1798 additions and 83 deletions
@@ -80,6 +80,63 @@ def _isolated_hole_resize(model: StepModel, face_id: int, diameter: float, root:
return str(response.get("message") or "")
def _assert_isolated_hole_resize_disables_stale_external_regions(
model: StepModel,
face_id: int,
diameter: float,
root: Path,
) -> None:
input_path = root / "face87_stale_input.brep"
output_path = root / "face87_stale_output.brep"
request_path = root / "face87_stale_resize_request.json"
model.export_internal_brep(input_path)
request_path.write_text(
json.dumps(
{
"input_path": str(input_path),
"output_path": str(output_path),
"input_format": "brep",
"output_format": "brep",
"operation": "resize_cylindrical_hole",
"args": [face_id, diameter],
},
ensure_ascii=False,
indent=2,
),
encoding="utf-8",
)
code = run_request(request_path)
response = json.loads(request_path.with_suffix(".response.json").read_text(encoding="utf-8"))
_assert(code == 0 and response.get("ok") is True, f"isolated stale-region resize should pass: {response}")
message = str(response.get("message") or "")
marker = "verified_face="
marker_index = message.find(marker)
_assert(marker_index >= 0, f"isolated resize should report verified_face: {message}")
verified_text = message[marker_index + len(marker):].split(".", 1)[0].strip()
verified_face = int(float(verified_text))
result_model = StepModel.load_internal_brep(output_path)
result_model.filename = MODEL_PATH
stale_region = result_model.face_region_ids(verified_face)
_assert(
len(stale_region) > 1,
f"test fixture should expose the stale external-region bug before marking: {stale_region}",
)
result_model.mark_external_recognition_stale("isolated-edit-result")
current_region = result_model.face_region_ids(verified_face)
_assert(
current_region == [verified_face],
f"isolated edit result should not reuse original STEP Analysis Situs hole groups: {current_region}",
)
result_model.assign_logical_face_region_exclusive(face_id, current_region)
_assert(
result_model.face_ids_for_logical_id(face_id) == current_region,
f"logical Face {face_id} should only attach to the edited hole, not a neighboring hole: "
f"{result_model.face_ids_for_logical_id(face_id)}",
)
def _isolated_hole_axis_move(
model: StepModel,
face_id: int,
@@ -331,6 +388,7 @@ def main() -> int:
with tempfile.TemporaryDirectory(prefix="icepak_face87_isolated_") as temp_dir:
worker_message = _isolated_hole_resize(model, 87, 0.3, Path(temp_dir))
_assert("diameter 0.5 -> 0.3" in worker_message, "Face 87 isolated diameter shrink should complete")
_assert_isolated_hole_resize_disables_stale_external_regions(model, 87, 0.3, Path(temp_dir))
with tempfile.TemporaryDirectory(prefix="icepak_face85_axis_isolated_") as temp_dir:
worker_message = _isolated_hole_axis_move(model, 85, axis_move_target, Path(temp_dir))