// 원본 단가산출 「전역변수 지정,해제」(mnuCostSetGlobalVar 0xf053cc)·「전역변수 목록」(mnuCostGlobalvarList → TfrmGlobalVarList). // 지정·해제: 마지막으로 누른 산출근거 칸의 커서 아래 낱말([0-9A-Za-z_], 영문자 하나 이상)을 ⟦전역⟧ 표지로 감싸거나 푼다. // 목록: 단가산출을 처음부터 계산해 전역변수 대입마다 변수명·값과 그 줄로 이동. const EstGlobalVars = (() => { const MARK = "⟦전역⟧"; let last = null; if (typeof document !== "undefined" && document.addEventListener) document.addEventListener("focusin", (event) => { const t = event.target.closest?.('[data-table="CostMainDat"][data-field="LineData"]'); if (t) last = t; }); function toggle(text, caret) { const word = /[0-9A-Za-z_]/; let a = caret, b = caret; while (a > 0 && word.test(text[a - 1])) a--; while (b < text.length && word.test(text[b])) b++; const name = text.slice(a, b); if (!name || !/[A-Za-z]/.test(name)) throw Error( '선택한 변수는 전역변수로 지정할수 없습니다.\n\n변수는 알파벳과 숫자,"_"로 이루어져야합니다.\n\n예) Q , V1 , L_1', ); const before = text.slice(0, a), after = text.slice(b); if (before.endsWith(MARK) && after.startsWith(MARK)) return before.slice(0, -MARK.length) + name + after.slice(MARK.length); return `${before}${MARK}${name}${MARK}${after}`; } function list(state) { const out = EstText.calculate(state.project.tables.CostMainDat || [], state.project.options); const { esc, number } = EstApp; EstApp.showDialog( "전역변수 목록", out.globals.length ? `${out.globals.map((g) => ``).join("")}
변수명값이동
${esc(g.name)}${number(g.value)}
` : "

전역변수가 없습니다. 단가산출 산출근거의 변수에 커서를 두고 「전역변수 지정,해제」를 누르세요.

", ); } function handle(name, state, node) { if (name === "global-var") { if (!last) throw Error("단가산출 산출근거 칸의 변수에 커서를 두세요."); const index = Number(last.dataset.row), text = last.value, next = toggle(text, last.selectionStart ?? 0); EstApp.change( (project) => (project.tables.CostMainDat[index].LineData = EstText.encode(next)), ); } else if (name === "global-var-list") list(state); else if (name === "global-var-go") { EstApp.byId("dialog").close(); const index = Number(node.dataset.row); state.view = "CostMainDat"; const rows = state.project.tables.CostMainDat; let head = index; while (head > 0 && !(Number(rows[head].Index) > 0)) head--; state.group = rows[head]?.Code || state.group; state.selection.clear(); state.selection.add(index); EstApp.render(); document .querySelector(`[data-table="CostMainDat"][data-row="${index}"][data-field="LineData"]`) ?.scrollIntoView({ block: "center" }); } else return false; return true; } return { toggle, handle }; })();