# 구조해석 적용계획 — 실제 해석 프로그램처럼 만들기

작성 2026-10-08 · 조사 + 설계 문서 (**코드 수정 없음**)
대상: 도진웍스 제관웹 구조해석 — 화면 `fab.html`(3D 공장동 화면), `fab_fea.js`(구조해석 패널·결과 그리기 코드),
`fea_server.py`(해석 서버, 포트 8097, 솔버 CalculiX ccx + 사면체 메시 생성기 tetgen)

> ⚠ 이 문서를 쓰는 동안 다른 작업자가 `fab_fea.js`·`fea_server.py`에 컨투어(색칠) 시각화를 구현 중입니다.
> 아래 "현재 상태"는 **2026-10-08 시점에 읽은 코드** 기준이며, 함수 이름으로만 지목했습니다(줄 번호는 곧 바뀌므로 쓰지 않음).
> 이미 고쳐진 항목이 있으면 그 항목은 "검수 기준"으로만 쓰십시오.

---

## 0. 먼저 세 줄

1. **색칠 기능은 "없는 것"이 아니라 "안 보이는 것"입니다.** 구조해석 코드(`fab_fea.js`)의 `drawResult` 함수는
   이미 응력 색(파랑→빨강)을 입힌 3D 표면을 만들고, `paintLegend`는 컬러바를, `animSetup`은 변형 애니메이션과
   자동 과장배율까지 만듭니다. 그런데 화면에 안 나타납니다. 원인은 기능 부재가 아니라 **① 좌표가 90도 틀어짐**과
   **② 원본 부품에 가려짐** 두 가지입니다. ①은 아래 1절에서 **증거로 확정**했습니다.
2. 실제 해석 프로그램(ANSYS·SolidWorks·Abaqus·Inventor Nastran)은 **결과를 원본에 덧칠하지 않습니다.**
   원본을 치우고 **색칠된 변형 형상으로 모델을 바꿔 놓습니다.** 이 하나가 "숫자만 보인다"와 "해석을 봤다"의 차이입니다.
3. 상용 프로그램의 실무 상식 중 **제관웹이 이미 앞서 있는 것이 둘** 있습니다 —
   고정점·하중점 근처 거짓 응력을 자동으로 빼는 것(`splitPeaks`)과, 실제로 실린 하중이 얼마인지 숫자로 보여주는 것
   (`적용 하중 … N 중 … 소멸`)입니다. 상용에서는 사람이 직접 챙겨야 하는 일입니다. 버리지 마십시오.

---

## 1. 색이 안 보이는 원인 — 증거로 확정한 것

### 원인 ① 좌표계 90도 회전 (확정)

| 확인한 것 | 증거 |
|---|---|
| 지금 쓰는 모델(부품 293개)은 **SketchUp Z-up 내보내기**다 | `fab_models/parts/index.json` 의 `500PRO-R 수정안 20260917 (분해가능)` 항목 = **parts 293개, `zup: true`** (브리핑의 "293부품 중 성공 176/실패 117"과 동일 모델) |
| 화면에 띄울 때 **부품 전체를 담은 그룹을 X축 -90도 돌린다** | 3D 화면 코드(`fab_scene.js`)의 블럭 로더 `FAB.loadBlock` 안: `if(opts && opts.zup){ root.rotation.x = -Math.PI/2; … }` |
| 부품 정점 좌표는 **조립 절대좌표(Z-up)** 로 들어 있다 | 같은 index.json 의 부품 bbox 가 `[5180, 2327, 119 … ]` 처럼 조립 전체 좌표. 부품의 위치값이 아니라 정점이 절대좌표 |
| 해석에 보내는 좌표도 **그 Z-up 좌표** 다 | 구조해석 코드의 `gatherPositions` 가 `geometry.attributes.position`(=로컬=조립 절대) 를 그대로 전송 |
| 그런데 결과 색칠 메시는 **회전 보정 없이 장면 바닥에 바로 붙인다** | 구조해석 코드의 `drawResult` 가 `res.viz.positions`(Z-up) 로 메시를 만들어 `FAB.scene.add(grp)` — 회전된 `root` 의 **자식이 아니라 형제**로 들어간다 |
| 조건 마커(고정점 초록상자·하중 빨간화살표)는 **(분해하지 않은 상태에서는) 제대로 보인다** | `redrawMarkers` 는 `f.pw`(=월드 좌표)를 쓴다. 즉 **마커는 월드, 결과는 로컬** — 둘이 다른 공간 |

**결론**: 결과 색칠 메시는 실제 기계에서 X축으로 90도 돌아간 자리에 그려집니다.
이 모델은 한 축 길이가 8,783mm 이므로 어긋남이 수천 mm 단위입니다 — 과거 "7,985mm 어긋남" 이력과 자릿수가 일치합니다.
화면 밖이나 바닥 아래에 그려지니 **대표님 눈에는 "아무 일도 안 일어난" 것으로 보입니다.**

*마커와 결과가 서로 다른 공간을 쓰는 이 비대칭이 증상과 정확히 일치합니다. 추측이 아니라 코드 경로 두 개를 비교해 얻은 결론입니다.*

**단, 마커도 완전히 맞는 것은 아닙니다 — 월드 좌표(`pw`)는 정답이 아닙니다.**
`fab_explode.js`(분해보기)는 자식 부품의 위치값만 움직입니다. 그래서 분해를 켜면
**마커는 부품을 따라 움직이는데 해석 결과는 안 움직여** 둘이 또 어긋납니다.
→ 즉 **"마커 기준으로 맞추면 된다"가 아니라, 분해와 무관하게 고정된 기준(제품 루트)으로 둘 다 맞춰야** 합니다.

> ✅ **교차 확인 (2026-10-08, 이 문서 작성 중)**: 같은 시각 다른 작업자가 구조해석 화면 코드(`fab_fea.js`)에서
> **독립적으로 같은 원인에 도달해 수정 중**입니다. 작업 중인 코드의 주석이 이렇게 적혀 있습니다 —
> *"화면(월드)은 Y-up 이다 — 제품 루트에 rotation.x=-π/2 가 걸려 있기 때문"*, *"프레임 = 제품 루트의 matrixWorld"*,
> *"mesh.localToWorld 때문에 마커만 따라 움직여 결과와 어긋났다"*.
> → 서로 다른 두 경로에서 같은 결론이 나왔으므로 **이 원인은 확정**입니다. 1-1 항목은 **새로 만들 일이 아니라
> 그 수정이 제대로 됐는지 검사(E-1)하는 일**로 보시면 됩니다. 중복 작업하지 마십시오.

### 원인 ② 가려짐 (구조적 문제, 좌표를 고쳐도 남는다)

지금 UI 의 체크박스 이름이 **"결과 겹쳐 보기"** 입니다. 즉 **원본 293개 부품을 그대로 둔 채 그 위에 덧칠**합니다.
해석에 들어간 건 4개 부재뿐이므로, 색칠된 4개가 불투명한 289개 사이에 **묻혀 버립니다.**
`polygonOffset`(앞으로 살짝 당기기)은 **같은 자리에 겹친 면끼리의 얼룩**만 막아 줍니다. 옆·앞의 다른 부품이 가리는 것은 못 막습니다.

→ 실제 해석 프로그램은 겹쳐 보지 않습니다. 결과를 보는 순간 **모델이 결과로 바뀝니다.**

### 이 두 가지를 한 번에 잡는 검사 (가장 중요한 산출물)

> **결과를 그린 직후, 결과 메시(`__FEA_RESULT__`)의 월드 바깥상자 중심·크기와
> 해석에 들어간 부재들의 월드 바깥상자 중심·크기를 계산해 콘솔에 둘 다 찍는다.
> 둘이 몇 mm 안에서 일치하지 않으면 "결과 표시 성공"이라고 말하지 않는다.**

이 한 줄짜리 검사가 있었다면 7,985mm 사태는 그날 잡혔습니다.
앞으로 좌표 관련 작업의 **합격 기준**으로 고정하십시오. (철칙 제5조 — 화면 못 보면 "됐다" 금지의 자동화판)

---

## A. 실제 해석 프로그램은 이렇게 쓴다

### A-1. 표준 순서 — 네 프로그램이 모두 같다

| 순서 | 하는 일 | ANSYS Mechanical | Abaqus/CAE | SolidWorks Simulation | Inventor Nastran |
|---|---|---|---|---|---|
| 1 | 형상 가져오기·정리 | Attach Geometry | Part | 부품/조립체 | Idealization(단순화) |
| 2 | 재료 지정 | Define Materials | Property | 재료 적용 | 재료 선택 |
| 3 | 부품 연결(접촉·결합) 정의 | Define Connections | Interaction | 접합부(Connection) | 접촉/연결 |
| 4 | 메시(격자) 만들기 | Apply Mesh Controls | Mesh | 메시 | Generate Mesh |
| 5 | 구속(고정) 지정 | Apply Boundary Conditions | Load | 고정구(Fixtures) | Constraint |
| 6 | 하중 지정 | Apply Boundary Conditions | Load | 하중(Loads) | Load |
| 7 | 풀기 | Perform Solution | Job | 실행 | Run |
| 8 | **결과 보기(후처리)** | **Review Results** | **Visualization** | **결과** | **Contour / Deformed** |
| 9 | 보고서 | Create Report | 리포트 | 보고서 | 리포트 |

