feat(M02): 구조물 도면 상세 · 카드 미리보기에 도각 얹음 — 외곽 좌하단 (0,0) · 보여주기 층

- 서버 GET /api/m02/structure-frame — B07 시스템 양식 00_template_A1 을 frame_entities(fit=False)로 1:1 배치 · 외곽 좌하단 (0,0) 으로 옮김 · 잠금 층 m02-structure-frame「도각(보기)」(마스터 양식 json 그대로)
- 화면 mountDrawingTemplate frame 갈래 — 실을 때 도각 엔티티 · 층 덧붙임 · getDoc 에서 그 층 통째로 뺌(구조물 엔티티 · 저장 본문에 안 섞임)
- 층 없는 빈 구조물 문서는 기본 층을 채움 — 잠금 도각 층만 남아 새 그림이 도각 층에 떨어지는 것 막음
- 불러온 DXF 층(b08-frame)과 층 id 갈라 둠
- 시험 test_m02_router_drawing 도각 원점 · 층 · 원본 양식 불변

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W4uKaV4ZBhsJN4GHG7yRj4
This commit is contained in:
2026-10-06 17:52:13 +09:00
co-authored by Claude Opus 5.5
parent ffb851904c
commit ab39bcf986
5 changed files with 112 additions and 7 deletions
@@ -65,3 +65,18 @@ def test_import_garbage_is_400_not_500():
)
assert response.status_code == 400, (data, response.text)
assert response.json()["message"]
def test_structure_frame_origin_at_zero():
# 56장 — 구조물 도면에 얹는 도각: 외곽 좌하단 (0,0) · 잠금 도각 층 · 원본 양식은 그대로
from B07_DesignDetail.B07_DesignDetail_Engine_Template import entities_bbox, template_entities
before = entities_bbox(template_entities())
body = client.get("/api/m02/structure-frame").json()
x0, y0, x1, y1 = entities_bbox(body["entities"])
assert abs(x0) < 1e-9 and abs(y0) < 1e-9
assert abs((x1 - x0) - (before[2] - before[0])) < 1e-6
assert body["layer"]["isLocked"] is True
assert {e["layerId"] for e in body["entities"]} == {"m02-structure-frame"}
assert body["layer"]["id"] == "m02-structure-frame" # 불러온 DXF 층(b08-frame)과 갈림
assert entities_bbox(template_entities()) == before