🚀 Auto-deploy: BrainWind atualizado em 13/07/2026 18:05:59

This commit is contained in:
2026-07-13 18:05:59 +00:00
parent a4ad48b6b5
commit af49dc395d
5 changed files with 116 additions and 29 deletions
+78 -11
View File
@@ -15,12 +15,12 @@ import { Input } from '@/components/ui/input';
const PiperackModule: React.FC = () => {
const { q } = useWindStore();
const [width, setWidth] = useState(6);
const [height, setHeight] = useState(2.5);
const [elevation, setElevation] = useState(8);
const [spacing, setSpacing] = useState(3);
const [numFrames, setNumFrames] = useState(3);
const [phiStruct, setPhiStruct] = useState(0.2);
const [width, setWidth] = useState(17);
const [height, setHeight] = useState(2);
const [elevation, setElevation] = useState(6);
const [spacing, setSpacing] = useState(2);
const [numFrames, setNumFrames] = useState(2);
const [phiStruct, setPhiStruct] = useState(0.5);
const [pipes, setPipes] = useState<PipeDef[]>([]);
const addPipe = () => {
@@ -59,7 +59,7 @@ const PiperackModule: React.FC = () => {
{ label: 'Elevação média (z)', value: `${elevation} m` },
{ label: 'Espaçamento (e)', value: `${spacing} m` },
{ label: 'Número de pórticos (n)', value: String(numFrames) },
{ label: 'φ (estrutural)', value: phiStruct.toFixed(2) },
{ label: 'Solidez estrutural', value: phiStruct.toFixed(2) },
{ label: 'Quantidade de Tubos', value: String(pipes.length) },
],
},
@@ -67,9 +67,9 @@ const PiperackModule: React.FC = () => {
title: 'Coeficientes Aerodinâmicos',
type: 'grid',
gridItems: [
{ label: 'φ total (estrutura + tubos)', value: result.phiTotal.toFixed(2) },
{ label: 'Solidez total (est. + tubos)', value: result.phiTotal.toFixed(2) },
{ label: 'Ca frontal', value: result.caFrontal.toFixed(2) },
{ label: 'Fator proteção η', value: result.eta.toFixed(2) },
{ label: 'Fator de proteção', value: result.eta.toFixed(2) },
],
},
{
@@ -80,6 +80,18 @@ const PiperackModule: React.FC = () => {
{ label: 'Carga Linear Pórtico Traseiros (cada)', value: `${result.linearLoadBack.toFixed(2)} kN/m` },
{ label: 'Força Global Total', value: `${result.globalForce.toFixed(2)} kN` },
],
},
{
title: 'Reações Simplificadas na Base (Binário de Tombamento)',
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) / width).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) / width).toFixed(2)} kN` },
] : [])
],
}
];
@@ -116,7 +128,6 @@ const PiperackModule: React.FC = () => {
phiTotal={result.phiTotal}
eta={result.eta}
/>
<SceneCapturePanel />
</div>
{/* Painel Direito: Controles */}
@@ -146,10 +157,64 @@ const PiperackModule: React.FC = () => {
<span className="text-muted-foreground text-primary font-medium">Carga Pórtico 1</span>
<span className="font-mono font-bold text-primary">{result.linearLoadFront.toFixed(2)} kN/m</span>
</div>
<div className="flex justify-between items-center">
<div className="flex justify-between items-center pb-4 border-b">
<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 nas Bases</h4>
<div className="bg-muted/30 p-3 rounded-md border text-xs space-y-4">
<svg width="100%" height="120" viewBox="0 0 300 120" className="bg-white rounded border">
<line x1="20" y1="100" x2="280" y2="100" stroke="#cbd5e1" strokeWidth="2" />
<rect x="80" y="30" width="8" height="70" fill="#64748b" />
<text x="84" y="115" textAnchor="middle" fontSize="10" fill="#475569">C1 (Barlavento)</text>
<line x1="70" y1="100" x2="70" y2="70" stroke="#ef4444" strokeWidth="2" markerEnd="url(#arrowUp)" />
<text x="65" y="85" textAnchor="end" fill="#ef4444" fontSize="10">Tração</text>
<rect x="212" y="30" width="8" height="70" fill="#64748b" />
<text x="216" y="115" textAnchor="middle" fontSize="10" fill="#475569">C2 (Sotavento)</text>
<line x1="225" y1="70" x2="225" y2="100" stroke="#3b82f6" strokeWidth="2" markerEnd="url(#arrowDown)" />
<text x="230" y="85" textAnchor="start" fill="#3b82f6" fontSize="10">Comp.</text>
<rect x="76" y="30" width="148" height="10" fill="#64748b" />
<line x1="20" y1="35" x2="70" y2="35" stroke="#10b981" strokeWidth="2" markerEnd="url(#arrowRight)" />
<text x="45" y="30" textAnchor="middle" fill="#10b981" fontSize="10">Vento (F)</text>
<defs>
<marker id="arrowUp" markerWidth="6" markerHeight="6" refX="3" refY="0" orient="auto">
<path d="M0,6 L3,0 L6,6" fill="none" stroke="#ef4444" strokeWidth="1.5" />
</marker>
<marker id="arrowDown" markerWidth="6" markerHeight="6" refX="3" refY="6" orient="auto">
<path d="M0,0 L3,6 L6,0" fill="none" stroke="#3b82f6" strokeWidth="1.5" />
</marker>
<marker id="arrowRight" markerWidth="6" markerHeight="6" refX="6" refY="3" orient="auto">
<path d="M0,0 L6,3 L0,6" fill="none" stroke="#10b981" strokeWidth="1.5" />
</marker>
</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) / width).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) / width).toFixed(2)} kN</span></div>
</div>
)}
</div>
</div>
</div>
</CardContent>
</Card>
@@ -249,6 +314,8 @@ const PiperackModule: React.FC = () => {
)}
</div>
</div>
<SceneCapturePanel />
</div>
</div>
</div>