Files
Aislo/resources/tester/test_b07_dxf_clip.py
T
eomsangdonandClaude Opus 5.5 be4f3d33ac feat(B07): 클립보드 DXF 글을 웹 CAD 도형으로 바꾸는 서버 길
오토캐드 WEBCLIP 이 클립보드에 넣은 DXF 글을 받는 POST /api/projects/dxf-clip 추가
(프로젝트 무관 · M02 양식도 씀 · 저장 안 함). 변환은 기존 도각 불러오기 엔진을 그대로 쓰고
dxf_text_to_entities 만 더함 — 엔티티 layerId 는 DXF 도면층 이름 그대로 · 쓰인 층 이름과
층 색을 함께 돌려줌. 시험 = 견본 DXF(선 · 폴리선 · 원 · 글 · 도면층 둘) 3건.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K7JS47SacjPxZ718QsZKyr
2026-09-28 13:44:47 +09:00

45 lines
1.9 KiB
Python

"""B07 DXF 붙여넣기 — 오토캐드 WEBCLIP 이 클립보드에 넣은 DXF 글 → 웹 CAD 엔티티 · 도면층."""
from pathlib import Path
from fastapi import FastAPI
from fastapi.testclient import TestClient
from B07_DesignDetail.B07_DesignDetail_Engine_Frame_Import import dxf_text_to_entities
from B07_DesignDetail.B07_DesignDetail_Router_Frame import router
SAMPLE = Path("resources/tester/fixtures/b07_webclip_sample.dxf").read_text(encoding="utf-8")
app = FastAPI()
app.include_router(router)
client = TestClient(app)
def test_engine_keeps_layer_names_and_shapes():
entities, layers = dxf_text_to_entities(SAMPLE)
kinds = sorted(entity["type"] for entity in entities)
# 선 1 · 닫힌 폴리선 1 · 원(선분 묶음) 1 · 글 1
assert kinds == ["Line", "PolyLine", "PolyLine", "Text"]
assert {entity["layerId"] for entity in entities} == {"구조물", "치수글"}
assert [layer["name"] for layer in layers] == ["구조물", "치수글"]
assert layers[0]["color"] == "#ff0000" # ACI 1
text = next(entity for entity in entities if entity["type"] == "Text")
assert text["shapeData"]["label"] == "배수관 D600"
assert text["shapeData"]["basePoint"] == {"x": 5.0, "y": 50.0}
line = next(entity for entity in entities if entity["type"] == "Line")
assert line["shapeData"]["endPoint"] == {"x": 100.0, "y": 0.0} # 원좌표 그대로
def test_route_returns_entities():
response = client.post("/api/projects/dxf-clip", json={"text": SAMPLE})
assert response.status_code == 200
body = response.json()
assert body["entity_count"] == 4
assert [layer["name"] for layer in body["layers"]] == ["구조물", "치수글"]
def test_route_rejects_broken_text():
response = client.post("/api/projects/dxf-clip", json={"text": " 0\nSECTION\n 2\nENTITIES\n"})
assert response.status_code == 400
assert response.json()["status"] == "error"