diff --git a/A05_EduDetail/guide/B02/00_설명서.md b/A05_EduDetail/guide/B02/00_설명서.md
index 6b093ee97..843c36ab5 100644
--- a/A05_EduDetail/guide/B02/00_설명서.md
+++ b/A05_EduDetail/guide/B02/00_설명서.md
@@ -1,9 +1,32 @@
-# 프로젝트 등록 설명서
+# 프로젝트 등록
-## 이 화면에서 하는 일
+새 임도 설계 프로젝트의 이름 · 종류 · 노선 구간 · 도면 표제란 값을 입력해 프로젝트를 만듦.
+
+## 여는 길
+
+- 대시보드 [프로젝트] 구역의 [+] → 새 프로젝트 창에서 [임도설계].
+
+
+
+## 화면 구역
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 사업 연도 · 사업 지역 | 프로젝트명의 바탕이 되는 연도와 지역 입력 |
+| 2 | 임도 종류 · 프로젝트명 | 임도 종류 선택 · 이름은 앞 세 값으로 자동 완성(고칠 수 있음) |
+| 3 | 노선 시작 · 종료 누가거리 | 계획노선 가운데 쓸 구간(비우면 전 구간) |
+| 4 | 시행청 · 설계일자 | 도면 표제란에 들어갈 값 |
+| 5 | 과업책임자 · 분야별책임자 | 도면 표제란 책임자 선택 |
+| 6 | 설계자 | 도면 표제란 설계자 선택 |
+| 7 | 비고 | 메모(선택) |
+| 8 | 단추 줄 | [?] 도움말 · [취소] · [프로젝트 생성] → [생성과 취소](B02/04_생성과_취소) |
## 작업 순서
-## 버튼
+1. [사업 지역] 입력 → [기본 항목 입력](B02/01_기본_항목_입력).
+2. [임도 종류] 선택 → [임도 종류와 노선 구간](B02/02_임도_종류와_노선_구간).
+3. 필요하면 노선 구간 입력 → [임도 종류와 노선 구간](B02/02_임도_종류와_노선_구간).
+4. 도면 표제란 값 입력 → [도면 표제란](B02/03_도면_표제란).
+5. [프로젝트 생성] → 파일입력 화면으로 넘어감 → [생성과 취소](B02/04_생성과_취소).
-## 주의할 점
+> 주의: 임도 종류는 이후 노선설계의 설계속도 선택지와 종단기울기 상한을 정함. 만들기 전에 확인.
diff --git a/A05_EduDetail/guide/B02/01_기본_항목_입력.md b/A05_EduDetail/guide/B02/01_기본_항목_입력.md
new file mode 100644
index 000000000..83b5f5772
--- /dev/null
+++ b/A05_EduDetail/guide/B02/01_기본_항목_입력.md
@@ -0,0 +1,26 @@
+# 기본 항목 입력
+
+사업 연도 · 사업 지역 · 프로젝트명 입력.
+
+## 여는 길
+
+- 프로젝트 등록 화면 맨 위 줄.
+
+
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | (그림 ①) [사업 연도] 확인 — 올해 연도가 미리 들어 있음 (2000 ~ 올해 + 5) |
+| 2 | (그림 ②) [사업 지역] 입력 (예: 울진군 금강송면) — 필수 |
+| 3 | (그림 ③) [임도 종류] 선택 |
+| 4 | (그림 ④) [프로젝트명] 확인 — 앞 세 값으로 자동 완성 |
+| 5 | 이름 중간이나 끝에 글을 덧붙이고 싶으면 [프로젝트명] 칸을 직접 고침 |
+
+## 보이는 것
+
+- [프로젝트명] 은 「사업 연도 + 사업 지역 + 임도 종류」 순으로 채워짐 (그림 ④ · 예: 2026 울진군 금강송면 간선임도).
+- 연도 · 지역 · 종류를 다시 바꿔도 직접 덧붙인 글은 그대로 남고 해당 조각만 바뀜.
+
+> 주의: [사업 지역] 이 비어 있으면 생성 안 됨 → [생성과 취소](B02/04_생성과_취소).
diff --git a/A05_EduDetail/guide/B02/02_임도_종류와_노선_구간.md b/A05_EduDetail/guide/B02/02_임도_종류와_노선_구간.md
new file mode 100644
index 000000000..43ffe814b
--- /dev/null
+++ b/A05_EduDetail/guide/B02/02_임도_종류와_노선_구간.md
@@ -0,0 +1,42 @@
+# 임도 종류와 노선 구간
+
+임도 종류를 고르고, 계획노선 중 설계에 쓸 구간(누가거리)을 정함.
+
+## 여는 길
+
+- 프로젝트 등록 화면 가운데 줄.
+
+
+
+## 단계
+
+### 임도 종류
+
+- 그림 ① [임도 종류] · ② [프로젝트명] — 종류를 바꾸면 프로젝트명 글자도 바뀜.
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | [임도 종류] 칸을 누름 |
+| 2 | 간선임도 · 산불진화임도 · 작업임도 중 선택 |
+| 3 | [프로젝트명] 의 종류 글자가 함께 바뀜 |
+
+### 노선 구간
+
+
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | (그림 ①) [노선 시작 누가거리 (m)] 에 시작 위치 입력 — 비우면 처음부터 |
+| 2 | (그림 ②) [노선 종료 누가거리 (m)] 에 끝 위치 입력 — 비우면 끝까지 |
+| 3 | (그림 ②) 종료 칸 이름에 「연장 ○○m」 가 표시되는지 확인 |
+
+## 보이는 것
+
+
+
+- 시작과 종료를 모두 넣으면 종료 칸 제목에 구간 길이가 나옴 (예: 연장 2500.0m).
+- 종료가 시작보다 작거나 같은 채 [프로젝트 생성] 을 누르면 종료 칸 아래에 「종료 누가거리는 시작보다 커야 합니다.」 표시 · 프로젝트는 만들어지지 않음.
+
+> 주의: 임도 종류는 노선설계 화면의 설계속도 선택지와 종단기울기 상한 기준이 됨.
+
+> 참고: 계획노선 자료가 공사지 전체일 때 쓸 구간만 따로 정하는 칸. 한 구간 전체를 쓰면 둘 다 비워 둠.
diff --git a/A05_EduDetail/guide/B02/03_도면_표제란.md b/A05_EduDetail/guide/B02/03_도면_표제란.md
new file mode 100644
index 000000000..e9a86f395
--- /dev/null
+++ b/A05_EduDetail/guide/B02/03_도면_표제란.md
@@ -0,0 +1,25 @@
+# 도면 표제란
+
+도면 오른쪽 아래 표제란에 들어갈 시행청 · 설계일자 · 책임자를 미리 입력. 비워 두면 도면에 빈칸으로 나감.
+
+## 여는 길
+
+- 프로젝트 등록 화면 아래쪽 줄.
+
+
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | (그림 ①) [시행청 (도면 표제란)] 입력 |
+| 2 | (그림 ②) [설계일자 (도면 표제란)] 에서 날짜 선택 |
+| 3 | (그림 ③ ④ ⑤) [과업책임자 (도면 표제란)] · [분야별책임자 (도면 표제란)] · [설계자 (도면 표제란)] 를 목록에서 선택 |
+| 4 | (그림 ⑥) 필요하면 [비고] 에 메모 |
+
+## 보이는 것
+
+- 세 책임자 칸은 같은 회사 팀원 목록. 처음에는 프로젝트를 만드는 본인이 선택됨.
+- 목록에 없는 사람은 대시보드 [팀원 관리] 에서 추가한 뒤 고름 → [B01 회사와 팀원](B01/05_회사와_팀원).
+
+> 참고: 나중에 대시보드 [프로젝트] 표의 [수정] 에서 같은 값을 고칠 수 있음 → [B01 프로젝트 목록](B01/02_프로젝트_목록).
diff --git a/A05_EduDetail/guide/B02/04_생성과_취소.md b/A05_EduDetail/guide/B02/04_생성과_취소.md
new file mode 100644
index 000000000..e8dfa6dca
--- /dev/null
+++ b/A05_EduDetail/guide/B02/04_생성과_취소.md
@@ -0,0 +1,28 @@
+# 생성과 취소
+
+입력을 마치고 프로젝트를 만들거나, 만들지 않고 돌아감.
+
+## 여는 길
+
+- 프로젝트 등록 화면 오른쪽 아래 단추 줄.
+
+
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 필수 칸(사업 연도 · 사업 지역 · 프로젝트명)을 채움 |
+| 2 | [프로젝트 생성] 누름 |
+| 3 | 「프로젝트가 생성되었습니다. 파일 입력 단계로 이동합니다.」 알림과 함께 파일입력 화면이 열림 → [B03](B03/00_설명서) |
+| 4 | 만들지 않으려면 [취소] — 대시보드로 돌아감 |
+
+## 보이는 것
+
+
+
+- 비워 둔 필수 칸 아래에 「필수 항목을 입력하세요.」 표시.
+- 연도가 범위를 벗어나면 「숫자 범위를 벗어났습니다.」 표시.
+- 오류가 있으면 프로젝트는 만들어지지 않음.
+
+> 참고: 그림 ① [?] 는 이 화면의 도움말을 엶 · ② [취소] · ③ [프로젝트 생성].
diff --git a/A05_EduDetail/guide/B02/B02_00_overview.webp b/A05_EduDetail/guide/B02/B02_00_overview.webp
new file mode 100644
index 000000000..c8d9d367b
Binary files /dev/null and b/A05_EduDetail/guide/B02/B02_00_overview.webp differ
diff --git a/A05_EduDetail/guide/B02/B02_01_basic_fields.webp b/A05_EduDetail/guide/B02/B02_01_basic_fields.webp
new file mode 100644
index 000000000..d3b5e7bc6
Binary files /dev/null and b/A05_EduDetail/guide/B02/B02_01_basic_fields.webp differ
diff --git a/A05_EduDetail/guide/B02/B02_02_road_type.webp b/A05_EduDetail/guide/B02/B02_02_road_type.webp
new file mode 100644
index 000000000..e41bcac44
Binary files /dev/null and b/A05_EduDetail/guide/B02/B02_02_road_type.webp differ
diff --git a/A05_EduDetail/guide/B02/B02_03_route_range.webp b/A05_EduDetail/guide/B02/B02_03_route_range.webp
new file mode 100644
index 000000000..1939bd8c7
Binary files /dev/null and b/A05_EduDetail/guide/B02/B02_03_route_range.webp differ
diff --git a/A05_EduDetail/guide/B02/B02_04_title_block.webp b/A05_EduDetail/guide/B02/B02_04_title_block.webp
new file mode 100644
index 000000000..faff224a7
Binary files /dev/null and b/A05_EduDetail/guide/B02/B02_04_title_block.webp differ
diff --git a/A05_EduDetail/guide/B02/B02_05_required_error.webp b/A05_EduDetail/guide/B02/B02_05_required_error.webp
new file mode 100644
index 000000000..26ba59046
Binary files /dev/null and b/A05_EduDetail/guide/B02/B02_05_required_error.webp differ
diff --git a/A05_EduDetail/guide/B02/B02_06_buttons.webp b/A05_EduDetail/guide/B02/B02_06_buttons.webp
new file mode 100644
index 000000000..cb8db49e8
Binary files /dev/null and b/A05_EduDetail/guide/B02/B02_06_buttons.webp differ
diff --git a/A05_EduDetail/guide/B02/B02_07_range_error.webp b/A05_EduDetail/guide/B02/B02_07_range_error.webp
new file mode 100644
index 000000000..5a38bdad1
Binary files /dev/null and b/A05_EduDetail/guide/B02/B02_07_range_error.webp differ
diff --git a/A05_EduDetail/guide/B02/_scenes.json b/A05_EduDetail/guide/B02/_scenes.json
new file mode 100644
index 000000000..c77e0849d
--- /dev/null
+++ b/A05_EduDetail/guide/B02/_scenes.json
@@ -0,0 +1,345 @@
+[
+ {
+ "name": "B02_00_overview",
+ "route": "#/b02-proj-register",
+ "project": "none",
+ "before": [
+ {
+ "wait": ".b02-proj__grid"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const q=[\".b02-proj__grid > :nth-child(1)\", \".b02-proj__grid > :nth-child(2)\"];const els=q.map(s=>[...document.querySelectorAll(s)].find(e=>e.getBoundingClientRect().width>0));const rs=els.map(e=>e.getBoundingClientRect());const L=Math.min(...rs.map(r=>r.left)),T=Math.min(...rs.map(r=>r.top)),R=Math.max(...rs.map(r=>r.right)),B=Math.max(...rs.map(r=>r.bottom));const d=document.createElement('div');d.id='__u1';d.style.cssText='position:absolute;pointer-events:none;left:'+(L+scrollX)+'px;top:'+(T+scrollY)+'px;width:'+(R-L)+'px;height:'+(B-T)+'px';document.body.appendChild(d);})()"
+ },
+ {
+ "eval": "(()=>{const q=[\".b02-proj__grid > :nth-child(3)\", \".b02-proj__grid > :nth-child(4)\"];const els=q.map(s=>[...document.querySelectorAll(s)].find(e=>e.getBoundingClientRect().width>0));const rs=els.map(e=>e.getBoundingClientRect());const L=Math.min(...rs.map(r=>r.left)),T=Math.min(...rs.map(r=>r.top)),R=Math.max(...rs.map(r=>r.right)),B=Math.max(...rs.map(r=>r.bottom));const d=document.createElement('div');d.id='__u2';d.style.cssText='position:absolute;pointer-events:none;left:'+(L+scrollX)+'px;top:'+(T+scrollY)+'px;width:'+(R-L)+'px;height:'+(B-T)+'px';document.body.appendChild(d);})()"
+ },
+ {
+ "eval": "(()=>{const q=[\".b02-proj__grid > :nth-child(5)\", \".b02-proj__grid > :nth-child(6)\"];const els=q.map(s=>[...document.querySelectorAll(s)].find(e=>e.getBoundingClientRect().width>0));const rs=els.map(e=>e.getBoundingClientRect());const L=Math.min(...rs.map(r=>r.left)),T=Math.min(...rs.map(r=>r.top)),R=Math.max(...rs.map(r=>r.right)),B=Math.max(...rs.map(r=>r.bottom));const d=document.createElement('div');d.id='__u3';d.style.cssText='position:absolute;pointer-events:none;left:'+(L+scrollX)+'px;top:'+(T+scrollY)+'px;width:'+(R-L)+'px;height:'+(B-T)+'px';document.body.appendChild(d);})()"
+ },
+ {
+ "eval": "(()=>{const q=[\".b02-proj__grid > :nth-child(7)\", \".b02-proj__grid > :nth-child(8)\"];const els=q.map(s=>[...document.querySelectorAll(s)].find(e=>e.getBoundingClientRect().width>0));const rs=els.map(e=>e.getBoundingClientRect());const L=Math.min(...rs.map(r=>r.left)),T=Math.min(...rs.map(r=>r.top)),R=Math.max(...rs.map(r=>r.right)),B=Math.max(...rs.map(r=>r.bottom));const d=document.createElement('div');d.id='__u4';d.style.cssText='position:absolute;pointer-events:none;left:'+(L+scrollX)+'px;top:'+(T+scrollY)+'px;width:'+(R-L)+'px;height:'+(B-T)+'px';document.body.appendChild(d);})()"
+ },
+ {
+ "eval": "(()=>{const q=[\".b02-proj__grid > :nth-child(9)\", \".b02-proj__grid > :nth-child(10)\"];const els=q.map(s=>[...document.querySelectorAll(s)].find(e=>e.getBoundingClientRect().width>0));const rs=els.map(e=>e.getBoundingClientRect());const L=Math.min(...rs.map(r=>r.left)),T=Math.min(...rs.map(r=>r.top)),R=Math.max(...rs.map(r=>r.right)),B=Math.max(...rs.map(r=>r.bottom));const d=document.createElement('div');d.id='__u5';d.style.cssText='position:absolute;pointer-events:none;left:'+(L+scrollX)+'px;top:'+(T+scrollY)+'px;width:'+(R-L)+'px;height:'+(B-T)+'px';document.body.appendChild(d);})()"
+ },
+ {
+ "eval": "(()=>{const q=[\".b02-proj__grid > :nth-child(11)\"];const els=q.map(s=>[...document.querySelectorAll(s)].find(e=>e.getBoundingClientRect().width>0));const rs=els.map(e=>e.getBoundingClientRect());const L=Math.min(...rs.map(r=>r.left)),T=Math.min(...rs.map(r=>r.top)),R=Math.max(...rs.map(r=>r.right)),B=Math.max(...rs.map(r=>r.bottom));const d=document.createElement('div');d.id='__u6';d.style.cssText='position:absolute;pointer-events:none;left:'+(L+scrollX)+'px;top:'+(T+scrollY)+'px;width:'+(R-L)+'px;height:'+(B-T)+'px';document.body.appendChild(d);})()"
+ },
+ {
+ "eval": "(()=>{const q=[\".b02-proj__grid > :nth-child(12)\"];const els=q.map(s=>[...document.querySelectorAll(s)].find(e=>e.getBoundingClientRect().width>0));const rs=els.map(e=>e.getBoundingClientRect());const L=Math.min(...rs.map(r=>r.left)),T=Math.min(...rs.map(r=>r.top)),R=Math.max(...rs.map(r=>r.right)),B=Math.max(...rs.map(r=>r.bottom));const d=document.createElement('div');d.id='__u7';d.style.cssText='position:absolute;pointer-events:none;left:'+(L+scrollX)+'px;top:'+(T+scrollY)+'px;width:'+(R-L)+'px;height:'+(B-T)+'px';document.body.appendChild(d);})()"
+ },
+ {
+ "eval": "document.querySelectorAll('.b02-proj__grid select option').forEach(o=>{o.textContent=o.textContent.replace('엄상돈','홍길동')})"
+ }
+ ],
+ "clip": null,
+ "callouts": [
+ {
+ "n": 1,
+ "sel": "#__u1"
+ },
+ {
+ "n": 2,
+ "sel": "#__u2"
+ },
+ {
+ "n": 3,
+ "sel": "#__u3"
+ },
+ {
+ "n": 4,
+ "sel": "#__u4"
+ },
+ {
+ "n": 5,
+ "sel": "#__u5"
+ },
+ {
+ "n": 6,
+ "sel": "#__u6"
+ },
+ {
+ "n": 7,
+ "sel": "#__u7"
+ },
+ {
+ "n": 8,
+ "sel": ".b02-proj__actions"
+ }
+ ]
+ },
+ {
+ "name": "B02_01_basic_fields",
+ "route": "#/b02-proj-register",
+ "project": "none",
+ "before": [
+ {
+ "wait": ".b02-proj__grid"
+ },
+ {
+ "fill": ".b02-proj__grid > :nth-child(2) input",
+ "value": "울진군 금강송면"
+ },
+ {
+ "wait_ms": 300
+ },
+ {
+ "wait_ms": 800
+ },
+ {
+ "eval": "document.querySelectorAll('.b02-proj__grid select option').forEach(o=>{o.textContent=o.textContent.replace('엄상돈','홍길동')})"
+ },
+ {
+ "eval": "(()=>{const q=[\".b02-proj__grid > :nth-child(1)\", \".b02-proj__grid > :nth-child(4)\"];const els=q.map(s=>[...document.querySelectorAll(s)].find(e=>e.getBoundingClientRect().width>0));const rs=els.map(e=>e.getBoundingClientRect());const L=Math.min(...rs.map(r=>r.left)),T=Math.min(...rs.map(r=>r.top)),R=Math.max(...rs.map(r=>r.right)),B=Math.max(...rs.map(r=>r.bottom));const d=document.createElement('div');d.id='__clip';d.style.cssText='position:absolute;pointer-events:none;left:'+(L+scrollX)+'px;top:'+(T+scrollY)+'px;width:'+(R-L)+'px;height:'+(B-T)+'px';document.body.appendChild(d);})()"
+ }
+ ],
+ "clip": "#__clip",
+ "clip_pad": 4,
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b02-proj__grid > :nth-child(1)"
+ },
+ {
+ "n": 2,
+ "sel": ".b02-proj__grid > :nth-child(2)"
+ },
+ {
+ "n": 3,
+ "sel": ".b02-proj__grid > :nth-child(3)"
+ },
+ {
+ "n": 4,
+ "sel": ".b02-proj__grid > :nth-child(4)"
+ }
+ ]
+ },
+ {
+ "name": "B02_02_road_type",
+ "route": "#/b02-proj-register",
+ "project": "none",
+ "before": [
+ {
+ "wait": ".b02-proj__grid"
+ },
+ {
+ "select": ".b02-proj__grid > :nth-child(3) select",
+ "value": "fire"
+ },
+ {
+ "wait_ms": 500
+ },
+ {
+ "eval": "document.querySelectorAll('.b02-proj__grid select option').forEach(o=>{o.textContent=o.textContent.replace('엄상돈','홍길동')})"
+ },
+ {
+ "eval": "(()=>{const q=[\".b02-proj__grid > :nth-child(3)\", \".b02-proj__grid > :nth-child(4)\"];const els=q.map(s=>[...document.querySelectorAll(s)].find(e=>e.getBoundingClientRect().width>0));const rs=els.map(e=>e.getBoundingClientRect());const L=Math.min(...rs.map(r=>r.left)),T=Math.min(...rs.map(r=>r.top)),R=Math.max(...rs.map(r=>r.right)),B=Math.max(...rs.map(r=>r.bottom));const d=document.createElement('div');d.id='__clip';d.style.cssText='position:absolute;pointer-events:none;left:'+(L+scrollX)+'px;top:'+(T+scrollY)+'px;width:'+(R-L)+'px;height:'+(B-T)+'px';document.body.appendChild(d);})()"
+ }
+ ],
+ "clip": "#__clip",
+ "clip_pad": 4,
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b02-proj__grid > :nth-child(3)"
+ },
+ {
+ "n": 2,
+ "sel": ".b02-proj__grid > :nth-child(4)"
+ }
+ ]
+ },
+ {
+ "name": "B02_03_route_range",
+ "route": "#/b02-proj-register",
+ "project": "none",
+ "before": [
+ {
+ "wait": ".b02-proj__grid"
+ },
+ {
+ "fill": ".b02-proj__grid > :nth-child(5) input",
+ "value": "1000"
+ },
+ {
+ "fill": ".b02-proj__grid > :nth-child(6) input",
+ "value": "3500"
+ },
+ {
+ "wait_ms": 500
+ },
+ {
+ "eval": "document.querySelectorAll('.b02-proj__grid select option').forEach(o=>{o.textContent=o.textContent.replace('엄상돈','홍길동')})"
+ },
+ {
+ "eval": "(()=>{const q=[\".b02-proj__grid > :nth-child(5)\", \".b02-proj__grid > :nth-child(6)\"];const els=q.map(s=>[...document.querySelectorAll(s)].find(e=>e.getBoundingClientRect().width>0));const rs=els.map(e=>e.getBoundingClientRect());const L=Math.min(...rs.map(r=>r.left)),T=Math.min(...rs.map(r=>r.top)),R=Math.max(...rs.map(r=>r.right)),B=Math.max(...rs.map(r=>r.bottom));const d=document.createElement('div');d.id='__clip';d.style.cssText='position:absolute;pointer-events:none;left:'+(L+scrollX)+'px;top:'+(T+scrollY)+'px;width:'+(R-L)+'px;height:'+(B-T)+'px';document.body.appendChild(d);})()"
+ }
+ ],
+ "clip": "#__clip",
+ "clip_pad": 4,
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b02-proj__grid > :nth-child(5)"
+ },
+ {
+ "n": 2,
+ "sel": ".b02-proj__grid > :nth-child(6)"
+ }
+ ]
+ },
+ {
+ "name": "B02_04_title_block",
+ "route": "#/b02-proj-register",
+ "project": "none",
+ "before": [
+ {
+ "wait": ".b02-proj__grid"
+ },
+ {
+ "wait_ms": 1500
+ },
+ {
+ "eval": "document.querySelectorAll('.b02-proj__grid select option').forEach(o=>{o.textContent=o.textContent.replace('엄상돈','홍길동')})"
+ },
+ {
+ "eval": "(()=>{const q=[\".b02-proj__grid > :nth-child(7)\", \".b02-proj__grid > :nth-child(12)\"];const els=q.map(s=>[...document.querySelectorAll(s)].find(e=>e.getBoundingClientRect().width>0));const rs=els.map(e=>e.getBoundingClientRect());const L=Math.min(...rs.map(r=>r.left)),T=Math.min(...rs.map(r=>r.top)),R=Math.max(...rs.map(r=>r.right)),B=Math.max(...rs.map(r=>r.bottom));const d=document.createElement('div');d.id='__clip';d.style.cssText='position:absolute;pointer-events:none;left:'+(L+scrollX)+'px;top:'+(T+scrollY)+'px;width:'+(R-L)+'px;height:'+(B-T)+'px';document.body.appendChild(d);})()"
+ }
+ ],
+ "clip": "#__clip",
+ "clip_pad": 4,
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b02-proj__grid > :nth-child(7)"
+ },
+ {
+ "n": 2,
+ "sel": ".b02-proj__grid > :nth-child(8)"
+ },
+ {
+ "n": 3,
+ "sel": ".b02-proj__grid > :nth-child(9)"
+ },
+ {
+ "n": 4,
+ "sel": ".b02-proj__grid > :nth-child(10)"
+ },
+ {
+ "n": 5,
+ "sel": ".b02-proj__grid > :nth-child(11)"
+ },
+ {
+ "n": 6,
+ "sel": ".b02-proj__grid > :nth-child(12)"
+ }
+ ]
+ },
+ {
+ "name": "B02_05_required_error",
+ "route": "#/b02-proj-register",
+ "project": "none",
+ "before": [
+ {
+ "wait": ".b02-proj__grid"
+ },
+ {
+ "click": ".b02-proj__actions .ui-btn--filled"
+ },
+ {
+ "wait_ms": 600
+ },
+ {
+ "eval": "document.querySelectorAll('.b02-proj__grid select option').forEach(o=>{o.textContent=o.textContent.replace('엄상돈','홍길동')})"
+ },
+ {
+ "eval": "(()=>{const q=[\".b02-proj__grid > :nth-child(1)\", \".b02-proj__grid > :nth-child(2)\"];const els=q.map(s=>[...document.querySelectorAll(s)].find(e=>e.getBoundingClientRect().width>0));const rs=els.map(e=>e.getBoundingClientRect());const L=Math.min(...rs.map(r=>r.left)),T=Math.min(...rs.map(r=>r.top)),R=Math.max(...rs.map(r=>r.right)),B=Math.max(...rs.map(r=>r.bottom));const d=document.createElement('div');d.id='__clip';d.style.cssText='position:absolute;pointer-events:none;left:'+(L+scrollX)+'px;top:'+(T+scrollY)+'px;width:'+(R-L)+'px;height:'+(B-T)+'px';document.body.appendChild(d);})()"
+ }
+ ],
+ "clip": "#__clip",
+ "clip_pad": 4,
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b02-proj__grid > :nth-child(2)"
+ }
+ ]
+ },
+ {
+ "name": "B02_06_buttons",
+ "route": "#/b02-proj-register",
+ "project": "none",
+ "before": [
+ {
+ "wait": ".b02-proj__actions"
+ },
+ {
+ "eval": "document.querySelectorAll('.b02-proj__grid select option').forEach(o=>{o.textContent=o.textContent.replace('엄상돈','홍길동')})"
+ }
+ ],
+ "clip": ".b02-proj__actions",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b02-proj__actions .ui-help-btn"
+ },
+ {
+ "n": 2,
+ "sel": ".b02-proj__actions .ui-btn--ghost:nth-child(2)"
+ },
+ {
+ "n": 3,
+ "sel": ".b02-proj__actions .ui-btn--filled"
+ }
+ ]
+ },
+ {
+ "name": "B02_07_range_error",
+ "route": "#/b02-proj-register",
+ "project": "none",
+ "before": [
+ {
+ "wait": ".b02-proj__grid"
+ },
+ {
+ "fill": ".b02-proj__grid > :nth-child(2) input",
+ "value": "울진군 금강송면"
+ },
+ {
+ "fill": ".b02-proj__grid > :nth-child(5) input",
+ "value": "3000"
+ },
+ {
+ "fill": ".b02-proj__grid > :nth-child(6) input",
+ "value": "1000"
+ },
+ {
+ "click": ".b02-proj__actions .ui-btn--filled"
+ },
+ {
+ "wait_ms": 600
+ },
+ {
+ "eval": "document.querySelectorAll('.b02-proj__grid select option').forEach(o=>{o.textContent=o.textContent.replace('엄상돈','홍길동')})"
+ },
+ {
+ "eval": "(()=>{const q=[\".b02-proj__grid > :nth-child(5)\", \".b02-proj__grid > :nth-child(6)\"];const els=q.map(s=>[...document.querySelectorAll(s)].find(e=>e.getBoundingClientRect().width>0));const rs=els.map(e=>e.getBoundingClientRect());const L=Math.min(...rs.map(r=>r.left)),T=Math.min(...rs.map(r=>r.top)),R=Math.max(...rs.map(r=>r.right)),B=Math.max(...rs.map(r=>r.bottom));const d=document.createElement('div');d.id='__clip';d.style.cssText='position:absolute;pointer-events:none;left:'+(L+scrollX)+'px;top:'+(T+scrollY)+'px;width:'+(R-L)+'px;height:'+(B-T)+'px';document.body.appendChild(d);})()"
+ }
+ ],
+ "clip": "#__clip",
+ "clip_pad": 4,
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b02-proj__grid > :nth-child(5)"
+ },
+ {
+ "n": 2,
+ "sel": ".b02-proj__grid > :nth-child(6)"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/A05_EduDetail/guide/B03/00_설명서.md b/A05_EduDetail/guide/B03/00_설명서.md
index 2d7ae7e01..364d845b7 100644
--- a/A05_EduDetail/guide/B03/00_설명서.md
+++ b/A05_EduDetail/guide/B03/00_설명서.md
@@ -1,9 +1,39 @@
-# 파일입력 설명서
+# 파일입력
-## 이 화면에서 하는 일
+계획노선 파일과 지형(라이다) 파일을 올려, 이후 설계의 바탕 자료를 만듦.
+
+## 여는 길
+
+- 프로젝트를 만들면 자동으로 열림.
+- 이미 만든 프로젝트는 대시보드 [프로젝트] 표의 단계 막대에서 「파일입력」 누름.
+
+
+
+## 화면 구역
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 왼쪽 패널 | 지금 단계(파일입력)와 프로젝트 이름 · 진행 안내 글 · 접기 손잡이 · [?] 도움말 |
+| 2 | [입력 파일 선택] 칸 | 파일을 끌어다 놓거나 눌러서 한꺼번에 고름 |
+| 3 | [임시 보관함] | 대시보드에 미리 올려 둔 자료를 가져옴 |
+| 4 | [파일 업로드] | 고른 파일을 서버로 올림 |
+| 5 | [LAS 없이 설계 (도엽등고선 기반)] | 라이다 없이 도엽 등고선으로 지형을 만드는 선택 |
+| 6 | [계획노선 자료] | 노선 도형 · 색인 · 속성 · 인코딩 · 좌표계 카드 다섯 |
+| 7 | [지형 자료 (LAS)] | 포인트클라우드 · 지형 좌표계 · 래스터 좌표 · 지형 래스터 카드 넷 |
+
+
+
+왼쪽 패널 그림 번호 — ① 단계 이름 · ② 패널 접기 손잡이 · ③ [?] 도움말. 이미 끝난 프로젝트는 「필수 파일 업로드와 지표면 분석이 모두 완료된 프로젝트입니다. 파일을 다시 올리면 기존 결과가 교체됩니다.」 안내가 패널에 보임.
## 작업 순서
-## 버튼
+1. 파일을 끌어다 놓거나 [입력 파일 선택] 으로 고름 → [파일 올리기](B03/01_파일_올리기).
+2. 카드마다 파일이 맞게 들어갔는지 확인 → [카드 읽는 법](B03/02_카드_읽는_법).
+3. 대시보드에 올려 둔 자료가 있으면 [임시 보관함] 으로 → [임시 보관함에서 가져오기](B03/03_임시_보관함에서_가져오기).
+4. 산림청 예정노선을 쓰면 [예정노선에서 가져오기] → [예정노선 가져오기](B03/04_예정노선_가져오기).
+5. 라이다가 없으면 [LAS 없이 설계] → [LAS 없이 설계](B03/05_LAS_없이_설계).
+6. [파일 업로드] → 분석이 끝나면 전처리 화면으로 자동 이동 → [B04](B04/00_설명서).
-## 주의할 점
+> 주의: 이미 끝난 프로젝트에 파일을 다시 올리면 기존 분석 결과가 새 파일로 교체됨.
+
+> 참고: 어떤 파일이 필요한지는 [필요한 파일](B03/10_필요한_파일) 참고.
diff --git a/A05_EduDetail/guide/B03/01_파일_올리기.md b/A05_EduDetail/guide/B03/01_파일_올리기.md
new file mode 100644
index 000000000..39729c93a
--- /dev/null
+++ b/A05_EduDetail/guide/B03/01_파일_올리기.md
@@ -0,0 +1,34 @@
+# 파일 올리기
+
+계획노선 · 지형 파일을 고르고 서버로 올림.
+
+## 여는 길
+
+- 파일입력 화면 위쪽 [입력 파일 선택] 칸과 [파일 업로드] 단추.
+
+
+
+그림 번호 — ① [입력 파일 선택] 칸 · ② [임시 보관함] · ③ [파일 업로드] · ④ [LAS 없이 설계 (도엽등고선 기반)].
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 컴퓨터의 파일들을 [입력 파일 선택] 칸 위로 끌어다 놓음 (칸을 눌러 고를 수도 있음) |
+| 2 | 확장자를 보고 파일이 알맞은 카드에 자동으로 들어감 — 카드 상태가 「완료」 나 선택 표시로 바뀜 |
+| 3 | 빠진 카드는 카드의 [파일 선택] 으로 한 칸씩 채움 |
+| 4 | 잘못 넣은 파일은 카드의 ✕ [파일 제거] 로 되돌림 |
+| 5 | 필수 카드가 모두 차면 [파일 업로드] 가 켜짐 · 누름 |
+| 6 | 카드마다 진행률 · 속도 · 예상 완료 시간이 표시됨 |
+| 7 | 올리기가 끝나면 분석이 백그라운드로 돌고, 끝나면 전처리 화면으로 자동 이동 |
+
+## 보이는 것
+
+- 올리는 동안 [파일 업로드] 단추는 「업로드 중…」 으로 바뀜.
+- 같은 칸에 이미 올라간 파일이 있으면 「기존 파일 교체 확인」 창이 뜸 — [교체] 를 누르면 기존 파일과 분석 결과(지표면 모델 등)가 바뀜, [취소] 하면 그대로.
+- 오류 글 예: 「같은 유형의 파일이 이미 선택되어 있습니다.」 · 「선택한 파일 유형이 이 카드와 맞지 않습니다.」 · 「필수 카드를 모두 채우세요 …」.
+- 올리다 중단되면 「중단된 업로드 감지」 띠가 뜸 — 같은 파일을 다시 고르고 [업로드 재개].
+
+> 주의: 계획노선 PRJ 와 지형 PRJ 는 서로 다른 칸. 라이다 PRJ 가 작업 좌표계 기준이며 노선 좌표계와 다르면 올리기가 막힘.
+
+> 참고: 큰 파일은 올리는 데 시간이 걸림. 올리는 동안 창을 닫지 않기.
diff --git a/A05_EduDetail/guide/B03/02_카드_읽는_법.md b/A05_EduDetail/guide/B03/02_카드_읽는_법.md
new file mode 100644
index 000000000..d15e309a6
--- /dev/null
+++ b/A05_EduDetail/guide/B03/02_카드_읽는_법.md
@@ -0,0 +1,52 @@
+# 카드 읽는 법
+
+계획노선과 지형 자료의 카드 아홉 장이 각각 무엇을 뜻하는지, 어떤 정보를 미리 보여 주는지.
+
+## 여는 길
+
+- 파일입력 화면의 [계획노선 자료] · [지형 자료 (LAS)] 구역.
+
+
+
+## 단계
+
+| 번호 | 부분 | 뜻 |
+| --- | --- | --- |
+| 1 | 카드 이름과 확장자 | 이 카드가 받을 파일의 종류 (예: 계획노선 도형 .shp) |
+| 2 | 상태 | 완료 · 업로드 중 · 대기 · 실패 · 선택 |
+| 3 | [파일 선택] | 이 카드에 파일을 직접 고름 |
+| 4 | 파일명과 크기 | 지금 올라가 있는 파일 |
+| 5 | 미리보기 | 파일을 읽어서 보여 주는 요약 |
+
+### 계획노선 자료
+
+그림 번호는 아래 표의 번호와 같음 — 맨 아래 [예정노선에서 가져오기] 는 [예정노선 가져오기](B03/04_예정노선_가져오기).
+
+
+
+| 번호 | 카드 | 파일 | 미리보기 |
+| --- | --- | --- | --- |
+| 1 | 계획노선 도형 | .shp | 노선 모양 |
+| 2 | 노선 도형 색인 | .shx | 도형 개수 · 범위 |
+| 3 | 노선 속성 | .dbf | 레코드 · 속성 개수 |
+| 4 | 노선 속성 인코딩 | .cpg (선택) | 인코딩 번호 |
+| 5 | 노선 좌표계 | .prj | 좌표계 이름과 번호 |
+
+### 지형 자료
+
+그림 번호는 아래 표의 번호와 같음.
+
+
+
+| 번호 | 카드 | 파일 | 미리보기 |
+| --- | --- | --- | --- |
+| 1 | 포인트클라우드 | .las · .laz | 점 5,000개를 솎아 위에서 본 모양 |
+| 2 | 지형 좌표계 | .prj | 좌표계 이름과 번호 |
+| 3 | 래스터 좌표 | .tfw | 픽셀 크기 |
+| 4 | 지형 래스터 | .tif (선택) | 지형 래스터 그림 |
+
+## 보이는 것
+
+- 계획노선이 지형 자료 범위를 벗어나면 「계획노선이 지형 자료 범위를 벗어납니다.」 · 안에 있으면 「계획노선이 지형 자료 범위 안에 있습니다.」 표시.
+
+> 참고: 지형 쪽 PRJ · TFW 는 지형 자료의 좌표계. 노선 PRJ 와 별개.
diff --git a/A05_EduDetail/guide/B03/03_임시_보관함에서_가져오기.md b/A05_EduDetail/guide/B03/03_임시_보관함에서_가져오기.md
new file mode 100644
index 000000000..af1c8170a
--- /dev/null
+++ b/A05_EduDetail/guide/B03/03_임시_보관함에서_가져오기.md
@@ -0,0 +1,28 @@
+# 임시 보관함에서 가져오기
+
+대시보드 임시 보관함에 먼저 올려 둔 자료를 이 프로젝트로 옮김. 큰 파일을 미리 올려 둘 때 편함.
+
+## 여는 길
+
+- 파일입력 화면 위쪽 [임시 보관함] 단추.
+
+
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | [임시 보관함] 누름 |
+| 2 | 목록에서 가져올 묶음을 고름 (이름 · 파일 개수 · 크기가 보임) |
+| 3 | [확인] |
+| 4 | 자료가 프로젝트로 옮겨지고 분석이 시작됨 |
+
+## 보이는 것
+
+그림 ① 은 창 아래 [취소] · [확인] 단추 줄. 그림은 보관 자료가 없을 때의 모습.
+
+- 옮기기가 끝나면 「보관 자료를 프로젝트로 옮겼습니다. 분석을 시작합니다.」 알림.
+- 라이다 파일이 묶음에 없으면 「파일은 옮겼지만 라이다 파일이 없어 분석을 시작하지 못했습니다.」 알림.
+- 쓸 수 있는 묶음이 없으면 「사용할 수 있는 보관 자료가 없습니다. 대시보드 임시 보관함에서 필수 파일을 모두 올려 주세요.」 안내.
+
+> 참고: 보관함에 올리는 방법은 [B01 임시 보관함](B01/04_임시_보관함).
diff --git a/A05_EduDetail/guide/B03/04_예정노선_가져오기.md b/A05_EduDetail/guide/B03/04_예정노선_가져오기.md
new file mode 100644
index 000000000..80a65ca4c
--- /dev/null
+++ b/A05_EduDetail/guide/B03/04_예정노선_가져오기.md
@@ -0,0 +1,30 @@
+# 예정노선 가져오기
+
+산림청이 우리 회사에 지정해 준 예정노선을 계획노선 칸에 바로 넣음.
+
+## 여는 길
+
+- 파일입력 화면 [계획노선 자료] 카드 맨 아래 [예정노선에서 가져오기] 단추.
+
+
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | [예정노선에서 가져오기] 누름 |
+| 2 | 「지정받은 예정노선 연도 고르기」 창에서 연도를 선택 |
+| 3 | 안내에 따라 [예정노선에서 가져오기] 로 확정 |
+| 4 | 「예정노선을 노선 칸에 넣었습니다.」 알림 후 노선 카드들이 채워짐 |
+
+## 보이는 것
+
+그림은 지정받은 예정노선이 없을 때의 모습 — 있으면 연도 목록이 나타남.
+
+- 지정받은 예정노선이 없으면 「우리 회사에 지정된 예정노선이 없습니다.」 안내.
+- 이미 연결된 노선은 「연결됨: 프로젝트 이름」 표시.
+- 연결한 예정노선이 나중에 바뀌면 화면 위에 「예정노선이 바뀜 …」 띠와 [다시 가져오기] 가 나타남.
+
+> 주의: 이미 분석이 끝난 프로젝트에 가져오면 기존 결과가 지워짐 — 확인 창이 한 번 더 뜸.
+
+> 참고: 받은 예정노선 목록은 [B01 받은 예정노선](B01/03_받은_예정노선).
diff --git a/A05_EduDetail/guide/B03/05_LAS_없이_설계.md b/A05_EduDetail/guide/B03/05_LAS_없이_설계.md
new file mode 100644
index 000000000..160898d3f
--- /dev/null
+++ b/A05_EduDetail/guide/B03/05_LAS_없이_설계.md
@@ -0,0 +1,25 @@
+# LAS 없이 설계
+
+라이다(LAS) 파일이 없을 때 1:5,000 수치지형도의 도엽 등고선으로 지형을 만드는 선택.
+
+## 여는 길
+
+- 파일입력 화면 위쪽 [LAS 없이 설계 (도엽등고선 기반)] 체크 칸.
+
+
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | (그림 ①) [LAS 없이 설계 (도엽등고선 기반)] 에 체크 |
+| 2 | (그림 ②) 포인트클라우드 카드가 흐려지며 필수에서 빠짐 |
+| 3 | 계획노선 파일과 지형 좌표계(PRJ)만 채움 |
+| 4 | [파일 업로드] |
+
+## 보이는 것
+
+- 체크 칸 위에 마우스를 올리면 「포인트클라우드 없이 1:5,000 수치지형도 등고선으로 지형을 만듭니다.」 안내.
+- 체크한 상태에서 LAS · LAZ 파일을 넣으면 「LAS 없이 설계를 켠 상태에서는 LAS/LAZ 파일을 넣을 수 없습니다.」 표시.
+
+> 참고: 전처리 화면에서는 [도엽등고 3D 서피스] 가 지형의 바탕이 됨 → [B04 도엽등고 3D 서피스](B04/04_도엽등고_3D_서피스).
diff --git a/A05_EduDetail/guide/B03/10_필요한_파일.md b/A05_EduDetail/guide/B03/10_필요한_파일.md
index 4fe4b1b22..40e5d5747 100644
--- a/A05_EduDetail/guide/B03/10_필요한_파일.md
+++ b/A05_EduDetail/guide/B03/10_필요한_파일.md
@@ -1,5 +1,11 @@
# 필요한 파일
- 계획노선 — shapefile 한 벌(.shp·.shx·.dbf·.cpg·.prj) 5개.
+
+
+
- 지형 — 포인트클라우드 LAS/LAZ 1개와 좌표계 PRJ, 래스터 기준 TFW.
-- 지형 TIF(DEM)는 선택 사항 — 없어도 지표면 분석이 진행됩니다.
+
+
+
+- 지형 TIF(DEM)는 선택 사항 — 없어도 지표면 분석이 진행됨.
diff --git a/A05_EduDetail/guide/B03/20_고르는_방법.md b/A05_EduDetail/guide/B03/20_고르는_방법.md
index 02333ba83..0075cf534 100644
--- a/A05_EduDetail/guide/B03/20_고르는_방법.md
+++ b/A05_EduDetail/guide/B03/20_고르는_방법.md
@@ -1,5 +1,10 @@
# 고르는 방법
-- 여러 개를 한 번에 끌어 놓으면 확장자로 카드에 자동 배정됩니다.
-- 카드의 [선택]으로 한 칸씩 지정하거나 ✕로 되돌릴 수 있습니다.
-- [임시 보관함]은 대시보드에 미리 올려 둔 자료를 가져옵니다.
+- 여러 개를 한 번에 끌어 놓으면 확장자로 카드에 자동 배정됨.
+
+
+
+- 카드의 [파일 선택]으로 한 칸씩 지정하거나 ✕로 되돌릴 수 있음.
+- [임시 보관함]은 대시보드에 미리 올려 둔 자료를 가져옴.
+
+
diff --git a/A05_EduDetail/guide/B03/30_알아_둘_것.md b/A05_EduDetail/guide/B03/30_알아_둘_것.md
index e80291a60..d21d94a15 100644
--- a/A05_EduDetail/guide/B03/30_알아_둘_것.md
+++ b/A05_EduDetail/guide/B03/30_알아_둘_것.md
@@ -1,5 +1,7 @@
# 알아 둘 것
-- 이미 완료된 프로젝트에 다시 올리면 기존 분석 결과가 교체됩니다.
-- 작업 좌표계는 라이다 PRJ가 기준 — 노선 좌표계와 다르면 업로드가 막힙니다.
-- 라이다가 없으면 [LAS 없는 설계]를 켜고 도엽 등고선으로 진행합니다.
+- 이미 완료된 프로젝트에 다시 올리면 기존 분석 결과가 교체됨.
+- 작업 좌표계는 라이다 PRJ가 기준 — 노선 좌표계와 다르면 업로드가 막힘.
+- 라이다가 없으면 [LAS 없이 설계 (도엽등고선 기반)]를 켜고 도엽 등고선으로 진행함.
+
+
diff --git a/A05_EduDetail/guide/B03/B03_00_overview.webp b/A05_EduDetail/guide/B03/B03_00_overview.webp
new file mode 100644
index 000000000..3e65734e5
Binary files /dev/null and b/A05_EduDetail/guide/B03/B03_00_overview.webp differ
diff --git a/A05_EduDetail/guide/B03/B03_01_pick_row.webp b/A05_EduDetail/guide/B03/B03_01_pick_row.webp
new file mode 100644
index 000000000..aa354ae12
Binary files /dev/null and b/A05_EduDetail/guide/B03/B03_01_pick_row.webp differ
diff --git a/A05_EduDetail/guide/B03/B03_02_route_cards.webp b/A05_EduDetail/guide/B03/B03_02_route_cards.webp
new file mode 100644
index 000000000..4e274e342
Binary files /dev/null and b/A05_EduDetail/guide/B03/B03_02_route_cards.webp differ
diff --git a/A05_EduDetail/guide/B03/B03_03_terrain_cards.webp b/A05_EduDetail/guide/B03/B03_03_terrain_cards.webp
new file mode 100644
index 000000000..7209a81c0
Binary files /dev/null and b/A05_EduDetail/guide/B03/B03_03_terrain_cards.webp differ
diff --git a/A05_EduDetail/guide/B03/B03_04_card_parts.webp b/A05_EduDetail/guide/B03/B03_04_card_parts.webp
new file mode 100644
index 000000000..bb9de7589
Binary files /dev/null and b/A05_EduDetail/guide/B03/B03_04_card_parts.webp differ
diff --git a/A05_EduDetail/guide/B03/B03_05_lasfree_on.webp b/A05_EduDetail/guide/B03/B03_05_lasfree_on.webp
new file mode 100644
index 000000000..74050dbdc
Binary files /dev/null and b/A05_EduDetail/guide/B03/B03_05_lasfree_on.webp differ
diff --git a/A05_EduDetail/guide/B03/B03_06_temp_modal.webp b/A05_EduDetail/guide/B03/B03_06_temp_modal.webp
new file mode 100644
index 000000000..53626031d
Binary files /dev/null and b/A05_EduDetail/guide/B03/B03_06_temp_modal.webp differ
diff --git a/A05_EduDetail/guide/B03/B03_07_plan_import_modal.webp b/A05_EduDetail/guide/B03/B03_07_plan_import_modal.webp
new file mode 100644
index 000000000..9db4c94e6
Binary files /dev/null and b/A05_EduDetail/guide/B03/B03_07_plan_import_modal.webp differ
diff --git a/A05_EduDetail/guide/B03/B03_08_left_panel.webp b/A05_EduDetail/guide/B03/B03_08_left_panel.webp
new file mode 100644
index 000000000..bdbf12fa6
Binary files /dev/null and b/A05_EduDetail/guide/B03/B03_08_left_panel.webp differ
diff --git a/A05_EduDetail/guide/B03/_scenes.json b/A05_EduDetail/guide/B03/_scenes.json
new file mode 100644
index 000000000..a3d912b18
--- /dev/null
+++ b/A05_EduDetail/guide/B03/_scenes.json
@@ -0,0 +1,330 @@
+[
+ {
+ "name": "B03_00_overview",
+ "route": "#/b03-file-input",
+ "project": "road",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b03-file__pick-row"
+ },
+ {
+ "wait_ms": 1500
+ }
+ ],
+ "clip": null,
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".ui-workflow-overlay__panel"
+ },
+ {
+ "n": 2,
+ "sel": ".b03-file__dropzone"
+ },
+ {
+ "n": 3,
+ "sel": ".b03-file__temp-picker .ui-btn"
+ },
+ {
+ "n": 4,
+ "sel": ".b03-file__pick-row > .ui-btn--filled"
+ },
+ {
+ "n": 5,
+ "sel": ".b03-file__lasfree"
+ },
+ {
+ "n": 6,
+ "sel": ".b03-file__columns > :nth-child(1) .b03-file__group-title"
+ },
+ {
+ "n": 7,
+ "sel": ".b03-file__columns > :nth-child(2) .b03-file__group-title"
+ }
+ ]
+ },
+ {
+ "name": "B03_01_pick_row",
+ "route": "#/b03-file-input",
+ "project": "road",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b03-file__pick-row"
+ }
+ ],
+ "clip": ".b03-file__control-panel",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b03-file__dropzone"
+ },
+ {
+ "n": 2,
+ "sel": ".b03-file__temp-picker .ui-btn"
+ },
+ {
+ "n": 3,
+ "sel": ".b03-file__pick-row > .ui-btn--filled"
+ },
+ {
+ "n": 4,
+ "sel": ".b03-file__lasfree"
+ }
+ ]
+ },
+ {
+ "name": "B03_02_route_cards",
+ "route": "#/b03-file-input",
+ "project": "road",
+ "viewport": [
+ 1600,
+ 2000
+ ],
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b03-file__columns"
+ },
+ {
+ "wait_ms": 1500
+ }
+ ],
+ "clip": ".b03-file__columns > :nth-child(1)",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b03-file__columns > :nth-child(1) [data-slot-id=csv]"
+ },
+ {
+ "n": 2,
+ "sel": ".b03-file__columns > :nth-child(1) [data-slot-id=shx]"
+ },
+ {
+ "n": 3,
+ "sel": ".b03-file__columns > :nth-child(1) [data-slot-id=dbf]"
+ },
+ {
+ "n": 4,
+ "sel": ".b03-file__columns > :nth-child(1) [data-slot-id=cpg]"
+ },
+ {
+ "n": 5,
+ "sel": ".b03-file__columns > :nth-child(1) [data-slot-id=route_prj]"
+ }
+ ]
+ },
+ {
+ "name": "B03_03_terrain_cards",
+ "route": "#/b03-file-input",
+ "project": "road",
+ "viewport": [
+ 1600,
+ 2000
+ ],
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b03-file__columns"
+ },
+ {
+ "wait_ms": 1500
+ }
+ ],
+ "clip": ".b03-file__columns > :nth-child(2)",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": "[data-slot-id=las_laz]"
+ },
+ {
+ "n": 2,
+ "sel": "[data-slot-id=prj]"
+ },
+ {
+ "n": 3,
+ "sel": "[data-slot-id=tfw]"
+ },
+ {
+ "n": 4,
+ "sel": "[data-slot-id=tif]"
+ }
+ ]
+ },
+ {
+ "name": "B03_04_card_parts",
+ "route": "#/b03-file-input",
+ "project": "road",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": "[data-slot-id=csv]"
+ },
+ {
+ "wait_ms": 1200
+ }
+ ],
+ "clip": "[data-slot-id=csv]",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": "[data-slot-id=csv] .b03-file__card-label"
+ },
+ {
+ "n": 2,
+ "sel": "[data-slot-id=csv] .ui-tag"
+ },
+ {
+ "n": 3,
+ "sel": "[data-slot-id=csv] .b03-file__card-select"
+ },
+ {
+ "n": 4,
+ "sel": "[data-slot-id=csv] .b03-file__file-info"
+ },
+ {
+ "n": 5,
+ "sel": "[data-slot-id=csv] .b03-file__preview"
+ }
+ ]
+ },
+ {
+ "name": "B03_05_lasfree_on",
+ "route": "#/b03-file-input",
+ "project": "road",
+ "viewport": [
+ 1600,
+ 1500
+ ],
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b03-file__lasfree"
+ },
+ {
+ "click": ".b03-file__lasfree input"
+ },
+ {
+ "wait_ms": 800
+ },
+ {
+ "eval": "(()=>{const q=[\".b03-file__control-panel\", \"[data-slot-id=las_laz]\"];const els=q.map(s=>[...document.querySelectorAll(s)].find(e=>e.getBoundingClientRect().width>0));const rs=els.map(e=>e.getBoundingClientRect());const L=Math.min(...rs.map(r=>r.left)),T=Math.min(...rs.map(r=>r.top)),R=Math.max(...rs.map(r=>r.right)),B=Math.max(...rs.map(r=>r.bottom));const d=document.createElement('div');d.id='__clip';d.style.cssText='position:absolute;pointer-events:none;left:'+(L+scrollX)+'px;top:'+(T+scrollY)+'px;width:'+(R-L)+'px;height:'+(B-T)+'px';document.body.appendChild(d);})()"
+ }
+ ],
+ "clip": "#__clip",
+ "clip_pad": 4,
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b03-file__lasfree"
+ },
+ {
+ "n": 2,
+ "sel": "[data-slot-id=las_laz]"
+ }
+ ]
+ },
+ {
+ "name": "B03_06_temp_modal",
+ "route": "#/b03-file-input",
+ "project": "road",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b03-file__temp-picker .ui-btn"
+ },
+ {
+ "click": ".b03-file__temp-picker .ui-btn"
+ },
+ {
+ "wait": ".b03-file__temp-modal"
+ },
+ {
+ "wait_ms": 800
+ }
+ ],
+ "clip": ".b03-file__temp-modal",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b03-file__temp-modal-actions"
+ }
+ ]
+ },
+ {
+ "name": "B03_07_plan_import_modal",
+ "route": "#/b03-file-input",
+ "project": "road",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b03-file__columns"
+ },
+ {
+ "click": "button:has-text('예정노선에서 가져오기')"
+ },
+ {
+ "wait_ms": 1200
+ }
+ ],
+ "clip": ".ui-modal",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".ui-modal__body"
+ }
+ ]
+ },
+ {
+ "name": "B03_08_left_panel",
+ "route": "#/b03-file-input",
+ "project": "road",
+ "viewport": [
+ 1600,
+ 560
+ ],
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".ui-workflow-overlay__panel"
+ },
+ {
+ "wait_ms": 1200
+ }
+ ],
+ "clip": ".ui-workflow-overlay__panel",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".ui-workflow-overlay__title"
+ },
+ {
+ "n": 2,
+ "sel": ".ui-workflow-overlay__handle--side"
+ },
+ {
+ "n": 3,
+ "sel": ".ui-workflow-overlay__panel .ui-help-btn"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/A05_EduDetail/guide/B04/00_설명서.md b/A05_EduDetail/guide/B04/00_설명서.md
index 399e4ea5f..2dafb8fc0 100644
--- a/A05_EduDetail/guide/B04/00_설명서.md
+++ b/A05_EduDetail/guide/B04/00_설명서.md
@@ -1,9 +1,38 @@
-# 전처리 설명서
+# 전처리
-## 이 화면에서 하는 일
+올린 라이다 점들에서 땅 모양(지표면 모델)을 만들고, 그 지형 위에서 물이 어디로 모이는지(배수유역)까지 확인한 뒤 모델을 확정.
+
+## 여는 길
+
+- 파일입력의 분석이 끝나면 자동으로 열림.
+- 이미 끝난 프로젝트는 대시보드 [프로젝트] 표의 단계 막대에서 「전처리」 누름.
+
+
+
+## 화면 구역
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 입력 포인트클라우드 | 분석할 라이다 파일 선택 · 좌표계 · 크기 · 점 개수 · 높이 범위 확인 |
+| 2 | 지표면 분석 | 지면 필터 · 서피스 · 스무딩을 골라 지표면 모델 선택 |
+| 3 | 모델 표시 옵션 | 축 · 서피스 · 등고선 켜고 끄기 · 등고선 간격 · 점 크기 · 밀도 |
+| 4 | 뷰어 시점 제어 | 사시도 · 상단 · 정면 · 측면으로 시점 바꿈 |
+| 5 | 단추 줄 | [?] 도움말 · [이 모델 확정] · [초기화] |
+| 6 | 진행 띠 | 분석 진행률과 안내 글 |
+| 7 | 입력 포인트클라우드 3D | 올린 점들을 3차원으로 봄 |
+| 8 | 지표면 모델 3D | 만들어진 땅 모양과 등고선 · 계획선 |
+| 9 | 도엽등고 3D 서피스 | 수치지형도 등고선으로 만든 지형 · 라이다 지형과 겹쳐 비교 |
+| 10 | 2D 배경 지도 및 GIS 레이어 | 지도 위에 계획선 · 등고선 · 배수유역 겹쳐 보기 |
## 작업 순서
-## 버튼
+1. 입력 파일과 점 개수 확인 → [입력 포인트클라우드](B04/01_입력_포인트클라우드).
+2. 지면 필터 · 서피스 · 스무딩을 골라 지표면 모델 선택 → [지표면 분석](B04/02_지표면_분석).
+3. 3D 화면을 돌려 보며 표시 옵션 조정 → [3D 보기](B04/03_3D_보기).
+4. 도엽등고 서피스로 라이다 모델과 비교 → [도엽등고 3D 서피스](B04/04_도엽등고_3D_서피스).
+5. 2D 지도에서 배수유역 확인 → [2D 지도와 GIS 레이어](B04/05_2D_지도와_GIS_레이어) · [배수유역](B04/06_배수유역).
+6. [이 모델 확정] → 노선 설계 화면으로 이동 → [모델 확정과 초기화](B04/07_모델_확정과_초기화).
-## 주의할 점
+> 주의: 처음 보는 조합(아직 계산하지 않은 지면 필터 · 서피스)을 고르면 계산 여부를 묻고, 계산에 수 분이 걸릴 수 있음.
+
+> 참고: 이 화면에는 [저장] 단추가 없고, [이 모델 확정] 이 저장과 다음 단계 이동을 겸함.
diff --git a/A05_EduDetail/guide/B04/01_입력_포인트클라우드.md b/A05_EduDetail/guide/B04/01_입력_포인트클라우드.md
new file mode 100644
index 000000000..0436d62bb
--- /dev/null
+++ b/A05_EduDetail/guide/B04/01_입력_포인트클라우드.md
@@ -0,0 +1,27 @@
+# 입력 포인트클라우드
+
+분석에 쓸 라이다 파일을 고르고 파일 정보를 확인.
+
+## 여는 길
+
+- 전처리 화면 왼쪽 패널 맨 위 [입력 포인트클라우드] 카드.
+
+
+
+그림 번호 — ① 입력 LAS 선택 칸 · ② 파일 정보 줄.
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 선택 칸에서 분석할 입력 LAS 선택 (대개 하나) |
+| 2 | 아래 정보 줄 확인 |
+| 3 | 오른쪽 위 3D 화면에서 점이 제대로 보이는지 확인 |
+
+## 보이는 것
+
+- 정보 줄: 좌표계(EPSG 번호) · 크기(MB) · 포인트 수 · 표시 포인트 수 · 높이 범위(m).
+- 포인트 수가 크면 화면에는 50만 개 정도로 솎아 보여 줌(「500,000개 점 표시 중」).
+- 선택한 지면 필터에 따라 포인트 수가 달라짐(땅 점만 남기 때문).
+
+> 참고: 분석할 라이다 파일이 없으면 「분석 가능한 LAS/LAZ 파일이 없습니다.」 표시. [LAS 없이 설계] 로 올린 프로젝트는 도엽등고 서피스를 씀 → [B03 LAS 없이 설계](B03/05_LAS_없이_설계).
diff --git a/A05_EduDetail/guide/B04/02_지표면_분석.md b/A05_EduDetail/guide/B04/02_지표면_분석.md
new file mode 100644
index 000000000..3e57a52ca
--- /dev/null
+++ b/A05_EduDetail/guide/B04/02_지표면_분석.md
@@ -0,0 +1,43 @@
+# 지표면 분석
+
+지면 필터 · 서피스 · 스무딩 세 가지를 골라 지표면 모델을 정함.
+
+## 여는 길
+
+- 전처리 화면 왼쪽 패널 [지표면 분석] 카드.
+
+
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | [지면 필터] 선택 — 나무 · 건물 점을 걷어내고 땅 점만 고르는 방법 |
+| 2 | [서피스] 선택 — 땅 점들을 면으로 만드는 방법 |
+| 3 | [스무딩] 에서 적용 또는 미적용 |
+| 4 | 오른쪽 위 3D 화면의 지표면 모델이 바뀌는지 확인 |
+
+그림 번호는 아래 표의 번호와 같음.
+
+| 번호 | 칸 | 선택지 |
+| --- | --- | --- |
+| 1 | 지면 필터 | CLASSIFICATION · GRID MIN Z · CSF · PMF |
+| 2 | 서피스 | TIN · DTM · NURBS · IMPLICIT · MESHFREE |
+| 3 | 스무딩 | 적용 · 미적용 |
+
+- CLASSIFICATION: 라이다 업체가 이미 분류해 둔 지면 점을 그대로 씀.
+- GRID MIN Z: 격자마다 가장 낮은 점을 땅으로 봄.
+- CSF: 지형을 뒤집어 가상의 천을 떨어뜨려 땅 점을 고름.
+- PMF: 창 크기를 키워 가며 나무 · 구조물을 단계적으로 걷어냄.
+
+## 보이는 것
+
+
+
+- 그림 ① 은 [서피스] 칸. 아직 계산하지 않은 조합을 고르면 「이 조합(…)은 아직 만들어지지 않았습니다. 지금 계산해 영구 저장할까요? 자료량에 따라 수 분이 걸립니다.」 확인 창이 뜸.
+- [계산하기] 를 누르면 계산해 저장하고, [취소] 하면 이전 조합으로 돌아감.
+- 서피스에 따라 스무딩이 안 되는 경우 「이 지표면 표현은 스무딩을 지원하지 않습니다.」 표시.
+
+> 주의: [계산하기] 는 오래 걸리고 창을 닫으면 안 됨 — 「지표면 모델 계산 중… 창을 닫지 마세요.」 표시 동안 기다림.
+
+> 참고: 이미 계산해 둔 조합은 바로 바뀜. 어느 조합이 가장 알맞은지 판단은 설계자가 정함.
diff --git a/A05_EduDetail/guide/B04/03_3D_보기.md b/A05_EduDetail/guide/B04/03_3D_보기.md
new file mode 100644
index 000000000..17fc21ffa
--- /dev/null
+++ b/A05_EduDetail/guide/B04/03_3D_보기.md
@@ -0,0 +1,53 @@
+# 3D 보기
+
+입력 포인트클라우드와 지표면 모델을 3차원으로 돌려 보고, 표시 옵션과 시점을 바꿈.
+
+## 여는 길
+
+- 전처리 화면 위쪽 3D 화면 둘 · 왼쪽 패널의 [모델 표시 옵션] · [뷰어 시점 제어].
+
+
+
+그림 번호 — ① 입력 포인트클라우드 아래 점 개수 글 · ② 축척 막대 · ③ 방위 표시 · ④ 등고선 라벨.
+
+## 단계
+
+### 마우스로 보기
+
+| 조작 | 하는 일 |
+| --- | --- |
+| 왼쪽 단추를 누른 채 끌기 | 가리킨 점을 중심으로 돌림 |
+| 휠 | 가리킨 자리를 기준으로 가까이 · 멀리 |
+| 가운데(휠) 단추를 누른 채 끌기 | 화면을 옮김 |
+
+### 표시 옵션
+
+
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | (그림 ① — 첫 단추 [축] 과 같은 줄의 [서피스] · [등고선]) 단추로 보이는 것을 켜고 끔 |
+| 2 | (그림 ② ③) 등고선을 켠 뒤 [간격] 칸에 숫자(m)를 넣고 [적용] |
+| 3 | (그림 ④) [점 크기] 슬라이더로 점의 굵기 조정 |
+| 4 | (그림 ⑤) [밀도] 슬라이더로 보이는 점의 비율 조정 |
+
+### 시점 바꾸기
+
+
+
+그림 번호는 아래 표 순서와 같음.
+
+| 단추 | 시점 |
+| --- | --- |
+| 사시도 | 비스듬히 내려다봄 |
+| 상단 | 바로 위에서 봄 |
+| 정면 | 앞쪽에서 봄 |
+| 측면 | 옆에서 봄 |
+
+## 보이는 것
+
+- 지표면 모델 화면에는 축척 막대 · 방위 표시 · 높이 색 범례 · 등고선 라벨(예: 850m) · 계획선이 함께 보임.
+- 등고선을 처음 켜면 「등고선을 그리는 중…」 표시 후 나타남.
+- 등고선 옵션 줄 아래에 현재 조합 요약(예: CLASSIFICATION · DTM · 등고선 1m)이 보임.
+
+> 참고: 점 크기와 밀도를 줄이면 오래된 컴퓨터에서 3D 화면이 부드러워짐.
diff --git a/A05_EduDetail/guide/B04/04_도엽등고_3D_서피스.md b/A05_EduDetail/guide/B04/04_도엽등고_3D_서피스.md
new file mode 100644
index 000000000..e3ce88205
--- /dev/null
+++ b/A05_EduDetail/guide/B04/04_도엽등고_3D_서피스.md
@@ -0,0 +1,33 @@
+# 도엽등고 3D 서피스
+
+1:5,000 수치지형도(도엽)의 등고선만으로 만든 지형 모델. 라이다 모델과 비교하거나 라이다가 없을 때의 지형으로 씀.
+
+## 여는 길
+
+- 전처리 화면 가운데 [도엽등고 3D 서피스] 구역(3D 화면 둘 바로 아래).
+
+
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 위쪽 단추 줄에서 만드는 방법 선택 — TIN(도엽선) · TIN 격자 · TPS(박판) · ANUDEM형 · 다중해상도 · 라플라스 |
+| 2 | [스무딩] 에서 적용 또는 미적용 |
+| 3 | [라이다 겹쳐 보기] 에 체크하면 라이다 지표면과 겹쳐 비교 |
+| 4 | 3D 화면을 돌려 두 모델의 차이를 확인 |
+
+| 번호 | 칸 | 하는 일 |
+| --- | --- | --- |
+| 1 | 방법 단추 줄 | 도엽 등고선으로 면을 만드는 방법 선택 |
+| 2 | 스무딩 | 면을 매끈하게 다듬음 |
+| 3 | 라이다 겹쳐 보기 | 라이다 모델과 겹침 |
+
+## 보이는 것
+
+- 위 그림은 현재 [라플라스] 가 진하게 표시된 모습.
+- 흐리게 보이는 방법은 아직 만들어지지 않은 것. 누르면 계산할지 묻는 확인 창이 뜸.
+- 지금 쓰는 방법은 진한 색으로 표시됨.
+- 라이다 지표면 모델이 없으면 「겹쳐 볼 라이다 지표면 모델이 없습니다.」 표시.
+
+> 참고: 3D 보는 조작은 위의 3D 화면과 같음 → [3D 보기](B04/03_3D_보기).
diff --git a/A05_EduDetail/guide/B04/05_2D_지도와_GIS_레이어.md b/A05_EduDetail/guide/B04/05_2D_지도와_GIS_레이어.md
new file mode 100644
index 000000000..254484824
--- /dev/null
+++ b/A05_EduDetail/guide/B04/05_2D_지도와_GIS_레이어.md
@@ -0,0 +1,38 @@
+# 2D 지도와 GIS 레이어
+
+배경 지도 위에 계획선 · 지적 · 행정구역 · 등고선 같은 국가 GIS 자료를 겹쳐 봄.
+
+## 여는 길
+
+- 전처리 화면 맨 아래 [2D 배경 지도 및 GIS 레이어] 구역.
+
+
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | [배경 지도] 줄에서 백지도 · 위성 · 하이브리드 가운데 선택 |
+| 2 | [국가 GIS 레이어] 줄에서 보고 싶은 층 단추를 눌러 켜고 끔 |
+| 3 | 지도 위에서 휠로 확대 · 축소, 가운데 단추를 끌어 옮김 |
+| 4 | 처음 모습으로 돌아가려면 [보기 초기화] |
+
+| 번호 | 줄 | 단추 |
+| --- | --- | --- |
+| 1 | 배경 지도 | 백지도 · 위성 · 하이브리드 |
+| 2 | 국가 GIS 레이어 | 계획선 · 연속지적도 · 시군구 · 읍면동 · 등고선 · 도엽 등고선 · 세류(전체) · 표고점 · 성절토 · 옹벽석축 · 등고 라벨 |
+| 3 | 배수유역 | 유역 분석 · 1차 유역 · 2차 유역 · 유역 방향 · 평균 흐름 · 흐름 강도 · 집중유역 · 상세유역 분석 · 세부유역 |
+| 4 | 보기 초기화 | 확대와 위치를 처음으로 |
+
+## 보이는 것
+
+
+
+- 그림 ① 지도 오른쪽 아래 「○○개 객체 표시」 · ② 왼쪽 아래 축척 막대 · ③ 오른쪽 흐름 강도 색 범례 · ④ 위쪽 분석 결과 요약 글.
+- 켠 단추는 색 테두리로 표시됨.
+- 지도 오른쪽 아래에 「○○개 객체 표시」 · 왼쪽 아래에 축척 막대.
+- 흐름 강도를 켜면 오른쪽에 색 범례 · 위쪽에 분석 결과 요약 글이 나옴.
+- 지도를 불러오는 중에는 「지도 레이어를 불러오는 중입니다.」 · 실패하면 「지도 레이어를 불러오지 못했습니다.」 표시.
+- 계획선은 파일입력에서 올린 노선. 올리지 않았으면 「B03에서 계획노선 파일을 올리면 표시됩니다.」 표시.
+
+> 참고: 마우스 왼쪽 단추는 지도 위 객체를 고르는 데만 쓰고, 지도 이동은 가운데 단추.
diff --git a/A05_EduDetail/guide/B04/06_배수유역.md b/A05_EduDetail/guide/B04/06_배수유역.md
new file mode 100644
index 000000000..60a43460c
--- /dev/null
+++ b/A05_EduDetail/guide/B04/06_배수유역.md
@@ -0,0 +1,40 @@
+# 배수유역
+
+계획선 둘레에서 물이 어디로 모여 흘러드는지 지도에서 분석해 보고, 관이 들어갈 자리를 정함.
+
+## 여는 길
+
+- 전처리 화면 맨 아래 지도 구역의 [배수유역] 줄.
+
+
+
+그림 번호 — ③ 흐름 강도 색 범례 · ④ 분석 결과 요약 글(자세한 번호는 [2D 지도와 GIS 레이어](B04/05_2D_지도와_GIS_레이어) 참고).
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | [유역 분석] 을 누름 — 30초 안팎 걸림 · 결과는 저장되어 다음에 열면 바로 보임 |
+| 2 | [1차 유역] · [2차 유역] · [유역 방향] · [평균 흐름] 을 켜고 끄며 결과 확인 |
+| 3 | [흐름 강도] 로 도로 1m마다 모이는 상류 면적을 색으로 확인 |
+| 4 | [집중유역] 으로 물이 특히 많이 모이는 자리(마커) 확인 · 마커를 누르면 그 자리로 들어오는 면의 외곽선이 보임 |
+| 5 | [상세유역 분석] 을 누르면 관 매설 지점을 기준으로 [세부유역] 을 나눔 |
+
+### 관 매설 지점 고르기
+
+| 조작 | 하는 일 |
+| --- | --- |
+| 계획선 위에서 오른쪽 단추 | [관 매설 추가] |
+| 마커 위에서 오른쪽 단추 | [관 매설 삭제] |
+| 마커를 끌기 | 계획선을 따라 자리 옮김 |
+
+## 보이는 것
+
+- 분석 중에는 「배수유역을 처음부터 다시 분석하는 중입니다. 30초 안팎 걸립니다…」 표시.
+- 저장된 결과가 있으면 [저장분] 표시와 함께 면적 · 유하장 같은 요약 글.
+- 관 요약 글 예: 「관 1개(기본 1 / 자동 0 / 수동 0) · 세부유역 2개」.
+- 관끼리 너무 가까우면 「관끼리 최소 간격 ○○m 안에는 넣을 수 없습니다.」.
+
+> 주의: 관을 고친 뒤에는 [상세유역 분석] 을 다시 눌러야 세부유역이 새로 나뉨(「편집 중」 표시).
+
+> 참고: 분석 결과와 관 매설 지점은 [이 모델 확정] 때 함께 저장됨 → [모델 확정과 초기화](B04/07_모델_확정과_초기화).
diff --git a/A05_EduDetail/guide/B04/07_모델_확정과_초기화.md b/A05_EduDetail/guide/B04/07_모델_확정과_초기화.md
new file mode 100644
index 000000000..c33861710
--- /dev/null
+++ b/A05_EduDetail/guide/B04/07_모델_확정과_초기화.md
@@ -0,0 +1,31 @@
+# 모델 확정과 초기화
+
+고른 지표면 모델과 표시 설정을 확정해 노선 설계로 넘어가거나, 화면 값을 확정된 상태로 되돌림.
+
+## 여는 길
+
+- 전처리 화면 왼쪽 패널 맨 아래 단추 줄.
+
+
+
+그림 번호 — ① [?] · ② [이 모델 확정] · ③ [초기화].
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 지면 필터 · 서피스 · 스무딩과 등고선 간격을 정함 |
+| 2 | 배수유역을 분석했다면 관 매설 지점을 확인 |
+| 3 | [이 모델 확정] 누름 |
+| 4 | 「모델을 확정했습니다. 필터: …, 기법: …」 알림과 함께 노선 설계 화면(B05)으로 이동 |
+| 5 | 화면 값을 확정 상태로 되돌리려면 [초기화] |
+
+## 보이는 것
+
+- 확정하면 선택한 모델 · 스무딩 · 등고선 간격과 관 매설 지점이 함께 저장됨.
+- [초기화] 는 지면 필터 · 서피스를 기본으로 되돌리고 확정된 값을 다시 불러옴.
+- 오류 시 「모델 확정에 실패했습니다.」 알림.
+
+> 주의: 확정하면 이전 확정 값이 새 값으로 바뀜. 누르기 전에 지면 필터 · 서피스 · 스무딩 선택을 한 번 더 확인.
+
+> 참고: [?] 는 이 화면의 도움말.
diff --git a/A05_EduDetail/guide/B04/B04_00_overview.webp b/A05_EduDetail/guide/B04/B04_00_overview.webp
new file mode 100644
index 000000000..a8049d8ad
Binary files /dev/null and b/A05_EduDetail/guide/B04/B04_00_overview.webp differ
diff --git a/A05_EduDetail/guide/B04/B04_01_input_cloud.webp b/A05_EduDetail/guide/B04/B04_01_input_cloud.webp
new file mode 100644
index 000000000..e2057a634
Binary files /dev/null and b/A05_EduDetail/guide/B04/B04_01_input_cloud.webp differ
diff --git a/A05_EduDetail/guide/B04/B04_02_analysis_card.webp b/A05_EduDetail/guide/B04/B04_02_analysis_card.webp
new file mode 100644
index 000000000..93010404c
Binary files /dev/null and b/A05_EduDetail/guide/B04/B04_02_analysis_card.webp differ
diff --git a/A05_EduDetail/guide/B04/B04_03_build_confirm.webp b/A05_EduDetail/guide/B04/B04_03_build_confirm.webp
new file mode 100644
index 000000000..b341e5c72
Binary files /dev/null and b/A05_EduDetail/guide/B04/B04_03_build_confirm.webp differ
diff --git a/A05_EduDetail/guide/B04/B04_04_display_options.webp b/A05_EduDetail/guide/B04/B04_04_display_options.webp
new file mode 100644
index 000000000..53662ab14
Binary files /dev/null and b/A05_EduDetail/guide/B04/B04_04_display_options.webp differ
diff --git a/A05_EduDetail/guide/B04/B04_05_view_controls.webp b/A05_EduDetail/guide/B04/B04_05_view_controls.webp
new file mode 100644
index 000000000..cbf0e98d4
Binary files /dev/null and b/A05_EduDetail/guide/B04/B04_05_view_controls.webp differ
diff --git a/A05_EduDetail/guide/B04/B04_06_confirm_reset.webp b/A05_EduDetail/guide/B04/B04_06_confirm_reset.webp
new file mode 100644
index 000000000..56ac79ba5
Binary files /dev/null and b/A05_EduDetail/guide/B04/B04_06_confirm_reset.webp differ
diff --git a/A05_EduDetail/guide/B04/B04_07_two_viewers.webp b/A05_EduDetail/guide/B04/B04_07_two_viewers.webp
new file mode 100644
index 000000000..1e14a6e7a
Binary files /dev/null and b/A05_EduDetail/guide/B04/B04_07_two_viewers.webp differ
diff --git a/A05_EduDetail/guide/B04/B04_08_sheet_surface.webp b/A05_EduDetail/guide/B04/B04_08_sheet_surface.webp
new file mode 100644
index 000000000..72aba3361
Binary files /dev/null and b/A05_EduDetail/guide/B04/B04_08_sheet_surface.webp differ
diff --git a/A05_EduDetail/guide/B04/B04_09_map_layers.webp b/A05_EduDetail/guide/B04/B04_09_map_layers.webp
new file mode 100644
index 000000000..f381b9881
Binary files /dev/null and b/A05_EduDetail/guide/B04/B04_09_map_layers.webp differ
diff --git a/A05_EduDetail/guide/B04/B04_10_map_view.webp b/A05_EduDetail/guide/B04/B04_10_map_view.webp
new file mode 100644
index 000000000..c8fa1aeba
Binary files /dev/null and b/A05_EduDetail/guide/B04/B04_10_map_view.webp differ
diff --git a/A05_EduDetail/guide/B04/_scenes.json b/A05_EduDetail/guide/B04/_scenes.json
new file mode 100644
index 000000000..e40cde8a8
--- /dev/null
+++ b/A05_EduDetail/guide/B04/_scenes.json
@@ -0,0 +1,404 @@
+[
+ {
+ "name": "B04_00_overview",
+ "route": "#/b04-preprocess",
+ "project": "road",
+ "viewport": [
+ 1600,
+ 2000
+ ],
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b04-surface__viewers"
+ },
+ {
+ "wait_ms": 2500
+ }
+ ],
+ "settle_ms": 6000,
+ "clip": null,
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(1)"
+ },
+ {
+ "n": 2,
+ "sel": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(2)"
+ },
+ {
+ "n": 3,
+ "sel": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(3)"
+ },
+ {
+ "n": 4,
+ "sel": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(4)"
+ },
+ {
+ "n": 5,
+ "sel": ".ui-sidebar-actions"
+ },
+ {
+ "n": 6,
+ "sel": ".b04-surface__status"
+ },
+ {
+ "n": 7,
+ "sel": ".point-viewer"
+ },
+ {
+ "n": 8,
+ "sel": ".b04-surface__viewers > .terrain-model-group"
+ },
+ {
+ "n": 9,
+ "sel": ".b04-surface__sheet-section"
+ },
+ {
+ "n": 10,
+ "sel": ".b04-map"
+ }
+ ]
+ },
+ {
+ "name": "B04_01_input_cloud",
+ "route": "#/b04-preprocess",
+ "project": "road",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b04-surface__form"
+ }
+ ],
+ "settle_ms": 6000,
+ "clip": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(1)",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(1) select"
+ },
+ {
+ "n": 2,
+ "sel": ".b04-surface__input-info"
+ }
+ ]
+ },
+ {
+ "name": "B04_02_analysis_card",
+ "route": "#/b04-preprocess",
+ "project": "road",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b04-surface__form"
+ }
+ ],
+ "settle_ms": 6000,
+ "clip": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(2)",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(2) .b04-surface__field:nth-of-type(1)"
+ },
+ {
+ "n": 2,
+ "sel": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(2) .b04-surface__field:nth-of-type(2)"
+ },
+ {
+ "n": 3,
+ "sel": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(2) .b04-surface__field:nth-of-type(3)"
+ }
+ ]
+ },
+ {
+ "name": "B04_03_build_confirm",
+ "route": "#/b04-preprocess",
+ "project": "road",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b04-surface__form"
+ },
+ {
+ "select": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(2) select >> nth=1",
+ "value": "NURBS"
+ },
+ {
+ "wait_ms": 1500
+ }
+ ],
+ "settle_ms": 6000,
+ "clip": null,
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(2) select >> nth=1"
+ }
+ ]
+ },
+ {
+ "name": "B04_04_display_options",
+ "route": "#/b04-preprocess",
+ "project": "road",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b04-surface__form"
+ }
+ ],
+ "settle_ms": 6000,
+ "clip": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(3)",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".model-display-options > .toggle-button:nth-child(1)"
+ },
+ {
+ "n": 2,
+ "sel": ".contour-interval-input"
+ },
+ {
+ "n": 3,
+ "sel": ".contour-interval-submit"
+ },
+ {
+ "n": 4,
+ "sel": ".viewer-option-row:nth-of-type(1)"
+ },
+ {
+ "n": 5,
+ "sel": ".viewer-option-row:nth-of-type(2)"
+ }
+ ]
+ },
+ {
+ "name": "B04_05_view_controls",
+ "route": "#/b04-preprocess",
+ "project": "road",
+ "viewport": [
+ 1600,
+ 1100
+ ],
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b04-surface__form"
+ }
+ ],
+ "settle_ms": 6000,
+ "clip": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(4)",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(4) button >> nth=0",
+ "pos": "bl"
+ },
+ {
+ "n": 2,
+ "sel": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(4) button >> nth=1",
+ "pos": "bl"
+ },
+ {
+ "n": 3,
+ "sel": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(4) button >> nth=2",
+ "pos": "bl"
+ },
+ {
+ "n": 4,
+ "sel": ".b04-surface__form .ui-sidebar-scroll > section:nth-child(4) button >> nth=3",
+ "pos": "bl"
+ }
+ ]
+ },
+ {
+ "name": "B04_06_confirm_reset",
+ "route": "#/b04-preprocess",
+ "project": "road",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".ui-sidebar-actions"
+ }
+ ],
+ "settle_ms": 6000,
+ "clip": ".ui-sidebar-actions",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".ui-sidebar-actions .ui-help-btn"
+ },
+ {
+ "n": 2,
+ "sel": ".ui-sidebar-actions .ui-btn--filled"
+ },
+ {
+ "n": 3,
+ "sel": ".b04-surface__reset"
+ }
+ ]
+ },
+ {
+ "name": "B04_07_two_viewers",
+ "route": "#/b04-preprocess",
+ "project": "road",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b04-surface__viewers"
+ },
+ {
+ "wait_ms": 2500
+ }
+ ],
+ "settle_ms": 6000,
+ "clip": ".b04-surface__viewers",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".point-viewer .b04-surface__status-info"
+ },
+ {
+ "n": 2,
+ "sel": ".point-viewer .b04-surface__scale"
+ },
+ {
+ "n": 3,
+ "sel": ".terrain-model-group .b04-surface__compass"
+ },
+ {
+ "n": 4,
+ "sel": ".terrain-model-group .contour-label"
+ }
+ ]
+ },
+ {
+ "name": "B04_08_sheet_surface",
+ "route": "#/b04-preprocess",
+ "project": "road",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b04-surface__sheet-section"
+ },
+ {
+ "scroll": ".b04-surface__sheet-section"
+ },
+ {
+ "wait_ms": 2500
+ }
+ ],
+ "settle_ms": 6000,
+ "clip": ".b04-surface__sheet-section",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b04-surface__sheet-toolbar"
+ },
+ {
+ "n": 2,
+ "sel": ".b04-surface__sheet-smoothing"
+ },
+ {
+ "n": 3,
+ "sel": ".b04-surface__sheet-lidar"
+ }
+ ]
+ },
+ {
+ "name": "B04_09_map_layers",
+ "route": "#/b04-preprocess",
+ "project": "road",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b04-map"
+ },
+ {
+ "scroll": ".b04-map"
+ },
+ {
+ "wait_ms": 2500
+ }
+ ],
+ "settle_ms": 6000,
+ "clip": ".b04-map__controls",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b04-map__control-group:nth-child(1)"
+ },
+ {
+ "n": 2,
+ "sel": ".b04-map__control-group:nth-child(2)"
+ },
+ {
+ "n": 3,
+ "sel": ".b04-map__control-group:nth-child(3)"
+ },
+ {
+ "n": 4,
+ "sel": ".b04-map__controls > button"
+ }
+ ]
+ },
+ {
+ "name": "B04_10_map_view",
+ "route": "#/b04-preprocess",
+ "project": "road",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b04-map"
+ },
+ {
+ "scroll": ".b04-map"
+ },
+ {
+ "wait_ms": 8000
+ }
+ ],
+ "settle_ms": 6000,
+ "clip": ".b04-map",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b04-map__status-corner"
+ },
+ {
+ "n": 2,
+ "sel": ".b04-map__scale"
+ },
+ {
+ "n": 3,
+ "sel": ".ui-flow-legend"
+ },
+ {
+ "n": 4,
+ "sel": ".b04-map__watershed-status"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/A05_EduDetail/guide/B09/01_데이터_점검.md b/A05_EduDetail/guide/B09/01_데이터_점검.md
index 01797f0f9..ffadbcf30 100644
--- a/A05_EduDetail/guide/B09/01_데이터_점검.md
+++ b/A05_EduDetail/guide/B09/01_데이터_점검.md
@@ -9,6 +9,8 @@

+그림 번호 — 1 [업데이트] · 2 연결 없음 곳 수
+
## 단계
### 단가 새로 굳히기
@@ -35,6 +37,8 @@

+그림 번호 — 1 연결 없음 곳 수 · 2 연결 없는 줄(누르면 그 탭의 그 줄로 이동)
+
### 처음 상태로 되돌리기
| 단계 | 할 일 |
@@ -45,6 +49,8 @@

+그림 번호 — 1 안내 글 · 2 [취소] · [초기화]
+
### 하단 [?] [<] [>]
| 단추 | 하는 일 |
diff --git a/A05_EduDetail/guide/B09/03_박스보기와_호표보기.md b/A05_EduDetail/guide/B09/03_박스보기와_호표보기.md
index 5619ef5fc..328303eab 100644
--- a/A05_EduDetail/guide/B09/03_박스보기와_호표보기.md
+++ b/A05_EduDetail/guide/B09/03_박스보기와_호표보기.md
@@ -10,6 +10,8 @@

+그림 번호 — 1 박스보기 · 호표보기 스위치 · 2 하이퍼링크 · 팝업 스위치 · 3 [?] [<] [>] [초기화]
+
## 단계
| 단계 | 할 일 |
@@ -22,12 +24,6 @@
| 6 | 호표 하나의 모든 줄을 한 표로 보려면 좌측 하단 [호표보기] 를 누름. 같은 호표 줄 구간이 이어진 표로 나타남. |
| 7 | 박스보기로 돌아가려면 [박스보기] 를 누름. |
-
-
-
-
-
-
### 줄 누르기와 키
- 박스 안 줄 또는 박스를 누르면 그 줄을 낸 탭으로 이동하거나 팝업이 뜸([하이퍼링크\|팝업] 스위치에 따름) → [04 하이퍼링크와 팝업](04_하이퍼링크와_팝업)
diff --git a/A05_EduDetail/guide/B09/04_하이퍼링크와_팝업.md b/A05_EduDetail/guide/B09/04_하이퍼링크와_팝업.md
index 0b72d1cd2..d0b446daf 100644
--- a/A05_EduDetail/guide/B09/04_하이퍼링크와_팝업.md
+++ b/A05_EduDetail/guide/B09/04_하이퍼링크와_팝업.md
@@ -23,8 +23,6 @@
| 6 | 창 오른쪽 위 [탭 이동] 을 누르면 창이 모두 닫히고 그 탭의 해당 줄로 옮겨 감. |
| 7 | [×] 는 그 창과 그 위에 겹친 창만 닫음. 창 밖을 누르거나 Esc 를 누르면 모든 창이 닫힘. |
-
-
### 하이퍼링크로 보기
| 단계 | 할 일 |
diff --git a/A05_EduDetail/guide/B09/05_설계내역서.md b/A05_EduDetail/guide/B09/05_설계내역서.md
index c0da548dc..2b73d4540 100644
--- a/A05_EduDetail/guide/B09/05_설계내역서.md
+++ b/A05_EduDetail/guide/B09/05_설계내역서.md
@@ -9,6 +9,8 @@

+그림 번호 — 1 위쪽 도구 줄 · 2 설계내역서 표
+
## 표의 칸
| 칸 | 내용 |
@@ -66,6 +68,8 @@

+그림 번호 — 1 [들여쓰기] · 2 [내어쓰기] · 3 [위로] · 4 [아래로]
+
표 아래 안내 글: 「줄 누르고 버튼 · 방향키 ←→ 레벨 · ↑↓ 자리 · 줄 끌기 · 더블클릭 · Enter · F2 입력」
### 줄 끌어 놓기
@@ -85,6 +89,8 @@

+그림 번호 — 1 단가연결 램프(점) 열
+
## 보이는 것
- 직접 만든 줄은 자동 줄과 구분되는 줄 모양으로 표시됨.
diff --git a/A05_EduDetail/guide/B09/06_단가연결과_운반_단가.md b/A05_EduDetail/guide/B09/06_단가연결과_운반_단가.md
index 2e776b0d0..a32fc0681 100644
--- a/A05_EduDetail/guide/B09/06_단가연결과_운반_단가.md
+++ b/A05_EduDetail/guide/B09/06_단가연결과_운반_단가.md
@@ -10,6 +10,8 @@

+그림 번호 — 1 이름 · 키 찾기 칸 · 2 마스터 · 회사 · 개인 고르기 · 3 [닫기]
+
## 단가연결 창
창 제목은 「단가연결」 이고 닫기 단추가 있음.
@@ -36,8 +38,6 @@
운반공 줄(거리이정표 행 하나)의 단가를 거리와 작업 조건으로 맞추는 큰 창. 제목은 「운반 단가 — 줄 이름」.
-
-
### 창 구성
| 구역 | 하는 일 |
@@ -61,8 +61,6 @@
| 8 | 연결을 바꾸려면 [변경] → 단가연결 창에서 다른 항목을 고름. 오른쪽 계산 과정도 새 항목으로 바뀜. |
| 9 | 마치면 [적용] 을 누름. 연결이 없는 채로 [적용] 하면 「연결할 것을 먼저 고르세요」 알림이 뜸. |
-
-
### 조합을 연결한 경우
- 조합(구조물 조합 · 사전조합)은 담긴 로직 이름별로 입력 칸이 나뉘어 보임.
diff --git a/A05_EduDetail/guide/B09/07_총괄과_공사원가계산서.md b/A05_EduDetail/guide/B09/07_총괄과_공사원가계산서.md
index f15fb7e2f..be1aac5fa 100644
--- a/A05_EduDetail/guide/B09/07_총괄과_공사원가계산서.md
+++ b/A05_EduDetail/guide/B09/07_총괄과_공사원가계산서.md
@@ -47,6 +47,8 @@

+그림 번호 — 1 요율(%) 열 머리 · 2 직접 적을 수 있는 칸 · 3 요율 출처 열
+
### 보이는 것
- 요율 칸이나 요율 출처 칸에 마우스를 올리면 「자동 근거 — … · 기준 이름」 풍선이 보임.
diff --git a/A05_EduDetail/guide/B09/08_단가_근거_탭.md b/A05_EduDetail/guide/B09/08_단가_근거_탭.md
index 1d7d566d3..4d28d515f 100644
--- a/A05_EduDetail/guide/B09/08_단가_근거_탭.md
+++ b/A05_EduDetail/guide/B09/08_단가_근거_탭.md
@@ -93,8 +93,6 @@
| 4 | 목록의 파일 이름(크기 KB) 단추를 누르면 내려받음. 옆 [삭제] 로 지움. |
| 5 | [닫기] 로 창을 닫으면 표 칸의 파일 수가 반영되어 있음. |
-
-
> 참고: 견적서 파일은 올리는 즉시 저장되어 [초기화] 해도 남음.
> 참고: 자재 단가를 바꾸면 이 자재를 쓰는 일위대가 · 단가산출 · 중기사용료 · 설계내역서 자재 줄의 금액이 모두 바뀜.
diff --git a/A05_EduDetail/guide/B09/10_인쇄_미리보기.md b/A05_EduDetail/guide/B09/10_인쇄_미리보기.md
new file mode 100644
index 000000000..8325e2f65
--- /dev/null
+++ b/A05_EduDetail/guide/B09/10_인쇄_미리보기.md
@@ -0,0 +1,45 @@
+# 인쇄 미리보기
+
+도면 · 수량산출 · 원가계산을 PDF 로 미리 보고, PDF 와 엑셀로 내려받는 화면임.
+
+## 여는 길
+
+- 원가계산 화면(B09)의 왼쪽 아래 [인쇄 미리보기] 단추를 누름. 고친 값을 먼저 저장한 뒤 이 화면으로 넘어옴. 저장이 안 되면 원가계산 화면에 머묾.
+- 원가계산 화면의 [>] 단추로도 들어옴 (단계 6 완료 뒤).
+- 현재 프로젝트가 열려 있어야 함. 프로젝트가 없으면 「현재 프로젝트가 없습니다.」 알림이 뜸.
+- 되돌아갈 때 = 왼쪽 아래 [B09 복귀].
+
+
+
+그림 번호 — 1 [인쇄 미리보기]
+
+
+
+그림 번호 — 아래 구역 표와 같음
+
+## 화면 구역
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 영역 카드 | [도면] [수량산출] [원가계산] 중 인쇄할 묶음을 고름 → [영역과 쪽 고르기](11_인쇄_영역과_쪽_고르기) |
+| 2 | 쪽 목록 카드 | 고른 영역의 쪽 목록. 체크를 빼면 그 쪽은 PDF · 엑셀에서 빠짐 → [영역과 쪽 고르기](11_인쇄_영역과_쪽_고르기) |
+| 3 | 상태 한 줄 | 만드는 중 · 쪽 수 · 오류 이유를 한 줄로 알려 줌 → [미리보기 보기](12_인쇄_미리보기_보기) |
+| 4 | 미리보기 칸 | 고른 쪽들의 PDF 가 그대로 보임. 보이는 것이 곧 받는 파일임 → [미리보기 보기](12_인쇄_미리보기_보기) |
+| 5 | 아래 단추 줄 | [PDF 다운로드](표 영역은 [엑셀 다운로드] 도), 그 아래 [?] [B09 복귀] → [내려받기](13_인쇄_내려받기) |
+
+> 참고: 전체 작업 단계는 왼쪽 위 ☰ 를 눌러 여는 진행 단계 판에서 봄. 지금은 마지막 단계(원가계산 다음)에 있음.
+
+## 작업 순서
+
+1. 원가계산 화면에서 [인쇄 미리보기] 를 눌러 들어옴.
+2. 영역 카드에서 [도면] [수량산출] [원가계산] 중 하나를 고름.
+3. 쪽 목록에서 인쇄하지 않을 쪽의 체크를 뺌.
+4. 미리보기 칸에서 PDF 를 확인함. 체크를 바꾸면 PDF 가 다시 만들어짐.
+5. [PDF 다운로드] 로 PDF 를, 표 영역이면 [엑셀 다운로드] 로 엑셀을 받음.
+6. 영역을 바꿔 가며 2~5 를 되풀이함. 끝나면 [B09 복귀].
+
+> 참고: 이 화면은 보기와 내려받기 전용임. 값을 고치거나 저장하는 곳이 아님. 숫자를 바꾸려면 수량산출(B08) 또는 원가계산(B09) 화면에서 고치고 [저장] 한 뒤 다시 들어옴.
+
+> 참고: [수량산출] [원가계산] 쪽은 해당 화면에 지금 보이는 값 그대로 찍힘. 저장 전 값이면 화면에 보이는 그 값이 나옴.
+
+> 주의: 도면 영역은 PDF 만 받음. 엑셀 단추는 [도면] 을 고르면 숨음.
diff --git a/A05_EduDetail/guide/B09/11_인쇄_영역과_쪽_고르기.md b/A05_EduDetail/guide/B09/11_인쇄_영역과_쪽_고르기.md
new file mode 100644
index 000000000..af1ec88fe
--- /dev/null
+++ b/A05_EduDetail/guide/B09/11_인쇄_영역과_쪽_고르기.md
@@ -0,0 +1,50 @@
+# 영역과 쪽 고르기
+
+인쇄할 묶음(도면 · 수량산출 · 원가계산)을 고르고, 그 안에서 뺄 쪽을 체크로 정함.
+
+## 여는 길
+
+- 인쇄 미리보기 화면의 왼쪽 패널 [영역] 카드와 [쪽 목록] 카드.
+- 처음에는 카드가 접혀 있을 수 있음. 카드 제목을 누르면 펼쳐지고, 다시 누르면 접힘.
+- 화면을 열면 [도면] 이 먼저 골라진 상태로 시작함.
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 왼쪽 패널의 [영역] 제목을 눌러 펼침. 작은 단추 셋 [도면] [수량산출] [원가계산] 이 보임. |
+| 2 | 인쇄할 영역 단추를 누름. 고른 단추는 색이 채워지고 나머지는 흐림. 같은 영역을 다시 누르면 아무 일도 없음. |
+| 3 | 상태 줄에 「○○ 쪽 목록 읽는 중…」 이 뜨고, 곧 [쪽 목록] 카드에 쪽 이름이 한 줄씩 나타남. |
+| 4 | [쪽 목록] 제목을 눌러 펼침. 쪽마다 앞에 체크 칸이 있고 처음에는 모두 체크됨. |
+| 5 | 인쇄하지 않을 쪽의 체크를 뺌. 잠시(약 0.3초) 뒤 미리보기가 체크된 쪽만으로 다시 만들어짐. |
+| 6 | 빼 놓은 쪽을 다시 넣으려면 체크를 다시 켬. |
+
+
+
+그림 번호 — 1 [도면] · 2 [수량산출] · 3 [원가계산]
+
+
+
+그림 번호 — 1 고른 영역 [수량산출] · 2 상태 줄(쪽 수가 보임)
+
+
+
+그림 번호 — 1 쪽마다 앞에 있는 체크 칸
+
+
+
+그림 번호 — 1 체크를 뺀 쪽 · 2 상태 줄 — 체크된 쪽만 다시 묶임
+
+## 보이는 것
+
+- 쪽 목록의 차례는 인쇄될 쪽 차례와 같음. 순서를 바꾸는 기능은 없음.
+- 영역을 바꾸면 체크가 모두 처음(전부 체크)으로 돌아감.
+- 체크를 모두 빼면 상태 줄에 「고른 쪽이 없습니다.」 가 뜨고 미리보기는 비어 있음.
+- 쪽 목록이 아주 길면 목록 칸 안에서 스크롤됨.
+- 영역에 쪽이 없으면 「○○ — 쪽이 없습니다.」 가 뜸.
+- 영역이 아직 준비되지 않았으면 「○○ — 준비 중」 이 뜸.
+- 목록을 못 읽으면 「○○ 목록을 못 읽었습니다 — 이유」 가 빨갛게 뜸.
+
+> 참고: 각 영역에 어떤 쪽이 들어 있는지는 [](12_인쇄_미리보기_보기) 의 「영역별 쪽 구성」 에 정리함.
+
+> 주의: 영역을 바꾸면 앞 영역에서 뺐던 체크는 기억되지 않음. 영역마다 따로 정리해서 내려받아야 함.
diff --git a/A05_EduDetail/guide/B09/12_인쇄_미리보기_보기.md b/A05_EduDetail/guide/B09/12_인쇄_미리보기_보기.md
new file mode 100644
index 000000000..f73102681
--- /dev/null
+++ b/A05_EduDetail/guide/B09/12_인쇄_미리보기_보기.md
@@ -0,0 +1,48 @@
+# 미리보기 보기
+
+고른 쪽들이 PDF 로 만들어져 오른쪽 큰 칸에 그대로 보임. 보이는 것이 곧 내려받는 파일임.
+
+## 여는 길
+
+- 영역을 고르거나 쪽 체크를 바꾸면 자동으로 PDF 를 만들어 오른쪽 본문에 띄움.
+- 위쪽 한 줄은 상태 표시, 그 아래 큰 칸이 PDF 보기 칸.
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 영역을 고르면 상태 줄에 「○○ PDF 만드는 중…」 이 뜸. 만드는 동안에도 다른 조작은 막히지 않음. |
+| 2 | 만들어지면 PDF 가 본문 칸에 나타나고, 상태 줄이 「○○ · N장 묶음」 으로 바뀜. |
+| 3 | PDF 보기 칸 안에서 스크롤하거나 보기 도구로 쪽을 넘기며 확인함. |
+| 4 | 고치고 싶은 쪽이 있으면 쪽 목록 체크를 바꿈. 다시 만드는 중에 또 바꿔도 가장 마지막 선택만 화면에 남음. |
+
+
+
+
+
+## 영역별 쪽 구성
+
+
+
+그림 번호 — 1 고른 영역 [원가계산]
+
+| 영역 | 들어 있는 쪽 |
+| --- | --- |
+| 도면 | 상세설계(B07)의 도면번호 차례대로 도면, 이어서 구조물 조합 도면. 도면번호마다 한 장씩 |
+| 수량산출 | 구조물 집계표 → 자재(총괄자재수량집계표 · 콘크리트소요자재집계표 · 자재수량집계표) → 토공(토공집계표 · 토적표 · 평균운반거리 · 종방향 무대운반거리) → 수리집수면적표(배수지점마다 한 장) → 거리이정표(표 + 경로 지도 그림) |
+| 원가계산 | 공사원가계산서 · 총괄설계내역서 · 설계내역서 · 일위대가목록표 · 일위대가표 · 단가산출근거목록표 · 단가산출근거 · 환율및기초자료 · 중기목록표 · 중기사용료 · 재료비목록표 · 노무비목록표 · 경비목록표 · 자재단가대비표 · 재료비수량금액집계표 · 노무비수량금액집계표 · 경비수량금액집계표 · 중기시간금액집계표 (18장) |
+
+## 보이는 것
+
+- PDF 는 A4 용지. 표 영역은 쪽마다 위에 쪽 이름, 아래에 쪽 번호가 찍힘. 넓은 표는 용지 폭에 맞춰 줄어듦.
+- 원가계산 쪽은 모두 가로 방향. 수량산출 쪽은 칸이 많은 표만 가로, 나머지는 세로.
+- 도면 영역은 도면 PDF 를 서버에서 만든 그대로 보여 줌. 넣지 못한 그림이 있으면 상태 줄 끝에 「 · 못 넣은 그림 N개」 가 붙음.
+- 수량산출 쪽 중 읽지 못한 자리는 그 자리에 「불러오지 못했습니다 — 이유」 한 장이 대신 들어가고 나머지는 그대로 만들어짐.
+- 수량산출에서 값이 아직 없는 쪽은 안내 한 줄이 들어감. 예: 「놓인 구조물 · 배관이 없습니다.」 · 「측점 단면적이 아직 없습니다 — 횡단 설계를 먼저 마치세요.」 · 「저장된 배수지점(관 지점)이 없습니다 — 배수유역 · 종단에서 관을 저장하세요.」
+- 만들기에 실패하면 상태 줄이 빨갛게 「PDF 를 못 만들었습니다 — 이유」 로 바뀜.
+
+> 참고: 원가계산의 [공기집계] [공기산출] 같은 초안 탭은 내역서 차례에 없어 이 영역에 들어가지 않음.
+
+> 참고: 표의 [단가연결] 같은 화면 조작용 칸, 강조 표시, 고칠 칸 표시는 인쇄본에 나오지 않음.
+
+> 주의: 수량산출 · 원가계산 값은 화면 값이 바탕임. 숫자가 이상하면 B08 · B09 화면에서 먼저 확인함.
diff --git a/A05_EduDetail/guide/B09/13_인쇄_내려받기.md b/A05_EduDetail/guide/B09/13_인쇄_내려받기.md
new file mode 100644
index 000000000..d2b81bd22
--- /dev/null
+++ b/A05_EduDetail/guide/B09/13_인쇄_내려받기.md
@@ -0,0 +1,43 @@
+# 내려받기와 돌아가기
+
+보고 있는 PDF 를 파일로 받거나, 표 영역을 엑셀로 받고, 원가계산 화면으로 돌아감.
+
+## 여는 길
+
+- 왼쪽 패널 맨 아래 단추 두 줄.
+ - 윗줄: [PDF 다운로드] [엑셀 다운로드]
+ - 아랫줄: [?] [B09 복귀]
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 영역과 쪽을 고르고 미리보기가 만들어진 것을 확인함. |
+| 2 | [PDF 다운로드] 를 누름. 지금 미리보기에 보이는 PDF 와 같은 파일이 받아짐. 파일 이름은 영역 이름임. 예: `수량산출.pdf` |
+| 3 | 표 영역([수량산출] [원가계산])이면 [엑셀 다운로드] 도 누를 수 있음. 상태 줄에 「○○ 엑셀 만드는 중…」 이 뜬 뒤 「○○ 엑셀을 내려받았습니다.」 로 바뀜. 파일 이름 예: `원가계산.xlsx` |
+| 4 | 다른 영역도 받으려면 영역을 바꿔 2~3 을 되풀이함. |
+| 5 | 끝나면 [B09 복귀] 를 눌러 원가계산 화면으로 돌아감. |
+
+
+
+그림 번호 — 1 [PDF 다운로드] · 2 [엑셀 다운로드] · 3 [?]
+
+
+
+그림 번호 — 1 [PDF 다운로드] — 도면 영역은 엑셀 단추가 없음
+
+## 보이는 것
+
+- 엑셀은 쪽마다 시트 하나. 쪽 이름이 시트 이름이 되며, 길이와 쓸 수 없는 글자는 엑셀 규칙에 맞게 바뀜.
+- 엑셀은 쪽 목록에서 체크된 쪽만 담김. 머리 줄 굵게 · 칸 병합 · 숫자 칸 · 열 폭이 화면 표를 따라가고, A4 로 인쇄하기 좋게 쪽 설정이 들어 있음.
+- 엑셀에는 그림(거리이정표의 경로 지도)이 들어가지 않음. 그림은 PDF 에만 있음.
+- 고른 쪽이 없으면 [엑셀 다운로드] 는 아무 일도 하지 않음.
+- 엑셀을 못 만들면 상태 줄이 빨갛게 「엑셀을 못 만들었습니다 — 이유」 로 바뀜.
+- 미리보기가 아직 만들어지는 중에 [PDF 다운로드] 를 누르면 다 만들어진 뒤에 받아짐.
+- 체크가 하나도 없거나 목록이 비어 있으면 [PDF 다운로드] 는 아무 일도 하지 않음.
+- [?] 는 설명서 창을 엶. 이 화면에서는 B09 설명서가 열림.
+- 이 화면에서는 [<] [>] 단계 이동 단추가 없음.
+
+> 주의: [PDF 다운로드] 는 보이는 PDF 를 그대로 저장하고, [엑셀 다운로드] 는 누를 때 새로 만듦. 누르기 전에 값이 바뀌었다면 B09 로 돌아가 확인함.
+
+> 참고: [B09 복귀] 는 원가계산 화면으로 돌아갈 뿐 아무것도 저장하지 않음.
diff --git a/A05_EduDetail/guide/B09/B09_00_overview.webp b/A05_EduDetail/guide/B09/B09_00_overview.webp
new file mode 100644
index 000000000..b3f73bf07
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_00_overview.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_01_check_card.webp b/A05_EduDetail/guide/B09/B09_01_check_card.webp
new file mode 100644
index 000000000..54318f3cb
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_01_check_card.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_02_refresh_button.webp b/A05_EduDetail/guide/B09/B09_02_refresh_button.webp
new file mode 100644
index 000000000..b3109847e
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_02_refresh_button.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_03_check_list.webp b/A05_EduDetail/guide/B09/B09_03_check_list.webp
new file mode 100644
index 000000000..ab77815e3
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_03_check_list.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_04_reset_confirm.webp b/A05_EduDetail/guide/B09/B09_04_reset_confirm.webp
new file mode 100644
index 000000000..6f07a4427
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_04_reset_confirm.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_05_top_tabs.webp b/A05_EduDetail/guide/B09/B09_05_top_tabs.webp
new file mode 100644
index 000000000..baae28ae5
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_05_top_tabs.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_06_sub_tabs.webp b/A05_EduDetail/guide/B09/B09_06_sub_tabs.webp
new file mode 100644
index 000000000..6233b3afe
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_06_sub_tabs.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_07_compare_table.webp b/A05_EduDetail/guide/B09/B09_07_compare_table.webp
new file mode 100644
index 000000000..2a01642a1
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_07_compare_table.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_08_dock.webp b/A05_EduDetail/guide/B09/B09_08_dock.webp
new file mode 100644
index 000000000..98d7fdcb1
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_08_dock.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_12_link_switch.webp b/A05_EduDetail/guide/B09/B09_12_link_switch.webp
new file mode 100644
index 000000000..2a541251d
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_12_link_switch.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_14_bill_table.webp b/A05_EduDetail/guide/B09/B09_14_bill_table.webp
new file mode 100644
index 000000000..f7ac16c73
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_14_bill_table.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_15_bill_level_tools.webp b/A05_EduDetail/guide/B09/B09_15_bill_level_tools.webp
new file mode 100644
index 000000000..0b4665c9d
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_15_bill_level_tools.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_16_bill_menu.webp b/A05_EduDetail/guide/B09/B09_16_bill_menu.webp
new file mode 100644
index 000000000..d72babef4
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_16_bill_menu.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_17_bill_lamp.webp b/A05_EduDetail/guide/B09/B09_17_bill_lamp.webp
new file mode 100644
index 000000000..96ef4930b
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_17_bill_lamp.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_18_price_link.webp b/A05_EduDetail/guide/B09/B09_18_price_link.webp
new file mode 100644
index 000000000..9facabdb1
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_18_price_link.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_21_total_tab.webp b/A05_EduDetail/guide/B09/B09_21_total_tab.webp
new file mode 100644
index 000000000..cd32591c0
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_21_total_tab.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_22_total_rate_cells.webp b/A05_EduDetail/guide/B09/B09_22_total_rate_cells.webp
new file mode 100644
index 000000000..14ab73e5a
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_22_total_rate_cells.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_23_cost_tab.webp b/A05_EduDetail/guide/B09/B09_23_cost_tab.webp
new file mode 100644
index 000000000..d3ee47533
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_23_cost_tab.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_24_dg_list.webp b/A05_EduDetail/guide/B09/B09_24_dg_list.webp
new file mode 100644
index 000000000..2d7a66675
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_24_dg_list.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_25_basis_tab.webp b/A05_EduDetail/guide/B09/B09_25_basis_tab.webp
new file mode 100644
index 000000000..7578c2c89
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_25_basis_tab.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_27_sum_material.webp b/A05_EduDetail/guide/B09/B09_27_sum_material.webp
new file mode 100644
index 000000000..a575b3d4a
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_27_sum_material.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_28_schedule_panel.webp b/A05_EduDetail/guide/B09/B09_28_schedule_panel.webp
new file mode 100644
index 000000000..5f7539aa5
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_28_schedule_panel.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_29_schedule_sum.webp b/A05_EduDetail/guide/B09/B09_29_schedule_sum.webp
new file mode 100644
index 000000000..df0b15352
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_29_schedule_sum.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_30_schedule_calc.webp b/A05_EduDetail/guide/B09/B09_30_schedule_calc.webp
new file mode 100644
index 000000000..619096434
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_30_schedule_calc.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_31_print_overview.webp b/A05_EduDetail/guide/B09/B09_31_print_overview.webp
new file mode 100644
index 000000000..d4cea3977
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_31_print_overview.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_32_print_area_buttons.webp b/A05_EduDetail/guide/B09/B09_32_print_area_buttons.webp
new file mode 100644
index 000000000..01ed297ca
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_32_print_area_buttons.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_33_print_area_quantity.webp b/A05_EduDetail/guide/B09/B09_33_print_area_quantity.webp
new file mode 100644
index 000000000..102eb4b60
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_33_print_area_quantity.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_34_print_sheet_list.webp b/A05_EduDetail/guide/B09/B09_34_print_sheet_list.webp
new file mode 100644
index 000000000..6b6b88144
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_34_print_sheet_list.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_35_print_sheet_uncheck.webp b/A05_EduDetail/guide/B09/B09_35_print_sheet_uncheck.webp
new file mode 100644
index 000000000..d8b39612a
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_35_print_sheet_uncheck.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_36_print_status_line.webp b/A05_EduDetail/guide/B09/B09_36_print_status_line.webp
new file mode 100644
index 000000000..944e57d6c
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_36_print_status_line.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_37_print_preview_frame.webp b/A05_EduDetail/guide/B09/B09_37_print_preview_frame.webp
new file mode 100644
index 000000000..13a13ec2b
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_37_print_preview_frame.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_38_print_area_cost.webp b/A05_EduDetail/guide/B09/B09_38_print_area_cost.webp
new file mode 100644
index 000000000..3941397b3
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_38_print_area_cost.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_39_print_buttons_row.webp b/A05_EduDetail/guide/B09/B09_39_print_buttons_row.webp
new file mode 100644
index 000000000..490725163
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_39_print_buttons_row.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_40_print_area_drawings.webp b/A05_EduDetail/guide/B09/B09_40_print_area_drawings.webp
new file mode 100644
index 000000000..e3ea64b4c
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_40_print_area_drawings.webp differ
diff --git a/A05_EduDetail/guide/B09/B09_42_print_b09_entry.webp b/A05_EduDetail/guide/B09/B09_42_print_b09_entry.webp
new file mode 100644
index 000000000..c1a50306c
Binary files /dev/null and b/A05_EduDetail/guide/B09/B09_42_print_b09_entry.webp differ
diff --git a/A05_EduDetail/guide/B09/_scenes.json b/A05_EduDetail/guide/B09/_scenes.json
index bc85241eb..cf4b38efb 100644
--- a/A05_EduDetail/guide/B09/_scenes.json
+++ b/A05_EduDetail/guide/B09/_scenes.json
@@ -1,807 +1,37 @@
[
- {
- "name": "B09_00_overview",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "wait": ".b09-estimation__panel .ui-data-table"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": null,
- "callouts": [
- {
- "n": 1,
- "sel": ".b09-options > section:first-of-type"
- },
- {
- "n": 2,
- "sel": "[data-b09-schedule-panel]"
- },
- {
- "n": 3,
- "sel": ".b09-estimation__tabs:not(.ui-subtabs)"
- },
- {
- "n": 4,
- "sel": ".b09-estimation__tabs.ui-subtabs"
- },
- {
- "n": 5,
- "sel": ".b09-estimation__panel .ui-data-table"
- },
- {
- "n": 6,
- "sel": ".b09-estimation__line-hint"
- },
- {
- "n": 7,
- "sel": "[data-b09-switch=\"view\"]"
- },
- {
- "n": 8,
- "sel": "[data-b09-switch=\"link\"]"
- },
- {
- "n": 9,
- "sel": "[data-help-row]"
- }
- ]
- },
- {
- "name": "B09_01_check_card",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "wait": ".b09-options > section:first-of-type"
- },
- {
- "click": ".b09-options > section:first-of-type .ui-collapsible__title"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-options > section:first-of-type",
- "callouts": [
- {
- "n": 1,
- "sel": ".b09-options > section:first-of-type [data-b09-refresh]"
- },
- {
- "n": 2,
- "sel": ".b09-check__head"
- }
- ]
- },
- {
- "name": "B09_02_refresh_button",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "wait": ".b09-options > section:first-of-type"
- },
- {
- "click": ".b09-options > section:first-of-type .ui-collapsible__title"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": "[data-b09-refresh]",
- "callouts": []
- },
- {
- "name": "B09_03_check_list",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "wait": ".b09-options > section:first-of-type"
- },
- {
- "click": ".b09-options > section:first-of-type .ui-collapsible__title"
- },
- {
- "wait_ms": 800
- },
- {
- "wait": ".b09-check__head"
- }
- ],
- "clip": ".b09-check",
- "callouts": [
- {
- "n": 1,
- "sel": ".b09-check__head"
- },
- {
- "n": 2,
- "sel": ".b09-check .ui-sidebar-row"
- }
- ]
- },
- {
- "name": "B09_04_reset_confirm",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-reset]"
- },
- {
- "wait": "?"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": "?",
- "callouts": [
- {
- "n": 1,
- "sel": "?"
- }
- ]
- },
- {
- "name": "B09_05_top_tabs",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "wait": ".b09-estimation__tabs"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-estimation__tabs:not(.ui-subtabs)",
- "callouts": []
- },
- {
- "name": "B09_06_sub_tabs",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"total\"]"
- },
- {
- "wait": "[data-b09-tab=\"bill\"]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-estimation__tabs.ui-subtabs",
- "callouts": []
- },
- {
- "name": "B09_07_compare_table",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"material\"]"
- },
- {
- "click": "[data-b09-tab=\"compare\"]"
- },
- {
- "wait": "[data-b09-table=\"compare\"]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-estimation__panel",
- "callouts": []
- },
- {
- "name": "B09_08_dock",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "wait": ".b09-dock"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-dock",
- "callouts": [
- {
- "n": 7,
- "sel": "[data-b09-switch=\"view\"]"
- },
- {
- "n": 8,
- "sel": "[data-b09-switch=\"link\"]"
- },
- {
- "n": 9,
- "sel": "[data-help-row]"
- }
- ]
- },
- {
- "name": "B09_09_box_view",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"dg_list\"]"
- },
- {
- "click": "[data-b09-tab=\"dg\"]"
- },
- {
- "wait": "[data-b09-table=\"dg\"]"
- },
- {
- "wait_ms": 800
- },
- {
- "wait": ".ui-group-cards"
- }
- ],
- "clip": ".b09-estimation__panel",
- "callouts": []
- },
- {
- "name": "B09_10_table_view",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"dg_list\"]"
- },
- {
- "click": "[data-b09-tab=\"dg\"]"
- },
- {
- "wait": "[data-b09-table=\"dg\"]"
- },
- {
- "wait_ms": 800
- },
- {
- "click": "[data-b09-switch=\"view\"] [data-value=\"table\"]"
- },
- {
- "wait": "[data-b09-table=\"dg\"] tr[data-i]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-estimation__panel",
- "callouts": []
- },
- {
- "name": "B09_11_box_columns",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"dg_list\"]"
- },
- {
- "click": "[data-b09-tab=\"dg\"]"
- },
- {
- "wait": "[data-b09-table=\"dg\"]"
- },
- {
- "wait_ms": 800
- },
- {
- "wait": ".ui-group-cards"
- }
- ],
- "clip": ".b09-estimation__tools",
- "callouts": []
- },
- {
- "name": "B09_12_link_switch",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "wait": "[data-b09-switch=\"link\"]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": "[data-b09-switch=\"link\"]",
- "callouts": []
- },
- {
- "name": "B09_13_popup",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"material\"]"
- },
- {
- "click": "[data-b09-tab=\"material\"]"
- },
- {
- "wait": "[data-b09-table=\"material\"]"
- },
- {
- "wait_ms": 800
- },
- {
- "click": "[data-b09-table=\"material\"] tr[data-i=\"0\"] td:nth-child(2)"
- },
- {
- "wait": "[data-b09-popup]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": "[data-b09-popup]",
- "callouts": []
- },
- {
- "name": "B09_14_bill_table",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"total\"]"
- },
- {
- "click": "[data-b09-tab=\"bill\"]"
- },
- {
- "wait": "[data-b09-table=\"bill\"]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-estimation__panel",
- "callouts": [
- {
- "n": 1,
- "sel": ".b09-estimation__tools"
- },
- {
- "n": 2,
- "sel": "[data-b09-table=\"bill\"]"
- }
- ]
- },
- {
- "name": "B09_15_bill_level_tools",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"total\"]"
- },
- {
- "click": "[data-b09-tab=\"bill\"]"
- },
- {
- "wait": "[data-b09-table=\"bill\"]"
- },
- {
- "wait_ms": 800
- },
- {
- "click": "[data-b09-table=\"bill\"] tr[data-i=\"1\"] td:nth-child(2)"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-estimation__tools",
- "callouts": [
- {
- "n": 1,
- "sel": "[data-b09-level=\"들여쓰기 →\"]"
- },
- {
- "n": 2,
- "sel": "[data-b09-level=\"내어쓰기 ←\"]"
- },
- {
- "n": 3,
- "sel": "[data-b09-level=\"위로 ↑\"]"
- },
- {
- "n": 4,
- "sel": "[data-b09-level=\"아래로 ↓\"]"
- }
- ]
- },
- {
- "name": "B09_16_bill_menu",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"total\"]"
- },
- {
- "click": "[data-b09-tab=\"bill\"]"
- },
- {
- "wait": "[data-b09-table=\"bill\"]"
- },
- {
- "wait_ms": 800
- },
- {
- "contextmenu": "[data-b09-table=\"bill\"] tr[data-i=\"2\"]"
- },
- {
- "wait": ".ui-ctx-menu"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".ui-ctx-menu",
- "callouts": []
- },
- {
- "name": "B09_17_bill_lamp",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"total\"]"
- },
- {
- "click": "[data-b09-tab=\"bill\"]"
- },
- {
- "wait": "[data-b09-table=\"bill\"]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": "[data-b09-table=\"bill\"]",
- "callouts": [
- {
- "n": 1,
- "sel": "td.b09-bill__lamp"
- }
- ]
- },
- {
- "name": "B09_18_price_link",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"total\"]"
- },
- {
- "click": "[data-b09-tab=\"bill\"]"
- },
- {
- "wait": "[data-b09-table=\"bill\"]"
- },
- {
- "wait_ms": 800
- },
- {
- "click": "td.b09-bill__lamp:not(.is-linked)"
- },
- {
- "wait": ".ui-modal"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".ui-modal",
- "callouts": []
- },
- {
- "name": "B09_19_haul_modal",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"total\"]"
- },
- {
- "click": "[data-b09-tab=\"bill\"]"
- },
- {
- "wait": "[data-b09-table=\"bill\"]"
- },
- {
- "wait_ms": 800
- },
- {
- "click": "[data-b09-table=\"bill\"] tr[data-i=\"?\"] td.b09-bill__lamp"
- },
- {
- "wait": ".b09-haul-modal"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-haul-modal",
- "callouts": [
- {
- "n": 1,
- "sel": ".b09-haul-modal .m02-inputval__row"
- },
- {
- "n": 2,
- "sel": ".b09-haulsteps"
- }
- ]
- },
- {
- "name": "B09_20_haul_cycle",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"total\"]"
- },
- {
- "click": "[data-b09-tab=\"bill\"]"
- },
- {
- "wait": "[data-b09-table=\"bill\"]"
- },
- {
- "wait_ms": 800
- },
- {
- "click": "[data-b09-table=\"bill\"] tr[data-i=\"?\"] td.b09-bill__lamp"
- },
- {
- "wait": ".b09-haulstep"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-haulsteps",
- "callouts": []
- },
- {
- "name": "B09_21_total_tab",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"total\"]"
- },
- {
- "click": "[data-b09-tab=\"total\"]"
- },
- {
- "wait": "[data-b09-table=\"total\"]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-estimation__panel",
- "callouts": []
- },
- {
- "name": "B09_22_total_rate_cells",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"total\"]"
- },
- {
- "click": "[data-b09-tab=\"total\"]"
- },
- {
- "wait": "[data-b09-table=\"total\"]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": "[data-b09-table=\"total\"]",
- "callouts": [
- {
- "n": 1,
- "sel": "?"
- }
- ]
- },
- {
- "name": "B09_23_cost_tab",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"cost\"]"
- },
- {
- "click": "[data-b09-tab=\"cost\"]"
- },
- {
- "wait": "[data-b09-table=\"cost\"]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-estimation__panel",
- "callouts": []
- },
- {
- "name": "B09_24_dg_list",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"dg_list\"]"
- },
- {
- "click": "[data-b09-tab=\"dg_list\"]"
- },
- {
- "wait": "[data-b09-table=\"dg_list\"]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-estimation__panel",
- "callouts": []
- },
- {
- "name": "B09_25_basis_tab",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"basis\"]"
- },
- {
- "click": "[data-b09-tab=\"basis\"]"
- },
- {
- "wait": "[data-b09-table=\"basis\"]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-estimation__panel",
- "callouts": []
- },
- {
- "name": "B09_26_quote_modal",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"material\"]"
- },
- {
- "click": "[data-b09-tab=\"compare\"]"
- },
- {
- "wait": "[data-b09-table=\"compare\"]"
- },
- {
- "wait_ms": 800
- },
- {
- "click": "[data-b09-table=\"compare\"] tr[data-i=\"?\"] td[data-c=\"?\"]"
- },
- {
- "wait": ".ui-modal"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".ui-modal",
- "callouts": []
- },
- {
- "name": "B09_27_sum_material",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"material\"]"
- },
- {
- "click": "[data-b09-tab=\"sum_material\"]"
- },
- {
- "wait": "[data-b09-table=\"sum_material\"]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-estimation__panel",
- "callouts": []
- },
- {
- "name": "B09_28_schedule_panel",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "wait": "[data-b09-schedule-panel]"
- },
- {
- "click": "[data-b09-schedule-panel] .ui-collapsible__title"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": "[data-b09-schedule-panel]",
- "callouts": []
- },
- {
- "name": "B09_29_schedule_sum",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"schedule_sum\"]"
- },
- {
- "click": "[data-b09-tab=\"schedule_sum\"]"
- },
- {
- "wait": "[data-b09-table=\"schedule_sum\"]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-estimation__panel",
- "callouts": []
- },
- {
- "name": "B09_30_schedule_calc",
- "route": "#/b09-estimation",
- "project": "road",
- "before": [
- {
- "click": "[data-b09-group=\"schedule_sum\"]"
- },
- {
- "click": "[data-b09-tab=\"schedule_calc\"]"
- },
- {
- "wait": "[data-b09-table=\"schedule_calc\"]"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b09-estimation__panel",
- "callouts": []
- }
-]
\ No newline at end of file
+ {"name":"B09_00_overview","route":"#/b09-estimation","project":"road","before":[{"wait":".b09-estimation__panel .ui-data-table"},{"wait_ms":800}],"clip":null,"callouts":[{"n":1,"sel":".b09-options .ui-sidebar-scroll > section:first-of-type"},{"n":2,"sel":"[data-b09-schedule-panel]"},{"n":3,"sel":".b09-estimation__tabs:not(.ui-subtabs)"},{"n":4,"sel":".b09-estimation__tabs.ui-subtabs"},{"n":5,"sel":".b09-estimation__panel .ui-data-table"},{"n":6,"sel":".b09-estimation__line-hint"},{"n":7,"sel":"[data-b09-switch=\"view\"]"},{"n":8,"sel":"[data-b09-switch=\"link\"]"},{"n":9,"sel":"[data-help-row]"}]},
+ {"name":"B09_01_check_card","route":"#/b09-estimation","project":"road","before":[{"wait":".b09-options .ui-sidebar-scroll > section:first-of-type"},{"click":".b09-options .ui-sidebar-scroll > section:first-of-type .ui-collapsible__title"},{"wait_ms":800}],"clip":".b09-options .ui-sidebar-scroll > section:first-of-type","callouts":[{"n":1,"sel":".b09-options .ui-sidebar-scroll > section:first-of-type [data-b09-refresh]"},{"n":2,"sel":".b09-check__head"}]},
+ {"name":"B09_02_refresh_button","route":"#/b09-estimation","project":"road","before":[{"wait":".b09-options .ui-sidebar-scroll > section:first-of-type"},{"click":".b09-options .ui-sidebar-scroll > section:first-of-type .ui-collapsible__title"},{"wait_ms":800}],"clip":"[data-b09-refresh]","callouts":[]},
+ {"name":"B09_03_check_list","route":"#/b09-estimation","project":"road","before":[{"wait":".b09-options .ui-sidebar-scroll > section:first-of-type"},{"click":".b09-options .ui-sidebar-scroll > section:first-of-type .ui-collapsible__title"},{"wait_ms":800},{"wait":".b09-check__head"}],"clip":".b09-check","callouts":[{"n":1,"sel":".b09-check__head"},{"n":2,"sel":".b09-check .ui-sidebar-row"}]},
+ {"name":"B09_04_reset_confirm","route":"#/b09-estimation","project":"road","before":[{"wait":"[data-b09-reset]"},{"click":"[data-b09-reset]","confirm":true},{"wait":".ui-confirm__panel"},{"wait_ms":600}],"clip":".ui-confirm__panel","callouts":[{"n":1,"sel":".ui-confirm__message"},{"n":2,"sel":".ui-confirm__actions"}],"after":[{"click":"button:has-text(\"취소\")"}]},
+ {"name":"B09_05_top_tabs","route":"#/b09-estimation","project":"road","before":[{"wait":".b09-estimation__tabs"},{"wait_ms":800}],"clip":".b09-estimation__tabs:not(.ui-subtabs)","callouts":[]},
+ {"name":"B09_06_sub_tabs","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"total\"]"},{"wait":"[data-b09-tab=\"bill\"]"},{"wait_ms":800}],"clip":".b09-estimation__tabs.ui-subtabs","callouts":[]},
+ {"name":"B09_07_compare_table","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"material\"]"},{"click":"[data-b09-tab=\"compare\"]"},{"wait":"[data-b09-table=\"compare\"]"},{"wait_ms":800}],"clip":".b09-estimation__panel","callouts":[]},
+ {"name":"B09_08_dock","route":"#/b09-estimation","project":"road","before":[{"wait":".b09-dock"},{"wait_ms":800}],"clip":".b09-dock","callouts":[{"n":1,"sel":"[data-b09-switch=\"view\"]"},{"n":2,"sel":"[data-b09-switch=\"link\"]"},{"n":3,"sel":"[data-help-row]"}]},
+ {"name":"B09_12_link_switch","route":"#/b09-estimation","project":"road","before":[{"wait":"[data-b09-switch=\"link\"]"},{"wait_ms":800}],"clip":"[data-b09-switch=\"link\"]","callouts":[]},
+ {"name":"B09_14_bill_table","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"total\"]"},{"click":"[data-b09-tab=\"bill\"]"},{"wait":"[data-b09-table=\"bill\"]"},{"wait_ms":800}],"clip":".b09-estimation__panel","callouts":[{"n":1,"sel":".b09-estimation__tools"},{"n":2,"sel":"[data-b09-table=\"bill\"]"}]},
+ {"name":"B09_15_bill_level_tools","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"total\"]"},{"click":"[data-b09-tab=\"bill\"]"},{"wait":"[data-b09-table=\"bill\"]"},{"wait_ms":800},{"click":"[data-b09-table=\"bill\"] tr[data-i=\"1\"] td:nth-child(2)"},{"wait_ms":800}],"clip":".b09-estimation__tools","callouts":[{"n":1,"sel":"[data-b09-level=\"들여쓰기 →\"]"},{"n":2,"sel":"[data-b09-level=\"내어쓰기 ←\"]"},{"n":3,"sel":"[data-b09-level=\"위로 ↑\"]"},{"n":4,"sel":"[data-b09-level=\"아래로 ↓\"]"}]},
+ {"name":"B09_16_bill_menu","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"total\"]"},{"click":"[data-b09-tab=\"bill\"]"},{"wait":"[data-b09-table=\"bill\"]"},{"wait_ms":800},{"contextmenu":"[data-b09-table=\"bill\"] tr[data-i=\"2\"]"},{"wait":".ui-ctx-menu"},{"wait_ms":800}],"clip":".ui-ctx-menu","callouts":[]},
+ {"name":"B09_17_bill_lamp","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"total\"]"},{"click":"[data-b09-tab=\"bill\"]"},{"wait":"[data-b09-table=\"bill\"]"},{"wait_ms":800}],"clip":"[data-b09-table=\"bill\"]","callouts":[{"n":1,"sel":"td.b09-bill__lamp"}]},
+ {"name":"B09_18_price_link","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"total\"]"},{"click":"[data-b09-tab=\"bill\"]"},{"wait":"[data-b09-table=\"bill\"]"},{"wait_ms":800},{"click":"td.b09-bill__lamp:not(.is-linked)"},{"wait":".m01-logic__pick"},{"wait_ms":800}],"clip":".m01-logic__pick","callouts":[{"n":1,"sel":".m01-logic__pick input"},{"n":2,"sel":".m01-logic__pick button:has-text(\"마스터\")"},{"n":3,"sel":".m01-logic__pick button:has-text(\"닫기\")","pos":"tr"}],"after":[{"click":".m01-logic__pick button:has-text(\"닫기\")"}]},
+ {"name":"B09_21_total_tab","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"total\"]"},{"click":"[data-b09-tab=\"total\"]"},{"wait":"[data-b09-table=\"total\"]"},{"wait_ms":800}],"clip":".b09-estimation__panel","callouts":[]},
+ {"name":"B09_22_total_rate_cells","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"total\"]"},{"click":"[data-b09-tab=\"total\"]"},{"wait":"[data-b09-table=\"total\"]"},{"wait_ms":800}],"clip":"[data-b09-table=\"total\"]","callouts":[{"n":1,"sel":"[data-b09-table=\"total\"] th:has-text(\"요율(%)\")"},{"n":2,"sel":"[data-b09-table=\"total\"] td.is-can-edit[data-c=\"6\"]"},{"n":3,"sel":"[data-b09-table=\"total\"] th:has-text(\"요율 출처\")"}]},
+ {"name":"B09_23_cost_tab","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"cost\"]"},{"click":"[data-b09-tab=\"cost\"]"},{"wait":"[data-b09-table=\"cost\"]"},{"wait_ms":800}],"clip":".b09-estimation__panel","callouts":[]},
+ {"name":"B09_24_dg_list","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"dg_list\"]"},{"wait":".b09-estimation__panel"},{"wait_ms":800}],"clip":".b09-estimation__panel","callouts":[]},
+ {"name":"B09_25_basis_tab","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"basis\"]"},{"click":"[data-b09-tab=\"basis\"]"},{"wait":"[data-b09-table=\"basis\"]"},{"wait_ms":800}],"clip":".b09-estimation__panel","callouts":[]},
+ {"name":"B09_27_sum_material","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"material\"]"},{"click":"[data-b09-tab=\"sum_material\"]"},{"wait":"[data-b09-table=\"sum_material\"]"},{"wait_ms":800}],"clip":".b09-estimation__panel","callouts":[]},
+ {"name":"B09_28_schedule_panel","route":"#/b09-estimation","project":"road","before":[{"wait":"[data-b09-schedule-panel]"},{"click":"[data-b09-schedule-panel] .ui-collapsible__title"},{"wait_ms":800}],"clip":"[data-b09-schedule-panel]","callouts":[]},
+ {"name":"B09_29_schedule_sum","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"schedule_sum\"]"},{"click":"[data-b09-tab=\"schedule_sum\"]"},{"wait":"[data-b09-table=\"schedule_sum\"]"},{"wait_ms":800}],"clip":".b09-estimation__panel","callouts":[]},
+ {"name":"B09_30_schedule_calc","route":"#/b09-estimation","project":"road","before":[{"click":"[data-b09-group=\"schedule_sum\"]"},{"click":"[data-b09-tab=\"schedule_calc\"]"},{"wait":"[data-b09-table=\"schedule_calc\"]"},{"wait_ms":800}],"clip":".b09-estimation__panel","callouts":[]},
+ {"name":"B09_31_print_overview","route":"#/b09-print","project":"road","before":[{"wait":".b09-print__panel"},{"wait_ms":22000},{"click":".b09-print__panel .ui-collapsible__title:has-text(\"영역\")"},{"click":".b09-print__panel .ui-collapsible__title:has-text(\"쪽 목록\")"},{"wait_ms":800}],"clip":null,"callouts":[{"n":1,"sel":".b09-print__panel section.ui-collapsible:has([data-b09-print-area])"},{"n":2,"sel":".b09-print__panel section.ui-collapsible:has([data-b09-print-item])"},{"n":3,"sel":"[data-b09-print-status]"},{"n":4,"sel":".b09-print__frame"},{"n":5,"sel":".b09-print__actions"}],"allow_post":["/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/drawings-pdf","/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/table-pdf"]},
+ {"name":"B09_32_print_area_buttons","route":"#/b09-print","project":"road","before":[{"wait":".b09-print__panel"},{"click":".b09-print__panel .ui-collapsible__title:has-text(\"영역\")"},{"wait_ms":600}],"clip":".b09-print__panel section.ui-collapsible:has([data-b09-print-area])","callouts":[{"n":1,"sel":"[data-b09-print-area=\"drawings\"]"},{"n":2,"sel":"[data-b09-print-area=\"quantity\"]"},{"n":3,"sel":"[data-b09-print-area=\"cost\"]"}],"allow_post":["/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/drawings-pdf","/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/table-pdf"]},
+ {"name":"B09_33_print_area_quantity","route":"#/b09-print","project":"road","before":[{"wait":".b09-print__panel"},{"click":".b09-print__panel .ui-collapsible__title:has-text(\"영역\")"},{"click":"[data-b09-print-area=\"quantity\"]"},{"wait_ms":16000},{"click":".b09-print__panel .ui-collapsible__title:has-text(\"쪽 목록\")"},{"wait_ms":600}],"clip":null,"callouts":[{"n":1,"sel":"[data-b09-print-area=\"quantity\"]"},{"n":2,"sel":"[data-b09-print-status]"}],"allow_post":["/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/drawings-pdf","/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/table-pdf","/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/quantity/hydro/calc"]},
+ {"name":"B09_34_print_sheet_list","route":"#/b09-print","project":"road","before":[{"wait":".b09-print__panel"},{"click":".b09-print__panel .ui-collapsible__title:has-text(\"영역\")"},{"click":"[data-b09-print-area=\"quantity\"]"},{"wait_ms":16000},{"click":".b09-print__panel .ui-collapsible__title:has-text(\"쪽 목록\")"},{"wait_ms":600}],"clip":".b09-print__panel section.ui-collapsible:has([data-b09-print-item])","callouts":[{"n":1,"sel":"[data-b09-print-item]"}],"allow_post":["/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/drawings-pdf","/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/table-pdf","/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/quantity/hydro/calc"]},
+ {"name":"B09_35_print_sheet_uncheck","route":"#/b09-print","project":"road","before":[{"wait":".b09-print__panel"},{"click":".b09-print__panel .ui-collapsible__title:has-text(\"영역\")"},{"click":"[data-b09-print-area=\"quantity\"]"},{"wait_ms":16000},{"click":".b09-print__panel .ui-collapsible__title:has-text(\"쪽 목록\")"},{"click":"[data-b09-print-item]"},{"wait_ms":9000}],"clip":null,"callouts":[{"n":1,"sel":"[data-b09-print-item]"},{"n":2,"sel":"[data-b09-print-status]"}],"allow_post":["/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/drawings-pdf","/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/table-pdf","/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/quantity/hydro/calc"]},
+ {"name":"B09_36_print_status_line","route":"#/b09-print","project":"road","before":[{"wait":".b09-print__panel"},{"wait_ms":22000}],"clip":"[data-b09-print-status]","callouts":[],"allow_post":["/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/drawings-pdf","/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/table-pdf"]},
+ {"name":"B09_37_print_preview_frame","route":"#/b09-print","project":"road","before":[{"wait":".b09-print__panel"},{"wait_ms":22000}],"clip":".b09-print__frame","callouts":[],"allow_post":["/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/drawings-pdf","/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/table-pdf"]},
+ {"name":"B09_38_print_area_cost","route":"#/b09-print","project":"road","before":[{"wait":".b09-print__panel"},{"click":".b09-print__panel .ui-collapsible__title:has-text(\"영역\")"},{"click":"[data-b09-print-area=\"cost\"]"},{"wait_ms":16000},{"click":".b09-print__panel .ui-collapsible__title:has-text(\"쪽 목록\")"},{"wait_ms":600}],"clip":".b09-print__panel","callouts":[{"n":1,"sel":"[data-b09-print-area=\"cost\"]"}],"allow_post":["/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/drawings-pdf","/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/table-pdf"]},
+ {"name":"B09_39_print_buttons_row","route":"#/b09-print","project":"road","before":[{"wait":".b09-print__panel"},{"click":".b09-print__panel .ui-collapsible__title:has-text(\"영역\")"},{"click":"[data-b09-print-area=\"quantity\"]"},{"wait_ms":16000}],"clip":".b09-print__actions","callouts":[{"n":1,"sel":"[data-b09-print-pdf]"},{"n":2,"sel":"[data-b09-print-xlsx]"},{"n":3,"sel":".b09-print__actions .ui-help-btn"}],"allow_post":["/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/drawings-pdf","/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/table-pdf","/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/quantity/hydro/calc"]},
+ {"name":"B09_40_print_area_drawings","route":"#/b09-print","project":"road","before":[{"wait":".b09-print__panel"},{"wait_ms":1500}],"clip":".b09-print__actions","callouts":[{"n":1,"sel":"[data-b09-print-pdf]"}],"allow_post":["/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/drawings-pdf","/api/projects/c2390e1c-ee66-42ef-8cd7-253ec00bf904/print/table-pdf"]},
+ {"name":"B09_42_print_b09_entry","route":"#/b09-estimation","project":"road","before":[{"wait":"[data-b09-print]"},{"wait_ms":1200}],"clip":".b09-dock","callouts":[{"n":1,"sel":"[data-b09-print]"}]}
+]
diff --git a/A05_EduDetail/guide/D01/00_설명서.md b/A05_EduDetail/guide/D01/00_설명서.md
index 0647091dd..773eb7182 100644
--- a/A05_EduDetail/guide/D01/00_설명서.md
+++ b/A05_EduDetail/guide/D01/00_설명서.md
@@ -1,35 +1,35 @@
-# 예정노선 등록 설명서
+# 예정노선 등록
-## 이 화면에서 하는 일
-- 여러 해에 걸친 예정노선의 기본 정보(사업 연도 · 지역 · 임도 종류 · 설계속도 · 이름)를 넣고 새 예정노선 프로젝트를 만드는 첫 화면임.
-- 대시보드의 [+] 에서 「예정노선」 카드를 고르면 이 화면이 열림.
-- 도면 관련 칸은 없음. 노선의 실제 위치는 만든 뒤 다음 화면(1단계 기준 지정)에서 정함.
-- 예정노선은 **산림청만** 만들 수 있음. 산림청 = 시스템 관리자 또는 메일 주소가 `.go.kr` 로 끝나는 사용자임.
+여러 해에 걸친 예정노선의 기본 정보(사업 연도 · 지역 · 임도 종류 · 설계속도 · 이름)를 넣고 새 예정노선 프로젝트를 만드는 첫 화면.
+
+## 여는 길
+
+- 대시보드 프로젝트 줄 위의 [+]를 누르고 「새 프로젝트」 창에서 「예정노선」 카드를 고름. [새 프로젝트 여는 길](D01/01_새_프로젝트_여는_길) 참고.
+- 예정노선은 **산림청만** 만들 수 있음. 산림청 = 시스템 관리자 또는 메일 주소가 `.go.kr` 로 끝나는 사용자.
+
+
+
+## 화면 구역
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 사업 연도 시작 · 끝 | 사업 기간을 넣음. 한 해짜리면 두 칸을 같은 해로 둠 |
+| 2 | 사업 지역 | 사업이 있는 지역 이름을 적음. 꼭 넣어야 하는 칸 |
+| 3 | 임도 종류 · 설계속도 | 임도 종류를 고르면 옆 설계속도 목록이 따라 바뀜 |
+| 4 | 프로젝트명 | 위 칸을 채우면 이름이 저절로 만들어짐. 직접 고쳐도 됨 |
+| 5 | 노선 누가거리 | 노선 시작 · 종료 누가거리(m). 비워 두어도 됨 |
+| 6 | 단추 줄 | [?] 도움말 · [취소] 대시보드로 돌아감 · [등록] 프로젝트를 만듦 |
## 작업 순서
-1. 대시보드에서 [+] 를 누르고 「예정노선」 카드를 고름. 산림청이 아니면 카드가 흐리게 보이고 누르면 「예정노선은 산림청(시스템 관리자 · go.kr 메일)만 만들 수 있습니다.」 안내가 나옴.
-2. 「사업 연도 시작」 · 「사업 연도 끝」 에 사업 기간을 넣음. 한 해짜리면 두 칸을 같은 해로 둠.
-3. 「사업 지역」 을 적음. 필수 칸임.
-4. 「임도 종류」 를 고르고, 그에 맞춰 「설계속도」 를 고름.
-5. 「프로젝트명」 을 확인함. 위 칸을 채우면 자동으로 이름이 만들어지며, 직접 고쳐도 됨.
-6. 필요하면 「노선 시작 누가거리 (m)」 · 「노선 종료 누가거리 (m)」 를 넣음. 비워 두어도 됨.
-7. [등록] 을 누름. 칸에 문제가 있으면 해당 칸 아래에 빨간 안내가 나오고 등록되지 않음.
-## 단추
-| 단추 | 하는 일 |
-| --- | --- |
-| [?] | 이 도움말을 엶 |
-| [취소] | 등록하지 않고 대시보드로 돌아감 |
-| [등록] | 입력한 값으로 예정노선 프로젝트를 만들고 곧바로 D02 「기준 지정」 화면으로 감 |
+1. 대시보드 [+] → 「예정노선」 카드. [새 프로젝트 여는 길](D01/01_새_프로젝트_여는_길) 참고.
+2. 사업 연도 시작 · 끝과 사업 지역을 넣음. [사업 연도 · 지역](D01/02_사업연도_지역) 참고.
+3. 임도 종류와 설계속도를 고름. [임도 종류 · 설계속도](D01/03_임도종류_설계속도) 참고.
+4. 프로젝트명을 확인함. [프로젝트명](D01/04_프로젝트명) 참고.
+5. 필요하면 노선 시작 · 종료 누가거리를 넣음. [노선 누가거리](D01/05_누가거리) 참고.
+6. [등록]을 누름. 문제가 있는 칸은 아래에 빨간 안내가 나옴. [입력 오류와 등록](D01/06_입력오류와_등록) 참고.
+7. 등록되면 바로 다음 화면인 [기준 지정](D02/00_설명서)이 열림.
-## 결과 읽는 법
-- 등록에 성공하면 「프로젝트를 만들었습니다.」 알림이 뜨고, 만든 프로젝트가 현재 프로젝트가 되어 「기준 지정」 화면(지도 화면)이 열림.
-- 대시보드 프로젝트 표에도 종류 「예정노선」 으로 올라감. 표의 단계 막대(기준 지정 · 노선 분석 · 확정 · 내보내기)를 누르면 그 단계 화면으로 감.
-- 실패하면 서버가 알려 준 까닭이 알림으로 뜨고 이 화면에 머묾.
+> 주의: 등록 직후에는 노선 위치가 비어 있음. 지점을 정하고 저장해야 분석 단계로 갈 수 있음.
-## 알아 둘 것
-- 칸마다 뜻과 기본값은 「칸 뜻」 문서에 있음.
-- 임도 종류 · 설계속도는 임도설계(B 그룹)와 같은 기준을 씀. 등록 뒤 이 화면에서 고치는 방법은 코드에서 확인하지 못함.
-- 누가거리(노선을 따라 잰 거리) 두 칸은 저장만 되며, 다음 화면들에서 쓰이는 곳은 확인하지 못함. 「분석 뒤 실제 누가와 다르면 차이 표시」 는 준비 중으로 봄.
-- 등록 직후에는 노선 위치가 비어 있음. 지점을 정하고 저장해야 분석 단계로 갈 수 있음.
-- 지정받은 다른 회사 구성원은 예정노선을 보기만 할 수 있고 만들거나 고칠 수 없음.
+> 참고: 칸마다 뜻과 기본값은 [칸 뜻](D01/10_칸_뜻)에 있음.
diff --git a/A05_EduDetail/guide/D01/01_새_프로젝트_여는_길.md b/A05_EduDetail/guide/D01/01_새_프로젝트_여는_길.md
new file mode 100644
index 000000000..65bd86194
--- /dev/null
+++ b/A05_EduDetail/guide/D01/01_새_프로젝트_여는_길.md
@@ -0,0 +1,26 @@
+# 새 프로젝트 여는 길
+
+대시보드 [+]에서 「예정노선」 카드를 골라 등록 화면으로 들어가는 길.
+
+## 여는 길
+
+- 로그인 뒤 대시보드(프로젝트 목록 화면)에서 프로젝트 줄 위의 [+]를 누름.
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | [+]를 누름. 「새 프로젝트」 창이 열림. |
+| 2 | 카드 넷 가운데 「예정노선」을 누름. 창이 닫히고 예정노선 등록 화면이 열림. |
+| 3 | 취소하려면 창 오른쪽 위 [닫기]를 누름. |
+
+
+
+그림 번호 — 1 「예정노선」 카드
+
+## 보이는 것
+
+- 카드 넷 = 예정노선 · 임도설계 · 사방설계 · 안정성평가. 사방설계는 「준비 중」 표시가 붙어 눌러도 열리지 않음.
+- 산림청이 아닌 계정은 「예정노선」 카드가 흐리게 보임. 마우스를 올리면 까닭이 말풍선으로 보이고, 눌러도 「예정노선은 산림청(시스템 관리자 · go.kr 메일)만 만들 수 있습니다.」 안내만 나옴.
+
+> 참고: 이미 만든 예정노선은 대시보드 프로젝트 표에 「예정노선」 종류로 나옴. 표의 단계 막대(기준 지정 · 노선 분석 · 확정 · 내보내기)를 누르면 그 단계 화면으로 감.
diff --git a/A05_EduDetail/guide/D01/02_사업연도_지역.md b/A05_EduDetail/guide/D01/02_사업연도_지역.md
new file mode 100644
index 000000000..52c3ba8d9
--- /dev/null
+++ b/A05_EduDetail/guide/D01/02_사업연도_지역.md
@@ -0,0 +1,28 @@
+# 사업 연도 · 지역
+
+사업 기간(시작 · 끝 연도)과 사업 지역을 넣는 칸.
+
+## 여는 길
+
+- 예정노선 등록 화면 맨 위 줄 두 칸과 그 아래 「사업 지역」 칸.
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 「사업 연도 시작」에 첫 해를 넣음. 처음에는 올해가 들어 있음. |
+| 2 | 「사업 연도 끝」에 마지막 해를 넣음. 한 해짜리 사업이면 시작과 같은 해. |
+| 3 | 「사업 지역」에 지역 이름을 적음(예: 울진군 금강송면). 100 글자까지. |
+| 4 | 「종류」 칸은 「노선 계획」으로 고정이라 고칠 수 없음. |
+
+
+
+그림 번호 — 1 사업 연도 시작 · 2 사업 연도 끝 · 3 사업 지역 · 4 종류(고정)
+
+## 보이는 것
+
+- 연도를 바꾸면 아래 「프로젝트명」이 바로 따라 바뀜(예: 2027~2029 울진군 금강송면 간선임도).
+- 연도는 2000 ~ 2100 안의 정수만 받음. 끝 연도가 시작 연도보다 앞이면 [등록] 때 안내가 나옴. [입력 오류와 등록](D01/06_입력오류와_등록) 참고.
+- 연도 수 + 1 개의 지점이 다음 화면에서 필요함. 2027 ~ 2029 세 해면 지점 네 개.
+
+> 주의: 사업 연도는 등록 뒤에 [기준 지정](D02/00_설명서) 화면에서 바꿀 수 없음. 등록 전에 확인.
diff --git a/A05_EduDetail/guide/D01/03_임도종류_설계속도.md b/A05_EduDetail/guide/D01/03_임도종류_설계속도.md
new file mode 100644
index 000000000..74546cc81
--- /dev/null
+++ b/A05_EduDetail/guide/D01/03_임도종류_설계속도.md
@@ -0,0 +1,32 @@
+# 임도 종류 · 설계속도
+
+노선을 설계하는 기준이 되는 임도 종류와 속도를 고르는 칸.
+
+## 여는 길
+
+- 예정노선 등록 화면 가운데 줄의 「임도 종류」 · 「설계속도」.
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 「임도 종류」에서 간선임도 · 산불진화임도 · 작업임도 중 하나를 고름. |
+| 2 | 옆 「설계속도」 목록이 종류에 맞게 바뀜. 원하는 속도를 고름. |
+
+
+
+그림 번호 — 1 임도 종류 · 2 설계속도(간선임도에서 40 km/h 를 고른 모습)
+
+## 보이는 것
+
+| 임도 종류 | 고를 수 있는 설계속도 |
+| --- | --- |
+| 간선임도 | 20 · 30 · 40 km/h |
+| 산불진화임도 | 20 · 30 · 40 km/h |
+| 작업임도 | 20 km/h 만 |
+
+- 임도 종류를 바꾸면 설계속도가 가장 낮은 값(20 km/h)으로 돌아감. 종류를 먼저 정하고 속도를 고름.
+- 임도 종류는 프로젝트명에도 들어감.
+- 같은 기준을 임도설계(B 그룹)도 씀. 종류와 속도에 따라 분석 단계의 기울기 · 곡선 기준이 자동으로 정해짐.
+
+> 참고: 이 화면에서 기울기 상한 · 최소 곡선 반지름 같은 기준값을 따로 넣는 칸은 없음.
diff --git a/A05_EduDetail/guide/D01/04_프로젝트명.md b/A05_EduDetail/guide/D01/04_프로젝트명.md
new file mode 100644
index 000000000..7c0274e38
--- /dev/null
+++ b/A05_EduDetail/guide/D01/04_프로젝트명.md
@@ -0,0 +1,26 @@
+# 프로젝트명
+
+대시보드와 표에 보이는 프로젝트 이름. 칸을 채우면 저절로 만들어짐.
+
+## 여는 길
+
+- 예정노선 등록 화면 왼쪽 아래 「프로젝트명」 칸.
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 사업 연도 · 사업 지역 · 임도 종류를 넣으면 이름이 저절로 채워짐. |
+| 2 | 다른 이름을 쓰고 싶으면 칸을 눌러 직접 고침. 255 글자까지, 비워 둘 수 없음. |
+
+
+
+그림 번호 — 1 프로젝트명(사업 지역을 넣자 이름에 지역이 들어간 모습)
+
+## 보이는 것
+
+- 이름 = 「사업 연도」 + 「사업 지역」 + 「임도 종류」를 띄어 이은 글. 연도가 여러 해이면 「2027~2029」 꼴, 한 해이면 해 하나만 들어감.
+- 이름을 직접 고치기 전에는 위 칸을 바꿀 때마다 통째로 다시 만들어짐.
+- 직접 고친 뒤에는 위 칸을 바꿔도 자동으로 만든 조각만 새 값으로 바뀌고, 직접 넣은 글은 그대로 남음. 직접 지운 조각은 되살아나지 않음.
+
+> 참고: 같은 이름 규칙을 임도설계 등록 화면도 씀.
diff --git a/A05_EduDetail/guide/D01/05_누가거리.md b/A05_EduDetail/guide/D01/05_누가거리.md
new file mode 100644
index 000000000..e43506999
--- /dev/null
+++ b/A05_EduDetail/guide/D01/05_누가거리.md
@@ -0,0 +1,27 @@
+# 노선 누가거리
+
+노선 시작과 끝의 측점 값(누가거리, m)을 미리 정해 두는 칸. 비워 두어도 등록됨.
+
+## 여는 길
+
+- 예정노선 등록 화면 맨 아래 「노선 시작 누가거리 (m)」 · 「노선 종료 누가거리 (m)」.
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 노선 첫 지점의 측점 값을 「노선 시작 누가거리」에 넣음. 0 이상의 수. |
+| 2 | 노선 끝에서 목표로 하는 거리를 「노선 종료 누가거리」에 넣음. 시작 값보다 커야 함. |
+| 3 | 모르면 두 칸 모두 비워 둠. |
+
+
+
+그림 번호 — 1 노선 시작 누가거리 · 2 노선 종료 누가거리
+
+## 보이는 것
+
+- 시작 값은 [노선 분석](D03/00_설명서) 화면의 측점 번호가 어디서부터 세는지를 정함. 비우면 0 부터.
+- 종료 값은 분석을 마친 뒤 실제 이은 끝 누가와 비교해 「목표 · 차이」로 보임.
+- 종료 값이 시작 값 이하이면 [등록] 때 「종료 누가거리는 시작보다 커야 합니다.」 안내가 나옴.
+
+> 참고: 누가거리 = 노선을 따라 잰 거리.
diff --git a/A05_EduDetail/guide/D01/06_입력오류와_등록.md b/A05_EduDetail/guide/D01/06_입력오류와_등록.md
new file mode 100644
index 000000000..f4555b654
--- /dev/null
+++ b/A05_EduDetail/guide/D01/06_입력오류와_등록.md
@@ -0,0 +1,38 @@
+# 입력 오류와 등록
+
+[등록]을 눌렀을 때의 검사와 등록 뒤 이어지는 화면.
+
+## 여는 길
+
+- 예정노선 등록 화면 맨 아래 단추 줄([?] · [취소] · [등록]).
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 칸을 모두 채운 뒤 [등록]을 누름. |
+| 2 | 문제가 있으면 그 칸 아래에 빨간 안내가 나오고 등록되지 않음. 고친 뒤 다시 [등록]. |
+| 3 | 문제가 없으면 프로젝트가 만들어지고 「프로젝트를 만들었습니다.」 알림과 함께 [기준 지정](D02/00_설명서) 화면이 열림. |
+| 4 | 등록하지 않고 나가려면 [취소]를 누름. 대시보드로 돌아감. |
+
+
+
+그림 번호 — 1 끝 연도가 시작 연도보다 앞 · 2 사업 지역 비어 있음 · 3 종료 누가거리가 시작 이하
+
+
+
+그림 번호 — 1 [?] 도움말 · 2 [취소] · 3 [등록]
+
+## 보이는 것
+
+| 안내 | 뜻 |
+| --- | --- |
+| 숫자 범위 안내 | 시작 연도가 2000 ~ 2100 밖 |
+| 「끝 연도는 시작 연도와 같거나 뒤여야 합니다.」 | 끝 연도가 시작 연도보다 앞 |
+| 「필수 항목을 입력하세요.」 | 사업 지역 또는 프로젝트명이 빔 |
+| 「종료 누가거리는 시작보다 커야 합니다.」 | 종료 값이 시작 값 이하 |
+
+- 산림청이 아닌 계정이거나 회사에 연결되지 않은 계정이면 서버가 「예정노선은 산림청만 만들 수 있습니다.」로 막고, 이 화면에 머묾.
+- 등록에 실패하면 서버가 알려 준 까닭이 알림으로 뜸.
+
+> 주의: 등록한 프로젝트는 곧바로 현재 프로젝트가 됨. 대시보드 프로젝트 표에도 「예정노선」 종류로 올라감.
diff --git a/A05_EduDetail/guide/D01/10_칸_뜻.md b/A05_EduDetail/guide/D01/10_칸_뜻.md
index 692332260..d02b3e035 100644
--- a/A05_EduDetail/guide/D01/10_칸_뜻.md
+++ b/A05_EduDetail/guide/D01/10_칸_뜻.md
@@ -1,5 +1,9 @@
# 칸 뜻
+
+
+그림 번호는 [화면 한눈에](D01/00_설명서)의 번호 표와 같음.
+
| 칸 | 뜻 | 기본값 | 범위 · 규칙 |
| --- | --- | --- | --- |
| 사업 연도 시작 | 사업 첫 해 | 올해 | 2000 ~ 2100 의 정수 |
diff --git a/A05_EduDetail/guide/D01/D01_00_overview.webp b/A05_EduDetail/guide/D01/D01_00_overview.webp
new file mode 100644
index 000000000..615329ebf
Binary files /dev/null and b/A05_EduDetail/guide/D01/D01_00_overview.webp differ
diff --git a/A05_EduDetail/guide/D01/D01_01_dashboard_new.webp b/A05_EduDetail/guide/D01/D01_01_dashboard_new.webp
new file mode 100644
index 000000000..d636f2aca
Binary files /dev/null and b/A05_EduDetail/guide/D01/D01_01_dashboard_new.webp differ
diff --git a/A05_EduDetail/guide/D01/D01_02_year_region.webp b/A05_EduDetail/guide/D01/D01_02_year_region.webp
new file mode 100644
index 000000000..46953ef23
Binary files /dev/null and b/A05_EduDetail/guide/D01/D01_02_year_region.webp differ
diff --git a/A05_EduDetail/guide/D01/D01_03_type_speed.webp b/A05_EduDetail/guide/D01/D01_03_type_speed.webp
new file mode 100644
index 000000000..3a3d33e10
Binary files /dev/null and b/A05_EduDetail/guide/D01/D01_03_type_speed.webp differ
diff --git a/A05_EduDetail/guide/D01/D01_04_name.webp b/A05_EduDetail/guide/D01/D01_04_name.webp
new file mode 100644
index 000000000..fddea6e71
Binary files /dev/null and b/A05_EduDetail/guide/D01/D01_04_name.webp differ
diff --git a/A05_EduDetail/guide/D01/D01_05_chainage.webp b/A05_EduDetail/guide/D01/D01_05_chainage.webp
new file mode 100644
index 000000000..86c1473c3
Binary files /dev/null and b/A05_EduDetail/guide/D01/D01_05_chainage.webp differ
diff --git a/A05_EduDetail/guide/D01/D01_06_errors.webp b/A05_EduDetail/guide/D01/D01_06_errors.webp
new file mode 100644
index 000000000..a0e2b8659
Binary files /dev/null and b/A05_EduDetail/guide/D01/D01_06_errors.webp differ
diff --git a/A05_EduDetail/guide/D01/D01_07_buttons.webp b/A05_EduDetail/guide/D01/D01_07_buttons.webp
new file mode 100644
index 000000000..f6925946a
Binary files /dev/null and b/A05_EduDetail/guide/D01/D01_07_buttons.webp differ
diff --git a/A05_EduDetail/guide/D01/_scenes.json b/A05_EduDetail/guide/D01/_scenes.json
new file mode 100644
index 000000000..0bfd377e1
--- /dev/null
+++ b/A05_EduDetail/guide/D01/_scenes.json
@@ -0,0 +1,10 @@
+[
+ {"name":"D01_00_overview","route":"#/d01-plan-register","project":"none","before":[{"wait":".b02-proj__grid"},{"wait_ms":600}],"clip":null,"callouts":[{"n":1,"sel":".b02-proj__grid > .ui-field:nth-child(1)"},{"n":2,"sel":".b02-proj__grid > .ui-field:nth-child(3)"},{"n":3,"sel":".b02-proj__grid > .ui-field:nth-child(5)"},{"n":4,"sel":".b02-proj__grid > .ui-field:nth-child(7)"},{"n":5,"sel":".b02-proj__grid > .ui-field:nth-child(8)"},{"n":6,"sel":".b02-proj__actions","pos":"br"}]},
+ {"name":"D01_01_dashboard_new","route":"#/b01-account","project":"none","before":[{"wait_ms":2500},{"eval":"[...document.querySelectorAll('button')].find(x=>x.textContent.trim()==='+'&&x.offsetParent).click()"},{"wait":".b01-new-project__grid"},{"wait_ms":600}],"clip":".b01-new-project","callouts":[{"n":1,"sel":"[data-new-project=\"plan\"]"}]},
+ {"name":"D01_02_year_region","route":"#/d01-plan-register","project":"none","before":[{"wait":".b02-proj__grid"},{"fill":".b02-proj__grid > .ui-field:nth-child(1) input","value":"2027"},{"fill":".b02-proj__grid > .ui-field:nth-child(2) input","value":"2029"},{"fill":".b02-proj__grid > .ui-field:nth-child(3) input","value":"울진군 금강송면"},{"wait_ms":400}],"clip":".b02-proj__grid","callouts":[{"n":1,"sel":".b02-proj__grid > .ui-field:nth-child(1)"},{"n":2,"sel":".b02-proj__grid > .ui-field:nth-child(2)"},{"n":3,"sel":".b02-proj__grid > .ui-field:nth-child(3)"},{"n":4,"sel":".b02-proj__grid > .ui-field:nth-child(4)"}]},
+ {"name":"D01_03_type_speed","route":"#/d01-plan-register","project":"none","before":[{"wait":".b02-proj__grid"},{"select":".b02-proj__grid > .ui-field:nth-child(6) select","value":"40"},{"wait_ms":400}],"clip":".b02-proj__grid","callouts":[{"n":1,"sel":".b02-proj__grid > .ui-field:nth-child(5)"},{"n":2,"sel":".b02-proj__grid > .ui-field:nth-child(6)"}]},
+ {"name":"D01_04_name","route":"#/d01-plan-register","project":"none","before":[{"wait":".b02-proj__grid"},{"fill":".b02-proj__grid > .ui-field:nth-child(3) input","value":"울진군 금강송면"},{"wait_ms":400}],"clip":".b02-proj__grid","callouts":[{"n":1,"sel":".b02-proj__grid > .ui-field:nth-child(7)"}]},
+ {"name":"D01_05_chainage","route":"#/d01-plan-register","project":"none","before":[{"wait":".b02-proj__grid"},{"fill":".b02-proj__grid > .ui-field:nth-child(8) input","value":"0"},{"fill":".b02-proj__grid > .ui-field:nth-child(9) input","value":"1100"},{"wait_ms":400}],"clip":".b02-proj__grid","callouts":[{"n":1,"sel":".b02-proj__grid > .ui-field:nth-child(8)"},{"n":2,"sel":".b02-proj__grid > .ui-field:nth-child(9)"}]},
+ {"name":"D01_06_errors","route":"#/d01-plan-register","project":"none","before":[{"wait":".b02-proj__grid"},{"fill":".b02-proj__grid > .ui-field:nth-child(1) input","value":"2029"},{"fill":".b02-proj__grid > .ui-field:nth-child(2) input","value":"2027"},{"fill":".b02-proj__grid > .ui-field:nth-child(8) input","value":"500"},{"fill":".b02-proj__grid > .ui-field:nth-child(9) input","value":"100"},{"click":".b02-proj__actions button:last-child"},{"wait":".ui-field__error.is-visible"},{"wait_ms":400}],"clip":".b02-proj__grid","callouts":[{"n":1,"sel":".b02-proj__grid > .ui-field:nth-child(2)"},{"n":2,"sel":".b02-proj__grid > .ui-field:nth-child(3)"},{"n":3,"sel":".b02-proj__grid > .ui-field:nth-child(9)"}]},
+ {"name":"D01_07_buttons","route":"#/d01-plan-register","project":"none","before":[{"wait":".b02-proj__actions"}],"clip":".b02-proj__actions","callouts":[{"n":1,"sel":".b02-proj__actions button:nth-child(1)"},{"n":2,"sel":".b02-proj__actions button:nth-child(2)"},{"n":3,"sel":".b02-proj__actions button:nth-child(3)"}]}
+]
diff --git a/A05_EduDetail/guide/D02/00_설명서.md b/A05_EduDetail/guide/D02/00_설명서.md
index a8eda8d5a..c10ed9fbf 100644
--- a/A05_EduDetail/guide/D02/00_설명서.md
+++ b/A05_EduDetail/guide/D02/00_설명서.md
@@ -1,59 +1,34 @@
-# 기준 지정 설명서
+# 기준 지정
-## 이 화면에서 하는 일
-- 예정노선 1단계. 사업 연도마다 노선의 **시점**과 **종점**을 지도 위에 정하는 화면임.
-- 가운데 = 카카오맵(지점과 연도별 선이 그려짐). 왼쪽 = 「연도 지점」 표(지점 이름 · 경도 · 위도 입력칸).
-- 정한 지점은 다음 단계(노선 분석)가 길을 찾는 기준이 됨.
-- 지점 저장은 산림청만 할 수 있음. 지정받은 다른 회사는 보기만 가능하며 저장하면 「예정노선 지점은 산림청만 고칠 수 있습니다.」 로 막힘.
+예정노선 1단계. 사업 연도마다 노선의 시점과 종점을 지도 위에 정하는 화면.
+
+## 여는 길
+
+- [예정노선 등록](D01/00_설명서)에서 [등록]을 누르면 바로 열림.
+- 대시보드 프로젝트 표에서 예정노선 줄의 단계 막대 「기준 지정」을 눌러도 열림.
+- 이미 만든 예정노선은 어느 단계 화면에서든 ☰ 에서 「기준 지정」을 골라 돌아옴. [단계 이동 메뉴](D02/05_단계_이동_메뉴) 참고.
+- 지점 저장은 산림청만 할 수 있음. 지정받은 다른 회사는 보기만 가능하며 저장하면 「예정노선 지점은 산림청만 고칠 수 있습니다.」 안내로 막힘.
+
+
+
+## 화면 구역
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 제목 줄 | 단계 이름(기준 지정)과 프로젝트 이름. 왼쪽 ☰ 로 진행 단계 메뉴를 엶 |
+| 2 | 「연도 지점」 표 | 지점마다 줄 하나. 📍 · 경도 · 위도 칸이 있음 |
+| 3 | 안내 글 | 지점을 놓는 법 한 줄 안내 |
+| 4 | 지도 | 지점 표지와 연도별 선이 그려짐. 지도를 눌러 지점을 놓고, 표지를 끌어 옮김 |
+| 5 | 단추 줄 | [?] 가이드 · [<] 이전 · [>] 다음 · [저장] |
## 작업 순서
-1. 화면이 열리면 사업 연도 수 + 1 개의 지점 줄이 표에 나타남. 예: 2026 ~ 2027 두 해이면 「2026 시점」 · 「2026 종점 · 2027 시점」 · 「2027 종점」 세 줄.
-2. 처음에는 비어 있는 첫 줄이 놓을 지점으로 잡혀 있음(줄이 강조되어 보임).
-3. 지도를 눌러 그 지점을 놓음. 놓으면 다음 빈 지점이 자동으로 놓을 지점이 됨.
-4. 놓은 뒤 고치려면 지도의 표지를 끌어 옮기거나, 표의 경도 · 위도 칸에 값을 직접 넣음.
-5. 모든 줄이 채워지면 연도마다 다른 색의 선이 지점 사이를 이음.
-6. [저장] 또는 [>] 를 누름.
-## 지점 정하는 방법
-| 방법 | 하는 법 | 결과 |
-| --- | --- | --- |
-| 지도 누름 | 줄 옆 📍 로 놓을 지점을 고른 뒤 지도를 누름 | 그 자리에 표지가 놓임 |
-| 표지 끌기 | 지도의 표지를 끌어 놓음 | 표의 값이 따라 바뀜 |
-| 좌표 입력 | 경도 · 위도 두 칸에 값을 넣고 칸을 벗어남 | 값이 맞으면 표지가 옮겨짐 · 틀리면 칸이 빨갛게 표시됨 |
+1. 화면이 열리면 지점 줄이 사업 연도 수 + 1 개 나타남. 예: 2027 ~ 2029 세 해이면 네 줄. [연도 지점 표](D02/01_연도_지점_표) 참고.
+2. 놓을 지점이 줄에서 강조되어 있음. 지도를 눌러 그 지점을 놓음. [지도에서 지점 놓기](D02/02_지도에서_지점_놓기) 참고.
+3. 놓은 뒤 고치려면 표지를 끌어 옮기거나 경도 · 위도 칸에 값을 직접 넣음. [좌표 직접 입력](D02/03_좌표_직접_입력) 참고.
+4. 모든 줄이 채워지면 연도마다 다른 색의 선이 지점 사이를 이음.
+5. [저장] 또는 [>]를 누름. [단추와 저장](D02/04_단추와_저장) 참고.
-- 놓을 지점을 고르지 않고 지도를 누르면 「지도에 놓을 지점 고르기」 안내가 나옴.
-- 다른 프로그램에서 구한 좌표는 경도 · 위도(WGS84, 소수 7 자리까지 반영)로 넣을 것.
-- 경도는 120 ~ 135, 위도는 30 ~ 45 범위만 받음.
+> 주의: 서버에는 [저장] 이나 [>]를 눌러야 반영됨. 자동 저장은 없음.
-## 연도 표 읽는 법
-| 줄 이름 | 뜻 |
-| --- | --- |
-| 첫 연도 시점 | 노선 전체의 출발점 |
-| 앞 연도 종점 · 다음 연도 시점 | 한 점이 두 역할. 앞 연도의 끝이자 다음 연도의 시작 |
-| 마지막 연도 종점 | 노선 전체의 도착점 |
-
-- 직전 연도 종점과 다음 연도 시점은 항상 같은 점이며, 하나만 옮기면 두 연도의 선이 함께 움직임.
-- 줄 색과 지도 선 색은 연도별로 대응함(6 색을 돌려 씀).
-
-## 단추
-| 단추 | 하는 일 |
-| --- | --- |
-| [?] | 이 도움말 |
-| [<] | 이전 단계. 이 화면이 첫 단계라 흐림 |
-| [>] | 지점 저장 뒤 다음 단계 「노선 분석」 으로 감 |
-| [저장] | 지점을 저장하고 좌표계를 정함 |
-| 📍 | 지도를 눌렀을 때 놓을 지점으로 이 줄을 고름 |
-| 위 단계 막대 | 「기준 지정」 · 「노선 분석」 · 「확정 · 내보내기」 로 바로 이동 |
-
-## 결과 읽는 법
-- 저장하면 「지점을 저장했습니다.」 알림이 뜸.
-- 표 아래 한 줄에 「저장 좌표계 EPSG:번호」 와 첫 연도 시점의 X · Y(m)가 나옴. 저장 전에는 「아직 저장 안 함」 이 나옴.
-- 저장 전 고친 값은 이 화면을 다시 열어도 같은 브라우저 안에서는 남아 있음. 서버에는 [저장] 이나 [>] 를 눌러야 반영됨(자동 저장 없음).
-
-## 알아 둘 것
-- **[>] 와 수치지형도**: [>] 는 지점을 저장한 뒤 「노선 분석」 화면을 엶. 수치지형도(도엽) · 위성 사진 · 연도별 지형면 받기는 그 화면이 열릴 때 뒤에서 시작되며, 이미 받은 범위 안이면 건너뜀. 지점을 저장하지 못하면(예: 빈 지점) 이 화면에 머묾.
-- 빈 지점이 남은 채 저장하면 「○○○○년 시점이 비었습니다.」 또는 「○○○○년 종점이 비었습니다.」 로 막힘.
-- 연도 범위(시작 · 끝)는 등록 때 정해지며 이 화면에서 바꿀 수 없음.
-- **이미 분석 · 확정한 연도의 지점을 옮기면** 그 연도의 분석 노선과 확정 상태가 비워지고 다시 분석해야 함. 1 mm 이내 변화는 같은 지점으로 보아 지우지 않음.
-- 좌표계가 바뀌는 경우(「쓰인 방법과 근거」 문서의 좌표계 절)에는 모든 연도의 분석 노선이 비워짐.
-- 지도는 카카오맵을 씀. 점이 하나도 없어도 우리나라 가운데쯤을 먼저 보여 줌.
+> 참고: 저장하지 않고 고친 값은 같은 브라우저 탭 안에서는 화면을 다시 열어도 남아 있음.
diff --git a/A05_EduDetail/guide/D02/01_연도_지점_표.md b/A05_EduDetail/guide/D02/01_연도_지점_표.md
new file mode 100644
index 000000000..d8baae2e5
--- /dev/null
+++ b/A05_EduDetail/guide/D02/01_연도_지점_표.md
@@ -0,0 +1,33 @@
+# 연도 지점 표
+
+왼쪽 패널의 「연도 지점」 카드. 지점마다 줄 하나로 이름 · 📍 · 경도 · 위도를 보여 줌.
+
+## 여는 길
+
+- 기준 지정 화면 왼쪽 패널 맨 위의 「연도 지점」 카드. 제목 오른쪽 ▼ 를 누르면 접고 펼침.
+
+
+
+그림 번호 — 1 안내 글 · 2 지점 한 줄 · 3 📍 단추 · 4 경도 칸 · 5 위도 칸 · 6 저장 좌표계 줄
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 줄 이름으로 어느 지점인지 확인. 첫 줄 = 첫 연도 시점, 마지막 줄 = 마지막 연도 종점. |
+| 2 | 줄 왼쪽 색 띠로 어느 연도 선인지 확인. 지도 선 색과 짝(6 색을 돌려 씀). |
+| 3 | 사이 줄은 「앞 연도 종점 · 다음 연도 시점」 한 점. 하나만 옮기면 두 연도의 선이 함께 움직임. |
+| 4 | 값을 고치는 방법은 [지도에서 지점 놓기](D02/02_지도에서_지점_놓기) · [좌표 직접 입력](D02/03_좌표_직접_입력) 참고. |
+
+## 보이는 것
+
+| 줄 이름 | 뜻 |
+| --- | --- |
+| 첫 연도 시점 | 노선 전체의 출발점 |
+| 앞 연도 종점 · 다음 연도 시점 | 한 점이 두 역할 |
+| 마지막 연도 종점 | 노선 전체의 도착점 |
+
+- 표 아래 한 줄 = 저장 상태. 저장 전이면 「아직 저장 안 함」, 저장했으면 「저장 좌표계 EPSG:번호」와 첫 연도 시점의 X · Y(m).
+- 산림청이 아닌 계정은 📍 단추가 안 보이고 칸이 잠겨 있음. 보기만 가능.
+
+> 참고: 칸마다 뜻과 규칙은 [칸 뜻](D02/10_칸_뜻)에 있음. 좌표계가 정해지는 방법은 [쓰인 방법과 근거](D02/20_쓰인_방법과_근거) 참고.
diff --git a/A05_EduDetail/guide/D02/02_지도에서_지점_놓기.md b/A05_EduDetail/guide/D02/02_지도에서_지점_놓기.md
new file mode 100644
index 000000000..ce7459eb2
--- /dev/null
+++ b/A05_EduDetail/guide/D02/02_지도에서_지점_놓기.md
@@ -0,0 +1,39 @@
+# 지도에서 지점 놓기
+
+지도를 눌러 지점을 놓고, 놓은 표지를 끌어 옮기는 방법.
+
+## 여는 길
+
+- 기준 지정 화면 가운데 지도와 왼쪽 「연도 지점」 표의 📍 단추.
+
+
+
+그림 번호 — 1 지도 위 안내 글
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 놓을 지점을 고름. 화면이 열리면 비어 있는 첫 줄이 자동으로 골라져 강조됨. 다른 줄에 놓으려면 그 줄의 📍 를 누름. |
+| 2 | 지도에서 놓을 자리를 누름. 그 자리에 표지가 놓이고 표의 경도 · 위도가 채워짐. |
+| 3 | 놓고 나면 다음 빈 지점이 자동으로 놓을 지점이 됨. |
+| 4 | 놓은 뒤 고치려면 표지를 마우스로 끌어 옮김. 표의 값이 따라 바뀜. |
+| 5 | 지도는 빈 곳을 끌어 옮기고 휠로 확대 · 축소함. |
+
+
+
+그림 번호 — 1 📍 단추 · 2 강조된 줄(놓을 지점)
+
+
+
+그림 번호 — 1 「지도에 놓을 지점 고르기」 안내
+
+## 보이는 것
+
+- 지점이 모두 놓이면 연도마다 다른 색의 선이 지점 사이를 이음. 표지 위에는 지점 이름이 붙음.
+- 놓을 지점을 고르지 않고 지도를 누르면 「지도에 놓을 지점 고르기」 안내가 나오고 아무것도 놓이지 않음.
+- 지점이 하나도 없으면 우리나라 가운데쯤이 먼저 보임. 처음 한 점을 놓으면 그 점에 맞춰 보이고, 그 뒤로는 사용자가 맞춘 보기(중심 · 확대)를 그대로 둠.
+- 지도는 카카오맵을 씀.
+- 산림청이 아닌 계정은 지도를 눌러도 놓이지 않고 표지도 끌 수 없음. 지도 위 안내 글이 「보기 전용 — 지점은 산림청만 고칩니다.」로 바뀜.
+
+> 주의: 놓은 지점은 [저장] 이나 [>]를 누르기 전까지 서버에 남지 않음. [단추와 저장](D02/04_단추와_저장) 참고.
diff --git a/A05_EduDetail/guide/D02/03_좌표_직접_입력.md b/A05_EduDetail/guide/D02/03_좌표_직접_입력.md
new file mode 100644
index 000000000..149b302b7
--- /dev/null
+++ b/A05_EduDetail/guide/D02/03_좌표_직접_입력.md
@@ -0,0 +1,28 @@
+# 좌표 직접 입력
+
+다른 프로그램에서 구한 좌표를 표의 경도 · 위도 칸에 직접 넣는 방법.
+
+## 여는 길
+
+- 왼쪽 「연도 지점」 표의 줄마다 있는 경도 · 위도 두 칸.
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 고칠 줄의 경도 칸에 값을 넣음. |
+| 2 | 위도 칸에도 값을 넣고 칸 밖을 누르거나 Tab 키를 누름. |
+| 3 | 두 값이 범위 안이면 지점이 옮겨지고 지도 표지가 따라 움직임. |
+| 4 | 범위 밖이면 두 칸이 빨갛게 표시되고 반영되지 않음. 값을 고쳐 다시 넣음. |
+
+
+
+그림 번호 — 1 경도 칸(범위 밖 값 200을 넣은 모습) · 2 위도 칸
+
+## 보이는 것
+
+- 경도는 120 ~ 135, 위도는 30 ~ 45 범위만 받음.
+- 두 칸이 모두 범위 안일 때 반영됨. 한 칸만 넣으면 반영되지 않음.
+- 반영될 때 소수 7 자리(약 1 cm)로 반올림됨.
+
+> 주의: 좌표는 경도 · 위도(WGS84)로 넣음. 평면좌표(X · Y)를 그대로 넣으면 범위 밖으로 처리됨.
diff --git a/A05_EduDetail/guide/D02/04_단추와_저장.md b/A05_EduDetail/guide/D02/04_단추와_저장.md
new file mode 100644
index 000000000..4464b370c
--- /dev/null
+++ b/A05_EduDetail/guide/D02/04_단추와_저장.md
@@ -0,0 +1,33 @@
+# 단추와 저장
+
+왼쪽 패널 맨 아래 단추 줄 — [?] · [<] · [>] · [저장]과 저장 때 일어나는 일.
+
+## 여는 길
+
+- 기준 지정 화면 왼쪽 패널 맨 아래.
+
+
+
+그림 번호 — 1 [?] 가이드 · 2 [<] 이전 단계(첫 단계라 흐림) · 3 [>] 다음 단계 · 4 [저장]
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 모든 지점 줄을 채움. |
+| 2 | [저장]을 누름. 지점이 서버에 저장되고 「지점을 저장했습니다.」 알림이 뜸. |
+| 3 | 바로 다음 단계로 가려면 [저장] 대신 [>]를 누름. 지점을 저장한 뒤 [노선 분석](D03/00_설명서) 화면이 열림. |
+| 4 | 저장하지 못하면(예: 빈 지점) 이 화면에 머묾. |
+
+## 보이는 것
+
+- 저장하면 표 아래 한 줄이 「저장 좌표계 EPSG:번호」와 첫 연도 시점의 X · Y(m)로 바뀜.
+- 빈 지점이 남은 채 저장하면 「○○○○년 시점이 비었습니다.」 또는 「○○○○년 종점이 비었습니다.」로 막힘.
+- 산림청이 아닌 계정은 [저장]이 안 보이고, [>]는 저장 없이 그냥 다음 화면으로 감.
+- [>]는 지점 저장 뒤 [노선 분석](D03/00_설명서) 화면을 엶. 수치지형도(도엽) · 위성 사진 · 연도별 지형면 받기는 그 화면이 열릴 때 뒤에서 시작되며, 이미 받은 범위 안이면 건너뜀.
+
+> 주의: 이미 분석 · 확정한 연도의 지점을 옮기면 그 연도의 분석 노선과 확정 상태가 비워지고 다시 분석해야 함. 1 mm 이내 변화는 같은 지점으로 보아 지우지 않음.
+
+> 주의: 좌표계가 바뀌는 경우([쓰인 방법과 근거](D02/20_쓰인_방법과_근거) 참고)에는 모든 연도의 분석 노선이 비워짐.
+
+> 참고: 연도 범위(시작 · 끝)는 등록 때 정해지며 이 화면에서 바꿀 수 없음.
diff --git a/A05_EduDetail/guide/D02/05_단계_이동_메뉴.md b/A05_EduDetail/guide/D02/05_단계_이동_메뉴.md
new file mode 100644
index 000000000..5e2b919cb
--- /dev/null
+++ b/A05_EduDetail/guide/D02/05_단계_이동_메뉴.md
@@ -0,0 +1,27 @@
+# 단계 이동 메뉴
+
+☰ 로 진행 단계를 열어 대시보드나 다른 단계 화면으로 옮겨 가는 방법.
+
+## 여는 길
+
+- 화면 왼쪽 위의 ☰ 를 누름.
+
+
+
+그림 번호 — 1 진행 단계 목록(대시보드 · 기준 지정 · 노선 분석 · 확정 · 내보내기)
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | ☰ 를 누르면 왼쪽에 메뉴가 열림. |
+| 2 | 가야 할 단계를 누름. 지금 단계는 강조되어 있음. |
+| 3 | 메뉴 밖 어두운 곳을 누르면 닫힘. |
+
+## 보이는 것
+
+- 맨 위 「대시보드」 = 프로젝트 목록 화면으로 돌아감.
+- 단계는 기준 지정 → 노선 분석 → 확정 · 내보내기 순.
+- 메뉴 아래에는 홈페이지 바로가기 · 언어 · 테마 · 로그아웃이 같이 있음.
+
+> 주의: 지점을 고치고 저장하지 않은 채 다른 단계로 가면 서버에는 저장되지 않음. 먼저 [저장]을 누를 것.
diff --git a/A05_EduDetail/guide/D02/10_칸_뜻.md b/A05_EduDetail/guide/D02/10_칸_뜻.md
index 24a2720a4..2fb587514 100644
--- a/A05_EduDetail/guide/D02/10_칸_뜻.md
+++ b/A05_EduDetail/guide/D02/10_칸_뜻.md
@@ -1,5 +1,9 @@
# 칸 뜻
+
+
+그림 번호는 [연도 지점 표](D02/01_연도_지점_표)와 같음.
+
## 왼쪽 「연도 지점」 표
| 칸 | 뜻 | 규칙 |
| --- | --- | --- |
diff --git a/A05_EduDetail/guide/D02/D02_00_overview.webp b/A05_EduDetail/guide/D02/D02_00_overview.webp
new file mode 100644
index 000000000..65d8a3f54
Binary files /dev/null and b/A05_EduDetail/guide/D02/D02_00_overview.webp differ
diff --git a/A05_EduDetail/guide/D02/D02_01_points_table.webp b/A05_EduDetail/guide/D02/D02_01_points_table.webp
new file mode 100644
index 000000000..7633737ee
Binary files /dev/null and b/A05_EduDetail/guide/D02/D02_01_points_table.webp differ
diff --git a/A05_EduDetail/guide/D02/D02_02_year_colors.webp b/A05_EduDetail/guide/D02/D02_02_year_colors.webp
new file mode 100644
index 000000000..4860c5771
Binary files /dev/null and b/A05_EduDetail/guide/D02/D02_02_year_colors.webp differ
diff --git a/A05_EduDetail/guide/D02/D02_03_pick_point.webp b/A05_EduDetail/guide/D02/D02_03_pick_point.webp
new file mode 100644
index 000000000..fb536cf7b
Binary files /dev/null and b/A05_EduDetail/guide/D02/D02_03_pick_point.webp differ
diff --git a/A05_EduDetail/guide/D02/D02_04_map_toast.webp b/A05_EduDetail/guide/D02/D02_04_map_toast.webp
new file mode 100644
index 000000000..b652fb599
Binary files /dev/null and b/A05_EduDetail/guide/D02/D02_04_map_toast.webp differ
diff --git a/A05_EduDetail/guide/D02/D02_05_coordinate_error.webp b/A05_EduDetail/guide/D02/D02_05_coordinate_error.webp
new file mode 100644
index 000000000..697fcf9de
Binary files /dev/null and b/A05_EduDetail/guide/D02/D02_05_coordinate_error.webp differ
diff --git a/A05_EduDetail/guide/D02/D02_06_buttons.webp b/A05_EduDetail/guide/D02/D02_06_buttons.webp
new file mode 100644
index 000000000..f7cd4ddd9
Binary files /dev/null and b/A05_EduDetail/guide/D02/D02_06_buttons.webp differ
diff --git a/A05_EduDetail/guide/D02/D02_07_steps_menu.webp b/A05_EduDetail/guide/D02/D02_07_steps_menu.webp
new file mode 100644
index 000000000..dbeb348aa
Binary files /dev/null and b/A05_EduDetail/guide/D02/D02_07_steps_menu.webp differ
diff --git a/A05_EduDetail/guide/D02/_scenes.json b/A05_EduDetail/guide/D02/_scenes.json
new file mode 100644
index 000000000..def1a74f5
--- /dev/null
+++ b/A05_EduDetail/guide/D02/_scenes.json
@@ -0,0 +1,10 @@
+[
+ {"name":"D02_00_overview","route":"#/d02-plan-base","project":"plan","before":[{"wait":".d02-points__row"},{"wait":".ui-kakao-map__box"},{"wait_ms":3500}],"settle_ms":1500,"clip":null,"callouts":[{"n":1,"sel":".ui-workflow-overlay__header"},{"n":2,"sel":".d02-points"},{"n":3,"sel":".d02-info"},{"n":4,"sel":".d02-map","pos":"tr"},{"n":5,"sel":".ui-sidebar-actions","pos":"tr"}]},
+ {"name":"D02_01_points_table","route":"#/d02-plan-base","project":"plan","before":[{"wait":".d02-points__row"},{"wait":".ui-kakao-map__box"},{"wait_ms":3500}],"settle_ms":1500,"clip":".d02-panel .ui-sidebar-card","callouts":[{"n":1,"sel":".d02-panel p.d02-info:first-of-type"},{"n":2,"sel":".d02-points__row:nth-child(1)","pos":"tr"},{"n":3,"sel":".d02-points__row:nth-child(1) button","pos":"bl"},{"n":4,"sel":".d02-points__row:nth-child(1) input[data-axis=lon]","pos":"br"},{"n":5,"sel":".d02-points__row:nth-child(1) input[data-axis=lat]","pos":"br"},{"n":6,"sel":".d02-points ~ p.d02-info"}]},
+ {"name":"D02_02_year_colors","route":"#/d02-plan-base","project":"plan","before":[{"wait":".d02-points__row"},{"wait":".ui-kakao-map__box"},{"wait_ms":3500}],"settle_ms":1500,"clip":".d02-map","callouts":[{"n":1,"sel":".ui-kakao-map__hint"}]},
+ {"name":"D02_03_pick_point","route":"#/d02-plan-base","project":"plan","before":[{"wait":".d02-points__row"},{"wait":".ui-kakao-map__box"},{"wait_ms":3500},{"click":".d02-points__row:nth-child(2) button"},{"wait":".d02-points__row:nth-child(2).is-active"},{"wait_ms":300}],"settle_ms":1500,"clip":".d02-panel .ui-sidebar-card","callouts":[{"n":1,"sel":".d02-points__row:nth-child(2) button"},{"n":2,"sel":".d02-points__row:nth-child(2)"}]},
+ {"name":"D02_04_map_toast","route":"#/d02-plan-base","project":"plan","before":[{"wait":".d02-points__row"},{"wait":".ui-kakao-map__box"},{"wait_ms":3500},{"click":".ui-kakao-map__box"},{"wait":".ui-toast, .ui-toast-container, [class*=toast]"},{"wait_ms":400}],"settle_ms":1500,"clip":null,"callouts":[{"n":1,"sel":"[class*=toast]","pos":"tr"}]},
+ {"name":"D02_05_coordinate_error","route":"#/d02-plan-base","project":"plan","before":[{"wait":".d02-points__row"},{"wait":".ui-kakao-map__box"},{"wait_ms":3500},{"fill":".d02-points__row:nth-child(1) input[data-axis=lon]","value":"200"},{"press":"Tab","sel":".d02-points__row:nth-child(1) input[data-axis=lon]"},{"wait":".d02-points__row:nth-child(1) input.is-invalid"},{"wait_ms":300}],"settle_ms":1500,"clip":".d02-panel .ui-sidebar-card","callouts":[{"n":1,"sel":".d02-points__row:nth-child(1) input[data-axis=lon]"},{"n":2,"sel":".d02-points__row:nth-child(1) input[data-axis=lat]"}]},
+ {"name":"D02_06_buttons","route":"#/d02-plan-base","project":"plan","before":[{"wait":".d02-points__row"},{"wait":".ui-kakao-map__box"},{"wait_ms":3500}],"settle_ms":1500,"clip":".ui-sidebar-actions","callouts":[{"n":1,"sel":".ui-sidebar-actions > button:nth-child(1)"},{"n":2,"sel":".ui-sidebar-actions > button:nth-child(2)"},{"n":3,"sel":".ui-sidebar-actions > button:nth-child(3)"},{"n":4,"sel":".ui-sidebar-actions > button:nth-child(4)"}]},
+ {"name":"D02_07_steps_menu","route":"#/d02-plan-base","project":"plan","before":[{"wait":".d02-points__row"},{"click":".app-burger"},{"wait":".app-drawer__steps .ui-workflow-layout__step"},{"wait_ms":700}],"settle_ms":1500,"clip":null,"callouts":[{"n":1,"sel":".app-drawer__steps","pos":"tr"}]}
+]
diff --git a/A05_EduDetail/guide/D03/00_설명서.md b/A05_EduDetail/guide/D03/00_설명서.md
index f5c9fc505..0aaf90c85 100644
--- a/A05_EduDetail/guide/D03/00_설명서.md
+++ b/A05_EduDetail/guide/D03/00_설명서.md
@@ -1,80 +1,36 @@
-# 예정노선 2단계 분석 설명서
+# 노선 분석
-## 이 화면에서 하는 일
+예정노선 2단계. 1단계에서 정한 지점들을 연도 구간마다 이어 주는 노선 후보를 자동으로 찾아 연도별로 하나씩 고르는 화면.
-- 1단계(기준 지정)에서 정한 지점들을 연도 구간마다 이어 주는 노선을 자동으로 찾아 줌.
-- 연도마다 노선 후보 넷(영선 · 토공 최소 · 기울기 최소 · 비중 계산)을 만들어 보여 주고, 연도별로 하나씩 고름.
-- 고른 후보를 이어 붙여 전체 예정노선 한 줄과 측점(20 m 간격)을 평면에 표시함.
-- 측점을 누르면 그 자리 지반선 횡단을 아래에 보여 주고, [3D] 로 지형과 노선을 입체로 봄.
-- 지점이 마음에 안 들면 평면에서 직접 끌어 옮긴 뒤 다시 분석 가능.
-- 노선 후보를 찾는 엔진은 임도설계 노선 추천(B05)과 같은 엔진임. 이 화면에서는 시작점과 끝점만 정해진 두 지점 사이를 구간별로 한 번씩 찾음.
+## 여는 길
-## 화면 구성
+- [기준 지정](D02/00_설명서) 화면에서 [>]를 누르면 지점을 저장하고 이 화면이 열림.
+- 대시보드 프로젝트 표의 단계 막대 「노선 분석」을 누르거나, ☰ 에서 「노선 분석」을 골라도 열림.
+- 지점이 비어 있으면 「N년 지점이 비었습니다 — 1단계(기준 지정)에서 정하세요.」 안내만 나오고 진행이 안 됨.
-- 가운데 위 = 평면 지도. 위성 사진 위에 등고선, 지점, 노선, 측점이 겹쳐 보임.
-- 가운데 아래 = 횡단 판. 측점을 누르면 채워지며, 제목 줄(「횡단」)을 누르면 접고 펼 수 있음.
-- 왼쪽 = 「지형」 카드, 「연도별 노선」 카드, 아래쪽 단추 [분석] [저장] [3D].
+
+
+## 화면 구역
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 평면 지도 | 위성 사진 위에 등고선 · 지점 · 노선 · 측점이 겹쳐 보임. 측점을 누르면 아래 횡단이 채워짐 |
+| 2 | 횡단 판 | 누른 측점의 지반선 횡단. 제목 줄(「횡단」)을 눌러 접고 펼침 |
+| 3 | 「지형」 카드 | 지형 받기 · 분석 진행 상태와 받은 지형 범위 안내 |
+| 4 | 「연도별 노선」 카드 | 연도마다 후보 넷. 하나를 눌러 고름 |
+| 5 | 단추 줄 | [?] · [<] · [>] · [분석] · [저장] · [3D] |
## 작업 순서
-1. 화면을 열면 자동으로 지형을 확인함. 지점이 이미 받은 지형 범위 안이면 그대로 두고, 아니면 뒤에서 지형을 받기 시작함(왼쪽 「지형」 카드에 진행률 표시).
-2. 지점 위치가 마음에 안 들면 평면에서 지점(원)을 끌어 옮김. 지점이 받은 지형 밖이면 [범위 밖 — 더 받기] 를 눌러 지형을 더 받음.
-3. [분석] 을 누름. 연도 구간마다 후보 넷을 찾으며, 진행률이 「지형」 카드 자리에 표시됨.
-4. 「연도별 노선」 카드에서 연도마다 후보 하나를 누름(눌린 카드가 강조됨). 평면의 노선과 누가(거리) 숫자가 곧바로 바뀜.
-5. 평면의 측점 눈금을 눌러 횡단을 확인하고, 필요하면 [3D] 로 확인함.
-6. 모든 연도에 노선이 있으면 [저장] 을 누름. 저장 중에는 화면 전체가 잠깐 잠김.
-7. 다음 단계(확정 · 업체 · 내보내기)로 넘어감.
+1. 화면을 열면 지형을 자동으로 확인함. 받은 지형 밖이면 뒤에서 지형을 받기 시작함. [지형 받기](D03/01_지형_받기) 참고.
+2. [분석]을 누름. 연도 구간마다 후보 넷을 찾음. [분석 · 저장 · 3D 단추](D03/05_분석_저장_단추) 참고.
+3. 「연도별 노선」 카드에서 연도마다 후보 하나를 고름. 평면의 노선이 바로 바뀜. [연도별 노선 고르기](D03/02_연도별_노선_고르기) 참고.
+4. 평면 지도에서 노선 · 측점을 확인하고, 지점이 마음에 안 들면 끌어 옮긴 뒤 다시 [분석]. [평면 지도 읽기](D03/03_평면_지도_읽기) 참고.
+5. 측점 눈금을 눌러 지반선 횡단을 확인함. [측점 횡단](D03/04_측점_횡단) 참고.
+6. 필요하면 [3D]로 지형과 노선을 입체로 봄. [3D 보기](D03/06_3D_보기) 참고.
+7. 모든 연도에 노선이 있으면 [저장]을 누름. 저장 중에는 화면 전체가 잠깐 잠김.
+8. 다음 단계 [확정 · 내보내기](D04/00_설명서)로 넘어감.
-## 단추
+> 주의: 노선 모양은 [분석]을 해야 생김. [분석]을 하지 않으면 [저장]이 눌리지 않음.
-| 단추 | 하는 일 |
-| --- | --- |
-| 분석 | 연도 구간마다 노선 후보 넷을 찾음. 입력(지점 · 기준 · 지형)이 이전과 같으면 저장된 결과를 그대로 불러와 바로 끝남. 받은 지형 밖에 지점이 있으면 눌 수 없음 |
-| 저장 | 연도별로 고른 후보를 정본으로 저장함. 끌어 옮긴 지점도 이때 함께 저장됨. 어느 연도든 노선이 없으면 눌 수 없음(마우스를 올리면 안내 문구 표시) |
-| 3D | 지형과 노선을 입체로 보는 창을 엶. 노선이 하나라도 있어야 눌 수 있음 |
-| 범위 밖 — 더 받기 | 지점이 받은 지형 밖일 때만 나타남. 지형(수치지형도 · 위성 · 연도별 높이 자료)을 더 받음 |
-
-- 산림청 소속이 아닌 사용자(지정받은 회사 등)에게는 [분석] [저장] [범위 밖 — 더 받기] 가 보이지 않으며 지점도 끌 수 없음. 보기만 가능.
-
-## 결과 읽는 법
-
-- **평면의 선 모양**
- - 굵은 선 = 연도별로 고른 후보를 이은 예정노선.
- - 흰 점선(옅음) = 고르지 않은 다른 후보들. 분석 전에는 지점끼리 잇는 점선만 보임.
- - 누른 측점 = 보라색 고리로 표시됨.
-- **지점(마디) 색**
- - 초록 = 첫 지점(시점), 빨강 = 마지막 지점(종점), 파랑 = 연도가 바뀌는 중간 지점.
- - 지점 둘레에 빨간 고리와 점선 고리 = 그 지점이 받은 지형 밖이라는 뜻. 「지형」 카드에 「빨간 고리 지점이 받은 지형 밖입니다 — 더 받아야 분석합니다.」 가 나옴.
-- **등고선** = 도엽(수치지형도) 등고선. 노란 점선과 노란 숫자(높이)로 보임. 지도를 확대하면 더 촘촘히 보임.
-- **연도별 노선 카드**
- - 윗줄 = 「연도 · 시작 측점 ~ 끝 측점 (연장 m)」. 분석 전에는 「분석 전 — [분석]을 누르세요」 가 보임.
- - 후보 카드 한 장마다 「연장 · 최대 기울기(%) · 위반 개수」 를 보여 줌. 위반 = 기울기 기준을 지키지 못한 곳의 수.
- - 「노선 없음」 으로 회색 처리된 카드 = 그 후보는 길을 찾지 못함. 마우스를 올리면 까닭 표시. 누를 수 없음.
- - 고르지 않고 두면 네 후보 중 차례(영선 → 토공 최소 → 기울기 최소 → 비중 계산)대로 처음 성공한 후보가 자동으로 잡힘.
-- **누가(측점 번호)** = 앞 연도 끝 = 다음 연도 시작으로 이어서 셈. 시작 값은 프로젝트 등록 때 정한 노선 시작 누가. 연도 경계는 꺾인 채 한 측점으로 표시됨.
-- **횡단 판** = 누른 측점의 지반선 단면. 제목 줄에 「연도 · 측점 이름 · 중심 지반고」 표시. 좌우 20 m 범위의 지반만 보이며 설계선은 없음.
-
-## 보이는 것과 안 보이는 것
-
-| 구분 | 내용 |
-| --- | --- |
-| 보임 | 위성 지도, 등고선, 지점, 노선 중심선, 측점 눈금과 이름, 지반선 횡단, 지형 + 중심선 3D |
-| 안 보임 | 노견, 절토 · 성토선, 종단도, 배수유역, 구조물(3D 에도 없음) |
-| 이 화면에 칸 없음 | 종단 기울기 상한 · 최소 곡선 반지름 등 기준값. 등록 때 정한 임도 종류와 설계속도로 자동 정해짐 |
-
-## 지점 끌기
-
-- 지점(원) 위에서 마우스 왼쪽 단추를 누른 채 끌면 지점이 따라 움직임. 끝점은 이웃 연도의 시작점과 한 점으로 묶여 있어 함께 움직임.
-- 지점을 옮기면 그 지점 앞 · 뒤 연도의 분석 결과가 비워지고 「지점을 옮겼습니다 — [분석] 뒤 측점을 누르세요.」 가 횡단 판에 나옴. 다시 [분석] 을 눌러야 함.
-- 옮긴 위치는 [저장] 전까지 이 브라우저 탭에만 임시로 남아 있음(새로 고침해도 유지, 탭을 닫으면 사라짐). [저장] 을 눌러야 정본이 바뀜.
-- 손이 조금 떨리는 정도(몇 픽셀)의 움직임은 끌기로 치지 않고 단순 누름으로 처리함.
-- 지도 자체는 지점이 아닌 곳을 끌어 옮기고, 휠로 확대 · 축소함.
-
-## 알아 둘 것
-
-- [저장] 은 노선 모양을 화면에서 받지 않고, 고른 후보 이름만 서버에 보냄. 서버가 저장된 분석 결과로 노선을 다시 이어 붙여 저장하므로, [분석] 을 하지 않은 상태에서는 저장할 수 없음(「분석 저장본이 없습니다 — [분석]을 먼저 하세요.」).
-- 처음 열 때 지점이 비어 있으면 「N년 지점이 비었습니다 — 1단계(기준 지정)에서 정하세요.」 라는 문구만 나오고 진행이 안 됨.
-- 지형 받기와 분석은 서버 뒤에서 도는 작업임. 화면을 닫았다 다시 열어도 도는 중이면 이어서 진행률을 보여 줌.
-- 위성 사진은 못 받아도 지형 받기가 멈추지 않음. 위성이 없으면 어두운 바탕에 지점과 노선만 보임.
-- 3D 창은 한 번에 한 연도씩 보며, 창 위쪽 선택칸으로 연도를 바꿈. 창을 닫으면 3D 화면 자원이 정리됨.
-- 법 기준의 세부 수치와 사용자 확정 전 값은 「30_사용자_확정_전_값」 문서 참고.
+> 참고: 노선 후보를 찾는 엔진은 임도설계 노선 추천(B05)과 같음. 이 화면에서는 시작점과 끝점만 정해진 두 지점 사이를 구간별로 한 번씩 찾음. 자세한 방법은 [쓰인 방법과 근거](D03/20_쓰인_방법과_근거) 참고.
diff --git a/A05_EduDetail/guide/D03/01_지형_받기.md b/A05_EduDetail/guide/D03/01_지형_받기.md
new file mode 100644
index 000000000..f04a006e6
--- /dev/null
+++ b/A05_EduDetail/guide/D03/01_지형_받기.md
@@ -0,0 +1,30 @@
+# 지형 받기
+
+노선을 찾으려면 지점 둘레의 지형 자료가 필요함. 화면이 열리면 이 자료를 자동으로 확인하고 모자라면 받음.
+
+## 여는 길
+
+- 노선 분석 화면 왼쪽 위 「지형」 카드.
+
+
+
+그림 번호 — 1 지형 상태 한 줄(「받은 지형 안 · 연도 지형면 3/3」)
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 화면을 열고 「지형」 카드의 글을 확인함. 「받은 지형 안」이면 그대로 분석할 수 있음. |
+| 2 | 지점이 받은 지형 밖이면 지형 받기가 뒤에서 시작되고 카드에 진행률(%)이 보임. 끝날 때까지 기다림. |
+| 3 | 지점을 옮겨 범위 밖이 되면 [범위 밖 — 더 받기]가 나타남. 눌러서 지형을 더 받음. |
+| 4 | 받기가 끝나면 지도 배경과 등고선이 새로 그려짐. |
+
+## 보이는 것
+
+- 「받은 지형 안 · 연도 지형면 N/M」 = M 개 연도 중 N 개 연도의 높이 자료가 준비됨.
+- 지점이 받은 지형 밖이면 지도에서 그 지점에 빨간 고리와 점선 고리가 보이고, 카드에 「빨간 고리 지점이 받은 지형 밖입니다 — 더 받아야 분석합니다.」가 나옴. 이때 [분석]은 눌리지 않음.
+- 받기에는 수치지형도(도엽) · 위성 사진 · 연도별 높이 자료가 들어 있음. 위성 사진을 못 받아도 받기가 멈추지 않음. 위성이 없으면 어두운 바탕에 지점과 노선만 보임.
+- 지형 받기와 분석은 서버 뒤에서 도는 일이라, 화면을 닫았다 다시 열어도 도는 중이면 이어서 진행률을 보여 줌.
+- 산림청이 아닌 계정에는 [범위 밖 — 더 받기]가 보이지 않음.
+
+> 참고: [기준 지정](D02/00_설명서)에서 [>]로 넘어오면 지형 받기가 이미 시작되어 있을 수 있음.
diff --git a/A05_EduDetail/guide/D03/02_연도별_노선_고르기.md b/A05_EduDetail/guide/D03/02_연도별_노선_고르기.md
new file mode 100644
index 000000000..01779f8a0
--- /dev/null
+++ b/A05_EduDetail/guide/D03/02_연도별_노선_고르기.md
@@ -0,0 +1,41 @@
+# 연도별 노선 고르기
+
+연도마다 찾은 후보 넷 가운데 하나를 골라 예정노선으로 삼는 카드.
+
+## 여는 길
+
+- 노선 분석 화면 왼쪽 「연도별 노선」 카드. [분석]을 한 뒤 후보가 채워짐.
+
+
+
+그림 번호 — 1 연도 제목 줄 · 2 고른 후보(테두리가 진함) · 3 고르지 않은 후보
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 연도 제목 줄에서 그 연도 구간의 시작 · 끝 측점과 연장을 확인함. |
+| 2 | 후보 카드 넷의 연장 · 최대 기울기 · 위반 개수를 견줌. |
+| 3 | 쓸 후보 카드를 누름. 눌린 카드가 강조되고 평면의 노선과 누가 숫자가 바로 바뀜. |
+| 4 | 연도마다 같은 방법으로 고름. |
+
+
+
+그림 번호 — 1 2028년 제목 줄(구간 길이가 바뀜) · 2 새로 고른 「기울기 최소」 · 3 바뀐 평면 노선
+
+## 보이는 것
+
+| 후보 | 고르는 기준 |
+| --- | --- |
+| 영선 | 목표 기울기로 등고선을 비스듬히 건너가는 일정한 기울기 선 |
+| 토공 최소 | 절토 + 성토 + 반입 + 사토 물량이 가장 적은 길 |
+| 기울기 최소 | 최대 종단 기울기가 가장 작은 길 |
+| 비중 계산 | 예상 · 토공 · 기울기 비용을 섞어 한 번 찾은 길 |
+
+- 카드 글 = 「연장 · 최대 기울기(%) · 위반 개수」. 위반 = 기울기 기준을 지키지 못한 곳의 수.
+- 제목 줄 = 「연도 · 시작 측점 ~ 끝 측점 (연장 m)」. 분석 전에는 「분석 전 — [분석]을 누르세요」가 보임.
+- 「노선 없음」으로 회색인 카드 = 그 후보는 길을 찾지 못함. 누를 수 없고 마우스를 올리면 까닭이 보임.
+- 고르지 않고 두면 영선 → 토공 최소 → 기울기 최소 → 비중 계산 차례로 처음 성공한 후보가 자동으로 잡힘.
+- 모든 연도에 노선이 생기면 목록 끝에 「끝 … · 목표 … · 차이 …」 줄이 붙음. 등록 때 종료 누가거리를 넣었을 때만 나옴. [노선 누가거리](D01/05_누가거리) 참고.
+
+> 주의: 고름은 [저장]을 누르기 전까지 이 브라우저 탭에만 남음. 탭을 닫으면 사라짐.
diff --git a/A05_EduDetail/guide/D03/03_평면_지도_읽기.md b/A05_EduDetail/guide/D03/03_평면_지도_읽기.md
new file mode 100644
index 000000000..cf5b29ea9
--- /dev/null
+++ b/A05_EduDetail/guide/D03/03_평면_지도_읽기.md
@@ -0,0 +1,37 @@
+# 평면 지도 읽기
+
+위성 사진 위에 지점 · 노선 · 측점을 겹쳐 보여 주는 가운데 지도. 지점을 끌어 옮길 수도 있음.
+
+## 여는 길
+
+- 노선 분석 화면의 가운데 위쪽 큰 지도.
+
+
+
+그림 번호 — 1 평면 지도(2028년 20+0 측점을 누른 모습)
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 굵은 선(주황)으로 연도별로 고른 후보를 이은 예정노선을 확인함. |
+| 2 | 선 위 눈금 글(0+0 · 5+0 · 10+0 …)로 측점(20 m 간격)을 읽음. |
+| 3 | 지점이 마음에 안 들면 지점(원)을 마우스 왼쪽 단추로 누른 채 끌어 옮김. |
+| 4 | 옮긴 뒤 [분석]을 다시 눌러 새 지점으로 노선을 찾음. |
+| 5 | 지도 바탕을 끌어 옮기고 휠로 확대 · 축소함. |
+
+## 보이는 것
+
+- **지점(원)의 색** — 초록 = 첫 지점(시점) · 빨강 = 마지막 지점(종점) · 파랑 = 연도가 바뀌는 중간 지점.
+- **선** — 굵은 선 = 고른 후보. 흰 점선(옅음) = 고르지 않은 다른 후보. 분석 전에는 지점끼리 잇는 점선만 보임.
+- **등고선** = 도엽(수치지형도) 등고선. 노란 선과 노란 숫자(높이). 확대하면 더 촘촘히 보임.
+- 누른 측점은 보라색 고리로 표시됨.
+- **누가** = 측점 번호. 앞 연도 끝 = 다음 연도 시작으로 이어서 셈. 시작 값은 등록 때 정한 노선 시작 누가거리.
+- 끌기를 마치면 그 지점 앞 · 뒤 연도의 분석 결과가 비워지고 횡단 판에 「지점을 옮겼습니다 — [분석] 뒤 측점을 누르세요.」가 나옴.
+- 끝점은 이웃 연도의 시작점과 한 점으로 묶여 있어 함께 움직임.
+- 손이 조금 떨리는 정도(몇 픽셀)의 움직임은 끌기로 치지 않고 단순 누름으로 처리함.
+- 산림청이 아닌 계정은 지점을 끌 수 없음. 보기만 가능.
+
+> 주의: 옮긴 위치는 [저장] 전까지 이 브라우저 탭에만 임시로 남음(새로 고침해도 유지, 탭을 닫으면 사라짐). [저장]을 눌러야 정본이 바뀜.
+
+> 참고: 평면에는 노견 · 절토 · 성토선 · 종단도 · 배수유역 · 구조물이 없음. 지반 · 노선 중심선 · 측점만 보임.
diff --git a/A05_EduDetail/guide/D03/04_측점_횡단.md b/A05_EduDetail/guide/D03/04_측점_횡단.md
new file mode 100644
index 000000000..d12155019
--- /dev/null
+++ b/A05_EduDetail/guide/D03/04_측점_횡단.md
@@ -0,0 +1,34 @@
+# 측점 횡단
+
+평면에서 측점을 누르면 그 자리의 지반선 횡단이 아래 판에 그려짐.
+
+## 여는 길
+
+- 노선 분석 화면 아래쪽 「횡단」 판. 평면 지도의 측점 눈금을 누르면 채워짐.
+
+
+
+그림 번호 — 1 제목 줄(연도 · 측점 이름 · 중심 지반고) · 2 지반선 그림
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 평면 지도에서 확인할 측점 눈금(예: 20+0)을 누름. |
+| 2 | 아래 판의 제목 줄에서 연도 · 측점 · 중심 지반고를 읽음. |
+| 3 | 그림에서 좌우 20 m 범위의 지반선을 확인함. |
+| 4 | 판 위쪽 「횡단」 줄을 누르면 판이 접히고, 다시 누르면 펼쳐짐. |
+
+
+
+그림 번호 — 1 「횡단」 줄(접힌 상태)
+
+## 보이는 것
+
+- 제목 줄 = 「연도 · 측점 이름 · 중심 지반고」.
+- 그림 = 노선 중심에서 좌우 20 m 안의 지반. 설계선(노면 · 절토 · 성토)은 없음.
+- 아직 측점을 누르지 않았으면 「평면에서 측점을 누르면 그 자리 지반선 횡단이 보입니다.」가 보임.
+- 노선이 없는 연도의 측점은 누를 수 없음. 지점을 옮긴 뒤에는 다시 [분석]을 해야 함.
+- 이 측점 횡단은 지형 자료의 평활본에서 읽은 값이라 실제 측량 단면과 다를 수 있음.
+
+> 참고: 횡단 판을 접으면 평면 지도가 아래까지 넓어짐.
diff --git a/A05_EduDetail/guide/D03/05_분석_저장_단추.md b/A05_EduDetail/guide/D03/05_분석_저장_단추.md
new file mode 100644
index 000000000..5f281eb19
--- /dev/null
+++ b/A05_EduDetail/guide/D03/05_분석_저장_단추.md
@@ -0,0 +1,38 @@
+# 분석 · 저장 · 3D 단추
+
+왼쪽 패널 맨 아래 단추 줄. 노선 찾기([분석]) · 확정 저장([저장]) · 입체 보기([3D])를 함.
+
+## 여는 길
+
+- 노선 분석 화면 왼쪽 패널 맨 아래.
+
+
+
+그림 번호 — 1 [?] 가이드 · 2 [<] 이전 단계 · 3 [>] 다음 단계 · 4 [분석] · 5 [저장] · 6 [3D]
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | [분석]을 누름. 연도 구간마다 후보 넷을 찾으며 진행률이 「지형」 카드 자리에 보임. |
+| 2 | 입력(지점 · 기준 · 지형)이 이전과 같으면 저장된 결과를 그대로 불러와 바로 끝남. |
+| 3 | [연도별 노선 고르기](D03/02_연도별_노선_고르기)로 연도마다 후보를 고름. |
+| 4 | 모든 연도에 노선이 있으면 [저장]을 누름. |
+| 5 | [3D]로 입체로 확인함. [3D 보기](D03/06_3D_보기) 참고. |
+| 6 | 다음 단계로 가려면 [>]를 누름. |
+
+## 보이는 것
+
+| 단추 | 하는 일 |
+| --- | --- |
+| [분석] | 연도 구간마다 노선 후보 넷을 찾음. 받은 지형 밖에 지점이 있으면 눌 수 없음 |
+| [저장] | 연도별로 고른 후보를 정본으로 저장함. 끌어 옮긴 지점도 이때 함께 저장됨. 어느 연도든 노선이 없으면 눌 수 없고 마우스를 올리면 안내가 보임 |
+| [3D] | 지형과 노선을 입체로 보는 창을 엶. 노선이 하나라도 있어야 눌 수 있음 |
+
+- 저장하면 「예정노선을 저장했습니다.」 알림이 뜸.
+- [저장]은 노선 모양을 화면에서 받지 않고 고른 후보 이름만 서버에 보냄. 서버가 저장된 분석 결과로 노선을 다시 이어 붙여 저장하므로, [분석]을 하지 않으면 「분석 저장본이 없습니다 — [분석]을 먼저 하세요.」로 막힘.
+- 산림청이 아닌 계정에는 [분석] · [저장]이 보이지 않음. 보기만 가능.
+
+> 주의: 저장 중에는 화면 전체가 잠깐 잠김. 끝날 때까지 기다림.
+
+> 참고: [분석]에 쓰는 기준값(기울기 상한 · 최소 곡선 반지름 등)은 등록 때 정한 임도 종류와 설계속도로 자동 정해짐. 이 화면에 칸은 없음. [사용자 확정 전 값](D03/30_사용자_확정_전_값) 참고.
diff --git a/A05_EduDetail/guide/D03/06_3D_보기.md b/A05_EduDetail/guide/D03/06_3D_보기.md
new file mode 100644
index 000000000..2df921eb8
--- /dev/null
+++ b/A05_EduDetail/guide/D03/06_3D_보기.md
@@ -0,0 +1,29 @@
+# 3D 보기
+
+지형과 연도별 노선을 입체로 보는 창.
+
+## 여는 길
+
+- 노선 분석 화면 왼쪽 패널 맨 아래 [3D]. 노선이 하나라도 있어야 눌림.
+
+
+
+그림 번호 — 1 연도 고르는 칸 · 2 3D 화면
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | [3D]를 누름. 「3D 보기 — 지형 + 노선」 창이 열리고 지형을 불러오는 동안 진행 표시가 돎. |
+| 2 | 창 위쪽 연도 칸으로 볼 연도를 바꿈. 한 번에 한 연도씩 보임. |
+| 3 | 마우스로 돌리고 휠로 확대 · 축소해 노선 둘레를 살핌. |
+| 4 | 다 보았으면 창 오른쪽 위 [닫기]를 누름. |
+
+## 보이는 것
+
+- 그 연도의 지형(높이에 따라 색이 달라짐)과 고른 후보의 노선, 측점 막대가 보임. 지형 위의 가는 하늘색 선이 노선.
+- 노견 · 절토 · 성토면 · 구조물은 3D 에도 없음.
+- 평면에서 측점을 눌러 둔 연도가 있으면 그 연도가 먼저 열림.
+- 창을 닫으면 3D 화면에 쓰던 자원이 정리됨.
+
+> 참고: 지형이 노선보다 훨씬 넓게 받아져 있어 노선이 작게 보일 수 있음. 확대해서 볼 것.
diff --git a/A05_EduDetail/guide/D03/20_쓰인_방법과_근거.md b/A05_EduDetail/guide/D03/20_쓰인_방법과_근거.md
index 5f6a760a7..95a08e0e0 100644
--- a/A05_EduDetail/guide/D03/20_쓰인_방법과_근거.md
+++ b/A05_EduDetail/guide/D03/20_쓰인_방법과_근거.md
@@ -1,5 +1,7 @@
# 쓰인 방법과 근거
+
+
## 노선을 찾는 방법
- 연도마다 그 연도의 시점과 종점 두 점 사이를 한 번씩 찾음. 연도 사이의 경계점은 옮기지 않으므로 앞 연도 끝과 다음 연도 시작이 정확히 맞물림.
diff --git a/A05_EduDetail/guide/D03/30_사용자_확정_전_값.md b/A05_EduDetail/guide/D03/30_사용자_확정_전_값.md
index 8933630b4..2afa9b65c 100644
--- a/A05_EduDetail/guide/D03/30_사용자_확정_전_값.md
+++ b/A05_EduDetail/guide/D03/30_사용자_확정_전_값.md
@@ -1,5 +1,9 @@
# 사용자 확정 전 값
+
+
+그림 번호는 [연도별 노선 고르기](D03/02_연도별_노선_고르기)와 같음.
+
아래 값은 코드에 기본값으로 들어 있으나 사용자가 최종 확정한 값이 아님. 바꾸려면 개발 담당에게 요청.
| 값 | 지금 기본값 | 출처 | 상태 |
diff --git a/A05_EduDetail/guide/D03/D03_00_overview.webp b/A05_EduDetail/guide/D03/D03_00_overview.webp
new file mode 100644
index 000000000..bfaad2480
Binary files /dev/null and b/A05_EduDetail/guide/D03/D03_00_overview.webp differ
diff --git a/A05_EduDetail/guide/D03/D03_01_terrain_card.webp b/A05_EduDetail/guide/D03/D03_01_terrain_card.webp
new file mode 100644
index 000000000..caacd69c6
Binary files /dev/null and b/A05_EduDetail/guide/D03/D03_01_terrain_card.webp differ
diff --git a/A05_EduDetail/guide/D03/D03_02_year_cards.webp b/A05_EduDetail/guide/D03/D03_02_year_cards.webp
new file mode 100644
index 000000000..68b86a1f9
Binary files /dev/null and b/A05_EduDetail/guide/D03/D03_02_year_cards.webp differ
diff --git a/A05_EduDetail/guide/D03/D03_03_pick_mode.webp b/A05_EduDetail/guide/D03/D03_03_pick_mode.webp
new file mode 100644
index 000000000..e39d4154d
Binary files /dev/null and b/A05_EduDetail/guide/D03/D03_03_pick_mode.webp differ
diff --git a/A05_EduDetail/guide/D03/D03_04_plan_map.webp b/A05_EduDetail/guide/D03/D03_04_plan_map.webp
new file mode 100644
index 000000000..0d0b2d4ce
Binary files /dev/null and b/A05_EduDetail/guide/D03/D03_04_plan_map.webp differ
diff --git a/A05_EduDetail/guide/D03/D03_05_station_cross.webp b/A05_EduDetail/guide/D03/D03_05_station_cross.webp
new file mode 100644
index 000000000..4b1373eb4
Binary files /dev/null and b/A05_EduDetail/guide/D03/D03_05_station_cross.webp differ
diff --git a/A05_EduDetail/guide/D03/D03_06_cross_fold.webp b/A05_EduDetail/guide/D03/D03_06_cross_fold.webp
new file mode 100644
index 000000000..7c30de39f
Binary files /dev/null and b/A05_EduDetail/guide/D03/D03_06_cross_fold.webp differ
diff --git a/A05_EduDetail/guide/D03/D03_07_buttons.webp b/A05_EduDetail/guide/D03/D03_07_buttons.webp
new file mode 100644
index 000000000..c94cfd0b9
Binary files /dev/null and b/A05_EduDetail/guide/D03/D03_07_buttons.webp differ
diff --git a/A05_EduDetail/guide/D03/D03_08_3d_modal.webp b/A05_EduDetail/guide/D03/D03_08_3d_modal.webp
new file mode 100644
index 000000000..e2a218683
Binary files /dev/null and b/A05_EduDetail/guide/D03/D03_08_3d_modal.webp differ
diff --git a/A05_EduDetail/guide/D03/_scenes.json b/A05_EduDetail/guide/D03/_scenes.json
new file mode 100644
index 000000000..9eccfb985
--- /dev/null
+++ b/A05_EduDetail/guide/D03/_scenes.json
@@ -0,0 +1,11 @@
+[
+ {"name":"D03_00_overview","route":"#/d03-plan-analysis","project":"plan","viewport":[1600,1250],"before":[{"wait":".d03-plan__map canvas"},{"wait":".d03-plan__mode"},{"wait_ms":4000},{"eval":"window.__d03Plan.pick(400)"},{"wait":".d03-plan__cross-body svg"},{"wait_ms":600}],"settle_ms":2000,"clip":null,"callouts":[{"n":1,"sel":".d03-plan__map","pos":"tr"},{"n":2,"sel":".d03-plan__cross","pos":"tr"},{"n":3,"sel":".d03-plan__hint"},{"n":4,"sel":".d03-plan__years"},{"n":5,"sel":".ui-sidebar-actions","pos":"tr"}]},
+ {"name":"D03_01_terrain_card","route":"#/d03-plan-analysis","project":"plan","viewport":[1600,1250],"before":[{"wait":".d03-plan__map canvas"},{"wait":".d03-plan__mode"},{"wait_ms":4000}],"settle_ms":2000,"clip":".ui-sidebar-scroll > .ui-sidebar-card:nth-child(1)","callouts":[{"n":1,"sel":".d03-plan__hint"}]},
+ {"name":"D03_02_year_cards","route":"#/d03-plan-analysis","project":"plan","viewport":[1600,1250],"before":[{"wait":".d03-plan__map canvas"},{"wait":".d03-plan__mode"},{"wait_ms":4000}],"settle_ms":2000,"clip":".ui-sidebar-scroll > .ui-sidebar-card:nth-child(2)","callouts":[{"n":1,"sel":".d03-plan__year-head"},{"n":2,"sel":".d03-plan__mode.is-picked","pos":"tr"},{"n":3,"sel":".d03-plan__mode:not(.is-picked)","pos":"tr"}]},
+ {"name":"D03_03_pick_mode","route":"#/d03-plan-analysis","project":"plan","viewport":[1600,1250],"before":[{"wait":".d03-plan__map canvas"},{"wait":".d03-plan__mode"},{"wait_ms":4000},{"click":".d03-plan__year[data-year=\"2028\"] .d03-plan__mode[data-mode=\"gentle\"]"},{"wait":".d03-plan__year[data-year=\"2028\"] .d03-plan__mode[data-mode=\"gentle\"].is-picked"},{"wait_ms":800}],"settle_ms":2000,"clip":null,"callouts":[{"n":1,"sel":".d03-plan__year[data-year=\"2028\"] .d03-plan__year-head"},{"n":2,"sel":".d03-plan__year[data-year=\"2028\"] .d03-plan__mode.is-picked","pos":"tr"},{"n":3,"sel":".d03-plan__map","pos":"tr"}]},
+ {"name":"D03_04_plan_map","route":"#/d03-plan-analysis","project":"plan","viewport":[1600,1250],"before":[{"wait":".d03-plan__map canvas"},{"wait":".d03-plan__mode"},{"wait_ms":4000},{"eval":"window.__d03Plan.pick(400)"},{"wait":".d03-plan__cross-body svg"},{"wait_ms":600}],"settle_ms":2000,"clip":".d03-plan__map","callouts":[{"n":1,"sel":".d03-plan__map","pos":"tr"}]},
+ {"name":"D03_05_station_cross","route":"#/d03-plan-analysis","project":"plan","viewport":[1600,1250],"before":[{"wait":".d03-plan__map canvas"},{"wait":".d03-plan__mode"},{"wait_ms":4000},{"eval":"window.__d03Plan.pick(400)"},{"wait":".d03-plan__cross-body svg"},{"wait_ms":600}],"settle_ms":2000,"clip":".d03-plan__cross","callouts":[{"n":1,"sel":".d03-plan__cross-head"},{"n":2,"sel":".d03-plan__cross-body"}]},
+ {"name":"D03_06_cross_fold","route":"#/d03-plan-analysis","project":"plan","viewport":[1600,900],"before":[{"wait":".d03-plan__map canvas"},{"wait":".d03-plan__mode"},{"wait_ms":4000},{"eval":"window.__d03Plan.pick(400)"},{"wait":".d03-plan__cross-body svg"},{"wait_ms":600},{"click":".d03-plan__cross .ui-workflow-overlay__handle"},{"wait_ms":800}],"settle_ms":2000,"clip":null,"callouts":[{"n":1,"sel":".d03-plan__cross .ui-workflow-overlay__handle","pos":"tr"}]},
+ {"name":"D03_07_buttons","route":"#/d03-plan-analysis","project":"plan","viewport":[1600,1250],"before":[{"wait":".d03-plan__map canvas"},{"wait":".d03-plan__mode"},{"wait_ms":4000}],"settle_ms":2000,"clip":".ui-sidebar-actions","callouts":[{"n":1,"sel":".ui-sidebar-actions > button:nth-child(1)"},{"n":2,"sel":".ui-sidebar-actions > button:nth-child(2)"},{"n":3,"sel":".ui-sidebar-actions > button:nth-child(3)"},{"n":4,"sel":".ui-sidebar-actions > button:nth-child(4)"},{"n":5,"sel":".ui-sidebar-actions > button:nth-child(5)"},{"n":6,"sel":".ui-sidebar-actions > button:nth-child(6)"}]},
+ {"name":"D03_08_3d_modal","route":"#/d03-plan-analysis","project":"plan","viewport":[1600,1250],"before":[{"wait":".d03-plan__map canvas"},{"wait":".d03-plan__mode"},{"wait_ms":4000},{"click":".ui-sidebar-actions > button:nth-child(6)"},{"wait":".b05-route__3d-modal"},{"wait_ms":9000}],"settle_ms":2000,"clip":null,"callouts":[{"n":1,"sel":".d03-plan__3d-year"},{"n":2,"sel":".b05-route__3d-body","pos":"tr"}]}
+]
diff --git a/A05_EduDetail/guide/D04/00_설명서.md b/A05_EduDetail/guide/D04/00_설명서.md
index 8127e7330..9b9d5fe30 100644
--- a/A05_EduDetail/guide/D04/00_설명서.md
+++ b/A05_EduDetail/guide/D04/00_설명서.md
@@ -1,81 +1,31 @@
-# 예정노선 확정 · 업체 · 내보내기 설명서
+# 확정 · 내보내기
-## 이 화면에서 하는 일
+예정노선 3단계. 분석에서 저장한 연도별 노선을 확인하고, 연도마다 일을 맡길 업체를 지정한 뒤 확정하고 내보내는 화면.
-- 2단계(분석)에서 저장한 연도별 노선을 한눈에 확인함(연장 · 시점 · 종점 · 누가 · 확정 여부).
-- 연도마다 일을 맡길 업체를 지정함. 아이슬로에 등록된 회사를 고르거나, 업체명과 메일 주소를 직접 적는 수기 지정 중 선택. 한 연도에 업체 여럿 지정 가능.
-- [확정] 으로 연도 노선을 확정하고, 지정 업체에 노선 파일이 든 압축 파일(zip)을 메일로 보냄.
-- [내보내기] 로 노선 파일 묶음을 내려받음.
-- 업체 쪽에서는 받은 예정노선을 자기 임도 프로젝트로 연결해 설계를 이어 감(아래 「받은 업체의 임도 연결」 참고).
+## 여는 길
-## 화면 구성
+- [노선 분석](D03/00_설명서) 화면에서 [저장]을 한 뒤 [>]를 누르면 열림.
+- 대시보드 프로젝트 표의 단계 막대 「확정 · 내보내기」를 누르거나, ☰ 에서 「확정 · 내보내기」를 골라도 열림.
+- 지정받은 다른 회사는 대시보드 「받은 예정노선」 구역의 [보기]로 이 화면을 보기만 가능한 상태로 엶. [받은 업체의 임도 연결](D04/06_받은_업체_연결) 참고.
-- 가운데 = 연도 표. 프로젝트 이름이 위에 크게 나오고, 표 열은 연도 · 연장(m) · 시점(위도, 경도) · 종점(위도, 경도) · 누가(m) · 확정 · 지정 업체.
-- 왼쪽 위 = 「확정할 연도」 카드. 분석 [저장] 이 된 연도마다 선택 상자가 있음. 아직 확정하지 않은 연도는 처음부터 선택되어 있음.
-- 왼쪽 아래 = 단추 [내보내기] [확정] [저장].
+
+
+## 화면 구역
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 연도 표 | 연도마다 연장 · 시점 · 종점 · 누가 · 확정 시각 · 지정 업체를 한 줄로 보여 줌. 업체를 여기서 추가 · 삭제함 |
+| 2 | 「확정할 연도」 카드 | 확정할 연도를 고름. 분석 [저장]이 된 연도만 나옴 |
+| 3 | 단추 줄 | [?] · [<] · [>] · [내보내기] · [확정] · [저장] |
## 작업 순서
-1. 연도 표에서 연도마다 연장과 누가를 확인함. 분석을 저장하지 않은 연도는 누가 칸에 「노선 분석 [저장] 전」 이 나오며, 확정할 연도 목록에도 나타나지 않음.
-2. 지정 업체 칸에서 업체를 추가함.
- - 등록 회사: 「업체(등록 회사 찾기 또는 이름)」 칸에 글자를 입력하면 가입된 회사 이름이 목록으로 뜸. 목록에서 고르면 등록 회사로 지정됨. 메일 칸을 비우면 그 회사의 대표 메일이 쓰임.
- - 수기 지정: 업체명과 메일 주소(@ 포함)를 둘 다 적음. 없으면 「등록 회사가 아니면 업체명과 메일이 필요합니다.」 안내가 나오고 추가되지 않음.
- - [추가] 를 누르면 그 연도 칸에 업체 이름 + 메일이 표시됨. 같은 업체를 두 번 넣어도 한 번만 들어감.
- - 잘못 넣은 업체는 업체 옆 [×] 로 뺌.
-3. [저장] 을 누르면 지정 업체가 서버에 저장됨(「지정 업체를 저장했습니다.」). 저장 전에는 표 위에 「저장 안 된 변경이 있습니다.」 가 표시됨.
-4. 「확정할 연도」 에서 확정할 연도를 고르고 [확정] 을 누름. 확인 창(「고른 연도를 확정하고 지정 업체에 노선 묶음을 메일로 보냅니다. 진행할까요?」)에서 진행을 누르면 확정과 메일 발송이 이뤄짐. 저장하지 않은 업체 변경이 있으면 자동으로 먼저 저장됨.
-5. 필요하면 [내보내기] 로 파일을 내려받아 보관함.
+1. 연도 표에서 연도마다 연장과 누가를 확인함. [연도 표](D04/01_연도_표) 참고.
+2. 지정 업체 칸에서 업체를 추가함. 등록 회사는 이름을 찾아 고르고, 아니면 업체명과 메일을 직접 적음. [지정 업체](D04/02_지정_업체) · [업체 직접 추가](D04/03_업체_직접_추가) 참고.
+3. [저장]을 눌러 지정 업체를 서버에 저장함. [단추와 확정할 연도](D04/04_단추와_확정할_연도) 참고.
+4. 「확정할 연도」에서 확정할 연도를 고르고 [확정]을 누름. 확인 창에서 진행을 누르면 확정과 메일 발송이 이뤄짐. [확정과 메일](D04/05_확정과_메일) 참고.
+5. 필요하면 [내보내기]로 노선 파일 묶음을 내려받아 보관함. 파일 구성은 [내보내기 파일 구성](D04/10_내보내기_파일_구성) 참고.
-## 단추
+> 주의: [저장] · [확정]은 산림청 소속 사용자만 할 수 있음. 그 밖의 사용자가 누르면 「산림청만 예정노선을 확정 · 지정할 수 있습니다.」 안내가 나옴.
-| 단추 | 하는 일 |
-| --- | --- |
-| 내보내기 | 「프로젝트이름_예정노선.zip」 을 내려받음. 산림청은 모든 연도와 전체 노선을 받음. 지정받은 회사는 확정된 자기 연도만 받음 |
-| 확정 | 고른 연도를 확정 처리하고 지정 업체에 메일을 보냄. 고른 연도가 없으면 「확정할 연도를 고르세요.」 안내 |
-| 저장 | 연도별 지정 업체 목록을 서버에 저장함 |
-
-- 업체 추가와 삭제는 [저장] 을 누르기 전까지 이 브라우저 탭에만 임시로 남음. 탭을 닫으면 사라지므로 [저장] 을 누를 것.
-- [저장] [확정] 은 산림청 소속 사용자만 가능. 그 밖의 사용자가 누르면 「산림청만 예정노선을 확정 · 지정할 수 있습니다.」 안내가 나옴.
-
-## 결과 읽는 법
-
-- **확정 열** = 확정한 날짜와 시각(한국 시간). 비어 있으면 아직 확정 전.
-- **지정 업체 열의 표시**
- - 「Aislo」 = 아이슬로 등록 회사로 지정된 업체.
- - 「메일 보냄」 = 확정 때 메일이 나갔다는 표시. 같은 업체에는 다시 확정해도 중복 발송하지 않음.
- - 「연결됨」 = 그 업체가 이 연도 노선을 자기 임도 프로젝트로 가져가 연결했다는 표시.
-- **[확정] 후 안내 문구** = 「확정 — 메일 sent 2 · already_sent 1」 꼴로 업체별 처리 결과를 개수로 보여 줌.
-
-| 결과 이름 | 뜻 |
-| --- | --- |
-| sent | 메일 발송 성공 |
-| already_sent | 이미 보낸 업체여서 다시 보내지 않음 |
-| no_email | 메일 주소가 없어 보내지 못함(등록 회사의 대표 메일이 비어 있는 경우 등) |
-| failed | 메일 발송 실패 |
-
-## 보내지는 메일
-
-- 제목: 「[예정노선 확정] 프로젝트이름 N년」.
-- 본문: 프로젝트 · 사업 지역 · 연도 · 연장(km 와 m) 요약과 첨부 파일 목록, 압축을 풀면 노선 입력에 바로 올릴 수 있다는 안내 문구.
-- 첨부: 그 업체의 연도 한 해 분량 zip 1개(파일 이름 「프로젝트이름_예정노선_연도.zip」). 내용은 「10_내보내기_파일_구성」 참고.
-
-## 받은 업체의 임도 연결
-
-- 지정받은 등록 회사는 대시보드의 「받은 예정노선」 구역에서 확정된 연도를 봄. 열은 예정노선 · 연도 · 확정 · 연결 상태(연결됨 / 미연결 / 업데이트 있음) · 작업.
-- [보기] = 예정노선 화면을 보기만 가능한 상태로 엶.
-- [연결] = 모달에서 두 가지 중 선택.
- - 「새 임도 프로젝트로」: 예정노선 이름 + 연도로 임도 프로젝트를 새로 만들고 노선 입력 단계(B03)로 이동. 예정노선의 설계속도(20 · 30 · 40 km/h)가 새 프로젝트의 설계속도 기본값으로 들어감.
- - 「기존 프로젝트에 연결」: 우리 회사의 임도 프로젝트를 골라 그 프로젝트에 연결. 임도 프로젝트가 없으면 「우리 회사 임도 프로젝트가 없습니다.」 표시.
-- 연결하면 그 연도 노선(shapefile 한 벌)이 노선 입력 단계의 입력 파일로 들어감. 파일을 직접 올린 것과 같은 길이라 이후 처리도 같음. 지형 자료는 업체가 따로 올려야 함.
-- 이미 분석 결과가 있는 임도 프로젝트에 연결하면 기존 결과를 지워도 되는지 묻는 확인 창이 먼저 나옴. 취소하면 아무것도 바뀌지 않음.
-- 임도 프로젝트 노선 입력 화면의 [예정노선에서 가져오기] 단추로도 같은 일을 할 수 있음. 지정받은 연도를 고르면 노선이 입력됨.
-- 연결 시점의 노선이 복사되므로, 산림청이 뒤에 노선을 바꿔도 임도 프로젝트는 자동으로 바뀌지 않음. 대신 「업데이트 있음」 표시가 뜨며, 노선 입력 화면 위쪽 띠에서 [다시 가져오기] 로 직접 반영 여부를 결정함.
-- 한 임도 프로젝트는 한 연도에만 연결됨. 다른 연도로 다시 연결하면 앞의 연결은 풀림.
-
-## 알아 둘 것
-
-- 확정 시각은 [확정] 을 누를 때마다 새로 기록됨. 이미 메일을 보낸 업체에는 다시 보내지 않음(다시 보내는 단추는 화면에 없음).
-- 확정은 분석 [저장] 이 된 연도만 가능. 저장하지 않은 연도를 억지로 확정하려 하면 「분석 [저장]이 안 된 연도입니다」 오류가 나옴.
-- [저장] 은 표에 있는 모든 연도의 지정 업체를 화면 내용대로 맞춤. 업체를 모두 뺀 연도는 지정이 비워짐.
-- 같은 업체 판정: 등록 회사는 회사 번호, 수기 업체는 메일 주소(대소문자 구분 없음).
-- 내보내기는 서버에 저장된 노선만 사용함. 2단계에서 [저장] 하지 않은 변경은 반영되지 않음.
+> 참고: 업체 쪽에서는 받은 예정노선을 자기 임도 프로젝트로 연결해 설계를 이어 감. [받은 업체의 임도 연결](D04/06_받은_업체_연결) 참고.
diff --git a/A05_EduDetail/guide/D04/01_연도_표.md b/A05_EduDetail/guide/D04/01_연도_표.md
new file mode 100644
index 000000000..d58975f1d
--- /dev/null
+++ b/A05_EduDetail/guide/D04/01_연도_표.md
@@ -0,0 +1,29 @@
+# 연도 표
+
+분석에서 저장한 연도별 노선을 한눈에 확인하는 표.
+
+## 여는 길
+
+- 확정 · 내보내기 화면 가운데의 큰 표. 위에 프로젝트 이름이 크게 나옴.
+
+
+
+그림 번호 — 1 연장(m) · 2 시점(위도, 경도) · 3 누가(m) · 4 확정 시각 · 5 지정 업체
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 연도 열과 연장(m)으로 연도별 노선 길이를 확인함. |
+| 2 | 시점 · 종점(위도, 경도)으로 노선 양 끝 위치를 확인함. |
+| 3 | 누가(m) 열로 그 연도 노선이 전체 노선의 어디부터 어디까지인지 확인함. |
+| 4 | 확정 열이 비어 있으면 아직 확정 전. 날짜와 시각이 있으면 확정이 끝난 연도. |
+| 5 | 지정 업체 열은 [지정 업체](D04/02_지정_업체) 참고. |
+
+## 보이는 것
+
+- 분석을 저장하지 않은 연도는 누가 칸에 「노선 분석 [저장] 전」이 나옴. 「확정할 연도」 목록에도 나타나지 않음.
+- 확정 열 = 확정한 날짜와 시각(한국 시간). 비어 있으면 아직 확정 전.
+- 시점 · 종점은 위도 · 경도 순서로 소수 6 자리까지 보임.
+
+> 참고: 연장이 서로 다르게 보이면 [노선 분석](D03/00_설명서)에서 후보를 다시 고르고 [저장]한 뒤 돌아옴.
diff --git a/A05_EduDetail/guide/D04/02_지정_업체.md b/A05_EduDetail/guide/D04/02_지정_업체.md
new file mode 100644
index 000000000..1359641f0
--- /dev/null
+++ b/A05_EduDetail/guide/D04/02_지정_업체.md
@@ -0,0 +1,31 @@
+# 지정 업체
+
+연도마다 일을 맡길 업체를 지정하는 열.
+
+## 여는 길
+
+- 연도 표의 맨 오른쪽 「지정 업체」 열. 연도 한 줄마다 업체 목록과 추가 칸이 있음.
+
+
+
+그림 번호 — 1 지정된 업체 한 건 · 2 표시 딱지(Aislo) · 3 [×] 빼기 단추 · 4 업체 추가 칸
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 연도 줄의 지정 업체 목록에서 이미 지정된 업체를 확인함. 한 연도에 업체 여럿을 지정할 수 있음. |
+| 2 | 업체를 더하려면 아래 추가 칸을 씀. [업체 직접 추가](D04/03_업체_직접_추가) 참고. |
+| 3 | 잘못 넣은 업체는 업체 옆 [×]로 뺌. |
+| 4 | 다 끝나면 왼쪽 아래 [저장]을 눌러 서버에 남김. |
+
+## 보이는 것
+
+- 업체 한 건 = 「업체명 · 메일」 글 + 딱지.
+- 딱지 「Aislo」 = 아이슬로에 등록된 회사로 지정된 업체.
+- 딱지 「메일 보냄」 = 확정 때 메일이 나갔다는 표시. 같은 업체에는 다시 확정해도 중복 발송하지 않음.
+- 딱지 「연결됨」 = 그 업체가 이 연도 노선을 자기 임도 프로젝트로 가져가 연결했다는 표시.
+- 같은 업체 판정: 등록 회사는 회사 번호, 직접 적은 업체는 메일 주소(대소문자 구분 없음). 같은 업체를 두 번 넣어도 한 번만 들어감.
+- 산림청이 아닌 계정은 추가 칸과 [×]가 보이지 않음. 보기만 가능.
+
+> 참고: 이 그림의 업체명과 메일은 가이드용 견본임.
diff --git a/A05_EduDetail/guide/D04/03_업체_직접_추가.md b/A05_EduDetail/guide/D04/03_업체_직접_추가.md
new file mode 100644
index 000000000..51fd72ee7
--- /dev/null
+++ b/A05_EduDetail/guide/D04/03_업체_직접_추가.md
@@ -0,0 +1,34 @@
+# 업체 직접 추가
+
+등록 회사를 찾아 고르거나, 업체명과 메일을 직접 적어 지정 업체로 더하는 방법.
+
+## 여는 길
+
+- 연도 표 「지정 업체」 열의 추가 칸(업체 칸 · 메일 칸 · [추가]).
+
+
+
+그림 번호 — 1 업체 칸 · 2 메일 칸 · 3 [추가] 단추
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 등록 회사로 지정하려면 업체 칸에 회사 이름 글자를 넣음. 가입된 회사 이름이 목록으로 뜨면 하나를 고름. |
+| 2 | 메일 칸을 비우면 그 회사의 대표 메일이 쓰임. 다른 메일로 받으려면 메일 칸에 적음. |
+| 3 | 등록 회사가 아니면(수기 지정) 업체 칸에 업체명, 메일 칸에 메일(@ 포함)을 둘 다 적음. |
+| 4 | [추가]를 누름. 그 연도 칸에 업체 이름 + 메일이 표시됨. |
+
+
+
+그림 번호 — 1 「저장 안 된 변경이 있습니다.」 안내 · 2 추가된 업체
+
+## 보이는 것
+
+- 추가하면 표 위에 「저장 안 된 변경이 있습니다.」가 나옴. 왼쪽 아래 [저장]을 누르면 사라짐.
+- 수기 지정에서 업체명이나 메일이 비면 「등록 회사가 아니면 업체명과 메일이 필요합니다.」 안내가 나오고 추가되지 않음.
+- 업체 추가와 삭제는 [저장]을 누르기 전까지 이 브라우저 탭에만 임시로 남음. 탭을 닫으면 사라짐.
+
+> 주의: [저장]은 표에 있는 모든 연도의 지정 업체를 화면 내용대로 맞춤. 업체를 모두 뺀 연도는 지정이 비워짐.
+
+> 참고: 이 그림의 업체명과 메일은 가이드용 견본임.
diff --git a/A05_EduDetail/guide/D04/04_단추와_확정할_연도.md b/A05_EduDetail/guide/D04/04_단추와_확정할_연도.md
new file mode 100644
index 000000000..0599b74fa
--- /dev/null
+++ b/A05_EduDetail/guide/D04/04_단추와_확정할_연도.md
@@ -0,0 +1,38 @@
+# 단추와 확정할 연도
+
+왼쪽 패널의 「확정할 연도」 카드와 아래 단추 줄.
+
+## 여는 길
+
+- 확정 · 내보내기 화면 왼쪽 패널.
+
+
+
+그림 번호 — 1 확정할 연도 목록(선택 상자)
+
+
+
+그림 번호 — 1 [?] 가이드 · 2 [<] 이전 단계 · 3 [>] 다음 단계(마지막 단계라 흐림) · 4 [내보내기] · 5 [확정] · 6 [저장]
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 「확정할 연도」에서 확정할 연도의 선택 상자를 켬. 아직 확정하지 않은 연도는 처음부터 켜져 있음. |
+| 2 | 지정 업체를 바꿨으면 [저장]을 눌러 서버에 남김. 「지정 업체를 저장했습니다.」 알림이 뜸. |
+| 3 | [확정]은 [확정과 메일](D04/05_확정과_메일) 참고. |
+| 4 | 노선 파일이 필요하면 [내보내기]를 누름. |
+
+## 보이는 것
+
+| 단추 | 하는 일 |
+| --- | --- |
+| [내보내기] | 「프로젝트이름_예정노선.zip」을 내려받음. 산림청은 모든 연도와 전체 노선을 받음. 지정받은 회사는 확정된 자기 연도만 받음 |
+| [확정] | 고른 연도를 확정하고 지정 업체에 메일을 보냄. 고른 연도가 없으면 「확정할 연도를 고르세요.」 안내 |
+| [저장] | 연도별 지정 업체 목록을 서버에 저장함 |
+
+- 분석 [저장]이 된 연도만 목록에 나옴.
+- 산림청이 아닌 계정은 「확정할 연도」 카드와 [확정] · [저장]이 보이지 않고 [내보내기]만 있음.
+- 내보내기는 서버에 저장된 노선만 사용함. [노선 분석](D03/00_설명서)에서 [저장]하지 않은 변경은 반영되지 않음.
+
+> 참고: 파일 안의 구성은 [내보내기 파일 구성](D04/10_내보내기_파일_구성) 참고.
diff --git a/A05_EduDetail/guide/D04/05_확정과_메일.md b/A05_EduDetail/guide/D04/05_확정과_메일.md
new file mode 100644
index 000000000..cc9546b01
--- /dev/null
+++ b/A05_EduDetail/guide/D04/05_확정과_메일.md
@@ -0,0 +1,39 @@
+# 확정과 메일
+
+고른 연도를 확정하고 지정 업체에 노선 파일을 메일로 보내는 과정.
+
+## 여는 길
+
+- 확정 · 내보내기 화면 왼쪽 아래 [확정].
+
+
+
+그림 번호 — 1 확인 문구 · 2 [취소] · 3 [확정]
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 지정 업체를 모두 넣고 [저장]을 눌러 둠. 저장하지 않은 변경이 있으면 [확정] 때 먼저 저장됨. |
+| 2 | 「확정할 연도」에서 연도를 고름. |
+| 3 | [확정]을 누르면 확인 창이 열림. 「고른 연도를 확정하고 지정 업체에 노선 묶음을 메일로 보냅니다. 진행할까요?」 |
+| 4 | 진행하려면 창의 [확정]을 누름. 그만두려면 [취소]를 누름. |
+| 5 | 끝나면 「확정 — 메일 sent 2 · already_sent 1」 꼴로 업체별 처리 결과가 개수로 나옴. |
+
+## 보이는 것
+
+| 결과 이름 | 뜻 |
+| --- | --- |
+| sent | 메일 발송 성공 |
+| already_sent | 이미 보낸 업체여서 다시 보내지 않음 |
+| no_email | 메일 주소가 없어 보내지 못함(등록 회사의 대표 메일이 비어 있는 경우 등) |
+| failed | 메일 발송 실패 |
+
+- 확정하면 연도 표의 확정 열에 날짜와 시각이 찍히고, 지정 업체에 「메일 보냄」 딱지가 붙음.
+- 보내지는 메일의 제목은 「[예정노선 확정] 프로젝트이름 N년」.
+- 본문에는 프로젝트 · 사업 지역 · 연도 · 연장(km 와 m) 요약과 첨부 파일 목록, 압축을 풀면 노선 입력에 바로 올릴 수 있다는 안내가 있음.
+- 첨부 = 그 업체의 연도 한 해 분량 zip 1개(파일 이름 「프로젝트이름_예정노선_연도.zip」). 내용은 [내보내기 파일 구성](D04/10_내보내기_파일_구성) 참고.
+
+> 주의: 확정은 분석 [저장]이 된 연도만 가능함. 저장하지 않은 연도를 억지로 확정하려 하면 「분석 [저장]이 안 된 연도입니다」 오류가 나옴.
+
+> 주의: 확정 시각은 [확정]을 누를 때마다 새로 기록됨. 이미 메일을 보낸 업체에는 다시 보내지 않으며, 다시 보내는 단추는 화면에 없음.
diff --git a/A05_EduDetail/guide/D04/06_받은_업체_연결.md b/A05_EduDetail/guide/D04/06_받은_업체_연결.md
new file mode 100644
index 000000000..3653466e0
--- /dev/null
+++ b/A05_EduDetail/guide/D04/06_받은_업체_연결.md
@@ -0,0 +1,27 @@
+# 받은 업체의 임도 연결
+
+확정된 예정노선을 받은 업체가 자기 임도 프로젝트로 가져가 설계를 이어 가는 방법.
+
+## 여는 길
+
+- 지정받은 등록 회사는 대시보드의 「받은 예정노선」 구역에서 확정된 연도를 봄.
+- 열 = 예정노선 · 연도 · 확정 · 연결 상태(연결됨 / 미연결 / 업데이트 있음) · 작업.
+
+## 단계
+
+| 단계 | 할 일 |
+| --- | --- |
+| 1 | 「받은 예정노선」에서 연도 줄의 [보기]를 누르면 예정노선 화면이 보기만 가능한 상태로 열림. |
+| 2 | [연결]을 누르면 모달이 열려 두 가지 중 하나를 고름. |
+| 3 | 「새 임도 프로젝트로」 = 예정노선 이름 + 연도로 임도 프로젝트를 새로 만들고 노선 입력 단계(B03)로 이동. 예정노선의 설계속도(20 · 30 · 40 km/h)가 새 프로젝트의 설계속도 기본값으로 들어감. |
+| 4 | 「기존 프로젝트에 연결」 = 우리 회사의 임도 프로젝트를 골라 그 프로젝트에 연결. 임도 프로젝트가 없으면 「우리 회사 임도 프로젝트가 없습니다.」가 보임. |
+| 5 | 임도 프로젝트 노선 입력 화면의 [예정노선에서 가져오기]로도 같은 일을 할 수 있음. 지정받은 연도를 고르면 노선이 입력됨. |
+
+## 보이는 것
+
+- 연결하면 그 연도 노선(shapefile 한 벌)이 노선 입력 단계의 입력 파일로 들어감. 파일을 직접 올린 것과 같은 길이라 이후 처리도 같음. 지형 자료는 업체가 따로 올려야 함.
+- 이미 분석 결과가 있는 임도 프로젝트에 연결하면 기존 결과를 지워도 되는지 묻는 확인 창이 먼저 나옴. 취소하면 아무것도 바뀌지 않음.
+- 연결 시점의 노선이 복사되므로, 산림청이 뒤에 노선을 바꿔도 임도 프로젝트는 자동으로 바뀌지 않음. 대신 「업데이트 있음」 표시가 뜨며, 노선 입력 화면 위쪽 띠에서 [다시 가져오기]로 직접 반영 여부를 결정함.
+- 한 임도 프로젝트는 한 연도에만 연결됨. 다른 연도로 다시 연결하면 앞의 연결은 풀림.
+
+> 참고: 임도 프로젝트 쪽 화면은 [임도설계 가이드](B03/00_설명서)를 참고. 산림청 쪽에서 연결된 연도에는 연도 표의 지정 업체에 「연결됨」 딱지가 붙음.
diff --git a/A05_EduDetail/guide/D04/10_내보내기_파일_구성.md b/A05_EduDetail/guide/D04/10_내보내기_파일_구성.md
index edfcf1655..e4f4a968d 100644
--- a/A05_EduDetail/guide/D04/10_내보내기_파일_구성.md
+++ b/A05_EduDetail/guide/D04/10_내보내기_파일_구성.md
@@ -1,5 +1,9 @@
# 내보내기 파일 구성
+
+
+[내보내기] 단추는 왼쪽 아래 단추 줄에 있음.
+
## 한눈에
- 내려받는 파일 이름 = 「프로젝트이름_예정노선.zip」. 이름에 쓸 수 없는 글자는 밑줄(_)로 바뀜.
diff --git a/A05_EduDetail/guide/D04/30_사용자_확정_전_값.md b/A05_EduDetail/guide/D04/30_사용자_확정_전_값.md
index 4e12a87dd..2b72d3ac3 100644
--- a/A05_EduDetail/guide/D04/30_사용자_확정_전_값.md
+++ b/A05_EduDetail/guide/D04/30_사용자_확정_전_값.md
@@ -1,5 +1,7 @@
# 사용자 확정 전 값
+
+
아래 항목은 코드의 현재 동작이며, 바꾸려면 개발 담당에게 요청.
| 값 | 지금 기본값 | 출처 | 상태 |
diff --git a/A05_EduDetail/guide/D04/D04_00_overview.webp b/A05_EduDetail/guide/D04/D04_00_overview.webp
new file mode 100644
index 000000000..244fdb9b7
Binary files /dev/null and b/A05_EduDetail/guide/D04/D04_00_overview.webp differ
diff --git a/A05_EduDetail/guide/D04/D04_01_year_table.webp b/A05_EduDetail/guide/D04/D04_01_year_table.webp
new file mode 100644
index 000000000..daea15aea
Binary files /dev/null and b/A05_EduDetail/guide/D04/D04_01_year_table.webp differ
diff --git a/A05_EduDetail/guide/D04/D04_02_assigned_firms.webp b/A05_EduDetail/guide/D04/D04_02_assigned_firms.webp
new file mode 100644
index 000000000..9290679d0
Binary files /dev/null and b/A05_EduDetail/guide/D04/D04_02_assigned_firms.webp differ
diff --git a/A05_EduDetail/guide/D04/D04_03_add_manual.webp b/A05_EduDetail/guide/D04/D04_03_add_manual.webp
new file mode 100644
index 000000000..822449792
Binary files /dev/null and b/A05_EduDetail/guide/D04/D04_03_add_manual.webp differ
diff --git a/A05_EduDetail/guide/D04/D04_04_unsaved_note.webp b/A05_EduDetail/guide/D04/D04_04_unsaved_note.webp
new file mode 100644
index 000000000..aef7924b8
Binary files /dev/null and b/A05_EduDetail/guide/D04/D04_04_unsaved_note.webp differ
diff --git a/A05_EduDetail/guide/D04/D04_05_pick_years.webp b/A05_EduDetail/guide/D04/D04_05_pick_years.webp
new file mode 100644
index 000000000..05c320fe0
Binary files /dev/null and b/A05_EduDetail/guide/D04/D04_05_pick_years.webp differ
diff --git a/A05_EduDetail/guide/D04/D04_06_buttons.webp b/A05_EduDetail/guide/D04/D04_06_buttons.webp
new file mode 100644
index 000000000..bb4aad76c
Binary files /dev/null and b/A05_EduDetail/guide/D04/D04_06_buttons.webp differ
diff --git a/A05_EduDetail/guide/D04/D04_07_finalize_ask.webp b/A05_EduDetail/guide/D04/D04_07_finalize_ask.webp
new file mode 100644
index 000000000..0591a25af
Binary files /dev/null and b/A05_EduDetail/guide/D04/D04_07_finalize_ask.webp differ
diff --git a/A05_EduDetail/guide/D04/_scenes.json b/A05_EduDetail/guide/D04/_scenes.json
new file mode 100644
index 000000000..4c6b65a86
--- /dev/null
+++ b/A05_EduDetail/guide/D04/_scenes.json
@@ -0,0 +1,10 @@
+[
+ {"name":"D04_00_overview","route":"#/d04-plan-confirm","project":"plan","before":[{"wait":".d04-confirm__firm"},{"wait_ms":800},{"eval":"[...document.querySelectorAll('[class*=\"__firm\"] > span:first-child')].forEach((s,i)=>{ if(!/example\\./.test(s.textContent)) s.textContent=['예시건설','예시산업','예시토건'][i%3]+' · guide-sample'+(i||'')+'@example.com' })"},{"wait_ms":300}],"settle_ms":600,"clip":null,"callouts":[{"n":1,"sel":".d04-confirm__table","pos":"tr"},{"n":2,"sel":".d04-confirm__panel .ui-collapsible"},{"n":3,"sel":".ui-sidebar-actions","pos":"tr"}]},
+ {"name":"D04_01_year_table","route":"#/d04-plan-confirm","project":"plan","before":[{"wait":".d04-confirm__firm"},{"wait_ms":800},{"eval":"[...document.querySelectorAll('[class*=\"__firm\"] > span:first-child')].forEach((s,i)=>{ if(!/example\\./.test(s.textContent)) s.textContent=['예시건설','예시산업','예시토건'][i%3]+' · guide-sample'+(i||'')+'@example.com' })"},{"wait_ms":300}],"settle_ms":600,"clip":".d04-confirm__table","callouts":[{"n":1,"sel":".d04-confirm__table tbody tr:nth-child(1) td:nth-child(2)"},{"n":2,"sel":".d04-confirm__table tbody tr:nth-child(1) td:nth-child(3)"},{"n":3,"sel":".d04-confirm__table tbody tr:nth-child(1) td:nth-child(5)"},{"n":4,"sel":".d04-confirm__table tbody tr:nth-child(1) td:nth-child(6)"},{"n":5,"sel":".d04-confirm__table tbody tr:nth-child(1) td:nth-child(7)","pos":"tr"}]},
+ {"name":"D04_02_assigned_firms","route":"#/d04-plan-confirm","project":"plan","before":[{"wait":".d04-confirm__firm"},{"wait_ms":800},{"eval":"[...document.querySelectorAll('[class*=\"__firm\"] > span:first-child')].forEach((s,i)=>{ if(!/example\\./.test(s.textContent)) s.textContent=['예시건설','예시산업','예시토건'][i%3]+' · guide-sample'+(i||'')+'@example.com' })"},{"wait_ms":300}],"settle_ms":600,"clip":".d04-confirm__table tbody tr:nth-child(1)","callouts":[{"n":1,"sel":".d04-confirm__table tbody tr:nth-child(1) .d04-confirm__firm"},{"n":2,"sel":".d04-confirm__table tbody tr:nth-child(1) .d04-confirm__firm > span:nth-child(2)","pos":"tr"},{"n":3,"sel":".d04-confirm__table tbody tr:nth-child(1) .d04-confirm__firm > button","pos":"tr"},{"n":4,"sel":".d04-confirm__table tbody tr:nth-child(1) .d04-confirm__add","pos":"br"}]},
+ {"name":"D04_03_add_manual","route":"#/d04-plan-confirm","project":"plan","before":[{"wait":".d04-confirm__firm"},{"wait_ms":800},{"fill":".d04-confirm__table tbody tr:nth-child(3) .d04-confirm__add input:nth-child(1)","value":"예시토건"},{"fill":".d04-confirm__table tbody tr:nth-child(3) .d04-confirm__add input:nth-child(2)","value":"guide-sample@example.org"},{"wait_ms":300},{"eval":"[...document.querySelectorAll('[class*=\"__firm\"] > span:first-child')].forEach((s,i)=>{ if(!/example\\./.test(s.textContent)) s.textContent=['예시건설','예시산업','예시토건'][i%3]+' · guide-sample'+(i||'')+'@example.com' })"}],"settle_ms":600,"clip":".d04-confirm__table tbody tr:nth-child(3)","callouts":[{"n":1,"sel":".d04-confirm__table tbody tr:nth-child(3) .d04-confirm__add input:nth-child(1)"},{"n":2,"sel":".d04-confirm__table tbody tr:nth-child(3) .d04-confirm__add input:nth-child(2)"},{"n":3,"sel":".d04-confirm__table tbody tr:nth-child(3) .d04-confirm__add button","pos":"tr"}]},
+ {"name":"D04_04_unsaved_note","route":"#/d04-plan-confirm","project":"plan","before":[{"wait":".d04-confirm__firm"},{"wait_ms":800},{"fill":".d04-confirm__table tbody tr:nth-child(3) .d04-confirm__add input:nth-child(1)","value":"예시토건"},{"fill":".d04-confirm__table tbody tr:nth-child(3) .d04-confirm__add input:nth-child(2)","value":"guide-sample@example.org"},{"click":"[class*=\"__table\"] tbody tr:nth-child(3) [class*=\"__add\"] button"},{"wait":".d04-confirm__dirty"},{"wait_ms":300},{"eval":"[...document.querySelectorAll('[class*=\"__firm\"] > span:first-child')].forEach((s,i)=>{ if(!/example\\./.test(s.textContent)) s.textContent=['예시건설','예시산업','예시토건'][i%3]+' · guide-sample'+(i||'')+'@example.com' })"}],"settle_ms":600,"clip":".d04-confirm","callouts":[{"n":1,"sel":".d04-confirm__dirty"},{"n":2,"sel":".d04-confirm__table tbody tr:nth-child(3) td:nth-child(7)","pos":"tr"}]},
+ {"name":"D04_05_pick_years","route":"#/d04-plan-confirm","project":"plan","before":[{"wait":".d04-confirm__firm"},{"wait_ms":800},{"eval":"[...document.querySelectorAll('[class*=\"__firm\"] > span:first-child')].forEach((s,i)=>{ if(!/example\\./.test(s.textContent)) s.textContent=['예시건설','예시산업','예시토건'][i%3]+' · guide-sample'+(i||'')+'@example.com' })"},{"wait_ms":300}],"settle_ms":600,"clip":".d04-confirm__panel .ui-collapsible","callouts":[{"n":1,"sel":".d04-confirm__picks"}]},
+ {"name":"D04_06_buttons","route":"#/d04-plan-confirm","project":"plan","before":[{"wait":".d04-confirm__firm"},{"wait_ms":800},{"eval":"[...document.querySelectorAll('[class*=\"__firm\"] > span:first-child')].forEach((s,i)=>{ if(!/example\\./.test(s.textContent)) s.textContent=['예시건설','예시산업','예시토건'][i%3]+' · guide-sample'+(i||'')+'@example.com' })"},{"wait_ms":300}],"settle_ms":600,"clip":".ui-sidebar-actions","callouts":[{"n":1,"sel":".ui-sidebar-actions > button:nth-child(1)"},{"n":2,"sel":".ui-sidebar-actions > button:nth-child(2)"},{"n":3,"sel":".ui-sidebar-actions > button:nth-child(3)"},{"n":4,"sel":".ui-sidebar-actions > button:nth-child(4)"},{"n":5,"sel":".ui-sidebar-actions > button:nth-child(5)"},{"n":6,"sel":".ui-sidebar-actions > button:nth-child(6)"}]},
+ {"name":"D04_07_finalize_ask","route":"#/d04-plan-confirm","project":"plan","before":[{"wait":".d04-confirm__firm"},{"wait_ms":800},{"eval":"[...document.querySelectorAll('[class*=\"__firm\"] > span:first-child')].forEach((s,i)=>{ if(!/example\\./.test(s.textContent)) s.textContent=['예시건설','예시산업','예시토건'][i%3]+' · guide-sample'+(i||'')+'@example.com' })"},{"wait_ms":300},{"click":".ui-sidebar-actions > button:nth-child(5)","confirm":true},{"wait":".ui-confirm__panel"},{"wait_ms":400}],"settle_ms":600,"clip":null,"callouts":[{"n":1,"sel":".ui-confirm__message"},{"n":2,"sel":".ui-confirm__actions button:first-child","pos":"bl"},{"n":3,"sel":".ui-confirm__actions button:last-child","pos":"br"}],"after":[{"click":"[class*=\"ui-conf\"][class*=\"__actions\"] button:first-child"}]}
+]