test(structure): 65 화면 확인 스크립트 — 세월교 · 박스 · 물넘이 좌측 패널
화면 확인(검증_sub5 · ORCA): - 세월교 1 = 관경 → 수량(련) → 폭 → 높이 · 유입 흙막이 = 찰 10 · 1.5 · 5 · 5 + 옵션 줄 · 유출 없음 = 램프 3→2 · 잇기 줄 없음 - 추가 흙막이 · 도수로 상자 · [저장] → 파일 inlet_revet_* · soil_add_1_* · chute_add_1 · 다시 열어 같음 · 램프 4 - B06 측벽 고름 = 유입 상자 강조 · 좌측 측벽 높이 · 좌우 · 상하 · 바닥판 줄 0 - 새 세월교 = 1000 · 련 2 · 폭 10 · 높이 0.04(유량 뒤 자동) · 배관 → 세월교 = 높이 0.08 · 새 물넘이 = 경사 3 · 폭 5 · 높이 0.01 - 세월교 → 박스 = 2.0×2.0 · 날개벽 · 유출 없음 = 램프 3→2 - 검증 파일 · 세션 캐시는 미리 뜬 사본으로 되돌림 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BVPp2o6Mh2FZJr72yW3ofZ
This commit is contained in:
@@ -0,0 +1,93 @@
|
|||||||
|
/* 65 — B05 · B06 좌측 「구조물 배치」 세월교 · 박스암거 · 물넘이 포장(PLAN 65-1 ~ 65-5)
|
||||||
|
* 시작 화면: B05 종단설계(#/b05-profile) · 검증 프로젝트(검증_sub5) · 목록에 「세월교 1」
|
||||||
|
* 부르는 법: orca eval --expression "window.__m65='단계'; $(cat 이 파일)"
|
||||||
|
* shape — 세월교 1 고름 → 상자 · 칸 · 램프 수
|
||||||
|
* edit — 유입 흙막이(기본값 칸) · 유출 없음(램프 줄어듦) · 추가 흙막이 · 도수로 · [저장]
|
||||||
|
* verify — 다시 연 값 · 램프 수
|
||||||
|
* newford — 새 세월교(관경 · 련 · 폭 · 높이 자동) · 새 물넘이(경사각 3 · 폭 · 높이) — 저장 안 함
|
||||||
|
* 되돌림: 검증 프로젝트 파일을 미리 떠 둔 사본으로(스크립트 밖)
|
||||||
|
*/
|
||||||
|
(async () => {
|
||||||
|
const MODE = window.__m65 || "shape";
|
||||||
|
const w = (ms) => new Promise((r) => setTimeout(r, ms));
|
||||||
|
const until = async (fn, ms = 20000) => {
|
||||||
|
for (let t = 0; t < ms; t += 200) {
|
||||||
|
if (fn()) return true;
|
||||||
|
await w(200);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
const spec = () =>
|
||||||
|
[...document.querySelectorAll(".b05-structure__spec")].find((n) => n.offsetParent !== null);
|
||||||
|
const box = (c, i = 0) => spec()?.querySelectorAll(`[data-spec-container="${c}"]`)[i];
|
||||||
|
const ctl = (c, item, i = 0) =>
|
||||||
|
box(c, i)?.querySelector(`[data-spec-item="${c}.${item}"]`)?.querySelector("select, input");
|
||||||
|
const set = async (c, item, v, i = 0) => {
|
||||||
|
const el = ctl(c, item, i);
|
||||||
|
el.value = v;
|
||||||
|
el.dispatchEvent(new Event("change", { bubbles: true }));
|
||||||
|
await w(300);
|
||||||
|
};
|
||||||
|
const rows = () =>
|
||||||
|
[...document.querySelectorAll(".b05-route__irregular-list li")].filter((l) => l.offsetParent);
|
||||||
|
const row = (re) => rows().find((l) => re.test(l.textContent.trim()));
|
||||||
|
const lamps = (re) => row(re)?.querySelectorAll(".b05-route__lamps i").length ?? -1;
|
||||||
|
const pick = async (re) => {
|
||||||
|
await until(() => !!row(re));
|
||||||
|
const li = row(re);
|
||||||
|
(li.querySelector("button") ?? li).click();
|
||||||
|
await w(800);
|
||||||
|
await until(() => !!spec());
|
||||||
|
await w(400);
|
||||||
|
};
|
||||||
|
const shape = () =>
|
||||||
|
[...spec().querySelectorAll("[data-spec-container]")].map((b) => ({
|
||||||
|
c: b.dataset.specContainer,
|
||||||
|
legend: b.querySelector("legend")?.firstChild?.textContent,
|
||||||
|
items: [...b.querySelectorAll("[data-spec-item]")]
|
||||||
|
.filter((n) => !n.hidden)
|
||||||
|
.map((n) => [n.dataset.specItem, n.querySelector("select, input")?.value ?? ""]),
|
||||||
|
fields: [...b.querySelectorAll(".b05-route__field")]
|
||||||
|
.filter((n) => !n.hidden && n.offsetParent)
|
||||||
|
.map((n) => n.querySelector("span")?.textContent),
|
||||||
|
link: !!b.querySelector("[data-spec-link]"),
|
||||||
|
option: [...b.querySelectorAll(".b05-structure__half-pair button")].map(
|
||||||
|
(x) => `${x.textContent}${x.disabled ? "(끔)" : ""}`,
|
||||||
|
),
|
||||||
|
}));
|
||||||
|
const out = { mode: MODE };
|
||||||
|
const FORD = /세월교 1$/;
|
||||||
|
|
||||||
|
if (MODE === "shape") {
|
||||||
|
await pick(FORD);
|
||||||
|
out.shape = shape();
|
||||||
|
out.lamps = lamps(FORD);
|
||||||
|
}
|
||||||
|
if (MODE === "edit") {
|
||||||
|
await pick(FORD);
|
||||||
|
out.lampsBefore = lamps(FORD);
|
||||||
|
await set("inlet", "structure", "흙막이");
|
||||||
|
out.inlet = shape().find((b) => b.c === "inlet");
|
||||||
|
await set("outlet", "structure", "없음");
|
||||||
|
await w(800);
|
||||||
|
out.outlet = shape().find((b) => b.c === "outlet");
|
||||||
|
out.lampsAfterNone = lamps(FORD);
|
||||||
|
for (const c of ["soil_add", "chute_add"]) {
|
||||||
|
spec().querySelector(`[data-spec-add="${c}"]`)?.click();
|
||||||
|
await w(400);
|
||||||
|
}
|
||||||
|
await set("chute_add", "structure", "도수로");
|
||||||
|
await set("inlet", "length", "8");
|
||||||
|
out.lampsAfterAdd = lamps(FORD);
|
||||||
|
out.edited = shape();
|
||||||
|
document.querySelector('[data-dock-action="save"]').click();
|
||||||
|
await w(500);
|
||||||
|
out.saved = await until(() => !document.querySelector(".ui-overlay.is-active"), 60000);
|
||||||
|
}
|
||||||
|
if (MODE === "verify") {
|
||||||
|
await pick(FORD);
|
||||||
|
out.reopened = shape();
|
||||||
|
out.lamps = lamps(FORD);
|
||||||
|
}
|
||||||
|
return JSON.stringify(out);
|
||||||
|
})();
|
||||||
Reference in New Issue
Block a user