🚀 Auto-deploy: BrainWind atualizado em 13/07/2026 19:59:48

This commit is contained in:
2026-07-13 19:59:48 +00:00
parent d634e869d4
commit 08f83055a6
+73 -2
View File
@@ -77,14 +77,14 @@ export function WindFlowGrid2D({ type }: WindFlowGrid2DProps) {
// Define quais itens de legenda devem ser exibidos para cada tipo de módulo // Define quais itens de legenda devem ser exibidos para cada tipo de módulo
const getVisibleLegendItems = () => { const getVisibleLegendItems = () => {
const hasCpi = ['warehouse'].includes(type); const hasCpi = ['warehouse'].includes(type);
const hasVortex = ['isolated-roof', 'bar', 'tower', 'vault', 'cylinder', 'sign', 'dynamics'].includes(type); const hasVortex = ['isolated-roof', 'bar', 'tower', 'vault', 'cylinder', 'sign', 'dynamics', 'piperack'].includes(type);
const hasLift = ['bridge', 'isolated-roof'].includes(type); const hasLift = ['bridge', 'isolated-roof'].includes(type);
return { return {
wind: true, wind: true,
fast: true, fast: true,
vortex: hasVortex, vortex: hasVortex,
vortexSpin: ['cylinder', 'dynamics', 'sign'].includes(type), vortexSpin: ['cylinder', 'dynamics', 'sign', 'piperack'].includes(type),
cpiPos: hasCpi, cpiPos: hasCpi,
cpiNeg: hasCpi, cpiNeg: hasCpi,
lift: hasLift, lift: hasLift,
@@ -98,6 +98,7 @@ export function WindFlowGrid2D({ type }: WindFlowGrid2DProps) {
case 'vault': case 'vault':
case 'dome': case 'dome':
case 'warehouse': case 'warehouse':
case 'piperack':
return 'Vista Lateral (Corte Transversal)'; return 'Vista Lateral (Corte Transversal)';
case 'cylinder': case 'cylinder':
case 'sign': case 'sign':
@@ -693,6 +694,76 @@ export function WindFlowGrid2D({ type }: WindFlowGrid2DProps) {
</div> </div>
); );
case 'piperack':
return (
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{/* Caso 1 */}
<div className="flex flex-col gap-2 bg-white dark:bg-slate-950 border border-border/60 p-3 rounded-lg">
<span className="text-xs font-bold text-sky-400">Pórtico Frontal (Sem Proteção)</span>
<div className="relative aspect-video bg-slate-100 dark:bg-slate-900/60 rounded-md overflow-hidden border border-border/30">
<svg viewBox="0 0 300 150" className="w-full h-full">
{styleBlock}
<line x1="0" y1="130" x2="300" y2="130" stroke="#475569" strokeWidth="2" />
<path d="M -20,30 L 320,30" className="wind-line-slow" />
<path d="M -20,60 C 100,60 120,40 150,40 C 180,40 200,60 320,60" className="wind-line" />
<path d="M -20,100 C 100,100 120,70 150,70 C 180,70 200,100 320,100" className="wind-line-fast" />
{/* Esteira turbulenta no sotavento */}
<circle cx="180" cy="85" r="12" fill="none" stroke="#ef4444" strokeWidth="1.2" strokeDasharray="2 4" className="vortex-spin-cw" />
<path d="M 160,110 Q 210,85 320,120" className="vortex-line" />
{/* Pórtico Pipe-rack */}
<rect x="145" y="40" width="10" height="90" fill="#475569" stroke="#64748b" strokeWidth="1.5" />
<rect x="135" y="50" width="30" height="8" fill="#475569" stroke="#64748b" strokeWidth="1.5" />
<circle cx="150" cy="45" r="12" fill="#3b82f6" stroke="#2563eb" strokeWidth="1.5" /> {/* Tubo */}
<circle cx="150" cy="75" r="8" fill="#f59e0b" stroke="#d97706" strokeWidth="1.5" /> {/* Tubo */}
</svg>
</div>
<p className="text-[10px] text-muted-foreground leading-snug">Vento limpo atinge o pórtico frontal e suas tubulações com 100% da velocidade. Arrasto máximo (Ca Frontal).</p>
</div>
{/* Caso 2 */}
<div className="flex flex-col gap-2 bg-white dark:bg-slate-950 border border-border/60 p-3 rounded-lg">
<span className="text-xs font-bold text-rose-400">Pórticos Traseiros (Sombra Aerodinâmica)</span>
<div className="relative aspect-video bg-slate-100 dark:bg-slate-900/60 rounded-md overflow-hidden border border-border/30">
<svg viewBox="0 0 300 150" className="w-full h-full">
{styleBlock}
<line x1="0" y1="130" x2="300" y2="130" stroke="#475569" strokeWidth="2" />
<path d="M -20,30 L 320,30" className="wind-line-slow" />
<path d="M -20,60 C 80,60 100,30 150,30 C 200,30 220,60 320,60" className="wind-line" />
{/* Esteira turbulenta cobrindo pórticos traseiros */}
<path d="M 120,100 Q 170,60 220,100 T 320,100" className="vortex-line" />
<path d="M 130,80 Q 180,50 230,80 T 320,80" className="vortex-line" />
<circle cx="150" cy="90" r="15" fill="none" stroke="#ef4444" strokeWidth="1.2" strokeDasharray="2 4" className="vortex-spin-cw" />
<circle cx="210" cy="85" r="15" fill="none" stroke="#ef4444" strokeWidth="1.2" strokeDasharray="2 4" className="vortex-spin-ccw" />
{/* Pórticos Múltiplos */}
{/* Pórtico 1 */}
<g transform="translate(80, 0)">
<rect x="0" y="40" width="10" height="90" fill="#475569" stroke="#64748b" strokeWidth="1.5" />
<rect x="-10" y="50" width="30" height="8" fill="#475569" stroke="#64748b" strokeWidth="1.5" />
<circle cx="5" cy="45" r="12" fill="#3b82f6" stroke="#2563eb" strokeWidth="1.5" />
</g>
{/* Pórtico 2 */}
<g transform="translate(140, 0)">
<rect x="0" y="40" width="10" height="90" fill="#64748b" stroke="#94a3b8" strokeWidth="1.5" opacity="0.8" />
<rect x="-10" y="50" width="30" height="8" fill="#64748b" stroke="#94a3b8" strokeWidth="1.5" opacity="0.8" />
<circle cx="5" cy="45" r="12" fill="#3b82f6" stroke="#2563eb" strokeWidth="1.5" opacity="0.8" />
</g>
{/* Pórtico 3 */}
<g transform="translate(200, 0)">
<rect x="0" y="40" width="10" height="90" fill="#94a3b8" stroke="#cbd5e1" strokeWidth="1.5" opacity="0.6" />
<rect x="-10" y="50" width="30" height="8" fill="#94a3b8" stroke="#cbd5e1" strokeWidth="1.5" opacity="0.6" />
<circle cx="5" cy="45" r="12" fill="#3b82f6" stroke="#2563eb" strokeWidth="1.5" opacity="0.6" />
</g>
</svg>
</div>
<p className="text-[10px] text-muted-foreground leading-snug">Pórticos sucessivos ficam imersos na esteira turbulenta do primeiro (Fator de proteção η). A carga neles é drasticamente atenuada.</p>
</div>
</div>
);
default: default:
// Caso padrão dinâmico geral (Módulos dinâmicos simples) // Caso padrão dinâmico geral (Módulos dinâmicos simples)
return ( return (