- ANSYS 공식 사용자 설명서는 이 순서를 "Steps for Using the Application" 으로 **명시**합니다
  (Create Analysis System → Define Materials → Attach Geometry → … → Apply Boundary Conditions → Perform Solution → **Review Results** → Create Report).
- Abaqus/CAE 는 메뉴 자체가 이 순서입니다: **Part → Property → Assembly → Step → Interaction → Load → Mesh → Job → Visualization**.
  공식 문서가 "메뉴와 모델 트리의 모듈 순서가 모델을 만드는 논리적 순서와 같다"고 적어 두었습니다.
- Inventor Nastran 은 **Idealize → 재료·구속·하중 → 메시 → Run → Contour/Deformed → (선택)수렴 확인** 입니다.
- 비전문가용인 SolidWorks **SimulationXpress** 는 더 짧습니다: **재료 → 고정구 → 하중 → 메시 → 결과 보기.**

**순서가 왜 중요한가:** 앞 단계를 비우면 뒤 단계가 **조용히 틀린 답**을 냅니다. 그래서 상용 프로그램은 트리를 위에서 아래로
내려가게 만들고, 비어 있으면 **물음표/번개 표시**를 달아 못 넘어가게 합니다.

### 각 단계에서 사람이 실제로 무엇을 클릭하고 무엇을 보고 판단하나

**1단계 형상 정리** — 작은 구멍·모서리 라운드·나사산을 지웁니다(defeature).
*판단 기준*: "이 디테일이 응력에 영향을 주나? 아니면 메시만 터뜨리나?" 영향 없으면 지웁니다.
얇은 판재는 **중간면(mid-surface)을 추출해 쉘(판) 요소**로 바꿉니다 — A-4 참조.

**2단계 재료** — 라이브러리에서 강종을 고릅니다. *화면에서 보는 것*: 항복강도·탄성계수 숫자.
*판단*: 항복강도가 결과 판정(안전율)의 분모가 되므로 **여기가 틀리면 전부 틀립니다.**

**3단계 연결** — 조립체는 부품끼리 "붙었다/미끄러진다/떨어진다"를 정해야 합니다.
용접 조립체는 보통 **Bonded(완전 접착)** 로 둡니다. *화면에서 보는 것*: 접촉면이 색으로 강조된 쌍 목록.
*판단*: "이 두 면이 정말 용접돼 있나, 아니면 그냥 닿아만 있나."

**4단계 메시** — 요소 크기를 넣고 "미리보기"를 눌러 **격자를 눈으로 봅니다.**
*판단*: ① 얇은 벽에 요소가 한 겹밖에 안 들어갔나 ② 길쭉하게 찌그러진 요소가 있나
③ 모서리에만 촘촘하게(mesh control) 줄 데가 있나. 숫자(요소 수)보다 **그림**으로 판단합니다.

**5·6단계 구속·하중** — 면이나 모서리를 **클릭해서** 고정/하중을 줍니다. 화살표·자물쇠 기호가 3D 위에 그려집니다.
*판단*: "현장에서 이 기계는 실제로 어디에 얹혀 있나? 힘은 어디로 들어오나?"
**여기가 해석에서 가장 많이 틀리는 단계**입니다 — 형상이나 메시가 아니라 **경계조건**이 결과를 지배합니다.

**7단계 풀기** — 진행창에 수렴 반복이 흐릅니다. 실패하면 "특이점/구속 부족(singular matrix)" 같은 사유가 뜹니다.
*판단*: 실패 사유는 거의 "어딘가 고정이 안 돼서 모델이 공중에서 날아갔다" 입니다.

**8단계 결과 — 이것이 본문입니다. A-2 전체.**

**9단계 보고서** — 입력조건·메시 정보·결과 그림·판정을 한 문서로 뽑습니다.
*판단*: 남이 읽고 재현할 수 있는가.

---

### A-2. 후처리(결과 보기) — 여기가 핵심

#### (1) 응력 컨투어 (von Mises) — "색칠된 기계"

- 해석이 끝나면 **von Mises 응력 플롯이 자동으로 화면에 떠 있습니다.** 사용자가 찾아 누르는 게 아니라 **기본값**입니다.
  (SolidWorks: 결과 폴더에 von Mises·변위·변형률 플롯이 기본 생성되고, 끝나면 von Mises 가 선택된 상태로 화면에 나타남)
- 색은 **모델 표면에 직접** 칠해집니다. 원본 위의 반투명 레이어가 아니라 **모델 자체가 색칠된 모습**입니다.
- 색 방향은 **파랑=낮음 → 빨강=높음** (ANSYS 기본 Rainbow). 제관웹의 jet 색 체계(파랑→청록→초록→노랑→빨강)와 같은 계열입니다.
  → **현재 제관웹의 색 규약은 바꿀 필요 없습니다.** 발주처(에버다임)와 같은 언어입니다.
- **연속(Continuous)과 띠(Discrete) 두 가지 표시**가 있습니다. 실무 조언은 **띠(Discrete)로 바꿔 보라**는 쪽입니다 —
  "색 띠가 뚜렷해져 응력 구분이 쉬워진다". ANSYS 는 띠 개수를 **4~14개**로 +/− 버튼으로 조절합니다.
  *제관웹 적용 시*: 정점 색을 부드럽게 섞는 현재 방식은 "연속"입니다. 띠 모드를 추가하면 현장에서 더 잘 읽힙니다.

#### (2) 컬러바 범례 — 숫자가 붙은 세로 막대

ANSYS 범례가 기본으로 **항상 화면 안에** 띄우는 것:

- 결과 이름과 종류 (예: Equivalent (von-Mises) Stress)
- **단위** (MPa)
- 각 색 띠의 **경계 숫자** (유효숫자 기본 3자리, 2~8자리 조절)
- 스텝 시간 / 날짜
- 옵션: 세로/가로, **로그 스케일**, 지수표기, 색 체계(Rainbow / 역Rainbow / 흑백), 띠별 색 직접 지정,
  **Max·Min 을 컬러바 위에 표시**, 반투명도, 범례 설정 저장·불러오기

**자동 스케일과 그 함정** — 기본은 모델의 min~max 자동입니다. 그런데 실무 조언이 명확합니다:
> 자동 상·하한에 의존하지 말고 **직접 범위를 지정해 "온통 파랑(sea of blue)" 현상을 없애라.**
> 항복강도 같은 의미 있는 한계를 상한으로 넣으면 설계 판단에 쓸 수 있다.

→ 제관웹은 이미 **상대(자동) / 항복기준** 두 스케일을 갖고 있고(`heatMetric`), 상대 스케일일 때
"빨강이 곧 위험은 아님"이라는 경고 문구(`scaleNoteHtml`)를 띄웁니다. **이 설계가 정확히 업계 조언대로입니다.**
남은 것은 그 범례를 **패널이 아니라 3D 화면 위에** 올리는 것뿐입니다.

#### (3) Max / Min 라벨

- ANSYS 는 **"Show min/max locations"** 로 모델 위의 최대·최소 지점에 **핀(라벨)을 꽂습니다.** 끌어당기는 선과 숫자가 같이 붙습니다.
- 안전율 플롯에서도 **최소 안전율 위치에 프로브를 꽂아** 보는 것이 표준 습관입니다.
- 제관웹은 현재 최대 응력 지점에 **빨간 구슬**을, 2·3등에 주황 구슬을 꽂습니다(`drawResult`).
  **구슬은 있으나 숫자 라벨이 없습니다.** 구슬 옆에 "24,486 MPa / 항복의 1,180%" 같은 글자가 3D 위에 붙어야
  "여기가 최대구나"가 한 번에 읽힙니다.

#### (4) 변형 형상(deformed shape)과 과장배율

- **기본이 과장된 변형 형상입니다.** 색은 변형된 모양 위에 칠립니다(SolidWorks: "선택한 응력 성분을 모델의 변형된 형상 위에 그린다").
- SimulationXpress 는 해석이 끝나면 **변형 애니메이션을 자동 재생**합니다. 그리고 공식 설명이 이렇습니다:
  > 애니메이션이 과하게 보여도 걱정 말라. **의도한 것이다.** 변형을 과장해 보여 주면
  > **하중과 구속이 제대로 걸렸는지 쉽게 확인할 수 있다.**

  → 과장배율은 "멋"이 아니라 **조건 설정 검산 도구**입니다. 제관웹의 "허공을 짚는 프리셋" 문제를 잡는 데 바로 쓰입니다.
  엉뚱한 곳에 하중이 걸리면 과장 변형 그림이 **눈에 띄게 이상하게** 휩니다.
