diff --git a/src/osdag/Common.py b/src/osdag/Common.py index a3fe8e275..a4428c7af 100644 --- a/src/osdag/Common.py +++ b/src/osdag/Common.py @@ -712,7 +712,7 @@ def is_valid_custom(self): KEY_DISP_K_v_latex = '$K_{v}$' KEY_DISP_Elastic_Critical_shear_stress_web = 'Elastic Critical Shear Stress Web($N/mm^2$)' #(\tau_{crc}) KEY_DISP_Transverse_Stiffener_spacing = 'Spacing of Transverse Stiffeners(c)(mm)' -KEY_DISP_slenderness_ratio_web = 'Web Slenderness ratio($\lambda_w$)' +KEY_DISP_slenderness_ratio_web = r'Web Slenderness ratio($\lambda_w$)' KEY_DISP_BUCKLING_STRENGTH= 'Buckling Resistance (kN)' KEY_DISP_reduced_moment= 'Reduced moment (Nmm)' # KEY_DISP_reduced_moment= 'Reduced moment (N_f)' @@ -1582,7 +1582,7 @@ def is_valid_custom(self): # section properties (In the form of LaTeX equations) KEY_REPORT_MASS = 'Mass, $m$ (kg/m)' -KEY_REPORT_AREA = 'Area, $A$ (cm$^2$)' +KEY_REPORT_AREA = 'Area, $A$ (mm$^2$)' KEY_REPORT_DEPTH = '$D$ (mm)' KEY_REPORT_WIDTH = '$B$ (mm)' KEY_REPORT_MAX_LEG_SIZE = '$A$ (mm)' @@ -1712,7 +1712,7 @@ def is_valid_custom(self): KEY_INNERFLANGE_PLATE_HEIGHT = 'Flange_Plate.InnerWidth' KEY_INNERFLANGE_PLATE_LENGTH ='flange_plate.InnerLength' -KEY_DISP_AREA_CHECK ="Plate Area Check (mm2)" +KEY_DISP_AREA_CHECK ="Plate Area Check (mm)" KEY_FLANGE_SPACING ="Flange_plate.spacing" @@ -2037,8 +2037,8 @@ def is_valid_custom(self): KEY_OUT_DISP_BASE_METAL_UTILIZATION = 'Base Metal Utilization' -KEY_DISP_BOLT_AREA = 'Nominal Stress Area (mm2)' -KEY_DISP_KB = 'Kb' +KEY_DISP_BOLT_AREA = 'Nominal Stress Area (mm\u00b2)' +KEY_DISP_KB = 'K\u2082b' KEY_OUT_BOLT_IR_DETAILS = 'Bolt.IRDetails' KEY_OUT_BOLT_IR_DETAILS_SPTD = 'Bolt.IRDetails_sptd' @@ -2181,7 +2181,7 @@ def is_valid_custom(self): KEY_OUT_INTERCONNECTION = 'Intermittent.Connection' -KEY_OUT_DISP_INTERCONNECTION = 'Connection (no)' +KEY_OUT_DISP_INTERCONNECTION = 'Connection(s)' KEY_OUT_INTERSPACING = 'Intermittent.Spacing' KEY_OUT_DISP_INTERSPACING = 'Spacing (mm)' diff --git a/src/osdag/design_report/report_generator_base_plate.py b/src/osdag/design_report/report_generator_base_plate.py index a4a6bc54a..34ef059a5 100644 --- a/src/osdag/design_report/report_generator_base_plate.py +++ b/src/osdag/design_report/report_generator_base_plate.py @@ -76,7 +76,7 @@ def __init__(self): KEY_DISP_FU: self.dp_column_fu, KEY_DISP_FY: self.dp_column_fy, 'Mass': self.column_properties.mass, - 'Area(cm2) - A': round(self.column_properties.area, 3), + 'Area(mm2) - A': round(self.column_properties.area, 3), 'D(mm)': self.column_D, 'B(mm)': self.column_bf, 't(mm)': self.column_tw, diff --git a/src/osdag/design_type/flexural_member/flexure_cantilever.py b/src/osdag/design_type/flexural_member/flexure_cantilever.py index 312c5eff0..94e3b67a6 100644 --- a/src/osdag/design_type/flexural_member/flexure_cantilever.py +++ b/src/osdag/design_type/flexural_member/flexure_cantilever.py @@ -2613,7 +2613,7 @@ def save_design(self, popup_summary): # ' ') # self.report_check.append(t1) - t1 = (KEY_DISP_SLENDER + '($\lambda_{LT}$)', ' ', + t1 = (KEY_DISP_SLENDER + r'($\lambda_{LT}$)', ' ', cl_8_2_2_slenderness(round(self.result_betab, 2),self.section_property.elast_sec_mod_z, self.section_property.plast_sec_mod_z,self.result_mcr,self.material_property.fy, self.result_nd_esr_lt), diff --git a/src/osdag/utils/common/component.py b/src/osdag/utils/common/component.py index d1ceade86..363f1d664 100644 --- a/src/osdag/utils/common/component.py +++ b/src/osdag/utils/common/component.py @@ -1743,9 +1743,14 @@ def tension_member_design_due_to_rupture_of_critical_section(self, A_nc, A_go, F else: self.beta = float( 1.4 - (0.076 * float(w) / float(t) * float(F_y) / (0.9 * float(F_u)) * float(b_s) / float(L_c))) + + if self.beta <= (F_u * gamma_m0 / F_y * gamma_m1) and self.beta >= 0.7: - self.beta = self.beta + # self.beta = self.beta + upper_limit = 0.9 * (F_u * gamma_m0) / (F_y * gamma_m1) + self.beta = max(0.7, min(self.beta, upper_limit)) + self.beta = round(self.beta, 2) else: self.beta = 0.7 diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index 32b277ca6..790fe07d2 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -636,7 +636,7 @@ def is_valid_custom(self): KEY_DISP_Bending_STRENGTH_MOMENT = 'Bending Strength (kNm)' KEY_DISP_LTB_Bending_STRENGTH_MOMENT = 'Lateral Torsional Buckling Strength (kNm)' -KEY_DISP_betab_constatnt= 'Betab' +KEY_DISP_betab_constatnt= 'βb' KEY_betab_constatnt= 'Beta.Constant' KEY_BUCKLING_STRENGTH= 'Buckling.Strength' KEY_DISP_BUCKLING_STRENGTH= 'Buckling Strength (kN)' @@ -1165,8 +1165,8 @@ def is_valid_custom(self): DISP_MIN_PLATE_INNERLENGTH = 'Min. Inner Plate Length (mm)' -KEY_DISP_FU = 'Ultimate Strength, Fu (MPa)' -KEY_DISP_FY = 'Yield Strength, Fy (MPa)' +KEY_DISP_FU = r'Ultimate Strength, f_u (MPa)' +KEY_DISP_FY = r'Yield Strength, f_y (MPa)' KEY_DISP_IR = 'Interaction Ratio' DISP_WELD_SIZE = 'Weld Size (mm)' DISP_MIN_WELD_SIZE = 'Min. Weld Size (mm)' @@ -1175,7 +1175,7 @@ def is_valid_custom(self): DISP_WEB_WELD_SIZE_REQ = 'Web Weld Size Required (mm)' DISP_WELD_STRENGTH = 'Weld Strength (N/mm)' -DISP_WELD_STRENGTH_MPA = 'Weld Strength (N/mm2)' +DISP_WELD_STRENGTH_MPA = 'Weld Strength (N/mm²)' KEY_DISP_FY_20 = 'Yield Strength, Fy (MPa) (0-20mm)' KEY_DISP_FY_20_40 = 'Yield Strength, Fy (MPa) (20-40mm)' KEY_DISP_FY_40 = 'Yield Strength, Fy (MPa) (>40mm)' @@ -1549,14 +1549,14 @@ def is_valid_custom(self): # KEY_PC = 'Bolt.PC' KEY_DISP_PC = 'Property Class *' -KEY_DISP_DP_BOLT_MATERIAL_G_O = 'Material grade overwrite (MPa) Fu' +KEY_DISP_DP_BOLT_MATERIAL_G_O = r'Material grade overwrite (MPa), f_u' KEY_DISP_DP_BOLT_DESIGN_PARA = 'HSFG Bolt:' KEY_DISP_DP_BOLT_SLIP_FACTOR = 'Slip Factor, (muf)' KEY_DISP_DP_BOLT_SLIP_FACTOR_REPORT = r'Slip Factor, ($\mu_{f}$)' -KEY_DISP_DP_BOLT_FU = 'Bolt Ultimate Strength (N/mm2)' -KEY_DISP_DP_BOLT_FY = 'Bolt Yield Strength (N/mm2)' +KEY_DISP_DP_BOLT_FU = 'Bolt Ultimate Strength (N/mm²)' +KEY_DISP_DP_BOLT_FY = 'Bolt Yield Strength (N/mm²)' KEY_DISP_GAMMA_M0 = "Governed by Yielding" KEY_DISP_GAMMA_M1 = "Governed by Ultimate Stress" KEY_DISP_GAMMA_MB = "Connection Bolts - Bearing Type" @@ -1578,7 +1578,7 @@ def is_valid_custom(self): KEY_DP_FAB_FIELD = 'Field weld' KEY_DP_WELD_FAB_VALUES = [KEY_DP_FAB_SHOP, KEY_DP_FAB_FIELD] -KEY_DISP_DP_WELD_MATERIAL_G_O = 'Material Grade Overwrite, Fu (MPa)' +KEY_DISP_DP_WELD_MATERIAL_G_O = r'Material Grade Overwrite, f_{u} (MPa)' KEY_DISP_DP_WELD_MATERIAL_G_O_REPORT = 'Material Grade Overwrite, $F_{u}$ (MPa)' KEY_DP_DESIGN_BASE_PLATE = 'DesignPreferences.Design.Base_Plate' # KEY_DISP_DP_DETAILING_EDGE_TYPE = 'Type of edge' @@ -1665,7 +1665,7 @@ def is_valid_custom(self): # section properties (In the form of LaTeX equations) KEY_REPORT_MASS = 'Mass, $m$ (kg/m)' -KEY_REPORT_AREA = 'Area, $A$ (cm$^2$)' +KEY_REPORT_AREA = 'Area, $A$ (mm$^2$)' KEY_REPORT_DEPTH = '$D$ (mm)' KEY_REPORT_WIDTH = '$B$ (mm)' KEY_REPORT_MAX_LEG_SIZE = '$A$ (mm)' @@ -1681,10 +1681,10 @@ def is_valid_custom(self): KEY_REPORT_IY = '$I_y$(cm$^4$)' KEY_REPORT_IU = '$I_u$ (cm$^4$)' KEY_REPORT_IV = '$I_v$(cm$^4$)' -KEY_REPORT_RZ = '$r_z$ (cm)' -KEY_REPORT_RY = '$r_y$ (cm)' -KEY_REPORT_RU = '$r_u$ (cm)' -KEY_REPORT_RV = '$r_v$ (cm)' +KEY_REPORT_RZ = '$r_z$ (mm)' +KEY_REPORT_RY = '$r_y$ (mm)' +KEY_REPORT_RU = '$r_u$ (mm)' +KEY_REPORT_RV = '$r_v$ (mm)' KEY_REPORT_ZEZ = '$Z_z$ (cm$^3$)' KEY_REPORT_ZEY = '$Z_y$ (cm$^3$)' KEY_REPORT_ZPZ = '$Z_{pz}$ (cm$^3$)' @@ -1795,7 +1795,7 @@ def is_valid_custom(self): KEY_INNERFLANGE_PLATE_HEIGHT = 'Flange_Plate.InnerWidth' KEY_INNERFLANGE_PLATE_LENGTH ='flange_plate.InnerLength' -KEY_DISP_AREA_CHECK ="Plate Area Check (mm2)" +KEY_DISP_AREA_CHECK ="Plate Area Check (mm\u00b2)" KEY_FLANGE_SPACING ="Flange_plate.spacing" @@ -2117,8 +2117,8 @@ def is_valid_custom(self): KEY_OUT_BASE_METAL_UTILIZATION = 'Plate.BaseUtilization' KEY_OUT_DISP_BASE_METAL_UTILIZATION = 'Connected Plate Utilization' -KEY_DISP_BOLT_AREA = 'Nominal Stress Area (mm2)' -KEY_DISP_KB = 'Kb' +KEY_DISP_BOLT_AREA = 'Nominal Stress Area (mm\u00b2)' +KEY_DISP_KB = r'K_b' KEY_OUT_BOLT_IR_DETAILS = 'Bolt.IRDetails' KEY_OUT_BOLT_IR_DETAILS_SPTD = 'Bolt.IRDetails_sptd' @@ -2169,7 +2169,7 @@ def is_valid_custom(self): KEY_OUT_BOLT_LINE = 'Bolt.Line' KEY_OUT_DISP_BOLT_LINE = 'Bolt Columns (no)' KEY_OUT_INTER_BOLT_LINE = 'Bolt.InterLine' -KEY_OUT_DISP_INTER_BOLT_LINE = 'Columns (no)' +KEY_OUT_DISP_INTER_BOLT_LINE = 'Column(s)' KEY_OUT_BOLT_IR = 'Bolt.IR' KEY_OUT_DISP_BOLT_IR = 'Interaction Ratio' KEY_OUT_DISP_BOLT_COMBINED_CAPACITY = 'Combined Capacity, I.R' @@ -2181,7 +2181,7 @@ def is_valid_custom(self): KEY_OUT_DISP_BOLTS_ONE_LINE_S = 'Rows per Angle(no)' KEY_OUT_INTER_BOLTS_ONE_LINE = 'Bolt.InterOneLine' -KEY_OUT_DISP_INTER_BOLTS_ONE_LINE = 'Rows (no)' +KEY_OUT_DISP_INTER_BOLTS_ONE_LINE = 'Row(s)' KEY_OUT_SPACING = 'spacing' @@ -2261,7 +2261,7 @@ def is_valid_custom(self): KEY_OUT_INTERCONNECTION = 'Intermittent.Connection' -KEY_OUT_DISP_INTERCONNECTION = 'Connection (no)' +KEY_OUT_DISP_INTERCONNECTION = 'Connection(s)' KEY_OUT_INTERSPACING = 'Intermittent.Spacing' KEY_OUT_DISP_INTERSPACING = 'Spacing (mm)' @@ -2349,7 +2349,7 @@ def is_valid_custom(self): KEY_OUT_DISP_WELD_STRENGTH = 'Strength (N/mm)' KEY_OUT_WELD_STRESS = 'Weld.Stress' -KEY_OUT_DISP_WELD_STRESS = 'Stress (N/mm)' +KEY_OUT_DISP_WELD_STRESS = 'Stress (N/mm²)' KEY_OUT_WELD_LENGTH = 'Weld.Length' KEY_OUT_DISP_WELD_LENGTH = 'Length (mm)' KEY_OUT_WELD_LENGTH_EFF = 'Weld.EffLength' @@ -2483,7 +2483,7 @@ def is_valid_custom(self): KEY_OUT_WELD_STRESS_COMBINED = 'Weld.StressCombined' KEY_OUT_DISP_WELD_STRESS_COMBINED = 'Combined Stress (N/mm2)' KEY_OUT_DISP_WELD_STRESS_EQUIVALENT = 'Equivalent Stress (N/mm2)' -KEY_OUT_DISP_WELD_STRESS = 'Stress (N/mm)' +KEY_OUT_DISP_WELD_STRESS = 'Stress (N/mm2)' KEY_OUT_DISP_WELD_NORMAL_STRESS = 'Normal Stress (N/mm2)' KEY_OUT_DISP_WELD_SHEAR_STRESS = 'Shear Stress (N/mm2)' KEY_OUT_DISP_WELD_STRESS_AXIAL = 'Weld.Stress due to axial force' @@ -2567,8 +2567,8 @@ def is_valid_custom(self): KEY_DISP_TOPANGLE = 'Top Angle *' #Design Report Strings DISP_NUM_OF_BOLTS = 'No. of Bolts' -DISP_NUM_OF_ROWS = 'No. of Bolt Rows' -DISP_NUM_OF_COLUMNS = 'No. of Bolt Columns' +DISP_NUM_OF_ROWS = 'No. of Bolt Row(s)' +DISP_NUM_OF_COLUMNS = r'No. of Bolt Column(s) ("$n_c$")' DISP_TITLE_COMPMEM='Compression member' KEY_SECTYPE = 'Section Type' KEY_DISP_SECTYPE = 'Section Type*' diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 449b08a8a..3da2be92c 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -306,7 +306,7 @@ def cl_6_2_tension_yield_capacity_member(l, t, f_y, gamma, T_dg, multiple=None, tension_yield_eqn.append(NoEscape(r'\begin{aligned} T_{\text{dg}} &= \frac{A_g f_y}{\gamma_{m0}}\\ \\')) if l is not None and t is not None: if multiple is None or multiple == 1: - tension_yield_eqn.append(NoEscape(r'A_{g} &= l t =' + l + r'\times' + t + r'\\')) + tension_yield_eqn.append(NoEscape(r'A_{g} &= Dt =' + l + r'\times' + t + r'\\')) else: multiple = str(multiple) tension_yield_eqn.append(NoEscape(r'A_{g} &=' + multiple + r' l t =' + multiple + @@ -397,13 +397,27 @@ def cl_6_3_3_tension_rupture_member(A_nc, A_go, F_u, F_y, L_c, w, b_s, t, gamma_ member_rup = str(member_rup) multiple = str(multiple) member_rup_eqn = Math(inline=True) - member_rup_eqn.append(NoEscape(r'\begin{aligned}\beta &= 1.4 - 0.076 \times \frac{w}{t}\times\frac{f_{y}}{0.9 f_{u}}\times\frac{b_s}{L_c}\\')) + ''' + member_rup_eqn.append(NoEscape(r'\begin{aligned}\beta &= 1.4 - 0.076 \times \frac{w}{t}\times\frac{f_{y}}{f_{u}}\times\frac{b_s}{L_c}\\')) member_rup_eqn.append(NoEscape(r'&\leq\frac{0.9 f_{u} \gamma_{m0}}{f_{y} \gamma_{m1}} \geq 0.7 \\ \\')) member_rup_eqn.append(NoEscape( - r'&= 1.4 - 0.076 \times \frac{' + w + '}{' + t + r'}\times\frac{' + fy + r'}{0.9\times' + fu + r'}\times\frac{' + b_s + '}{' + L_c + r' }\\')) + r'&= 1.4 - 0.076 \times \frac{' + w + '}{' + t + r'}\times\frac{' + fy +'}{'+ fu + r'}\times\frac{' + b_s + '}{' + L_c + r' }\\')) member_rup_eqn.append(NoEscape(r'&\leq\frac{0.9\times' + fu + r'\times' + gamma_m0 + '}{' + fy + r'\times' + gamma_m1 + r'} \geq 0.7 \\ \\')) member_rup_eqn.append(NoEscape(r'&= ' + beta + r'\\ \\')) + ''' + + member_rup_eqn.append(NoEscape(r'\begin{aligned}\beta &= 1.4 - 0.076 \times \frac{w}{t}\times\frac{f_{y}}{0.9 f_{u}}\times\frac{b_s}{L_c}\\')) + member_rup_eqn.append(NoEscape( + r'&= 1.4 - 0.076 \times \frac{' + w + '}{' + t + r'}\times\frac{' + fy + r'}{0.9\times' + fu + r'}\times\frac{' + b_s + '}{' + L_c + r'}\\')) + member_rup_eqn.append(NoEscape(r'&= ' + beta + r'\\ \\')) + + member_rup_eqn.append(NoEscape( + r'&\text{Limiting condition: } 0.7 \leq \beta \leq \frac{0.9 f_{u} \gamma_{m0}}{f_{y} \gamma_{m1}}\\')) + member_rup_eqn.append(NoEscape( + r'&\Rightarrow 0.7 \leq \beta \leq \frac{0.9\times' + fu + r'\times' + gamma_m0 + '}{' + fy + r'\times' + gamma_m1 + r'}\\')) + + member_rup_eqn.append(NoEscape(r'&\therefore \beta = ' + beta + r'\\ \\')) member_rup_eqn.append( NoEscape(r'T_{\text{dn}} &= ' + multiple + r'\times \Bigg(\frac{0.9 A_{nc}f_{u}}{\gamma_{m1}} + \frac{\beta A_{go} f_{y}}{\gamma_{m0}} \Bigg)\\')) @@ -453,13 +467,22 @@ def cl_6_4_blockshear_capacity_member(Tdb, A_vg=None, A_vn=None, A_tg=None, A_tn if stress == "shear": member_block_eqn.append( NoEscape(r'\begin{aligned}V_{\text{dbl1}} &= \frac{A_{\text{vg}} f_{y}}{\sqrt{3} \gamma_{m0}} + \frac{0.9 A_{tn} f_{u}}{\gamma_{m1}}\\ \\')) + #member_block_eqn.append(NoEscape(r'&= \frac{' + A_vg + r' \times ' + f_y + r'}{\sqrt{3} \times ' + gamma_m0 + r'} + \frac{0.9 \times ' + A_tn + r' \times ' + f_u + r'}{' + gamma_m1 + r'}\\ \\')) + #member_block_eqn.append(NoEscape(r'&= ' + dbl1_str + r'\\ \\')) + member_block_eqn.append(NoEscape(r'V_{\text{dbl2}} &= \frac{0.9A_{vn} f_{u}}{\sqrt{3} \gamma_{m1}} + \frac{A_{tg} f_{y}}{\gamma_{m0}}\\ \\')) + #member_block_eqn.append(NoEscape(r'&= \frac{0.9 \times ' + A_vn + r' \times ' + f_u + r'}{\sqrt{3} \times ' + gamma_m1 + r'} + \frac{' + A_tg + r' \times ' + f_y + r'}{' + gamma_m0 + r'}\\ \\')) + member_block_eqn.append(NoEscape(r'V_{\text{db}} &= \min(V_{db1},~ V_{db2})= ' + Tdb + r'\\ \\')) member_block_eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.6.4}] \end{aligned}')) else: member_block_eqn.append( NoEscape(r'\begin{aligned}T_{\text{dbl1}} &= \frac{A_{\text{vg}} f_{y}}{\sqrt{3} \gamma_{m0}} + \frac{0.9 A_{tn} f_{u}}{\gamma_{m1}}\\ \\')) + #member_block_eqn.append(NoEscape(r'&= \frac{' + A_vg + r' \times ' + f_y + r'}{\sqrt{3} \times ' + gamma_m0 + r'} + \frac{0.9 \times ' + A_tn + r' \times ' + f_u + r'}{' + gamma_m1 + r'}\\ \\')) + member_block_eqn.append(NoEscape(r'T_{\text{dbl2}} &= \frac{0.9A_{vn} f_{u}}{\sqrt{3} \gamma_{m1}} + \frac{A_{tg} f_{y}}{\gamma_{m0}}\\ \\')) + #member_block_eqn.append(NoEscape(r'&= \frac{0.9 \times ' + A_vn + r' \times ' + f_u + r'}{\sqrt{3} \times ' + gamma_m1 + r'} + \frac{' + A_tg + r' \times ' + f_y + r'}{' + gamma_m0 + r'}\\ \\')) + member_block_eqn.append(NoEscape(r'T_{\text{db}} &= \min(T_{db1},~ T_{db2})= ' + Tdb + r'\\ \\')) member_block_eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.6.4}] \end{aligned}')) @@ -492,9 +515,9 @@ def cl_7_1_2_design_compressive_strength(Pd, A, fcd, P,sub = 'e'): slender_eqn.append(NoEscape(r'\begin{aligned}P_d &= A_' + sub + r' \times f_{cd}\\')) slender_eqn.append(NoEscape(r' &= ' + A + r'\times' + fcd + r'\times 10^{-3} \\')) if temp: - slender_eqn.append(NoEscape(r'&= ' + Pd + r'> ' + P + r' \\')) + slender_eqn.append(NoEscape(r'&= ' + Pd + r'> ' + P + r'{\text{ KN}}\\' )) else: - slender_eqn.append(NoEscape(r'&= ' + Pd + r'\leq ' + P + r' \\')) + slender_eqn.append(NoEscape(r'&= ' + Pd + r'\leq ' + P + r'{\text{ KN}}\\')) slender_eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.7.1.2}] \end{aligned}')) return slender_eqn @@ -869,17 +892,19 @@ def cl_8_2_2_slenderness(beta_b,Z_e, Z_p, M_cr, f_y, l,sub = 'length'): """ # temp = True if Pd > P else False + limit = round(math.sqrt(1.2 * float(Z_e) * float(f_y) / (float(M_cr) * 10 ** 6)), 2) beta_b = str(beta_b) Z_e = str(Z_e) Z_p = str(Z_p) M_cr = str(M_cr) f_y = str(f_y) l = str(l) + limit = str(limit) sub = str(sub) eqn = Math(inline=True) eqn.append(NoEscape(r'\begin{aligned}\lambda_{LT} &= \sqrt{\frac{\beta_bZ_pf_y}{M_{cr}}} \le \sqrt{\frac{1.2 Z_e f_y}{M_{cr}}}\\')) - eqn.append(NoEscape(r' &= \sqrt{\frac{'+beta_b+r'\times'+Z_p+r'\times'+f_y+r'}{'+M_cr+r'}} \le \sqrt{\frac{1.2'+ r'\times'+ Z_e+r'\times ' +f_y+r'}{'+r'\times'+M_cr+r'}}\\')) - eqn.append(NoEscape(r'&= ' + l + r' \\')) + eqn.append(NoEscape(r' &= \sqrt{\frac{'+beta_b+r'\times'+Z_p+r'\times'+f_y+r'}{10^{6}\times'+M_cr+r'}} \le \sqrt{\frac{1.2'+ r'\times'+ Z_e+r'\times ' +f_y+r'}{10^{6}\times'+M_cr+r'}}\\')) + eqn.append(NoEscape(r'&= ' + l + r' \le ' + limit + r'\\')) eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.8.2.2}] \end{aligned}')) return eqn @@ -987,14 +1012,14 @@ def cl_8_4_shear_capacity_member(V_dy, V_dn, V_db=0.0, shear_case='low'): V_dn = str(V_dn) V_db = str(V_db) - shear_capacity_eqn.append(NoEscape(r'\begin{aligned} V_d &= \min(S_c,~V_{d_n},~V_{d_b})\\')) + shear_capacity_eqn.append(NoEscape(r'\begin{aligned} V_d &= \min(~V_{d_y},~V_{d_n},~V_{d_b})\\')) shear_capacity_eqn.append(NoEscape(r'&= \min(' + V_dy + ',~' + V_dn + ',~' + V_db + r')\\')) elif V_db == 0.0 and V_dn == 0.0: V_d = V_dy V_d = str(V_d) V_dy = str(V_dy) - shear_capacity_eqn.append(NoEscape(r'\begin{aligned} V_d &= S_c\\')) + shear_capacity_eqn.append(NoEscape(r'\begin{aligned} V_d &= ~V_{d_y}\\')) # shear_capacity_eqn.append(NoEscape(r'&=' + V_dy + r'\\')) elif V_db == 0.0 and V_dn != 0.0: @@ -1002,7 +1027,7 @@ def cl_8_4_shear_capacity_member(V_dy, V_dn, V_db=0.0, shear_case='low'): V_d = str(V_d) V_dy = str(V_dy) V_dn = str(V_dn) - shear_capacity_eqn.append(NoEscape(r'\begin{aligned} V_d &= \min(S_c,~V_{d_n})\\')) + shear_capacity_eqn.append(NoEscape(r'\begin{aligned} V_d &= \min(~V_{d_y},~V_{d_n})\\')) shear_capacity_eqn.append(NoEscape(r'&= \min(' + V_dy + ',~' + V_dn + r')\\')) elif V_db != 0.0 and V_dn == 0.0: V_d = min(V_dy, V_db) @@ -1012,7 +1037,7 @@ def cl_8_4_shear_capacity_member(V_dy, V_dn, V_db=0.0, shear_case='low'): if shear_case == 'full': shear_capacity_eqn.append(NoEscape(r'\begin{aligned} V_d &= \min(V_{d_y},~V_{d_b})\\')) else: - shear_capacity_eqn.append(NoEscape(r'\begin{aligned} V_d &= \min(S_c,~V_{d_b})\\')) + shear_capacity_eqn.append(NoEscape(r'\begin{aligned} V_d &= \min(~V_{d_y},~V_{d_b})\\')) shear_capacity_eqn.append(NoEscape(r'&= \min(' + V_dy + ',' + V_db + r')\\')) shear_capacity_eqn.append(NoEscape(r'&=' + V_d + r'\\ \\')) @@ -1076,7 +1101,7 @@ def cl_8_4_shear_yielding_capacity_member(h, t, f_y, gamma_m0, V_dg, multiple=1) multiple = str(multiple) shear_yield_eqn.append( NoEscape(r'&=\frac{' + multiple + r'\times' + h + r'\times' + t + r'\times' + f_y + r'}{\sqrt{3} \times' + gamma_m0 + r' \times 1000} \\')) - shear_yield_eqn.append(NoEscape(r'&=' + V_dg + r' \\ \\')) + shear_yield_eqn.append(NoEscape(r'&=' + V_dg + r'\textkN \\ \\')) shear_yield_eqn.append(NoEscape(r'& [\text{Ref. IS ~800:2007,~Cl.10.4.3}] \end{aligned}')) return shear_yield_eqn @@ -1425,7 +1450,7 @@ def cl_8_7_1_5_phi(al, lm,phi): lm = str(lm) phi = str(phi) slender_eqn = Math(inline=True) - slender_eqn.append(NoEscape(r'\begin{aligned} &= 0.5(1 + \alpha(\lambda - 0.2) + \lambda ^ 2) \\')) + slender_eqn.append(NoEscape(r'\begin{aligned} &= 0.5(1 + \alpha(\bar{\lambda} - 0.2) + \bar{\lambda}^{2}) \\')) slender_eqn.append(NoEscape(r' &= 0.5(1+' + al + r'(' + lm + r'-0.2) +' + lm + r'^2)\\')) slender_eqn.append(NoEscape(r' &= ' + phi + r' \end{aligned}')) # slender_eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.7.1.2.1}] \end{aligned}')) @@ -1469,8 +1494,8 @@ def cl_8_7_1_5_Buckling(f_y,gamma_,lambd,phi,sub1,sub='0.49'): sub = str(sub) sub1 = str(sub1) slender_eqn = Math(inline=True) - slender_eqn.append(NoEscape(r'\begin{aligned} &= \frac{f_y \gamma_{mo}}{\phi + \sqrt{\phi^2 - \lambda^2}} \leq f_y / \gamma_{mo} \\')) - slender_eqn.append(NoEscape(r' &= \frac{' + f_y + r'\times' + gamma_+ r'}{' + phi + r'+\sqrt{'+phi+r'^2 - '+ lambd+r'^2}} \leq ' + f_y + r'/' + gamma_+r' \\')) + slender_eqn.append(NoEscape(r'\begin{aligned} &= \frac{f_y}{\gamma_{mo}\left(\phi + \sqrt{\phi^2 - \bar{\lambda}^2}\right)} \leq f_y / \gamma_{mo} \\')) + slender_eqn.append(NoEscape(r' &= \frac{' + f_y + r'}{' + gamma_ + r'\left(' + phi + r'+\sqrt{'+phi+r'^2 - '+ lambd+r'^2}\right)} \leq ' + f_y + r'/' + gamma_+r' \\')) slender_eqn.append(NoEscape(r'&='+ sub + r'\leq ' + sub1 + r'\end{aligned}')) # slender_eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.8.7.1.5}] \end{aligned}')) return slender_eqn @@ -1616,7 +1641,7 @@ def cl_9_2_2_combine_shear_bending_md_init(Ze,Zpz, f_y,support, gamma_m0,beta,Md eq.append(NoEscape(r' M_d &= \frac{\beta f_yZ_p}{\gamma_{mo}} \leq \frac{1.2Z_ef_y}{\gamma_{mo}}\\')) # eq.append(NoEscape(r'\leq 1.2Z_ef_y*\gamma_{mo} \\ ')) eq.append(NoEscape( - r'&= \frac{' + beta + r'\times(' + f_y + r'\times(' + Zpz + r'))}{' + gamma_m0 + r'}\leq \frac{1.2 \times'+ Ze + r'\times'+ f_y + r'}{'+ gamma_m0 + r'\times 10^6}\\')) + r'&= \frac{' + beta + r'\times(' + f_y + r'\times(' + Zpz + r'))}{' + gamma_m0 + r'\times 10^6}\leq \frac{1.2 \times'+ Ze + r'\times'+ f_y + r'}{'+ gamma_m0 + r'\times 10^6}\\')) # eq.append(NoEscape(r'\leq \frac{1.2 \times'+ Ze + r'\times'+ f_y + r'}{'+ gamma_m0 + r'}\\ ')) # eq.append(NoEscape( # r'&= ' + Md + r'\leq ' + res + r'\\')) @@ -1665,7 +1690,7 @@ def cl_9_2_2_ltb_moment(E, meu,Iy, It, Iw, Llt, Ze,Zpz, f_y,support, gamma_m0,be eq.append(NoEscape(r' M_d &= \frac{\beta f_yZ_p}{\gamma_{mo}} \leq \frac{1.2Z_ef_y}{\gamma_{mo}}\\')) # eq.append(NoEscape(r'\leq 1.2Z_ef_y*\gamma_{mo} \\ ')) eq.append(NoEscape( - r'&= \frac{' + beta + r'\times(' + f_y + r'\times(' + Zpz + r'}{' + gamma_m0 + r'}\leq \frac{1.2 \times'+ Ze + r'\times'+ f_y + r'}{'+ gamma_m0 + r'\times 10^6}\\')) + r'&= \frac{' + beta + r'\times(' + f_y + r'\times(' + Zpz + r'}{' + gamma_m0 + r'\times 10^6}\leq \frac{1.2 \times'+ Ze + r'\times'+ f_y + r'}{'+ gamma_m0 + r'\times 10^6}\\')) # eq.append(NoEscape(r'\leq \frac{1.2 \times'+ Ze + r'\times'+ f_y + r'}{'+ gamma_m0 + r'}\\ ')) eq.append(NoEscape( r'&= ' + Md + r'\leq ' + res + r'\\')) @@ -2143,9 +2168,9 @@ def cl_10_3_2_bolt_capacity(bolt_shear_capacity, bolt_bearing_capacity, bolt_cap """ bolt_shear_capacity = str(bolt_shear_capacity) bolt_bearing_capacity = str(bolt_bearing_capacity) - bolt_capacity = str(bolt_capacity) + bolt_capacity = str(round(bolt_capacity/1000,2)) bolt_capacity_eqn = Math(inline=True) - bolt_capacity_eqn.append(NoEscape(r'\begin{aligned} V_{\text{db}} &= \min~ (V_{\text{dsb}},~ V_{\text{dpb}})\\')) + bolt_capacity_eqn.append(NoEscape(r'\begin{aligned} V_{\text{db}} &= \min~ (V_{\text{bolt}},~ V_{\text{dpb}})\\')) bolt_capacity_eqn.append(NoEscape(r'&= \min~ (' + bolt_shear_capacity + ',~' + bolt_bearing_capacity + r')\\')) bolt_capacity_eqn.append(NoEscape(r'&=' + bolt_capacity + r'\\ \\')) bolt_capacity_eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.10.3.2}] \end{aligned}')) @@ -2177,7 +2202,7 @@ def cl_10_3_3_bolt_shear_capacity(f_ub, n_n, a_nb, gamma_mb, bolt_shear_capacity gamma_mb = str(gamma_mb) bolt_shear_capacity = str(bolt_shear_capacity) bolt_shear_eqn = Math(inline=True) - bolt_shear_eqn.append(NoEscape(r'\begin{aligned}V_{\text{dsb}} &= \frac{f_{ub} n_n A_{nb}}{\sqrt{3} \gamma_{mb}}\\')) + bolt_shear_eqn.append(NoEscape(r'\begin{aligned}V_{\text{bolt}} &= \frac{f_{ub} n_n A_{nb}}{\sqrt{3} \gamma_{mb}}\\')) bolt_shear_eqn.append(NoEscape(r'&= \frac{' + f_ub + r'\times' + n_n + r'\times' + a_nb + r'}{1000\times\sqrt{3}~\times~' + gamma_mb + r'}\\')) bolt_shear_eqn.append(NoEscape(r'&= ' + bolt_shear_capacity + r'\\ \\')) bolt_shear_eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.10.3.3}] \end{aligned}')) @@ -2279,7 +2304,7 @@ def cl_10_3_4_calculate_kb(e, p, d, fub, fu): kb_2 = str(kb_2) kb_eqn = Math(inline=True) if pitch != 0: - kb_eqn.append(NoEscape(r'\begin{aligned} k_b & = \min \Bigg(\frac{e}{3d_0},~\frac{p}{3d_0}-0.25,~\frac{f_{ub}}{f_u},~1.0 \Bigg) \\')) + kb_eqn.append(NoEscape(r'\begin{aligned} K_b & = \min \Bigg(\frac{e}{3d_0},~\frac{p}{3d_0}-0.25,~\frac{f_{ub}}{f_u},~1.0 \Bigg) \\')) kb_eqn.append(NoEscape( r'& = \min \Bigg(\frac{' + e + r'}{3\times' + d + r'},~\frac{' + p + r'}{3\times' + d + r'}-0.25,~\frac{' + fub + '}{' + fu + r'},~1.0 \Bigg)\\')) kb_eqn.append(NoEscape(r'& = \min(' + kb1 + ',' + kb2 + ',' + kb3 + ',' + kb4 + r')\\')) @@ -2333,7 +2358,7 @@ def cl_10_3_4_bolt_bearing_capacity(k_b, d, conn_plates_t_fu_fy, gamma_mb, bolt_ gamma_mb = str(gamma_mb) bolt_bearing_eqn = Math(inline=True) - bolt_bearing_eqn.append(NoEscape(r'\begin{aligned}V_{\text{dpb}} &= \frac{2.5 k_b d t f_u}{\gamma_{mb}}\\')) + bolt_bearing_eqn.append(NoEscape(r'\begin{aligned}V_{\text{dpb}} &= \frac{2.5 K_b d t f_u}{\gamma_{mb}}\\')) bolt_bearing_eqn.append(NoEscape(r'&= \frac{2.5 \times ' + k_b + r'\times' + d + r'\times' + t + r'\times' + f_u + r'}{1000\times' + gamma_mb + r'}\\')) if str(hole_type) == 'Over-sized' or str(hole_type) == 'short_slot': @@ -2639,7 +2664,7 @@ def cl_10_4_7_prying_force(l_v, l_e, l_e2, T_e, beta, f_o, b_e, t, end_dist, bea tension_in_bolt_due_to_prying = Math(inline=True) tension_in_bolt_due_to_prying.append(NoEscape( - r'\begin{aligned} Q &= \frac{l_v}{2 l_e} \Bigg[T_e - \frac{\beta \eta f_o b_e t^4}' + r'\begin{aligned} Q &= \frac{l_v}{2 l_e} \Bigg[T_{1} - \frac{\beta \eta f_o b_e t^4}' r'{27 l_e l_v^2}\Bigg] \\ \\')) # l_v @@ -3008,7 +3033,7 @@ def cl_10_3_3_1_long_joint_bolted_req(): long_joint_bolted_eqn.append(NoEscape(r'& \text{if}~l_j < 15 d~\text{then}~V_{\text{rd}} = V_{\text{db}} \\ \\')) long_joint_bolted_eqn.append(NoEscape(r'& \text{where},\\')) - long_joint_bolted_eqn.append(NoEscape(r'& l_j = ((nc~\text{or}~nr) - 1) \times (p~\text{or}~g) \\ \\')) + long_joint_bolted_eqn.append(NoEscape(r'& l_j = ((n_{c}~\text{or}~n_{r}) - 1) \times (p~\text{or}~g) \\ \\')) long_joint_bolted_eqn.append(NoEscape(r'& \beta_{lj} = 1.075 - l/(200 d) \\')) long_joint_bolted_eqn.append(NoEscape(r'& \text{but}~0.75\leq\beta_{lj}\leq1.0 \\ \\')) @@ -3069,10 +3094,10 @@ def cl_10_3_3_1_long_joint_bolted_prov(nc, nr, p, g, d, Tc, Tr, direction=None): # long_joint_bolted_eqn.append(NoEscape(r'& where,\\')) if direction == 'n_r': - long_joint_bolted_eqn.append(NoEscape(r'\begin{aligned} l_j &= (n_r - 1) \times p \\')) + long_joint_bolted_eqn.append(NoEscape(r'\begin{aligned} l_j &= (n_{r} - 1) \times p \\')) long_joint_bolted_eqn.append(NoEscape(r' &= (' + nr + r' - 1) \times ' + g + '=' + lr_str + r'\\ \\')) else: - long_joint_bolted_eqn.append(NoEscape(r'\begin{aligned} l_j &= ((n_c~\text{or}~n_r) - 1) \times (p~\text{or}~g) \\ ')) + long_joint_bolted_eqn.append(NoEscape(r'\begin{aligned} l_j &= ((n_{c}~\text{or}~n_{r}) - 1) \times (p~\text{or}~g) \\ ')) long_joint_bolted_eqn.append(NoEscape(r' &= (' + nc + r' - 1) \times ' + p + '=' + lc_str + r'\\')) long_joint_bolted_eqn.append(NoEscape(r' &= (' + nr + r' - 1) \times ' + g + '=' + lr_str + r'\\ \\')) @@ -3116,7 +3141,7 @@ def cl_10_3_3_2_large_grip_bolted_req(): return large_grip_bolted_eqn -def cl_10_3_3_2_large_grip_bolted_prov(t_sum, d, beta_lj=1.0): +def cl_10_3_3_2_large_grip_bolted_prov(t_sum, d, beta_lj=1.0, t_list=None): """ Calculate reduced bolt capacity in case of large grip @@ -3150,6 +3175,14 @@ def cl_10_3_3_2_large_grip_bolted_prov(t_sum, d, beta_lj=1.0): Bi = str(Bi) lg_str = str(lg) t_sum_str = str(t_sum) + + + if t_list and len(t_list) > 0: + t_parts = ' + '.join([str(round(t, 2)) for t in t_list]) + t_substitution_str = t_parts + ' = ' + lg_str + else: + t_substitution_str = lg_str + beta_lj_str = str(round(beta_lj, 2)) large_grip_bolted_eqn = Math(inline=True) @@ -3157,8 +3190,10 @@ def cl_10_3_3_2_large_grip_bolted_prov(t_sum, d, beta_lj=1.0): # large_grip_bolted_eqn.append(NoEscape(r'& where,\\')) large_grip_bolted_eqn.append(NoEscape(r'\begin{aligned} l_g &= \Sigma~ (t_{p}+t_{\text{member}}) \\')) + large_grip_bolted_eqn.append(NoEscape(r' &= ' + t_substitution_str + r'\\')) # shows individual values + # large_grip_bolted_eqn.append(NoEscape(r' &= ' + t_sum_str + r'\\')) - large_grip_bolted_eqn.append(NoEscape(r' &= ' + t_sum_str + r'\\')) + #large_grip_bolted_eqn.append(NoEscape(r' &= ' + t_sum_str + r'\\')) large_grip_bolted_eqn.append(NoEscape(r' 5d &= ' + d5_str + r'\\')) large_grip_bolted_eqn.append(NoEscape(r' 8d &= ' + d8_str + r'\\')) if lg <= 5 * d: @@ -3980,7 +4015,7 @@ def force_in_bolt_due_to_load(P, n, T_ba, load='tension'): T_ba = str(T_ba) tension_in_bolt_due_to_axial_load_n_moment = Math(inline=True) if load == 'tension': - tension_in_bolt_due_to_axial_load_n_moment.append(NoEscape(r'\begin{aligned} T_{ba} &= \frac{P}{\ n}\\')) + tension_in_bolt_due_to_axial_load_n_moment.append(NoEscape(r'\begin{aligned} T_{1} &= \frac{P}{\ n}\\')) tension_in_bolt_due_to_axial_load_n_moment.append(NoEscape(r'&=\frac{' + P + '}{' + n + r'}\\')) else: tension_in_bolt_due_to_axial_load_n_moment.append(NoEscape(r'\begin{aligned} V_{bv} &= \frac{V}{\ n}\\')) @@ -4022,9 +4057,9 @@ def tension_in_bolt_due_to_axial_load_n_moment(P, n, M, y_max, y_sqr, T_b): P = str(P) n = str(n) M = str(M) - y_max = str(y_max) - y_sqr = str(y_sqr) - T_b = str(T_b) + y_max = str((y_max)) + y_sqr = str((y_sqr)) + T_b = str((T_b)) tension_in_bolt_due_to_axial_load_n_moment = Math(inline=True) tension_in_bolt_due_to_axial_load_n_moment.append(NoEscape(r'\begin{aligned} T_1 &= \frac{P}{\ n} + \frac{M \times y_{max}}{\ y_{sqr}}\\')) tension_in_bolt_due_to_axial_load_n_moment.append( @@ -4253,16 +4288,16 @@ def end_plate_gauge(connection, e_min, s, t_w, T_w, R_r, module='None'): R_r = str(R_r) end_plate_gauge = Math(inline=True) if connection == VALUES_CONN_1[0]: - end_plate_gauge.append(NoEscape(r'\begin{aligned}g_1 &= 2(e`_{min}+s)+t_w\\')) + end_plate_gauge.append(NoEscape(r'\begin{aligned}g_1 &= 2(e\textquotesingle_{\min}+s)+t_w\\')) end_plate_gauge.append(NoEscape(r'&= 2(' + e_min + '+' + s + ')+' + t_w + r'\\')) end_plate_gauge.append(NoEscape(r'&=' + g1 + r'\\')) - end_plate_gauge.append(NoEscape(r'g_2 &= 2(e`_{min}+R_r)+T_w\\')) + end_plate_gauge.append(NoEscape(r'g_2 &= 2(e\textquotesingle_{\min}+R_r)+T_w\\')) end_plate_gauge.append(NoEscape(r'&= 2(' + e_min + '+' + R_r + ')+' + T_w + r'\\')) end_plate_gauge.append(NoEscape(r'&=' + g2 + r'\\')) end_plate_gauge.append(NoEscape(r'g_{min}&= max(g_1,g_2)\\')) end_plate_gauge.append(NoEscape(r'&=' + g_min + r' \end{aligned}')) else: - end_plate_gauge.append(NoEscape(r'\begin{aligned}g_{min} &= 2(e`_{min}+s)+t_w\\')) + end_plate_gauge.append(NoEscape(r'\begin{aligned}g_{min} &= 2(e\textquotesingle_{\min}+s)+T_w\\')) end_plate_gauge.append(NoEscape(r'&= 2(' + e_min + '+' + s + ')+' + t_w + r'\\')) end_plate_gauge.append(NoEscape(r'&=' + g1 + r' \end{aligned}')) @@ -4312,9 +4347,9 @@ def get_trial_bolts(V_u, A_u, bolt_capacity, multiple=1, conn=None): trial_bolts_eqn.append(NoEscape(r'n_{\text{trial}} &= R_u/ V_{bolt}\\ \\')) if conn == "flange_web": - trial_bolts_eqn.append(NoEscape(r'R_{u} &= \frac{2 \times \sqrt{' + V_u + r'^2+' + A_u + r'^2}}{' + bolt_capacity + r'}\\')) + trial_bolts_eqn.append(NoEscape(r'n_{\text{trial}} &= \frac{2 \times \sqrt{' + V_u + r'^2+' + A_u + r'^2}}{' + bolt_capacity + r'}\\')) else: - trial_bolts_eqn.append(NoEscape(r'R_{u} &= \frac{\sqrt{' + V_u + r'^2+' + A_u + r'^2}}{' + bolt_capacity + r'}\\')) + trial_bolts_eqn.append(NoEscape(r'n_{\text{trial}} &= \frac{\sqrt{' + V_u + r'^2+' + A_u + r'^2}}{' + bolt_capacity + r'}\\')) trial_bolts_eqn.append(NoEscape(r'&=' + trial_bolts + r'\end{aligned}')) return trial_bolts_eqn @@ -4389,7 +4424,7 @@ def moment_demand_req_bolt_force(shear_load, web_moment, moment_demand, ecc): ecc = str(ecc) web_moment = str(web_moment) - moment_demand = str(moment_demand) + moment_demand = str(round(moment_demand/1000,2)) shear_load = str(shear_load) loads_req_bolt_force_eqn = Math(inline=True) @@ -4440,35 +4475,38 @@ def Vres_bolts(bolts_one_line, ymax, xmax, bolt_line, axial_load, moment_demand, vres = str(vres) Vres_bolts_eqn = Math(inline=True) if conn == "beam_beam": - Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} vbv~~ &= V_u / (n_r \times (n_c/2))\\')) + Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} v_{\text{bv}}~~ &= V_u / (n_r \times (n_c/2))' r'\quad \parbox{3cm}{\raggedright \textnormal{(Applied shear per bolt)}} \\' +)) Vres_bolts_eqn.append(NoEscape(r' &= \frac{' + shear_load + '}{ (' + bolts_one_line + r'\times(' + bolt_line + r'/2))}\\')) elif conn == "col_col": - Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} vbv~~ &= V_u / ((n_r/2) \times n_c)\\')) + Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} v_{\text{bv}}~~ &= V_u / ((n_r/2) \times n_c)' r'\quad \parbox{3cm}{\raggedright \textnormal{(Applied shear per bolt)}} \\' +)) Vres_bolts_eqn.append(NoEscape(r' &= \frac{' + shear_load + '}{ (' + bolts_one_line + r'\times(' + bolt_line + r'/2))}\\')) else: - Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} vbv~~ &= V_u / (n_r \times n_c)\\')) + Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} v_{\text{bv}}~~ &= V_u / (n_r \times n_c)' r'\quad \parbox{3cm}{\raggedright \textnormal{(Applied shear per bolt)}} \\' +)) Vres_bolts_eqn.append(NoEscape(r' &= \frac{' + shear_load + '}{ (' + bolts_one_line + r'\times' + bolt_line + r')}\\')) Vres_bolts_eqn.append(NoEscape(r' & =' + vbv + r'\\ \\')) - Vres_bolts_eqn.append(NoEscape(r'tmh~ &= \frac{M_d \times y_{\text{max}} }{ \Sigma r_i^2} \\')) + Vres_bolts_eqn.append(NoEscape(r't_{\text{mh}}~ &= \frac{M_d \times y_{\text{max}} }{ \Sigma r_i^2}' r'\quad \parbox{3cm}{\raggedright \textnormal{(Moment-induced force along the height (vertical component))}} \\')) Vres_bolts_eqn.append(NoEscape(r' &= \frac{' + moment_demand + r'\times' + ymax + '}{' + r + r'}\\')) Vres_bolts_eqn.append(NoEscape(r' & =' + tmh + r'\\ \\')) - Vres_bolts_eqn.append(NoEscape(r' tmv ~&= \frac{M_d \times x_{\text{max}}}{\Sigma r_i^2}\\')) + Vres_bolts_eqn.append(NoEscape(r' t_{\text{mv}} ~&= \frac{M_d \times x_{\text{max}}}{\Sigma r_i^2}' r'\quad \parbox{3cm}{\raggedright \textnormal{(Moment-induced force along the width (horizontal component))}} \\')) Vres_bolts_eqn.append(NoEscape(r'&= \frac{' + moment_demand + r'\times ' + xmax + '}{' + r + r'}\\')) Vres_bolts_eqn.append(NoEscape(r' & =' + tmv + r'\\ \\')) if conn == "beam_beam": - Vres_bolts_eqn.append(NoEscape(r' abh~ & = \frac{A_u }{(n_r \times n_c/2)}\\')) + Vres_bolts_eqn.append(NoEscape(r' a_{\text{bh}}~ & = \frac{A_u }{(n_r \times n_c/2)}' r'\quad \parbox{3cm}{\raggedright \textnormal{(Additional bolt force from axial load (if applicable))}} \\')) Vres_bolts_eqn.append(NoEscape(r' & =\frac{' + axial_load + '}{ (' + bolts_one_line + r' \times(' + bolt_line + r'/2))}\\')) elif conn == "col_col": - Vres_bolts_eqn.append(NoEscape(r' abh~ & = \frac{A_u }{((n_r/2) \times n_c)}\\')) + Vres_bolts_eqn.append(NoEscape(r' a_{\text{bh}}~ & = \frac{A_u }{((n_r/2) \times n_c)}' r'\quad \parbox{3cm}{\raggedright \textnormal{(Additional bolt force from axial load (if applicable))}} \\')) Vres_bolts_eqn.append(NoEscape(r' & =\frac{' + axial_load + '}{ (' + bolts_one_line + r' \times(' + bolt_line + r'/2))}\\')) else: - Vres_bolts_eqn.append(NoEscape(r' abh~ & = \frac{A_u }{(n_r \times n_c)}\\')) + Vres_bolts_eqn.append(NoEscape(r' a_{\text{bh}}~ & = \frac{A_u }{(n_r \times n_c)}' r'\quad \parbox{3cm}{\raggedright \textnormal{(Additional bolt force from axial load (if applicable))}} \\')) Vres_bolts_eqn.append(NoEscape(r' & =\frac{' + axial_load + '}{ (' + bolts_one_line + r' \times' + bolt_line + r')}\\')) Vres_bolts_eqn.append(NoEscape(r' & =' + abh + r'\\ \\')) - Vres_bolts_eqn.append(NoEscape(r' v_{\text{res}} &=\sqrt{(vbv +tmv) ^ 2 + (tmh+abh) ^ 2}\\')) + Vres_bolts_eqn.append(NoEscape(r' v_{\text{res}} &=\sqrt{(v_{\text{bv}} +t_{\text{mh}}) ^ 2 + (t_{\text{mh}}+a_{\text{bh}}) ^ 2}\\')) # Vres_bolts_eqn.append(NoEscape(r' vres &= \sqrt((vbv + tmv) ^ 2 + (tmh + abh) ^ 2)\\')) Vres_bolts_eqn.append(NoEscape(r' &= \sqrt{(' + vbv + ' +' + tmv + ') ^2 + (' + tmh + '+' + abh + r') ^ 2}\\')) Vres_bolts_eqn.append(NoEscape(r' & =' + vres + r'\end{aligned}')) @@ -4652,10 +4690,10 @@ def max_plate_ht_req(connectivity, beam_depth, beam_f_t, beam_r_r, notch, max_pl notch = str(notch) max_plate_ht_eqn = Math(inline=True) if connectivity in VALUES_CONN_1: - max_plate_ht_eqn.append(NoEscape(r'\begin{aligned} &d_b - 2 (t_{bf} + r_{b1} + \text{gap})\\')) + max_plate_ht_eqn.append(NoEscape(r'\begin{aligned} &D_{supporting} - 2 (t_{bf} + R_1 + \text{gap})\\')) max_plate_ht_eqn.append(NoEscape(r'&=' + beam_depth + r'- 2\times (' + beam_f_t + '+' + beam_r_r + r'+ 10)\\')) else: - max_plate_ht_eqn.append(NoEscape(r'\begin{aligned} &d_b - t_{bf} + r_{b1} - notch_h\\')) + max_plate_ht_eqn.append(NoEscape(r'\begin{aligned} &D_{supporting} - t_{bf} + R_1 - notch_h\\')) max_plate_ht_eqn.append(NoEscape(r'&=' + beam_depth + '-' + beam_f_t + '+' + beam_r_r + '-' + notch + r'\\')) max_plate_ht_eqn.append(NoEscape(r'&=' + max_plate_h + '\end{aligned}')) return max_plate_ht_eqn @@ -4666,7 +4704,7 @@ def ep_min_plate_width_req(g, e_min, wp_min): e_min = str(e_min) wp_min = str(wp_min) ep_min_plate_w_eqn = Math(inline=True) - ep_min_plate_w_eqn.append(NoEscape(r'\begin{aligned} w_{p_{\text{min}}} &= g` + e`_{\text{min}}~2 \\')) + ep_min_plate_w_eqn.append(NoEscape(r'\begin{aligned} w_{p_{\text{min}}} &= g` + e\textquotesingle_{\text{min}}~ \times2 \\')) ep_min_plate_w_eqn.append(NoEscape(r'&=' + g + '+' + e_min + r'\times2\\')) ep_min_plate_w_eqn.append(NoEscape(r'&=' + wp_min + r'\end{aligned}')) return ep_min_plate_w_eqn @@ -4744,6 +4782,7 @@ def end_plate_thk_req(M_ep, b_eff, f_y, gamma_m0, t_p, t_b, q, l_e, l_v, f_o, b_ if module == 'BC_EP' or module == 'BB_EP': end_plate_thk_eqn.append(NoEscape(r'\begin{aligned} t_p &= \sqrt{\frac{4 M_{cr}} {b_{e} (f_{y} / \gamma_{m0})} } \\')) + end_plate_thk_eqn.append(NoEscape(r'& \text{where}~ M_{cr}~\text{(N-mm)} = M_{ep}~\text{(kNm)} \times 10^{6} \\')) end_plate_thk_eqn.append(NoEscape(r'&= \sqrt{\frac{4 \times ' + M_ep + r' \times 10^{6}} {' + b_eff + r' \times (' + f_y + r' / ' + gamma_m0 + r')} } \\')) @@ -4751,13 +4790,15 @@ def end_plate_thk_req(M_ep, b_eff, f_y, gamma_m0, t_p, t_b, q, l_e, l_v, f_o, b_ end_plate_thk_eqn.append(NoEscape(r'\begin{aligned} t_p &= max\Bigg(\sqrt{\frac{4 M_{cr}} {b_{eff} (f_{y} / \gamma_{m0})} }, ~ \\')) end_plate_thk_eqn.append(NoEscape(r'& \sqrt[4]{\Bigg(T_1 - \frac{2 Q l_e}{l_v}\Bigg) \times ' r'\Bigg(\frac{27 l_e l_v^{2}}{\beta \eta f_o b_e}\Bigg) }~ \Bigg) \\ \\')) + end_plate_thk_eqn.append(NoEscape(r'& \text{where}~ M_{cr}~\text{(N-mm)} = M_{ep}~\text{(kNm)} \times 10^{6} \\ \\')) + end_plate_thk_eqn.append(NoEscape(r' &= max\Bigg(\sqrt{\frac{4 \times ' + M_ep + r' \times 10^{6}} {' + b_eff + r' \times (' + f_y + r' / ' + gamma_m0 + r')} }, ~ \\')) - end_plate_thk_eqn.append(NoEscape(r'& \sqrt[4]{\Bigg(' + t_b + r' - \frac{2 \times ' + q + r' \times ' + l_e + r'}{' + end_plate_thk_eqn.append(NoEscape(r'& {\scriptsize \sqrt[4]{\Bigg(' + t_b + r' - \frac{2 \times ' + q + r' \times ' + l_e + r'}{' + l_v + r'}\Bigg) \times ' r'\Bigg(\frac{27 \times ' + l_e + r' \times ' + l_v + r'^{2}}{' + beta + r' \times 1.5 \times ' - + f_o + r' \times ' + b_e + r'}\Bigg) }~ \Bigg) \\ \\')) + + f_o + r' \times ' + b_e + r'}\Bigg)} }~ \Bigg) \\ \\')) end_plate_thk_eqn.append(NoEscape(r'&=' + t_p + r' \end{aligned}')) @@ -4844,11 +4885,13 @@ def moment_acting_on_end_plate_flush(M_ep, t_b, e, tb_2): moment_acting_on_end_plate = Math(inline=True) - moment_acting_on_end_plate.append(NoEscape(r'\begin{aligned} M_{ep}&= \text{max (0.5 X Tension in first bolt X end distance, } \\')) - moment_acting_on_end_plate.append(NoEscape(r'& \text{Tension in second bolt X end distance)} \\')) - moment_acting_on_end_plate.append(NoEscape(r'&= \max(0.5 T_b1 e, ~ T_b2 e)\\')) + moment_acting_on_end_plate.append(NoEscape(r'\begin{aligned} M_{ep}&= \text{max (0.5 x Tension in first bolt x end distance,}\\')) + moment_acting_on_end_plate.append(NoEscape(r'& \text{Tension in second bolt x end distance)} \\')) + #moment_acting_on_end_plate.append(NoEscape(r'&= \max(0.5 T_b1 e, ~ T_b2 e)\\')) + moment_acting_on_end_plate.append(NoEscape(r'&= \max(0.5~ T_{b1}~ e,~ T_{b2}~ e) \times 10^{-6}~~ \text{[N-mm} \to \text{kNm]}\\')) + - moment_acting_on_end_plate.append(NoEscape(r'&= \max(0.5 \times ' + t_b + r'\times' + e + ',~' + tb_2 + r'\times' + e + r'\\')) + moment_acting_on_end_plate.append(NoEscape(r'&= \max(0.5 \times ' + t_b + r'\times' + e + ',~' + tb_2 + r'\times' + e + r') \times 10^{-6}\\')) moment_acting_on_end_plate.append(NoEscape(r'&=' + M_ep + '\end{aligned}')) return moment_acting_on_end_plate @@ -5482,7 +5525,7 @@ def end_plate_moment_demand(connectivity, g, T_w, R_r, t_w, s, T_e, M): ecc = str(ecc) EP_Mom = Math(inline=True) - EP_Mom.append(NoEscape(r'\begin{aligned}M &= T_e \times \text{ecc} \\ \\')) + EP_Mom.append(NoEscape(r'\begin{aligned}M &= T_{1} \times \text{ecc} \\ \\')) if connectivity == VALUES_CONN_1[0]: EP_Mom.append(NoEscape(r'ecc_1 &=\frac{g}{2}-\frac{t_w}{2}-s &=' + ecc1 + r'\\')) EP_Mom.append(NoEscape(r'ecc_2 &=\frac{g}{2}-\frac{T_w}{2}-R_r &=' + ecc2 + r'\\')) @@ -5536,7 +5579,7 @@ def gusset_lt_b_prov(nc, p, e, length): length = str(length) length_htb_eqn = Math(inline=True) length_htb_eqn.append( - NoEscape(r'\begin{aligned} L &= (nc -1) p + 2 e\\')) + NoEscape(r'\begin{aligned} L &= (n_{c} -1) p + 2 e\\')) length_htb_eqn.append( NoEscape(r'&= (' + nc + r'-1) \times' + p + r'+ (2 \times' + e + r')\\')) length_htb_eqn.append(NoEscape(r'&= ' + length + r'\end{aligned}')) @@ -5589,7 +5632,7 @@ def bearing_length(V, t_w, t_f, r_r, f_y, gamma_m0, t, r_ra, gap): r_ra = str(r_ra) bearing_length = Math(inline=True) - bearing_length.append(NoEscape(r'\begin{aligned} b_{l_{\text{req}}} &= \frac{V \gamma_m0}{t_w f_y} - t_f - r_r \\')) + bearing_length.append(NoEscape(r'\begin{aligned} b_{l_{\text{req}}} &= \frac{V \gamma_{m0}}{t_w f_y} - t_f - r_r \\')) bearing_length.append(NoEscape(r'&= \frac{' + V + r'\times' + gamma_m0 + '}{' + t_w + r'\times' + f_y + '} - ' + t_f + '-' + r_r + r' \\')) bearing_length.append(NoEscape(r'&=' + b1_req + r' \\ \\')) @@ -5759,7 +5802,7 @@ def plate_area_req(crs_area, flange_web_area): flange_web_area = str(flange_web_area) plate_crs_sec_area_eqn = Math(inline=True) - plate_crs_sec_area_eqn.append(NoEscape(r'\begin{aligned} & \text{plate area} >= \\ & \text{1.05 X connected member area} \\')) + plate_crs_sec_area_eqn.append(NoEscape(r'\begin{aligned} & \text{plate area} = \\ & \text{1.05} '+ r'\times' +r'\text{connected member area} \\')) # plate_crs_sec_area_eqn.append(NoEscape(r'& = '+crs_area+ r' * 1.05 \\')) plate_crs_sec_area_eqn.append(NoEscape(r' &= ' + flange_web_area + r'\\ \\')) plate_crs_sec_area_eqn.append(NoEscape(r' & [ \text{Ref: Cl.8.6.3.2, IS 800:2007}] \end{aligned}')) @@ -5943,14 +5986,14 @@ def min_plate_ht_req(D, r_r, t_f, min_req_width): [Ref: INSDAG - Chapter 5, Sect. 5.2.3] """ - beam_depth = str(D) + D = str(D) r_r = str(r_r) t_f = str(t_f) min_plate_ht = str(round(min_req_width, 2)) web_width_min_eqn = Math(inline=True) - web_width_min_eqn.append(NoEscape(r'\begin{aligned} & 0.6 \times (d_b - 2 \times t_f - 2 \times r_r)\\')) + web_width_min_eqn.append(NoEscape(r'\begin{aligned} & 0.6 \times (D_{supported} - 2 \times t_f - 2 \times R_1)\\')) web_width_min_eqn.append( - NoEscape(r'&= 0.6 \times (' + beam_depth + r'- 2 \times' + t_f + r'- 2 \times' + r_r + r')\\')) + NoEscape(r'&= 0.6 \times (' + D + r'- 2 \times' + t_f + r'- 2 \times' + r_r + r')\\')) web_width_min_eqn.append(NoEscape(r'&=' + min_plate_ht + r'\\ \\')) web_width_min_eqn.append(NoEscape(r'& [\text{Ref. INSDAG, Ch.5, sec.5.2.3}] \end{aligned}')) return web_width_min_eqn diff --git a/src/osdag_core/design_report/reportGenerator_latex.py b/src/osdag_core/design_report/reportGenerator_latex.py index 39ceca7f4..f1630c82c 100644 --- a/src/osdag_core/design_report/reportGenerator_latex.py +++ b/src/osdag_core/design_report/reportGenerator_latex.py @@ -394,13 +394,15 @@ def save_latex(self, uiObj, Design_Check, reportsummary, filename, rel_path, Dis # count = count + 1 # 2D images if len(Disp_2d_image) != 0: - + + if module == KEY_DISP_BCENDPLATE or module == KEY_DISP_BB_EP_SPLICE: + ''' if does_design_exist and sys.platform != 'darwin': doc.append(NewPage()) - weld_details = rel_path + Disp_2d_image[0] - detailing_details = rel_path + Disp_2d_image[1] - stiffener_details = rel_path + Disp_2d_image[2] + weld_details = Disp_2d_image[0] + detailing_details = Disp_2d_image[1] + stiffener_details = Disp_2d_image[2] with doc.create(Section('2D Drawings (Typical)')): @@ -418,6 +420,7 @@ def save_latex(self, uiObj, Design_Check, reportsummary, filename, rel_path, Dis image_3.add_image(stiffener_details, width=NoEscape(r'0.9\textwidth'), placement=NoEscape(r'\centering')) image_3.add_caption('Typical Stiffener Details') # doc.append(NewPage()) + ''' elif module == KEY_DISP_BASE_PLATE: if does_design_exist and sys.platform != 'darwin': @@ -512,6 +515,13 @@ def save_latex(self, uiObj, Design_Check, reportsummary, filename, rel_path, Dis with doc.create(Section('Design Log')): doc.append(pyl.Command('Needspace', arguments=NoEscape(r'10\baselineskip'))) logger_msgs=reportsummary['logger_messages'].split('\n') + + # Collapse repeated messages (e.g. from optimization iterations) into a + # single entry with an occurrence count, ignoring only the timestamp so + # identical messages logged at different times still get grouped together. + unique_order = [] + msg_colour = {} + msg_count = {} for msg in logger_msgs: if('WARNING' in msg): colour='blue' @@ -521,7 +531,17 @@ def save_latex(self, uiObj, Design_Check, reportsummary, filename, rel_path, Dis colour='red' else: continue - doc.append(TextColor(colour,'\n'+msg)) + core_msg = msg.split(' - ', 1)[1] if ' - ' in msg else msg + if core_msg not in msg_count: + unique_order.append(core_msg) + msg_colour[core_msg] = colour + msg_count[core_msg] = 0 + msg_count[core_msg] += 1 + + for core_msg in unique_order: + count = msg_count[core_msg] + display_msg = core_msg if count == 1 else f'{core_msg} (occurred {count} times)' + doc.append(TextColor(msg_colour[core_msg], '\n'+display_msg)) doc.append(pyl.Command('vspace', arguments='10mm')) with doc.create(Tabularx('|X|', row_height=1.5)) as table: diff --git a/src/osdag_core/design_type/compression_member/compression_bolted.py b/src/osdag_core/design_type/compression_member/compression_bolted.py index a42ec3430..c8c2d1017 100644 --- a/src/osdag_core/design_type/compression_member/compression_bolted.py +++ b/src/osdag_core/design_type/compression_member/compression_bolted.py @@ -2880,10 +2880,10 @@ def save_design(self, popup_summary): self.report_check.append(t1) else: # For other sections or concentrically loaded - t1 = ('Effective Length Factor', '', f'$K = {K}$', '') + t1 = ('Effective Length Factor', '', f'K = {K}', '') self.report_check.append(t1) - t1 = ('Unsupported Length', '', f'$L = {L}$ mm', '') + t1 = ('Unsupported Length', '', f'L = {L} mm', '') self.report_check.append(t1) t1 = ('Minimum Radius of Gyration', '', diff --git a/src/osdag_core/design_type/connection/butt_joint_bolted.py b/src/osdag_core/design_type/connection/butt_joint_bolted.py index cb4644930..be1e18f83 100644 --- a/src/osdag_core/design_type/connection/butt_joint_bolted.py +++ b/src/osdag_core/design_type/connection/butt_joint_bolted.py @@ -1731,9 +1731,15 @@ def as_int(x, default=0): self.report_check.append([ "SubSection", "Bolt Arrangement", "|p{4cm}|p{5cm}|p{5.5cm}|p{1.5cm}|" ]) + + + if cols == 1: + col_text = "column" + else: + col_text = "columns" self.report_check.append([ - "Bolt Pattern", "2", f"Arrangement: {rows} rows × {cols} columns", "" + "Bolt Pattern", "2", f"Arrangement: {rows} rows × {cols} {col_text}", "" ]) #================================ @@ -1758,9 +1764,12 @@ def as_int(x, default=0): # 1. Gross Section Yielding yield_req = Math(inline=True) yield_req.append(NoEscape(r'\begin{aligned}\\')) + + #Tdg_kn = round(self.section.yield_req / 1000, 2) #converting to kn before displaying yield_req.append(NoEscape(r'T_{dg} &= \frac{A_g \cdot f_y}{\gamma_{m0}}\\\\')) + #yield_req.append(NoEscape(r'&=' + str(Tdg_kn) + r' \text{ kN}')) yield_req.append(NoEscape(r'&= \frac{' + str(A_g) + r' \times ' + str(fy) + r'}{1.10}\\\\')) - yield_req.append(NoEscape(r'&= ' + f'{T_dg:.2f}' + r' \text{ kN}\\')) + yield_req.append(NoEscape(r'&= ' + f'{T_dg/1000:.2f}' + r' \text{ kN}\\')) yield_req.append(NoEscape(r'&[\text{Ref. Cl. 6.2}]')) yield_req.append(NoEscape(r'\end{aligned}')) self.report_check.append(["Gross Section Yield", "", yield_req, ""]) @@ -1775,9 +1784,11 @@ def as_int(x, default=0): rup_req = Math(inline=True) rup_req.append(NoEscape(r'\begin{aligned}\\')) + #Tdn_kn = round(self.plate.rup_req/ 1000, 2) rup_req.append(NoEscape(r'T_{dn} &= \frac{0.9 A_n f_u}{\gamma_{m1}}\\')) + #rup_req.append(NoEscape(r'&=' + str(Tdn_kn) + r' \text{ kN}')) rup_req.append(NoEscape(r'&= \frac{0.9 \times ' + f'{An_disp:.2f}' + r' \times ' + str(fu) + r'}{1.25}\\')) - rup_req.append(NoEscape(r'&= ' + f'{T_dn:.2f}' + r' \text{ kN}\\')) + rup_req.append(NoEscape(r'&= ' + f'{T_dn/1000:.2f}' + r' \text{ kN}\\')) rup_req.append(NoEscape(r'&[\text{Ref. Cl. 6.3}]')) rup_req.append(NoEscape(r'\end{aligned}')) self.report_check.append(["Net Section Rupture", "", rup_req, ""]) diff --git a/src/osdag_core/design_type/connection/butt_joint_welded.py b/src/osdag_core/design_type/connection/butt_joint_welded.py index e806b3c04..d06169f52 100644 --- a/src/osdag_core/design_type/connection/butt_joint_welded.py +++ b/src/osdag_core/design_type/connection/butt_joint_welded.py @@ -1510,9 +1510,9 @@ def f2(x, default=0.0): eff_len_calc_detail = Math(inline=True) eff_len_calc_detail.append(NoEscape(r'\begin{aligned}')) eff_len_calc_detail.append( - NoEscape(r'L_{eff} &= L_{provided\_line} - 2a\\')) + NoEscape(r'L_{eff} &= L_{provided\_line} - 2s\\')) eff_len_calc_detail.append(NoEscape( - r'&= ' + str(L_provided_line) + r' - 2 \times ' + str(effective_throat) + r'\\')) + r'&= ' + str(L_provided_line) + r' - 2 \times ' + str(weld_size) + r'\\')) eff_len_calc_detail.append( NoEscape(r'&= ' + str(L_eff_provided) + r' \text{ mm}\\')) eff_len_calc_detail.append(NoEscape(r'\end{aligned}')) diff --git a/src/osdag_core/design_type/connection/cleat_angle_connection.py b/src/osdag_core/design_type/connection/cleat_angle_connection.py index 53692db0e..961e6038b 100644 --- a/src/osdag_core/design_type/connection/cleat_angle_connection.py +++ b/src/osdag_core/design_type/connection/cleat_angle_connection.py @@ -1553,12 +1553,15 @@ def save_design(self, popup_summary): bolt_shear_capacity_kn = round(self.bolt.bolt_shear_capacity / 1000, 2) if self.bolt.bolt_type == "Bearing Bolt": bolt_bearing_capacity_kn = round(self.bolt.bolt_bearing_capacity / 1000, 2) + else: + bolt_bearing_capacity_kn = 'N/A' bolt_capacity_kn = round(self.bolt.bolt_capacity / 1000, 2) bolt_force_kn = round(self.sptd_leg.bolt_force / 1000, 2) bolt_capacity_red_kn = self.bolt_capacity_disp_sptd n_planes=2 beta_lj = self.beta_lj_sptd beta_lg = self.beta_lg_sptd + else: t1 = ('SubSection', 'Bolt Design - Connected to Column', '|p{3.5cm}|p{5cm}|p{6cm}|p{1.5cm}|') if self.connectivity == VALUES_CONN_2[0]: @@ -1570,6 +1573,8 @@ def save_design(self, popup_summary): bolt_shear_capacity_kn = round(self.bolt2.bolt_shear_capacity / 1000, 2) if self.bolt2.bolt_bearing_capacity != 'N/A': bolt_bearing_capacity_kn = round(self.bolt2.bolt_bearing_capacity / 1000, 2) + else: + bolt_bearing_capacity_kn = 'N/A' bolt_capacity_kn = round(self.bolt2.bolt_capacity / 1000, 2) bolt_force_kn = round(self.spting_leg.bolt_force / 1000, 2) @@ -1646,9 +1651,9 @@ def save_design(self, popup_summary): self.report_check.append(t4) - if self.sptd_leg.reason == "Minimum end/edge distance is greater than max end/edge distance." or\ - self.sptd_leg.reason == "Can't fit two bolts in one line. Select lower diameter." or \ - self.sptd_leg.reason == "Minimum pitch/gauge distance is greater than max pitch/gauge distance.": + if leg.reason == "Minimum end/edge distance is greater than max end/edge distance." or\ + leg.reason == "Can't fit two bolts in one line. Select lower diameter." or \ + leg.reason == "Minimum pitch/gauge distance is greater than max pitch/gauge distance.": pass else: if leg == self.sptd_leg: @@ -1722,10 +1727,13 @@ def save_design(self, popup_summary): self.sptd_bolt_conn_plates_t_fu_fy, bolt.gamma_mb, bolt_bearing_capacity_kn), '') self.report_check.append(t2) - t3 = (KEY_OUT_DISP_BOLT_CAPACITY, '', + t3 = (KEY_OUT_DISP_BOLT_CAPACITY, bolt_force_kn, cl_10_3_2_bolt_capacity(bolt_shear_capacity_kn, bolt_bearing_capacity_kn, bolt_capacity_kn), - '') + get_pass_fail(bolt_force_kn, bolt_capacity_kn, relation="lesser")) self.report_check.append(t3) + governing_mode = 'Bolt Shear' if bolt_shear_capacity_kn <= bolt_bearing_capacity_kn else 'Bolt Bearing' + t3a = ('Governing Failure Mode', '', governing_mode, '') + self.report_check.append(t3a) else: kh_disp = round(bolt.kh, 2) t4 = (KEY_OUT_DISP_BOLT_SLIP, '', @@ -1733,6 +1741,8 @@ def save_design(self, popup_summary): Anb=bolt.bolt_net_area, gamma_mf=bolt.gamma_mf, capacity=bolt_capacity_kn), '') self.report_check.append(t4) + t4a = ('Governing Failure Mode', '', 'Bolt Slip', '') + self.report_check.append(t4a) t10 = (KEY_OUT_LONG_JOINT, '', diff --git a/src/osdag_core/design_type/connection/column_cover_plate.py b/src/osdag_core/design_type/connection/column_cover_plate.py index d04a5e10c..315badbab 100644 --- a/src/osdag_core/design_type/connection/column_cover_plate.py +++ b/src/osdag_core/design_type/connection/column_cover_plate.py @@ -1815,7 +1815,11 @@ def flange_check_axial(self): ((self.flange_plate.bolts_one_line / 2 - 0.5) * self.flange_bolt.dia_hole) + self.flange_plate.edge_dist_provided) * \ self.section.flange_thickness - + + #self.Avg = Avg + #self.Avn = Avn + #self.Atg = Atg + #self.Atn = Atn self.section.block_shear_capacity = self.block_shear_strength_section(A_vg=Avg, A_vn=Avn, A_tg=Atg, A_tn=Atn, f_u=self.section.fu, @@ -3496,7 +3500,7 @@ def save_design(self, popup_summary): if self.flange_plate.spacing_status == True: t1 = ('SubSection', 'Flange Bolt Check', - '|p{3cm}|p{4.5cm}|p{6.5cm}|p{1.5cm}|') + '|p{3.0cm}|p{5.0cm}|p{6.0cm}|p{1.5cm}|') self.report_check.append(t1) t6 = (KEY_OUT_DISP_D_PROVIDED, "Bolt Quantity Optimisation", @@ -3650,9 +3654,12 @@ def save_design(self, popup_summary): self.flange_plate.gap, self.flange_plate.edge_dist_provided, self.section.web_thickness, self.section.root_radius, conn="col_col"), "") self.report_check.append(t10) + + self.t_list = [self.flange_plate.thickness_provided, self.section.flange_thickness] + t10 = (KEY_OUT_LARGE_GRIP, cl_10_3_3_2_large_grip_bolted_req(), cl_10_3_3_2_large_grip_bolted_prov(self.t_sum1, self.flange_bolt.bolt_diameter_provided, - self.flange_plate.beta_lj), "") + self.flange_plate.beta_lj, t_list= self.t_list ), "") self.report_check.append(t10) ## # t5 = (KEY_OUT_DISP_BOLT_CAPACITY, bolt_force_kn, @@ -3837,6 +3844,10 @@ def save_design(self, popup_summary): self.section.web_thickness, self.section.root_radius, conn="col_col"), "") self.report_check.append(t10) + #thickness_list = [self.web_plate.thickness_provided, self.section.web_thickness] + #summation_str = " + ".join([str(round(thk, 2)) for thk in thickness_list]) + #t_sum2 = sum(thickness_list) + t10 = (KEY_OUT_LARGE_GRIP, cl_10_3_3_2_large_grip_bolted_req(), cl_10_3_3_2_large_grip_bolted_prov(self.t_sum2, self.web_bolt.bolt_diameter_provided, self.web_plate.beta_lj), "") diff --git a/src/osdag_core/design_type/connection/column_end_plate.py b/src/osdag_core/design_type/connection/column_end_plate.py index 527dba4ac..611f585ec 100644 --- a/src/osdag_core/design_type/connection/column_end_plate.py +++ b/src/osdag_core/design_type/connection/column_end_plate.py @@ -2543,7 +2543,7 @@ def save_design(self, popup_summary): self.report_check.append(t4) t1 = ('SubSection', 'End Plate Checks', - '|p{3.5cm}|p{6.5cm}|p{4.5cm}|p{1.5cm}|') + '|p{3.0cm}|p{8.0cm}|p{3.5cm}|p{1.5cm}|') self.report_check.append(t1) if self.connection == "Flush End Plate": diff --git a/src/osdag_core/design_type/connection/fin_plate_connection.py b/src/osdag_core/design_type/connection/fin_plate_connection.py index eaff2cdf5..9784150ce 100644 --- a/src/osdag_core/design_type/connection/fin_plate_connection.py +++ b/src/osdag_core/design_type/connection/fin_plate_connection.py @@ -1078,7 +1078,7 @@ def save_design(self,popup_summary): bolt_force_kn=round(self.plate.bolt_force/1000,2) bolt_capacity_red_kn=round(self.plate.bolt_capacity_red/1000,2) - t1 = ('SubSection', 'Bolt Design','|p{3.5cm}|p{5.3cm}|p{6.7cm}|p{1.5cm}|') + t1 = ('SubSection', 'Bolt Design','|p{3.5cm}|p{5.8cm}|p{6.2cm}|p{1.5cm}|') self.report_check.append(t1) t1 = (KEY_DISP_D, '', self.bolt.bolt_diameter_provided, '') self.report_check.append(t1) diff --git a/src/osdag_core/design_type/connection/lap_joint_bolted.py b/src/osdag_core/design_type/connection/lap_joint_bolted.py index e4385fc29..74c90766b 100644 --- a/src/osdag_core/design_type/connection/lap_joint_bolted.py +++ b/src/osdag_core/design_type/connection/lap_joint_bolted.py @@ -1521,9 +1521,12 @@ def as_int(x, default=0): # 1. Gross Section Yielding yield_req = Math(inline=True) yield_req.append(NoEscape(r'\begin{aligned}\\')) + + #Tdg_kn = round(self.section.yield_req / 1000, 2) yield_req.append(NoEscape(r'T_{dg} &= \frac{A_g \cdot f_y}{\gamma_{m0}}\\\\')) yield_req.append(NoEscape(r'&= \frac{' + str(A_g) + r' \times ' + str(fy) + r'}{1.10}\\\\')) - yield_req.append(NoEscape(r'&= ' + f'{T_dg:.2f}' + r' \text{ kN}\\')) + yield_req.append(NoEscape(r'&= ' + f'{T_dg/1000:.2f}' + r' \text{ kN}\\')) + #yield_req.append(NoEscape(r'&=' + str(Tdg_kn) + r' \text{ kN}')) yield_req.append(NoEscape(r'&[\text{Ref. Cl. 6.2}]')) yield_req.append(NoEscape(r'\end{aligned}')) self.report_check.append(["Gross Section Yield", "", yield_req, ""]) @@ -1531,8 +1534,11 @@ def as_int(x, default=0): # 2. Net Section Rupture rup_req = Math(inline=True) rup_req.append(NoEscape(r'\begin{aligned}')) + + #Tdn_kn = round(self.plate.rup_req/ 1000, 2) rup_req.append(NoEscape(r'T_{dn} &= \frac{0.9 A_n f_u}{\gamma_{m1}}\\')) - rup_req.append(NoEscape(r'&= ' + f'{T_dn:.2f}' + r' \text{ kN}\\')) + #rup_req.append(NoEscape(r'&=' + str(Tdn_kn) + r' \text{ kN}')) + rup_req.append(NoEscape(r'&= ' + f'{T_dn/1000:.2f}' + r' \text{ kN}\\')) rup_req.append(NoEscape(r'&[\text{Ref. Cl. 6.3}]')) rup_req.append(NoEscape(r'\end{aligned}')) self.report_check.append(["Net Section Rupture", "", rup_req, ""]) diff --git a/src/osdag_core/design_type/connection/lap_joint_welded.py b/src/osdag_core/design_type/connection/lap_joint_welded.py index b14b6d6c6..ed0e88e4d 100644 --- a/src/osdag_core/design_type/connection/lap_joint_welded.py +++ b/src/osdag_core/design_type/connection/lap_joint_welded.py @@ -552,7 +552,7 @@ def calculate_weld_length(self): self.l_eff = self.leff_min self.logger.warning(f": Required length is less than minimum, using l_eff = {self.l_eff} mm [Cl.10.5.4.1]") elif self.weld_length_required > self.leff_max: - self.logger.error(": Required weld length exceeds maximum allowed. Increase weld size. [Cl.10.5.4.1]") + self.logger.error(f": Required weld length ({self.weld_length_required:.2f} mm) exceeds the maximum allowable effective length ({self.leff_max:.2f} mm) for weld size {self.weld_size} mm. Increase the weld size. [Cl.10.5.4.1]") self.design_status = False return False # Design fails - let GUI show error via logs else: @@ -578,7 +578,7 @@ def check_long_joint(self): self.logger.warning(f": Modified required weld length {l_req_modified:.2f} mm is less than minimum effective length {self.leff_min} mm [Cl.10.5.4.1]") self.l_eff = self.leff_min elif l_req_modified > self.leff_max: - self.logger.error(": Modified required weld length exceeds maximum allowed. Increase weld size. [Cl.10.5.4.1]") + self.logger.error(f": Modified required weld length ({l_req_modified:.2f} mm) exceeds the maximum allowable effective length ({self.leff_max:.2f} mm) for weld size {self.weld_size} mm. Increase the weld size. [Cl.10.5.4.1]") self.design_status = False return False # Design fails - let GUI show error via logs else: diff --git a/src/osdag_core/design_type/flexural_member/flexure.py b/src/osdag_core/design_type/flexural_member/flexure.py index cf7f16bb7..f4aa1a1eb 100644 --- a/src/osdag_core/design_type/flexural_member/flexure.py +++ b/src/osdag_core/design_type/flexural_member/flexure.py @@ -2672,7 +2672,7 @@ def save_design(self, popup_summary): t1 = ('SubSection', 'Moment Strength Results', '|p{4cm}|p{1.5cm}|p{9cm}|p{1.5cm}|') self.report_check.append(t1) if self.design_type == KEY_DISP_DESIGN_TYPE_FLEXURE: - if self.result_high_shear: + if self.result_high_shear and self.input_section_classification[self.result_designation][0] != 'Semi-Compact': t1 = (KEY_DISP_Bending_STRENGTH_MOMENT, self.load.moment*10**-6, cl_9_2_2_combine_shear_bending_md_init( self.section_property.elast_sec_mod_z, @@ -2791,7 +2791,7 @@ def save_design(self, popup_summary): # get_pass_fail(self.load.shear_force * 10 ** -3, round(self.result_capacity, 2), relation="leq")) # self.report_check.append(t1) - if self.result_high_shear: + if self.result_high_shear and self.input_section_classification[self.result_designation][0] != 'Semi-Compact': t1 = (KEY_DISP_LTB_Bending_STRENGTH_MOMENT, self.load.moment*10**-6, cl_9_2_2_combine_shear_bending_md_init( self.section_property.elast_sec_mod_z, @@ -2834,6 +2834,12 @@ def save_design(self, popup_summary): get_pass_fail(self.load.moment*10**-6, round(self.result_bending, 2), relation="lesser")) self.report_check.append(t1) + if not self.result_buckling_crippling: + self.logger.warning( + "Web Buckling and Web Bearing checks (Cl. 8.7.1, 8.7.4, IS 800:2007) were " + "skipped because Bearing Length was not provided. Set Bearing Length in " + "Design Preferences > Optimization to include these checks in the report." + ) if self.result_buckling_crippling: t1 = ('SubSection', 'Web Buckling Checks', '|p{4cm}|p{2 cm}|p{7cm}|p{3 cm}|') self.report_check.append(t1) @@ -2884,12 +2890,12 @@ def save_design(self, popup_summary): self.report_check.append(t1) t1 = ('$\phi$', ' ', - cl_8_7_1_5_phi(0.49,self.result_eff_sr, self.result_phi_zz), + cl_8_7_1_5_phi(0.49,self.result_nd_esr, self.result_phi_zz), ' ') self.report_check.append(t1) t1 = ('Buckling stress($N/mm^2$)', ' ', - cl_8_7_1_5_Buckling(self.material_property.fy,self.gamma_m0,self.result_eff_sr,self.result_phi_zz,self.result_fcd_2,self.result_fcd), + cl_8_7_1_5_Buckling(self.material_property.fy,self.gamma_m0,self.result_nd_esr,self.result_phi_zz,self.result_fcd_2,self.result_fcd), ' ') self.report_check.append(t1) diff --git a/src/osdag_core/design_type/flexural_member/flexure_cantilever.py b/src/osdag_core/design_type/flexural_member/flexure_cantilever.py index 985456f8a..d68bd9dbb 100644 --- a/src/osdag_core/design_type/flexural_member/flexure_cantilever.py +++ b/src/osdag_core/design_type/flexural_member/flexure_cantilever.py @@ -2787,12 +2787,12 @@ def save_design(self, popup_summary): self.report_check.append(t1) t1 = ('$\phi$', ' ', - cl_8_7_1_5_phi(0.49,self.result_eff_sr, self.result_phi_zz), + cl_8_7_1_5_phi(0.49,self.result_nd_esr, self.result_phi_zz), ' ') self.report_check.append(t1) t1 = ('Buckling stress($N/mm^2$)', ' ', - cl_8_7_1_5_Buckling(self.material_property.fy,self.gamma_m0,self.result_eff_sr,self.result_phi_zz,self.result_fcd_2,self.result_fcd), + cl_8_7_1_5_Buckling(self.material_property.fy,self.gamma_m0,self.result_nd_esr,self.result_phi_zz,self.result_fcd_2,self.result_fcd), ' ') self.report_check.append(t1) diff --git a/src/osdag_core/design_type/flexural_member/flexure_purlin.py b/src/osdag_core/design_type/flexural_member/flexure_purlin.py index dc884b0e1..42493d8d6 100644 --- a/src/osdag_core/design_type/flexural_member/flexure_purlin.py +++ b/src/osdag_core/design_type/flexural_member/flexure_purlin.py @@ -1702,7 +1702,7 @@ def Channels_Classification(self, depth, thickness_web, f_y): return section_class def design_bending_strength_purlins(self, section_class, Zp, Ze, fy, gamma_mo, high_shear_check, axis): - beta_b = 1.0 if section_class == KEY_Plastic or KEY_Compact else Ze / Zp + beta_b = 1.0 if section_class == KEY_Plastic or section_class == KEY_Compact else Ze / Zp Md = beta_b * Zp * fy / gamma_mo if Md < 1.2 * Ze * fy / gamma_mo: M_d = Md diff --git a/src/osdag_core/design_type/plate_girder/core/plate_girder.py b/src/osdag_core/design_type/plate_girder/core/plate_girder.py index 4e2945591..dac83c189 100644 --- a/src/osdag_core/design_type/plate_girder/core/plate_girder.py +++ b/src/osdag_core/design_type/plate_girder/core/plate_girder.py @@ -264,7 +264,15 @@ def input_dictionary_without_design_pref(self): return design_input def refresh_input_dock(self): + """ + Sync the material selected in the 'Girder Properties' (Additional Inputs) + dialog back to the Material field in the main input dock. + """ add_buttons = [] + + t1 = (KEY_DISP_GIRDERSEC, KEY_MATERIAL, TYPE_COMBOBOX, KEY_SEC_MATERIAL, None, None, "Material") + add_buttons.append(t1) + return add_buttons def get_values_for_design_pref(self, key, design_dictionary): @@ -1241,7 +1249,7 @@ def calculate_stiffener_spacing_IS800(self): def section_classification(self,design_dictionary): self.design_status = False # Check if longitudinal stiffener is provided (affects web slenderness limits per Cl. 8.6.1.2) - has_long_stiff = self.long_Stiffner in ['Yes and 1 stiffener', 'Yes and 2 stiffeners'] + has_long_stiff = self.long_Stiffner == 'Yes' self.section_class, is_valid = classify_section( self.top_flange_width, self.top_flange_thickness, self.bottom_flange_width, self.bottom_flange_thickness, @@ -1269,6 +1277,13 @@ def design_check(self,design_dictionary): self.momentchecks = False self.defl_check = False self.long_check = False + # Default to "Not Required" so Thick Web and "No" selections report + # consistently; overwritten below only when a longitudinal stiffener + # is actually designed (self.long_Stiffner == 'Yes' on a thin web). + self.longstiffener_no = "Not Required" + self.longstiffener_thk = "Not Required" + self.x1 = "Not Required" + self.x2 = "Not Required" self.design_flag = self.section_classification(design_dictionary) print(f"DEBUG: section_classification result: {self.design_flag} (Class: {self.section_class})") if self.design_flag == False: @@ -1457,17 +1472,21 @@ def design_check(self,design_dictionary): else: #thin web condition self.shear_ratio= 0 - if self.long_Stiffner == 'Yes and 1 stiffener': - self.stiffener_type = "transverse_and_one_longitudinal_compression" - elif self.long_Stiffner == 'Yes and 2 stiffeners': - self.stiffener_type = "transverse_and_two_longitudinal_neutral" + if self.long_Stiffner == 'Yes': + num_long_required, _, _, _ = check_longitudinal_stiffener_required( + self.eff_depth, self.web_thickness, self.c, self.epsilon, debug=self.debug + ) + if num_long_required >= 2: + self.stiffener_type = "transverse_and_two_longitudinal_neutral" + else: + self.stiffener_type = "transverse_and_one_longitudinal_compression" else: self.stiffener_type = "transverse_only" if self.stiffener_type != "transverse_only": second_stiffener = False if self.stiffener_type == "transverse_and_two_longitudinal_neutral": second_stiffener = True - + # Longitudinal stiffener design per IS 800:2007 Cl. 8.7.13 # Position: First at 0.2d from compression flange, second at 0.5d (neutral axis) if needed num_long_stiff = 1 @@ -1491,7 +1510,7 @@ def design_check(self,design_dictionary): if num_long_stiff == 2: self.x2 = round(x2, 2) else: - self.x2 = 0 + self.x2 = "Not Required" self.logger.info(f"Longitudinal Stiffener Check passed (t={t_long_sel}mm)") else: self.long_check = False @@ -1912,6 +1931,13 @@ def design_check_optimized_version(self,design_dictionary): self.momentchecks = False self.defl_check = False self.long_check = False + # Default to "Not Required" so Thick Web and "No" selections report + # consistently; overwritten below only when a longitudinal stiffener + # is actually designed (self.long_Stiffner == 'Yes' on a thin web). + self.longstiffener_no = "Not Required" + self.longstiffener_thk = "Not Required" + self.x1 = "Not Required" + self.x2 = "Not Required" self.design_flag = self.section_classification(design_dictionary) if self.design_flag == False: print(f"[DEBUG] Slender Section Detected: D={self.total_depth}, tw={self.web_thickness}") @@ -2044,19 +2070,45 @@ def design_check_optimized_version(self,design_dictionary): else: #thin web condition self.shear_ratio = 0 - if self.long_Stiffner == 'Yes and 1 stiffener': - self.stiffener_type = "transverse_and_one_longitudinal_compression" - elif self.long_Stiffner == 'Yes and 2 stiffeners': - self.stiffener_type = "transverse_and_two_longitudinal_neutral" + if self.long_Stiffner == 'Yes': + num_long_required, _, _, _ = check_longitudinal_stiffener_required( + self.eff_depth, self.web_thickness, self.c, self.epsilon, debug=self.debug + ) + if num_long_required >= 2: + self.stiffener_type = "transverse_and_two_longitudinal_neutral" + else: + self.stiffener_type = "transverse_and_one_longitudinal_compression" else: self.stiffener_type = "transverse_only" if self.stiffener_type != "transverse_only": second_stiffener = False if self.stiffener_type == "transverse_and_two_longitudinal_neutral": second_stiffener = True - # Placeholder for longitudinal stiffener check - pass - + + # Longitudinal stiffener design per IS 800:2007 Cl. 8.7.13 + # Position: First at 0.2d from compression flange, second at 0.5d (neutral axis) if needed + num_long_stiff = 1 + if self.stiffener_type == "transverse_and_two_longitudinal_neutral": + num_long_stiff = 2 + self.longstiffener_no = num_long_stiff + + is_safe_long, t_long_sel, b_long_sel, x1, x2, I_req1, I_prov1, I_req2, I_prov2 = design_longitudinal_stiffener( + self.eff_depth, self.web_thickness, self.c, num_long_stiff, + self.long_thickness_list, self.web_philosophy, self.epsilon, + self.gamma_m0, self.material.fy, debug=self.debug + ) + + if is_safe_long: + self.long_check = True + self.longstiffener_thk = t_long_sel + self.x1 = round(x1, 2) + if num_long_stiff == 2: + self.x2 = round(x2, 2) + else: + self.x2 = "Not Required" + else: + self.long_check = False + if self.c == 'NA': # Calculate c per IS 800:2007 when not provided self.c = self.calculate_stiffener_spacing_IS800() @@ -2513,11 +2565,10 @@ def final_format(self,design_dictionary): # Get user preference user_num = 0 - if self.long_Stiffner == 'Yes and 1 stiffener': - user_num = 1 - elif self.long_Stiffner == 'Yes and 2 stiffeners': - user_num = 2 - + if self.long_Stiffner == 'Yes': + # User opted in; provide the code-required count (minimum 1) + user_num = max(num_long_required, 1) + # Respect user preference, but warn if codal requirements differ if user_num == 0 and num_long_required > 0: self.logger.warning(f"User selected 'No' for longitudinal stiffener, but IS 800:2007 Cl. 8.7.13 requires {num_long_required} stiffener(s) for d/tw = {self.eff_depth/self.web_thickness:.1f}") diff --git a/src/osdag_core/design_type/plate_girder/report/latex_report.py b/src/osdag_core/design_type/plate_girder/report/latex_report.py index c7b0a8949..91a127e8e 100644 --- a/src/osdag_core/design_type/plate_girder/report/latex_report.py +++ b/src/osdag_core/design_type/plate_girder/report/latex_report.py @@ -94,7 +94,7 @@ def prepare_report_input(pg_obj, logger): # Material material = getattr(pg_obj, 'material', None) - report_input['Material Grade'] = getattr(material, 'designation', 'E 250') if material else 'E 250' + report_input['Material Grade'] = getattr(material, 'material', 'E 250') if material else 'E 250' # Structure Type # Try to get from attributes, fallback to reasonable default if missing @@ -118,7 +118,7 @@ def prepare_report_input(pg_obj, logger): # Material Properties if material: - girder_props['Material'] = getattr(material, 'designation', 'E 250') + girder_props['Material'] = getattr(material, 'material', 'E 250') girder_props['Ultimate Strength (MPa)'] = getattr(material, 'fu', 410) girder_props['Yield Strength (MPa)'] = getattr(material, 'fy', 250) E = getattr(material, 'modulus_of_elasticity', 200000) @@ -147,17 +147,17 @@ def prepare_report_input(pg_obj, logger): girder_props['Mass (kg/m)'] = Unsymmetrical_I_Section_Properties.calc_mass(D, bf_top, bf_bot, tw, tf_top, tf_bot) girder_props['Area (cm$^2$)' ] = round(Unsymmetrical_I_Section_Properties.calc_area(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 100, 2) - girder_props['Moment of Area, Iz (cm$^4$)' ] = round(Unsymmetrical_I_Section_Properties.calc_MomentOfAreaZ(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 10000, 2) - girder_props['Moment of Area, Iy (cm$^4$)' ] = round(Unsymmetrical_I_Section_Properties.calc_MomentOfAreaY(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 10000, 2) + girder_props[r'Moment of Area, I_{z} (cm$^4$)' ] = round(Unsymmetrical_I_Section_Properties.calc_MomentOfAreaZ(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 10000, 2) + girder_props[r'Moment of Area, I_{y} (cm$^4$)' ] = round(Unsymmetrical_I_Section_Properties.calc_MomentOfAreaY(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 10000, 2) - girder_props['Radius of Gyration, rz (cm)'] = round(Unsymmetrical_I_Section_Properties.calc_RadiusOfGyrationZ(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 10, 2) - girder_props['Radius of Gyration, ry (cm)'] = round(Unsymmetrical_I_Section_Properties.calc_RadiusOfGyrationY(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 10, 2) + girder_props['Radius of Gyration, r_z (cm)'] = round(Unsymmetrical_I_Section_Properties.calc_RadiusOfGyrationZ(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 10, 2) + girder_props['Radius of Gyration, r_y (cm)'] = round(Unsymmetrical_I_Section_Properties.calc_RadiusOfGyrationY(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 10, 2) - girder_props['Elastic Modulus, Zez (cm$^3$)' ] = round(Unsymmetrical_I_Section_Properties.calc_ElasticModulusZz(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 1000, 2) - girder_props['Elastic Modulus, Zey (cm$^3$)' ] = round(Unsymmetrical_I_Section_Properties.calc_ElasticModulusZy(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 1000, 2) + girder_props[r'Elastic Modulus, Z_{ez} (cm$^3$)' ] = round(Unsymmetrical_I_Section_Properties.calc_ElasticModulusZz(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 1000, 2) + girder_props[r'Elastic Modulus, Z_{ey} (cm$^3$)' ] = round(Unsymmetrical_I_Section_Properties.calc_ElasticModulusZy(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 1000, 2) - girder_props['Plastic Modulus, Zpz (cm$^3$)' ] = round(Unsymmetrical_I_Section_Properties.calc_PlasticModulusZ(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 1000, 2) - girder_props['Plastic Modulus, Zpy (cm$^3$)' ] = round(Unsymmetrical_I_Section_Properties.calc_PlasticModulusY(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 1000, 2) + girder_props[r'Plastic Modulus, Z_{pz} (cm$^3$)' ] = round(Unsymmetrical_I_Section_Properties.calc_PlasticModulusZ(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 1000, 2) + girder_props[r'Plastic Modulus, Z_{py} (cm$^3$)' ] = round(Unsymmetrical_I_Section_Properties.calc_PlasticModulusY(D, bf_top, bf_bot, tw, tf_top, tf_bot) / 1000, 2) report_input['Girder Properties'] = girder_props @@ -188,7 +188,7 @@ def prepare_report_input(pg_obj, logger): report_input['Support Condition Inputs'] = 'TITLE' report_input['Support Condition'] = getattr(pg_obj, 'support_type', 'Major Laterally Supported') - report_input['Bearing length (mm)'] = round(getattr(pg_obj, 'bearing_length', 0), 1) + report_input['Bearing length (mm)'] = round(getattr(pg_obj, 'b1', 0), 1) # ==================== 5. Web Philosophy Inputs ==================== report_input['Web Philosophy Inputs'] = 'TITLE' @@ -197,8 +197,8 @@ def prepare_report_input(pg_obj, logger): # Additional Material Details (Standard) if material: - report_input['Yield Strength, fy (MPa)'] = round(getattr(material, 'fy', 0), 1) - report_input['Ultimate Strength, fu (MPa)'] = round(getattr(material, 'fu', 0), 1) + report_input[r'Yield Strength, f_y (MPa)'] = round(getattr(material, 'fy', 0), 1) + report_input[r'Ultimate Strength, f_u (MPa)'] = round(getattr(material, 'fu', 0), 1) except Exception as e: logger.error(f"Error preparing report input: {str(e)}") @@ -211,7 +211,7 @@ def prepare_design_checks(pg_obj, logger): All equations formatted per lap_joint_bolted.py pattern """ report_check = [] - table_format = '|p{4cm}|p{4.5cm}|p{6cm}|p{1.5cm}|' + table_format = '|p{4cm}|p{5.5cm}|p{5.5cm}|p{1cm}|' try: # ==================== GET VALUES FROM PG_OBJ ==================== @@ -478,7 +478,7 @@ def prepare_design_checks(pg_obj, logger): Vcr_eq.append(NoEscape(r'V_{cr} &= A_{vw} \times \tau_b\\\\')) Vcr_eq.append(NoEscape(rf'&= {Avw:.2f} \times {tau_b:.2f}\\\\')) Vcr_eq.append(NoEscape(rf'&= {V_cr_val:.2f} \text{{ kN}}\\\\')) - Vcr_eq.append(NoEscape(r'&\text{[Ref: IS 800:2007, Cl.8.4.2.1]}\\')) + Vcr_eq.append(NoEscape(r'&\text{[Ref: IS 800:2007, Cl.8.4.2.2]}\\')) Vcr_eq.append(NoEscape(r'\end{aligned}')) report_check.append([ @@ -1232,17 +1232,12 @@ def prepare_design_checks(pg_obj, logger): t_int_stiff = getattr(pg_obj, 'IntStiffThickness', 0) t_end_stiff = getattr(pg_obj, 'endstiffthickness', 0) - # Determine Longitudinal Stiffener values based on requirement - if long_stiff_required: - t_long_stiff = getattr(pg_obj, 'longstiffenerthk', 'NA') - num_long = getattr(pg_obj, 'longstiffenerno', 'Not Required') - stiff_1_pos = getattr(pg_obj, 'x1', 'Not Required') - stiff_2_pos = getattr(pg_obj, 'x2', 'Not Required') - else: - t_long_stiff = 'Not Required' - num_long = 'Not Required' - stiff_1_pos = 'Not Required' - stiff_2_pos = 'Not Required' + # Reflect the actual design outcome, which respects the user's Longitudinal + # Stiffener Yes/No selection (see plate_girder.py design_check) + t_long_stiff = getattr(pg_obj, 'longstiffener_thk', 'Not Required') + num_long = getattr(pg_obj, 'longstiffener_no', 'Not Required') + stiff_1_pos = getattr(pg_obj, 'x1', 'Not Required') + stiff_2_pos = getattr(pg_obj, 'x2', 'Not Required') method_name = getattr(pg_obj, 'x', 'Simple Post Critical') int_spacing = getattr(pg_obj, 'c', 0) diff --git a/src/osdag_core/design_type/tension_member/tension_bolted.py b/src/osdag_core/design_type/tension_member/tension_bolted.py index 8e27b42b8..735a631fc 100644 --- a/src/osdag_core/design_type/tension_member/tension_bolted.py +++ b/src/osdag_core/design_type/tension_member/tension_bolted.py @@ -2452,7 +2452,7 @@ def save_design(self, popup_summary): self.report_check.append(t6) t8 = (KEY_DISP_BOLT_HOLE, " ", display_prov(int(self.bolt.d_0), "d_0"), '') self.report_check.append(t8) - t8 = (KEY_DISP_MIN_BOLT," ", display_prov(int(row), "r_l"), '') + t8 = (KEY_DISP_MIN_BOLT," ", display_prov(int(row), r"$r_l$"), '') self.report_check.append(t8) # t2 = (DISP_MIN_GAUGE, min_pitch(self.bolt_diameter_min),display_prov(min_gauge, "g",row_limit),"") # self.report_check.append(t2) @@ -2473,7 +2473,7 @@ def save_design(self, popup_summary): self.report_check.append(t6) t8 = (KEY_DISP_BOLT_HOLE, " ", display_prov(int(self.d_0_min), "d_0"), '') self.report_check.append(t8) - t8 = (KEY_DISP_MIN_BOLT, " ", display_prov(int(row), "r_l"), '') + t8 = (KEY_DISP_MIN_BOLT, " ", display_prov(int(row), r"$r_l$"), '') self.report_check.append(t8) # t2 = (DISP_MIN_GAUGE, min_pitch(self.bolt_diameter_min),display_prov(min_gauge, "g",row_limit),"") # self.report_check.append(t2) @@ -2633,7 +2633,7 @@ def save_design(self, popup_summary): t5 = (DISP_NUM_OF_BOLTS,get_trial_bolts(self.load.shear_force, round((self.res_force / 1000), 2), bolt_capacity_kn), display_prov(self.plate.bolts_required, "n"), '') self.report_check.append(t5) - t6 = (DISP_NUM_OF_COLUMNS, '', display_prov(self.plate.bolt_line, "n_c"), '') + t6 = (DISP_NUM_OF_COLUMNS, '', display_prov(self.plate.bolt_line, r"$n_c$"), '') self.report_check.append(t6) t7 = (DISP_NUM_OF_ROWS, '', display_prov(self.plate.bolts_one_line, "n_r"), '') self.report_check.append(t7) diff --git a/src/osdag_core/design_type/tension_member/tension_welded.py b/src/osdag_core/design_type/tension_member/tension_welded.py index 059b4d041..1e98a2383 100644 --- a/src/osdag_core/design_type/tension_member/tension_welded.py +++ b/src/osdag_core/design_type/tension_member/tension_welded.py @@ -617,7 +617,7 @@ def output_values(self, flag): f"Weld
" f"Size: {self.weld.size if flag else ''} mm
" f"Strength: {self.weld.strength if flag else ''} N/mm²
" - f"Stress: {self.weld.stress if flag else ''} N/mm
" + f"Stress: {self.weld.stress if flag else ''} N/mm²
" f"Eff. Length: {self.weld.length if flag else ''} mm" ) @@ -1528,15 +1528,15 @@ def get_plate_thickness(self,design_dictionary): self.plate.connect_to_database_to_get_fy_fu(grade=self.plate.material, thickness=self.plate.thickness_provided) if design_dictionary[KEY_SEC_PROFILE] in ["Channels", 'Back to Back Channels']: - self.plate.tension_yielding(length = (self.plate.height - max((4 * self.weld.size),30)), thickness = self.plate.thickness_provided, fy = self.plate.fy) + self.plate.tension_yielding(length = (self.plate.height), thickness = self.plate.thickness_provided, fy = self.plate.fy) self.net_area = (self.plate.height - max((4 * self.weld.size),30)) * self.plate.thickness_provided else: if design_dictionary[KEY_LOCATION] == 'Long Leg': - self.plate.tension_yielding(length = (self.plate.height - max((4 * self.weld.size),30)), thickness = self.plate.thickness_provided, fy = self.plate.fy) + self.plate.tension_yielding(length = (self.plate.height), thickness = self.plate.thickness_provided, fy = self.plate.fy) self.net_area = (self.plate.height - max((4 * self.weld.size),30)) * self.plate.thickness_provided else: - self.plate.tension_yielding(length = (self.plate.height - max((4 * self.weld.size),30)), thickness = self.plate.thickness_provided, fy = self.plate.fy) + self.plate.tension_yielding(length = (self.plate.height), thickness = self.plate.thickness_provided, fy = self.plate.fy) self.net_area = (self.plate.height - max((4 * self.weld.size),30)) * self.plate.thickness_provided self.plate.tension_rupture(A_n = self.net_area, F_u = self.plate.fu) @@ -1798,8 +1798,8 @@ def save_design(self, popup_summary): KEY_REPORT_CY: round(section_size.Cy,2), KEY_REPORT_IZ: round(section_size.mom_inertia_z * 1e-4,2), KEY_REPORT_IY: round(section_size.mom_inertia_y * 1e-4,2), - KEY_REPORT_RZ: round(section_size.rad_of_gy_z * 1e-1,2), - KEY_REPORT_RY: round(section_size.rad_of_gy_y * 1e-1,2), + KEY_REPORT_RZ: round(section_size.rad_of_gy_z * 10,2), + KEY_REPORT_RY: round(section_size.rad_of_gy_y * 10,2), KEY_REPORT_ZEZ: round(section_size.elast_sec_mod_z * 1e-3,2), KEY_REPORT_ZEY: round(section_size.elast_sec_mod_y * 1e-3,2), KEY_REPORT_ZPZ: round(section_size.plast_sec_mod_z * 1e-3,2), @@ -1855,10 +1855,10 @@ def save_design(self, popup_summary): KEY_REPORT_IY: round(section_size.mom_inertia_y * 1e-4,2), KEY_REPORT_IU: round(section_size.mom_inertia_u * 1e-4,2), KEY_REPORT_IV: round(section_size.mom_inertia_v * 1e-4,2), - KEY_REPORT_RZ: round(section_size.rad_of_gy_z * 1e-1,2), - KEY_REPORT_RY: round((section_size.rad_of_gy_y) * 1e-1,2), - KEY_REPORT_RU: round((section_size.rad_of_gy_u) * 1e-1,2), - KEY_REPORT_RV: round((section_size.rad_of_gy_v) * 1e-1,2), + KEY_REPORT_RZ: round(section_size.rad_of_gy_z *10,2), + KEY_REPORT_RY: round((section_size.rad_of_gy_y) * 10,2), + KEY_REPORT_RU: round((section_size.rad_of_gy_u) * 10,2), + KEY_REPORT_RV: round((section_size.rad_of_gy_v) * 10,2), KEY_REPORT_ZEZ: round(section_size.elast_sec_mod_z * 1e-3,2), KEY_REPORT_ZEY: round(section_size.elast_sec_mod_y * 1e-3,2), KEY_REPORT_ZPZ: round(section_size.plast_sec_mod_z * 1e-3,2), @@ -2063,7 +2063,7 @@ def save_design(self, popup_summary): # # self.report_check.append(t7) # # if self.sec_profile in ["Channels", 'Back to Back Channels']: - # t2 = (KEY_DISP_TENSION_YIELDCAPACITY, round(self.res_force/1000,2),tension_yield_prov(l = self.section_size.depth ,t = self.plate.thickness_provided, f_y =self.plate.fy, gamma = gamma_m0, T_dg = plate_yield_kn), get_pass_fail(round((self.res_force/1000),2), plate_yield_kn, relation="lesser")) + # t2 = (KEY_DISP_TENSION_YIELDCAPACITY, round(self.res_force/1000,2),tension_yield_prov(l = self.section_size.depth ,t = self.plate.thickness_provided, f_y =self.plate.fy, gamma = gamma_m0, Fplate_yield_kn), get_pass_fail(round((self.res_force/1000),2), plate_yield_kn, relation="lesser")) # # elif self.sec_profile in ["Angles", 'Back to Back Angles']: # if self.loc == "Long Leg": @@ -2149,27 +2149,27 @@ def save_design(self, popup_summary): if self.sec_profile in ["Channels", 'Back to Back Channels']: t2 = (KEY_DISP_TENSION_YIELDCAPACITY, round(self.res_force / 1000, 2), - cl_6_2_tension_yield_capacity_member(l=self.section_size.depth, t=self.plate.thickness_provided, f_y=self.plate.fy, + cl_6_2_tension_yield_capacity_member(l=self.plate.height, t=self.plate.thickness_provided, f_y=self.plate.fy, gamma=gamma_m0, T_dg=plate_yield_kn), get_pass_fail(round((self.res_force / 1000), 2), plate_yield_kn, relation="lesser")) elif self.sec_profile in ["Angles", 'Back to Back Angles']: if self.loc == "Long Leg": t2 = (KEY_DISP_TENSION_YIELDCAPACITY, round(self.res_force / 1000, 2), - cl_6_2_tension_yield_capacity_member(l=self.section_size.max_leg, t=self.plate.thickness_provided, + cl_6_2_tension_yield_capacity_member(l=self.plate.height, t=self.plate.thickness_provided, f_y=self.plate.fy, gamma=gamma_m0, T_dg=plate_yield_kn), get_pass_fail(round((self.res_force / 1000), 2), plate_yield_kn, relation="lesser")) else: t2 = (KEY_DISP_TENSION_YIELDCAPACITY, round(self.res_force / 1000, 2), - cl_6_2_tension_yield_capacity_member(l=self.section_size.min_leg, t=self.plate.thickness_provided, + cl_6_2_tension_yield_capacity_member(l=self.plate.height, t=self.plate.thickness_provided, f_y=self.plate.fy, gamma=gamma_m0, T_dg=plate_yield_kn), get_pass_fail(round((self.res_force / 1000), 2), plate_yield_kn, relation="lesser")) else: if self.loc == "Long Leg": t2 = (KEY_DISP_TENSION_YIELDCAPACITY, round(self.res_force / 1000, 2), - cl_6_2_tension_yield_capacity_member(l=2 * self.section_size.max_leg, t=self.plate.thickness_provided, + cl_6_2_tension_yield_capacity_member(l=self.plate.height, t=self.plate.thickness_provided, f_y=self.plate.fy, gamma=gamma_m0, T_dg=plate_yield_kn), get_pass_fail(round((self.res_force / 1000), 2), plate_yield_kn, relation="lesser")) @@ -2177,7 +2177,7 @@ def save_design(self, popup_summary): else: t2 = (KEY_DISP_TENSION_YIELDCAPACITY, round(self.res_force / 1000, 2), - cl_6_2_tension_yield_capacity_member(l=2 * self.section_size.min_leg, t=self.plate.thickness_provided, + cl_6_2_tension_yield_capacity_member(l=self.plate.height, t=self.plate.thickness_provided, f_y=self.plate.fy, gamma=gamma_m0, T_dg=plate_yield_kn), get_pass_fail(round((self.res_force / 1000), 2), plate_yield_kn, relation="lesser")) diff --git a/src/osdag_core/utils/common/component.py b/src/osdag_core/utils/common/component.py index ee7b03626..79495e05a 100644 --- a/src/osdag_core/utils/common/component.py +++ b/src/osdag_core/utils/common/component.py @@ -947,6 +947,7 @@ def get_web_plate_details(self, bolt_dia, web_plate_h_min, web_plate_h_max, bolt self.reason = "Bolt line limit is reached. Select higher grade/Diameter or choose different connection" else: self.design_status = True + self.reason = "" self.length = gap + end_dist * 2 + pitch * (bolt_line - 1) self.height = web_plate_h @@ -1742,7 +1743,7 @@ def tension_member_design_due_to_rupture_of_critical_section(self, A_nc, A_go, F self.beta = 1.4 else: self.beta = float( - 1.4 - (0.076 * float(w) / float(t) * float(F_y) / (0.9 * float(F_u)) * float(b_s) / float(L_c))) + 1.4 - (0.076 * float(w) / float(t) * float(F_y) / (float(F_u)) * float(b_s) / float(L_c))) if self.beta <= (F_u * gamma_m0 / F_y * gamma_m1) and self.beta >= 0.7: self.beta = self.beta @@ -2020,7 +2021,7 @@ def tension_member_design_due_to_rupture_of_critical_section(self, A_nc, A_go, F self.beta = 1.4 else: self.beta = float( - 1.4 - (0.076 * float(w) / float(t) * float(F_y) / (0.9 * float(F_u)) * float(b_s) / float(L_c))) + 1.4 - (0.076 * float(w) / float(t) * float(F_y) / (float(F_u)) * float(b_s) / float(L_c))) if self.beta <= (F_u * gamma_m0 / F_y * gamma_m1) and self.beta >= 0.7: self.beta = self.beta diff --git a/src/osdag_gui/ui/windows/template_page.py b/src/osdag_gui/ui/windows/template_page.py index 01e81ae71..6726f7eee 100644 --- a/src/osdag_gui/ui/windows/template_page.py +++ b/src/osdag_gui/ui/windows/template_page.py @@ -1763,9 +1763,20 @@ def _render_3d_result(self, status, main): file_extension = fName.split(".")[-1] - # This Captures all the values from Input Dock and Populate it in + # This Captures all the values from Input Dock and Populate it in # self.input_dock_inputs dict which is passed in Additonal Inputs to update additional Inputs def design_fn(self, op_list, data_list, main): + # Refresh design_pref_inputs from the live Additional Inputs widgets so that + # values changed there are picked up even if the dialog was never explicitly + # "Accepted" (e.g. user edits a field and clicks Design without closing it). + # Without this, design_pref_inputs can hold stale defaults (see capture_design_pref_values, + # which previously only ran on QDialog.Accepted). + # Gated on .flag (same condition used below) so this only reads from widgets that + # have actually been populated at least once; otherwise capturing a not-yet-initialized + # textbox (e.g. Effective Area Parameter) would read '' and clobber its '1.0' default. + if getattr(self, 'designPrefDialog', None) is not None and getattr(self.designPrefDialog, 'flag', False): + self.capture_design_pref_values() + design_dictionary = {} self.input_dock_inputs = {} # print(f"\n op_list {op_list}")