feat(B06,B05): 기슭막이 연동·경사를 재정의하고 링크 카드까지 강조한다
사용자 확정(2026-08-30) 세 가지를 반영한다. ① 링크 강조 — 한 기슭막이는 그 연장 안 모든 횡단도에서 같이 강조된다. 선택 (조정창)과 강조를 분리해 `highlightFor`/`applyRevetHighlight`로 카드 재생성 없이 클래스만 갈아 끼운다(줌·팬 보존). 다단은 단 번호까지 같은 키로 짝짓는다. ② 연동 = 분리가 아니다 — 길이·전/후로 이미 하나의 기슭막이다. 연동을 푼 측점은 그 자리에 서므로 3D에서 벽이 노선과 평행이 아니라 자기 경로선을 따라간다. 링마다 폴리곤을 갈아 끼워(`polygons`) 측점 사이를 Catmull-Rom으로 잇는다. 해제 시 단 수가 0이 되던 것(벽 4→2)도 고쳤다 — 소유 측점 4축에서 출발해 손댄 벽만 갈아 끼운다. ③ 경사 = 수평(Z 일원화) — 3D 링만 눕히던 것을 횡단도까지 넓혔다. 링크 카드 벽 상단 표고를 소유 측점과 맞추고(d = 소유 d + 1.2×dz) 차이는 노견 확장이 흡수한다. 그래서 수평 중에는 연동 해제 불가 — 버튼을 잠그고, 해제해 둔 값은 지운다. 곁다리: 3D 재빌드 해시에 extra_spans·revet_link_detached 추가(안 넣으면 저장 코리도가 안 만료된다), 캐시 저장 payload에 extra_spans 누락 보완, 3D 머리 주석을 "정본만 읽는다" → "캐시를 읽는다"로 정정. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -408,11 +408,12 @@ export function buildStructurePanel(deps: StructurePanelDeps): StructurePanelHan
|
||||
optionParts.controls.append(button);
|
||||
return { button, set };
|
||||
};
|
||||
const linkToggle = makeToggle(
|
||||
"연동",
|
||||
"옆 측점 기슭막이와 횡단도 위치를 함께 쓴다. 끄면 이 측점 위치를 따로 잡는다 — 구조물이 늘지는 않는다.",
|
||||
(on) => deps.setLinked(on),
|
||||
);
|
||||
const LINK_TITLE =
|
||||
"옆 측점 기슭막이와 횡단도 위치를 함께 쓴다. 끄면 이 측점 위치를 따로 잡는다 — 구조물이 늘지는 않는다.";
|
||||
/** 경사 해제(수평) 중에는 연동을 못 푼다 — 기슭막이 Z를 하나로 묶기 때문(2026-08-30). */
|
||||
const LINK_LOCKED_TITLE =
|
||||
"경사 해제(수평) 중에는 연동을 풀 수 없다 — 기슭막이 Z를 하나로 묶는다.";
|
||||
const linkToggle = makeToggle("연동", LINK_TITLE, (on) => deps.setLinked(on));
|
||||
const gradeToggle = makeToggle(
|
||||
"경사",
|
||||
"종단경사 반영(3D 전용) — 켜면 3D 기슭막이가 종단경사를 따라 서고, 끄면 연장 구간 내내 Z를 동일하게 본다. 횡단도는 언제나 그 측점 계획고로 그린다.",
|
||||
@@ -575,8 +576,12 @@ export function buildStructurePanel(deps: StructurePanelDeps): StructurePanelHan
|
||||
const linkState = deps.linkState();
|
||||
linkToggle.button.classList.toggle("is-hidden", linkState === null);
|
||||
linkToggle.set(linkState?.linked ?? true);
|
||||
// 경사 해제(수평) = 연동 잠김(2026-08-30 사용자). 버튼은 눌리지 않고 이유를 단다.
|
||||
const levelled = !deps.followGrade();
|
||||
linkToggle.button.disabled = levelled;
|
||||
linkToggle.button.title = levelled ? LINK_LOCKED_TITLE : LINK_TITLE;
|
||||
gradeToggle.button.classList.toggle("is-hidden", currentSpan === null);
|
||||
gradeToggle.set(deps.followGrade());
|
||||
gradeToggle.set(!levelled);
|
||||
optionParts.row.classList.toggle("is-hidden", linkState === null && currentSpan === null);
|
||||
const adjust = deps.adjustFor(key);
|
||||
// 정보는 항목당 한 행(2026-08-22 사용자) — 0이면 "자동", 좌우는 안/바깥,
|
||||
|
||||
Reference in New Issue
Block a user