🚀 Auto-deploy: BrainWind atualizado em 13/07/2026 18:50:57

This commit is contained in:
2026-07-13 18:50:57 +00:00
parent 805ee7e251
commit dc764d8c39
+45 -31
View File
@@ -73,24 +73,23 @@ const PiperackModule: React.FC = () => {
],
},
{
title: 'Forças e Cargas',
title: 'Forças e Momentos Globais',
type: 'grid',
gridItems: [
{ label: 'Carga Linear Pórtico Frontal', value: `${result.linearLoadFront.toFixed(2)} kN/m` },
{ label: 'Carga Linear Pórtico Traseiros (cada)', value: `${result.linearLoadBack.toFixed(2)} kN/m` },
{ label: 'Carga Linear Pórticos Traseiros (cada)', value: `${result.linearLoadBack.toFixed(2)} kN/m` },
{ label: 'Força Global Total', value: `${result.globalForce.toFixed(2)} kN` },
{ label: 'Momento Total de Tombamento', value: `${(result.linearLoadFront * width * elevation + (numFrames > 1 ? (numFrames - 1) * result.linearLoadBack * width * elevation : 0)).toFixed(2)} kN·m` },
],
},
{
title: 'Reações Simplificadas na Base (Binário de Tombamento)',
title: 'Reações Globais Simplificadas (Ação de Conjunto)',
type: 'grid',
gridItems: [
{ label: 'Pórtico Frontal - Momento (M)', value: `${(result.linearLoadFront * width * elevation).toFixed(2)} kN·m` },
{ label: 'Pórtico Frontal - C1 (Tração) / C2 (Compressão)', value: `±${((result.linearLoadFront * width * elevation) / spacing).toFixed(2)} kN` },
...(numFrames > 1 ? [
{ label: 'Pórtico Traseiro - Momento (M)', value: `${(result.linearLoadBack * width * elevation).toFixed(2)} kN·m` },
{ label: 'Pórtico Traseiro - C1 (Tração) / C2 (Compressão)', value: `±${((result.linearLoadBack * width * elevation) / spacing).toFixed(2)} kN` },
] : [])
gridItems: numFrames > 1 ? [
{ label: 'Braço de Alavanca Total (L)', value: `${((numFrames - 1) * spacing).toFixed(2)} m` },
{ label: `Reação nas Extremidades (C1 / C${numFrames})`, value: `±${((result.linearLoadFront * width * elevation + (numFrames - 1) * result.linearLoadBack * width * elevation) / ((numFrames - 1) * spacing)).toFixed(2)} kN` },
] : [
{ label: 'Momento Fletor na Base (Pórtico Único)', value: `${(result.linearLoadFront * width * elevation).toFixed(2)} kN·m` }
],
}
];
@@ -259,12 +258,20 @@ const PiperackModule: React.FC = () => {
<span className="text-muted-foreground text-primary font-medium">Carga Pórticos {numFrames > 1 ? `2 a ${numFrames}` : '-'}</span>
<span className="font-mono font-bold text-primary">{result.linearLoadBack.toFixed(2)} kN/m</span>
</div>
<div className="pt-2">
<h4 className="font-semibold text-sm mb-3">Reações Simplificadas (Vista Lateral)</h4>
<div className="bg-muted/30 p-3 rounded-md border text-xs space-y-4">
{(() => {
const mFrontal = result.linearLoadFront * width * elevation;
const mTraseiro = numFrames > 1 ? result.linearLoadBack * width * elevation : 0;
const mTotal = mFrontal + (numFrames - 1) * mTraseiro;
const braco = (numFrames - 1) * spacing;
const reacaoGlobal = braco > 0 ? mTotal / braco : 0;
<svg width="100%" height="150" viewBox="0 0 300 150" className="bg-white rounded border">
return (
<div className="pt-2">
<h4 className="font-semibold text-sm mb-3">Reações Simplificadas (Vista Lateral)</h4>
<div className="bg-muted/30 p-3 rounded-md border text-xs space-y-4">
<svg width="100%" height="150" viewBox="0 0 300 150" className="bg-white rounded border">
{/* Linha do chão */}
<line x1="20" y1="110" x2="280" y2="110" stroke="#cbd5e1" strokeWidth="2" />
@@ -354,24 +361,31 @@ const PiperackModule: React.FC = () => {
</defs>
</svg>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="space-y-1">
<div className="font-bold text-primary">Pórtico Frontal</div>
<div className="flex justify-between text-muted-foreground"><span>F (Transv.):</span> <span className="font-mono">{(result.linearLoadFront * width).toFixed(2)} kN</span></div>
<div className="flex justify-between text-muted-foreground"><span>Momento:</span> <span className="font-mono">{(result.linearLoadFront * width * elevation).toFixed(2)} kN·m</span></div>
<div className="flex justify-between text-muted-foreground"><span>Reação (C1/C2):</span> <span className="font-mono">±{((result.linearLoadFront * width * elevation) / spacing).toFixed(2)} kN</span></div>
</div>
{numFrames > 1 && (
<div className="space-y-1">
<div className="font-bold text-primary">Pórticos Traseiros</div>
<div className="flex justify-between text-muted-foreground"><span>F (Transv.):</span> <span className="font-mono">{(result.linearLoadBack * width).toFixed(2)} kN</span></div>
<div className="flex justify-between text-muted-foreground"><span>Momento:</span> <span className="font-mono">{(result.linearLoadBack * width * elevation).toFixed(2)} kN·m</span></div>
<div className="flex justify-between text-muted-foreground"><span>Reação (C1/C2):</span> <span className="font-mono">±{((result.linearLoadBack * width * elevation) / spacing).toFixed(2)} kN</span></div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 pt-2">
<div className="space-y-1">
<div className="font-bold text-primary">Forças e Momentos</div>
<div className="flex justify-between text-muted-foreground"><span>F. Frontal:</span> <span className="font-mono">{(result.linearLoadFront * width).toFixed(2)} kN</span></div>
{numFrames > 1 && <div className="flex justify-between text-muted-foreground"><span>F. Traseiros (Total):</span> <span className="font-mono">{((numFrames - 1) * result.linearLoadBack * width).toFixed(2)} kN</span></div>}
<div className="flex justify-between text-muted-foreground font-semibold mt-1"><span>Momento Global:</span> <span className="font-mono">{mTotal.toFixed(2)} kN·m</span></div>
</div>
<div className="space-y-1">
<div className="font-bold text-primary">Reações Globais (Conjunto)</div>
{numFrames > 1 ? (
<>
<div className="flex justify-between text-muted-foreground"><span>Alavanca Total (L):</span> <span className="font-mono">{braco.toFixed(2)} m</span></div>
<div className="flex justify-between text-muted-foreground font-semibold mt-1"><span>Reação (C1/C{numFrames}):</span> <span className="font-mono text-primary">±{reacaoGlobal.toFixed(2)} kN</span></div>
</>
) : (
<div className="text-muted-foreground text-[10px] leading-tight mt-1">
Pórtico único. O momento de {mTotal.toFixed(2)} kN·m é absorvido como momento fletor engastado nas bases das colunas.
</div>
)}
</div>
</div>
)}
</div>
</div>
</div>
</div>
);
})()}
</CardContent>
</Card>