feat(B05): 3D 새 ① 브레이크라인 국소 재삼각분할 · 구조물 둘레 드레이프 · 밴드 좁힘 · 3D 방식 고르기 한 줄(115-5 P1 · P2)
- 노면 끝 · 비탈 끝 · 단면 꺾임 · 비탈 마구리 · 구조물 윗면 외곽 · 관 입구 선을 지형에 끼워 걸친 삼각형만 다시 나눔(변 교점 꼭짓점 번호 순 식 · 일직선 마디 되살림) · 색은 면 단위 - 구조물 구멍은 윗면 외곽만 · 풋프린트 안 · 둘레 0.75 m 띠는 솔리드 윗면 아래로 · 관 입구만 구멍 - 손대는 자리 = 행별 비탈 끝 + 5 m 띠(밖 지형 그대로) - 3D 보기 줄 「3D 방식: 지금 · 옛 A · 새 ① · 제안 ②」 — 방식 등록부(B05_Profile_UI_Corridor_Modes.ts) · 설정 키 corridor-mode 하나(옛 두 키 읽어서 옮김) · 기본 새 ① · 제안 ② 는 빈자리(단추 꺼짐) - 226 실측: T자 균열(1 cm 넘음) 298 → 0 · 구조물 둘레 0.1 m 넘음 57 % → 12 % · 색 번짐 p90 3.1 → 0 m · 발끝 어긋남 p90 2.0 → 0.15 m Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013rJwJMVL4EE31y77TB11AP
This commit is contained in:
@@ -6,11 +6,12 @@
|
||||
|
||||
import { L, button, toggleButton } from "./B05_Profile_UI_Panel_Fields";
|
||||
import {
|
||||
corridorDeformOn,
|
||||
corridorLegacyOn,
|
||||
setCorridorDeform,
|
||||
setCorridorLegacy,
|
||||
} from "./B05_Profile_UI_Viewer_Corridor";
|
||||
corridorModeId,
|
||||
MODE_SLOTS,
|
||||
modeOf,
|
||||
onCorridorMode,
|
||||
setCorridorMode,
|
||||
} from "./B05_Profile_UI_Corridor_Modes";
|
||||
|
||||
/** 뷰 조작 줄이 부르는 것 — 좌측 패널 콜백의 일부다. */
|
||||
export interface ViewControlCallbacks {
|
||||
@@ -62,16 +63,34 @@ export function createViewControls(callbacks: ViewControlCallbacks): {
|
||||
return { kind, element };
|
||||
});
|
||||
viewButtons.append(...projectionButtons.map(({ element }) => element));
|
||||
// 3D 방식 고르기 한 줄(115-5) — 원근 · 직교와 같은 꼴. 등록 안 된 자리(제안 ②)는 꺼짐.
|
||||
const modeButtons = document.createElement("div");
|
||||
modeButtons.className = "b05-route__view-group";
|
||||
const modeLabel = document.createElement("span");
|
||||
modeLabel.className = "b05-route__view-label";
|
||||
modeLabel.textContent = "3D 방식";
|
||||
const modeChoices = MODE_SLOTS.map(([id, label]) => {
|
||||
const element = button(label, () => setCorridorMode(id), "glass");
|
||||
element.disabled = !modeOf(id);
|
||||
if (element.disabled) element.title = "아직 없는 방식입니다.";
|
||||
return { id, element };
|
||||
});
|
||||
const showMode = (): void => {
|
||||
const current = corridorModeId();
|
||||
modeChoices.forEach(({ id, element }) => {
|
||||
element.classList.toggle("is-active", id === current);
|
||||
element.setAttribute("aria-pressed", String(id === current));
|
||||
});
|
||||
};
|
||||
showMode();
|
||||
onCorridorMode(showMode);
|
||||
modeButtons.append(modeLabel, ...modeChoices.map(({ element }) => element));
|
||||
const visibilityButtons = document.createElement("div");
|
||||
visibilityButtons.className = "b05-route__view-group";
|
||||
visibilityButtons.append(
|
||||
toggleButton("지표면", true, callbacks.onSurfaceVisible),
|
||||
// 예상형상(2026-08-23): ON=공사 후 형상(기본), OFF=원지반 완전체.
|
||||
toggleButton("예상형상", true, callbacks.onCorridorVisible),
|
||||
// 예상형상 그리기(115-1) — 켬 = 새 방식(지형 메시 변형) · 끔 = 옛 방식(스케치 · 패치).
|
||||
toggleButton("새 방식", corridorDeformOn(), setCorridorDeform),
|
||||
// 옛 방식 A(115-4) — 08-25 실루엣 갈아 끼우기 · 켜면 새 방식 단추와 상관없이 A 형상.
|
||||
toggleButton("옛 방식 A(실루엣)", corridorLegacyOn(), setCorridorLegacy),
|
||||
toggleButton("등고선", true, callbacks.onContoursVisible),
|
||||
toggleButton("축 표시", false, callbacks.onAxesVisible),
|
||||
toggleButton(L("B05_Route_Field_StationLines"), true, callbacks.onStationLinesVisible),
|
||||
@@ -102,9 +121,12 @@ export function createViewControls(callbacks: ViewControlCallbacks): {
|
||||
separator1.className = "b05-route__view-separator";
|
||||
const separator2 = separator1.cloneNode() as HTMLSpanElement;
|
||||
const separator3 = separator1.cloneNode() as HTMLSpanElement;
|
||||
const separator4 = separator1.cloneNode() as HTMLSpanElement;
|
||||
viewControls.append(
|
||||
viewButtons,
|
||||
separator1,
|
||||
modeButtons,
|
||||
separator4,
|
||||
visibilityButtons,
|
||||
separator2,
|
||||
button("뷰 초기화", callbacks.onResetView, "glass"),
|
||||
|
||||
Reference in New Issue
Block a user