feat(B05): 계획노선 편집 화면 정리와 지도 회전
- 조작 설명을 지도 좌상단 2열 오버레이로, 상태·범례를 좌하단 오버레이로 (계획서 0-9 ⑩⑫) - 단추를 제목행 오른쪽으로 옮기고 공용 `.ui-btn` 규격을 씀, 하단 정보행 삭제 (⑪⑬) - LAS 등고선을 도엽과 같은 5m 단위로 그림 (⑭) - 바탕이 LAS 면 세류선도 등고선 범위 안쪽만 그림 (⑮) - 지도 오른쪽 위 반시계·시계 단추로 15°씩 그림 전체 회전, 집기도 따라감 (⑯) - R·L 하한을 5m 로 채움. 다만 L 하한은 칸 입력만 막음 — 기하에 걸면 거의 곧은 자리에서 R 이 부풀어 아무것도 안 고쳤는데 노선이 바뀜 (⑰) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012jsXWphgRUHAG2mFupSKPX
This commit is contained in:
@@ -438,6 +438,33 @@ function isVisible(feature: PreparedFeature, affine: Affine, view: ViewState): b
|
||||
);
|
||||
}
|
||||
|
||||
/** 레이어가 차지하는 **화면 사각형**(px). 피처가 없으면 null.
|
||||
*
|
||||
* LAS 등고선처럼 도엽보다 좁은 자료 위에 다른 레이어를 겹칠 때, 그 자료가 있는 데까지만
|
||||
* 그리려고 쓴다(계획서 0-9 ⑮ — 세류선이 등고선 밖까지 뻗던 자리). */
|
||||
export function layerScreenBounds(
|
||||
layer: PreparedLayer,
|
||||
view: ViewState,
|
||||
): { x: number; y: number; width: number; height: number } | null {
|
||||
if (layer.features.length === 0) return null;
|
||||
const affine = affineOf(view);
|
||||
let minX = Infinity;
|
||||
let minY = Infinity;
|
||||
let maxX = -Infinity;
|
||||
let maxY = -Infinity;
|
||||
for (const feature of layer.features) {
|
||||
minX = Math.min(minX, feature.minX);
|
||||
minY = Math.min(minY, feature.minY);
|
||||
maxX = Math.max(maxX, feature.maxX);
|
||||
maxY = Math.max(maxY, feature.maxY);
|
||||
}
|
||||
const x0 = minX * affine.ax + affine.bx;
|
||||
const x1 = maxX * affine.ax + affine.bx;
|
||||
const y0 = minY * affine.ay + affine.by;
|
||||
const y1 = maxY * affine.ay + affine.by;
|
||||
return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
|
||||
}
|
||||
|
||||
/** 등고선을 몇 m 마다 낼지 고를 때 훑는 배수. 성긴 쪽으로 한 칸씩 물러난다. */
|
||||
const LEVEL_STEP_MULTIPLES = [1, 2, 5, 10, 20, 50, 100];
|
||||
/** 한 화면에 둘 등고선 가닥 수의 어림 상한 — 이보다 많으면 한 칸 성글게 간다. */
|
||||
|
||||
Reference in New Issue
Block a user