🚀 Auto-deploy: BrainWind atualizado em 13/07/2026 18:46:24

This commit is contained in:
2026-07-13 18:46:24 +00:00
parent b0bf2ce054
commit 805ee7e251
+65 -24
View File
@@ -268,38 +268,79 @@ const PiperackModule: React.FC = () => {
{/* Linha do chão */} {/* Linha do chão */}
<line x1="20" y1="110" x2="280" y2="110" stroke="#cbd5e1" strokeWidth="2" /> <line x1="20" y1="110" x2="280" y2="110" stroke="#cbd5e1" strokeWidth="2" />
{/* Vigas Longitudinais (Stringers) - conectando as colunas no sentido longitudinal */} {/* Renderização Dinâmica baseada no numFrames */}
<line x1="84" y1="40" x2="216" y2="40" stroke="#94a3b8" strokeWidth="4" /> {(() => {
<line x1="84" y1="65" x2="216" y2="65" stroke="#94a3b8" strokeWidth="4" /> const startX = 60;
const endX = 240;
const step = numFrames > 1 ? (endX - startX) / (numFrames - 1) : 0;
{/* Coluna 1 (Frente) */} return (
<rect x="80" y="35" width="8" height="75" fill="#64748b" /> <>
<text x="84" y="125" textAnchor="middle" fontSize="10" fill="#475569">C1 (Barlavento)</text> {/* Vigas Longitudinais */}
<line x1="70" y1="110" x2="70" y2="80" stroke="#ef4444" strokeWidth="2" markerEnd="url(#arrowUp)" /> {numFrames > 1 && (
<text x="65" y="95" textAnchor="end" fill="#ef4444" fontSize="10">Tração</text> <>
<line x1={startX + 4} y1="40" x2={endX + 4} y2="40" stroke="#94a3b8" strokeWidth="4" />
<line x1={startX + 4} y1="65" x2={endX + 4} y2="65" stroke="#94a3b8" strokeWidth="4" />
</>
)}
{/* Coluna 2 (Trás) */} {/* Colunas */}
<rect x="212" y="35" width="8" height="75" fill="#64748b" /> {Array.from({ length: numFrames }).map((_, i) => {
<text x="216" y="125" textAnchor="middle" fontSize="10" fill="#475569">C2 (Sotavento)</text> const colX = numFrames === 1 ? 150 : startX + i * step;
<line x1="225" y1="80" x2="225" y2="110" stroke="#3b82f6" strokeWidth="2" markerEnd="url(#arrowDown)" /> const isFirst = i === 0;
<text x="230" y="95" textAnchor="start" fill="#3b82f6" fontSize="10">Comp.</text> const isLast = i === numFrames - 1;
{/* Tubulações transversais cortadas (Círculos azuis) para indicar vista lateral */} return (
<g key={`col-${i}`}>
<rect x={colX} y="35" width="8" height="75" fill="#64748b" />
<text x={colX + 4} y="125" textAnchor="middle" fontSize={numFrames > 3 ? "8" : "10"} fill="#475569">
{`C${i + 1}`}
</text>
{/* Tração na primeira */}
{isFirst && (
<>
<line x1={colX - 10} y1="110" x2={colX - 10} y2="80" stroke="#ef4444" strokeWidth="2" markerEnd="url(#arrowUp)" />
<text x={colX - 15} y="95" textAnchor="end" fill="#ef4444" fontSize="10">Tração</text>
<text x={colX + 4} y="135" textAnchor="middle" fontSize="8" fill="#475569">Barlavento</text>
</>
)}
{/* Compressão na última */}
{isLast && numFrames > 1 && (
<>
<line x1={colX + 13} y1="80" x2={colX + 13} y2="110" stroke="#3b82f6" strokeWidth="2" markerEnd="url(#arrowDown)" />
<text x={colX + 18} y="95" textAnchor="start" fill="#3b82f6" fontSize="10">Comp.</text>
<text x={colX + 4} y="135" textAnchor="middle" fontSize="8" fill="#475569">Sotavento</text>
</>
)}
</g>
);
})}
{/* Linha de cota para o espaçamento (e) entre C1 e C2 */}
{numFrames > 1 && (
<>
<line x1={startX + 4} y1="145" x2={startX + step + 4} y2="145" stroke="#64748b" strokeWidth="1" />
<line x1={startX + 4} y1="142" x2={startX + 4} y2="148" stroke="#64748b" strokeWidth="1" />
<line x1={startX + step + 4} y1="142" x2={startX + step + 4} y2="148" stroke="#64748b" strokeWidth="1" />
<text x={startX + step / 2 + 4} y="142" textAnchor="middle" fontSize="8" fill="#64748b">e = {spacing}m</text>
</>
)}
{/* Vento batendo na primeira coluna */}
<line x1={numFrames === 1 ? 100 : startX - 40} y1="50" x2={numFrames === 1 ? 145 : startX - 5} y2="50" stroke="#10b981" strokeWidth="2" markerEnd="url(#arrowRight)" />
<text x={numFrames === 1 ? 122 : startX - 22} y="45" textAnchor="middle" fill="#10b981" fontSize="10" fontWeight="bold">Vento (F)</text>
</>
);
})()}
{/* Tubulações transversais cortadas (Círculos azuis) */}
<circle cx="100" cy="30" r="10" fill="#3b82f6" fillOpacity="0.8" /> <circle cx="100" cy="30" r="10" fill="#3b82f6" fillOpacity="0.8" />
<circle cx="130" cy="30" r="14" fill="#3b82f6" fillOpacity="0.8" /> <circle cx="130" cy="30" r="14" fill="#3b82f6" fillOpacity="0.8" />
<circle cx="170" cy="30" r="8" fill="#3b82f6" fillOpacity="0.8" /> <circle cx="170" cy="30" r="8" fill="#3b82f6" fillOpacity="0.8" />
<circle cx="200" cy="30" r="12" fill="#3b82f6" fillOpacity="0.8" /> <circle cx="200" cy="30" r="12" fill="#3b82f6" fillOpacity="0.8" />
{/* Vento batendo na primeira coluna/tubos */}
<line x1="20" y1="50" x2="75" y2="50" stroke="#10b981" strokeWidth="2" markerEnd="url(#arrowRight)" />
<text x="45" y="45" textAnchor="middle" fill="#10b981" fontSize="10" fontWeight="bold">Vento (F)</text>
{/* Linha de cota para o espaçamento (e) */}
<line x1="84" y1="140" x2="216" y2="140" stroke="#64748b" strokeWidth="1" />
<line x1="84" y1="137" x2="84" y2="143" stroke="#64748b" strokeWidth="1" />
<line x1="216" y1="137" x2="216" y2="143" stroke="#64748b" strokeWidth="1" />
<text x="150" y="137" textAnchor="middle" fontSize="9" fill="#64748b">Espaçamento (e) = {spacing}m</text>
<defs> <defs>
<marker id="arrowUp" markerWidth="6" markerHeight="6" refX="3" refY="0" orient="auto"> <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" /> <path d="M0,6 L3,0 L6,6" fill="none" stroke="#ef4444" strokeWidth="1.5" />