# 45B 제관 3D 모델 제작보고

> 대상: 에버다임 45B 메인프레임 용접 어셈블리 **RD202-0008 (P00 개정)**
> 작성: 2026-09-14 / Claude Code (백그라운드 저우선 작업)
> 산출물 위치: `E:\도진팩토리\3D스캔및티칭시스템\fab_models\_45B_제작중\` (이 폴더 밖으로 나간 파일 없음)
> **제관웹 통합은 하지 않았다.** 500PRO 빌드 담당이 나중에 통합한다.

---

## 0. 한 줄 요약

45B 메인프레임 절단도면 177장에서 **부재 84개의 3D 모델(OBJ)** 을 만들었다.
84개 전부 "닫힌 입체(watertight) + 도면 두께와 실제 두께 일치 + 부피 > 0" 검사를 통과했다.
**조립 좌표(어디에 붙는가)는 만들지 않았다 — 부재들은 나란히 놓여 있을 뿐이다. [CEO확인]**

---

## 1. 도면 조사 결과 (무엇을 찾았고 무엇을 골랐나)

### 고른 것 — 45B 메인프레임 발주도 한 세트
```
E:\06_고객사데이터\설우기계\공유문서\2019에버다임\5_ECD45B_RD202-0001
  \23.08 ECD45B T450G MAIN FRAME P개정 수정
    \20230814_RD202-0008_P00 MAINFRAME WELD ASSY\
        ├ 0_EBOM_RD202-0008_P00.xlsm   ← 공식 자재표(항번=자재번호)
        ├ RD202-0008_P00_1/2/3.dwg     ← 조립도
        └ 도번별 단품도 .dwg × 약 174장
```
같은 파일들이 **이미 DXF 로 변환되어** 아래에 있어서 그대로 읽었다
(변환 파이프라인은 다른 작업이 돌고 있어 **건드리지 않았다** — 읽기만 했다):
```
F:\_DWG_TO_DXF\설우\공유문서\2019에버다임\5_ECD45B_RD202-0001
  \23.08 ECD45B T450G MAIN FRAME P개정 수정
    \20230814_RD202-0008_P00 MAINFRAME WELD ASSY\*.dxf   (177개)
