오토캐드 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
45 lines
1.9 KiB
Python
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"
|