diff --git a/docs/raw/요구_1025/_분석_345-F_내장엑셀보고서.md b/docs/raw/요구_1025/_분석_345-F_내장엑셀보고서.md new file mode 100644 index 000000000..5a840688c --- /dev/null +++ b/docs/raw/요구_1025/_분석_345-F_내장엑셀보고서.md @@ -0,0 +1,172 @@ +# 345-F E 안정성평가 보고서 — 내장 엑셀 재활용 분석 + +근거 = 요구서 345 4장(`docs/raw/요구_1025/요구서_345_예정노선_안정성평가.md:92-118`) · 요구 347-5(`docs/raw/요구_1025/사용자요구_1025.md:109`) · PLAN 533-2(`PLAN.md:155`). + +## ① 결론 + +1. 내장 엑셀 = **외부 라이브러리 없이 직접 짠 스프레드시트**(`A00_Common/spreadsheet/` 약 80 파일 · 약 2.4 만 줄 · 라이센스 = 자체 코드). 원래는 M02 산출근거용이고, B05·B08·B09 는 항목 고르기 모달 편집(면적산출)으로만 씀. B08·B09 본표는 내장 엑셀이 아니라 읽기 전용 HTML 표(`createDataTable`)임. +2. 서버 Node 묶음 `spreadsheet` 는 **재계산 전용**([저장] 때 수식을 다시 풀어 `계산값` 정본) — xlsx 만들기 · 인쇄 · PDF 기능은 없음. 계약 머리에 「xlsx 내보내기 · 인쇄 · PDF 는 만들지 않음」이라고 적혀 있음. +3. 문서 계약(Workbook)에 **쪽 나눔 · 인쇄 영역 · 인쇄 배율 · 용지 · 그림 칸이 없음**. 서식 · 병합 · 열 폭 · 행 높이 · 틀고정 · 여러 시트는 있음. 서식 이름이 엑셀 이름 그대로라 xlsx 로 거의 1:1 옮길 수 있음. +4. xlsx · PDF 선례 = **B09 인쇄 미리보기(초안)** — PDF 는 HTML 을 헤드리스 Edge(Playwright)로, xlsx 는 openpyxl 로(A4 · 폭 1쪽 · 머리 줄 반복 · 쪽 번호). 시트마다 새 쪽. 그림은 PDF 에만 들어감. 원천은 HTML 표(DataTable)이고 Workbook 이 아님. +5. 따라서 E04 = 보기·고치기는 내장 엑셀 그대로 쓰고(여러 시트 · 캐시 · [저장] 때 서버 재계산), 새로 만들 것 = **계약에 인쇄 설정 · 그림 칸 추가 + 그림 겹판 + Workbook → 인쇄 HTML(PDF) + Workbook → xlsx + 보고서 양식 · 빌더**. PDF 엔진(Playwright) · openpyxl · PyMuPDF(그림 SVG→PNG 확인함)는 이미 설치됨. + +## ② 항목별 현황 + +### 1. 내장 엑셀이 무엇인가 + +| 항목 | 현황 | 근거 | +| --- | --- | --- | +| 라이브러리 | 외부 0 · 오픈소스 코드 안 베낌(Formula.js · ssf 는 시험 대조 답으로만) · 자체 코드 | `A00_Common/spreadsheet/spreadsheet_types.ts:7-8` · `package.json:22-35`(스프레드시트 의존성 없음) | +| 판 | 문서 `종류: "통합문서"` · `판: 1` | `spreadsheet_types.ts:229-242` | +| 진입 | `createSpreadsheet(칸, 통합문서, {readOnly, onChange, onSelect, tabs, links, preview, conditions})` → `{getDoc, setDoc, recalc, getLinkedValues, setLink, addSheet, pasteTable, select, destroy}` | `spreadsheet.ts:56-104` · `:118` | +| 부르는 법 | `import()` 로 늦게 불러옴(정적 import 금지 · 크기 예산 압축 128 KB) | `spreadsheet.ts:7` · `spreadsheet_types.ts:10` · `:15-16` | +| 저장 | 부른 쪽이 함 — `onChange` 로 문서 받음 · 자동저장 없음 · [저장] 때 서버가 Node 로 다시 풂 | `spreadsheet.ts:8` | +| 쓰는 곳 | M02(산출근거 카드 · 함수 시트 · 면적 · 호표 엑셀 보기) · 공용 항목 고르기 편집(B05 · B08 · B09 가 부름) | `M02_MasterTemplete/M02_MasterTemplete_ItemCards.ts:432-435` · `M02_MasterTemplete/DataFlow/M02_DF_FuncPanel.ts:576-582` · `ui_template/ui_template_item_picker_edit.ts:113-125` | +| B08 · B09 본표 | 내장 엑셀 아님 — 공용 HTML 표 `createDataTable`(읽기 전용 · 다단 머리 · 합계) | `B08_Quantity/B08_Quantity_UI_Material.ts:4` · `B09_Estimation/draft/B09_Draft_Print_Table.ts:9-14` | +| 다른 표 부품 | `ui_template/sheet/`(`createSheet` · 구조물집계표 전용 · 엑셀 아님) — E04 와 상관없음 | `ui_template/sheet/ui_template_sheet.ts:1-18` | +| 서버 Node 묶음 | `common_util_spreadsheet_node.ts` → `config/spreadsheet_node/`(git 밖) · 하는 일 = 재계산(`recalcWorkbook`) · 면적 표 → CAD 표 · 이름정의 더하기. **xlsx 만들기 없음** | `common_util/common_util_spreadsheet_node.ts:1-15` · `:55-80` · `.gitignore:68` | +| 파이썬 껍데기 | `recalc_workbooks` · `with_server_values`(브라우저 `계산값` 버리고 서버 풀이로 적음) · TS 원본이 더 새것이면 스스로 다시 빌드 | `common_util/common_util_spreadsheet.py:17-20` · `:27-63` | +| 빌드 | `npm run build:spreadsheet`(vite SSR) — 전체 `npm run build` 에 들어 있음 | `package.json:9` · `:7` | +| 금지 규칙 | 「xlsx 가져오기 · 내보내기 · 인쇄 · PDF 는 만들지 않음(단추도 없음)」 · 계약 파일은 「0 계약 주인만 고침」 | `spreadsheet_types.ts:3-4` · `:13` | + +### 2. 양식(템플릿) · 서식 · 쪽 나눔 + +| 항목 | 현황 | 근거 | +| --- | --- | --- | +| 양식 자리 | Workbook JSON 파일 — 시스템 층 `resources/master_template/area/<열 id>.json` · 회사 · 개인 · 프로젝트 층도 같은 모양 · 프로젝트 복사본 | `resources/master_template/area/item1.json` · `M02_MasterTemplete/M02_MasterTemplete_Store.py:1-4` · `:22-27` · `M02_MasterTemplete/M02_Item_Copy.py:1-8` | +| xlsx 양식 파일 | B08 · B09 는 xlsx 양식 파일을 안 씀 — 실무 xlsx 는 계산 근거로만 참고(셀 식을 코드로 옮김) | `B08_Quantity/B08_Quantity_Engine_Earthwork_Summary.py:3` · `B08_Quantity/B08_Quantity_Material_Calc.py:6` | +| xlsx → Workbook | 선례 있음 — M02 호표 실무자료(xls = 값 · 서식 · 병합 · 폭 · 높이 · 틀고정 · xlsx = 값만) · 읽기 전용 보기 | `M02_MasterTemplete/M02_Hopyo_Grid.py:1-10` · `:181-198` | +| 셀 서식 | 글꼴 · 크기 · 굵게 · 기울임 · 밑줄 · 취소선 · 글자색 · 채움 · 가로(엑셀 이름) · 세로 · 줄바꿈 · 테두리(hair~double 엑셀 이름) · 숫자 형식(엑셀 코드 그대로) | `spreadsheet_types.ts:104-133` | +| 병합 · 폭 · 높이 · 틀고정 · 숨김 · 묶음 | 있음(`병합` · `열.폭` 엑셀 글자 단위 · `행.높이` pt · `틀고정`) | `spreadsheet_types.ts:135-182` | +| 여러 시트 | 있음(`tabs: true` · 시트 탭 · `addSheet`) | `spreadsheet.ts:63-64` · `:86-89` | +| 머리글 · 바닥글 · 인쇄 영역 · 쪽 나눔 · 용지 · 인쇄 배율 | **없음**(계약에 칸 없음) | `spreadsheet_types.ts:165-201` | +| 화면 배율 | 화면 전용(Ctrl+휠 10~400%) — 저장 안 됨 · 인쇄 배율 아님 | `spreadsheet_grid.ts:270` · `spreadsheet_autofit.ts:13` | +| 칸 보호(잠금) | 대화상자에 자리만 · 실제로는 안 됨 | `spreadsheet_format_dialog.ts:7-8` · `:70` | +| 이름정의 | 계약에 있으나 수식 풀이에 「안 이어짐」 | `spreadsheet_types.ts:190-193` | + +### 3. 그림 넣기 + +| 항목 | 현황 | 근거 | +| --- | --- | --- | +| 내장 엑셀 그림 · 차트 · 도형 | **없음**(계약 · 화면 모두) | `spreadsheet_types.ts:165-201` | +| 겹판 선례 | 있음 — 추적 화살표가 격자 위 SVG 겹판(스크롤 따라감) · 격자가 칸 자리(`cellBox`)를 줌 → 그림 겹판을 같은 꼴로 얹을 수 있음 | `spreadsheet_trace.ts:7-9` · `spreadsheet_view_types.ts:63` · `spreadsheet_grid.ts:637` | +| 행열 넣기 때 따라가기 선례 | 알약 연결 칸이 행열 넣기 · 지우기를 따라감(`applyLinked` · `shiftSpan`) | `spreadsheet_links.ts:11` · `:122` · `:135` | +| B09 PDF 그림 | `PrintSheet.images` → 표 아래 `
`(data: 주소 · 헤드리스는 바깥 요청 막음) · **엑셀엔 안 넣음** | `B09_Estimation/draft/B09_Draft_Print_Table.ts:5` · `:55-64` · `:145-169` · `B09_Draft_Print_Types.ts:12-18` | +| B08 그림 선례 | 거리이정표 경로 그림 = 서버 헤드리스 Edge 캡처 PNG(사용자 그림 우선) | `B08_Quantity/B08_Quantity_Milestone_Capture.py:1-14` · `B08_Quantity/B08_Quantity_UI_Milestone_State.ts:113-119` | +| 도면 PDF 선례 | CAD JSON → PyMuPDF 벡터 PDF(한글 글꼴 심음) | `B09_Estimation/draft/B09_Draft_Print_Drawings_Pdf.py:1-14` | +| 단면 그림 | B06 횡단은 화면 SVG 뿐 · 서버가 단면 그림 파일을 만드는 선례 없음 · 3D 화면 캡처 선례 없음(`toDataURL` 은 B07 CAD 안만) | `B06_Section/B06_Section_UI_Cross_View*.ts` | +| 쓸 도구 | PyMuPDF 1.28.2 로 SVG → PNG · SVG → PDF 됨(이번에 실측) · openpyxl 3.1.2 그림(`openpyxl.drawing.image.Image`) · 쪽 나눔(`Break`) 불러오기 됨 · pillow 있음 | `requirements.txt:28` · `:31` · `:36` | + +### 4. 사용자 고침 → 저장 · 다시 계산과 합치기 + +| 선례 | 방식 | 근거 | +| --- | --- | --- | +| 항목 고르기 편집(면적산출) | 내장 엑셀 고침 → **프로젝트 복사본에만** PUT `{판, 내용}` · 판 다르면 409 · 면적은 서버 재계산 값으로 적음 · manifest `고침: true` | `ui_template/ui_template_item_picker_edit.ts:1-7` · `M02_MasterTemplete/M02_Project_Items_Router.py:178-193` · `M02_MasterTemplete/M02_Item_Copy.py:181-203` | +| 재적용(원본 다시 가져오기) | 도면 · 면적 = **통째 덮어씀** + `덮임` 목록으로 알림 · 입력값 · 고른자재는 같은 키면 살림 · 고친 사본은 지울 때 `_지난/` 에 보관 | `M02_MasterTemplete/M02_Item_Copy.py:240-279` · `:5-6` | +| 칸 ↔ 프로그램 값(칸 → 프로그램) | 알약 `연결`(키 → 칸) · 서버가 연결 칸 값을 읽음 | `M02_MasterTemplete/M02_Labor_Doc.py:350-366` | +| 프로그램 → 칸 | 함수 시트 받는 칸에 프로그램 값을 넣고 Node 로 풂(복사본에 넣음 · 원본 양식은 그대로) | `M02_MasterTemplete/DataFlow/M02_DF_Compute.py:426-439` · `:559-567` | +| 데이터 3층 | 초기값 `initial_snapshot/` · 작업본 = [저장] · 캐시 = sessionStorage · [초기화] = 초기값 덮어씀 | `CLAUDE.md` 5장 | + +- 「다시 계산 → 사용자 고침과 칸 단위로 합침」 선례는 **없음** — 있는 것은 통째 덮어쓰기 + 덮임 알림, 키가 같은 입력값 살리기 둘뿐임. + +### 5. 내보내기(xlsx · PDF) + +| 항목 | 현황 | 근거 | +| --- | --- | --- | +| B09 인쇄 미리보기 | 주소 `#/b09-print`(draft · 폴더째 지우면 길도 없어짐) · 왼쪽 쪽 목록 체크 · 본문 = 서버 PDF 를 iframe 으로(「보는 것 = 받는 것」) · [PDF 내려받기] [엑셀 내려받기] | `B09_Estimation/draft/B09_Draft_Print_Page.ts:1-10` · `:120` · `:168-169` · `B09_Draft_Print_Route.ts:9-15` | +| PDF 만들기 | 서버 — HTML + 인쇄 CSS → 헤드리스 **Edge(없으면 Chrome)** Playwright `page.pdf` · A4 · 시트마다 새 쪽(`.sheet{break-after:page}`) · 방향 시트마다 · 표 머리 쪽마다 반복 · 쪽 번호 바닥글 · 넓은 표 자동 축소(최소 0.3) · 자식 프로세스 · 서버 전체 잠금 하나 | `B09_Estimation/draft/B09_Draft_Print_Router.py:1-22` · `:40-74` · `:110-115` · `:118-154` · `:157-182` | +| xlsx 만들기 | 서버 — openpyxl · 시트 이름 31자 · 머리 굵게 · 병합 · 테두리 · 숫자 서식 · 들여쓰기 · 열 폭 · 틀고정 · 인쇄 설정(방향 · A4 · 폭 1쪽 · 머리 줄 반복 · `&A` · `&P / &N`) | `B09_Draft_Print_Router.py:189-200` · `:202-215` · `:218-277` | +| 쪽 나눔 보존 | PDF = 시트 경계 + 브라우저 자동 쪽 나눔(줄 안 끊음 `tr{break-inside:avoid}`) · xlsx = 엑셀 자동 + 폭 1쪽 · **사용자가 정한 쪽 나눔 줄은 없음** | `B09_Draft_Print_Router.py:45-46` · `:66` · `:206-209` | +| 원천 | 화면 값(캐시 · [저장] 전이면 화면에 보이는 값) · 서버는 꼴만 바꿈(값 셈 · 저장 없음) | `B09_Estimation/draft/B09_Draft_Print_Quantity.ts:6-7` · `B09_Draft_Print_Router.py:1` | +| 시험 선례 | PDF 쪽 수(PyMuPDF) · xlsx 되읽기(`load_workbook` · `print_title_rows`) | `resources/tester/test_302_1_print_frame.py:164-176` · `:226` · `:231-239` | +| Workbook → HTML 선례 | 복사 때 범위 → 인라인 서식 HTML 표(병합 · 숫자 형식 · 테두리) — 열 폭 · 행 높이는 없음 · 화면 부품(`showToast`)과 한 파일 | `A00_Common/spreadsheet/spreadsheet_clipboard.ts:14` · `:51-94` · `:123-167` | +| Workbook → xlsx 선례 | **없음** | — | + +### 6. 재활용 · 새로 만들 것 + +그대로 부를 것: + +| 무엇 | 어디 | 쓰임 | +| --- | --- | --- | +| `createSpreadsheet`(`tabs: true` · `onChange`) | `A00_Common/spreadsheet/spreadsheet.ts:118` | E04 보기 · 고치기 | +| `with_server_values` · `recalc_workbooks` | `common_util/common_util_spreadsheet.py:37-63` | [저장] · 내보내기 전 서버 재계산 | +| 판(sha) · 409 · 원자 쓰기 꼴 | `M02_MasterTemplete/M02_Item_Copy.py:181-203` · `common_util/common_util_json.atomic_write_json` | 작업본 PUT | +| `render_pdf` · `spawn_pdf`(Playwright Edge 자식 프로세스) | `B09_Draft_Print_Router.py:118-182` | PDF — 다만 draft 파일이라 `common_util` 로 옮겨 함께 씀 | +| `print_setup` · `sheet_title` | `B09_Draft_Print_Router.py:189-215` | xlsx 인쇄 설정 · 시트 이름 | +| PDF iframe 미리보기 꼴 | `B09_Draft_Print_Page.ts:100-170` | E04 [PDF 미리보기] | +| `formatValue`(숫자 형식) · `styleAt` · `styleToCss` | `spreadsheet_numfmt.ts` · `spreadsheet_clipboard.ts:51-94` | 인쇄 HTML(화면과 같은 글) — DOM 없는 파일로 떼어 씀 | +| `cellBox` · 겹판 층 · `shiftSpan` | `spreadsheet_grid.ts:637` · `spreadsheet_trace.ts:8` · `spreadsheet_refshift.ts` | 그림 겹판 · 행열 넣기 때 따라가기 | +| PyMuPDF SVG → PNG | 설치됨(실측) | 단면 · 평면 위험 띠 그림 | + +새로 만들 것(B 에 없는 것만): + +1. 계약 더함 — `Sheet.인쇄`(방향 · 용지 · 여백 · 맞춤 = 폭 1쪽 또는 배율 % · 인쇄 영역 · 머리 줄 반복 · 쪽 나눔 행 목록) · `Sheet.그림`(파일 키 · 범위 닻 A1:A1) · 계약 머리 금지 규칙 고침. +2. 그림 겹판(늦게 불러옴) + 쪽 나눔 점선 표시. +3. Workbook → 인쇄 HTML(TS · DOM 없음 · 서버 Node 묶음 진입 하나 더) — 열 폭 · 행 높이 · 병합 · 서식 · 숫자 형식 · 쪽 나눔 · 머리 줄 반복(thead) · 그림(data:). +4. Workbook → xlsx(openpyxl · 서식 이름 1:1 · 식은 `=` 붙여 살아 있는 수식 · 그림 · 쪽 나눔 · 인쇄 설정). +5. 보고서 양식 JSON + 보고서 빌더(해석 결과 → 자료 시트 · 그림 파일) + E04 길 · 화면. + +## ③ E04 보고서 구성안 + +시트(= 장 · 시트마다 새 쪽): + +| 차례 | 시트 | 내용 | 주인 | +| --- | --- | --- | --- | +| 1 | 표지 | 사업명 · 노선 · 발주처 · 날짜 · 「문헌 추정치 · 현장 시험 없음」 | 사용자(빌더가 처음 채움 · 다시 만들 때 안 건드림) | +| 2 | 개요 · 판정 요약 | 대상 측점 수 · 연장 · 조건별 최소 Fs · N.G 수 · 판정 글 — 수는 수식으로 자료 시트를 가리킴(`=측점표!…`) | 사용자 | +| 3 | 입력 조건 | 지층별 물성치(γt · γsat · c · φ) · 기준안전율(건기 · 우기 · 지진) · 지하수 규칙 · 노면 하중 · 해석 방법 | 프로그램 | +| 4 | 측점별 안전율 | 측점 · 절/성 · 건기 · 우기 · (지진) Fs · 기준 · 판정 — 머리 줄 쪽마다 반복 · 폭 1쪽 | 프로그램 | +| 5 | 대표 단면 | 단면마다 한 쪽(쪽 나눔 행) — 그림(지반선 · 설계선 · 지층 · 임계 활동면 · 지하수) + 그 단면 Fs 작은 표 | 프로그램(그림) | +| 6 | 3D 결과 요약 | 구간별 최소 Fs 표 + 평면 위험 띠 그림(3D 화면 캡처 대신 서버 SVG) | 프로그램 | + +- 양식 = `resources/master_template/report/stab_report.json`(Workbook · M02 층 규칙과 같은 모양 · M02 편집 화면은 나중). +- 표준 목차 근거 = `resources/knowledge/original/안정성평가/00_안정성평가_신규라이센스모듈_조사요약_목차.md:18-40`(3 · 4 · 6 · 7장 해당) · 대표 단면 규칙 후보 = `_분석_345-D_안정성평가제안.md:97`(값은 사용자 협의로 확정). + +쪽 나눔: + +- 시트 경계 = 늘 새 쪽(B09 와 같음). +- 시트 안 = `Sheet.인쇄.쪽나눔`(행 목록) — 대표 단면 시트는 빌더가 단면마다 넣음 · 사용자가 더하거나 뺄 수 있음. +- 긴 표 = 자동 나눔 + 머리 줄 반복(PDF thead · xlsx `print_title_rows`). + +그림: + +- 서버가 해석 결과로 SVG 를 만들고 → PNG(PyMuPDF)로 저장(`E04_StabReport/fig/<측점 키>.png` · 열쇠 = `common_util_station_key`). +- 화면 = 그림 겹판(범위 닻 · 행열 넣기에 따라감) · xlsx = openpyxl 그림(두 칸 닻) · PDF = 같은 자리에 ``(data: 주소 · SVG 그대로 써서 벡터도 됨). + +사용자 고침 보존: + +- 작업본 = `E04_StabReport/report.json`(Workbook) · 초기값 = 처음 만든 직후 `initial_snapshot/` · 캐시 = sessionStorage · [저장] = PUT `{판, 내용}` → `with_server_values` · [초기화] = 초기값 덮어씀. +- 해석 지문이 바뀌면 화면 위에 「해석 결과가 바뀜 — [보고서 갱신]」 띠만 띄움(자동으로 덮지 않음). +- [보고서 갱신] = **프로그램 몫 시트(3 · 4 · 5 · 6)와 그림만 다시 만듦** · 사용자 몫 시트(1 · 2 · 사용자가 더한 시트)는 그대로 · 사용자 몫 시트의 수식은 자료 시트를 가리키므로 새 값을 따라감 · 덮인 시트에 고침이 있었으면 `덮임` 목록으로 알리고 옛 판은 `_지난/` 에 둠(M02 재적용 꼴). + +내보내기: + +- [엑셀] · [PDF] = 화면의 지금 책(캐시)을 서버로 보냄 → 서버가 Node 로 재계산 → xlsx(openpyxl) 또는 인쇄 HTML → Playwright Edge PDF · 저장 안 함(B09 와 같이 「보는 것 = 받는 것」). +- [PDF 미리보기] = 같은 PDF 를 iframe 으로(B09 꼴). + +## ④ 정할 거리 + +1. **페이지 이름** — 요구서 `E04_StabReport` · PLAN 533 「E05 보고서」(3D = E04) · 분석 D `E06_StabReport` 로 셋이 다름 → 권함: 요구서 그대로 `E04_StabReport` · 3D 보기는 E03 안 또는 E05. +2. **사용자 고침 보존 방식** — (가) 통째 다시 만듦 + `_지난/` 보관 · (나) 프로그램 몫 시트만 다시 만듦 + 사용자 몫 시트는 수식으로 가리킴 · (다) 시트 안 프로그램 영역(연결 닻)만 다시 채움 → 권함: (나)(새 합치기 코드 없이 수식 엔진 그대로 · (다)는 표 꾸밈 고침이 잦으면 나중). +3. **다시 만드는 때** — 해석 지문이 바뀌면 자동 · [보고서 갱신] 단추 → 권함: 단추 + 「바뀜」 띠. +4. **PDF 만드는 길** — (가) Workbook → 인쇄 HTML → Playwright Edge(B09 엔진) · (나) xlsx → LibreOffice 변환(새로 설치 필요) · (다) PyMuPDF 로 칸을 직접 그림 → 권함: (가). +5. **인쇄 HTML 만드는 자리** — TS(서버 Node 묶음 · 숫자 형식 `formatValue` 를 화면과 같이 씀) · 파이썬 새로 → 권함: TS(CLAUDE.md 5장 ②). +6. **내보내기 원천** — 화면 지금 책(캐시) · 저장본만 → 권함: 화면 지금 책 + 서버 재계산(B09 선례). +7. **그림 만드는 법** — 서버 SVG → PNG(PyMuPDF) · 브라우저 화면 캡처(E03 SVG · 3D 캔버스) → 권함: 서버 SVG(서버 단독 계산과 한 벌 · 3D 는 평면 위험 띠 그림으로 대신). +8. **그림 넣는 자리** — 계약 `Sheet.그림`(범위 닻 · 겹판) · 그림 전용 시트(칸 없이 그림만) → 권함: 계약 더함(xlsx · PDF · 화면 한 벌) · 1차는 사용자가 그림을 옮기지 못함. +9. **계약 고침 주인** — `spreadsheet_types.ts` 는 「0 계약 주인만」 · 머리에 「xlsx · 인쇄 · PDF 안 만듦」 → 권함: 브레인이 주인을 지정하고 요구 347-5 로 금지 규칙을 풂. +10. **양식 자리** — 코드 상수 · `resources/master_template/report/*.json`(M02 층) → 권함: JSON(회사 · 개인 층 덮어쓰기는 나중). +11. **대표 단면 고르기** — 자동 규칙(쌓기 높이 · 절토 높이 · 최소 Fs 하위 N개) · 사용자 고름 → 권함: 자동 + E03 에서 고침 · 높이 · N 값은 사용자 협의. +12. **칸 잠금** — 프로그램 칸 잠금을 만듦 · 안 만듦 → 권함: 안 만듦(엔진에 보호 없음 · 덮임 알림으로 대신). + +## ⑤ 계획 걸음 후보 + +1. 계약 더함(`Sheet.인쇄` · `Sheet.그림` · 머리 금지 규칙 고침) — `A00_Common/spreadsheet/spreadsheet_types.ts` · `spreadsheet_sample.json` — `resources/tester/spreadsheet/test_spreadsheet_engine.py` · `test_spreadsheet_size.py` 통과. +2. PDF 엔진 공용화(`render_pdf` · `spawn_pdf` · `print_setup` · `sheet_title` 를 옮기고 B09 는 부르기만) — `common_util/common_util_print_pdf.py` · `B09_Draft_Print_Router.py` — `resources/tester/test_302_1_print_frame.py` 그대로 통과. +3. 인쇄 HTML(DOM 없음 · `formatValue` · 서식 CSS 를 clipboard 에서 떼어 공용) + Node 진입 `print` — `A00_Common/spreadsheet/spreadsheet_print_html.ts` · `common_util/common_util_spreadsheet_node.ts` — 시험: 병합 · colgroup 폭 · 쪽 나눔 수 · thead 행 수. +4. Workbook → xlsx(값 · 식 · 서식 · 병합 · 폭 · 높이 · 틀고정 · 인쇄 설정 · 쪽 나눔 · 그림) — `common_util/common_util_workbook_xlsx.py` — 시험: `load_workbook` 으로 되읽어 병합 · `row_breaks` · `_images` 수 · `print_title_rows` · 식 글. +5. 그림 겹판 + 쪽 나눔 점선(늦게 불러옴 · `cellBox` · `shiftSpan`) — `A00_Common/spreadsheet/spreadsheet_figures.ts` · `spreadsheet.ts` 잇기 — harness 시험 + 크기 예산 시험. +6. 보고서 양식 — `resources/master_template/report/stab_report.json`(시트 여섯) — 시험: 빈 해석 결과로 만들어도 깨지지 않음. +7. 보고서 빌더(해석 결과 → 프로그램 몫 시트 · SVG → PNG 그림 · 지문) — `E04_StabReport/E04_StabReport_Build.py` — 시험: 측점 수 = 줄 수 · N.G 수 · 그림 파일 수 · 사용자 몫 시트 불변. +8. 길(GET · PUT 판 409 + 서버 재계산 · 갱신 = 덮임 · `_지난/` · 초기화 · xlsx · pdf · 그림) — `E04_StabReport/E04_StabReport_Router.py` — TestClient 시험 · PDF 쪽 수(PyMuPDF). +9. 화면(내장 엑셀 · 캐시 · [저장] · [초기화] · [보고서 갱신] · [엑셀] · [PDF] · PDF 미리보기) — `E04_StabReport/E04_StabReport_UI_Page.ts` — ORCA 수치(시트 수 · 그림 자리 · 고친 칸이 갱신 뒤 남음 · 내려받은 PDF 쪽 수). diff --git a/docs/raw/요구_1025/요구서_345_예정노선_안정성평가.md b/docs/raw/요구_1025/요구서_345_예정노선_안정성평가.md index 0281b56b5..f0633e072 100644 --- a/docs/raw/요구_1025/요구서_345_예정노선_안정성평가.md +++ b/docs/raw/요구_1025/요구서_345_예정노선_안정성평가.md @@ -94,7 +94,7 @@ - 대상 = B06(횡단 설계)까지 끝난 같은 회사 임도 프로젝트. - 페이지 = `E01_StabRegister`(생성) → `E02_StabGround`(지반 조건) → `E03_StabSection`(2D 측점 해석) → `E04_Stab3D`(3D 해석) → `E05_StabReport`(보고서) · 2차 `E06_StabRock`(암반) · `E07_StabArea`(광역). -- 2D · 3D 둘 다 진행(요구 347-1) — 3D 방법은 외부 논문 · 기술정보 조사(`original/안정성평가/05_3D_사면안정해석_논문_기술정보.md`) 뒤 정함. +- 2D · 3D 둘 다 진행(요구 347-1) — 3D 방법 근거 = 외부 논문 · 기술정보 조사 `original/안정성평가/05_3D_사면안정해석_논문_기술정보.md` · 3D 강도감소 FEM 은 보류(BSD 도구 scikit-fem 으로 나중 가능). ### 4-1. 생성 · 복사 (E01) @@ -107,7 +107,7 @@ | --- | --- | --- | --- | | 1차 | 측점별 횡단 2D 한계평형해석 — Bishop 간편법 기본 · Janbu 보정(암 경계 따라) · Fellenius 비교 · 절토 · 성토 쪽 따로 · 건기 · 우기(지진 선택) | B06 복사본(지반선 · 설계선 · 경사 · 소단 · 토사/암 경계 · 벽) + 지반물성치 + 지하수 규칙 + 노면 하중 + 기준안전율 | 측점별 최소 안전율 · 판정 · 임계 원호 그림 · 위험 구간 색띠 · 보고서 | | 2차 | 암반 평사투영(평면 · 쐐기 · 전도) · 노선 주변 광역 무한사면 위험 지도 · 보강 가정 재해석 · 벽 외적 안정 | 절리 방향(현장 조사) · 지형 격자 | 측점별 파괴 모드 · 위험 지도 | -| 1차 3D | 3D 해석(방법은 05 조사 뒤 정함 · 후보 = 3D 기둥법 한계평형 + DEM 기반 활동면 탐색) | B06 복사본 + 지형 격자 + 3D 노선면 + 지반물성치 | 구간별 3D 안전율 · 3D/2D 비 · 3D 보기 | +| 1차 3D | 3D 기둥법 한계평형 — Hungr 3D Bishop 기본 · 3D Janbu 보정(암 경계에 잘린 면) · Hovland 비교 · 활동면 탐색 = USGS Scoops3D 방식 구 격자 + 부피 제약(공공 저작물 · 수식 이식 자유) | 복사 DEM + 노선 계획면 합성 DEM + 지층 경계 격자(B06 암 경계 측점 보간) + 2D 와 같은 물성 · 지하수 | 셀별 최소 안전율 지도 · 임계 체적(m³) · 구간별 3D 안전율 · 3D/2D 비 · 3D 보기 | | 3차 | 엄밀해(Spencer 등) · 확률 해석 | 3D 지층(시추 등) | 정밀 안전율 | - 2D · 3D 둘 다(요구 347-1) — 2D = 국내 기준(KDS 11 70 05) 기본 · 납품 단면 단위 · 3D = 끝단 효과 · 지형 굴곡 반영 · 2D 결과와 대조. @@ -123,7 +123,7 @@ - 층 두께(B06 암 경계 초기값) · 지하수 규칙 · 지진 켬/끔. - E03 = 좌 측점 목록(안전율 색) · 가운데 횡단 + 임계 원호 · 우 결과 · 절편표 · 위 평면 위험 띠 · 3D 색칠 보기. - E04 = 3D 해석(구간 고르기 · 3D 활동면 · 안전율 · 2D 대조). -- E05 = 보고서(요구 347-5) — 내장 엑셀을 양식화해 씀 · 페이지 구분 · 내용 정리(입력 조건 · 측점별 안전율 표 · 대표 단면 그림 · 3D 요약 · 판정 요약 · 「문헌 추정치 · 현장 시험 없음」 표기) · 사용자가 고칠 수 있음 · 보기 = 내장 엑셀 · 내보내기 = xlsx · PDF. +- E05 = 보고서(요구 347-5) — 내장 엑셀을 양식화해 씀 · 시트 여섯(표지 · 개요/판정 요약 · 입력 조건 · 측점별 안전율 · 대표 단면(단면마다 한 쪽 · 그림) · 3D 요약) · 시트마다 새 쪽 · 긴 표는 자동 쪽 나눔 + 머리 줄 반복 · 「문헌 추정치 · 현장 시험 없음」 표기 · 사용자가 고칠 수 있음(표지 · 요약은 다시 만들어도 그대로) · 해석이 바뀌면 「[보고서 갱신]」 띠 · 보기 = 내장 엑셀 · 내보내기 = xlsx · PDF · 근거 `_분석_345-F_내장엑셀보고서.md`. ## 5. 데이터 · 계산 자리