main_laptop_1 -> main byeonghap (4 hwangyeong 585 commits) #12

Merged
eomsangdon merged 585 commits from main_laptop_1 into main 2026-09-08 17:26:30 +09:00
2 changed files with 14 additions and 60 deletions
Showing only changes of commit 79dc0cc82d - Show all commits
+8 -38
View File
@@ -308,41 +308,6 @@ export function createRouteMassHaulPanel(onChanged: () => void): RouteMassHaulPa
bar.append(empty);
}
/** 곡선 계산 아낌 — 입력 객체가 그대로면 다시 계산하지 않는다. */
let seriesCache: {
longitudinal: RouteMassHaulDrawParams["longitudinal"];
crossSections: RouteMassHaulDrawParams["crossSections"];
context: RouteMassHaulContext;
series: MassHaulSeries[];
} | null = null;
function cachedSeries(
params: RouteMassHaulDrawParams,
current: RouteMassHaulContext,
): MassHaulSeries[] {
if (
seriesCache &&
seriesCache.longitudinal === params.longitudinal &&
seriesCache.crossSections === params.crossSections &&
seriesCache.context === current
) {
return seriesCache.series;
}
const series = computeMassHaulSeries(
params.longitudinal,
params.crossSections,
current.conversion,
current.naturalSpoilMinSlope,
);
seriesCache = {
longitudinal: params.longitudinal,
crossSections: params.crossSections,
context: current,
series,
};
return series;
}
// 세로창 버티기·부드러운 이동 상태 — 이 패널이 사는 동안 하나만 둔다(2026-09-04).
const windowState = createMassHaulWindowState();
/** 마지막으로 그린 입력 — 이동이 아직 안 끝났으면 다음 프레임에 이걸로 한 번 더 그린다. */
@@ -372,9 +337,14 @@ export function createRouteMassHaulPanel(onChanged: () => void): RouteMassHaulPa
}
pendingChip.hidden = true;
// B06과 같은 계산 — 횡단 기준(정식)과 종단 기준(개략 비교)을 함께 낸다.
// 가로로 스크롤할 때는 **입력이 그대로**인데 그릴 때마다 다시 계산하면 프레임을 잡아먹는다
// (2026-09-04 실측: 세로창 이동 중 33ms 넘는 프레임 다수). 같은 입력이면 아껴 둔 것을 쓴다.
const series: MassHaulSeries[] = cachedSeries(params, context);
// 결과를 아껴 두지 **않는다** — 횡단 설계가 제자리에서 갈리므로 객체 동일성으로는
// 바뀐 것을 못 잰다(2026-09-04 캐시를 넣었다가 곡선이 안 따라와 되돌림).
const series: MassHaulSeries[] = computeMassHaulSeries(
params.longitudinal,
params.crossSections,
context.conversion,
context.naturalSpoilMinSlope,
);
if (!series.length) {
note("횡단 설계가 아직 없어 유토곡선을 그릴 수 없습니다.");
return;
@@ -82,37 +82,21 @@ export interface MassHaulPanelResult {
* 컨테이너 폭 계산이 어긋나 측점 세로선이 밀린다) 범례는 스크롤 컨테이너 **밖**이라
* 붙일 자리가 서로 다르기 때문이다.
*/
/** 곡선 계산 아낌 — 스크롤 중에는 입력이 그대로다. 그릴 때마다 다시 계산하면 프레임을
* 잡아먹는다(2026-09-04 실측). */
let seriesCache: {
detail: SectionDetailResponse;
conversion: EarthworkConversion | null;
slope: number | undefined;
series: MassHaulSeries[];
} | null = null;
export function buildMassHaulPanel(input: MassHaulPanelInput): MassHaulPanelResult {
const { detail, visibleSeries } = input;
const pendingRecalc = hasStaleDesigns(detail);
const conversion = input.conversion ?? null;
const cached =
seriesCache &&
seriesCache.detail === detail &&
seriesCache.conversion === conversion &&
seriesCache.slope === input.naturalSpoilSlope
? seriesCache.series
: null;
// 계산 결과를 아껴 두지 **않는다**. 횡단 설계는 같은 객체를 제자리에서 고치므로
// (`refreshCrossDesigns`) 객체가 같은지로는 바뀐 것을 못 잰다 — 2026-09-04 에 캐시를
// 넣었다가 계획고를 조절해도 횡단 기준 곡선이 그대로였다(사용자 보고).
const series: MassHaulSeries[] =
cached ??
(conversion && !pendingRecalc
input.conversion && !pendingRecalc
? computeMassHaulSeries(
detail.longitudinal,
detail.cross_sections,
conversion,
input.conversion,
input.naturalSpoilSlope,
)
: []);
if (!cached) seriesCache = { detail, conversion, slope: input.naturalSpoilSlope, series };
: [];
// 토량 분배는 **면을 깐 곡선 하나**(= 켜 둔 첫 곡선)에만 얹는다 — 곡선마다 평형선을
// 그리면 계단이 서로 엇갈려 어느 쪽 배분인지 읽히지 않는다.
const bandedSeries = series.find((entry) => visibleSeries.has(entry.key));