- 동시에 **실제 배율(True Scale, 1배)** 버튼이 반드시 있습니다. 부품이 서로 파고드는지 확인하려면 실제 크기여야 합니다.
- 제관웹: `autoScale` 이 "모델 크기의 4% 쯤 휘어 보이게" 자동 배율을 잡고, 강제변위 모드는 1배로 둡니다. **설계가 맞습니다.**
  (`animStart`의 '변형 재생'은 하중 0%→100% 왕복 3초 — SimulationXpress 와 같은 동작)

#### (5) 프로브 (찍어서 값 보기)

- 모델 아무 곳이나 클릭하면 **그 지점 값이 라벨로 박힙니다.** 여러 개 꽂아 비교합니다.
- 반력(Force Reaction) 프로브는 **고정구에 걸린 반작용 힘**을 숫자로 뽑습니다 — (6) 참조.
- **제관웹에 없습니다.** 지금 클릭(`pickAt`)은 조건 찍기 전용이고, 결과 값을 찍어 보는 기능이 없습니다.
  현장 소통에서 "여기 몇 MPa 야?" 는 가장 많이 나오는 질문입니다.

#### (6) 반력(Reaction Force) 확인 — "믿어도 되나"의 1급 증거

- ANSYS: 고정 지지·강제변위 같은 **경계조건 위치에 생기는 반작용 힘**을 Force Reaction 프로브로 뽑습니다.
- 실무 검증 규칙:
  > 정적 해석에서는 **전체 작용 하중 = 전체 반력** 이어야 한다(통상 **1% 이내**).
  > 방향별로 합이 맞는지 본다. 인공적인 보조 스프링의 반력은 아주 작아야 한다.
- **제관웹에 반력이 없습니다.** 다만 `적용 하중 … N / 요청 … N 중 … 소멸(%)` 표시가 그 **절반 역할**을 합니다
  (입력측 검산). 반력은 출력측 검산이라 둘 다 있어야 완전합니다. → C-7 항목.
  *확인 필요*: CalculiX 에서 `*NODE FILE, RF` 로 반력을 .frd 에 뽑아 `parse_frd` 로 읽을 수 있는지는 실측 확인이 필요합니다.

#### (7) 단면 보기 / 등가면 자르기

- **Section Plane**: 모델을 평면으로 잘라 **속을 봅니다.** 각파이프·박스 구조에서 내부 응력을 보려면 필수입니다.
- **Capped Isosurface**: 지정값보다 **낮은(또는 높은) 영역을 아예 없애 버립니다.** 슬라이더로 값을 올리면
  "항복 넘은 부분만 남은 덩어리"가 보입니다 — **"어디가 터지나"를 한 장으로 보여주는 가장 강한 그림**입니다.
- **제관웹에 둘 다 없습니다.** 특히 Capped Isosurface 는 구현이 가볍고(임계값 이하 삼각형 제외) 설명력이 커서 가성비가 좋습니다.

#### (8) 애니메이션

- 하중 0 → 100% 로 휘는 애니메이션, AVI 내보내기, 전용 Animation 탭의 재생/배속 조절.
- 제관웹: **'변형 재생'(0→100% 왕복)과 '항복 확산'(하중배율을 올려 가며 항복 영역 번짐) 둘 다 있습니다.**
  '항복 확산'은 상용에도 흔치 않은, 현장용으로 훌륭한 발상입니다. 다만 코드 주석대로 **선형 근사**이고
  화면에 "실제 소성거동 아님"을 명시하고 있습니다 — 그 문구 유지하십시오.

#### (9) 안전율(Factor of Safety) 플롯

- SimulationXpress 의 세 가지 결과가 **변위 / 응력 / 안전율** 입니다. 비전문가에게는 **안전율이 주력**입니다.
- 계산: `안전율 = 항복강도 ÷ von Mises 응력`. 1보다 커야 영구변형이 안 생깁니다.
- ANSYS Stress Tool 이 **안전율·여유율·응력비**를 색으로 칠해 줍니다.
- ★ **ANSYS 는 안전율 표시값을 15에서 자릅니다**(여유율은 14).
  → 제관웹의 "안전율 184" 가독성 문제의 업계 해법이 바로 이것입니다. **15 이상은 "15+ (충분)" 로 표기**하십시오.
- 제관웹은 안전율을 **숫자 하나**로만 보여줍니다. **색칠 플롯이 없습니다.**

#### (10) 결과를 믿어도 되는지 — 실무가 반드시 하는 확인

**① 보는 순서가 정해져 있다 — 응력이 아니라 변위부터**
> 바로 von Mises 로 가지 말고 **변위 플롯부터 보라.** 응력은 멀쩡해 보이는데
> 변위 플롯이 **수천·수백만 mm** 를 가리키는 경우가 있다 — 그게 설정 오류 신호다.

제관웹 실측값 **최대 변위 526.116mm** 가 정확히 이 신호입니다. 8.7m 프레임에 526mm 처짐은
"고정점을 안 찍어 자동 외팔보로 풀었다"는 사실을 **응력 24,486MPa 보다 먼저** 말해 줍니다.
→ **패널 표시 순서를 변위 먼저로 뒤집으십시오.** 지금은 응력이 위에 있습니다.

**② 변형 "모양"을 먼저 보고, 그다음 "값"을 본다** (FEA 결과 검증 5단계 중 1·2단계)
크게 과장해 모양(패턴)이 의도대로인지 보고, 그다음 배율 1.0 으로 실제 값을 본다.

**③ 작용 = 반작용** (3단계) — 위 (6) 참조.

**④ 응력 평균을 끄고 본다** (4단계)
> 평균(averaging)을 끄고 요소별 생값을 본다. **이웃 요소끼리 응력이 크게 튀면 그 부위 메시가 부족**하다는 뜻이다.

**⑤ 손계산과 비교한다** (5단계) — 외팔보 공식 등으로 자릿수를 맞춰 본다.

**⑥ 메시 수렴 확인 (mesh convergence)**
메시를 2~3번 촘촘하게 바꿔 가며 최대 응력이 **한 값으로 수렴하는지** 본다. 수렴하면 믿고, 계속 올라가면 특이점이다.

**⑦ 특이점(singularity)과 응력집중을 구분한다 — 반드시 아는 상식**
- 특이점은 **메시를 줄일수록 응력이 끝없이 올라가 수렴하지 않는 지점**이며, 이론상 무한대입니다.
- 생기는 곳: **점 하중, 날카로운 안쪽 모서리(re-entrant corner), 접촉 모서리, 점 구속.**
- 중요: **특이점은 변위 결과를 망치지 않습니다.** (그래서 변위부터 보라는 것)
- 대처: 특이점에서 **떨어진 곳의 응력**을 본다 / 경로 평균을 쓴다 / 작은 R(필렛)을 넣어 응력집중으로 바꾼다.
  실제 제작물에 완벽히 날카로운 모서리는 없으니 이쪽이 물리적으로도 맞습니다.

**⑧ 고정구 근처 응력은 무시한다 — 실무 상식**
> 구속·고정구 근처에 몰린 응력은 **본질적으로 신뢰할 수 없으므로 의심하거나 무시해야 한다.**

→ **제관웹은 이미 이것을 자동으로 합니다.** `bcMask`/`splitPeaks` 가 고정점·하중점 반경 1.5배 안의 절점을 빼고
"구조 최대"와 "하중점 부근 최대"를 따로 구하며, 색 스케일 상한을 잡을 때도 거짓 첨두를 제외합니다
(주석의 실측: 35,233개 중 빨강 2개 → 나머지가 전부 파랗게 눌리는 문제를 이미 해결).
**상용에서는 사람이 눈으로 판단해야 하는 일을 자동화한 것 — 제관웹의 자산입니다.**

---

### A-3. 용접 구조물 해석의 실무

#### 용접 이음을 어떻게 모델링하나 — 세 단계

| 방법 | 내용 | 쓰는 곳 |
|---|---|---|
| **① 결합(Bonded / Tie)** | 맞닿은 면을 "완전히 붙은 것"으로 묶는다. 용접 비드 형상은 안 만든다 | 전체 구조의 강성·힘 흐름 파악 (가장 흔함) |
| **② 쉘 + 용접선** | 중간면 쉘을 만들고 모서리를 공유(shared topology)시키거나 용접 커넥터를 건다 | 판재 용접 구조물의 표준 |
| **③ 비드 실형상 + 핫스팟/노치응력** | 용접 비드를 별도 부품으로 만들고 bonded 로 붙인다. 용접 토우(toe)에서 응력을 추출 | 피로 수명 평가 |

- 조사 결과: "용접은 솔리드 요소에서는 **bonded contact 기본 설정**으로, 중간면 모델에서는 **shared topology** 로 만들었다",
  "가장 정확한 결과는 **용접을 별도 부품으로 만들어 bonded contact 로 판에 붙일 때** 얻어진다".
- **핫스팟 응력(Hot Spot Stress)**: 용접 토우에서의 구조응력. 표면에서 **판 두께의 0.4t·1.0t 거리** 응력을 뽑아
  토우 위치로 **선형 외삽**합니다. 용접부 응력을 "토우 바로 그 점"에서 읽으면 특이점이라 못 쓰기 때문입니다.