```

### 왜 이걸 골랐나
45B 제관공정서(`E:\VLA시스템\...\45B_프레임\메인프레임(RD202-0008)\메인프레임(RD202-0008)가접\45B_제관공정서.md`)
가 다루는 제품이 바로 **RD202-0008** 이다. 공정서와 도면이 같은 물건을 가리켜야 조립순서를 이을 수 있다.

### 안 고른 것 (참고용으로만 확인)
| 파일 | 왜 안 썼나 |
|---|---|
| `45B RD202-0012(설변)-세종.dxf`, `45B RD202-0015(설변)-세종.dxf`, `45B D-18010903(설변)-세종.dxf`, `(05.20)45B RB202-0154.dxf` (`에버다임 프레임\5_ECD45B_RD202-0001\`) | 부재 1개짜리 설변 낱장. 같은 도번이 위 P00 세트 안에 이미 들어 있다 |
| `RD202-0008_R00 45B MAINFRAME.pdf` (24.05 R00 개정) | **PDF 뿐이라 3D 로 못 만든다.** R00 이 P00 보다 최신 개정이다 → **[CEO확인] 아래 5절 참조** |
| `RD202-0001_H00/J00/N00/P00 assy` PDF 다수 | 상위 어셈블리 조립도, 역시 PDF |

---

## 2. 어떻게 만들었나 (기존 파이프라인 그대로 사용)

기존 도구 `E:\도진팩토리\3D스캔및티칭시스템\dwg2obj\` 를 썼다. **새 파이프라인을 만들지 않았다.**

| 단계 | 무엇을 했나 |
|---|---|
| `product.py` | 45B 제품 항목 **추가만** 했다 (아래 4절) |
| **입력 어댑터** (신규, 내 임시폴더) | `pass1_index.py`+`pass2_lines.py` 자리를 대신한다. 이유는 아래 |
| `pass6_multi.py` | **한 글자도 안 고치고** 그대로 실행 (외곽 추출 → 압출 → OBJ) |
| `add_manifest.py` | **한 글자도 안 고치고** 그대로 실행 (manifest_45b.json 작성) |

### 입력 어댑터가 왜 필요했나 (형식 문제이지 알고리즘 문제가 아니다)
1. 기존 pass1/pass2 는 **"발주도 모음 DXF 파일 1개"** 를 전제로 한다.
   45B 는 **도번 1개당 파일 1개, 177개**로 쪼개져 있다.
2. 45B DXF 는 부재 윤곽선이 도면 본문(modelspace)이 아니라 **INSERT 블록 안**에 들어 있다.
   - 실측 근거: 177개 파일 전부 modelspace 의 LINE 개수가 **138~140 으로 일정** → 그게 도면틀이다.
     부재 선분은 블록을 펼쳐야(`virtual_entities()`) 나온다. 안 펼치면 도면틀만 읽힌다.

어댑터는 177개 파일의 블록을 펼쳐 격자로 흩어 놓아 **"발주도 모음 한 장"과 같은 모양의 색인**을 만든다.
그 뒤 형상 판정·압출·검증은 전부 손대지 않은 `pass6_multi.py` 가 한다.
어댑터 위치: `<임시폴더>\45b_adapter.py` (실행 기록·중간산출물도 임시폴더에 보존)

### 두께는 어디서 왔나 (근거 없는 숫자 안 씀)
| 출처 | 도번 수 | 내용 |
|---|---|---|
| **EBOM** `0_EBOM_RD202-0008_P00.xlsm` 속성칸 | 15 | `PL12`, `PL3.2` 등 공식값. 최상위 항번이라 우선 적용 |
| **도면 안 부품표 행** | 75 | 하위 어셈블리 도면에 그려진 부품표에서 *같은 행·도번 오른쪽*의 `PLxx` 를 읽음 |
| 합계 | **90** | 두 값이 충돌한 도번 **0개** (충돌하면 아예 안 쓰도록 했다) |

※ 형강(ㄷ형강 등) 단면 생성 패스(`pass9_channel.py`)는 **돌리지 않았다.** EBOM 에 형강 단면 규격이
없어서, 억지로 넣으면 틀린 형상이 나온다.

---

## 3. 재현율 — 숫자와 그 뜻

분모를 무엇으로 잡느냐에 따라 셋으로 나눠 보고한다. (하나만 쓰면 오해를 부른다)

| 기준 | 값 | 뜻 |
|---|---|---|
| **두께 근거가 확보된 부재 대비** | **84 / 90 = 93.3%** | 만들 수 있는 조건이 갖춰진 것 중 실제로 만든 비율 |
| 도번이 인식된 DXF 대비 | 84 / 176 = 47.7% | 나머지 86개는 두께 근거가 없어 시도조차 안 함 |
| EBOM 최상위 항번 대비 | 11 / 30 = 36.7% | 최상위 30항번 중 19개가 하위 어셈블리(`도중참조`)·볼트라 단품 판재가 아님 |

**만든 부품 수: 84개** (`*.obj` 84개, `manifest_45b.json` 항목 84개 — 개수 일치 확인)
총 부피 합계 106.2 L

### 검증 결과 (형상 확인 — 실제로 되읽어서 쟀다)
trimesh 로 84개 전부 되읽어 검사:
- watertight(닫힌 입체) : **84 / 84**
- 도면 두께 == 실제 모델 두께 : **84 / 84** (오차 0.02mm 이내)
- 부피 > 0 : **84 / 84**
- **이상 0건**

검사 원자료: `<임시폴더>\45b\verify_report.json` (파일별 정점·면·부피·치수)

### 중복 형상 검사 (같은 모양이 두 번 나오지 않았는가)
84개의 정점 전체를 해시로 대조했다. **완전히 같은 형상은 1쌍뿐**이다.
- `RD102-0008` / `RD102-0009`, `RC802-0003` / `RC802-0004`, `RD102-0058` / `RB702-0285` 는
  크기는 비슷하지만 **형상이 서로 다르다** → 정상.
- ⚠ **`D-19010207` 와 `D-19010305` 는 정점까지 완전히 같다** (255 × 117 × 12).
  두 도번은 좌/우 트랙서포트 어셈블리(D-19010200 계열 / D-19010300 계열)에 각각 속한다.
  **원본 DXF 두 개는 서로 다르다**(선분 배치·도면 크기가 다름). 그런데 결과가 같게 나왔다.
  → 좌우 대칭이라 실제로 같은 판일 수도 있고, 둘 중 하나가 도면 안의 **다른 뷰를 잡았을 수도** 있다.
  현재 자료로는 구분이 안 된다 → **[CEO확인] (아래 5절 7번)**

예시
| 파일 | 정점 | 면 | 닫힘 | 크기(mm) |
|---|---|---|---|---|
| e45b_D_18010202.obj | 1026 | 2060 | True | 1405.5 × 635.0 × **19.0** |
| e45b_D_18010116.obj | 1364 | 2744 | True | 1090.0 × 310.0 × **9.0** |
| e45b_RD102_0032.obj | — | — | True | 440.0 × 500.0 × **16.0** (홀 18개) |

---

## 4. 공유 파일을 건드린 곳 — 딱 한 군데

`E:\도진팩토리\3D스캔및티칭시스템\dwg2obj\product.py` 에 **`'45b'` 항목을 추가**했다.

- **순수 추가**다. 500PRO / 400Q / D800 / T600 항목의 값은 **한 글자도 바꾸지 않았다.**
- 이 파일은 원래 "제품을 갈아끼우라고" 만들어진 파일이다(파일 자체 설명문에 그렇게 적혀 있고,
  400Q·D800·T600 이 똑같은 방식으로 추가됐다).
- 출력 폴더를 `out_subdir='_45B_제작중'` 으로 지정 → **500PRO 산출물과 섞이지 않는다.**
- 수정 전 원본 백업: `<임시폴더>\product.py.bak_before45b`
- (부수적으로 `dwg2obj\__pycache__\` 의 컴파일 캐시가 자동 갱신됐다. 코드가 아니라 파이썬이
  만드는 임시물이라 내용상 변경은 아니지만, 검토 시 보일 것이므로 적어 둔다.)

**확인함: `fab_models` 폴더에서 이번 작업으로 새로 생기거나 바뀐 것은 `_45B_제작중\` 폴더뿐이다.
500PRO 관련 파일·빌드는 읽지도 쓰지도 않았다.**

---

## 5. [CEO확인] 목록 — 판단이 필요한 것

1. **★ 부품 배치(조립 좌표)를 안 만들었다.**
   84개 OBJ 는 각자 자기 원점에 놓인 **낱개 부재**다. 프레임 어디에 붙는지 좌표가 없다.
   조립도(`RD202-0008_P00_1/2/3.dwg`)에서 좌표를 뽑는 작업은 **하지 않았다**(지시대로 배치는 보류).
   → 배치를 진행할지, 한다면 조립도 기준인지 현장 기준인지 지시 필요.

2. **★ 개정 버전이 최신이 아닐 수 있다.**
   쓴 도면은 **P00 (2023.08)** 이다. 그런데 폴더에 **R00 (2024.05) 개정**이 있다
   (`24.05 ECD45B RD202-0008 R00 개정 도면`). R00 은 **PDF 만 있고 DWG/DXF 가 없어서** 못 썼다.
   변경사항 정리 txt 는 있다(`24.05 45B RD202-0008 R00 개정 변경사항 정리.txt`).
   → R00 원본 CAD 를 발주처에서 받을지, P00 으로 진행할지 결정 필요.

3. **공정서 13단계 중 부재 도번이 특정된 단계는 2개뿐이다.**
   공정서 §2 자체가 5~10단계(오후가접 1~6)를 `[확인요청]`으로 비워 두고 있다.
   "자재1번→7번→9번→12번" 식의 완전한 순서는 **현재 자료로는 만들 수 없다.**
   → CEO 구술로 채워야 한다.

4. **EBOM 항번 26개가 어느 단계에 붙는지 모른다.** (조립순서 json 의 `미배치_EBOM항번`)

5. **EBOM 항번이 30개다.** 기존 공정서 §1 은 "32개 항목"이라 적혀 있는데, 이는 `ai_analysis`
   출처(추론값)였다. 실제 파일을 세면 **항번 30개**(번호 13·24 결번, 최대 번호 32)다.
   → 공정서 §1 의 "32개" 표기 수정 필요.

6. **배터리박스 도번 미확인** (공정서 13단계에 등장하나 EBOM 에 해당 품명 없음)

7. **`D-19010207` / `D-19010305` 가 완전히 같은 형상으로 나왔다** (255 × 117 × 12).
   원본 도면 두 개는 서로 다른데 결과가 같다. 좌/우 트랙서포트의 대칭 판이라 원래 같은 것인지,
   아니면 둘 중 하나가 도면 속 다른 뷰를 잡은 것인지 **도면을 직접 봐야 판별된다.**
   → 이 2개는 "만들어졌지만 신뢰도 보류"로 본다.

---

## 6. 누락 부품과 그 이유 (전부 사유 기재 — "그냥 실패" 없음)

### 6-1. 두께 근거가 없어 시도조차 못 한 것 — 86개
| 구분 | 수 | 이유 |
|---|---|---|
| 하위 어셈블리(`도중참조`) | 12 | EBOM 재질칸이 "도중참조" = 용접 어셈블리라 단일 판재 두께가 없다. 자체 BOM 파일이 폴더에 없음 |
| 두께 표기 없음 | 74 | EBOM 32항번에도 없고(하위 어셈블리의 부속품), 도면 부품표에도 그 도번의 `PL` 행이 없음. 변환된 DXF 의 표제란 값칸이 비어 있는 경우가 많음(원본 DWG 의 OLE 개체 안에 있는 것으로 보임) |

### 6-2. 시도했으나 형상 추출에 실패한 것 — 6개
| 도번 | 두께 | 실패 사유 (파이프라인 게이트가 내놓은 원문) |
|---|---|---|
| RB102-0089 | 12.0T | 콜아웃 근처 1200mm 안에 부재 덩어리 없음 |
| RB319-0048 | 1.0T | 〃 |
| RB602-0005 | 6.0T | 〃 |
| RD102-0037 | 9.0T | 〃 |
| RD202-0015 | 3.2T | 〃 |
| RB102-0099 | 19.0T | 후보 3개 모두 게이트 탈락 (369×310 watertight 아님 / 359×262 닫힌 외곽 루프 없음) |

> 앞의 5건은 원인이 같다: **도면에 그 부재의 닫힌 외곽선이 안 그려져 있거나, 블록 전개 후에도
> 선분이 이어지지 않는다.** 임계값(1200mm)을 올려서 억지로 맞추지 않았다 — 원인 규명 없이
> 숫자를 바꾸면 엉뚱한 덩어리를 그 부재로 오인한다. 개별 도면 확인이 필요한 건이다.

---

## 7. 산출물 목록 (이 폴더 안)

| 파일 | 내용 |
|---|---|
| `e45b_*.obj` × **84** | 부재별 3D 모델. 파일명 = `e45b_` + 도번(`-`를 `_`로) |
| `manifest_45b.json` | 84개 항목. 각 항목에 크기·두께·**두께 근거 원문**·통과한 게이트 기록 |
| `45B_조립순서_초안.json` | 공정서 13단계 + EBOM 자재번호. 출처 표기, `[CEO확인]` 항목 포함 |
| `_45B_제작보고.md` | 이 문서 |

임시폴더(중간 산출물·재현용):
`C:\Users\user\AppData\Local\Temp\claude\E-----Claude--20260728-claude-code-2-1-219\d7515fca-4f61-411d-a663-620845a60868\scratchpad\`
→ `45b_adapter.py`(입력 어댑터), `45b_make_order.py`, `45b\adapter_report.json`(부재별 투입/누락 사유),
`45b\verify_report.json`(검증 원자료), `product.py.bak_before45b`(수정 전 백업)

---

## 8. 다음에 할 수 있는 일 (지시 대기 — 임의로 진행 안 함)

1. 조립 좌표 추출 — `RD202-0008_P00_1/2/3.dwg` 조립도에서 부재 위치 뽑기 (위 [CEO확인] 1번)
2. 누락 6건 개별 도면 확인해 형상 복구
3. 두께 없는 74건 — 원본 DWG(변환 전)의 표제란을 직접 읽으면 상당수 회복 가능할 것으로 보임
4. R00 개정 CAD 원본 확보 후 재작업 (위 [CEO확인] 2번)
