+ {condition === 'cond1' ? 'Fundo e laterais fechados funcionam como armadilha aerodinâmica, concentrando pressão positiva (Cpi elevado) debaixo da marquise.' :
+ condition === 'cond2' ? 'A parede de fundo gera anteparo de estagnação frontal, enquanto os lados abertos permitem escape lateral do fluxo.' :
+ condition === 'cond3' ? 'O fluxo longitudinal sofre efeito Venturi, gerando sucção sob o telhado e arrasto de atrito em túnel.' :
+ 'O fluxo passa livremente pela cobertura, seguindo coeficientes da Tabela 24.'}
+
+
+ {openingPos === 'top' ? 'Fresta Superior (Alívio de Arrancamento)' :
+ openingPos === 'bottom' ? 'Vão Livre na Base (Placa Suspensa)' : 'Permeabilidade Distribuída'}
+
+
+ {openingPos === 'top' ? 'A fresta no topo da parede permite que a pressão sob o telhado escape em direção a sotavento, aliviando significativamente a força vertical de arrancamento na cobertura (até 25% menos sucção líquida).' :
+ openingPos === 'bottom' ? 'O vento passa por baixo e concentra a pressão horizontal na metade superior da parede (como placa suspensa na Tab. 23), aumentando o momento fletor na base dos pilares.' :
+ 'Aberturas distribuídas atenuam suavemente a pressão interna de acordo com a razão de áreas abertas (sec. 6.3).'}
+
+
+ );
+ }
+ }
+
if (explanations.length === 0) return null;
return (
diff --git a/app/src/components/three/Shelter3D.tsx b/app/src/components/three/Shelter3D.tsx
new file mode 100644
index 0000000..074efe3
--- /dev/null
+++ b/app/src/components/three/Shelter3D.tsx
@@ -0,0 +1,205 @@
+import React, { useRef } from 'react';
+import * as THREE from 'three';
+import { useFrame } from '@react-three/fiber';
+import { Text, Line } from '@react-three/drei';
+import type { ShelterCondition, OpeningPosition } from '@/lib/nbr-tables/table-shelters';
+
+export interface Shelter3DProps {
+ condition: ShelterCondition;
+ depth: number;
+ width: number;
+ height: number;
+ theta: number;
+ backClosure: number;
+ leftClosure: number;
+ rightClosure: number;
+ openingPos: OpeningPosition;
+ viewMode: '3d' | 'elevation';
+}
+
+const WindArrow: React.FC<{
+ start: [number, number, number];
+ end: [number, number, number];
+ color?: string;
+ speed?: number;
+}> = ({ start, end, color = '#38bdf8', speed = 1.5 }) => {
+ const arrowRef = useRef(null);
+ useFrame(({ clock }) => {
+ if (arrowRef.current) {
+ const t = (clock.getElapsedTime() * speed) % 1;
+ const x = start[0] + (end[0] - start[0]) * t;
+ const y = start[1] + (end[1] - start[1]) * t;
+ const z = start[2] + (end[2] - start[2]) * t;
+ arrowRef.current.position.set(x, y, z);
+ }
+ });
+
+ const dir = new THREE.Vector3(...end).sub(new THREE.Vector3(...start));
+ const len = dir.length();
+ const angleZ = Math.atan2(dir.y, dir.x);
+
+ return (
+
+
+
+
+
+
+ );
+};
+
+export const Shelter3D: React.FC = ({
+ condition,
+ depth,
+ width,
+ height,
+ theta,
+ backClosure,
+ leftClosure,
+ rightClosure,
+ openingPos,
+ viewMode,
+}) => {
+ const isElevation = viewMode === 'elevation';
+
+ // Geometria básica
+ const halfW = width / 2;
+ const halfD = depth / 2;
+ const thetaRad = (theta * Math.PI) / 180;
+ const slopeRise = depth * Math.tan(thetaRad);
+
+ // Paredes com abertura no topo ou na base
+ const renderWallWithGap = (
+ w: number,
+ h: number,
+ closure: number,
+ pos: OpeningPosition,
+ rotY = 0,
+ position: [number, number, number] = [0, 0, 0]
+ ) => {
+ if (closure <= 0) return null;
+
+ const op = closure / 100;
+ const wallH = h * op;
+ let yPos = position[1] + wallH / 2;
+
+ if (pos === 'top' && op < 1) {
+ // Parede na parte de baixo, fresta no topo
+ yPos = position[1] + wallH / 2;
+ } else if (pos === 'bottom' && op < 1) {
+ // Parede suspensa na parte superior, vão na base
+ yPos = position[1] + h - wallH / 2;
+ }
+
+ return (
+
+
+
+
+
+ {/* Linha de contorno */}
+
+
+
+
+
+ );
+ };
+
+ return (
+
+ {/* Plano do Solo */}
+
+
+
+
+
+
+ {/* 1. Estrutura Metálica Principal (Pilares e Vigas em Balanço - Tubos Quadrados) */}
+ {[-halfW + 0.6, halfW - 0.6].map((xPos, idx) => (
+
+ {/* Pilar traseiro (lado direito na elevação) */}
+
+
+
+
+ {/* Viga horizontal em balanço (TUBO QUAD. 150x150) */}
+
+
+
+
+
+
+
+ ))}
+
+ {/* 2. Cobertura / Marquise */}
+
+
+
+
+
+
+
+
+
+
+
+ {/* 3. Fechamentos de Fundo e Laterais (com suporte a fresta/abertura) */}
+ {/* Parede de Fundo (Traseira Z = +halfD) */}
+ {renderWallWithGap(width, height, backClosure, openingPos, 0, [0, 0, halfD])}
+
+ {/* Parede Lateral Esquerda (X = -halfW) */}
+ {renderWallWithGap(depth, height, leftClosure, 'distributed', Math.PI / 2, [-halfW, 0, 0])}
+
+ {/* Parede Lateral Direita (X = +halfW) */}
+ {renderWallWithGap(depth, height, rightClosure, 'distributed', Math.PI / 2, [halfW, 0, 0])}
+
+ {/* 4. Linhas de Corrente e Vetores de Vento (Ilustrativo e Didático) */}
+
+ {/* Vento de entrada (Barlavento) */}
+
+
+
+
+ {/* Linhas de corrente sobre o telhado */}
+
+
+ {/* Fresta na parede de fundo: se houver abertura no topo, mostrar vento escapando pela fresta superior! */}
+ {backClosure > 0 && backClosure < 100 && openingPos === 'top' && (
+ <>
+
+
+ Alívio (Fresta Topo)
+
+ >
+ )}
+
+ {/* Fresta na base */}
+ {backClosure > 0 && backClosure < 100 && openingPos === 'bottom' && (
+ <>
+
+
+ Vão Livre Inferior
+
+ >
+ )}
+
+
+ {/* Textos Informativos 3D */}
+
+ {isElevation ? 'CORTE A-A (Elevação)' : 'Abrigo / Pórtico (NBR 6123)'}
+
+
+ VENTO FRONTAL
+
+
+ );
+};
+
+export default Shelter3D;
diff --git a/app/src/data/manuals/index.ts b/app/src/data/manuals/index.ts
index cc56a3d..e646bef 100644
--- a/app/src/data/manuals/index.ts
+++ b/app/src/data/manuals/index.ts
@@ -10,6 +10,7 @@ import { dynamicsManual } from './dynamics';
import { isolatedRoofManual } from './isolated-roof';
import { piperackManual } from './piperack';
import { calcCaManual } from './calc_ca';
+import { shelterManual } from './shelter';
export const manuals: Record = {
bridge: bridgeManual,
@@ -24,4 +25,5 @@ export const manuals: Record = {
'isolated-roof': isolatedRoofManual,
piperack: piperackManual,
calc_ca: calcCaManual,
+ shelter: shelterManual,
};
diff --git a/app/src/data/manuals/shelter.tsx b/app/src/data/manuals/shelter.tsx
new file mode 100644
index 0000000..bfaa51d
--- /dev/null
+++ b/app/src/data/manuals/shelter.tsx
@@ -0,0 +1,71 @@
+import React from 'react';
+
+export const shelterManual = {
+ title: 'Abrigos, Marquises e Pórticos Fechados',
+ intro: 'Ação do vento em coberturas apoiadas ou em balanço com fechamentos laterais/fundo e aberturas parciais (NBR 6123:2023 — Tabelas 23, 24, 25 e Seção 6.3).',
+ sections: [
+ {
+ title: '1. O Conceito das 4 Condições Topológicas',
+ content: (
+
+
+ Abrigos, marquises e garagens semiabertas combinam o escoamento ao redor da cobertura (Tabelas 24/25) com o efeito de retenção ou canalização do vento gerado pelas paredes de fechamento (Seção 6.3 — Pressão Interna).
+
+
+
+ Condição 1 (Estanque em 3 lados - Fundo e Laterais fechados): O vento frontal fica contido como em uma armadilha, gerando alta pressão interna positiva (Cpi até +0,8). Essa pressão empurra o telhado para cima, somando-se à sucção externa e gerando o pico máximo de arrancamento.
+
+
+ Condição 2 (Fundo fechado e Laterais abertas - Marquise encostada): A parede traseira funciona como anteparo de estagnação. O fluxo escapa lateralmente, mas mantém sobrepressão moderada sob a cobertura na zona junto ao fundo.
+
+
+ Condição 3 (Fundo aberto e Laterais fechadas - Túnel / Passarela): A aceleração do ar dentro do túnel (Efeito Venturi) gera depressão (Cpi negativo) na face inferior da cobertura, reduzindo o arrancamento vertical, porém elevando o arrasto de atrito longitudinal.
+
+
+ Condição 4 (Totalmente aberto em 4 lados): Recai no regime puro de Cobertura Isolada (Tabela 24 da norma).
+
+
+
+ ),
+ },
+ {
+ title: '2. Fechamentos Parciais (%) e Posição da Abertura',
+ content: (
+
+
+ O controle percentual de fechamento de cada face permite calcular a permeabilidade μ e a pressão interna efetiva conforme a Seção 6.3:
+
+ Por que a posição da abertura (Topo vs. Base) é tão importante?
+
+
+
+ Abertura no Topo (Fresta Superior / Lanternim): O ar sob pressão escapa diretamente pela fresta entre a parede e o telhado. Isso alivia a pressão interna sob a cobertura, reduziando a força vertical de arrancamento em até 25% a 30%!
+
+
+ Abertura na Base (Vão Livre Inferior): O ar circula rente ao solo, transformando a parede traseira em uma placa suspensa (Tabela 23). Isso eleva o centro de pressão horizontal e aumenta o momento fletor na base dos pilares do pórtico.
+