- **IIW 권고(용접 이음 피로설계)** 가 FAT 등급 체계의 근거 문서입니다.
  → 제관웹이 `FAT_CLASS`(FAT80) 로 피로 위험도를 칠하는 것은 **이 체계를 따른 것**입니다. 근거 있는 선택입니다.
- SolidWorks 의 **Edge Weld Connector** 가 참고할 만합니다:
  용접선을 지정하면 **용접 사이즈(각장)를 메시 절점마다 계산**하고,
  **Weld Check Plot** 에서 통과=초록 / 불통과=빨강 으로 **용접선을 색칠**해 줍니다.
  미국/유럽 용접 규격을 골라 계산하고, 용접선을 따라 사이즈·목두께·법선력·전단력·굽힘모멘트의 min/max/평균을 표로 냅니다.
  → **제관웹의 "용접부 보라 구슬 + 전단/굽힘/합성 MPa / 허용 대비 %" 가 바로 이 방향입니다.**
  남은 것은 **용접선 자체를 색칠(통과 초록 / 불통과 빨강)** 하는 것입니다. 현장에서 "이 용접선 보강해라"로 바로 이어집니다.

#### 얇은 부재를 왜 쉘(판)로 푸나 — 솔리드의 문제

- 쉘 요소는 **두께를 "숫자 속성"으로만 갖는 2D 면 요소**입니다. 길이가 두께보다 훨씬 긴 형상에 맞습니다
  (대략 **두께/반경 < 0.1**).
- 같은 정확도를 **훨씬 적은 요소 수**로 얻습니다 — 계산시간·메모리·메시 생성 난이도 모두 유리합니다.
- 솔리드로 얇은 벽을 풀 때의 문제:
  - 통상 지침은 **벽 두께 방향으로 요소가 최소 3겹**은 들어가야 한다는 것. 안 되면 쉘을 쓰라.
  - 벽에 솔리드 **한 겹**만 넣고 굽힘을 풀면 결과가 틀립니다. 1차(선형) 요소에서는 **전단 잠김(shear locking)** 이
    생겨 **모델이 실제보다 단단해지고 응력이 틀립니다.**
  - ★ **단, 2차(quadratic) 이상 요소를 쓰면 벽 두께당 한 겹으로도 꽤 좋은 정확도가 나옵니다.**
    → **제관웹은 C3D10(2차 사면체)** 를 씁니다. 즉 **지금 방식이 치명적으로 틀린 것이 아닙니다.**
    "쉘로 바꿔야 한다"는 압박을 1순위로 받을 필요가 없습니다. (D절 참조)

---

### A-4. 비전문가용 CAE 가 단순화한 방식 — 제관웹이 베낄 것

#### SolidWorks SimulationXpress (마법사형)

- **5단계 마법사**: 재료 → 고정구 → 하중 → 메시 → 결과. 왼쪽에 단계 목록이 있고 **한 번에 한 단계만** 묻습니다.
- 각 단계마다 **"지금 무엇을 하는 것인지" 설명 문장**이 같이 나옵니다 — FEA 를 모르는 사람도 기본 개념이 설명됨.
- **결과는 세 가지로만**: 변위 / 응력 / **안전율**.
- 끝나면 **변형 애니메이션 자동 재생** + "과장은 의도된 것, 하중·구속이 제대로 걸렸는지 확인하는 수단" 안내.
- 선형 정적, **단일 부품**으로 범위를 좁혀 "못 쓰는 상황"을 아예 없앴습니다.

→ **제관웹 '쉬운 모드' 프리셋이 이 철학입니다. 방향이 맞습니다.** 보강할 것: 단계 설명 문장, 결과 3종 축약, 안전율 주력.

#### Onshape Simulation (조립 정보 재활용형) — 프리셋 문제의 해답

- **메시도 단순화도 사용자가 안 합니다.** 부품 전체나 면에 하중·구속을 바로 줍니다.
- 핵심: **조립 체결(mate) 정보를 해석 조건으로 자동 변환합니다.**
  Fastened(고정)·Revolute(회전)·Slider(미끄럼) 같은 체결을 대응하는 물리 거동으로 번역합니다.
  공식 표현이 이렇습니다: **"운동학적으로 올바른 CAD 모델을 만들었다면, 해석 설정의 대부분은 이미 끝난 것이다."**
- 치수를 바꾸거나 부품을 교체하면 **결과가 자동 갱신**됩니다.
- 브라우저만 있으면 됩니다(설치 없음).

→ ★ **제관웹 프리셋이 "허공을 짚는" 문제의 정답 방향이 여기 있습니다.**
외곽상자 모서리에서 좌표를 추정하지 말고, **조립 정보에서 받침면을 찾아야** 합니다.
제관웹에는 이미 조립 정보가 있습니다 — `fab_assembly.js`(조립 관계), `fab_grouping.js`(부재 묶음),
`fab_process.js`(공정서) 그리고 **부품별 bbox 가 전부 들어 있는 `index.json`**.
"가장 아래 z 면에 닿아 있는 부재들" 은 bbox 로 계산 가능합니다 — 추정이 아니라 **데이터로** 찾는 것입니다.

#### Fusion 360

- 무료 등급에도 정적 응력 해석이 포함되어 있고, 클라우드에서 풉니다. 비선형·좌굴·모달까지 범위가 넓습니다.

#### 공통 패턴 — 비전문가용 CAE 가 쓰는 네 가지 장치

1. **단계를 강제한다** (마법사 / 트리 순서 / 미완료 표시)
2. **선택지를 줄인다** (해석 종류 1개, 결과 3개)
3. **모델이 이미 아는 것을 다시 묻지 않는다** (체결 정보 → 경계조건)
4. **과장 변형 애니메이션을 검산 도구로 쓴다** (설정이 틀리면 눈에 보인다)

---

## B. 제관웹의 현재 위치 — 단계별 ○/△/✗

평가 시점 2026-10-08. 근거: 구조해석 화면 코드(`fab_fea.js`)·해석 서버(`fea_server.py`) 직접 읽음 + 브리핑의 실측값.

| 단계 | 상태 | 되어 있는 것 | 비어 있는 것 |
|---|---|---|---|
| 1. 형상 정리 | **△** | 깨진 부품을 **건너뛰고** 번호·이름·사유를 화면에 그대로 띄움(`failed_parts`) — 숨기지 않는 것이 미덕 | 자동 수리 없음. 293개 중 **117개 실패**(자기교차 54, 열린면 53 등). 쉘/중간면 추출 없음 |
| 2. 재료 | **○** | 재질 코드 + 항복강도(fy_MPa), `fab_material.js` 연동 | 부재별로 다른 재질 지정은 **확인 필요** |
| 3. 부품 연결 | **△** | 맞닿은 면끼리 **`*EQUATION` 으로 용접 결합** — 실제로 완주함(부재 4개 / C3D10 31,163개 / 절점 58,298개 / 8.0초). bond/none 선택 가능 | 용접선을 **지정**할 수 없음(자동 면 접촉만). 접촉·마찰·분리 없음 |
| 4. 메시 | **○** | tetgen + **C3D10(2차 사면체)**. 절점 예산 15만, 초과 시 자동 성기게 + 화면에 고지 | 메시를 **눈으로 미리보기** 못 함. 부위별 세밀도 조절 없음 |
| 5. 구속(고정) | **△** | 클릭으로 찍기 가능, 정점 스냅(`snapAt`), 초록 상자 마커 | **프리셋이 허공을 짚음.** 고정점 미지정 시 **자동 외팔보로 조용히 풀림** → 실측 변위 526mm·응력 24,486MPa 가 그 결과 |
| 6. 하중 | **△** | 힘(N)·강제변위(mm), 빨간 화살표 마커, **실제 실린 하중과 소멸량 표시** | 프리셋이 허공을 짚으면 **30,017N 중 6N** 만 실림. 면 하중·압력·자중 단독 모드 **확인 필요** |
| 7. 풀기 | **○** | 8.0초 완주. 실패 시 **외곽상자로 둔갑시키지 않고 빨간 배너로 사유 고지** — 신뢰의 기반 | 수렴 진행 표시 없음 |
| 8-a. 응력 컨투어 | **✗ (기능은 △)** | `drawResult` 가 jet 색 정점 메시 생성 + 최대 3곳 구슬 | **화면에 안 보임.** 원인 ①좌표 90도 회전 ②원본에 가려짐 (1절) |
| 8-b. 컬러바 범례 | **△** | `paintLegend` 가 색 띠 + "파랑=튼튼 … 빨강=취약" + 상대 스케일 경고 문구 | **3D 화면이 아니라 오른쪽 패널에만.** 띠별 **숫자 눈금 없음**, 단위 표기 없음, 띠(Discrete) 모드 없음 |
| 8-c. Max/Min 라벨 | **△** | 상위 3곳 구슬(1등 빨강·2·3등 주황), 용접부 보라 구슬 | **3D 위에 숫자 라벨이 없음.** 구슬만 있어 무슨 값인지 모름. Min 표시 없음 |
| 8-d. 변형 형상 | **△** | `animSetup`·`autoScale`(모델 4% 휨)·변형 재생(0→100% 왕복)·강제변위는 1배 고정 | 보이지 않으니 무의미. **정지 상태의 변형 형상 + 원본 겹쳐보기** 없음. True Scale 버튼 없음 |
| 8-e. 프로브 | **✗** | — | 결과 지점을 찍어 값 보는 기능 없음 |
| 8-f. 단면 / 등가면 | **✗** | — | Section Plane, Capped Isosurface 없음 |
| 8-g. 안전율 플롯 | **△** | 안전율 **숫자 하나** + 항복 대비 % + 판정(여유/주의/위험) | **색칠 플롯 없음.** 15 상한 캡 없음 → "안전율 184" 가독성 문제 |
| 8-h. 반력 확인 | **△** | **적용/요청/소멸 하중을 숫자로 보여줌**(입력측 검산) — 상용보다 친절 | **반력(출력측) 없음.** 작용=반작용 1% 검산 불가 |
| 8-i. 특이점·BC 처리 | **○** | `bcMask`/`splitPeaks` 로 고정·하중점 반경 1.5배 제외, 구조 최대와 BC 최대 분리, 색 상한도 제외 후 산정 | 메시 수렴 확인 없음(메시 2~3단계 비교) |
| 8-j. 애니메이션 | **○** | **변형 재생 + 항복 확산** 둘 다. "선형 근사 — 실제 소성거동 아님" 명시 | — (보이기만 하면 됨) |
| 8-k. 피로 | **○** | FAT80 기준 피로 위험도 색 + 상위 지점(서로 떨어진 곳만 선별) | — |
| 9. 보고서 | **✗** | — | 내보내기 없음. 조건·메시·결과·판정 한 장 없음 |

