import { Document, Page, Text, View, StyleSheet, Image as PdfImage, pdf } from '@react-pdf/renderer'; import { useWindStore } from '../store/appStore'; import { useCaptureStore } from '../store/captureStore'; const styles = StyleSheet.create({ page: { flexDirection: 'column', padding: 40, fontSize: 10, fontFamily: 'Helvetica', color: '#333' }, header: { marginBottom: 20, borderBottom: '2pt solid #6b21a8', paddingBottom: 10 }, title: { fontSize: 20, fontWeight: 'bold', color: '#6b21a8' }, subtitle: { fontSize: 10, color: '#666', marginTop: 4 }, section: { marginTop: 15, marginBottom: 10 }, sectionTitle: { fontSize: 14, fontWeight: 'bold', marginBottom: 8, color: '#111' }, row: { flexDirection: 'row', marginBottom: 4 }, label: { width: 200, fontWeight: 'bold' }, value: { flex: 1 }, text: { fontSize: 10, marginBottom: 4, lineHeight: 1.4 }, table: { display: 'flex', flexDirection: 'column', marginTop: 10, borderTop: '1pt solid #ccc', borderLeft: '1pt solid #ccc' }, tableRow: { flexDirection: 'row' }, tableHeader: { backgroundColor: '#f3f4f6', fontWeight: 'bold' }, tableCell: { flex: 1, padding: 5, borderRight: '1pt solid #ccc', borderBottom: '1pt solid #ccc', textAlign: 'center' }, tableCellFirst: { flex: 1, padding: 5, borderRight: '1pt solid #ccc', borderBottom: '1pt solid #ccc', textAlign: 'left' }, footer: { position: 'absolute', bottom: 30, left: 40, right: 40, textAlign: 'center', color: '#999', fontSize: 8, borderTop: '1pt solid #eaeaea', paddingTop: 10 }, sceneImage: { width: 480, height: 270, objectFit: 'contain', marginVertical: 8, border: '1pt solid #ddd' }, sceneCaption: { fontSize: 8, color: '#666', fontStyle: 'italic', textAlign: 'center', marginBottom: 8 }, }); export interface GenericPDFSection { title: string; type: 'table' | 'text' | 'grid'; content?: string; tableHeaders?: string[]; tableRows?: (string | number)[][]; gridItems?: { label: string; value: string | number }[]; } export interface GenericPDFProps { moduleName: string; sections: GenericPDFSection[]; wind: ReturnType; sceneImage?: string | null; } const GenericReportDocument = ({ moduleName, sections, wind, sceneImage }: GenericPDFProps) => { return ( VentoApp — Memória de Cálculo Cargas de Vento: {moduleName} — NBR 6123:2023 1. Parâmetros Globais do Vento e Pressão Dinâmica Velocidade Básica (V₀): {wind.v0} m/s (conforme Figura 1 e Anexo C da NBR 6123) Fator Topográfico (S₁): {wind.s1} (conforme Seção 5.2) Fator de Rugosidade (S₂): {wind.s2.toFixed(3)} (Categoria {wind.terrainCategory}, Classe {wind.structureClass}, conforme Tabela 2) Fator Estatístico (S₃): {wind.s3.toFixed(2)} (Grupo {wind.s3Group}, conforme Tabela 4) Memória de Cálculo (Sec 4.2 e 4.3): Vₖ = V₀ × S₁ × S₂ × S₃ Vₖ = {wind.v0} × {wind.s1} × {wind.s2.toFixed(3)} × {wind.s3.toFixed(2)} = {wind.vk.toFixed(2)} m/s q = 0,613 × (Vₖ)² q = 0,613 × ({wind.vk.toFixed(2)})² = {(0.613 * Math.pow(wind.vk, 2) / 1000).toFixed(4)} kN/m² {sceneImage && ( 2. Modelo 3D (Captura de Cena) Vista isométrica capturada em tempo real pelo usuário. )} {sections.map((sec, idx) => ( {sceneImage ? idx + 3 : idx + 2}. {sec.title} {sec.type === 'text' && sec.content && ( {sec.content} )} {sec.type === 'grid' && sec.gridItems && ( sec.gridItems.map((item, i) => ( {item.label}: {item.value} )) )} {sec.type === 'table' && sec.tableHeaders && sec.tableRows && ( {sec.tableHeaders.map((th, i) => ( {th} ))} {sec.tableRows.map((tr, rIdx) => ( {tr.map((tc, cIdx) => ( {tc} ))} ))} )} ))} Gerado por VentoApp — Ferramenta de Auxílio ao Cálculo Estrutural (NBR 6123:2023) ); }; export async function exportGenericToPDF(moduleName: string, sections: GenericPDFSection[]) { const wind = useWindStore.getState(); const sceneImage = useCaptureStore.getState().capturedImage; const blob = await pdf( ).toBlob(); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.setAttribute('href', url); link.setAttribute('download', `memoria_calculo_${moduleName.toLowerCase().replace(/\s+/g, '_')}.pdf`); document.body.appendChild(link); link.click(); document.body.removeChild(link); }