- 데모 v2 이후 개발 PC의 변경을 옮김 (이 저장소의 이름 변경·README 정리는 유지) - 서버 기본 DEM, DEM 등고선, 속성 테이블 범위 선택, WNTR 교차 검증 시험 포함 - 새 라이브러리: ezdxf(Python), maplibre-contour(npm) - 변경 내역: docs/SPipe_패치내역_도면출력_2026-11-06.txt Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
116 lines
3.8 KiB
TypeScript
116 lines
3.8 KiB
TypeScript
import React from 'react';
|
|
import { Camera, ChevronDown, Download, FileText, Layers, Table, PenTool } from 'lucide-react';
|
|
|
|
interface ExportMenuProps {
|
|
open: boolean;
|
|
onToggle: () => void;
|
|
onClose: () => void;
|
|
disabled: boolean;
|
|
hasResult: boolean;
|
|
onExportInp: () => void;
|
|
onExportNet: () => void;
|
|
onExportXlsx: () => void;
|
|
onExportDxf: () => void;
|
|
onExportCsv: () => void;
|
|
onCaptureMap: () => void;
|
|
onExportShapefile: () => void;
|
|
onShowInpText: () => void;
|
|
onOpenAttributeTable: () => void;
|
|
onOpenDrawing?: () => void;
|
|
}
|
|
|
|
/** Header "내보내기" dropdown. Result-based exports are disabled until a run exists. */
|
|
export const ExportMenu: React.FC<ExportMenuProps> = ({
|
|
open,
|
|
onToggle,
|
|
onClose,
|
|
disabled,
|
|
hasResult,
|
|
onExportInp,
|
|
onExportNet,
|
|
onExportXlsx,
|
|
onExportDxf,
|
|
onExportCsv,
|
|
onCaptureMap,
|
|
onExportShapefile,
|
|
onShowInpText,
|
|
onOpenAttributeTable,
|
|
onOpenDrawing,
|
|
}) => {
|
|
const act = (fn: () => void) => () => {
|
|
fn();
|
|
onClose();
|
|
};
|
|
|
|
return (
|
|
<div className="dropdown-container">
|
|
<button
|
|
onClick={(e) => {
|
|
e.stopPropagation();
|
|
onToggle();
|
|
}}
|
|
disabled={disabled}
|
|
className="btn btn-secondary"
|
|
title="INP, DXF, XLSX, CSV 등 내보내기"
|
|
>
|
|
<Download size={14} />
|
|
<span>내보내기</span>
|
|
<ChevronDown size={12} style={{ opacity: 0.6 }} />
|
|
</button>
|
|
|
|
{open && (
|
|
<div className="dropdown-menu align-right" style={{ width: '220px' }}>
|
|
<div className="dropdown-header">EPANET 모델 파일</div>
|
|
<button className="dropdown-item" onClick={act(onExportInp)}>
|
|
<FileText size={14} />
|
|
<span>.inp 모델 파일 다운로드</span>
|
|
</button>
|
|
<button className="dropdown-item" onClick={act(onExportNet)}>
|
|
<FileText size={14} />
|
|
<span>.net 네트워크 바이너리</span>
|
|
</button>
|
|
|
|
<div className="dropdown-divider" />
|
|
<div className="dropdown-header">엔지니어링 산출물</div>
|
|
<button className="dropdown-item" disabled={!hasResult} onClick={act(onExportXlsx)}>
|
|
<Table size={14} />
|
|
<span>검토용 수리계산서 (.xlsx)</span>
|
|
</button>
|
|
<button className="dropdown-item" onClick={act(onExportDxf)}>
|
|
<Layers size={14} />
|
|
<span>AutoCAD 표준 도면 (.dxf)</span>
|
|
</button>
|
|
<button className="dropdown-item" disabled={!hasResult} onClick={act(onExportCsv)}>
|
|
<FileText size={14} />
|
|
<span>24h 시계열 수치 (.csv)</span>
|
|
</button>
|
|
|
|
<div className="dropdown-divider" />
|
|
<button className="dropdown-item" onClick={act(onCaptureMap)}>
|
|
<Camera size={14} />
|
|
<span>지도 화면 캡처 (.png)</span>
|
|
</button>
|
|
<button className="dropdown-item" onClick={act(onExportShapefile)}>
|
|
<Layers size={14} />
|
|
<span>GIS Shapefile (.zip)</span>
|
|
</button>
|
|
<button className="dropdown-item" onClick={act(onShowInpText)}>
|
|
<FileText size={14} />
|
|
<span>INP 텍스트 전문 보기</span>
|
|
</button>
|
|
<button className="dropdown-item" onClick={act(onOpenAttributeTable)}>
|
|
<Table size={14} />
|
|
<span>속성 테이블 열기</span>
|
|
</button>
|
|
{onOpenDrawing && (
|
|
<button className="dropdown-item" onClick={act(onOpenDrawing)} title="수리 종단면도·관망도를 도곽·표제란과 함께 PDF/DXF로">
|
|
<PenTool size={14} />
|
|
<span>도면 출력 (종단면도·관망도)</span>
|
|
</button>
|
|
)}
|
|
</div>
|
|
)}
|
|
</div>
|
|
);
|
|
};
|