### B 요약 — 한 줄로

> 1~7단계(모델 만들어 푸는 것)는 **거의 다 왔습니다.** 비어 있는 것은 **8단계(결과 보기) 전체**이고,
> 그중 가장 급한 것은 "없는 기능을 만드는 일"이 아니라 **이미 만든 것을 화면에 보이게 하는 일**입니다.

---

## C. 비어 있는 것을 메우는 작업 목록 (우선순위 순)

난이도/규모 표기: **S**=반나절 이내 · **M**=1~3일 · **L**=1주 이상 · **XL**=한 달급

---

### 1순위 — 색칠된 3D 결과가 실제로 보이게 (CEO 지적 사항)

> ※ 다른 작업자가 지금 이 부분을 구현 중입니다. 아래를 **새로 만들 명세가 아니라 검수 기준(합격 조건)** 으로 쓰십시오.
> 하나라도 미달이면 "완료" 가 아닙니다.

**1-1. 좌표 일치 (가장 급함)**
- 무엇을: 결과 메시와 조건 마커를 **하나의 기준 공간**에 놓는다.
  **진행 중인 방식이 맞습니다 — "제품 루트(씬 바로 밑 조상)의 matrixWorld" 를 공통 프레임으로 쓰는 것.**
  이유: 분해보기(`fab_explode.js`)는 **자식 부품의 위치값만** 움직이므로, 부품 단위 월드 좌표(마커가 쓰는 `pw`)로
  맞추면 **분해를 켤 때 또 어긋납니다.** 제품 루트는 분해와 무관하게 고정되어 있어 한 번 맞추면 계속 맞습니다.
  → **월드 좌표(`pw`) 방식은 쓰지 마십시오.** 분해보기에서 다시 깨집니다.
- 왜: 지금 결과는 실제 기계에서 X축 90도 돌아간 자리에 그려지고 있습니다(1절 증거). 이것만 고치면 색이 나타납니다.
- **검증 기준**: 결과를 그린 직후 콘솔에 **결과 메시의 월드 bbox 중심·크기**와 **해석 부재들의 월드 bbox 중심·크기**를
  둘 다 찍고, **중심 차이 < 모델 최대변 길이의 0.5%** 일 때만 통과. 불일치면 화면에 경고를 띄우고 "성공" 이라 하지 않는다.
  추가로 **대표님 캡처 1장**(색칠된 부재가 실제 기계 자리에 있는 그림).
- 난이도: **S** (원인이 특정됐으므로 수정은 작음. 검사 코드 포함 반나절)

**1-2. 가려짐 제거 — "겹쳐 보기"를 "결과 보기"로**
- 무엇을: 결과를 표시하는 동안 **해석에 들어가지 않은 부품은 반투명(유령) 또는 숨김**으로 바꾼다.
  체크박스 이름도 "결과 겹쳐 보기"→"**결과 보기**"로. 끄면 원본이 100% 복구될 것.
- 왜: 상용 프로그램은 겹쳐 보지 않습니다. 색칠된 4개 부재가 불투명한 289개 사이에 묻히면 좌표가 맞아도 안 보입니다.
- **검증 기준**: 293부품 모델에서 부재 4개 해석 → 색칠된 4개가 **아무 방향에서 봐도** 가려지지 않는다(캡처 3방향).
  체크박스를 끄면 원본 재질·투명도가 **완전히** 원래대로 돌아온다.
- 난이도: **S**

**1-3. 3D 화면 위의 컬러바 범례 (숫자 포함)**
- 무엇을: 오른쪽 패널이 아니라 **3D 캔버스 왼쪽/오른쪽 위에 세로 컬러바**를 띄운다. 반드시 포함할 것:
  ① 결과 이름("von Mises 응력" / "항복 대비") ② **단위(MPa)** ③ **띠별 경계 숫자**(유효 3자리)
  ④ Max·Min 값 ⑤ 지금 상대 스케일인지 항복 기준인지 ⑥ 상대 스케일이면 기존 경고 문구 유지.
  가능하면 **띠 개수 조절(4~14)** 과 **연속/띠 전환**도. ANSYS 범례와 같은 구성입니다.
- 왜: 색만 있고 숫자가 없으면 "빨간 데가 있다"까지만 알고 **얼마나 위험한지는 모릅니다.** 발주처에 보여줄 그림도 못 됩니다.
- **검증 기준**: 캡처 한 장만 보고 (a)무슨 값인지 (b)단위 (c)최대값 (d)빨강이 몇 MPa인지 **네 가지를 다 읽을 수 있다.**
- 난이도: **S~M** (HTML 오버레이로 만들면 S)

**1-4. Max 라벨 — 3D 위의 핀**
- 무엇을: 최대 응력 구슬에 **끌어당기는 선 + 글자 라벨**을 붙인다: `최대 24,486 MPa (항복의 1,180%) · 2110DN-0031`.
  최소 지점(Min)도 같은 방식으로. ANSYS "Show min/max locations" 와 같은 것.
  `splitPeaks` 가 구분하는 **구조 최대**와 **하중점 부근 최대**를 라벨에서도 구분해 표시할 것
  (후자에는 "하중 건 자리 — 참고용" 꼬리말).
- 왜: 구슬만 있으면 "저 구슬이 왜 저기 있지"로 끝납니다. 숫자가 붙어야 보고가 됩니다.
- **검증 기준**: 캡처에서 라벨 글자가 읽히고, 그 숫자가 패널 "최대 응력" 과 **일치**한다. 카메라를 돌려도 라벨이 화면을 향한다.
- 난이도: **S~M**

**1-5. 변형 형상 — 정지 상태로도 보이게 + True Scale**
- 무엇을: 애니메이션 **재생 중이 아닐 때도** 변형된 형상(과장배율 적용)으로 색칠해 둔다. 추가로
  ① **원본 형상 겹쳐보기**(반투명 회색 또는 와이어프레임) ② **실제 배율(1배) 버튼** ③ 현재 배율 숫자 표시.
- 왜: 상용은 변형 형상이 기본입니다. 원본과 겹쳐 봐야 "어디로 얼마나 휘었나"가 보이고,
  **과장 변형이 이상하게 휘면 조건이 잘못 걸린 것** — 프리셋 오류를 눈으로 잡는 수단입니다(SimulationXpress 공식 설명).
- **검증 기준**: 재생을 멈춘 상태에서 휘어 있다. 배율 표시가 화면에 있다. 1배 버튼을 누르면 변형이 눈에 안 보일 만큼 줄어든다.
- 난이도: **S** (`animSetup`·`autoScale` 재사용)

**1-6. ★ 못 믿을 결과에는 색칠하지 않는다 (1순위 안의 게이트)**
- 무엇을: 아래 중 하나라도 걸리면 **컨투어 위에 빨간 "이 결과는 믿지 마십시오" 덮개**를 씌우거나 색칠을 보류한다.
  ① 하중 소멸률이 임계치 초과(예: 요청 대비 **20% 이상 소멸**) ② 자동 외팔보로 풀렸음(고정점 미지정)
  ③ 적용 하중이 자중보다 작음 ④ 해석에서 빠진 부품이 전체의 일정 비율 초과.
  ①③④ 판단에 필요한 값은 **서버가 이미 보내고 있습니다**(`requested_N`/`applied_N`/`dropped_N`/`selfweight_N`/`failed_parts`).
- 왜: **잘 칠해진 틀린 그림은 안 칠한 것보다 나쁩니다.** 30,017N 중 6N 만 실린 해석을 예쁘게 색칠해서
  발주처에 보여주는 것이 최악의 결과입니다. 1순위를 "보이게" 로 끝내면 정확히 그 위험이 생깁니다.
