🚀 Auto-deploy: BrainWind atualizado em 13/07/2026 19:40:54

This commit is contained in:
2026-07-13 19:40:54 +00:00
parent c446542a26
commit d634e869d4
4 changed files with 95 additions and 0 deletions
+22
View File
@@ -146,6 +146,28 @@ export function EducationalManual({ type, params }: EducationalManualProps) {
); );
} }
} }
// --- Pipe-racks (piperack) ---
if (type === 'piperack') {
const numFrames = Number(params.numFrames || 1);
const phiTotal = Number(params.phiTotal || 0.5);
explanations.push(
<div key="pr-phi" className="text-xs border-l-2 border-sky-400 pl-3 py-1 space-y-1">
<span className="font-bold text-foreground block">Bloqueio Frontal (φ = {phiTotal.toFixed(2)})</span>
<p>Seu pórtico bloqueia {Math.round(phiTotal * 100)}% da área que o vento tenta atravessar. Quanto maior o bloqueio, maior a força de arrasto no primeiro pórtico, mas maior será a proteção (sombra aerodinâmica) para os pórticos seguintes.</p>
</div>
);
if (numFrames > 1) {
explanations.push(
<div key="pr-frames" className="text-xs border-l-2 border-green-500 pl-3 py-1 space-y-1">
<span className="font-bold text-green-500 block">Pórticos Múltiplos (n = {numFrames})</span>
<p>O primeiro pórtico recebe carga total (F. Frontal). Os {numFrames - 1} pórticos traseiros recebem carga atenuada devido à esteira turbulenta (Fator de Proteção η). Juntos, formam a Força Global de arrasto na esteira.</p>
</div>
);
}
}
if (explanations.length === 0) return null; if (explanations.length === 0) return null;
+2
View File
@@ -8,6 +8,7 @@ import { domeManual } from './dome';
import { barManual } from './bar'; import { barManual } from './bar';
import { dynamicsManual } from './dynamics'; import { dynamicsManual } from './dynamics';
import { isolatedRoofManual } from './isolated-roof'; import { isolatedRoofManual } from './isolated-roof';
import { piperackManual } from './piperack';
export const manuals: Record<string, typeof bridgeManual> = { export const manuals: Record<string, typeof bridgeManual> = {
bridge: bridgeManual, bridge: bridgeManual,
@@ -20,4 +21,5 @@ export const manuals: Record<string, typeof bridgeManual> = {
bar: barManual, bar: barManual,
dynamics: dynamicsManual, dynamics: dynamicsManual,
'isolated-roof': isolatedRoofManual, 'isolated-roof': isolatedRoofManual,
piperack: piperackManual,
}; };
+67
View File
@@ -0,0 +1,67 @@
export const piperackManual = {
title: 'Pipe-Racks e Reticulados Múltiplos',
intro: 'Ação do vento em pórticos paralelos sucessivos (Pipe-racks, correias transportadoras e galerias), cobrindo o coeficiente de arrasto frontal e os fatores de proteção mútua para os pórticos traseiros (Sec. 7 - NBR 6123).',
sections: [
{
title: 'Geometria de Referência e Índice de Solidez',
content: (
<>
<p>
O vento age primariamente na face perpendicular aos pórticos paralelos. A área efetiva de bloqueio do pórtico frontal determina a quantidade de vento que "atravessa" a estrutura e atinge os pórticos seguintes.
</p>
<ul className="list-disc pl-5 mt-2 space-y-1">
<li><strong>Índice de Solidez (φ):</strong> É a razão entre a área sólida frontal (vigas, colunas e tubulações transversais) e a área total delimitada pelo contorno do pórtico.</li>
<li>Para Pipe-racks, tubulações transversais que cruzam a face de barlavento aumentam drasticamente a solidez e o bloqueio aerodinâmico.</li>
</ul>
</>
)
},
{
title: 'Força no Pórtico Frontal',
content: (
<>
<p>
O primeiro pórtico que recebe o vento é chamado de <strong>Pórtico Frontal</strong>. Por não ter nenhuma proteção à frente, ele recebe o vento integral e é dimensionado com o Coeficiente de Arrasto Frontal (<strong>Ca</strong>).
</p>
<p className="mt-2 text-primary font-bold">F = q × Ca × (Área Efetiva)</p>
<p className="mt-2">
De acordo com a Figura 4 (baixa turbulência) da NBR 6123, o valor de <strong>Ca</strong> depende da esbeltez do pórtico e do seu índice de solidez φ.
</p>
</>
)
},
{
title: 'Fator de Proteção (η) nos Pórticos Traseiros',
content: (
<>
<p>
Os pórticos que ficam "escondidos" atrás do pórtico frontal recebem um vento atenuado, pois parte da energia do fluxo foi bloqueada e turbilhada pelas barras do primeiro pórtico.
</p>
<p className="mt-2">
Essa redução é quantificada pelo <strong>Fator de Proteção (η)</strong>. O valor de η depende diretamente de duas coisas:
</p>
<ul className="list-disc pl-5 mt-2 space-y-1">
<li><strong>Índice de Solidez (φ):</strong> Quanto mais sólido for o primeiro pórtico, menos vento vaza para trás, e portanto <em>menor</em> será o fator η (mais proteção).</li>
<li><strong>Espaçamento Relativo (e/h):</strong> Quanto mais próximos estiverem os pórticos, maior será a área de esteira turbulenta que os envolve, gerando maior proteção.</li>
</ul>
<p className="mt-2 font-mono text-xs bg-muted p-2 rounded">
Força nos Traseiros = F_Frontal × η
</p>
</>
)
},
{
title: 'Consideração de Ação de Conjunto (Tombamento)',
content: (
<>
<p>
Quando o número de pórticos (n) é grande e a estrutura é rigidamente travada no sentido longitudinal, o vento transversal atua como uma força de tombamento na estrutura 3D.
</p>
<p className="mt-2">
A carga aerodinâmica que tenta empurrar e tombar o Pipe-Rack será combatida pelas fundações, gerando um esforço trativo considerável nas colunas de barlavento e um aumento de compressão nas colunas de sotavento, dependendo da alavanca total L = (n-1) × espaçamento.
</p>
</>
)
}
]
};
+4
View File
@@ -12,6 +12,7 @@ import { exportGenericToPDF, type GenericPDFSection } from '../lib/export-generi
import { Plus, Trash2, Layers, Info } from 'lucide-react'; import { Plus, Trash2, Layers, Info } from 'lucide-react';
import { Tooltip, TooltipContent, TooltipTrigger, TooltipProvider } from '@/components/ui/tooltip'; import { Tooltip, TooltipContent, TooltipTrigger, TooltipProvider } from '@/components/ui/tooltip';
import { Input } from '@/components/ui/input'; import { Input } from '@/components/ui/input';
import { EducationalManual } from '@/components/EducationalManual';
const PiperackModule: React.FC = () => { const PiperackModule: React.FC = () => {
const { q } = useWindStore(); const { q } = useWindStore();
@@ -206,6 +207,9 @@ const PiperackModule: React.FC = () => {
{/* Coluna Central: 3D */} {/* Coluna Central: 3D */}
<div className="flex-1 flex flex-col min-h-[500px] lg:min-h-0 bg-background rounded-xl border border-border shadow-sm overflow-hidden relative"> <div className="flex-1 flex flex-col min-h-[500px] lg:min-h-0 bg-background rounded-xl border border-border shadow-sm overflow-hidden relative">
<div className="absolute top-4 right-4 z-10">
<EducationalManual type="piperack" params={{ numFrames, phiTotal: result.phiTotal }} />
</div>
<Piperack3D <Piperack3D
width={width} width={width}
height={height} height={height}