🚀 Auto-deploy: BrainWind atualizado em 13/07/2026 18:05:59
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user