Files
SPipe/src/ExportMenu.tsx
T
SPipe EngineeringandClaude Opus 5.5 e3f386addf 도면 출력 추가: 수리 종단면도, 관망도(색인도·부분도·수압표), 범례·색상 선택, DXF(AutoCAD 2018)
- 데모 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>
2026-11-06 15:03:21 +09:00

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>
);
};