feat: 完善参数化关系式与SCDM模型修改验证
This commit is contained in:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user