From 39231d52c1db7001ada294550f56d34b97eceb98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A7=80=EC=98=81?= <본인 이메일m17208.tdc.hanmacgroup@gmail.com> Date: Tue, 20 Oct 2026 10:51:46 +0900 Subject: [PATCH] =?UTF-8?q?BLOCK7=20=EC=9B=90=EB=B3=B8=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=EC=84=A0=EA=B3=BC=20=ED=91=9C=EA=B3=A0=20=EC=9E=AC?= =?UTF-8?q?=EB=B6=84=EC=84=9D=20=EB=B0=8F=20=EB=B6=88=EC=9D=BC=EC=B9=98=20?= =?UTF-8?q?=EA=B8=B0=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + docs/도면분석.md | 108 +++++++++++++++-------------------- public/analysis/단면A.svg | 1 + public/analysis/단면B.svg | 1 + public/analysis/종단검토.svg | 1 + public/analysis/측구상세.svg | 1 + public/analysis/평면검토.svg | 1 + scripts/analyze_dxf.py | 95 ++++++++++++++++++++++++++++++ 8 files changed, 149 insertions(+), 61 deletions(-) create mode 100644 public/analysis/단면A.svg create mode 100644 public/analysis/단면B.svg create mode 100644 public/analysis/종단검토.svg create mode 100644 public/analysis/측구상세.svg create mode 100644 public/analysis/평면검토.svg create mode 100644 scripts/analyze_dxf.py diff --git a/.gitignore b/.gitignore index d70bb9c..80fc43f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ node_modules dist .DS_Store *.local + +docs/extracted/ diff --git a/docs/도면분석.md b/docs/도면분석.md index 7060c27..be400e2 100644 --- a/docs/도면분석.md +++ b/docs/도면분석.md @@ -1,71 +1,57 @@ -# 광터지하차도 BLOCK7 원본 도면 1차 분석 +# BLOCK7 원본 재분석 및 모델 적용 근거 -## 분석 목적과 파일 +원본: `public/drawings/광터지하차도_일반도(BLOCK7).dxf`. 분석 재현: `python3 scripts/analyze_dxf.py`. 이전 문서의 가정과 사용자 지시는 이번 모델의 확정 근거로 사용하지 않는다. -이번 프로젝트는 기존 3D 생성 코드를 가져오지 않고 원본 DXF에서 다시 시작한다. 기존 프로젝트의 분석은 참고 문서(`참고_기존도면분석.md`)에 보관하며, 아래 값은 새 프로젝트에서 원본 DXF를 다시 읽어 확인한 결과다. +## 원본과 도면 연결 -| 항목 | 확인 결과 | 상태 | -|---|---|---| -| 원본 | `public/drawings/광터지하차도_일반도(BLOCK7).dxf` | 보유 | -| 형식/문자 코드 | DXF AC1027, ANSI_949 | 파일 헤더에서 확인 | -| `$INSUNITS` | 0 (미지정) | 단위 미확정. 도면 치수·측점·표고와 대조해 환산 필요 | -| 도면 구성 | 일반도 13번·14번에 평면·상부평면·종단면·단면·상세 포함 | 제목 문자에서 확인 | +- AC1027 DXF이며 본문 문자는 UTF-8로 정상 판독된다. 헤더의 ANSI_949와 달리 CP949로 읽으면 한글이 깨진다. `$INSUNITS=0`은 단위 미지정이다. +- 일반도 13: 평면·상부평면·종단 S=1:100. 일반도 14: A-A/B-B S=1:100, 측구 S=1:30, 시공이음 등 S=1:20. 축척은 표현 축척이며 모델 좌표에 100을 다시 곱하지 않는다. +- 14번 단면 폭 치수열 800+8.750+1.000+8.750+800과 구조선 X 차 20100을 대조하면 CAD 1000단위=1m가 된다. 상·하단 EL 차와 Y 차도 같은 환산에 일치한다. +- A-A/B-B는 제목·상단 EL·하단 EL·동일 X 치수열로 대응시켰다. 단면 측점은 299.000/319.000, 종단면 구조 경계 측점은 299.010/318.990이다. 각각 10mm 어긋나며 신축이음 등 경계 기준의 차이인지 확정되지 않았다. +- 평면의 BLOCK7 표기 주변 CS-CONC-MAJR 선 21835/21836은 각각 20.100m이다. 단면 폭도 20.100m여서 이전 문서의 종방향 중심선 판단은 근거가 부족하다. 선형중심 문자는 (1069233.4121,-81231.4642), (1034233.4121,-81231.4642)에 있으나 대응 엔티티와 절단선은 미확정이다. 이 후보 방향을 모델 중심선으로 적용하지 않는다. +- 상부평면과 평면을 포함한 원본 검토 SVG를 제공한다. SVG는 LINE·TEXT·공동구 LINE 발췌이며 전체 CAD 렌더러가 아니다. 다른 블록·해칭·폴리라인·기호는 원본 DXF에서 확인해야 한다. -## 시트와 축척 +## 적용값 표 -| 도면 | 표기 축척 | 사용할 근거 | -|---|---:|---| -| 일반도 13번 평면도 | 1:100 | 평면 배치와 BLOCK7 선형 후보 확인 | -| 일반도 13번 상부평면도 | 1:100 | 상부 외곽과 평면 배치의 교차 확인 | -| 일반도 13번 종단면도 | 1:100 | 측점, 바닥고, 벽체 상단 EL의 길이방향 기준 | -| 일반도 14번 단면 A-A | 1:100 | 시점 단면의 구조 윤곽·치수·EL | -| 일반도 14번 단면 B-B | 1:100 | 종점 단면의 구조 윤곽·치수·EL | -| 일반도 14번 측구 상세 | 1:30 | 측구 단면과 표기 치수 | -| 일반도 14번 기타 상세 | 1:20 표기 확인 | BLOCK7 적용 대상인지 상세 위치로 대조 전까지 모델에 추가하지 않음 | +| 대상 | 값 | 상태 | 도면 번호·도면 내 위치와 근거 | +|---|---|---|---| +| 구조 경계 측점 | 299.010 / 318.990m | 도면 명시값 | 13 종단, 문자 (1050295.169,-97151.037)/(1073692.169,-97151.037) | +| 경계 사이 거리 | 19.980m | 계산으로 도출한 값 | 위 두 측점 차; 단면 연결에 사용할 경우 배치 확인 필요 | +| 단면 자체 측점 | 299.000 / 319.000m | 도면 명시값 | 14 A-A/B-B 중앙 STA 문자; 종단 경계와 10mm 차이 | +| 단면 원점 X | 1128486.218066491 | 계산으로 도출한 값 | 14 폭 치수 20.100의 양끝 중앙 | +| A-A 상단/하단 | EL 106.675 / 101.636m | 도면 명시값 | 14 A-A 좌측 EL 문자 | +| B-B 상단/하단 | EL 107.307 / 101.069m | 도면 명시값 | 14 B-B 좌측 EL 문자 | +| 상단 CAD Y | A -74271.37855593952 / B -91211.37855593952 | 계산으로 도출한 값 | 14 두 벽체 상단 수평선과 EL 표기의 대응 | +| 벽체 전체 높이 | A 5.039m / B 6.238m | 계산으로 도출한 값 | 각 상·하단 차; 바닥판을 포함한 높이 | +| 종단 상면 표기 | A 102.436 / B 101.869m | 도면 명시값 | 13 종단 좌우 EL 문자 | +| 상면-하단 차 | 0.800m | 계산으로 도출한 값 | 위 종단 EL과 14 하단 EL 차 | +| 폭 치수열 | 0.800+8.750+1.000+8.750+0.800=20.100m | 도면 명시값 | 14 단면 아래 치수열 | +| 가장 바깥 보조선 폭 | 20.300m | 계산으로 도출한 값 | 14 좌표 측정 X=중심±10150; 표기 폭 20.100과 기준이 다름 | +| 횡단경사 | 양쪽 바깥으로 -2% | 도면 명시값・계산으로 도출한 값 | 14 S=-2.000% 및 포장선 X ±0.5→±7.75에서 Y 145mm 하강 / 7250mm | +| 단면 중심 기준 EL | 미확정 | 확인 필요 | 벽체 상단 EL을 도로 중심 EL로 대체하지 않음 | +| 공동구·상부 상세 | 폭 경계 1.000m, 전체 높이 경계 2.100m | 계산으로 도출한 값 | 14 블록 A$C2017021411375356, 로컬 X -500~500/Y -900~1200. 좌표 측정이며 명시 치수 아님 | +| 공동구 좌우 위치 | 중심에서 ±8.750m | 계산으로 도출한 값 | 14 네 INSERT의 X 좌표, 우측은 X반전 | +| 공동구 기준 Y | A -77447.89255584464 / B -95669.3155558447 | 계산으로 도출한 값 | 14 INSERT 원점. 선·반원 전체를 원형대로 변환 | +| 측구 단면 내부 폭 | 0.400m | 계산으로 도출한 값 | 14 단면 CS-CONC-MAJR X ±7.8~±8.2 좌표 측정 | +| 측구 상세 표기 | 50 / 200 등 | 도면 명시값 | 14 측구 상세, S=1:30。단면 내 깊이와 같다고 단정하지 않음 | +| 평면 중심선·단면 방향 | 미확정 | 확인 필요 | 13 평면·상부평면의 절단 위치와 엔티티 대응 미완료 | +| 중간 단면·연장 | 미확정 | 확인 필요 | 두 단면 사이 선형 보간은 별도 가정, 실제 중간 형상 검증 안 됨 | -## 기준 측점·표고·치수 +## 구조선 대조 -| 대상/값 | 값 | 상태 | 근거와 위치 | -|---|---:|---|---| -| A-A 측점 | STA. 0K+299.010 | 도면 명시값 | 일반도 13번 종단면도 시작 측점 및 14번 A-A 대응 | -| B-B 측점 | STA. 0K+318.990 | 도면 명시값 | 일반도 13번 종단면도 끝 측점 및 14번 B-B 대응 | -| A-A~B-B 길이 | 19.980m | 계산으로 도출한 값 | 두 측점 차 `318.990 - 299.010` | -| A-A 벽체 상단/하단 | EL. 106.675 / 101.636 | 도면 명시값 | 일반도 14번 단면 A-A | -| B-B 벽체 상단/하단 | EL. 107.307 / 101.069 | 도면 명시값 | 일반도 14번 단면 B-B | -| A-A 벽체 높이 | 5.039m | 계산으로 도출한 값 | 상·하단 EL 차 | -| B-B 벽체 높이 | 6.238m | 계산으로 도출한 값 | 상·하단 EL 차 | -| 단면 주요 폭 치수열 | 0.800 + 8.750 + 1.000 + 8.750 + 0.800 = 20.100m | 도면 표기값·계산 | 일반도 14번 A-A/B-B 폭 치수. 20.100m가 가장 바깥 CAD 선의 전체 폭과 같은 기준인지는 추가 대조 필요 | -| 종단 별도 구간 표기 | L=19.882m 등 | 확인 필요 | 측점 차 19.980m와 다른 기준점 또는 구간일 수 있어 A-A~B-B 모델 길이로 사용하지 않음 | -| 횡단 경사 | S=-2.000% | 도면 명시값 | 평면·단면 주변 주기. 낮아지는 방향은 도면 방향과 좌표를 교차 확인해야 함 | -| 측구 표기 치수 | 50, 200 (도면 단위 확인 필요) | 도면 명시값/단위 확인 필요 | 일반도 14번 측구 상세. 상세 축척으로 잰 값과 별도 관리 | +각 단면의 X 1118000~1139000, 상단 Y부터 아래 7500·위 100 범위에 양 끝이 들어오는 LINE 중 두 레이어를 추출했다. 이 범위는 주요 단면과 하부 100mm 보조 윤곽을 포함한다. -## 같은 구조물을 도면 간 연결하는 방법 +- A-A/B-B 각각 MAJR 108개 + MINR 6개 = 114개. 기존 90+6 기록에는 하부·벽체 등의 선이 빠져 있었다. +- 각 대응 선의 레이어와 X 끝점이 일치한다. 원본 HANDLE을 모델에 저장해 다시 찾을 수 있다. +- 포장 반복선·겹친 선도 삭제하지 않는다. 반복선을 모두 실제 콘크리트 표면으로 판단하지 않으며 기본 보기에서는 끌 수 있는 별도 그룹이다. +- 좌우 공동구·상부 상세는 블록당 LINE 18개+ARC 2개. 우측 X반전, 각 단면 INSERT Y를 적용한다. 반원은 36분할 표시하므로 현 높이 오차는 약 0.03mm 이하이다. 임의 100mm 벽두께를 만들지 않는다. +- 원본 선 기반 객체 154개(단면 LINE 114쌍, 블록 엔티티 20쌍×좌우). 부재 체적이 아니라 대응 윤곽 객체의 수이다. -- 평면도에서 BLOCK7 표기와 종방향 구조 윤곽 및 단면 절단 표식을 식별한다. -- 평면도 A-A/B-B 위치를 종단면도의 STA. 0K+299.010 / 0K+318.990과 대조한다. -- 해당 측점에 일반도 14번 단면 A-A/B-B를 대응시키고, 상·하단 EL 및 폭 치수를 확인한다. -- 측구 상세는 단면 하부의 측구 후보와 위치·폭·깊이·방향을 비교한 뒤 적용 범위를 확정한다. -- `CS-CONC-MAJR`, `CS-CONC-MINR`는 모델 윤곽 후보 레이어다. 해당 레이어의 선 전부를 구조 경계로 단정하지 않고, 치수선·해칭·중복선 여부를 시트 화면 및 주변 치수와 구분한다. +## 확인 항목과 모델 제한 -## 평면 선형 1차 판독 - -평면도에서 `(BLOCK7)` 표기와 폭 치수열 부근의 `CS-CONC-MAJR` 종방향 선 후보를 찾았다. 후보 끝 좌표는 A-A측 `(1055963.4484, -71293.2356)`, B-B측 `(1056081.6830, -91392.8878)`이고, CAD 좌표 길이는 약 20.100m다. 종단 측점 차 19.980m보다 0.120m 길다. - -이 선은 DXF에서 직선 엔티티로 저장되어 있고, 이 구간을 따라가는 중간 원호나 추가 곡선점을 아직 확인하지 못했다. 따라서 이 선을 실제 평면 선형 중심선으로 확정하지 않는다. 별도의 `선형중심` 문자도 있으나, BLOCK7 구간 후보 및 A-A/B-B 절단 위치와 같은 선을 가리키는지 도면 화면에서 대조가 필요하다. 기존 프로젝트의 모델 방향을 그대로 복사하지 않고 이 대응을 새로 확인한다. - -## 정보 부족·오류 후보 - -- DXF 헤더 단위는 미지정이므로 CAD 좌표를 실제 단위로 그대로 간주할 수 없다. -- 기준선 후보의 길이 20.100m와 측점 차 19.980m가 다르다. 기준점, 선의 종류, 치수 보조선 끝을 확인해야 한다. -- 단면 좌표 범위에는 주 구조선·반복선·상세선이 함께 있어 좌표창만으로 선 개수를 확정할 수 없다. A-A/B-B별 엔티티를 도면 창 기준으로 정밀하게 선별하고 중복·해칭을 판별해야 한다. -- 벽체 상단 EL이 종단면 시작·끝과 단면 A-A/B-B에서 일치하는지 표기 위치별로 최종 대조한다. -- 0.800m 치수의 부재 기준, 공동구 외곽의 상세 적용, 측구의 BLOCK7 구간 연장 범위는 추가 확인이 필요하다. -- 평면 중심선의 곡률 자료가 원본에 없거나 판독되지 않으면 임의 곡선을 만들지 않고 사용자 확인 대상으로 둔다. - -## 다음 모델링 단계 - -1. 평면도에서 BLOCK7 중심선 후보와 A-A/B-B 절단 위치를 화면 및 DXF 엔티티로 확정한다. -2. 단면 A-A/B-B에서 두 콘크리트 레이어를 부재·해칭별로 나누고 실제 윤곽과 치수열을 대조한다. -3. 치수와 근거가 연결된 주요 단면 형상부터 별도 객체로 생성한다. -4. 중간 구간 정보가 없는 표면은 추정 여부를 표시하고, 닫힌 체적처럼 오해되지 않게 한다. -5. 주요 치수·표고·부재 배치를 원도면과 대조하고 결과를 기록한다. +1. 평면 선형중심에 해당하는 엔티티·A/B 절단 위치·중심 EL이 미확정이다. 확인되지 않은 위치·곡률을 도면 확정값으로 만들지 않는다. +2. 단면 자체 측점 20.000m 간격과 종단 구조 경계 19.980m 차이의 원인을 확인해야 한다. +3. 종단 벽체 상단 EL 106.675/107.307은 단면 상단 표기와 각각 일치한다. 도로 중심 EL과의 일치는 검증하지 못했다. +4. 포장 반복선, 하부·외측 보조선의 재료와 체적 경계 해석은 미검증이다. 닫힌 체적·수량 산출용 모델로 해석하지 않는다. +5. 측구 상세 S=1:30은 별도 검토 자료로 제공한다. 단면 측구와의 깊이·시종점 적용은 미확정이며 상세 치수로 단면을 임의 교체하지 않는다. +6. 철근, 지반, 되메우기, 이음 상세의 구간 적용, 재료·정착 상세는 모델링하지 않았다. 공동구 블록의 가는 상부 윤곽은 존재하는 그대로 보존하며 근거 없는 금속 난간을 추가하지 않는다. diff --git a/public/analysis/단면A.svg b/public/analysis/단면A.svg new file mode 100644 index 0000000..c3cdf41 --- /dev/null +++ b/public/analysis/단면A.svg @@ -0,0 +1 @@ +16483 / CS-CNTL16484 / CS-CNTL21420 / CS-CONC-MAJR21421 / CS-CONC-MAJR21422 / CS-CONC-MAJR21423 / CS-CONC-MAJR21424 / CS-CONC-MAJR21425 / CS-CONC-MAJR21426 / CS-CONC-MAJR21427 / CS-CONC-MAJR21428 / CS-CONC-MAJR21429 / CS-CONC-MAJR21430 / CS-CONC-MAJR21431 / CS-CONC-MAJR21432 / CS-CONC-MAJR21433 / CS-CONC-MAJR21434 / CS-CONC-MAJR21435 / CS-CONC-MAJR21436 / CS-CONC-MAJR21437 / CS-CONC-MAJR21438 / CS-CONC-MAJR21439 / CS-CONC-MAJR21440 / CS-CONC-MAJR21441 / CS-CONC-MAJR21442 / CS-CONC-MAJR21443 / CS-CONC-MAJR21444 / CS-CONC-MAJR21445 / CS-CONC-MAJR21446 / CS-CONC-MAJR21447 / CS-CONC-MAJR21448 / CS-CONC-MAJR21449 / CS-CONC-MAJR21450 / CS-CONC-MAJR21451 / CS-CONC-MAJR21452 / CS-CONC-MAJR21453 / CS-CONC-MAJR21454 / CS-CONC-MAJR21455 / CS-CONC-MAJR21456 / CS-CONC-MAJR21457 / CS-CONC-MAJR21458 / CS-CONC-MAJR21459 / CS-CONC-MAJR21460 / CS-CONC-MAJR21461 / CS-CONC-MAJR21462 / CS-CONC-MAJR21463 / CS-CONC-MAJR21464 / CS-CONC-MAJR21465 / CS-CONC-MAJR21466 / CS-CONC-MAJR21467 / CS-CONC-MAJR21468 / CS-CONC-MAJR21469 / CS-CONC-MAJR21470 / CS-CONC-MAJR21471 / CS-CONC-MAJR21472 / CS-CONC-MAJR21473 / CS-CONC-MAJR21474 / CS-CONC-MAJR21475 / CS-CONC-MAJR21476 / CS-CONC-MAJR21477 / CS-CONC-MAJR21478 / CS-CONC-MAJR21479 / CS-CONC-MAJR21480 / CS-CONC-MAJR21481 / CS-CONC-MAJR21482 / CS-CONC-MAJR21483 / CS-CONC-MAJR21484 / CS-CONC-MAJR21485 / CS-CONC-MAJR21486 / CS-CONC-MAJR21487 / CS-CONC-MAJR21488 / CS-CONC-MAJR21489 / CS-CONC-MAJR21490 / CS-CONC-MAJR21491 / CS-CONC-MAJR21492 / CS-CONC-MAJR21493 / CS-CONC-MAJR21494 / CS-CONC-MAJR21495 / CS-CONC-MAJR21496 / CS-CONC-MAJR21497 / CS-CONC-MAJR21498 / CS-CONC-MAJR21499 / CS-CONC-MAJR21500 / CS-CONC-MAJR21501 / CS-CONC-MAJR21502 / CS-CONC-MAJR21503 / CS-CONC-MAJR21504 / CS-CONC-MAJR21505 / CS-CONC-MAJR21506 / CS-CONC-MAJR21507 / CS-CONC-MAJR21508 / CS-CONC-MAJR21509 / CS-CONC-MAJR21510 / CS-CONC-MAJR21511 / CS-CONC-MAJR21512 / CS-CONC-MAJR21513 / CS-CONC-MAJR21514 / CS-CONC-MAJR21515 / CS-CONC-MAJR21516 / CS-CONC-MAJR21517 / CS-CONC-MAJR21518 / CS-CONC-MAJR21519 / CS-CONC-MAJR21524 / CS-CONC-MAJR21525 / CS-CONC-MAJR21526 / CS-CONC-MAJR21527 / CS-CONC-MAJR21528 / CS-CONC-MAJR21529 / CS-CONC-MAJR21530 / CS-CONC-MAJR21531 / CS-CONC-MAJR52859 / CS-DIML52860 / CS-DIML52861 / CS-DIML52862 / CS-DIML52863 / CS-DIML52864 / CS-DIML52865 / CS-DIML52866 / CS-DIML52867 / CS-DIML52868 / CS-DIML52869 / CS-DIML52870 / CS-DIML52871 / CS-DIML52874 / CS-DIML52875 / CS-DIML52876 / CS-DIML52877 / CS-DIML52878 / CS-DIML52879 / CS-DIML52880 / CS-DIML52881 / CS-DIML52882 / CS-DIML52883 / CS-DIML52884 / CS-DIML52885 / CS-DIML52886 / CS-DIML52887 / CS-DIML52888 / CS-DIML52889 / CS-DIML52890 / CS-DIML52891 / CS-DIML52892 / CS-DIML52893 / CS-DIML52894 / CS-DIML52895 / CS-DIML52896 / CS-DIML52897 / CS-DIML52898 / CS-DIML52899 / CS-DIML52900 / CS-DIML52901 / CS-DIML52902 / CS-DIML52905 / CS-DIML52906 / CS-DIML52907 / CS-DIML52908 / CS-DIML52909 / CS-DIML52910 / CS-DIML52911 / CS-DIML52912 / CS-DIML52913 / CS-DIML52914 / CS-DIML52915 / CS-DIML52916 / CS-DIML52917 / CS-DIML52921 / CS-DIML52924 / CS-DIML52925 / CS-DIML52926 / CS-DIML52927 / CS-DIML52928 / CS-DIML52929 / CS-DIML52930 / CS-DIML52931 / CS-DIML52932 / CS-DIML52933 / CS-DIML52937 / CS-DIML52938 / CS-DIML52939 / CS-DIML52940 / CS-DIML52941 / CS-DIML52942 / CS-DIML52943 / CS-DIML52944 / CS-DIML52945 / CS-DIML52946 / CS-DIML52947 / CS-DIML52948 / CS-DIML52949 / CS-DIML52950 / CS-DIML52951 / CS-DIML52952 / CS-DIML52953 / CS-DIML52954 / CS-DIML52955 / CS-DIML52956 / CS-DIML52957 / CS-DIML52958 / CS-DIML52959 / CS-DIML52960 / CS-DIML52961 / CS-DIML52962 / CS-DIML52963 / CS-DIML52964 / CS-DIML52965 / CS-DIML52966 / CS-DIML52967 / CS-DIML52968 / CS-DIML52969 / CS-DIML52970 / CS-DIML52971 / CS-DIML52972 / CS-DIML56185 / CS-SYMB56997 / CS-TEXT56998 / CS-TEXT56999 / CS-TEXT57000 / CS-TEXT57001 / CS-TEXT57002 / CS-TEXT57003 / CS-TEXT57004 / CS-TEXT57005 / CS-TEXT57006 / CS-TEXT57007 / CS-TEXT57008 / CS-TEXT57009 / CS-TEXT57010 / CS-TEXT57011 / CS-TEXT57012 / CS-TEXT57013 / CS-TEXT57014 / CS-TEXT57015 / CS-TEXT57016 / CS-TEXT57017 / CS-TEXT57018 / CS-TEXT57019 / CS-TEXT57020 / CS-TEXT57021 / CS-TEXT57022 / CS-TEXT57023 / CS-TEXT57024 / CS-TEXT57025 / CS-TEXT57026 / CS-TEXT57027 / CS-TEXT57028 / CS-TEXT57029 / CS-TEXT57030 / CS-TEXT57031 / CS-TEXT57032 / CS-TEXT57033 / CS-TEXT57034 / CS-TEXT57035 / CS-TEXT57036 / CS-TEXT57037 / CS-TEXT57038 / CS-TEXT57039 / CS-TEXT57040 / CS-TEXT57041 / CS-TEXT58131 / CS-CONC-MINR58132 / CS-CONC-MINR58133 / CS-CONC-MINR58134 / CS-CONC-MINR58135 / CS-CONC-MINR58136 / CS-CONC-MINR15CED9 / CS-DIMLS=-2.000%800500800S=-2.000%8003.0841.1551008008.7501.0008.75080020.1005008.7501.0008.75050019.500100100EL. 106.675EL. 101.636STA. 0K+299.000EL. 102.7431.0001001008003.2391.0005.0398003.2391.0005.039S=1:100fck = 15 Mpa버림콘크리트 \ No newline at end of file diff --git a/public/analysis/단면B.svg b/public/analysis/단면B.svg new file mode 100644 index 0000000..1413028 --- /dev/null +++ b/public/analysis/단면B.svg @@ -0,0 +1 @@ +16485 / CS-CNTL16486 / CS-CNTL21624 / CS-CONC-MAJR21625 / CS-CONC-MAJR21626 / CS-CONC-MAJR21627 / CS-CONC-MAJR21628 / CS-CONC-MAJR21629 / CS-CONC-MAJR21630 / CS-CONC-MAJR21631 / CS-CONC-MAJR21632 / CS-CONC-MAJR21633 / CS-CONC-MAJR21634 / CS-CONC-MAJR21635 / CS-CONC-MAJR21636 / CS-CONC-MAJR21637 / CS-CONC-MAJR21638 / CS-CONC-MAJR21639 / CS-CONC-MAJR21640 / CS-CONC-MAJR21641 / CS-CONC-MAJR21642 / CS-CONC-MAJR21643 / CS-CONC-MAJR21644 / CS-CONC-MAJR21645 / CS-CONC-MAJR21646 / CS-CONC-MAJR21647 / CS-CONC-MAJR21648 / CS-CONC-MAJR21649 / CS-CONC-MAJR21650 / CS-CONC-MAJR21651 / CS-CONC-MAJR21652 / CS-CONC-MAJR21653 / CS-CONC-MAJR21654 / CS-CONC-MAJR21655 / CS-CONC-MAJR21656 / CS-CONC-MAJR21657 / CS-CONC-MAJR21658 / CS-CONC-MAJR21659 / CS-CONC-MAJR21660 / CS-CONC-MAJR21661 / CS-CONC-MAJR21662 / CS-CONC-MAJR21663 / CS-CONC-MAJR21664 / CS-CONC-MAJR21665 / CS-CONC-MAJR21666 / CS-CONC-MAJR21667 / CS-CONC-MAJR21668 / CS-CONC-MAJR21669 / CS-CONC-MAJR21670 / CS-CONC-MAJR21671 / CS-CONC-MAJR21672 / CS-CONC-MAJR21673 / CS-CONC-MAJR21674 / CS-CONC-MAJR21675 / CS-CONC-MAJR21676 / CS-CONC-MAJR21677 / CS-CONC-MAJR21678 / CS-CONC-MAJR21679 / CS-CONC-MAJR21680 / CS-CONC-MAJR21681 / CS-CONC-MAJR21682 / CS-CONC-MAJR21683 / CS-CONC-MAJR21684 / CS-CONC-MAJR21685 / CS-CONC-MAJR21686 / CS-CONC-MAJR21687 / CS-CONC-MAJR21688 / CS-CONC-MAJR21689 / CS-CONC-MAJR21690 / CS-CONC-MAJR21691 / CS-CONC-MAJR21692 / CS-CONC-MAJR21693 / CS-CONC-MAJR21694 / CS-CONC-MAJR21695 / CS-CONC-MAJR21696 / CS-CONC-MAJR21697 / CS-CONC-MAJR21698 / CS-CONC-MAJR21699 / CS-CONC-MAJR21700 / CS-CONC-MAJR21701 / CS-CONC-MAJR21702 / CS-CONC-MAJR21703 / CS-CONC-MAJR21704 / CS-CONC-MAJR21705 / CS-CONC-MAJR21706 / CS-CONC-MAJR21707 / CS-CONC-MAJR21708 / CS-CONC-MAJR21709 / CS-CONC-MAJR21710 / CS-CONC-MAJR21711 / CS-CONC-MAJR21712 / CS-CONC-MAJR21713 / CS-CONC-MAJR21714 / CS-CONC-MAJR21715 / CS-CONC-MAJR21716 / CS-CONC-MAJR21717 / CS-CONC-MAJR21718 / CS-CONC-MAJR21719 / CS-CONC-MAJR21720 / CS-CONC-MAJR21721 / CS-CONC-MAJR21722 / CS-CONC-MAJR21723 / CS-CONC-MAJR21728 / CS-CONC-MAJR21729 / CS-CONC-MAJR21730 / CS-CONC-MAJR21731 / CS-CONC-MAJR21732 / CS-CONC-MAJR21733 / CS-CONC-MAJR21734 / CS-CONC-MAJR21735 / CS-CONC-MAJR52973 / CS-DIML52974 / CS-DIML52975 / CS-DIML52976 / CS-DIML52977 / CS-DIML52978 / CS-DIML52979 / CS-DIML52980 / CS-DIML52981 / CS-DIML52982 / CS-DIML52983 / CS-DIML52984 / CS-DIML52985 / CS-DIML52988 / CS-DIML52989 / CS-DIML52990 / CS-DIML52991 / CS-DIML52992 / CS-DIML52993 / CS-DIML52994 / CS-DIML52995 / CS-DIML52996 / CS-DIML52997 / CS-DIML52998 / CS-DIML52999 / CS-DIML53000 / CS-DIML53001 / CS-DIML53002 / CS-DIML53003 / CS-DIML53004 / CS-DIML53005 / CS-DIML53006 / CS-DIML53007 / CS-DIML53008 / CS-DIML53009 / CS-DIML53010 / CS-DIML53011 / CS-DIML53012 / CS-DIML53013 / CS-DIML53014 / CS-DIML53015 / CS-DIML53016 / CS-DIML53019 / CS-DIML53020 / CS-DIML53021 / CS-DIML53022 / CS-DIML53023 / CS-DIML53024 / CS-DIML53025 / CS-DIML53026 / CS-DIML53027 / CS-DIML53028 / CS-DIML53029 / CS-DIML53030 / CS-DIML53031 / CS-DIML53035 / CS-DIML53038 / CS-DIML53039 / CS-DIML53040 / CS-DIML53041 / CS-DIML53042 / CS-DIML53043 / CS-DIML53044 / CS-DIML53045 / CS-DIML53046 / CS-DIML53047 / CS-DIML53051 / CS-DIML53052 / CS-DIML53053 / CS-DIML53054 / CS-DIML53055 / CS-DIML53056 / CS-DIML53057 / CS-DIML53058 / CS-DIML53059 / CS-DIML53060 / CS-DIML53061 / CS-DIML53062 / CS-DIML53063 / CS-DIML53064 / CS-DIML53065 / CS-DIML53066 / CS-DIML53067 / CS-DIML53068 / CS-DIML53069 / CS-DIML53070 / CS-DIML53071 / CS-DIML53072 / CS-DIML53073 / CS-DIML53074 / CS-DIML53075 / CS-DIML53076 / CS-DIML53077 / CS-DIML53078 / CS-DIML53079 / CS-DIML53080 / CS-DIML53081 / CS-DIML53082 / CS-DIML53083 / CS-DIML53084 / CS-DIML53085 / CS-DIML53086 / CS-DIML56186 / CS-SYMB57042 / CS-TEXT57043 / CS-TEXT57044 / CS-TEXT57045 / CS-TEXT57046 / CS-TEXT57047 / CS-TEXT57048 / CS-TEXT57049 / CS-TEXT57050 / CS-TEXT57051 / CS-TEXT57052 / CS-TEXT57053 / CS-TEXT57054 / CS-TEXT57055 / CS-TEXT57056 / CS-TEXT57057 / CS-TEXT57058 / CS-TEXT57059 / CS-TEXT57060 / CS-TEXT57061 / CS-TEXT57062 / CS-TEXT57063 / CS-TEXT57064 / CS-TEXT57065 / CS-TEXT57066 / CS-TEXT57067 / CS-TEXT57068 / CS-TEXT57069 / CS-TEXT57070 / CS-TEXT57071 / CS-TEXT57072 / CS-TEXT57073 / CS-TEXT57074 / CS-TEXT57075 / CS-TEXT57076 / CS-TEXT57077 / CS-TEXT57078 / CS-TEXT57079 / CS-TEXT57080 / CS-TEXT57081 / CS-TEXT57082 / CS-TEXT57083 / CS-TEXT57084 / CS-TEXT57085 / CS-TEXT57086 / CS-TEXT58137 / CS-CONC-MINR58138 / CS-CONC-MINR58139 / CS-CONC-MINR58140 / CS-CONC-MINR58141 / CS-CONC-MINR58142 / CS-CONC-MINR15CEDE / CS-DIMLS=-2.000%1.1554.283800800500800S=-2.000%1001.000EL. 102.094STA. 0K+319.000EL. 101.069EL. 107.30710010019.5005008.7501.0008.75050020.1008008.7501.0008.7508001001008004.4381.0006.2388004.4381.0006.238단면 B-BS=1:100fck = 15 Mpa버림콘크리트 \ No newline at end of file diff --git a/public/analysis/종단검토.svg b/public/analysis/종단검토.svg new file mode 100644 index 0000000..0b25c43 --- /dev/null +++ b/public/analysis/종단검토.svg @@ -0,0 +1 @@ +21828 / CS-CONC-MAJR21829 / CS-CONC-MAJR21830 / CS-CONC-MAJR21831 / CS-CONC-MAJR21832 / CS-CONC-MAJR21833 / CS-CONC-MAJR53087 / CS-DIML53088 / CS-DIML53089 / CS-DIML53090 / CS-DIML53091 / CS-DIML53092 / CS-DIML53093 / CS-DIML53094 / CS-DIML53095 / CS-DIML53096 / CS-DIML53097 / CS-DIML53098 / CS-DIML53099 / CS-DIML53100 / CS-DIML53101 / CS-DIML53102 / CS-DIML53103 / CS-DIML53104 / CS-DIML53105 / CS-DIML53106 / CS-DIML53107 / CS-DIML53108 / CS-DIML53109 / CS-DIML53110 / CS-DIML53111 / CS-DIML53112 / CS-DIML53113 / CS-DIML53114 / CS-DIML53115 / CS-DIML53116 / CS-DIML53117 / CS-DIML53118 / CS-DIML53119 / CS-DIML53120 / CS-DIML53121 / CS-DIML53122 / CS-DIML53123 / CS-DIML53124 / CS-DIML53125 / CS-DIML53126 / CS-DIML53127 / CS-DIML53128 / CS-DIML53129 / CS-DIML53130 / CS-DIML53131 / CS-DIML53132 / CS-DIML53133 / CS-DIML53134 / CS-DIML53135 / CS-DIML56021 / CS-NOTE56022 / CS-NOTE56023 / CS-NOTE56024 / CS-NOTE58143 / CS-CONC-MINRfck = 15 Mpa(Block7)8004.2395.039EL. 106.675EL. 102.436EL. 107.307EL. 101.869신축이음1019.98010STA. 0K+318.990신축이음STA. 0K+299.010신축이음버림콘크리트\A1;구체 콘크리트\A1;\A1;fck = 24 MPa종단면도S=1:100 \ No newline at end of file diff --git a/public/analysis/측구상세.svg b/public/analysis/측구상세.svg new file mode 100644 index 0000000..2d63d4a --- /dev/null +++ b/public/analysis/측구상세.svg @@ -0,0 +1 @@ +15CFB8 / CS-DIML15CFBA / CS-DIML15CFBD / CS-DIML15CFBF / CS-DIML15CFC0 / CS-DIML15CFC1 / CS-DIML15CFC2 / CS-DIML15CFC3 / CS-DIML5010050200측구 상세 \ No newline at end of file diff --git a/public/analysis/평면검토.svg b/public/analysis/평면검토.svg new file mode 100644 index 0000000..32b45b9 --- /dev/null +++ b/public/analysis/평면검토.svg @@ -0,0 +1 @@ +21834 / CS-CONC-MAJR21835 / CS-CONC-MAJR21836 / CS-CONC-MAJR21837 / CS-CONC-MAJR53136 / CS-DIML53137 / CS-DIML53138 / CS-DIML53139 / CS-DIML53140 / CS-DIML53141 / CS-DIML53142 / CS-DIML53143 / CS-DIML53144 / CS-DIML53145 / CS-DIML53146 / CS-DIML53147 / CS-DIML53148 / CS-DIML53149 / CS-DIML53150 / CS-DIML53151 / CS-DIML53152 / CS-DIML53153 / CS-DIML53154 / CS-DIML53155 / CS-DIML53156 / CS-DIML53157 / CS-DIML53158 / CS-DIML53159 / CS-DIML53160 / CS-DIML53161 / CS-DIML53162 / CS-DIML53163 / CS-DIML53164 / CS-DIML53165 / CS-DIML53166 / CS-DIML53167 / CS-DIML53168 / CS-DIML53169 / CS-DIML53170 / CS-DIML53171 / CS-DIML53172 / CS-DIML53173 / CS-DIML53174 / CS-DIML53175 / CS-DIML53176 / CS-DIML53177 / CS-DIML53178 / CS-DIML53179 / CS-DIML53180 / CS-DIML53181 / CS-DIML53182 / CS-DIML53183 / CS-DIML53184 / CS-DIML53185 / CS-DIML53186 / CS-DIML53187 / CS-DIML53188 / CS-DIML53189 / CS-DIML53190 / CS-DIML53191 / CS-DIML53192 / CS-DIML53193 / CS-DIML53194 / CS-DIML53195 / CS-DIML53196 / CS-DIML53197 / CS-DIML53198 / CS-DIML53199 / CS-DIML53200 / CS-DIML53201 / CS-DIML53202 / CS-DIML53203 / CS-DIML53204 / CS-DIML53205 / CS-DIML53206 / CS-DIML53207 / CS-DIML53208 / CS-DIML53209 / CS-DIML53210 / CS-DIML53211 / CS-DIML53212 / CS-DIML53213 / CS-DIML53214 / CS-DIML53215 / CS-DIML53216 / CS-DIML53217 / CS-DIML53218 / CS-DIML53219 / CS-DIML53220 / CS-DIML53221 / CS-DIML53222 / CS-DIML53223 / CS-DIML53224 / CS-DIML53225 / CS-DIML53226 / CS-DIML53227 / CS-DIML53228 / CS-DIML53229 / CS-DIML53230 / CS-DIML53231 / CS-DIML53232 / CS-DIML53233 / CS-DIML53234 / CS-DIML53235 / CS-DIML53236 / CS-DIML53237 / CS-DIML53238 / CS-DIML53239 / CS-DIML53240 / CS-DIML53241 / CS-DIML53242 / CS-DIML53243 / CS-DIML53244 / CS-DIML53245 / CS-DIML53246 / CS-DIML53247 / CS-DIML53248 / CS-DIML53249 / CS-DIML56025 / CS-NOTE56026 / CS-NOTE56027 / CS-NOTE56028 / CS-NOTE56029 / CS-NOTE56030 / CS-NOTE56031 / CS-NOTE56032 / CS-NOTE56033 / CS-NOTE56034 / CS-NOTE56035 / CS-NOTE56036 / CS-NOTE56037 / CS-NOTE56038 / CS-NOTE56039 / CS-NOTE56040 / CS-NOTE선형중심선형중심8008.7501.0008.7508008008.7501.0008.750800S=-2.000%S=-2.000%신축이음STA. 0K+319.000(L=20.118m)(BLOCK7)20.098(BLOCK7)1019.5005008.7501.0008.7505005008.7501.0008.75050019.500S=-2.000%S=-2.000%U-Type 구간U-Type 구간(L=19.882m)1019.862신축이음STA. 0K+319.000(L=20.118m)10101010(BLOCK7)U-Type 구간U-Type 구간20.098STA. 0K+299.000신축이음STA. 0K+299.000신축이음19.86210(L=19.882m)10(BLOCK7)상부평면도평면도S=1:100S=1:100\A1;\A1;fck = 24 MPa\A1;구체 콘크리트\A1;\A1;fck = 24 MPa\A1;구체 콘크리트\A1;\A1;fck = 24 MPa\A1;구체 콘크리트\A1;\A1;fck = 24 MPa\A1;구체 콘크리트종단면도 \ No newline at end of file diff --git a/scripts/analyze_dxf.py b/scripts/analyze_dxf.py new file mode 100644 index 0000000..0b50134 --- /dev/null +++ b/scripts/analyze_dxf.py @@ -0,0 +1,95 @@ +import json,pathlib,collections,math +ROOT=pathlib.Path(__file__).resolve().parents[1] +raw=(ROOT/'public/drawings/광터지하차도_일반도(BLOCK7).dxf').read_text(encoding='utf8',errors='replace').splitlines() +pairs=[(int(raw[i].strip()),raw[i+1].strip()) for i in range(0,len(raw)-1,2)] +entities=[]; current=None; section=''; block=None; blocks={} +for code,value in pairs: + if code==0: + if current: + if section=='ENTITIES': entities.append(current) + elif section=='BLOCKS' and block and current['type'] not in ('BLOCK','ENDBLK'): blocks.setdefault(block,[]).append(current) + current={'type':value,'data':[]} + if value=='ENDBLK': block=None + elif current: + current['data'].append((code,value)) + if current['type']=='SECTION' and code==2: section=value + if current['type']=='BLOCK' and code==2: block=value + +def get(e,c,d=None): return next((v for k,v in e['data'] if k==c),d) +def point(e,c=10): return [float(get(e,c,0)),float(get(e,c+10,0))] +def layer(e): return get(e,8,'') +out=ROOT/'docs/extracted';out.mkdir(exist_ok=True) +texts=[{'text':get(e,1,''),'p':point(e),'layer':layer(e)} for e in entities if e['type'] in ('TEXT','MTEXT')] +lines=[{'a':point(e),'b':point(e,11),'layer':layer(e),'handle':get(e,5)} for e in entities if e['type']=='LINE'] +for name,data in [('texts',texts),('lines',lines),('blocks',blocks),('inserts',[{'name':get(e,2),'p':point(e),'sx':get(e,41,'1'),'sy':get(e,42,'1'),'rotation':get(e,50,'0'),'layer':layer(e)} for e in entities if e['type']=='INSERT'])]: + (out/(name+'.json')).write_text(json.dumps(data,ensure_ascii=False,indent=2),encoding='utf8') +print('Entities',collections.Counter(e['type'] for e in entities)) +for t in texts: + if any(s in t['text'] for s in ('BLOCK7','106.675','107.307','101.636','101.069','102.436','101.869','299.010','318.990','선형','측구','20.100')): print(t) +for name,top in [('A',-74271),('B',-91211)]: + selected=[l for l in lines if l['layer'] in ('CS-CONC-MAJR','CS-CONC-MINR') and all(1118000{l["handle"]} / {l["layer"]}') + for t in texts: + x,y=t['p'] + if x0{html.escape(t["text"])}') + # 공동구 삽입 블록의 실제 선 포함 + for e in entities: + if e['type']=='INSERT' and get(e,2)==ductName: + x,y=point(e);sx=float(get(e,41,1));sy=float(get(e,42,1)) + if x0') + svg=f''+''.join(content)+'' + (previewDir/(title+'.svg')).write_text(svg,encoding='utf8') +print('모델 추출:',len(parts),'객체. 단면 원본 선 114쌍, 공동구 20쌍 × 좌우.')