14 lines
2.5 KiB
TypeScript
14 lines
2.5 KiB
TypeScript
import type {calculate,QuantityInputs} from './model';
|
|
import type {PierInput} from '../src/core/types';
|
|
import type {PierModel} from '../src/core/geometry';
|
|
export type TakeoffResult=ReturnType<typeof calculate>;
|
|
export type QuantityRow=TakeoffResult['results'][number];
|
|
export type Selection={id:string;title:string;rows:QuantityRow[];unit:string;value:number|null;formula:string;substitution:string};
|
|
export type DashboardState={query:string;view:'member'|'work'|'material';selected:string;closed:Set<string>;openInputs:Set<string>;inputScroll:number};
|
|
export type PierContext={input:PierInput;model:PierModel|null;dirty:boolean;rebarTon?:number|null};
|
|
export const node=<K extends keyof HTMLElementTagNameMap>(tag:K,text?:string,cls?:string)=>{const n=document.createElement(tag);if(text!==undefined)n.textContent=text;if(cls)n.className=cls;return n;};
|
|
export const fmt=(value:number|null,digits=3)=>value===null?'미산정':value.toLocaleString('ko-KR',{maximumFractionDigits:digits,minimumFractionDigits:digits});
|
|
export function icon(name:string):SVGSVGElement{const svg=document.createElementNS('http://www.w3.org/2000/svg','svg');svg.setAttribute('viewBox','0 0 24 24');svg.setAttribute('fill','none');svg.setAttribute('stroke','currentColor');svg.setAttribute('stroke-width','1.6');svg.setAttribute('aria-hidden','true');const p=document.createElementNS(svg.namespaceURI,'path');p.setAttribute('d',({input:'M8 4h8v3H8zM8 5H5v16h14V5h-3',review:'M20 12a8 8 0 1 1-3-6M8 12l3 3 8-9',result:'m3 8 9-5 9 5-9 5zM3 12l9 5 9-5M3 16l9 5 9-5',preview:'M6 3h9l4 4v14H6zM14 3v5h5M9 12h7M9 16h7',concrete:'m4 7 8-4 8 4v10l-8 4-8-4zM4 7l8 4 8-4M12 11v10',rebar:'M4 18 18 4M3 14l7 7M6 11l7 7M9 8l7 7M12 5l7 7',formwork:'M3 4h18v16H3zM7 4v16M17 4v16M7 8h10M7 16h10',earth:'m3 19 6-10 4 5 3-8 5 13z'} as Record<string,string>)[name]??'M5 12h14');svg.append(p);return svg;}
|
|
export function rawSelection(row:QuantityRow,book:TakeoffResult['book']):Selection{return{id:row.cell,title:row.name,rows:[row],unit:row.unit??'',value:row.value,formula:String(row.formula),substitution:book.substitution('3.3 수량산출_P1',String(row.formula))};}
|
|
export function sumSelection(rows:QuantityRow[],title:string):Selection{const unit=rows[0]?.unit??'';return{id:'sum:'+rows.map(r=>r.cell).join(','),title,rows,unit,value:rows.length&&rows.every(r=>r.value!==null&&r.unit===unit)?rows.reduce((s,r)=>s+r.value!,0):null,formula:rows.map(r=>r.cell).join(' + '),substitution:rows.map(r=>r.value===null?'미산정':String(r.value)).join(' + ')};}
|