chore(sync): 공유 docs 파일 담음 — 기준 커밋과 같은 내용

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FJqWQpoB1RE7hiaQ2wH8qV
This commit is contained in:
2026-10-06 16:49:12 +09:00
co-authored by Claude Opus 5.5
parent 71c3ee80a8
commit f020a55629
35 changed files with 691 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
---
trigger: always_on
description: Consult the graphify knowledge graph at graphify-out/ for codebase and architecture questions.
---
## graphify
This project has a graphify knowledge graph at graphify-out/.
Rules:
- For codebase or architecture questions, when `graphify-out/graph.json` exists, first run `graphify query "<question>"` (CLI) or `query_graph` (MCP). Use `graphify path "<A>" "<B>"` / `shortest_path` for relationships and `graphify explain "<concept>"` / `get_node` for focused concepts. These return a scoped subgraph, usually much smaller than `GRAPH_REPORT.md` or raw grep output.
- If graphify-out/wiki/index.md exists, navigate it instead of reading raw files
- Read graphify-out/GRAPH_REPORT.md only for broad architecture review or when query/path/explain do not surface enough context
- After modifying code files in this session, run `graphify update .` to keep the graph current (AST-only, no API cost)
+10
View File
@@ -0,0 +1,10 @@
---
name: graphify
description: Turn any folder of files into a navigable knowledge graph
---
# Workflow: graphify
Follow the graphify skill installed at ~/.gemini/config/skills/graphify/SKILL.md to run the full pipeline.
If no path argument is given, use `.` (current directory).
+24
View File
@@ -0,0 +1,24 @@
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "C:\\Users\\umsan\\AppData\\Local\\Programs\\Python\\Python312\\Scripts\\graphify.EXE hook-guard search"
}
]
},
{
"matcher": "Read|Glob",
"hooks": [
{
"type": "command",
"command": "C:\\Users\\umsan\\AppData\\Local\\Programs\\Python\\Python312\\Scripts\\graphify.EXE hook-guard read"
}
]
}
]
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"permissions": {
"allow": [
"Read(//c/Program_coding/임도설계 및 견적자동화 프로그램 개발/**)",
"Bash(python -c \"import aiomysql; print\\('ok'\\)\")",
"Bash(python -c \"import pymysql; print\\('pymysql ok'\\)\")",
"Bash(python -c \"import mysql.connector; print\\('mysql.connector ok'\\)\")",
"Bash(\"/c/Program_coding/임도설계 및 견적자동화 프로그램 개발/venv/Scripts/python.exe\" \"C:\\\\Users\\\\umsan\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\c--Program-coding----------------------docs\\\\57bf1f9e-714c-482d-9caa-a113bdc0a8d6\\\\scratchpad\\\\inspect_db.py\")",
"Bash(\"/c/Program_coding/임도설계 및 견적자동화 프로그램 개발/venv/Scripts/python.exe\" \"C:\\\\Users\\\\umsan\\\\AppData\\\\Local\\\\Temp\\\\claude\\\\c--Program-coding----------------------docs\\\\57bf1f9e-714c-482d-9caa-a113bdc0a8d6\\\\scratchpad\\\\inspect_db2.py\")",
"Read(//c/Program_coding/임도설계 및 견적자동화 프로그램 개발/A01_Home/**)",
"Bash(cd \"c:\\\\Program_coding\\\\임도설계 및 견적자동화 프로그램 개발\\\\A01_Home\" && ls -la)",
"Read(//c/Program_coding/�ӵ����� �� �����ڵ�ȭ ���α׷� ����/**)",
"Read(//c/Program_coding/임도설계 및 견적자동화 프로그램 개발/A00_Common/**)",
"Read(//c/Program_coding/�ӵ����� �� �����ڵ�ȭ ���α׷� ����/docs/wiki/**)",
"Bash(find \"c:\\\\Program_coding\\\\임도설계 및 견적자동화 프로그램 개발\" -name \"*locale*\" -type f 2>/dev/null | head -5)",
"Read(//c/Program_coding/�ӵ����� �� �����ڵ�ȭ ���α׷� ����/docs/wiki/pages/**)",
"Read(//c/Program_coding/임도설계 및 견적자동화 프로그램 개발/A06_Login/**)",
"Read(//c/Program_coding/임도설계 및 견적자동화 프로그램 개발/ui_template/**)",
"Read(//c/Program_coding/임도설계 및 견적자동화 프로그램 개발/A07_Register/**)"
]
}
}
+15
View File
@@ -0,0 +1,15 @@
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "C:\\Users\\umsan\\AppData\\Local\\Programs\\Python\\Python312\\Scripts\\graphify.EXE hook-check"
}
]
}
]
}
}
+3
View File
@@ -0,0 +1,3 @@
{
"promptDelete": false
}
+1
View File
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
[]
+33
View File
@@ -0,0 +1,33 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"footnotes": false,
"properties": true,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": true,
"bases": true,
"webviewer": false
}
+22
View File
@@ -0,0 +1,22 @@
{
"collapse-filter": false,
"search": "",
"showTags": true,
"showAttachments": true,
"hideUnresolved": true,
"showOrphans": true,
"collapse-color-groups": false,
"colorGroups": [],
"collapse-display": false,
"showArrow": false,
"textFadeMultiplier": 0,
"nodeSizeMultiplier": 1,
"lineSizeMultiplier": 1,
"collapse-forces": false,
"centerStrength": 0.518713248970312,
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 0.7003715382344561,
"close": true
}
+271
View File
@@ -0,0 +1,271 @@
{
"main": {
"id": "99c9496f9af0d35f",
"type": "split",
"children": [
{
"id": "34e9ffa4ccc78d90",
"type": "tabs",
"dimension": 56.82302771855011,
"children": [
{
"id": "41ded8d7baed12f5",
"type": "leaf",
"state": {
"type": "graph",
"state": {},
"icon": "lucide-git-fork",
"title": "그래프 뷰"
}
}
]
},
{
"id": "23dcd189ca429a1a",
"type": "tabs",
"dimension": 43.17697228144989,
"children": [
{
"id": "ba0eee70a4b40379",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "wiki/architecture/project_map.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "project_map"
}
},
{
"id": "a632970c50a7a55e",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "wiki/ingest/verification_2026_07.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "verification_2026_07"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "1fdf49368d0b8d12",
"type": "split",
"children": [
{
"id": "286216e41ef17318",
"type": "tabs",
"children": [
{
"id": "bf4a66eeb6ba12b7",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-folder-closed",
"title": "파일 탐색기"
}
},
{
"id": "d69b070685f35c13",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "검색"
}
},
{
"id": "f48a2962a3eee224",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "북마크"
}
}
]
}
],
"direction": "horizontal",
"width": 200
},
"right": {
"id": "47e841f62a2c8446",
"type": "split",
"children": [
{
"id": "ed0c1ac6b73a8ced",
"type": "tabs",
"children": [
{
"id": "9eee98dc05d3fde2",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "백링크"
}
},
{
"id": "1e0ba87b26453941",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "나가는 링크"
}
},
{
"id": "aea498d48aaa60a0",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "태그"
}
},
{
"id": "dde952791b603350",
"type": "leaf",
"state": {
"type": "all-properties",
"state": {
"sortOrder": "frequency",
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-archive",
"title": "모든 속성"
}
},
{
"id": "2daeda4e90730082",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "개요"
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"canvas:새 캔버스 만들기": true,
"graph:그래프 뷰 열기": false,
"switcher:빠른 전환기 열기": true,
"daily-notes:오늘의 일일 노트 열기": true,
"templates:템플릿 삽입": true,
"command-palette:명령어 팔레트 열기": true,
"bases:새 베이스 생성하기": true
}
},
"active": "41ded8d7baed12f5",
"lastOpenFiles": [
"wiki/concepts/completed_2026-08-29.md",
"wiki/graphify-out/2026-09-10/manifest.json",
"wiki/graphify-out/2026-09-10/graph.json",
"wiki/graphify-out/2026-09-10/cost.json",
"wiki/graphify-out/2026-09-10/GRAPH_REPORT.md",
"wiki/concepts/design_data_lifecycle.md",
"raw/verification/2026-09-10_계획서_e_f_g_이관_교차검증.md",
"raw/plans/2026-08-13_plan_rainfall_wamis_station.md",
"raw/plans/2026-08-18_plan_B05_sidebar_ui_page_improvements.md",
"wiki/graphify-out/cache/ast/v0.9.12/f9ba53d937aa3d2e502fc976096f58f6671fe27c5529f52ef6044ffbc784862e.json",
"wiki/graphify-out/cache/ast/v0.9.12/cf5183db8137ee3c2c8cef6fd3be395b4b85a83c3f4717a1bf054b7ee6a702c1.json",
"wiki/graphify-out/cache/ast/v0.9.12/0489582c6e1820a05b10a55cc165ce0f4edeb1407c6161876dbc5de3c1014709.json",
"wiki/graphify-out/cache/ast/v0.9.12/56000e954dc3088e72f1b346511bee73a2328868f4e835e165857118f5ebed1c.json",
"wiki/graphify-out/cache/ast/v0.9.12/f7cb9eaa4aaca14f928852ace24b0735c46a4f8115b5c7502093b2e31e82bbc8.json",
"wiki/graphify-out/cache/ast/v0.9.12/2f9bba4bbf05240f2f639495a7d9a4f2641825e576c5440395aa5b95986b7544.json",
"wiki/graphify-out/cache/ast/v0.9.12/80835802ae68203adcb24943f96b1845160622a7d86361c4c0b5bfb7e73a5c8d.json",
"wiki/pages/B06_Section/B06_cross_design_ui_2026_09.md",
"wiki/pages/B05_Profile/B05_profile_interaction_2026_09.md",
"wiki/pages/B04_PreProcess/B04_compass_crs_2026_09.md",
"wiki/pages/B03_FileInput/B03_upload_ui_2026_09.md",
"wiki/concepts/completed_2026-09-03_additional.md",
"raw/plans/2026-09-03_plan_completed_items_2.md",
"wiki/pages/B08_DesignDetail/B08_cad_delivery_2026_09.md",
"wiki/pages/B06_Section/B06_masshaul_culvert_2026_09.md",
"wiki/pages/B05_Profile/B05_masshaul_structure_2026_09.md",
"wiki/pages/B04_PreProcess/B04_drainage_compass_crs.md",
"wiki/pages/B03_FileInput/B03_route_snapshot_crs.md",
"wiki/concepts/completed_2026-09-03.md",
"wiki/architecture/workflow_data_flow.md",
"wiki/graphify-out/memory/query_20260821_101018_임도_기술정보db에서_집수정의_형태정보는_어떤게_있는지_확인해줘.md",
"wiki/architecture/project_map.md",
"wiki/pages/B05_Profile/B05_Profile_plan_2026-08-19.md",
"wiki/pages/B06_Section/B06_culvert_set.md",
"wiki/pages/B05_Profile/B05_structures.md",
"raw/verification/2026-08-16_verify_B05_구조물_수동추가_교차검증.md",
"raw/plans/2026-08-16_plan_B05_구조물_수동추가.md",
"raw/law/original/임도기술교본/그림/그림 3-24 노선의 계곡부와 산등부분 계획.png",
"raw/law/original/임도기술교본/그림/그림 3-23 기존 작업도로의 지반과 계획고.png",
"raw/law/original/임도기술교본/그림/그림 3-21 분묘 통과 측량 평면.png",
"raw/law/original/임도기술교본/그림/그림 3-22 분묘 주변의 횡단 계획 및 구조물 배치도.png",
"raw/law/original/임도기술교본/그림/그림 3-20 BOX암거 설치 단면도.png",
"raw/law/original/임도기술교본/그림/그림 3-18 세월교 설치 종단도.png",
"raw/law/original/임도기술교본/그림/그림 3-19 BOX암거 설치 종단도.png",
"raw/law/original/임도기술교본/그림/그림 3-17 물넘이포장 설치 횡단도.png",
"raw/law/original/임도기술교본/그림/그림 3-16 물넘이포장 단면 조사.png",
"raw/law/original/임도기술교본/그림/그림 3-15 유출구 주계곡 유수 흐름의 방해가.png",
"무제 4.canvas",
"무제 3.canvas",
"무제 2.canvas",
"무제 1.canvas",
"무제.canvas"
]
}
@@ -214,3 +214,113 @@ B05에서 3D 영역의 상단 버튼들 중 원근으로, 직교로 버튼의
3. 컨테이너 내부의 값을 변경하거나 선택하면 하이라이트 연동
4. 추가 흙막이는 사면 안정그룹의 흙막이와 옵션이 동일함. 일원화 작업(다시 말해 구조를 선택할 일이 없음. )
5. 사면 안정그룹의 종류 선택에서 흙막이, 옹벽, 소단만 남겨둘것.
(10-6 사용자)
다음으로 리스트 항목, 횡단도, 종단의 측점 세로선 들이 연동되어 있는데 여기서 선택된 항목에서 구조물 배치를 변경할 경우 동작할 경우 변경되어야하는 내용이 있음.
1. 기존에 지정된 항목을 보여준 상태에서 구조물 군을 변경하는 경우에는 신규추가의 의미로 리셋이 된 상태여야함. 동일 구조물군에서의 이동은 해당 항목으로 이동한다는 의미로 기본값을 적용한 상태로 변경되어야하면 다시 돌아갈경우 캐시를 물고 있는 상태로 이전 구조물의 설정값을 가지고 돌아갈수 있어야함. 단, 저장이나 확정을 누를 경우에는 캐시가 비워짐.
(10-6 사용자)
다음 수정
- 횡단도의 컨테이너 폭이 너무 커서 높이가 높아짐. 최대/최소 컨테이너가 폭을 조절하여 1.5행 정도가 보이게 조절하는 방법이 있는지 확인. 스케일을 망가뜨리면 안됨
- 종단 하단 패널 전체를 브라우져 창에서 별도로 동작하게 할수 있는지 확인
(10-6 사용자)
횡단 카드 폭과 종단 하단 패널(테이블, 유토곡선, 배수유역도 포함) 둘다 너의 제안대로 반영해줘. 반영해주면 내가 직접 검증하겠음
(10-6 사용자 · 배관 기본값)
관 컨테이너 관경 배수유역에 의해 자동설정 값, 사용자에 의해 변경 가능
관길이 횡단도의 관 보호공의 위치에 의해 결정, 사용자 변경 불가
관 보호공(공통) 구조 집수정
관 보호공(유입)_집수정 구조 집수정 일 경우
형태 L형
높이 1.5
관 보호공(유입)_흙막이 구조 흙 막이 일 경우
형태 돌 쌓기(찰)
길이 10
높이 1.5
기준측점 전 5
기준측점 후 5
관 보호공(유출)_흙막이 구조 흙막이 일 경우(구조 선택지 하나밖에 없음)
형태 돌 쌓기(찰)
길이 10
높이 1.5
기준측점 전 5
기준측점 후 5
추가 흙막이 단 0
연동 TRUE(활성화 될 경우)
경사 TRUE(활성화 될 경우)
추가 흑막이 구조 흙막이 일 경우(구조 선택지 하나밖에 없음)
형태 돌 쌓기(찰)
길이 10
높이 1.5
기준측점 전 5
기준측점 후 5
연동 TRUE(활성화 될 경우)
경사 TRUE(활성화 될 경우)
* 사면안정 구조물 군의 흙막이도 동일함, 일원화
* 연동과 경사는 공간이 부족하여 줄바꿈처리됨. 글자를 조금 줄여서 줄바꿈 안되게 반영하거나 글자 주변 여유를 조금 줄일것
(10-6 사용자)
횡단도의 노폭과 노견 확장에 대한 정보를 횡단도 중심에 있는데 이걸 아래로 X 축라벨 상단으로 빼는게 좋겠어.
(10-6 사용자)
구조물군 변경시에 횡단도 하이라이트 초기화 안됨
(10-6 사용자)
다음 배관과 흙막이의 선택지에 대한의견임. 선택 안함 항목들은 그냥 값이 없어야함. 기본 값이 아니라.
(10-6 사용자)
1. 관 보호공 유입에서 연동과 경사 옵션은 결국 종단방향의 길이가 있는 것들에만 들어가는 옵션이야.
2. 집수정 옵션에서 내공이라는 옵션이 나오는데 의미가 뭔지 모르겠음. 필요없는 정보로 보임.
(10-6 사용자)
3. 연동과 경사 버튼의 높이를 추가 흙막이의 + 버튼의 높이와 같게 이건 구조물 배치 컨테이너의 하위 컨테이너 내부의 항목들 공통임. 템플릿으로 만들어서 반영. 그렇다고 삭제, 리셋 버튼까지 바꿀필요는 없음.
(10-6 사용자)
기본값은 비워져 있을때 대체해서 넣어주는 값이아니라 그냥 프론트엔드에 그냥 값을 넣은 상태로 보여줬으면 해.
(10-6 사용자)
돌쌀기(메)의 경우 형상이 원지반에 붙어서 연장됨. 형상 정보에 대해 재정리 하겠음.
1. 관보호공의 흙막이, 사면보호의 흙막이, 옹벽, 추가 흙막이 등은 전부 같은 로직으로 형상을 횡단도에 그려지고 동작해야함
2. 관보호공의 흙막이는 배관에 연동되에 위치제어만 제약이 생김.(배관은 m 단위로 떨어져야 함으로)
3. 형태에 따라 다른건 내부 그림의 형태만 변경을 함.
4. 각각의 형태별로 원지반을 침투하는 리밋과 높이 리밋이 존재하는데 이부분은 삭제(사용자에게 선택권을 주겠음.)
5. 단 노면위로 올라오는건 방지.
(10-6 사용자)
빈칸은 그냥 빈칸이야. 별도의 안내는 필요없어. 기본 값 XX 라 흐린 글씨로 작성하지 말고 기본값을 사용자가 넣은 것 처럼. 기본값을 입력하면 된다는 말이야. 그리고 필수로 집수정이낭 흙막이처럼 필수로 필요한 정보에는 선택안함 선택지 자체가 없어야해.
(10-6 사용자)
기존 프로젝트에서 존재하는 예전 데이터 때문에 검증이 어려운것같은데 쉽게 데이터를 초기화하고 신규로직으로 적용되게 하는 방법은 없어?
B 방향이 맞겠네. 새 프로젝트를 만드는건 문제없어보여. 이때 개별 워크트리들이 검증할수 있는 프로젝트를 각각지정해주는게 좋겠어. 그리고 추가로 엄상준과 박동철 프로젝트도 같이 만들어줘. 같은회사 검증자 들이야. 이 사람들도 본인의 프로젝트로 검증할거야.
이전 프로젝트는 그냥 삭제해
전부 다 손대도 상관없음 프로젝트 전역 초기
(10-6 사용자)
그런데 이전 프로젝트를 삭제할때 대시보드에서 리스트가 나오는데 정리해줘.
(10-6 사용자)
내가 원지반 제약에의 구조물 형상 생성 및 제어 제약에 대해 락을 풀어달라고 했는데 반영이 안된것 같아. 확인해봐.
(10-6 사용자)
다음으로 종단 패널의 종단도에서 알약선택시 나오는 선택정보 창에서 내용은 옵션 제목은 필요없고 구분기호 하나 넣고 옵션값만 구조물 이름 행과 2행은 옵션값만으로 표현해도 됨
(10-6 사용자)
횡단도에서 형상의 제약조건이 어떤게 있는지 확인 좀 해줘. 배관과 흙막이, 옹벽관련 내용들만 일단 찾아줘.
(10-6 사용자)
다음으로 좌측 패널에서 서브 컨테이너의 항목을 선택/변경/생성 할 경우에 횡단도에서 선택한것처럼 이동되어야할것같아.
(10-6 사용자)
추가로 배관의 도수로/돌붙임의 경우에는 복수 값이 아니야. 생성이 되었다면 추가 버튼이 없어져야함.
(10-6 사용자)
1. 종단도의 구조물 알약의 이름이 구조물군의 종류 값과 매칭이 안됨. 같은 값을 보게 개선.
2. 종단도에서 배관이 선택한 상태에서 다른 지점에 옹벽을 추가하기 위해 마우스 오른쪽 버튼을 클릭후 사면안정을 눌렀더니 하위 리스트는 안보이고 리셋된 상태가 됨. 확인
(10-6 사용자)
1. 도수로 돌붙임에는 컨테이너 제목에 1과 2 같은 정보는 필요없어보임.
2. 구조물의 높이 선택에 따라 제약이 발생한 경우 토스트 메세지 발생. 이것도 흙막이, 집수정, 옹벽, 관 보호공에서 높이 제약을 풀어줘. 사용자가 선택하게 할거야. 이건 이전에 요청했던 내용이야.
(10-6 사용자)
다음부터는 이제 워크트리별로 작업영역을 지정해서 진행하자. 지금 프로그램 폴더기준으로 M02, B05/B06 구조물 배치 패널, B06 횡단도 형상 제어, B07 상세 설계, B08 수량산출 페이지에 대해 분리하여 워크트리를 나눠서 너가 지시했으면 해. 이 방식은 한시적으로만 운영할 생각임.
@@ -0,0 +1,72 @@
54-33 끝 조사 · ① 갈래 3(추천 B: 열 수 자동 + 카드 최소·최대 폭) · ② 됨(같은 창 코드로 화면 조각만 팝업에 옮기는 길 · 키보드·메뉴 연결 손봐야 함)
# ① 횡단 카드 크기
## 지금 크기가 정해지는 곳
- 열 수 — `B06_Section_UI_Section_View.ts:319-326` : 열 수 = 칸 폭 ÷ (최소 폭 560 + 간격 16) 내림. 카드 폭 = 칸 폭을 열 수로 나눈 값. 최대 폭 없음 (`_Section_Common.ts:39-40` 상수 560·16).
- 높이 — `_Cross_View_Metrics.ts:57-64` : 1m 당 픽셀 = (카드 폭 − 좌우 여백 78) ÷ 가로 범위(m). 높이 = 고도 범위 × 1m 당 픽셀 + 위아래 여백 36 + 면적 표 머리방 58. 바닥 250 (`_Section_Common.ts:37`).
- 줄 높이 — `_Section_View.ts:344-349` : 같은 줄 카드 중 가장 큰 높이로 통일 (낮은 카드는 위아래 빈 자리).
- 그림 — `_Cross_View.ts:310-314` : SVG 가로세로 = 카드 px 그대로, viewBox 도 같은 값. 즉 CSS 확대·축소 없음 · 가로세로 같은 1m 당 픽셀 · 글자 크기 고정.
- 카드 틀 — `_Style_Cross.css:42-63`(머리·꼬리 줄) · `:119-123`(바둑판 · 열 수는 JS 가 직접 덮어씀).
## 원인
- 카드 높이 = 폭에 비례 (그림 모양 고정이므로). 칸 폭 1500 이면 2열 · 카드 약 740 폭 · 그림 높이 약 480 + 머리·꼬리 줄 → 한 줄이 칸 높이를 넘음.
- 폭을 줄이면 그림 전체가 같은 비율로 작아짐 = 축척(가로세로 비) 유지. 높이만 자르면 위아래 고도가 잘리거나 빈 자리가 늚.
- 줄여도 안 줄어드는 고정분 : 여백 36 · 면적 표 머리방 58 · 카드 머리·꼬리 · 바닥 250 → 아주 좁은 카드에서 높이가 폭을 따라 안 줄어듦.
## 갈래
- A. 최소 폭만 낮추기 (560 → 약 400)
- 고칠 곳 : 상수 한 줄.
- 장 : 가장 작음 · 축척 그대로.
- 단 : 1.5줄 보장 없음 (칸 높이를 안 봄) · 칸 폭마다 우연히 맞음.
- 크기 : 1줄.
- B. 열 수 자동 (추천)
- 고칠 곳 : `_Section_View.ts:319-326` 열 수 결정부 + 칸 높이도 보기(ResizeObserver 가 지금 폭만 봄 `:402-412`).
- 방식 : 열 수 2·3·4… 를 차례로 시험 → 첫 줄 높이 + 간격 + 둘째 줄 절반이 칸 높이 안에 드는 가장 적은 열 수 채택. 카드 폭이 최소 폭(예 360~400) 아래로 내려가면 거기서 멈춤. 최대 폭(예 800~900)을 넘는 1열은 열을 늘리거나 가운데 정렬로 폭 상한.
- 장 : 칸 높이가 달라져도(하단 패널 끌기·창 크기) 늘 1.5줄 근처 · 축척 유지(그림이 통째로 작아질 뿐 · 잘림 없음) · 계산이 기존 `crossPlotBase` 재사용.
- 단 : 하단 패널을 끌 때 열 수가 바뀌면 카드 전체 다시 그림 (열 수가 바뀔 때만 다시 그리게 막아야 함 · 줌·팬 상태는 측점별 캐시라 유지) · 좁아진 카드는 글자 대비 그림이 작아 읽기 힘든 한계(바닥 폭이 정함) · 바닥 250 · 머리방 58 같은 고정분이 1.5줄에 못 미치게 할 수 있음 → 이 값도 열 수 계산에 넣어야 함.
- 크기 : 약 40~60줄 + 시험 (`_Section_View.ts` 700줄 한계 확인 필요 · 열 수 계산을 별 파일로).
- C. 높이 상한 + 그림 맞춤 (CSS 만)
- 방식 : 카드 높이를 상한으로 막고 SVG 를 `preserveAspectRatio` 로 맞춤.
- 장 : 고치는 곳 적음.
- 단 : 그림이 줄어 양옆이 비고(폭 낭비) 카드 안 모든 클릭 좌표·끌기(`data-px-per-m`·팬)·글자 크기가 화면 배율과 어긋나 축척 신뢰 훼손 → 비추천.
## 한계·확인 필요
- 1.5줄이 실제로 되는 폭은 칸 높이와 단면 모양(고도 범위 · 가로 범위 · 세로 과장 배율)에 따라 다름 — 실측값 아님 · 식으로만 추정 : 칸 높이 500, 가로 40m, 고도 범위 23m 이면 카드 폭 약 300 까지 내려가야 1.5줄 → 바닥 폭 360~400 이면 칸 높이가 작은 화면에서는 1.5줄에 못 미칠 수 있음. 바닥 폭은 사용자 협의 대상(임의 확정 안 함).
- 줄 높이가 줄 최댓값이라 줄마다 열 수 시험 값이 다름 → 시험은 첫 줄과 둘째 줄을 실제 데이터로 계산.
# ② 종단 하단 패널을 별도 브라우저 창으로
## 지금 하단 패널이 기대는 것
- 한 벌만 존재 — `A00_Common/design/design_page.ts:116-118,125-138` (`profileSlot` · `shared.profile`) · 종단 보기·횡단 보기가 같은 인스턴스를 씀. 만드는 곳 `design_profile.ts:128-239`.
- 자료 — 같은 창 메모리(모듈 변수) + `sessionStorage`(초안·결과 · `b_page_state.ts:46-199,249-250`) + 설계 가게(`design_store.ts` : 구독 방식이 같은 창 안에서만 동작). 화면 취향(패널 높이·접힘)은 `localStorage` (+ 계정 서버 저장) → 창끼리 이미 공유.
- 페이지 쪽 연결 — 콜백 약 12 종 (`B05_Profile_UI_Profile_Panel_Types.ts:17-57` : 관 변경 · 구조물 이동·추가·삭제 · 측점 선택 · 횡단 재계산 알림 등) + `onSelectStation` · `onResetAll` + 횡단 카드 갱신 `refreshCards`.
- 창 전역에 거는 리스너 — `window` 포인터 놓기·취소·blur·keydown·keyup (`_Profile_Drag.ts:82-83,201-202` · `_Profile_Edit.ts:60-62` · `_Profile_Panel_Tools.ts:268-269,313-317` · `_Profile_Wheel`) · 우클릭 메뉴가 `document` 에 리스너 (`ui_template_context_menu.ts:57,67`) · 화면 크기 `window.innerHeight` (`_Profile_Heights.ts:26` · `_MassHaul.ts:231` · `_TableOverlay.ts:84`) · 토스트·모달은 `document.body` (`ui_template_elements.ts`, `ui_template_modal.ts`).
- 위치 — 종단 보기에서는 3D 위에 뜨는 판(`B05_Profile_UI_Style.css:42-54` absolute) · 횡단 보기는 카드 아래 흐름(`design_page.css:38-41`).
## 갈래
- A. 같은 창 코드로 화면 조각만 팝업에 옮기기 (추천)
- 방식 : [분리] 단추 → `window.open`(같은 출처 · 사용자 클릭 안에서) → 팝업 문서에 스타일 복사 → `profileSlot` 안 종단도 DOM 을 팝업 본문으로 옮김. 코드는 메인 창에서 계속 실행.
- 자료 공유 : 필요 없음 — 같은 메모리 · 같은 `sessionStorage` · 같은 가게. 편집 → 횡단 카드·3D 갱신도 지금 경로 그대로.
- 손볼 곳 : ① 창 전역 리스너를 요소의 소속 창(`ownerDocument.defaultView`)에 걸도록 약 10곳 ② 우클릭 메뉴 `document` 리스너와 화면 밖 보정 `window.innerWidth/Height` ③ 팝업 닫힘(`pagehide`) 때 DOM 을 원래 자리로 되돌림 · 메인 창 새로고침·이동 때 팝업 닫기 ④ 메인 쪽 빈 자리 처리(종단 보기 = 3D 가 전면 · 횡단 보기 = 카드 칸이 아래까지 늘어남) ⑤ 스타일 복사 (`link`·`style` 통째 복제 · 개발 서버 핫리로드 스타일 포함) ⑥ 토스트·모달은 메인 창에 뜸 (팝업 쪽에서 보이려면 별도 처리).
- 크기 : 신규 약 200~300줄 + 기존 약 8 파일 소폭 수정. 위험 중간 — 키보드(▲▼ 방향키)·끌기·우클릭 전부 다시 시험해야 함.
- B. 팝업이 자체 앱을 띄우고 BroadcastChannel 로 동기화
- 방식 : 별도 라우트로 종단도만 띄우고 메인과 메시지 주고받기.
- 막히는 것 : `sessionStorage` 는 탭마다 따로(팝업 열릴 때 복사본만 받고 이후 갈라짐 · `storage` 이벤트도 세션 저장소는 창 사이 안 옴) → 초안 5종(계획고·관·구조물·선택·횡단 상세) 양방향 동기화 직접 구현 · 콜백 12종을 메시지로 바꿔야 함 · 자료 정본이 둘로 갈려 `CLAUDE.md` 5장(캐시 한 곳)과 충돌 · 횡단 상세 응답이 커서 메시지 비용 큼.
- 크기 : 큼 (수백 줄 + 충돌 처리). 비추천.
- C. 읽기 전용 거울 (팝업은 종단도 그림 + 선택 표시만, 편집은 메인)
- 장 : 단순(BroadcastChannel 로 선택 측점·종단 자료 복사).
- 단 : 편집 도구(▲▼·직선화·유토곡선 표)를 쓰려는 목적이면 의미 없음.
## 한계·확인 필요
- ORCA 내장 브라우저에서 `window.open` 팝업이 뜨는지 확인 안 함 — 되는지 먼저 한 번 시험 필요(안 되면 공용 브라우저에서만 검증).
- 팝업 차단 : 반드시 단추 클릭 안에서 열어야 함.
- 메인 창 닫기·이동 시 팝업 정리, 팝업 위치·크기 기억(취향 저장소 `pref` 에 한 칸)은 부가 작업.
- 두 창을 동시에 켜는 쓰기 충돌은 A 에서는 없음 (한 인스턴스).
# 요약 다섯 줄
1. ① 카드 높이는 폭에 비례(그림이 CSS 확대 없이 px 그대로) → 폭을 줄이면 축척 유지한 채 높이가 줄어듦.
2. 추천 B : 열 수를 칸 높이에 맞춰 자동 선택(1.5줄) + 카드 최소·최대 폭 상한 · 약 50줄 · 최소 폭 값은 협의 필요.
3. 한계 : 여백 36·머리방 58·바닥 250 은 안 줄어서 칸이 낮은 화면에서는 1.5줄에 못 미칠 수 있음.
4. ② 종단 패널은 지금 한 벌 + 같은 창 메모리·세션 저장소에 기댐 → 팝업에 별도 앱을 띄우면 동기화가 크게 어려움.
5. 추천 A : 코드는 메인에 두고 화면 조각만 팝업으로 옮김(자료 공유 불필요) · 창 전역 리스너 약 10곳과 메뉴 손봐야 함 · ORCA 에서 팝업 되는지 먼저 확인.
@@ -0,0 +1,19 @@
# 54-44 새 검증 프로젝트 13
원본 입력 = 랩탑_보조(936be972…) · 새 로직 자동설계: 검증_랩탑메인 · 검증_sub1 · 검증_sub7 / 나머지 10 = 검증_랩탑메인 복제(tools_clone_project)
| 이름 | 소유 user | 프로젝트 id | 상태 | B05 (구조물 · 관 · 첫 관 기본값) |
| --- | --- | --- | --- | --- |
| 검증_랩탑메인 | 3 | 226fc805-26c8-4f5a-9956-bacb200e10a5 | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub1 | 3 | 7e420ed6-f940-4d12-a1a5-39cdcf70a391 | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub7 | 3 | 6d3b2812-6d5a-4168-a932-40e4ae303d5a | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub2 | 3 | c9fcb148-00e9-45fb-80b9-685e36bc694b | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub3 | 3 | 1f93a515-df0a-4975-a8ba-daaa7672b123 | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub4 | 3 | 269f0a78-bac2-4eff-b8ed-c96cf9327839 | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub5 | 3 | bec7fe41-83e7-4df7-86a3-fdddaa1f8fec | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub6 | 3 | 2a505e36-591f-462a-8240-23ea655a6a91 | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_sub8 | 3 | 1bb0f876-983f-4ca5-9cc7-f59ee1f77e0a | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_데스크탑메인 | 3 | 3e331b49-05e7-43f8-b464-bf06e05d9516 | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 검증_데스크탑서브 | 3 | b97e52f4-a649-4be0-92cc-27b2f9458b2a | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 엄상준_검증 | 10 | d2245e3b-0468-4a90-ac5c-50b2adcb56e7 | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
| 박동철_검증 | 9 | f1277414-39a7-476c-9dce-ab27e0b11cba | WF3_ANALYZING | 구조물 0 · 관 11 · 첫 관 options {"pipe_diameter_mm": 1000, "pipe_kind": "파형강관", "inlet_type": "집수정", "inlet_basin_length_m": 2, "inlet_basin_before_m": 1, "inlet_basin_after_m": 1, "inlet_basin_height_m": 1.5, "inlet_revet_form": "돌쌓기(찰)", "inlet_revet_length_m": 10, "inlet_revet_before_m": 5, "inlet_revet_after_m": 5, "inlet_revet_height_m": 1.5, "outlet_type": "기슭막이", "outlet_revet_form": "돌쌓기(찰)", "outlet_revet_length_m": 10, "outlet_revet_before_m": 5, "outlet_revet_after_m": 5, "outlet_revet_height_m": 1.5, "inlet_structure": "L"} |
@@ -0,0 +1,55 @@
# 54-45 횡단 형상 제약표 — 배관 · 흙막이 · 옹벽
범위: 관 · 집수정 · 관 보호공 흙막이(유입·유출) · 추가 흙막이(다단) · 사면안정 흙막이 · 옹벽. 화면 = 서버(같은 TS 를 Node 번들로 돎 — `config/server_calc_node`). 줄 번호는 B06_Section 기준.
## 풂
| # | 무엇 | 어디 | 값 | 처리 |
|---|---|---|---|---|
| 1 | 관 유출 흙막이 — 원지반에 묻히면 위로 0.05m씩 되돌림(매몰-무교차 자리 금지) | 옛 `Culvert_Solve.ts:400` `requireCrossing` · 화면/서버 | 3도 절토선 교차 없으면 금지 | 이번에 풂 |
| 2 | 독립 기슭막이 유입 벽 — 1과 같은 되돌림 | 옛 `Culvert_Geom.ts:224` · 화면/서버 | 같음 | 이번에 풂 |
| 3 | 관 유입 흙막이 ▼ — 유출 벽이 원지반에 못 서면 유입도 못 내려감 | 옛 `Culvert_Solve.ts:436` `outletReceivable` · `placeInletWall` 가드 | 0.05m씩 되돌림 | 이번에 풂 |
| 4 | 사면안정 흙막이 · 옹벽 — 묻히는 자리면 위 · 안쪽으로 되돌림 | 옛 `Cross_Revetment.ts:209` `placeable` | 3도 절토선 교차 없으면 금지 | 이번에 풂 |
| 5 | 추가 흙막이 — 묻히는 자리면 d · x 되돌림 | 옛 `Culvert_Extra.ts:320` `placeable` | 이음선 위 지반 · 0.5m 이상 매몰 금지 | 이번에 풂 |
| 6 | 추가 흙막이 — 시작점이 원지반 아래면 다단 끊음 | 옛 `Culvert_Extra.ts:241` | 단 수 줄어듦 | 이번에 풂(`Culvert_Extra.ts:241`) |
| 7 | 추가 흙막이 — 남은 성토 0.7m 미만이면 다단 끊음 | 옛 `Culvert_Extra.ts:244` | 0.7m | 이번에 풂 |
| 8 | 추가 흙막이 — 앉을 지형 없으면 단 안 세움 | 옛 `Culvert_Extra.ts:296` | 지형 높이 0.05m 미만 | 이번에 풂 — 시작점 바로 밖에 섬(`Culvert_Extra.ts:295`) |
| 9 | 「좌우 이동 지형에 막힘」 값(`shiftBlockedM`) | 옛 `Culvert_Extra.ts:383` | 요청 − 적용 | 이번에 풂 — 막힘이 없어 안 나옴 |
| 10 | 형태별 높이 한도(메 2.0 · 찰 3.0 · 콘크리트 5.0) 자르기 | 54-42 지움 | — | 54-42 풂 |
| 11 | 추가 흙막이 원지반 맞춤 늘이기 | 54-42 지움 | — | 54-42 풂 |
## 남김
| # | 무엇 | 어디 | 값 | 남긴 까닭 |
|---|---|---|---|---|
| 12 | 벽 윗면 노면 위 금지 | `Cross_Wall.ts:70` · `Culvert_Solve.ts:388`(d 하한) · `Cross_Revetment.ts:212`(d ≥ 0) | 노면 표고에서 멈춤 | 브레인 규칙 ① |
| 13 | 관 길이 m 단위 — 유출 흙막이 자리 = 관 끝 | `Culvert_Geom.ts:248` · `:435` | 올림 정수 m | 브레인 규칙 ② |
| 14 | 최소 토피 — 유입 관 끝 ≤ 노면 − 관경 − 토피 | `Culvert_Geom.ts:128` · `Culvert_Const.ts:14` | 0.5m | 관 규칙(노면 기준 · 원지반 아님) |
| 15 | 역경사 금지 — 유출 관 끝 ≤ 유입 관 끝 · 유출 흙막이 ▲ 한도 | `Culvert_Geom.ts:240` · `:401` · `Culvert_Solve.ts:390` | 실측 440.2: ▲ −5 요청 → d 0.5 | 물 흐름(관 규칙) · 유입이 원지반 자동값이면 간접으로 걸림 |
| 16 | 관 시작 관 끝 자동값 = 원지반(토피 상한 안) | `Culvert_Geom.ts:129` · `:186` | 자동 자리만 | 벽을 움직이면 벽 자리를 따라감 — 잠금 아님 |
| 17 | 관 흙막이 최소 높이 | `Culvert_Const.ts:142` | 관경 + 1.0m | 관이 벽 위로 · 바닥으로 안 나오게 |
| 18 | 흙막이 좌우 노견 안쪽 금지 | `Culvert_Solve.ts:393` · `Cross_Revetment.ts:208` | x ≥ 0 | 원지반 무관 · 도로 안으로 못 들어감 |
| 19 | 성토선 1:1.2 각도 유지 — 선반 하한 | `Culvert_Extra.ts:317` · `Cross_Revetment.ts:210` | x ≥ 1.2·d(실측 d 3 → x 3.6) | 원지반 무관 · 성토 물매 |
| 20 | 다단 관통 금지 — 아랫단 윗면 ≤ 윗단 바닥 | `Culvert_Extra.ts:300` | 실측 d 0 요청 → 0.5~0.9 | 벽끼리 규칙 |
| 21 | 다단 수 | `Cross_Structure_Panel.ts:340` | 0~9 | 화면 칸 한도 |
| 22 | 벽 최저 높이 | `Culvert_Extra.ts:253` · `Cross_Revetment.ts:184` | 근입 + 0.1 = 0.6m | 형상이 안 무너지게 |
| 23 | 근입 깊이 고정 | `Culvert_Const.ts:76` | 0.5m | 기하 기준선 |
| 24 | 벽 두께 | `Culvert_Const.ts:17` | 0.45m | 기하 기준 |
| 25 | 전면 기울기 = 표준경사 표(형태 무관) | `Cross_Lean.ts:22` | 단면유형 × 설치 측 × 높이 | 54-42 결정 |
| 26 | 집수정 I형 벽 바닥 원지반까지 묻음 | `Culvert_Basin.ts:244` | 지반 − 부재두께 | 집수정 — 54-45 벽 범위 밖 · 사용자 확인 필요 |
| 27 | 집수정 ㄴ·ㄷ 기본 판정(절토선 없으면 I) | `Culvert_Basin.ts:51` | 기본값만 | 고른 값은 그대로 · 잠금 아님 |
| 28 | 집수정 내공 | `Cross_Structure_Panel.ts:309` | 1~2m | 화면 칸 한도 |
| 29 | 집수정 좌우 노견 안쪽 금지 | `Cross_View_Structure.ts:134` | ≥ 0 | 원지반 무관 |
| 30 | 사면안정 흙막이 · 옹벽 설치 측 빈 칸 = 성토 쪽 · 양측 절토면 안 그림 | `Cross_Revetment.ts:175` | — | 단면유형 규칙(원지반 아님) |
| 31 | 성토사면 5m 초과 경고 | `Culvert_Const.ts:180` · `Cross_Culvert.ts:114` | 5m | 경고만 · 잠금 아님 |
| 32 | 바닥 원지반 이격 경고 | `Cross_Culvert.ts:186` · `Cross_Revetment.ts:372` | 이격 m | 경고만 · 잠금 아님 |
| 33 | 유입 흙막이 선택지 판정(`revetAllowed`) | `Culvert_Basin.ts:417` | 원지반 > 토피 상한 | 계산만 · 쓰는 곳 없음 — 잠금 아님 |
## 확인 수치(검증_sub7 · 화면 eval = 서버 번들)
- 440.2 · 85.1 · 720.4 관 — 유출 d 8 · x 1 그대로(깊게) · x 9 그대로(멀리 · 이격 4.3~7.2m) · 다단 2단 d 3 그대로
- 옹벽(성토 측점에 붙임) — d 6 그대로 · ▲ −3 → 0(노면 멈춤) · 3단 중 3단
- 440.2 유출 흙막이 ▼ 8번 누름 → 캐시 d 10 남음(되돌림 없음)
- 서버 면적 = 화면 9건 전부 같음(절토 · 성토 ㎡ 소수 넷째 자리)
제약 33(남김 22)
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
C:\Users\umsan\AppData\Local\Programs\Python\Python312\python.exe
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long