import React, { useMemo } from 'react'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Slider } from '@/components/ui/slider'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Badge } from '@/components/ui/badge'; import { Separator } from '@/components/ui/separator'; import { useWindStore } from '@/store/appStore'; import { calculateFlatBarForce, type FlatBarSection } from '@/lib/nbr-tables/table-26'; import { calculateCircleBarForce, reynoldsBar } from '@/lib/nbr-tables/table-27'; import Bar3DViewer from '@/components/three/Bar3D'; import SceneCapturePanel from '../components/SceneCapturePanel'; import ExportMenu from '../components/ExportMenu'; import { EducationalManual } from '@/components/EducationalManual'; import { exportGenericToPDF, type GenericPDFSection } from '../lib/export-generic-pdf'; const BarSelectorModule: React.FC = () => { const { vk, q } = useWindStore(); const [barType, setBarType] = React.useState<'flat' | 'circular'>('flat'); const [section, setSection] = React.useState('l'); const [alpha, setAlpha] = React.useState(45); const [width, setWidth] = React.useState(0.1); const [length, setLength] = React.useState(5); const [diameter, setDiameter] = React.useState(0.05); const flatResult = useMemo(() => { if (barType !== 'flat') return null; return calculateFlatBarForce({ section, alpha, width, length, q }); }, [barType, section, alpha, width, length, q]); const circleResult = useMemo(() => { if (barType !== 'circular') return null; return calculateCircleBarForce({ d: diameter, length, vk, q }); }, [barType, diameter, length, vk, q]); const reCircle = useMemo(() => reynoldsBar(vk, diameter), [vk, diameter]); const handleExportPDF = () => { const sections: GenericPDFSection[] = [ { title: 'Geometria da Barra', type: 'grid', gridItems: [ { label: 'Tipo', value: barType === 'flat' ? 'Faces planas' : 'Circular' }, { label: 'Comprimento (ℓ)', value: `${length} m` }, ...(barType === 'flat' ? [ { label: 'Seção transversal', value: section }, { label: 'Ângulo (α)', value: `${alpha}°` }, { label: 'Largura (c)', value: `${width} m` }, ] : [ { label: 'Diâmetro (d)', value: `${diameter} m` }, { label: 'Reynolds (Re)', value: reCircle.toExponential(2) }, { label: 'Regime', value: reCircle < 4.2e5 ? 'Subcrítico' : reCircle < 2.3e6 ? 'Crítico' : 'Supercrítico', }, ]), ], }, { title: 'Forças e Coeficientes', type: 'grid', gridItems: barType === 'flat' && flatResult ? [ { label: 'Coeficiente Cx', value: flatResult.cx.toFixed(2) }, { label: 'Coeficiente Cy', value: flatResult.cy.toFixed(2) }, { label: 'Fator K', value: flatResult.kFactor.toFixed(2) }, { label: 'Força Fx', value: `${flatResult.fxKN.toFixed(3)} kN` }, { label: 'Força Fy', value: `${flatResult.fyKN.toFixed(3)} kN` }, ] : circleResult ? [ { label: 'Coeficiente Ca', value: circleResult.ca.toFixed(2) }, { label: 'Regime (tabela)', value: circleResult.regime }, { label: 'Fator K', value: circleResult.kFactor.toFixed(2) }, { label: 'Força de Arrasto', value: `${circleResult.forceKN.toFixed(3)} kN` }, ] : [], }, ]; exportGenericToPDF('Barra Prismática', sections); }; return (
{/* Coluna Esquerda: Controles */}
Barra Prismática Sec. 8.1 — faces planas (Tab. 26) ou circulares (Tab. 27).
{barType === 'flat' && ( <>
{alpha}°
setAlpha(v[0])} />
{width} m
setWidth(v[0])} />
)} {barType === 'circular' && (
{diameter} m
setDiameter(v[0])} />
Re = {reCircle.toLocaleString('pt-BR')} · regime: {reCircle < 4.2e5 ? 'subcrítico' : reCircle < 2.3e6 ? 'crítico' : 'supercrítico'}
)}
{length} m
setLength(v[0])} />
Vₖ:{vk.toFixed(2)} m/s
q:{q.toFixed(4)} kN/m²
{/* Coluna Central: 3D */}
α = {alpha}°
{/* Coluna Direita: Resultados */}
Forças Cx e Cy Com fator K (Tab. 28) aplicado {flatResult && ( <>
Cx
{flatResult.cx.toFixed(2)}
Cy
{flatResult.cy.toFixed(2)}
K
{flatResult.kFactor.toFixed(2)}
Fx
{flatResult.fxKN.toFixed(3)} kN
Fy
{flatResult.fyKN.toFixed(3)} kN
)} {circleResult && ( <>
Ca
{circleResult.ca.toFixed(2)}
Regime
{circleResult.regime}
K
{circleResult.kFactor.toFixed(2)}
Força de arrasto
{circleResult.forceKN.toFixed(3)} kN
)}
); }; export default BarSelectorModule;