- **검증 기준**: 일부러 허공에 하중점을 찍어 돌린다 → 색칠이 막히거나 빨간 덮개가 덮인다. 캡처로 확인.
- 난이도: **S** (판정 로직만 추가, 데이터는 이미 있음)

---

### 2순위 — 보는 순서 바로잡기 + 숫자 읽기 쉽게 (값은 싸고 효과는 큼)

- **무엇을**: ① 패널 결과 순서를 **변위 → 응력 → 안전율** 로 뒤집는다(지금은 응력이 먼저).
  ② 안전율 표시를 **15 에서 캡**("15+ 충분"). ③ 자동 외팔보로 풀렸으면 변위 바로 아래에 큰 글씨로
  "고정점을 안 찍어 한쪽 끝만 잡고 푼 값입니다 — 실제보다 크게 나옵니다".
- **왜**: 업계 1번 조언이 "응력보다 변위를 먼저 보라" 입니다. 변위 526mm 를 먼저 봤으면
  24,486MPa 를 의심하는 데 시간이 안 걸렸습니다. 안전율 캡은 ANSYS 가 실제로 쓰는 방식입니다.
- **검증 기준**: 패널 맨 위가 변위다. 안전율 184 짜리 해석에서 "15+" 로 나온다. 자동 외팔보 경고가 캡처에 보인다.
- **난이도**: **S**

---

### 3순위 — 프리셋이 허공을 안 짚게 (Onshape 방식)

- **무엇을**: 프리셋의 고정점·하중점을 **외곽상자에서 추정하지 말고 데이터에서 찾는다.**
  ① `index.json` 의 부품별 bbox 로 "가장 아래 z 면에 닿아 있는 부재들"을 골라 **받침면 후보**로 쓴다.
  ② 선택 부재의 **실제 정점 중** 그 면에 가까운 것만 고정점으로 삼는다(기존 `snapAt` 활용).
  ③ 그래도 못 찾으면 **추정하지 말고 "고정할 곳을 클릭해 주십시오" 로 되돌린다** — 자동 외팔보 폴백을 쓰지 않는다.
  ④ 찍은 뒤 **실제로 몇 개 절점이 잡혔는지 / 하중 몇 N 이 실릴 예정인지 해석 전에** 미리 보여준다.
- **왜**: 프리셋이 틀리면 1순위 색칠이 **틀린 그림을 예쁘게** 보여줍니다. Onshape 의 교훈이 명확합니다 —
  "조립 모델이 맞으면 해석 설정의 대부분은 이미 끝난 것". 제관웹에는 조립·부재 묶음·bbox 데이터가 이미 있습니다.
- **검증 기준**: 붐·마스트 프리셋 각각에서 **하중 소멸률 5% 이내**. 소멸률을 해석 전 화면에 숫자로 보여준다.
  못 찾은 경우 자동 외팔보로 넘어가지 않고 사용자에게 묻는다.
- **난이도**: **M**

---

### 4순위 — 프로브 (찍어서 값 보기)

- **무엇을**: 결과 표시 중 모델을 클릭하면 가장 가까운 절점의 **응력/변위/항복% 라벨을 꽂는다.** 여러 개 유지, 개별 삭제.
- **왜**: 현장 대화가 "여기 몇이야?" 로 돌아갑니다. 숫자를 짚어 말할 수 있어야 보강 위치 지시가 됩니다.
- **검증 기준**: 최대 응력 구슬 위를 찍으면 패널 최대값과 **일치**한다. 조건 찍기 모드와 **충돌하지 않는다**(기존 `setMode`/`setPick` 배타 처리 패턴 준수).
- **난이도**: **S~M** (클릭→절점 탐색은 `pickAt`·`fatigueTop` 의 거리 계산 재사용)

---

### 5순위 — 안전율 색칠 플롯

- **무엇을**: 안전율(= 항복강도 ÷ von Mises)을 **색으로 칠한 플롯**을 결과 전환 버튼에 추가. 15 에서 캡.
  색 방향은 응력과 **반대**(빨강=안전율 낮음)이며 범례에 그 사실을 명시.
- **왜**: 비전문가용 CAE 가 안전율을 주력으로 내세우는 이유 — "항복의 몇 %" 보다 "안전율 2.3" 이 현장에서 더 즉각적입니다.
- **검증 기준**: 최소 안전율 위치가 최대 응력 위치와 같다. 여유 큰 부재가 **온통 빨강이 되지 않는다**(캡 덕분).
- **난이도**: **S** (`heatMetric` 에 지표 하나 추가하는 구조)

---

### 6순위 — 단면 보기 / 항복 넘은 부분만 남기기

- **무엇을**: ① **Section Plane** — 슬라이더로 평면을 움직여 자른 단면을 본다.
  ② **Capped Isosurface** — 임계값(예: 항복 100%) 이하 영역을 제외해 **"터지는 부분만" 남긴 덩어리**를 보여준다.
- **왜**: 각파이프·박스 구조는 겉만 봐서는 속 응력을 못 봅니다. ②는 **"어디가 터지나"를 한 장으로 설명하는 가장 강한 그림**입니다.
- **검증 기준**: 임계값을 올리면 남는 덩어리가 줄어들고, 100% 에서 남는 부분이 최대 응력 지점과 일치한다.
- **난이도**: **M** (②가 더 쉽다. 임계값 넘는 삼각형만 인덱스에서 골라내면 되므로 ②를 먼저)

---

### 7순위 — 반력(Reaction Force) 검증

- **무엇을**: 고정점의 반력 합을 뽑아 **작용 = 반작용(1% 이내)** 을 자동 검사하고 화면에 표시.
- **왜**: 실무 검증의 3번 항목이고, 결과를 신뢰할 수 있다고 말할 가장 강한 증거입니다. 지금은 입력측(적용 하중)만 있습니다.
- **검증 기준**: 30,000N 을 걸었을 때 반력 합이 **29,700~30,300N** 안. 벗어나면 빨간 경고.
- **난이도**: **M** — *확인 필요*: CalculiX 에서 `*NODE FILE, RF` 로 반력을 .frd 에 출력하고
  해석 서버의 `parse_frd` 로 읽을 수 있는지 실측 확인 필요. 안 되면 `.dat` 출력 경로를 검토.

---

### 8순위 — 메시 수렴 확인 (한 번 눌러 두 번 풀기)

- **무엇을**: "정밀 확인" 버튼 — 같은 조건으로 요소 크기를 약 30% 줄여 **한 번 더** 풀고
  최대 응력 변화율을 보여준다. 변화 5% 이내면 "수렴", 계속 오르면 **"특이점 의심 — 날카로운 모서리나 점 하중 때문"** 안내.
- **왜**: 업계가 결과를 믿는 근거입니다. 또 **24,486MPa 같은 값이 특이점인지 실제인지 구분**해 줍니다.
- **검증 기준**: 판재 한 장 같은 단순 형상에서 수렴 판정이 뜬다. 날카로운 모서리 형상에서 "특이점 의심" 이 뜬다.
- **난이도**: **M** (절점 예산 15만 제약 — D절 참조)

---

### 9순위 — 용접선 색칠 (SolidWorks Weld Check Plot 방식)

- **무엇을**: 지금 숫자로만 나오는 용접부 검토를 **용접선 자체를 초록(통과)/빨강(불통과)으로 칠해** 3D 에 표시.
- **왜**: "이 용접선 보강" 이 현장 지시의 최종 형태입니다. 보라 구슬보다 선이 직관적입니다.
- **검증 기준**: 통과/불통과 용접선 색이 패널의 % 숫자와 일치. 용접 길이가 실제 맞닿은 선과 일치.
- **난이도**: **M**

---

### 10순위 — 보고서 내보내기

- **무엇을**: 한 장 요약(조건·재질·메시·빠진 부품·변위·응력·안전율·결과 그림 2~3장·판정)을 HTML/PDF 로.
- **왜**: 발주처 제출물이 됩니다. 제관웹의 영업 데모 목표(MEMORY: 제관웹+계기판 = 판매용 제품)에 직결됩니다.
- **검증 기준**: 저장한 파일만으로 제3자가 조건을 재현할 수 있다. 빠진 부품 목록이 **반드시** 포함된다.
- **난이도**: **M**

---

### 11순위 — 쉘(판) 요소 (보류 권고)

- **무엇을**: 얇은 판재를 중간면 쉘로 바꿔 푼다.
- **왜 11순위인가**: 교과서적으로는 옳지만 **지금 급하지 않습니다.** 제관웹은 **C3D10(2차 사면체)** 를 쓰고 있고,
  업계 정리가 "2차 이상 요소면 벽 두께당 한 겹으로도 꽤 좋은 정확도" 라고 합니다.
  반면 중간면 추출은 CAD 가 깨진 117개 부품에서는 **거의 확실히 더 많이 실패**합니다.
- **난이도**: **XL** — 대표님 승인 없이 착수 금지.

---

### 12순위 — 깨진 CAD 자동 수리

