"""B07 DXF 붙여넣기 — 클립보드 DXF 글 · 끌어다 놓은 DXF·DWG 파일 → 웹 CAD 엔티티 · 도면층.""" from pathlib import Path from fastapi import FastAPI from fastapi.testclient import TestClient import io import ezdxf from B07_DesignDetail.B07_DesignDetail_Engine_Frame_Import import ( dxf_text_to_entities, import_frame_file, ) 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_bylayer_color_is_layer_color(): """488 — BYLAYER 도형 = 레이어 색(B07 붙이기 · M02 불러오기 같은 길) · 제 색은 그대로.""" document = ezdxf.new() document.layers.add("빨강", color=1) space = document.modelspace() space.add_line((0, 0), (10, 0), dxfattribs={"layer": "빨강"}) # 색 = BYLAYER(256) space.add_line((0, 5), (10, 5), dxfattribs={"layer": "빨강", "color": 3}) buffer = io.StringIO() document.write(buffer) text = buffer.getvalue() for entities in ( dxf_text_to_entities(text)[0], import_frame_file("a.dxf", text.encode("utf-8")), ): assert [entity["lineColor"] for entity in entities] == ["#ff0000", "#00ff00"] 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" # 끌어다 놓기 — 오토캐드 WBLOCK(DWG) · DXFOUT(DXF) 로 저장한 파일 DWG = Path("resources/knowledge/original/경쟁사 프로그램/오솔길/OSK_sym/REpyo.dwg") def test_file_route_reads_dxf(): response = client.post( "/api/projects/dxf-clip/file", files={"file": ("클립.dxf", SAMPLE.encode("utf-8"), "application/octet-stream")}, ) assert response.status_code == 200 body = response.json() assert body["entity_count"] == 4 assert [layer["name"] for layer in body["layers"]] == ["구조물", "치수글"] def test_file_route_reads_dwg(): response = client.post( "/api/projects/dxf-clip/file", files={"file": (DWG.name, DWG.read_bytes(), "application/octet-stream")}, ) assert response.status_code == 200 assert response.json()["entity_count"] > 0 def test_file_route_explains_unreadable(): wrong = client.post("/api/projects/dxf-clip/file", files={"file": ("a.pdf", b"%PDF", "x")}) assert wrong.status_code == 400 assert "DXF 또는 DWG" in wrong.json()["message"] newer = client.post( "/api/projects/dxf-clip/file", files={"file": ("a.dwg", b"AC1035" + b"\0" * 64, "x")} ) assert newer.status_code == 400 assert "AutoCAD 2018 DWG 또는 DXF" in newer.json()["message"]