refactor(472-2 2-C 공용 걷어내기): 부름 0 인 DESIGN_VIEW_ROUTES · ALIGNMENT_DRAFT_KEY_PREFIX · structureStatus · bermSpec · MASS_HAUL_HEIGHT · createMassHaulSummary · 세션 열쇠 culvertmove 지움 · std-cross 낡은 주석(context 가 저장분 내림) · 공용 머리 시험 경로 tmp/tests → resources/tester · 위키 세션 열쇠 표 한 줄

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-19 08:46:56 +09:00
co-authored by Claude Opus 5.5
parent c856a08492
commit 9afa4e303f
14 changed files with 17 additions and 126 deletions
-9
View File
@@ -51,15 +51,6 @@ export function sideBerm(berm: BermSpec | null, side: string): BermSpec | null {
return own === undefined || own === null ? berm : { ...berm, depthM: Math.max(own, 0) };
}
export function bermSpec(
widthM = BERM_DEFAULT_WIDTH_M,
intervalM = BERM_DEFAULT_INTERVAL_M,
slopeDeg = BERM_DEFAULT_SLOPE_DEG,
depthM = BERM_DEFAULT_DEPTH_M,
): BermSpec {
return { widthM, intervalM, slopeDeg, depthM };
}
/**
* 짝: `cut_profile_points`. 절토 사면 꼭짓점 `[[거리, 표고], ...]` — 시작에서 바깥으로.
*
+1 -1
View File
@@ -6,7 +6,7 @@
* 짝: `B06_Section/B06_Section_Engine_Design.py` (`compute_cross_design`)
* 면적 적분은 `common_util_cross_design_areas.ts` ↔ `B06_Section_Engine_Areas.py`.
* 회귀 테스트가 두 구현을 같은 입력으로 실제 비교한다:
* `tmp/tests/test_b06_cross_design_mirror.py` — 어느 쪽을 고치든 반드시 같이 돌릴 것.
* `resources/tester/test_b06_cross_design_mirror.py` — 어느 쪽을 고치든 반드시 같이 돌릴 것.
*
* ── 왜 같은 계산이 두 벌인가 (2026-09-03 사용자 확정) ────────────────
* 사용자가 계획선을 만지는 동안의 계산은 **브라우저 안에서 끝나야 한다**. 조작은 세션
@@ -5,7 +5,7 @@
* ⚠⚠ 파이썬 짝 파일과 **한 벌**이다 — 한쪽만 고치면 두 화면 값이 갈린다 ⚠⚠
* 짝: `B06_Section/B06_Section_Engine_Areas.py`
* 같은 입력에 같은 값을 내야 한다. 회귀 테스트가 두 구현을 실제로 비교한다:
* `tmp/tests/test_b06_cross_design_mirror.py` — 고칠 때 반드시 같이 돌릴 것.
* `resources/tester/test_b06_cross_design_mirror.py` — 고칠 때 반드시 같이 돌릴 것.
* 왜 두 벌인가: 사용자 조작 중 계산은 브라우저 안에서 끝나야 하고(2026-09-03 사용자
* 확정), 저장·확정·도면 산출은 서버가 정본으로 다시 계산하기 때문이다.
*
+1 -1
View File
@@ -3,7 +3,7 @@
* 배수관 세트(배관·기슭막이·보호공·세월교·BOX암거·물넘이포장) 제원 — **브라우저 몫**.
*
* ⚠ 파이썬 `B06_Section/B06_Section_Engine_Culvert.py` 와 **한 벌**이다(2026-09-06).
* 한쪽만 고치면 화면과 저장본이 갈린다. 거울 테스트: `tmp/tests/test_b06_culvert_sets_mirror.py`
* 한쪽만 고치면 화면과 저장본이 갈린다. 거울 테스트: `resources/tester/test_b06_culvert_sets_mirror.py`
*
* 왜 짝으로 두나(CLAUDE.md 5장 「계산 자리」) — 이 계산은 종횡단 **상세를 읽을 때마다**
* 서버에서 돈다. 매 요청 도는 자리라 Node 왕복(코리도·구조물 면적 방식)이 비싸다.
+1 -1
View File
@@ -1,7 +1,7 @@
"""터파기 단면 — 관·벽 두 갈래. **근거의 급이 다르므로 갈라 둔다.**
⚠⚠ TS 짝 파일과 **한 벌**이다 — `common_util/common_util_excavation.ts`.
거울 시험: `tmp/tests/test_excavation_mirror.py` (고칠 때 같이 돌릴 것).
거울 시험: `resources/tester/test_excavation_mirror.py` (고칠 때 같이 돌릴 것).
화면(B06 횡단도)이 그리고 서버(B08 수량)가 세는 값이라 두 쪽에 같은 수가 있어야 한다.
① 관 — **법정 시방서에 표가 있다**
+1 -1
View File
@@ -3,7 +3,7 @@
* 터파기 단면 — 관·벽 두 갈래. **근거의 급이 다르므로 갈라 둔다.**
*
* ⚠⚠ 파이썬 짝과 **한 벌**이다 — `common_util/common_util_excavation.py`.
* 거울 시험: `tmp/tests/test_excavation_mirror.py`. 어느 쪽을 고치든 같이 돌릴 것.
* 거울 시험: `resources/tester/test_excavation_mirror.py`. 어느 쪽을 고치든 같이 돌릴 것.
* 화면(B06 횡단도)이 그리고 서버(B08 수량)가 세는 값이라 두 쪽 수가 같아야 한다.
*
* ① 관 — 법정 시방서에 표가 있다: `KCS 44 40 10 배수관(23.01) §3.2(4) 그림 3.2-1`.
+1 -77
View File
@@ -1,14 +1,11 @@
/* =============================================================================
* common_util_mass_haul_legend.ts
* 유토곡선 곡선 이름 · 범례 줄 · 총괄 요약 줄(`common_util_mass_haul_view` 에서 나눔).
* 유토곡선 곡선 이름 · 범례 줄(`common_util_mass_haul_view` 에서 나눔).
* ========================================================================== */
import type { MassHaulBasis, MassHaulSeries } from "./common_util_mass_haul";
import type { HaulPlan } from "./common_util_mass_haul_balance";
import type { LocaleKey } from "@ui/ui_template_locale";
import { MASS_HAUL_BALANCE_KEY } from "./common_util_mass_haul";
import { haulPlanChips } from "./common_util_mass_haul_balance_view";
import { formatVolume } from "./common_util_mass_haul_callout";
import { L } from "./common_util_svg";
const BASIS_LABEL: Record<MassHaulBasis, LocaleKey> = {
@@ -81,76 +78,3 @@ export function createMassHaulLegend(
}
return legend;
}
/**
* 곡선 아래 총괄 요약 줄. 절토는 자연상태(내역 기준)와 환산 후(곡선 기준)를 함께 적는다.
* 곡선이 여러 개라 수치가 어느 곡선의 것인지 끝에 반드시 밝힌다.
*/
export function createMassHaulSummary(
series: MassHaulSeries,
haulPlan: HaulPlan | null,
): HTMLElement {
const result = series.result;
const row = document.createElement("div");
row.className = "b06-masshaul__summary";
const cut = result.cut_natural_m3;
const cutTotal = cut.soil + cut.ripping_rock + cut.blasting_rock;
/* 요약 줄이 12칩까지 늘어 한눈에 안 읽혔다(2026-08-19 사용자 지적). 판단에 쓰는
* 값만 칩으로 남기고, 세부 내역은 그 칩의 툴팁으로 내린다.
* 절토(자연) — 토질 3종 내역은 툴팁
* 성토(다짐) — 절토 다짐 환산은 툴팁(토량환산계수 f 적용 결과)
* 잉여 또는 부족 — 둘은 동시에 성립하지 않는다
* 운반·검산 — 토량 분배를 켰을 때만(haulPlanChips)
* B05 종단 패널과 B06 횡단 화면이 같은 함수를 쓰므로 양쪽이 함께 바뀐다. */
const chips: Array<[string, string, string?]> = [
[
L("B06_MassHaul_CutNatural"),
`${formatVolume(cutTotal)}㎥`,
[
`${L("B06_Design_Ground_Soil")} ${formatVolume(cut.soil)}㎥`,
`${L("B06_Design_Ground_Ripping")} ${formatVolume(cut.ripping_rock)}㎥`,
`${L("B06_Design_Ground_Blasting")} ${formatVolume(cut.blasting_rock)}㎥`,
].join(" · "),
],
[
L("B06_MassHaul_Fill"),
`${formatVolume(result.fill_compacted_m3)}㎥`,
`${L("B06_MassHaul_CutCompacted")} ${formatVolume(result.cut_compacted_m3)}㎥`,
],
];
// 잉여와 부족은 동시에 성립하지 않으므로 해당하는 쪽만 보여 준다.
chips.push(
result.shortage_m3 > 0
? [L("B06_MassHaul_Shortage"), `${formatVolume(result.shortage_m3)}㎥`]
: [L("B06_MassHaul_Surplus"), `${formatVolume(result.surplus_m3)}㎥`],
);
// 절·성토 균형 지표 — 판정·조정은 사용자 몫이고 프로그램은 값만 드러낸다(2026-09-03
// 사용자 확정). 곡선이 0선을 넘지 않으면 평형선·운반 블록이 아예 생기지 않으므로,
// 벌룬이 없을 때 왜 없는지를 이 값 하나로 읽을 수 있어야 한다.
const finalCumulative = result.points.length
? result.points[result.points.length - 1].cumulative_volume_m3
: 0;
chips.push([
L("B06_MassHaul_FinalCumulative"),
`${formatVolume(finalCumulative)}㎥`,
L("B06_MassHaul_FinalCumulative_Tip"),
]);
// 토량 분배를 켜 두면 운반 총량·검산이 뒤에 붙는다(사토·토취는 발생 지점 기준 합계).
chips.push(...haulPlanChips(haulPlan));
for (const [label, value, tip] of chips) {
const chip = document.createElement("span");
chip.className = "b06-masshaul__chip";
if (tip) chip.title = tip;
const name = document.createElement("em");
name.textContent = label;
const amount = document.createElement("strong");
amount.textContent = value;
chip.append(name, amount);
row.append(chip);
}
const basis = document.createElement("span");
basis.className = seriesClass(series, "b06-masshaul__basis");
basis.textContent = massHaulSeriesLabel(series);
row.append(basis);
return row;
}
+1 -3
View File
@@ -14,7 +14,7 @@
* (1공구 V=1:10,000 / 3공구 V=1:50,000) 고정 축척을 쓰면 안 된다.
* 근거: docs/raw/2026-08-02_유토곡선_3공구_분석.md 3.2절
*
* 값 표기 · 말풍선 = `common_util_mass_haul_callout` · 곡선 이름 · 범례 · 요약 = `common_util_mass_haul_legend`.
* 값 표기 · 말풍선 = `common_util_mass_haul_callout` · 곡선 이름 · 범례 = `common_util_mass_haul_legend`.
* ========================================================================== */
import type { MassHaulPoint, MassHaulSeries } from "./common_util_mass_haul";
@@ -113,8 +113,6 @@ const WINDOW_EASE = 0.2;
/** 축 눈금이 읽히는 최소 높이. 이보다 낮아지면 그래프가 뭉개진다. */
export const MASS_HAUL_MIN_HEIGHT = 90;
/** 패널을 건드리지 않았을 때의 유토곡선 높이. */
export const MASS_HAUL_HEIGHT = 190;
/**
* 유토곡선 전용 상하 여백. 좌우는 종단면도와 **반드시 같아야**(LONG_PAD) X축이 맞으므로