Merge remote-tracking branch 'origin/sub_laptop_7' into main_laptop_1

This commit is contained in:
2026-10-07 08:20:34 +09:00
6 changed files with 61 additions and 66 deletions
+1 -25
View File
@@ -21,11 +21,7 @@ import type {
PipeEnd,
WallLayout,
} from "./B06_Section_UI_Cross_Culvert_Geom";
import {
appendPipeTrench,
appendWallTrench,
foundationChoice,
} from "./B06_Section_UI_Cross_Excavation";
import { appendWallTrench, foundationChoice } from "./B06_Section_UI_Cross_Excavation";
import { appendWallHatch } from "./B06_Section_UI_Cross_Wall_Hatch";
// 기하 계산 진입점과 공개 상수·타입은 여기서 재수출한다 — B05(최소 토피)와 횡단 뷰가
@@ -280,26 +276,6 @@ export function appendCulvertOverlay(
const inletFinal = pushOut(pipeCorners.inlet, -1);
const outletFinal = pushOut(pipeCorners.outlet, 1);
// 관 터파기 — 표값 폭으로 관 위 지반선에서 관 바닥까지 수직(KCS 44 40 10 그림 3.2-1).
if (!hidePipe) {
const invert = Math.min(
pipeCorners.inlet.bottom.elevation,
pipeCorners.outlet.bottom.elevation,
);
const centerOffset = (pipeCorners.inlet.bottom.offset + pipeCorners.outlet.bottom.offset) / 2;
appendPipeTrench(
layer,
{
centerOffsetM: centerOffset,
invertM: invert,
topM: invert + diameter + culvert.min_cover_m,
diameterMm: Math.round(diameter * 1000),
},
x,
toDisplayY,
);
}
const kindLabel = culvert.pipe_kind ? `${culvert.pipe_kind} ` : "";
const wallThickness = pipeWallThicknessM(culvert.pipe_kind, diameter);
const tip =
+4 -1
View File
@@ -24,7 +24,10 @@ import type {
SectionMode,
SectionSample,
} from "./B06_Section_Api_Fetch";
export { appendPavementOverlay } from "./B06_Section_UI_Cross_Design_Surface";
export {
appendPavementOverlay,
appendRockBoundaryOverlay,
} from "./B06_Section_UI_Cross_Design_Surface";
const SVG_NS = "http://www.w3.org/2000/svg";
@@ -2,6 +2,33 @@ import type { CrossDesign } from "./B06_Section_Api_Fetch";
const SVG_NS = "http://www.w3.org/2000/svg";
export function appendRockBoundaryOverlay(
svg: SVGElement,
samples: Array<{ offset_m?: number; elevation_m?: number | null; valid: boolean }>,
offsetM: number,
x: (offset: number) => number,
y: (elevation: number) => number,
): void {
const segments: string[][] = [];
let current: string[] = [];
for (const sample of samples) {
const elevation = sample.elevation_m;
if (sample.valid === false || elevation === null || !Number.isFinite(elevation ?? NaN)) {
if (current.length > 1) segments.push(current);
current = [];
continue;
}
current.push(`${x(sample.offset_m ?? 0)},${y((elevation as number) + offsetM)}`);
}
if (current.length > 1) segments.push(current);
for (const points of segments) {
const polyline = document.createElementNS(SVG_NS, "polyline");
polyline.setAttribute("points", points.join(" "));
polyline.setAttribute("class", "b06-chart__rock-boundary");
svg.append(polyline);
}
}
export function appendPavementOverlay(
svg: SVGElement,
design: CrossDesign,
+1 -40
View File
@@ -1,6 +1,6 @@
/* =============================================================================
* B06_Section_UI_Cross_Excavation.ts
* 횡단도에 **터파기 선**을 얹는다 — 관·벽 두 갈래(2026-09-09 사용자 확정 ④).
* 횡단도에 **벽 터파기 선**을 얹는다 — 관 터파기 선은 그리지 않음(사용자 10-7).
*
* 왜 있나 — 「터파기가 현재 횡단도에서 표현이 안 된다」가 사용자 지적이었다. 수량을
* 세기 전에 **도면에 그것이 보여야** 한다.
@@ -13,14 +13,12 @@
* ========================================================================== */
import {
BASIS_PIPE,
BASIS_WALL,
WALL_BLINDING_DEPTH_M,
WALL_BLINDING_WIDTH_M,
WALL_FOUNDATION_DEPTH_M,
WALL_FOUNDATION_WIDTH_M,
WALL_TRENCH_CLEARANCE_M,
pipeTrenchWidthM,
} from "@util/common_util_excavation";
import type { WallLayout } from "./B06_Section_UI_Cross_Culvert_Types";
@@ -44,43 +42,6 @@ function trenchPath(layer: SVGElement, corners: Array<[number, number]>, tooltip
layer.append(line);
}
/**
* 관 터파기 — **표값 폭**으로 관 위 지반선에서 관 바닥까지 수직으로 판다.
* 표에 없는 관경이면 **아무것도 그리지 않는다**(폭을 지어내지 않는다).
*/
export function appendPipeTrench(
layer: SVGElement,
input: {
/** 관 중심 offset(m). */
centerOffsetM: number;
/** 관 바닥(invert) 표고. */
invertM: number;
/** 터파기 윗면 표고 — 관 위 지반(또는 노면)선. */
topM: number;
diameterMm: number | null | undefined;
},
x: (offset: number) => number,
toDisplayY: (elevation: number) => number,
): number | null {
const width = pipeTrenchWidthM(input.diameterMm);
if (width === null || !(input.topM > input.invertM)) return null;
const half = width / 2;
const left = input.centerOffsetM - half;
const right = input.centerOffsetM + half;
trenchPath(
layer,
[
[x(left), toDisplayY(input.topM)],
[x(left), toDisplayY(input.invertM)],
[x(right), toDisplayY(input.invertM)],
[x(right), toDisplayY(input.topM)],
],
`관 터파기 폭 ${width.toFixed(2)}m · 깊이 ${(input.topM - input.invertM).toFixed(2)}m\n` +
`Φ${Math.round(Number(input.diameterMm))}㎜ — ${BASIS_PIPE}`,
);
return width;
}
/**
* 벽 터파기 — 벽 바닥선 아래로 **수직**. 폭은 바닥 폭 + 여유 0.2, 깊이는 기초 몫.
* `foundation` 이 비어 있으면 **그리지 않는다** — 사용자가 고르기 전에는 근거가 없다.
+11
View File
@@ -26,6 +26,7 @@ import { appendRevetmentOverlay, computeRevetmentLayout } from "./B06_Section_UI
import {
appendCrossDesignOverlay,
appendPavementOverlay,
appendRockBoundaryOverlay,
type RockBoundaryControl,
} from "./B06_Section_UI_Cross_Design";
import { appendCardFooter, appendCardHeader } from "./B06_Section_UI_Cross_Card_Chrome";
@@ -488,6 +489,16 @@ export function createCrossSectionCard(
// 사토장(유용토운반작업장) — 교본 6장 3절이 횡단도 표시를 요구한다. 값은 설계 결과에서
// 그대로 오고 여기서 다시 세지 않는다. 선 종류는 터파기 파선과 갈라 둔다.
appendSpoilFillOverlay(plotLayer, section.design, x, toDisplayY);
// 암 경계선 = 지면선 복사 + 오프셋(계획선 기준 아님).
if (rockBoundary && section.design.geometry_preset === "rock") {
appendRockBoundaryOverlay(
plotLayer,
drawSamples,
rockBoundary.offsetFor(section),
x,
toDisplayY,
);
}
// 배수관 세트 — 조정창이 쓸 카드 상태를 받아 둔다(2026-08-19) · 링크 카드도 채운다(2026-08-24).
culvertInletIsBasin = !!culvertLayout?.basin;
culvertHiddenPipe = culvertLayout?.culvert.hidden_pipe === true;
@@ -168,6 +168,16 @@
pointer-events: none;
}
/* 암 경계선(설계선 복사 + 오프셋): 리핑암·발파암 구간 점선 */
.b06-chart__rock-boundary {
fill: none;
stroke: var(--color-warning);
stroke-width: 1.6;
stroke-dasharray: 6 4;
stroke-linejoin: round;
opacity: 0.9;
}
/* 포장층 박스: 노면 양 끝점 기준 두께만큼 하향 채움 */
.b06-chart__pavement {
fill: color-mix(in srgb, var(--color-text-secondary) 30%, transparent);
@@ -291,6 +301,13 @@
fill: var(--color-text-secondary);
}
/* 유입 보호공 공간 확보 절토선 — 말단에서 표준단면 절토경사로 지반까지 */
.b06-chart__culvert-cut {
stroke: var(--color-warning);
stroke-width: 1.4;
stroke-dasharray: 5 3;
}
/* 기슭막이 돌 해칭 — 기운 띠 안에 한 줄로 쌓인 큰 돌(실무 도면 형상) */
.b06-chart__culvert-stone {
fill: none;