🚀 Auto-deploy: BrainWind atualizado em 28/07/2026 00:39:32
This commit is contained in:
@@ -240,6 +240,36 @@ const ReportDocument = ({ galpao, wind, sceneImage }: ReportProps) => {
|
|||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
|
<View style={styles.section}>
|
||||||
|
<Text style={styles.sectionTitle}>4. Demonstração dos Passos Matemáticos — Galpão Retangular (NBR 6123)</Text>
|
||||||
|
<View style={styles.mathCard}>
|
||||||
|
<Text style={{ fontSize: 9, fontWeight: 'bold', color: '#1e1b4b', marginBottom: 2 }}>
|
||||||
|
1. Pressão Dinâmica de Referência (q)
|
||||||
|
</Text>
|
||||||
|
<Text style={{ fontSize: 8, color: '#475569', marginBottom: 4 }}>
|
||||||
|
Fórmula: q = 0,613 · Vk² [N/m²] = 0,000613 · Vk² [kN/m²] | Cálculo: 0,613 · ({wind.vk.toFixed(2)} m/s)² / 1000 = {wind.q.toFixed(3)} kN/m²
|
||||||
|
</Text>
|
||||||
|
<Text style={{ fontSize: 9, fontWeight: 'bold', color: '#1e1b4b', marginBottom: 2 }}>
|
||||||
|
2. Relações Geométricas e Seleção Normativa (Tabelas 4 e 5)
|
||||||
|
</Text>
|
||||||
|
<Text style={{ fontSize: 8, color: '#475569', marginBottom: 4 }}>
|
||||||
|
h/b = {(galpao.height / galpao.width).toFixed(2)} | a/b = {(galpao.length / galpao.width).toFixed(2)} — Determinam a distribuição aerodinâmica nas 4 paredes e nas águas do telhado.
|
||||||
|
</Text>
|
||||||
|
<Text style={{ fontSize: 9, fontWeight: 'bold', color: '#1e1b4b', marginBottom: 2 }}>
|
||||||
|
3. Pressão Líquida Efetiva (p)
|
||||||
|
</Text>
|
||||||
|
<Text style={{ fontSize: 8, color: '#475569', marginBottom: 4 }}>
|
||||||
|
Fórmula: p = q · (Cpe − Cpi) [kN/m²] — Aplicação simultânea dos coeficientes externos e da pressão interna Cpi ({cpi}) da edificação.
|
||||||
|
</Text>
|
||||||
|
<Text style={{ fontSize: 9, fontWeight: 'bold', color: '#1e1b4b', marginBottom: 2 }}>
|
||||||
|
4. Cargas Lineares por Elemento (w)
|
||||||
|
</Text>
|
||||||
|
<Text style={{ fontSize: 8, color: '#475569' }}>
|
||||||
|
Fórmula: w = p · espaçamento [kN/m] (Pórticos: e = {FRAME_SPACING} m | Terças: e = {PURLIN_SPACING} m).
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
|
||||||
{[0, 90].map((angle, index) => {
|
{[0, 90].map((angle, index) => {
|
||||||
const wCpe = getWallCpeOfficial(galpao.length, galpao.width, galpao.height, angle as 0 | 90);
|
const wCpe = getWallCpeOfficial(galpao.length, galpao.width, galpao.height, angle as 0 | 90);
|
||||||
const rCpe = getRoofCpeOfficial(galpao.length, galpao.width, galpao.height, galpao.roofPitch, angle as 0 | 90);
|
const rCpe = getRoofCpeOfficial(galpao.length, galpao.width, galpao.height, galpao.roofPitch, angle as 0 | 90);
|
||||||
@@ -247,7 +277,7 @@ const ReportDocument = ({ galpao, wind, sceneImage }: ReportProps) => {
|
|||||||
const rLoads = getRoofLinearLoads(wind.cpi, wind.q, rCpe, PURLIN_SPACING, galpao.roofPitch);
|
const rLoads = getRoofLinearLoads(wind.cpi, wind.q, rCpe, PURLIN_SPACING, galpao.roofPitch);
|
||||||
const rxns = getAllPillarBaseReactions(colLoads, galpao.height);
|
const rxns = getAllPillarBaseReactions(colLoads, galpao.height);
|
||||||
const dForce = getDragForce(wCpe, rCpe, wind.q, galpao.length, galpao.width, galpao.height, galpao.roofPitch, angle as 0 | 90);
|
const dForce = getDragForce(wCpe, rCpe, wind.q, galpao.length, galpao.width, galpao.height, galpao.roofPitch, angle as 0 | 90);
|
||||||
const secBase = index === 0 ? 4 : 6;
|
const secBase = index === 0 ? 5 : 7;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View wrap={false} key={`angle-${angle}`} style={{ marginTop: 15 }}>
|
<View wrap={false} key={`angle-${angle}`} style={{ marginTop: 15 }}>
|
||||||
|
|||||||
@@ -81,6 +81,33 @@ const BarSelectorModule: React.FC = () => {
|
|||||||
]
|
]
|
||||||
: [],
|
: [],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'Demonstração dos Passos Matemáticos — Cálculo de Forças em Barras',
|
||||||
|
type: 'math-card',
|
||||||
|
mathSteps: [
|
||||||
|
{
|
||||||
|
title: '1. Fator de Efeito de Extremidade (k)',
|
||||||
|
formula: 'k = f(λ) onde esbeltez λ = ℓ / d_ou_b (Tabela 26 NBR 6123)',
|
||||||
|
calculation: `${length} m / ${barType === 'flat' ? width : diameter} m = ${(length / (barType === 'flat' ? width : diameter)).toFixed(1)} -> Fator k = ${(barType === 'flat' && flatResult ? flatResult.kFactor : circleResult?.kFactor || 1).toFixed(2)}`,
|
||||||
|
result: `k = ${(barType === 'flat' && flatResult ? flatResult.kFactor : circleResult?.kFactor || 1).toFixed(2)}`,
|
||||||
|
note: 'Reduz o arrasto para barras finitas considerando o fluxo tridimensional nas extremidades.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2. Coeficiente de Arrasto / Força da Seção (Ca, Cx, Cy)',
|
||||||
|
formula: barType === 'flat' ? 'Cx, Cy em função do ângulo α e geometria da seção (Tab. 27/28)' : 'Ca em função de Re = 70.000 · Vk · d (Tab. 26)',
|
||||||
|
calculation: barType === 'flat' && flatResult ? `Cx = ${flatResult.cx.toFixed(2)} | Cy = ${flatResult.cy.toFixed(2)}` : `Re = ${reCircle.toExponential(2)} -> Ca = ${circleResult?.ca.toFixed(2) || '1.00'}`,
|
||||||
|
result: barType === 'flat' && flatResult ? `Cx = ${flatResult.cx.toFixed(2)}` : `Ca = ${circleResult?.ca.toFixed(2) || '1.00'}`,
|
||||||
|
note: 'Coeficiente aerodinâmico determinado pelas características geométricas da seção transversal.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '3. Força Aerodinâmica Resultante (F)',
|
||||||
|
formula: 'F = q · Coeficiente · k · Área_frontal [kN]',
|
||||||
|
calculation: `${q.toFixed(3)} kN/m² · Coeficiente · k · Área = ${(barType === 'flat' && flatResult ? flatResult.fxKN : circleResult?.forceKN || 0).toFixed(3)} kN`,
|
||||||
|
result: `F_arrasto = ${(barType === 'flat' && flatResult ? flatResult.fxKN : circleResult?.forceKN || 0).toFixed(3)} kN`,
|
||||||
|
note: 'Força total atuante no eixo da barra, aplicada no centroide da área de incidência.',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
exportGenericToPDF('Barra Prismática', sections);
|
exportGenericToPDF('Barra Prismática', sections);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -66,17 +66,19 @@ const BridgeModule: React.FC = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleExportPDF = () => {
|
const handleExportPDF = () => {
|
||||||
|
const q = (0.613 * Math.pow(vk, 2)) / 1000;
|
||||||
const sections: GenericPDFSection[] = [
|
const sections: GenericPDFSection[] = [
|
||||||
{
|
{
|
||||||
title: 'Parâmetros da Ponte',
|
title: 'Geometria do Tabuleiro',
|
||||||
type: 'grid',
|
type: 'grid',
|
||||||
gridItems: [
|
gridItems: [
|
||||||
{ label: 'Maior vão (Lₚ)', value: `${lp} m` },
|
{ label: 'Comprimento do Vão Principal (Lₚ)', value: `${lp} m` },
|
||||||
{ label: 'Largura (B)', value: `${width} m` },
|
{ label: 'Largura do Tabuleiro (b)', value: `${width} m` },
|
||||||
{ label: 'Altura equivalente (Hₑg)', value: `${heg} m` },
|
{ label: 'Altura do Tabuleiro (h)', value: `${deckHeight} m` },
|
||||||
{ label: 'Altura do tabuleiro (z)', value: `${deckHeight} m` },
|
{ label: 'Altura Livre acima do Solo/Água (hₑg)', value: `${heg} m` },
|
||||||
|
{ label: 'Relação b/h', value: (width / deckHeight).toFixed(2) },
|
||||||
{ label: 'Massa linear (m)', value: `${mass} kg/m` },
|
{ label: 'Massa linear (m)', value: `${mass} kg/m` },
|
||||||
{ label: 'Velocidade crítica (V_it)', value: `${classification.vit.toFixed(2)} m/s` },
|
{ label: 'Frequência do modo vertical (fᵥ)', value: `${fv} Hz` },
|
||||||
{ label: 'Ângulo de Ataque (α)', value: `${alpha}°` },
|
{ label: 'Ângulo de Ataque (α)', value: `${alpha}°` },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -107,6 +109,40 @@ const BridgeModule: React.FC = () => {
|
|||||||
{ label: 'Galope (V_F vs 1.25Vk)', value: `${galope.vf.toFixed(1)} > ${galope.vkCrit.toFixed(1)} m/s → ${galope.ok ? 'OK' : 'REVER'}` },
|
{ label: 'Galope (V_F vs 1.25Vk)', value: `${galope.vf.toFixed(1)} > ${galope.vkCrit.toFixed(1)} m/s → ${galope.ok ? 'OK' : 'REVER'}` },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'Demonstração dos Passos Matemáticos — Forças no Tabuleiro da Ponte',
|
||||||
|
type: 'math-card',
|
||||||
|
mathSteps: [
|
||||||
|
{
|
||||||
|
title: '1. Pressão Dinâmica de Referência (q)',
|
||||||
|
formula: 'q = 0,613 · Vk² [N/m²] = 0,000613 · Vk² [kN/m²] (NBR 6123 Sec. 4.2)',
|
||||||
|
calculation: `0,613 · (${vk} m/s)² / 1000 = ${q.toFixed(3)} kN/m²`,
|
||||||
|
result: `${q.toFixed(3)} kN/m²`,
|
||||||
|
note: 'Pressão de referência para empuxo horizontal, sustentação vertical e momento torçor.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2. Força de Empuxo Horizontal por Metro linear (Fx / L)',
|
||||||
|
formula: 'Fx/L = q · Cx · h_tabuleiro [kN/m] (Tabelas 35 e 36 NBR 6123)',
|
||||||
|
calculation: `${q.toFixed(3)} kN/m² · ${forces.cx.toFixed(2)} · (${deckHeight} m) = ${forces.fxPerLength.toFixed(3)} kN/m`,
|
||||||
|
result: `Fx/L = ${forces.fxPerLength.toFixed(3)} kN/m`,
|
||||||
|
note: 'Força de arrasto atuante no sentido horizontal transversal ao eixo da ponte.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '3. Força de Sustentação Vertical por Metro linear (Fz / L)',
|
||||||
|
formula: 'Fz/L = q · Cz · b_tabuleiro [kN/m]',
|
||||||
|
calculation: `${q.toFixed(3)} kN/m² · ${forces.cz.toFixed(2)} · (${width} m) = ${forces.fzPerLength.toFixed(3)} kN/m`,
|
||||||
|
result: `Fz/L = ${forces.fzPerLength.toFixed(3)} kN/m`,
|
||||||
|
note: 'Força vertical aerodinâmica (arrancamento ou sobrecarga) ao longo do vão do tabuleiro.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '4. Momento Torçor por Metro linear (Mt / L)',
|
||||||
|
formula: 'Mt/L = q · Cm · b² [kNm/m]',
|
||||||
|
calculation: `${q.toFixed(3)} kN/m² · ${forces.cm.toFixed(2)} · (${width} m)² = ${forces.fmPerLength.toFixed(3)} kNm/m`,
|
||||||
|
result: `Mt/L = ${forces.fmPerLength.toFixed(3)} kNm/m`,
|
||||||
|
note: 'Torque aerodinâmico induzido pela inclinação do vento em relação à corda do tabuleiro.',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
exportGenericToPDF('Tabuleiro de Ponte', sections);
|
exportGenericToPDF('Tabuleiro de Ponte', sections);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ const CylinderModule: React.FC = () => {
|
|||||||
}, [diameter, height, vk, surface, endType, globalCpi]);
|
}, [diameter, height, vk, surface, endType, globalCpi]);
|
||||||
|
|
||||||
const handleExportPDF = () => {
|
const handleExportPDF = () => {
|
||||||
|
const q = (0.613 * Math.pow(vk, 2)) / 1000;
|
||||||
const sections: GenericPDFSection[] = [
|
const sections: GenericPDFSection[] = [
|
||||||
{
|
{
|
||||||
title: 'Geometria do Cilindro',
|
title: 'Geometria do Cilindro',
|
||||||
@@ -71,6 +72,33 @@ const CylinderModule: React.FC = () => {
|
|||||||
{ label: 'Nota Cpi', value: result.cpiNote },
|
{ label: 'Nota Cpi', value: result.cpiNote },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'Demonstração dos Passos Matemáticos — Cálculo Aerodinâmico do Cilindro',
|
||||||
|
type: 'math-card',
|
||||||
|
mathSteps: [
|
||||||
|
{
|
||||||
|
title: '1. Pressão Dinâmica de Referência (q)',
|
||||||
|
formula: 'q = 0,613 · Vk² [N/m²] = 0,000613 · Vk² [kN/m²] (NBR 6123 Sec. 4.2)',
|
||||||
|
calculation: `0,613 · (${Math.sqrt((q * 1000) / 0.613).toFixed(1)} m/s)² / 1000 = ${q.toFixed(3)} kN/m²`,
|
||||||
|
result: `${q.toFixed(3)} kN/m²`,
|
||||||
|
note: 'Pressão dinâmica inercial de referência calculada com base na velocidade característica Vk.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2. Pressões Locais na Superfície Curva p(θ)',
|
||||||
|
formula: 'p(θ) = q · Cpe(θ) (conforme distribuição angular da Tabela 13)',
|
||||||
|
calculation: `${q.toFixed(3)} kN/m² · Cpe(θ) -> Exemplo frontal (0°): ${q.toFixed(3)} kN/m² · 1,00 = ${q.toFixed(3)} kN/m²`,
|
||||||
|
result: `Pico frontal = ${q.toFixed(3)} kN/m²`,
|
||||||
|
note: 'Os coeficientes Cpe variam ao longo do perímetro em função do regime do fluxo (subcrítico ou supercrítico).',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '3. Força Horizontal por Unidade de Altura (F / h)',
|
||||||
|
formula: 'F_h = q · Ca · d ou integração circunferencial de [p(θ) · cos(θ)]',
|
||||||
|
calculation: `${result.forcePerHeightKN_m.toFixed(2)} kN/m (para diâmetro d = ${diameter} m)`,
|
||||||
|
result: `${result.forcePerHeightKN_m.toFixed(2)} kN/m`,
|
||||||
|
note: 'Solicitação horizontal distribuída ao longo da altura do cilindro, utilizada no dimensionamento global.',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
exportGenericToPDF('Cilindros', sections);
|
exportGenericToPDF('Cilindros', sections);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -64,6 +64,33 @@ const DomeModule: React.FC = () => {
|
|||||||
{ label: 'Força', value: `${result.liftForceKN.toFixed(2)} kN` },
|
{ label: 'Força', value: `${result.liftForceKN.toFixed(2)} kN` },
|
||||||
],
|
],
|
||||||
}] : []),
|
}] : []),
|
||||||
|
{
|
||||||
|
title: 'Demonstração dos Passos Matemáticos — Cálculo da Cúpula',
|
||||||
|
type: 'math-card',
|
||||||
|
mathSteps: [
|
||||||
|
{
|
||||||
|
title: '1. Relação Flecha/Diâmetro (f / d) e Geometria',
|
||||||
|
formula: 'f / d = flecha / diâmetro (Tabelas 21 e 22 NBR 6123)',
|
||||||
|
calculation: `${rise} m / ${diameter} m = ${result.fOverD.toFixed(3)}`,
|
||||||
|
result: `f / d = ${result.fOverD.toFixed(3)}`,
|
||||||
|
note: 'Define a distribuição angular dos coeficientes Cpe (barlavento, topo, sotavento/lateral).',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2. Pressões Líquidas nas Regiões da Cúpula (p)',
|
||||||
|
formula: 'p = q · (Cpe − Cpi) [kN/m²]',
|
||||||
|
calculation: `${result.q.toFixed(3)} kN/m² · (Cpe_topo − (${cpi})) = ${(result.q * (result.cpeTopo - cpi)).toFixed(3)} kN/m² (no Topo)`,
|
||||||
|
result: `p(Topo) = ${(result.q * (result.cpeTopo - cpi)).toFixed(3)} kN/m²`,
|
||||||
|
note: 'O topo apresenta forte sucção aerodinâmica, exigindo verificação de ancoragem da cúpula.',
|
||||||
|
},
|
||||||
|
...(result.liftCoefficient > 0 ? [{
|
||||||
|
title: '3. Força Global de Sustentação Vertical (Fz)',
|
||||||
|
formula: 'Fz = q · C_L · A_base onde A_base = π · (d/2)²',
|
||||||
|
calculation: `${result.q.toFixed(3)} kN/m² · ${result.liftCoefficient.toFixed(2)} · (π · (${(diameter / 2).toFixed(1)})²) = ${result.liftForceKN.toFixed(2)} kN`,
|
||||||
|
result: `Fz = ${result.liftForceKN.toFixed(2)} kN`,
|
||||||
|
note: 'Força total vertical (arrancamento global) atuante na base de apoio da cúpula.',
|
||||||
|
}] : []),
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
exportGenericToPDF('Cúpula', sections);
|
exportGenericToPDF('Cúpula', sections);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -119,6 +119,40 @@ const DynamicsModule: React.FC = () => {
|
|||||||
{ label: 'Status', value: comfort.ok ? 'OK' : 'REVER' },
|
{ label: 'Status', value: comfort.ok ? 'OK' : 'REVER' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'Demonstração dos Passos Matemáticos — Análise Dinâmica e Vórtices',
|
||||||
|
type: 'math-card',
|
||||||
|
mathSteps: [
|
||||||
|
{
|
||||||
|
title: '1. Fator de Amplificação Dinâmica (ξ) ou Coeficiente de Rajada',
|
||||||
|
formula: 'ξ = f(f₁, T₀, β, amortecimento) (NBR 6123 Sec. 9 / Anexo A)',
|
||||||
|
calculation: `Para frequência f₁ = ${freq} Hz e amortecimento ζ = ${dynParams.xiPercent}%, fator de resposta dinâmica calculado = ${dynFactor.toFixed(3)}`,
|
||||||
|
result: `ξ = ${dynFactor.toFixed(3)}`,
|
||||||
|
note: 'Amplifica as cargas estáticas para levar em conta a ressonância gerada pela turbulência atmosférica.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2. Velocidade Crítica de Desprendimento de Vórtices (Vcr)',
|
||||||
|
formula: 'Vcr = (f₁ · L) / St [m/s] (Sec. 10 / Tabela 31 NBR 6123)',
|
||||||
|
calculation: `(${freq} Hz · ${sectionSize} m) / ${st.toFixed(3)} (Strouhal) = ${vcr.toFixed(2)} m/s`,
|
||||||
|
result: `Vcr = ${vcr.toFixed(2)} m/s`,
|
||||||
|
note: 'Velocidade de vento na qual a frequência de desprendimento de vórtices coincide com a frequência própria da estrutura.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '3. Número de Scruton (Sc) e Suscetibilidade Aerodinâmica',
|
||||||
|
formula: 'Sc = (2 · me · δ) / (ρ · L²) (Análise de amortecimento aerodinâmico)',
|
||||||
|
calculation: `Com massa equivalente ${massEq} kg/m e amortecimento, Scruton calculado = ${scrutin.toFixed(1)}`,
|
||||||
|
result: `Sc = ${scrutin.toFixed(1)}`,
|
||||||
|
note: 'Estruturas com baixo Scruton (geralmente < 15) são suscetíveis a fortes vibrações transversais por vórtices.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '4. Aceleração de Pico no Topo (a_max) vs Conforto Humano',
|
||||||
|
formula: 'a_max = (2π · f₁)² · u_max [m/s²] (ISO 10137 / NBR 6123 Anexo A)',
|
||||||
|
calculation: `Aceleração de pico = ${aMax.toFixed(4)} m/s² vs Limite aceitável = ${comfort.aLim.toFixed(4)} m/s²`,
|
||||||
|
result: `a_max = ${aMax.toFixed(4)} m/s² (${comfort.ok ? 'OK' : 'REVER'})`,
|
||||||
|
note: 'Verificação do bem-estar dos ocupantes em edifícios altos submetidos a vibrações induzidas pelo vento.',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
exportGenericToPDF('Análise Dinâmica', sections);
|
exportGenericToPDF('Análise Dinâmica', sections);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -109,6 +109,33 @@ const IsolatedRoofModule: React.FC = () => {
|
|||||||
{ label: 'Atrito (Ff)', value: `${frictionForce.toFixed(3)} kN` },
|
{ label: 'Atrito (Ff)', value: `${frictionForce.toFixed(3)} kN` },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'Demonstração dos Passos Matemáticos — Coberturas Isoladas',
|
||||||
|
type: 'math-card',
|
||||||
|
mathSteps: [
|
||||||
|
{
|
||||||
|
title: '1. Coeficientes de Pressão Líquida (Cpn) e Carregamentos',
|
||||||
|
formula: 'Cpn = Cp_superior − Cp_inferior (Tabelas 24 e 25 NBR 6123)',
|
||||||
|
calculation: `Para inclinação θ = ${theta}° (${type === 'shed' ? 'Uma água' : 'Duas águas'}), os coeficientes são definidos por zona e por carregamento máximo/mínimo.`,
|
||||||
|
result: `θ = ${theta}° (Tab. ${type === 'shed' ? '24' : '25'})`,
|
||||||
|
note: 'Coberturas isoladas estão sujeitas a descolamento violento de fluxo, exigindo verificação para sucção (arrancamento) e compressão.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2. Força Vertical Resultante de Arrancamento (Fy / Fz)',
|
||||||
|
formula: 'F_v = q · Cpn_médio · A_plano [kN]',
|
||||||
|
calculation: `${q.toFixed(2)} kN/m² · Cpn_médio · (${(width * depth).toFixed(1)} m²) = ${forces.fy.toFixed(2)} kN`,
|
||||||
|
result: `F_vertical = ${forces.fy.toFixed(2)} kN`,
|
||||||
|
note: 'Esforço vertical global atuante no conjunto de pilares ou tirantes de ancoragem da cobertura.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '3. Força de Atrito Tangencial (F_atrito)',
|
||||||
|
formula: 'F_atrito = q · C_fr · A_paralela (Sec. 6.1.5)',
|
||||||
|
calculation: `${q.toFixed(2)} kN/m² · 0,01 · (${(width * depth).toFixed(1)} m²) = ${frictionForce.toFixed(3)} kN`,
|
||||||
|
result: `F_atrito = ${frictionForce.toFixed(3)} kN`,
|
||||||
|
note: 'Ação tangencial gerada pela viscosidade e rugosidade do ar fluindo paralelamente à cobertura.',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
exportGenericToPDF('Cobertura Isolada', sections);
|
exportGenericToPDF('Cobertura Isolada', sections);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -104,7 +104,41 @@ const PiperackModule: React.FC = () => {
|
|||||||
{ label: 'Centro de Pressão Efetivo (Z_eff)', value: `${result.effectiveElevation.toFixed(2)} m` },
|
{ label: 'Centro de Pressão Efetivo (Z_eff)', value: `${result.effectiveElevation.toFixed(2)} m` },
|
||||||
{ label: 'Momento Total de Tombamento', value: `${(result.globalForce * result.effectiveElevation).toFixed(2)} kN·m` },
|
{ label: 'Momento Total de Tombamento', value: `${(result.globalForce * result.effectiveElevation).toFixed(2)} kN·m` },
|
||||||
],
|
],
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
title: 'Demonstração dos Passos Matemáticos — Pipe-Racks Industriais',
|
||||||
|
type: 'math-card',
|
||||||
|
mathSteps: [
|
||||||
|
{
|
||||||
|
title: '1. Solidez Combinada (φ_total) e Coeficiente Frontal (Ca)',
|
||||||
|
formula: 'φ_total = φ_estrutura + φ_tubulações -> Ca_frontal = f(φ_total)',
|
||||||
|
calculation: `φ_estrutural (${phiStruct.toFixed(2)}) + φ_tubos = ${result.phiTotal.toFixed(2)} -> Ca frontal = ${result.caFrontal.toFixed(2)}`,
|
||||||
|
result: `Ca_frontal = ${result.caFrontal.toFixed(2)}`,
|
||||||
|
note: 'Resistência aerodinâmica inicial considerando a obstrução conjunta das vigas, pilares e leito de tubulações.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2. Fator de Proteção Aerodinâmica (η) para Pórticos Sucessivos',
|
||||||
|
formula: 'η = f(e / h , φ_total) (efeito de sombreamento entre quadros sucessivos)',
|
||||||
|
calculation: `Espaçamento e/h = ${(spacing / height).toFixed(2)} e φ_total = ${result.phiTotal.toFixed(2)} -> Fator η = ${result.eta.toFixed(2)}`,
|
||||||
|
result: `η = ${result.eta.toFixed(2)}`,
|
||||||
|
note: 'Os pórticos posteriores ao frontal recebem vento atenuado pelo sombreamento do pórtico a barlavento.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '3. Cargas Lineares nos Pórticos Frontal e Traseiros (q_linear)',
|
||||||
|
formula: 'q_front = q · Ca · h | q_back = q_front · η [kN/m]',
|
||||||
|
calculation: `${q.toFixed(2)} kN/m² · ${result.caFrontal.toFixed(2)} · (${height} m) = ${result.linearLoadFront.toFixed(2)} kN/m (Frontal) | Traseiro: ${result.linearLoadBack.toFixed(2)} kN/m`,
|
||||||
|
result: `q_front = ${result.linearLoadFront.toFixed(2)} kN/m`,
|
||||||
|
note: 'Carga linear distribuída horizontalmente no topo dos pórticos principais do pipe-rack.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '4. Força Global Total e Momento de Tombamento na Base (M)',
|
||||||
|
formula: 'F_total = F_front + (n − 1)·F_back | M_tombamento = F_total · Z_eff [kNm]',
|
||||||
|
calculation: `${result.globalForce.toFixed(2)} kN · (${result.effectiveElevation.toFixed(2)} m) = ${(result.globalForce * result.effectiveElevation).toFixed(2)} kNm`,
|
||||||
|
result: `M_total = ${(result.globalForce * result.effectiveElevation).toFixed(2)} kNm`,
|
||||||
|
note: 'Momento fletor global transferido para os pilares e fundações industriais.',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
exportGenericToPDF('Pipe-Racks Industriais', sections);
|
exportGenericToPDF('Pipe-Racks Industriais', sections);
|
||||||
|
|||||||
@@ -61,6 +61,33 @@ const SignModule: React.FC = () => {
|
|||||||
{ label: 'Em relação ao solo', value: `${result.momentGroundKNm.toFixed(2)} kNm` },
|
{ label: 'Em relação ao solo', value: `${result.momentGroundKNm.toFixed(2)} kNm` },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'Demonstração dos Passos Matemáticos — Cálculo de Muros e Placas',
|
||||||
|
type: 'math-card',
|
||||||
|
mathSteps: [
|
||||||
|
{
|
||||||
|
title: '1. Relação de Esbeltez (ℓ / hₐ) e Coeficiente de Força (Cf)',
|
||||||
|
formula: 'Cf = f(ℓ / hₐ , placas_extremidade, α) (Tabela 23 NBR 6123)',
|
||||||
|
calculation: `${length} m / ${height} m = ${result.lhRatio.toFixed(2)} -> Cf = ${result.cf.toFixed(2)}`,
|
||||||
|
result: `Cf = ${result.cf.toFixed(2)}`,
|
||||||
|
note: 'Coeficiente global de força aerodinâmica perpendicular ou oblíqua ao muro/placa.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2. Força Aerodinâmica Resultante Total (F)',
|
||||||
|
formula: 'F = q · Cf · A_efetiva [kN]',
|
||||||
|
calculation: `${q.toFixed(2)} kN/m² · ${result.cf.toFixed(2)} · (${result.areaEffective.toFixed(1)} m²) = ${result.forceKN.toFixed(2)} kN`,
|
||||||
|
result: `F = ${result.forceKN.toFixed(2)} kN`,
|
||||||
|
note: 'A solicitação global atua na área efetiva da placa, aplicada com excentricidade e em relação à geometria do muro.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '3. Momento de Tombamento na Base e no Solo (M)',
|
||||||
|
formula: 'M_base = F · (hₐ / 2) | M_solo = F · [ h_solo + (hₐ / 2) ] [kNm]',
|
||||||
|
calculation: `${result.forceKN.toFixed(2)} kN · (${(height / 2).toFixed(2)} m) = ${result.momentBaseKNm.toFixed(2)} kNm (Base)`,
|
||||||
|
result: `M_solo = ${result.momentGroundKNm.toFixed(2)} kNm`,
|
||||||
|
note: 'O momento fletor na fundação considera a elevação da placa em relação ao solo.',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
exportGenericToPDF('Muros e Placas', sections);
|
exportGenericToPDF('Muros e Placas', sections);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -70,6 +70,33 @@ const TowerModule: React.FC = () => {
|
|||||||
{ label: 'Face IV', value: `${result.faceComponents.faceIV.toFixed(2)} kN` },
|
{ label: 'Face IV', value: `${result.faceComponents.faceIV.toFixed(2)} kN` },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'Demonstração dos Passos Matemáticos — Cálculo Aerodinâmico da Torre',
|
||||||
|
type: 'math-card',
|
||||||
|
mathSteps: [
|
||||||
|
{
|
||||||
|
title: '1. Coeficiente de Arrasto da Face (Ca) em função da Solidez (φ)',
|
||||||
|
formula: 'Ca = f(φ , tipo_de_perfil) (Tabelas de Torres da NBR 6123)',
|
||||||
|
calculation: `Solidez φ = ${phi.toFixed(2)} (${barType === 'circular' ? 'Perfis tubulares/circulares' : 'Perfis angulares/chatos'}) -> Ca = ${result.ca.toFixed(2)}`,
|
||||||
|
result: `Ca = ${result.ca.toFixed(2)}`,
|
||||||
|
note: 'Determina a resistência aerodinâmica da estrutura reticulada de acordo com o grau de preenchimento da face.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2. Fator de Inclinação de Vento (Kα) e Coeficiente Efetivo',
|
||||||
|
formula: 'Ca_efetivo = Ca · Kα (correção para incidência oblíqua α)',
|
||||||
|
calculation: `${result.ca.toFixed(2)} · ${result.kAlpha.toFixed(2)} (α = ${alphaWind}°) = ${result.caEff.toFixed(2)}`,
|
||||||
|
result: `Ca_efetivo = ${result.caEff.toFixed(2)}`,
|
||||||
|
note: 'Aplica o acréscimo ou redução do arrasto global conforme a direção de incidência do vento no reticulado.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '3. Força Global Aerodinâmica na Torre (F)',
|
||||||
|
formula: 'F = q · Ca_efetivo · A_face_efetiva [kN]',
|
||||||
|
calculation: `${q.toFixed(2)} kN/m² · ${result.caEff.toFixed(2)} · (${(baseWidth * height * phi).toFixed(2)} m² de área sólida) = ${result.forceKN.toFixed(2)} kN`,
|
||||||
|
result: `F_total = ${result.forceKN.toFixed(2)} kN`,
|
||||||
|
note: 'Força de arrasto global distribuída entre as faces ativa da torre reticulada.',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
exportGenericToPDF('Torre Reticulada', sections);
|
exportGenericToPDF('Torre Reticulada', sections);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ const VaultModule: React.FC = () => {
|
|||||||
const result = useMemo(() => calculateVault({ f: rise, l: span, b: length, vk, regime, cpi: localCpi }), [span, length, rise, vk, regime, localCpi]);
|
const result = useMemo(() => calculateVault({ f: rise, l: span, b: length, vk, regime, cpi: localCpi }), [span, length, rise, vk, regime, localCpi]);
|
||||||
|
|
||||||
const handleExportPDF = () => {
|
const handleExportPDF = () => {
|
||||||
|
const q = (0.613 * Math.pow(vk, 2)) / 1000;
|
||||||
const sections: GenericPDFSection[] = [
|
const sections: GenericPDFSection[] = [
|
||||||
{
|
{
|
||||||
title: 'Geometria da Abóbada',
|
title: 'Geometria da Abóbada',
|
||||||
@@ -63,6 +64,33 @@ const VaultModule: React.FC = () => {
|
|||||||
value: v.toFixed(3),
|
value: v.toFixed(3),
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'Demonstração dos Passos Matemáticos — Pressões na Abóbada',
|
||||||
|
type: 'math-card',
|
||||||
|
mathSteps: [
|
||||||
|
{
|
||||||
|
title: '1. Pressão Dinâmica de Referência (q)',
|
||||||
|
formula: 'q = 0,613 · Vk² [N/m²] = 0,000613 · Vk² [kN/m²] (NBR 6123 Sec. 4.2)',
|
||||||
|
calculation: `0,613 · (${Math.sqrt((q * 1000) / 0.613).toFixed(1)} m/s)² / 1000 = ${q.toFixed(3)} kN/m²`,
|
||||||
|
result: `${q.toFixed(3)} kN/m²`,
|
||||||
|
note: 'Pressão de referência utilizada na determinação das forças atuantes nas zonas da abóbada.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '2. Relação Flecha/Vão (f / ℓ) e Seleção Normativa',
|
||||||
|
formula: 'f / ℓ = flecha / vão (determina a tabela NBR 6123 - Tabelas 15 a 20)',
|
||||||
|
calculation: `${rise} m / ${span} m = ${(rise / span).toFixed(2)} (Regime: ${regime})`,
|
||||||
|
result: `f / ℓ = ${(rise / span).toFixed(2)}`,
|
||||||
|
note: 'Define a curvatura e o padrão de descolamento de fluxo e coeficientes aerodinâmicos.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '3. Pressão Líquida Efetiva por Zona (p_i)',
|
||||||
|
formula: 'p_i = q · (Cpe,i − Cpi) [kN/m²]',
|
||||||
|
calculation: `${q.toFixed(3)} kN/m² · (Cpe_zona − (${localCpi})) -> Exemplo Zona A: ${result.pressures.A?.toFixed(2) || '0.00'} kN/m²`,
|
||||||
|
result: `Exemplo p(A) = ${result.pressures.A?.toFixed(2) || '0.00'} kN/m²`,
|
||||||
|
note: 'As sucções e compressões na abóbada são obtidas pela combinação dos coeficientes externos e pressão interna Cpi.',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
exportGenericToPDF('Abóbada Cilíndrica', sections);
|
exportGenericToPDF('Abóbada Cilíndrica', sections);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user