- **무엇을**: 자기교차 54개·열린면 53개를 자동 수리(구멍 메우기·교차 제거)해 메시 성공률을 올린다.
- **왜 후순위인가**: 117개가 **원본 도면 품질 문제**입니다. 자동 수리는 **형상을 몰래 바꾸는 일**이라
  철칙 제1원칙(데이터 손실 금지)과 충돌합니다. 지금처럼 **빼고 명시하는 것이 더 안전**합니다.
  대신 "어느 부품이 왜 깨졌나" 목록을 **CAD 수정 작업지시서**로 내보내는 쪽이 투자 대비 낫습니다.
- **난이도**: **L**

---

## D. 제관웹만의 제약과 그 대응 — 무엇을 포기하고 무엇을 지킬지

| 제약 | 현실 | 포기할 것 | 지킬 것 |
|---|---|---|---|
| **브라우저에서 돈다** | 솔버는 서버(CalculiX)지만 **그림은 브라우저가 그린다.** 절점 5.8만 개 색칠은 가볍지만, 라벨·단면·수렴 2회 풀기가 겹치면 느려진다 | 비선형·좌굴·동해석·소성해석 (주석의 실측: 소성 1000N 에서 334.8초 쓰고도 수렴 실패) | **8초 완주**. 1순위 작업 후에도 **결과 표시가 2초 이내**. 느려지면 기능보다 속도를 택한다 |
| **절점 예산 15만** | 수렴 확인은 같은 모델을 **더 촘촘히** 다시 풀어야 하는데 예산이 막는다 | 전체 조립 모델의 수렴 확인 | 수렴 확인은 **부재 1~2개 범위에서만** 제공. "지금 메시로는 수렴 확인 불가" 를 **솔직히 표시**(둔갑 금지 원칙) |
| **CAD 부품 117개가 깨졌다** | 어떤 프리셋도 **전체 조립 해석을 완전하게 못 한다** | "전체 조립 해석" 이라는 표현 자체 | 빠진 부품을 **번호·이름·사유로 매번 고지**(현재 `failed_parts` 유지). 결과 그림에도 "부품 N개 제외" 를 **그림 안에** 박는다 — 캡처만 돌아다닐 때를 대비 |
| **용접 결합을 MPC(`*EQUATION`)로 한다** | 맞닿은 면을 강제로 묶는 방식. 묶은 경계에 **인위적 응력 첨두**가 생기기 쉽다 | 용접 비드 실형상·노치응력 해석 | **MPC 경계 근처 응력도 `bcMask` 처럼 "참고용" 으로 분리**해 표시(확장 권고). 용접부 판정은 별도 계산(FAT80)으로 계속 유지 |
| **대표님이 직접 쓴다 (비개발자·현장 제관 전문가)** | 조건 설정은 **다른 분야**다. 전문가 모드 5단계를 현장에서 판단 못 한다(실사용 확인) | 전문가용 옵션 나열식 UI | **① 단계를 강제 ② 선택지를 줄여라 ③ 모델이 아는 걸 다시 묻지 마라 ④ 과장 변형으로 검산하게 하라** — 비전문가용 CAE 4원칙. 모든 숫자에 **한국어 한 줄 해석**을 붙인다(현재 `easySummaryHtml` 유지·강화) |
| **틀린 결과가 발주처로 간다** | 색칠된 그림은 **설득력이 너무 강하다**. 틀렸을 때 피해가 숫자보다 크다 | "일단 보여주고 나중에 정확도 올리기" | **1-6 게이트.** 못 믿을 결과에는 색을 칠하지 않거나 덮개를 씌운다. 상대 스케일 경고 문구(`scaleNoteHtml`)는 **삭제 금지** |

### 반드시 지킬 세 가지 (건드리지 마십시오)

1. **실패를 외곽상자로 둔갑시키지 않는 것** — 지금의 빨간 배너. 제관웹 신뢰의 근거입니다.
2. **고정·하중점 근처 거짓 응력 제외**(`bcMask`/`splitPeaks`) — 상용에서는 사람이 하는 일을 자동화한 자산.
3. **적용 하중·소멸량 숫자 표시** — 상용에도 이렇게 친절한 건 드뭅니다. "6N 만 실렸다"를 잡아낸 장치입니다.

---

## E. 당장 다음에 할 일 3가지

지금 다른 작업자가 컨투어 시각화를 구현 중이므로, **1번은 그 작업의 합격 검사**이고 2·3번은 겹치지 않는 별도 작업입니다.

### E-1. 좌표 일치 자가진단 한 줄 넣기 (가장 먼저 · 반나절 미만)

- **할 일**: 결과를 그린 직후, **결과 메시(`__FEA_RESULT__`)의 월드 bbox 중심·크기**와
  **해석에 들어간 부재들의 월드 bbox 중심·크기**를 콘솔에 둘 다 찍고, 중심 차이가
  모델 최대변의 0.5% 를 넘으면 화면에 빨간 경고를 띄운다.
- **왜 먼저인가**: 원인 규명과 수정은 **이미 끝났거나 진행 중**입니다(1절 교차 확인). 그래서 E-1 은
  "찾는 일" 이 아니라 **그 수정이 실제로 맞았는지 숫자로 증명하는 일** 입니다.
  7,985mm 사태가 **다시는 조용히** 생기지 않게 하는 영구 장치이기도 합니다.
- **완료 판정**: ① 콘솔에 두 bbox 숫자가 찍히고 **중심 차이 < 모델 최대변의 0.5%**.
  ② ★ **분해보기(`fab_explode`)를 켠 상태에서도** 중심이 일치한다 — 이 조건이 제품 루트 기준과 월드 좌표 기준을
  가르는 시험입니다. 월드 좌표로 맞춘 것이면 여기서 어긋납니다. **이 한 줄을 반드시 요구하십시오.**
  ③ 자세저장·분해를 섞어 쓴 뒤에도 일치.
- **보고 형식**: 콘솔 로그 그대로 + 캡처 1장 (철칙 제5조).

### E-2. 결과 볼 때 다른 부품 흐리게 + 3D 위 컬러바·Max 라벨 (반나절~1일)

- **할 일**: ① 체크박스 "결과 겹쳐 보기" → "**결과 보기**" 로 바꾸고, 켜면 **해석에 안 들어간 부품을 반투명/숨김**
  (끄면 100% 복구). ② 3D 캔버스 위에 **세로 컬러바**(결과명·단위 MPa·띠별 숫자·Max·Min).
  ③ 최대 응력 지점에 **숫자 라벨 핀**("최대 24,486 MPa / 항복의 1,180%"), 하중점 부근 첨두는 "참고용" 꼬리말.
- **왜**: 좌표를 고쳐도 **원본에 가려지면 여전히 안 보입니다**(원인 ②). 그리고 숫자 없는 색은 보고가 안 됩니다.
  이 셋이 CEO 지적 "색칠된 3D + 범례 + Max 라벨" 의 본체입니다.
- **완료 판정**: 캡처 한 장에서 **(a) 색칠된 부재가 기계 자리에 (b) 가려지지 않고 (c) 컬러바 숫자와 단위가 읽히고
  (d) 최대값 라벨이 패널 숫자와 일치** — 네 가지가 동시에 확인됨.

### E-3. 읽는 순서 바로잡기 + 못 믿을 결과 게이트 (1~2시간)

- **할 일**: ① 패널 결과 순서를 **변위 → 응력 → 안전율** 로 뒤집는다. ② 안전율 표시를 **15 에서 캡**("15+ 충분").
  ③ **자동 외팔보로 풀렸으면** 변위 바로 아래에 큰 글씨 경고("고정점 미지정 — 한쪽 끝만 잡고 푼 값, 실제보다 큽니다").
  ④ **하중 소멸률 20% 초과 / 자중보다 작은 하중 / 자동 외팔보** 중 하나라도면 **컨투어에 빨간 "믿지 마십시오" 덮개**.
  (④에 필요한 값은 해석 서버가 이미 보냅니다 — 새 계산 없음)
- **왜**: 업계 1번 조언이 "응력보다 변위 먼저" 이고, 실측 **변위 526mm** 가 "응력 24,486MPa 를 믿지 말라" 는 신호였습니다.
  그리고 E-2 를 하면 **틀린 결과도 예쁘게 색칠**되므로, 게이트가 같은 시점에 들어가야 합니다.
- **완료 판정**: 허공에 하중점을 찍어 일부러 실패시킨 해석에서 **빨간 덮개가 덮이고 색칠이 막힌다**(캡처).
  안전율 184 짜리 해석에서 "15+" 로 표시된다.

### E-1~3 공통 수칙

- 철칙 제6조 — **한 턴에 한 곳만.** E-1 → 커밋 → E-2 → 커밋 → E-3 → 커밋.
- 철칙 제1조 — 하나라도 되면 **즉시 커밋**("무엇이 성공했는지" 한 줄).
- 철칙 제5조 — **대표님 캡처/콘솔 로그가 오기 전에는 "됐습니다" 금지.**
- 철칙 제7조 — 동결값(펄스↔각도 변환, TCP, 검증된 IK/JBI) 근처는 손대지 않음. **이 작업 범위에는 없습니다.**

