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 { calculateSign } from '@/lib/nbr-tables/table-23'; import Sign3DViewer from '@/components/three/Sign3D'; import SceneCapturePanel from '../components/SceneCapturePanel'; import ExportMenu from '../components/ExportMenu'; import { EducationalManual } from '@/components/EducationalManual'; import { PressureLegend } from '@/components/PressureLegend'; import { exportGenericToPDF, type GenericPDFSection } from '../lib/export-generic-pdf'; const SignModule: React.FC = () => { const { q } = useWindStore(); const [length, setLength] = React.useState(8); const [height, setHeight] = React.useState(3); const [alpha, setAlpha] = React.useState<90 | 50>(90); const [hasEndPlates, setHasEndPlates] = React.useState(true); const [groundClearance, setGroundClearance] = React.useState(0.5); const result = useMemo( () => calculateSign({ length, height, alpha, hasEndPlates, groundClearance }, q), [length, height, alpha, hasEndPlates, groundClearance, q], ); const handleExportPDF = () => { const sections: GenericPDFSection[] = [ { title: 'Geometria do Muro/Placa', type: 'grid', gridItems: [ { label: 'Comprimento (ℓ)', value: `${length} m` }, { label: 'Altura (hₐ)', value: `${height} m` }, { label: 'Distância do solo', value: `${groundClearance} m` }, { label: 'ℓ/hₐ', value: result.lhRatio.toFixed(2) }, { label: 'Placas de extremidade', value: hasEndPlates ? 'Sim' : 'Não' }, { label: 'Ângulo de incidência (α)', value: `${alpha}°` }, ], }, { title: 'Força Resultante', type: 'grid', gridItems: [ { label: 'Área Efetiva', value: `${result.areaEffective.toFixed(1)} m²` }, { label: 'Coeficiente de Força (Cf)', value: result.cf.toFixed(2) }, { label: 'Excentricidade (e)', value: `${result.applicationPoint.toFixed(2)} m` }, { label: 'Força F', value: `${result.forceKN.toFixed(2)} kN` }, ], }, { title: 'Momento de Tombamento (Estimado)', type: 'grid', gridItems: [ { label: 'Em relação à base da placa', value: `${result.momentBaseKNm.toFixed(2)} kNm` }, { label: 'Em relação ao solo', value: `${result.momentGroundKNm.toFixed(2)} kNm` }, ], }, ]; exportGenericToPDF('Muros e Placas', sections); }; return (
{/* Coluna Esquerda: Controles */}
Muros e Placas Sec. 7.1 — vento perpendicular à face.
{length} m
setLength(v[0])} />
{height} m
setHeight(v[0])} />
{groundClearance} m
setGroundClearance(v[0])} />
q:{q.toFixed(4)} kN/m²
ℓ/hₐ:{result.lhRatio.toFixed(2)}
{/* Coluna Central: 3D */}
F = {result.forceKN.toFixed(2)} kN Cf = {result.cf.toFixed(2)}
{/* Coluna Direita: Resultados */}
Força Resultante F = Cf · q · A
Cf
{result.cf.toFixed(2)}
e (m)
{result.applicationPoint.toFixed(2)}
Área efetiva
{result.areaEffective.toFixed(1)} m²
Força F
{result.forceKN.toFixed(2)} kN

Momento de Tombamento

M (base da placa)
{result.momentBaseKNm.toFixed(2)} kNm
M (solo)
{result.momentGroundKNm.toFixed(2)} kNm
A força F atua perpendicularmente ao plano do muro ou placa, com excentricidade e medida a partir do centro geométrico.
); }; export default SignModule;