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}")