diff --git a/app/src/lib/export-pdf.tsx b/app/src/lib/export-pdf.tsx index 324a53d..240f4d7 100644 --- a/app/src/lib/export-pdf.tsx +++ b/app/src/lib/export-pdf.tsx @@ -240,6 +240,36 @@ const ReportDocument = ({ galpao, wind, sceneImage }: ReportProps) => { + + 4. Demonstração dos Passos Matemáticos — Galpão Retangular (NBR 6123) + + + 1. Pressão Dinâmica de Referência (q) + + + 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² + + + 2. Relações Geométricas e Seleção Normativa (Tabelas 4 e 5) + + + 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. + + + 3. Pressão Líquida Efetiva (p) + + + 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. + + + 4. Cargas Lineares por Elemento (w) + + + Fórmula: w = p · espaçamento [kN/m] (Pórticos: e = {FRAME_SPACING} m | Terças: e = {PURLIN_SPACING} m). + + + + {[0, 90].map((angle, index) => { 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); @@ -247,7 +277,7 @@ const ReportDocument = ({ galpao, wind, sceneImage }: ReportProps) => { const rLoads = getRoofLinearLoads(wind.cpi, wind.q, rCpe, PURLIN_SPACING, galpao.roofPitch); 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 secBase = index === 0 ? 4 : 6; + const secBase = index === 0 ? 5 : 7; return ( diff --git a/app/src/pages/BarSelectorModule.tsx b/app/src/pages/BarSelectorModule.tsx index 847ac24..fccdb5b 100644 --- a/app/src/pages/BarSelectorModule.tsx +++ b/app/src/pages/BarSelectorModule.tsx @@ -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); }; diff --git a/app/src/pages/BridgeModule.tsx b/app/src/pages/BridgeModule.tsx index 671f518..aa84302 100644 --- a/app/src/pages/BridgeModule.tsx +++ b/app/src/pages/BridgeModule.tsx @@ -66,17 +66,19 @@ const BridgeModule: React.FC = () => { }; const handleExportPDF = () => { + const q = (0.613 * Math.pow(vk, 2)) / 1000; const sections: GenericPDFSection[] = [ { - title: 'Parâmetros da Ponte', + title: 'Geometria do Tabuleiro', type: 'grid', gridItems: [ - { label: 'Maior vão (Lₚ)', value: `${lp} m` }, - { label: 'Largura (B)', value: `${width} m` }, - { label: 'Altura equivalente (Hₑg)', value: `${heg} m` }, - { label: 'Altura do tabuleiro (z)', value: `${deckHeight} m` }, + { label: 'Comprimento do Vão Principal (Lₚ)', value: `${lp} m` }, + { label: 'Largura do Tabuleiro (b)', value: `${width} m` }, + { label: 'Altura do Tabuleiro (h)', 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: '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}°` }, ], }, @@ -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'}` }, ], }, + { + 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); }; diff --git a/app/src/pages/CylinderModule.tsx b/app/src/pages/CylinderModule.tsx index cc6ab88..da9e448 100644 --- a/app/src/pages/CylinderModule.tsx +++ b/app/src/pages/CylinderModule.tsx @@ -36,6 +36,7 @@ const CylinderModule: React.FC = () => { }, [diameter, height, vk, surface, endType, globalCpi]); const handleExportPDF = () => { + const q = (0.613 * Math.pow(vk, 2)) / 1000; const sections: GenericPDFSection[] = [ { title: 'Geometria do Cilindro', @@ -71,6 +72,33 @@ const CylinderModule: React.FC = () => { { 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); }; diff --git a/app/src/pages/DomeModule.tsx b/app/src/pages/DomeModule.tsx index 56e5904..43c35c4 100644 --- a/app/src/pages/DomeModule.tsx +++ b/app/src/pages/DomeModule.tsx @@ -64,6 +64,33 @@ const DomeModule: React.FC = () => { { 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); }; diff --git a/app/src/pages/DynamicsModule.tsx b/app/src/pages/DynamicsModule.tsx index 3ef86b3..345fde0 100644 --- a/app/src/pages/DynamicsModule.tsx +++ b/app/src/pages/DynamicsModule.tsx @@ -119,6 +119,40 @@ const DynamicsModule: React.FC = () => { { 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); }; diff --git a/app/src/pages/IsolatedRoofModule.tsx b/app/src/pages/IsolatedRoofModule.tsx index 0a4fc9e..8a3771c 100644 --- a/app/src/pages/IsolatedRoofModule.tsx +++ b/app/src/pages/IsolatedRoofModule.tsx @@ -109,6 +109,33 @@ const IsolatedRoofModule: React.FC = () => { { 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); }; diff --git a/app/src/pages/PiperackModule.tsx b/app/src/pages/PiperackModule.tsx index 1fdf8fa..e16a887 100644 --- a/app/src/pages/PiperackModule.tsx +++ b/app/src/pages/PiperackModule.tsx @@ -104,7 +104,41 @@ const PiperackModule: React.FC = () => { { 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` }, ], - } + }, + { + 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); diff --git a/app/src/pages/SignModule.tsx b/app/src/pages/SignModule.tsx index 8f1a5bb..720c76f 100644 --- a/app/src/pages/SignModule.tsx +++ b/app/src/pages/SignModule.tsx @@ -61,6 +61,33 @@ const SignModule: React.FC = () => { { 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); }; diff --git a/app/src/pages/TowerModule.tsx b/app/src/pages/TowerModule.tsx index 428762c..59afa6e 100644 --- a/app/src/pages/TowerModule.tsx +++ b/app/src/pages/TowerModule.tsx @@ -70,6 +70,33 @@ const TowerModule: React.FC = () => { { 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); }; diff --git a/app/src/pages/VaultModule.tsx b/app/src/pages/VaultModule.tsx index d1012d9..7b8535e 100644 --- a/app/src/pages/VaultModule.tsx +++ b/app/src/pages/VaultModule.tsx @@ -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 handleExportPDF = () => { + const q = (0.613 * Math.pow(vk, 2)) / 1000; const sections: GenericPDFSection[] = [ { title: 'Geometria da Abóbada', @@ -63,6 +64,33 @@ const VaultModule: React.FC = () => { 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); };