// 원본 연차공사 환경설정(TfrmEstMultiOption 0xf9c8f0 — 적용 0xf9cc6c · 열 순서 0xf0f620) — 화면 표시만 바꾸고 계산은 그대로. // 비목순서: 0 합/노/재/경 · 1 합/재/노/경 · 2 노/재/경/합 · 3 재/노/경/합 (4·5 는 원본도 열을 옮기지 않음) — 금액(TC·NC·GC·JC·SC)과 // 단가(TU·NU·GU·JU·SU) 열을 그 자리 안에서 다시 늘어놓는다. 구분 표시 = 선택출처(ValueIndex) 열 보이기. 품명정렬 = 품명 칸 정렬. // 값은 계산 환경 Display 에 둔다(원본 옵션 객체 +0x34·+0x38·+0x39). 품명 두 줄 표기·비고란 발췌근거는 하지 않음. const EstDisplay = (() => { const ORDERS = [ ["T", "N", "G", "J", "S"], ["T", "G", "N", "J", "S"], ["N", "G", "J", "S", "T"], ["G", "N", "J", "S", "T"], ]; const LABELS = [ "합/노/재/경", "합/재/노/경", "노/재/경/합", "재/노/경/합", "합/경/재/노", "경/재/노/합", ]; const get = (options) => ({ order: 0, gubun: true, align: 0, ...(options?.Display || {}) }); function columns(options, cols) { const d = get(options); let out = d.gubun ? cols : cols.filter((k) => k !== "ValueIndex"); const order = ORDERS[d.order]; if (!order || d.order === 0) return out; for (const suffix of ["C", "U"]) { const keys = order.map((p) => p + suffix), at = out.map((k, i) => (keys.includes(k) ? i : -1)).filter((i) => i >= 0); if (at.length < 2) continue; const present = keys.filter((k) => out.includes(k)); out = out.slice(); at.forEach((i, n) => (out[i] = present[n])); } return out; } function nameStyle(options) { return ["", "text-align:right", "text-align:center"][get(options).align] || ""; } function dialog(state) { const d = get(state.project.options); EstActions.form( "환경설정(표시)", [ { name: "order", label: "비목순서", value: d.order, choices: LABELS.map((l, i) => [i, l]) }, { name: "gubun", label: "구분 표시", value: d.gubun ? "1" : "0", choices: [ ["1", "표시"], ["0", "숨김"], ], }, { name: "align", label: "품명정렬", value: d.align, choices: [ [0, "좌정렬"], [1, "우정렬"], [2, "중앙정렬"], ], }, ], (values) => EstApp.change( (project) => (project.options.Display = { order: Number(values.order), gubun: values.gubun === "1", align: Number(values.align), }), false, ), ); } function handle(name, state) { if (name !== "display-options") return false; dialog(state); return true; } return { columns, nameStyle, handle }; })();