---

## 부록 1. 모르는 것 / 확인 필요 목록

추측을 사실로 쓰지 않기 위해 분리했습니다.

0. *(확인 필요가 아니라 **확정된 발견**)* **분해보기에서 마커가 결과와 어긋난다** — 월드 좌표(`pw`)로 마커를 그리기 때문.
   작업 중인 코드의 주석이 이 사실을 명시하고 있습니다. 좌표 수정은 **반드시 분해보기를 켠 상태로도 검사**해야 합니다(E-1 ②).
1. **CalculiX 반력 출력** — `*NODE FILE, RF` 로 .frd 에 반력을 뽑아 해석 서버의 `parse_frd` 로 읽을 수 있는지 **미확인**. (7순위)
2. **부재별 다른 재질 지정** 이 현재 지원되는지 **미확인**. 조립체에 강종이 섞여 있으면 중요.
3. **면 하중 / 압력 / 자중 단독 모드** 지원 여부 **미확인** (현재 확인된 것은 힘 N·강제변위 mm).
4. **다른 작업자의 진행분** — 이 문서를 쓰는 동안 `fab_fea.js`·`fea_server.py` 가 수정되고 있어
   1순위 항목 일부는 이미 반영되었을 수 있습니다. **먼저 E-1 검사로 현재 상태를 실측**하십시오.
5. **1-2(가려짐 제거)의 부작용** — 부품 투명도를 바꾸는 것이 `fab_isolate.js`(부재만 보기)·`fab_material.js`(재질 색)·
   `fab_explode.js`(분해)와 충돌할 수 있습니다. "공용 코드 무수정" 원칙에 따라 **구조해석 전용 오버레이/복원 경로**로
   처리할지 **설계 검토 필요**.
6. **메시 수렴 확인의 절점 예산** — 15만 예산 안에서 30% 세밀화가 가능한 부재 크기 범위를 **실측 필요**.
7. **쉘 요소 전환 시 실패율** — 중간면 추출이 깨진 CAD 에서 얼마나 실패할지는 **추정이며 미검증**.

## 부록 2. 출처

**표준 워크플로우**
- ANSYS Mechanical User's Guide — Steps for Using the Application: https://ansyshelp.ansys.com/public/Views/Secured/corp/v242/en/wb_sim/ds_Home.html
- Abaqus/CAE — What is a module? (모듈 순서): https://abaqus-docs.mit.edu/2017/English/SIMACAECAERefMap/simacae-c-topwhatismodule.htm
- Autodesk Inventor Nastran — Setting up a Nastran Analysis: https://www.autodesk.com/learn/ondemand/course/product-simulation-with-inventor-nastran/unit/1h3KMpqx8UyoYt6caniZvM
- Autodesk Inventor Nastran 2024 Help: https://help.autodesk.com/view/NINCAD/2024/ENU/?guid=GUID-5CF685B4-8BF2-429A-947B-4D608CD6490C

**후처리 / 범례 / 결과 표시**
- ANSYS — Results Legend (범례 전체 기능, 띠 4~14, Max/Min, 로그, 색 체계): https://ansyshelp.ansys.com/public/Views/Secured/corp/v242/en/wb_sim/AWEResultsLegend.html
- ANSYS — Capped IsoSurfaces: https://ansyshelp.ansys.com/public/Views/Secured/corp/v242/en/wb_sim/AWECappedIsosurfaces.html
- ANSYS — Section Planes: https://ansyshelp.ansys.com/public/views/secured/corp/v251/en/wb_dm/agpSectionPlanes.html
- ANSYS — Stress Tools (안전율·여유율·응력비, 안전율 15 상한): https://ansyshelp.ansys.com/public/Views/Secured/corp/v252/en/wb_sim/ds_Stress_Tools.html
- ANSYS — Reactions: Forces and Moments: https://ansyshelp.ansys.com/public/Views/Secured/corp/v261/en/wb_sim/ds_Reactions.html
- ANSYS — Equivalent Force Reaction Results (강의): https://innovationspace.ansys.com/courses/courses/topics-in-general-post-processing-in-ansys-mechanical-software/lessons/equivalent-force-reaction-results-lesson-2/
- SOLIDWORKS Design Help — Stress Plot (변형 형상 위에 응력 표시): https://help.solidworks.com/2012/english/solidworks/cworks/idc_help_stressplottype.htm
- CATI — Tips and Tricks for Post Processing in SOLIDWORKS Simulation (**변위 먼저 / Discrete 띠 / 범례 상·하한 직접 지정 / 고정구 근처 응력 무시**): https://www.cati.com/blog/tips-and-tricks-for-post-processing-in-solidworks-simulation/

**결과 신뢰성 / 특이점 / 수렴**
- Enterfea — 5 steps of FEA results verification (변형 모양→값→반력→평균 끄기→손계산): https://enterfea.com/5-steps-fea-results-verification/
- TECHNIA — Quality Checking Your FEA Model (작용=반작용, 통상 1% 이내): https://blog.technia.com/en/simulation/quality-check-fea-model
- Fidelis Engineering — Stress Singularities At Reentrant Corners: https://www.fidelisfea.com/post/stress-singularities-at-reentrant-corners-a-fundamental-problem-in-fea
- Marcos Acín — Stress singularities and concentrations, Mesh convergence in FEA: https://www.linkedin.com/pulse/stress-singularities-concentrations-mesh-fea-marcos-ac%C3%ADn-gonz%C3%A1lez
- Fluxiss — Mesh Convergence in FEA: https://www.fluxiss.com/blogs/mesh-convergence-in-fea/
- MLC CAD — Important Mesh Theory (특이점은 변위 결과에 영향 없음): https://www.mlc-cad.com/solidworks-help-center/important-mesh-theory-to-accurately-run-your-finite-element-analysis-simulations/

**쉘 vs 솔리드 / 용접 구조물**
- Engineering.com — Shell or Solid Elements for Thin Walled Parts? (**3겹 지침과, 2차 요소면 한 겹도 가능**): https://www.engineering.com/shell-or-solid-elements-for-thin-walled-parts/
- ANSYS(Synopsys) — 3 Steps to Improve FEA Models: https://ansys.synopsys.com/blog/how-to-improve-fea
- HiTech — Using Shell Elements for Your FEA Simulation: https://www.hitechfea.com/fea-knowledgebase/using-shell-elements-for-your-fea-simulation.html
- IIW Recommendations for fatigue design of welded joints and components (XIII-1823-07) — FAT 등급 근거: https://community.ptc.com/sejnu66972/attachments/sejnu66972/cpanalysis/5465/1/XIII-1823-07%20IIW%20Recommendations%20for%20fatigue%20design%20of%20welded%20joints%20and%20components%202008.pdf
- CAEflow — Weld FEA: Finite Element Analysis Guide for Welded Structures: https://caeflow.com/fea/weld-fea/
- Apollo Engineering — Modeling Welds for Finite Element Analysis: https://apolloedge.com/2018/07/19/model-welds-for-finite-element-analysis-fea/
- IIETA — FEA Stress Determination for Weld Fatigue Using Hot-Spot Stress Method (0.4t·1.0t 외삽): https://www.iieta.org/journals/ijcmem/paper/10.18280/ijcmem.120301
- SOLIDWORKS Design Help — Edge Weld Connector PropertyManager: https://help.solidworks.com/2025/english/SolidWorks/cworks/HIDD_EDGE_WELD_CONNECTOR.htm
- GoEngineer — SOLIDWORKS Simulation Edge Weld Connector: Types, Sizing & More: https://www.goengineer.com/blog/solidworks-simulation-edge-weld-connector
- Javelin — Simulate Welding in SOLIDWORKS with Weld Edge Simulation (Weld Check Plot 초록/빨강): https://www.javelin-tech.com/blog/2023/04/simulate-welding-in-solidworks-with-weld-edge-simulation/

**비전문가용 CAE**
- CATI — A Beginner's Look at SOLIDWORKS SimulationXpress, Part Two (**과장 애니메이션은 의도된 것 = 조건 검산 수단**): https://www.cati.com/blog/a-beginners-look-at-solidworks-simulationxpress-part-two/
- SOLIDWORKS — An Introduction to Stress Analysis (학생용 교재): https://www.solidworks.com/sw/images/content/Training/SolidWorks_Simulation_Student_Guide-ENG.pdf
- Onshape — Simulation (공식 기능 설명): https://www.onshape.com/en/features/simulation
- Onshape — How Onshape Simulation Simplifies Workflows (**체결 정보 → 해석 조건 자동 변환**): https://www.onshape.com/en/blog/onshape-simulation-simplifies-workflows
- Onshape Help — Simulation: https://cad.onshape.com/help/Content/Assembly/simulation.htm
- HawkRidge — SOLIDWORKS Simulation: What Is Von Mises Stress?: https://hawkridgesys.com/blog/solidworks-simulation-what-is-von-mises-stress

---

*이 문서는 조사·설계 전용입니다. 코드는 한 줄도 수정하지 않았고 git 상태도 바꾸지 않았습니다.*
