🚀 Auto-deploy: BrainWind atualizado em 01/09/2026 14:27:19
This commit is contained in:
@@ -37,6 +37,7 @@ const ShelterModule: React.FC = () => {
|
||||
const [width, setWidth] = useState(10);
|
||||
const [height, setHeight] = useState(4.8);
|
||||
const [theta, setTheta] = useState(5);
|
||||
const [numColumns, setNumColumns] = useState(2);
|
||||
const [backClosure, setBackClosure] = useState(75);
|
||||
const [backRange, setBackRange] = useState<[number, number]>([0, 75]);
|
||||
const [leftClosure, setLeftClosure] = useState(100);
|
||||
@@ -91,12 +92,13 @@ const ShelterModule: React.FC = () => {
|
||||
leftClosure,
|
||||
rightClosure,
|
||||
openingPos,
|
||||
numColumns,
|
||||
};
|
||||
return {
|
||||
result: calculateShelterWind({ ...input, windAngle }, q),
|
||||
envelope: calculateShelterWindAllAngles(input, q),
|
||||
};
|
||||
}, [condition, q, depth, width, height, theta, backClosure, backRange, leftClosure, rightClosure, openingPos, windAngle]);
|
||||
}, [condition, q, depth, width, height, theta, backClosure, backRange, leftClosure, rightClosure, openingPos, windAngle, numColumns]);
|
||||
|
||||
const effAreaRoof = depth * width;
|
||||
const effAreaBack = (width * height) * (backClosure / 100);
|
||||
@@ -126,12 +128,13 @@ const ShelterModule: React.FC = () => {
|
||||
title: `Coeficientes Aerodinâmicos e Pressões Líquidas - Direção ${angleLabel}`,
|
||||
type: 'grid',
|
||||
gridItems: [
|
||||
{ label: 'Ce Superior (Cobertura - Tab. 24)', value: result.cpeTop },
|
||||
{ label: 'Ce Médio (Cobertura)', value: result.cpeTop },
|
||||
{ label: 'Ce Borda (Pico Aerodinâmico)', value: result.cpeEdgeTop },
|
||||
{ label: 'Cpi Inferior (Sobrepressão sob Telhado)', value: result.cpiBottom },
|
||||
{ label: 'Cnf Resultante (Ce - Cpi)', value: result.cnfVertical },
|
||||
{ label: 'Cnf Médio Resultante', value: result.cnfVertical },
|
||||
{ label: 'Cnf Borda Resultante', value: result.cnfEdgeVertical },
|
||||
{ label: 'Cf Parede de Fundo (Tab. 23 / 6)', value: result.cfBack },
|
||||
{ label: 'Cf Paredes Laterais', value: result.cfSide },
|
||||
{ label: 'Alívio por Fresta Superior', value: `${result.reliefPercentage}%` },
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -224,11 +227,11 @@ const ShelterModule: React.FC = () => {
|
||||
`Máx: +${Math.max(envelope.res0.cpiBottom, envelope.res45.cpiBottom, envelope.res90.cpiBottom).toFixed(2)}`
|
||||
],
|
||||
[
|
||||
'Cnf Vertical Líquido',
|
||||
String(envelope.res0.cnfVertical),
|
||||
String(envelope.res45.cnfVertical),
|
||||
String(envelope.res90.cnfVertical),
|
||||
`Crítico: ${Math.min(envelope.res0.cnfVertical, envelope.res45.cnfVertical, envelope.res90.cnfVertical)}`
|
||||
'Cnf Vertical Médio | Borda',
|
||||
`${envelope.res0.cnfVertical} | ${envelope.res0.cnfEdgeVertical}`,
|
||||
`${envelope.res45.cnfVertical} | ${envelope.res45.cnfEdgeVertical}`,
|
||||
`${envelope.res90.cnfVertical} | ${envelope.res90.cnfEdgeVertical}`,
|
||||
`Crítico Borda: ${Math.min(envelope.res0.cnfEdgeVertical, envelope.res45.cnfEdgeVertical, envelope.res90.cnfEdgeVertical)}`
|
||||
],
|
||||
[
|
||||
'Força Vertical Telhado [Fz ↑]',
|
||||
@@ -286,6 +289,13 @@ const ShelterModule: React.FC = () => {
|
||||
`${envelope.res90.lineLoads.beamLoad} kN/m`,
|
||||
`${Math.max(envelope.res0.lineLoads.beamLoad, envelope.res45.lineLoads.beamLoad, envelope.res90.lineLoads.beamLoad).toFixed(2)} kN/m`
|
||||
],
|
||||
[
|
||||
'Momento na Raiz da Viga',
|
||||
`${envelope.res0.lineLoads.beamMoment} kN.m`,
|
||||
`${envelope.res45.lineLoads.beamMoment} kN.m`,
|
||||
`${envelope.res90.lineLoads.beamMoment} kN.m`,
|
||||
`${Math.max(envelope.res0.lineLoads.beamMoment, envelope.res45.lineLoads.beamMoment, envelope.res90.lineLoads.beamMoment).toFixed(2)} kN.m`
|
||||
],
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -302,14 +312,19 @@ const ShelterModule: React.FC = () => {
|
||||
title: `Cargas Lineares para Dimensionamento (${angleLabel}) (kN/m)`,
|
||||
type: 'grid',
|
||||
gridItems: [
|
||||
{ label: 'Carga Horizontal no Pilar Traseiro', value: `${result.lineLoads.columnLoad} kN/m` },
|
||||
{ label: 'Carga Vertical na Viga em Balanço', value: `${result.lineLoads.beamLoad} kN/m` },
|
||||
{ label: 'Carga Horiz. Pórtico Central', value: `${result.lineLoads.columnLoad} kN/m` },
|
||||
{ label: 'Carga Horiz. Extremidade', value: `${result.lineLoads.columnLoadEdge} kN/m` },
|
||||
{ label: 'Carga Vert. Média Viga Central', value: `${result.lineLoads.beamLoad} kN/m` },
|
||||
{ label: 'Carga Vert. Média Extremidade', value: `${result.lineLoads.beamLoadEdge} kN/m` },
|
||||
{ label: 'Momento Engaste Viga Central', value: `${result.lineLoads.beamMoment} kN.m` },
|
||||
{ label: 'Momento Engaste Extremidade', value: `${result.lineLoads.beamMomentEdge} kN.m` },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Parecer Técnico do Regime Topológico e Aerodinâmico',
|
||||
title: 'Parecer Técnico e Alertas Aerodinâmicos (Zonas de Borda)',
|
||||
type: 'text',
|
||||
content: `${result.statusText} Permeabilidade líquida da parede de fundo: ${100 - backClosure}%. Alívio de arrancamento obtido pela fresta superior: ${result.reliefPercentage}%. O relatório acima apresenta a tabela comparativa das 3 incidências de vento (0°, 45° e 90°) para garantir a verificação da envoltória mais desfavorável conforme a NBR 6123:2023. As cargas lineares calculadas (kN/m) podem ser aplicadas diretamente em softwares de pórtico plano como Ftool, SAP2000 ou CYPE 3D.`,
|
||||
content: `${result.statusText} Permeabilidade líquida da parede de fundo: ${100 - backClosure}%. Alívio de arrancamento obtido pela fresta superior: ${result.reliefPercentage}%.
|
||||
⚠️ ATENÇÃO ESTRUTURAL (Efeito Asa de Avião): O coeficiente global médio subestima a força de arrancamento na ponta do balanço. Os cálculos acima consideram as zonas de borda com coeficientes extremos (Cnf Borda = ${result.cnfEdgeVertical}). O Momento Fletor na raiz da viga foi calculado considerando que o centro de pressão está deslocado para próximo à extremidade livre (L/3), o que resulta num momento de engaste substancialmente maior que o de uma carga uniformemente distribuída simples.`,
|
||||
},
|
||||
{
|
||||
title: 'Guia de Aplicação dos Eixos e Resultantes no Croqui',
|
||||
@@ -355,7 +370,7 @@ const ShelterModule: React.FC = () => {
|
||||
</div>
|
||||
<SaveModuleDialog
|
||||
moduleType="shelter"
|
||||
inputs={{ condition, depth, width, height, theta, backClosure, leftClosure, rightClosure, openingPos, windAngle, surfaceMass }}
|
||||
inputs={{ condition, depth, width, height, theta, backClosure, leftClosure, rightClosure, openingPos, windAngle, surfaceMass, numColumns }}
|
||||
/>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-5">
|
||||
@@ -480,6 +495,13 @@ const ShelterModule: React.FC = () => {
|
||||
</div>
|
||||
<Slider min={0} max={30} step={1} value={[theta]} onValueChange={(v) => setTheta(v[0])} />
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<div className="flex justify-between text-xs">
|
||||
<span>Número de Pórticos (Pilares):</span>
|
||||
<span className="font-mono font-medium">{numColumns} pórticos</span>
|
||||
</div>
|
||||
<Slider min={2} max={20} step={1} value={[numColumns]} onValueChange={(v) => setNumColumns(v[0])} />
|
||||
</div>
|
||||
|
||||
<div className="space-y-2 pt-2 border-t">
|
||||
<div className="flex justify-between text-xs">
|
||||
@@ -547,6 +569,7 @@ const ShelterModule: React.FC = () => {
|
||||
rightClosure={rightClosure}
|
||||
openingPos={openingPos}
|
||||
windAngle={windAngle}
|
||||
numColumns={numColumns}
|
||||
viewMode={viewMode}
|
||||
/>
|
||||
) : (
|
||||
@@ -573,8 +596,8 @@ const ShelterModule: React.FC = () => {
|
||||
<span className="font-mono font-bold text-foreground">{result.forces.fzUp.toFixed(2)} kN</span>
|
||||
</div>
|
||||
<div className="flex justify-between items-center text-xs text-muted-foreground">
|
||||
<span>Coeficiente Cnf</span>
|
||||
<span className="font-mono">{result.cnfVertical}</span>
|
||||
<span>Cnf Médio | Cnf Borda</span>
|
||||
<span className="font-mono">{result.cnfVertical} | <span className="text-destructive font-bold">{result.cnfEdgeVertical}</span></span>
|
||||
</div>
|
||||
<div className="flex justify-between items-center text-[11px] text-muted-foreground/80">
|
||||
<span>Pressão (/m²)</span>
|
||||
@@ -614,13 +637,17 @@ const ShelterModule: React.FC = () => {
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex justify-between items-center pb-2 border-b">
|
||||
<span className="text-primary font-medium">Carga no Pilar (Pórtico)</span>
|
||||
<span className="text-primary font-medium">Carga no Pilar (Central)</span>
|
||||
<span className="font-mono font-bold text-emerald-600 dark:text-emerald-400">{result.lineLoads.columnLoad.toFixed(2)} kN/m</span>
|
||||
</div>
|
||||
<div className="flex justify-between items-center pb-3 border-b">
|
||||
<span className="text-primary font-medium">Carga na Viga (Balanço)</span>
|
||||
<div className="flex justify-between items-center pt-2">
|
||||
<span className="text-primary font-medium">Carga Vertical Viga (Central)</span>
|
||||
<span className="font-mono font-bold text-sky-600 dark:text-sky-400">{result.lineLoads.beamLoad.toFixed(2)} kN/m</span>
|
||||
</div>
|
||||
<div className="flex justify-between items-center pb-3 border-b text-xs text-muted-foreground">
|
||||
<span>Momento Engaste (Asa)</span>
|
||||
<span className="font-mono text-destructive font-bold">{result.lineLoads.beamMoment.toFixed(2)} kN.m</span>
|
||||
</div>
|
||||
|
||||
<div className="pt-1 space-y-2">
|
||||
<div className="font-bold text-xs text-primary flex items-center justify-between">
|
||||
|
||||
Reference in New Issue
Block a user