15 lines
2.9 KiB
TypeScript
15 lines
2.9 KiB
TypeScript
import type { DrawingDocument,ViewId } from './types';
|
|
export function createQualityPanel(host:HTMLElement,read:()=>DrawingDocument|undefined,select:(id:ViewId)=>void):()=>void{
|
|
const dialog=window.document.createElement('dialog');dialog.className='ga-sheet-dialog ga-quality-dialog';dialog.setAttribute('aria-label','도면 품질 검사');
|
|
dialog.innerHTML='<header><strong>도면 품질 검사</strong><button type="button" data-close>닫기</button></header><p data-summary></p><p>출력 단위에서 문자 폭·회전·치수 화살표를 포함해 검사합니다. 보조선의 형상 접점과 의도된 상세 번호 표기는 별도로 취급합니다. CAD 글꼴에 따른 최종 검토는 필요합니다.</p><label><input type="checkbox" data-highlight/> 간섭 위치 강조</label><div data-list></div><footer><span>표의 버튼을 누르면 해당 투영도로 이동합니다.</span><button type="button" data-save>검사 결과 JSON 저장</button></footer>';
|
|
host.append(dialog);const summary=dialog.querySelector<HTMLElement>('[data-summary]')!,list=dialog.querySelector<HTMLElement>('[data-list]')!;
|
|
dialog.querySelector('[data-close]')!.addEventListener('click',()=>dialog.close());
|
|
dialog.querySelector('[data-highlight]')!.addEventListener('change',e=>host.classList.toggle('ga-show-quality',(e.target as HTMLInputElement).checked));
|
|
dialog.querySelector('[data-save]')!.addEventListener('click',()=>{const doc=read();if(!doc)return;const url=URL.createObjectURL(new Blob([JSON.stringify({project:doc.project,pier:doc.pier,paper:doc.paper,quality:doc.quality,scales:doc.views.map(v=>({view:v.id,scale:v.scale})),dwg:doc.dwgValidation},null,2)],{type:'application/json'})),a=window.document.createElement('a');a.href=url;a.download=`${doc.pier}_일반도_품질검사.json`.replace(/[\\/:*?"<>|]/g,'_');a.click();setTimeout(()=>URL.revokeObjectURL(url),1000);});
|
|
return()=>{const doc=read(),q=doc?.quality;if(!doc||!q)return;
|
|
summary.textContent=`자동 배치 전 ${q.before}건 → 배치 후 ${q.after}건 · 최소 문자 ${q.minimumTextMm.toFixed(1)}mm · 실제 형상 ${q.geometryUnchanged?'유지':'변경 감지'}`;list.replaceChildren();
|
|
for(const issue of q.issues){const row=window.document.createElement('div'),button=window.document.createElement('button'),text=window.document.createElement('span'),view=doc.views.find(v=>v.id===issue.view);row.className='ga-quality-row';button.type='button';button.textContent=view?.title??(issue.view==='sheet'?'도곽/노트':issue.view);text.textContent=issue.message+(issue.first>=0?` (객체 ${issue.first+1})`:'');button.addEventListener('click',()=>{select(issue.view as ViewId);host.classList.add('ga-show-quality');(dialog.querySelector('[data-highlight]') as HTMLInputElement).checked=true;dialog.close();});row.append(button,text);list.append(row);}
|
|
if(!q.issues.length)list.textContent='검사 범위 내 문자/외형 및 투영도 간 간섭이 없습니다.';dialog.showModal();
|
|
};
|
|
}
|