From dd3a382feaa809a67e834dec166e0e98353f984f Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Fri, 29 May 2026 21:17:13 +0530 Subject: [PATCH 01/82] =?UTF-8?q?Fix:=20corrected=20stress=20unit=20to=20N?= =?UTF-8?q?/mm=C2=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/osdag_core/design_type/tension_member/tension_welded.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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..02ea24fb4 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" ) From 98e788065ff322027386abd90fdc276167580a00 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Mon, 1 Jun 2026 15:44:30 +0530 Subject: [PATCH 02/82] Fix: weld stress unit corrected to N/mm2 in tension member welded output dock --- src/osdag_core/Common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index 32b277ca6..8457aea08 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -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/mm²)' 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' From 6a8e19cf8ec2eaacdb91cad1ada77c1777073181 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 2 Jun 2026 13:01:37 +0530 Subject: [PATCH 03/82] Fix: radius of gyration unit changed from cm to mm with correct multiplier --- src/osdag_core/Common.py | 8 ++++---- .../design_type/tension_member/tension_welded.py | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index 8457aea08..9cbe2f36b 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -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$)' 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 02ea24fb4..f1cbdac45 100644 --- a/src/osdag_core/design_type/tension_member/tension_welded.py +++ b/src/osdag_core/design_type/tension_member/tension_welded.py @@ -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), From e2c9a2d271a9e07aba83c1e37061a980bda7ae27 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 3 Jun 2026 18:23:08 +0530 Subject: [PATCH 04/82] =?UTF-8?q?Fix:=20corrected=20effective=20length=20f?= =?UTF-8?q?ormula=20in=20Butt=20Joint=20(Leff=20=3D=20Lprovided=5Fline=20?= =?UTF-8?q?=E2=80=93=202s)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/osdag_core/design_type/connection/butt_joint_welded.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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}')) From 0f93c201b412b3fe4871589af364ef96801090f2 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 3 Jun 2026 19:00:10 +0530 Subject: [PATCH 05/82] =?UTF-8?q?Fix:=20corrected=20=CE=B2=20formula=20in?= =?UTF-8?q?=20component.py=20(removed=20extra=200.9=20factor)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/osdag_core/utils/common/component.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/osdag_core/utils/common/component.py b/src/osdag_core/utils/common/component.py index ee7b03626..288d9c73e 100644 --- a/src/osdag_core/utils/common/component.py +++ b/src/osdag_core/utils/common/component.py @@ -1742,7 +1742,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 +2020,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 From 0c3308a2bccdfc38a10f9d415e0ad3c475681321 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 4 Jun 2026 15:05:47 +0530 Subject: [PATCH 06/82] Fix: Bug 1 Lap Joint weld length validation (added min/max length check before report output) --- src/osdag_core/design_type/connection/lap_joint_welded.py | 4 ++-- src/osdag_core/design_type/tension_member/tension_welded.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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/tension_member/tension_welded.py b/src/osdag_core/design_type/tension_member/tension_welded.py index f1cbdac45..91540dbc0 100644 --- a/src/osdag_core/design_type/tension_member/tension_welded.py +++ b/src/osdag_core/design_type/tension_member/tension_welded.py @@ -1528,7 +1528,7 @@ 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: @@ -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": From 66f6f3eb6599cd7e18791ae7d9188660dac4b5bf Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Fri, 5 Jun 2026 14:15:15 +0530 Subject: [PATCH 07/82] =?UTF-8?q?Fix:=20Bug=202=20corrected=20radius=20of?= =?UTF-8?q?=20gyration=20unit=20(cm=20=E2=86=92=20mm);=20line=201684-1687?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/osdag_core/design_type/tension_member/tension_welded.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 91540dbc0..3b4939802 100644 --- a/src/osdag_core/design_type/tension_member/tension_welded.py +++ b/src/osdag_core/design_type/tension_member/tension_welded.py @@ -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), From 878d0bf54bf50e5aeb0b83721606e60e9b177309 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Fri, 5 Jun 2026 14:37:35 +0530 Subject: [PATCH 08/82] Fix: corrected stress unit N/mm to N/mm2 line 2486 --- src/osdag_core/Common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index 9cbe2f36b..5cf699d20 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -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' From 061788102791f9a502d60e814f4cfb15eb63db3f Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Fri, 5 Jun 2026 17:11:45 +0530 Subject: [PATCH 09/82] =?UTF-8?q?Fix:=20corrected=20gross=20area=20formula?= =?UTF-8?q?=20in=20Tension=20Member=20Welded=20(Ag=20=3D=20t*(a+b=E2=80=93?= =?UTF-8?q?t))?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design_type/tension_member/tension_welded.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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 3b4939802..1e98a2383 100644 --- a/src/osdag_core/design_type/tension_member/tension_welded.py +++ b/src/osdag_core/design_type/tension_member/tension_welded.py @@ -1533,10 +1533,10 @@ def get_plate_thickness(self,design_dictionary): 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) @@ -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")) From a113a7f34fe2efb20bb8e1af1e24dccf0a9e27c9 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Mon, 8 Jun 2026 17:29:52 +0530 Subject: [PATCH 10/82] =?UTF-8?q?Fix:=20corrected=20area=20unit=20mismatch?= =?UTF-8?q?=20in=20Tension=20Member=20=E2=80=93=20Bolted=20to=20End=20Guss?= =?UTF-8?q?et=20(report=20now=20shows=20mm=C2=B2=20consistently)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/osdag_core/Common.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index 5cf699d20..aabf0d58e 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -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)' @@ -1555,8 +1555,8 @@ def is_valid_custom(self): 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" @@ -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)' From 70be4d8fbc968280ce807b579fa137da3f976292 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Mon, 8 Jun 2026 18:36:33 +0530 Subject: [PATCH 11/82] Fix:corrected formatting of r_l in spacing check (proper subscript notation in report output) --- src/osdag_core/design_type/tension_member/tension_bolted.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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..8b1dddebb 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) From 6f31189b3103e34f3f275aae2b5baa8dd1fc4f44 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Mon, 8 Jun 2026 19:32:19 +0530 Subject: [PATCH 12/82] Fix: corrected formatting in intermittent connection output (connection(s) --- src/osdag_core/Common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index aabf0d58e..0c92fd109 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -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)' From cea94d5f167ae7a28c91c0d72356fe9385eccd69 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 9 Jun 2026 01:49:36 +0530 Subject: [PATCH 13/82] Fix: corrected bearing factor formatting (k_b subscript notation) --- src/osdag_core/Common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index 0c92fd109..bcb466efd 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -2118,7 +2118,7 @@ def is_valid_custom(self): KEY_OUT_DISP_BASE_METAL_UTILIZATION = 'Connected Plate Utilization' KEY_DISP_BOLT_AREA = 'Nominal Stress Area (mm2)' -KEY_DISP_KB = 'Kb' +KEY_DISP_KB = r'$k_b$' KEY_OUT_BOLT_IR_DETAILS = 'Bolt.IRDetails' KEY_OUT_BOLT_IR_DETAILS_SPTD = 'Bolt.IRDetails_sptd' From 286e342cb8b72d7f4a365bfef512d953adec1afa Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 9 Jun 2026 02:18:50 +0530 Subject: [PATCH 14/82] Fix: corrected grammar in arrangement output (singular/plural handling for columns) --- src/osdag_core/design_type/connection/butt_joint_bolted.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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..d92633f60 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,14 @@ 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}", "" ]) #================================ From e1e2170a161b5438841aaf873a7f41395afd1137 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 9 Jun 2026 21:47:45 +0530 Subject: [PATCH 15/82] Fix: corrected gusset plate formatting for number of columns (c in subscript) --- src/osdag_core/design_type/tension_member/tension_bolted.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8b1dddebb..735a631fc 100644 --- a/src/osdag_core/design_type/tension_member/tension_bolted.py +++ b/src/osdag_core/design_type/tension_member/tension_bolted.py @@ -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) From 5133bbe540880dd4696b9b5a11a9b72a760cb37a Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 10 Jun 2026 19:24:21 +0530 Subject: [PATCH 16/82] =?UTF-8?q?Fix:=20corrected=20gross=20section=20yiel?= =?UTF-8?q?d=20unit=20conversion=20(N=20=E2=86=92=20kN)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design_type/connection/butt_joint_bolted.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) 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 d92633f60..a44b4da24 100644 --- a/src/osdag_core/design_type/connection/butt_joint_bolted.py +++ b/src/osdag_core/design_type/connection/butt_joint_bolted.py @@ -1763,9 +1763,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.tension_yielding_capacity / 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'&= \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'&=' + 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'&[\text{Ref. Cl. 6.2}]')) yield_req.append(NoEscape(r'\end{aligned}')) self.report_check.append(["Gross Section Yield", "", yield_req, ""]) @@ -1780,9 +1783,11 @@ def as_int(x, default=0): rup_req = Math(inline=True) rup_req.append(NoEscape(r'\begin{aligned}\\')) + Tdn_kn = round(self.plate.tension_rupture_capacity / 1000, 2) rup_req.append(NoEscape(r'T_{dn} &= \frac{0.9 A_n f_u}{\gamma_{m1}}\\')) - 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'&=' + 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'&[\text{Ref. Cl. 6.3}]')) rup_req.append(NoEscape(r'\end{aligned}')) self.report_check.append(["Net Section Rupture", "", rup_req, ""]) From e8ba9b74e97ef8a56236ad39e563a26f22e513c0 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 10 Jun 2026 21:39:42 +0530 Subject: [PATCH 17/82] =?UTF-8?q?Fix:=20corrected=20unit=20conversion=20fo?= =?UTF-8?q?r=20net=20section=20rupture=20(N=20=E2=86=92=20kN)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design_type/connection/lap_joint_bolted.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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..a0a538981 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.tension_yielding_capacity / 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:.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.tension_rupture_capacity / 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:.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, ""]) From 38137f37d9720f78f2a7ff9d567be0ea03587ce8 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 11 Jun 2026 20:06:50 +0530 Subject: [PATCH 18/82] Fix: removed stray $ symbol in web slenderness ratio calculation --- src/osdag_core/Common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index bcb466efd..dab662304 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -2568,7 +2568,7 @@ def is_valid_custom(self): #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_COLUMNS = r'No. of Bolt Columns ("$n_c$")' DISP_TITLE_COMPMEM='Compression member' KEY_SECTYPE = 'Section Type' KEY_DISP_SECTYPE = 'Section Type*' From 067c022f81054050f114a1102647cb8ecc3fbfdb Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 16 Jun 2026 17:53:27 +0530 Subject: [PATCH 19/82] Fix: Applied multiple GUI report corrections (Issues 8, 11, 4, 12, 18,14) --- src/osdag/Common.py | 6 +++--- src/osdag/design_report/report_generator_base_plate.py | 2 +- .../design_type/flexural_member/flexure_cantilever.py | 2 +- src/osdag/utils/common/component.py | 7 ++++++- .../design_type/compression_member/compression_bolted.py | 4 ++-- src/osdag_core/design_type/connection/butt_joint_bolted.py | 7 +++++-- src/osdag_core/design_type/connection/lap_joint_bolted.py | 4 ++-- 7 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/osdag/Common.py b/src/osdag/Common.py index a3fe8e275..95b4d03ac 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)' @@ -2038,7 +2038,7 @@ def is_valid_custom(self): KEY_DISP_BOLT_AREA = 'Nominal Stress Area (mm2)' -KEY_DISP_KB = 'Kb' +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/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 a44b4da24..67ea71e64 100644 --- a/src/osdag_core/design_type/connection/butt_joint_bolted.py +++ b/src/osdag_core/design_type/connection/butt_joint_bolted.py @@ -1732,6 +1732,9 @@ def as_int(x, default=0): "SubSection", "Bolt Arrangement", "|p{4cm}|p{5cm}|p{5.5cm}|p{1.5cm}|" ]) + int cols + str col_text + if cols == 1: col_text = "column" else: @@ -1764,7 +1767,7 @@ def as_int(x, default=0): yield_req = Math(inline=True) yield_req.append(NoEscape(r'\begin{aligned}\\')) - Tdg_kn = round(self.section.tension_yielding_capacity / 1000, 2) #converting to kn before displaying + 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}\\\\')) @@ -1783,7 +1786,7 @@ def as_int(x, default=0): rup_req = Math(inline=True) rup_req.append(NoEscape(r'\begin{aligned}\\')) - Tdn_kn = round(self.plate.tension_rupture_capacity / 1000, 2) + 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}\\')) 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 a0a538981..454807bbf 100644 --- a/src/osdag_core/design_type/connection/lap_joint_bolted.py +++ b/src/osdag_core/design_type/connection/lap_joint_bolted.py @@ -1522,7 +1522,7 @@ def as_int(x, default=0): yield_req = Math(inline=True) yield_req.append(NoEscape(r'\begin{aligned}\\')) - Tdg_kn = round(self.section.tension_yielding_capacity / 1000, 2) + 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}\\')) @@ -1535,7 +1535,7 @@ def as_int(x, default=0): rup_req = Math(inline=True) rup_req.append(NoEscape(r'\begin{aligned}')) - Tdn_kn = round(self.plate.tension_rupture_capacity / 1000, 2) + 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'&= ' + f'{T_dn:.2f}' + r' \text{ kN}\\')) From c19e5002eefe82b265902b6f0da3acc426043224 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 16 Jun 2026 18:37:35 +0530 Subject: [PATCH 20/82] Fix: Issue 5 improved number of bolts calculation formatting (separated Ru and n_trial equations) --- src/osdag/Report_functions_a.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/osdag/Report_functions_a.py b/src/osdag/Report_functions_a.py index d6483cde2..3852fdc34 100644 --- a/src/osdag/Report_functions_a.py +++ b/src/osdag/Report_functions_a.py @@ -407,9 +407,9 @@ def get_trial_bolts(V_u, A_u,bolt_capacity,multiple=1,conn=None): trial_bolts_eqn.append(NoEscape(r'\begin{aligned}R_{u} &= \sqrt{V_u^2+A_u^2}\\')) trial_bolts_eqn.append(NoEscape(r'n_{trial} &= R_u/ V_{bolt}\\')) if conn == "flange_web": - trial_bolts_eqn.append(NoEscape(r'R_{u} &= \frac{2*\sqrt{' + V_u + r'^2+' + A_u + r'^2}}{' + bolt_capacity + r'}\\')) + trial_bolts_eqn.append(NoEscape(r'n_{trial} &= \frac{2*\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_{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 From 9443315dbab035383d13f1afb18a6a71de51c072 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 16 Jun 2026 18:57:29 +0530 Subject: [PATCH 21/82] Fix: added kN units for Pd in Axially Loaded Column --- src/osdag_core/Report_functions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 449b08a8a..2e9b880a0 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -492,9 +492,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' \\' + r'KN')) else: - slender_eqn.append(NoEscape(r'&= ' + Pd + r'\leq ' + P + r' \\')) + slender_eqn.append(NoEscape(r'&= ' + Pd + r'\leq ' + P + r' \\' + r'KN')) slender_eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.7.1.2}] \end{aligned}')) return slender_eqn From 18822b532e01752037cb84b4f368901cfc12fd3f Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 16 Jun 2026 19:14:26 +0530 Subject: [PATCH 22/82] Fix: Issue 22 standardized plate design formula notation (rr and R1) --- src/osdag_core/Report_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 2e9b880a0..2be94c329 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -5948,7 +5948,7 @@ def min_plate_ht_req(D, r_r, t_f, min_req_width): 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_b - 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')\\')) web_width_min_eqn.append(NoEscape(r'&=' + min_plate_ht + r'\\ \\')) From 52426f0aba81a5951b44233e2d1f2c1871910547 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 16 Jun 2026 19:26:48 +0530 Subject: [PATCH 23/82] Fix: Issue 23 corrected subscript formatting for kb, tmh, abh in Fin Plate Connection --- src/osdag_core/Report_functions.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 2be94c329..e1bf01476 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -4440,35 +4440,35 @@ 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_bv~~ &= V_u / (n_r \times (n_c/2))\\')) 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_bv~~ &= V_u / ((n_r/2) \times n_c)\\')) 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_bv~~ &= V_u / (n_r \times n_c)\\')) 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_mh~ &= \frac{M_d \times y_{\text{max}} }{ \Sigma r_i^2} \\')) 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_mv ~&= \frac{M_d \times x_{\text{max}}}{\Sigma r_i^2}\\')) 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_bh~ & = \frac{A_u }{(n_r \times n_c/2)}\\')) 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_bh~ & = \frac{A_u }{((n_r/2) \times n_c)}\\')) 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_bh~ & = \frac{A_u }{(n_r \times n_c)}\\')) 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_bv +t_mv) ^ 2 + (t_mh+a_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}')) From ac205de53d21fc2f8e3f5f20945547def5669b05 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 17 Jun 2026 16:37:41 +0530 Subject: [PATCH 24/82] Fix: corrected Issue 21 added notation legend for symbols (Vbv, tmv, Twh, abh) --- src/osdag_core/Report_functions.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index e1bf01476..076a68d42 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -4440,31 +4440,31 @@ 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} v_bv~~ &= V_u / (n_r \times (n_c/2))\\')) + Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} v_bv~~ &= V_u / (n_r \times (n_c/2))\\' + r' (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} v_bv~~ &= V_u / ((n_r/2) \times n_c)\\')) + Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} v_bv~~ &= V_u / ((n_r/2) \times n_c)\\' + r' (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} v_bv~~ &= V_u / (n_r \times n_c)\\')) + Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} v_bv~~ &= V_u / (n_r \times n_c)\\' + r' (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't_mh~ &= \frac{M_d \times y_{\text{max}} }{ \Sigma r_i^2} \\')) + Vres_bolts_eqn.append(NoEscape(r't_mh~ &= \frac{M_d \times y_{\text{max}} }{ \Sigma r_i^2} \\' + ' 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' t_mv ~&= \frac{M_d \times x_{\text{max}}}{\Sigma r_i^2}\\')) + Vres_bolts_eqn.append(NoEscape(r' t_mv ~&= \frac{M_d \times x_{\text{max}}}{\Sigma r_i^2}\\' + ' 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' a_bh~ & = \frac{A_u }{(n_r \times n_c/2)}\\')) + Vres_bolts_eqn.append(NoEscape(r' a_bh~ & = \frac{A_u }{(n_r \times n_c/2)}\\' + ' 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' a_bh~ & = \frac{A_u }{((n_r/2) \times n_c)}\\')) + Vres_bolts_eqn.append(NoEscape(r' a_bh~ & = \frac{A_u }{((n_r/2) \times n_c)}\\' + ' 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' a_bh~ & = \frac{A_u }{(n_r \times n_c)}\\')) + Vres_bolts_eqn.append(NoEscape(r' a_bh~ & = \frac{A_u }{(n_r \times n_c)}\\' + ' 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'\\ \\')) From abec2ebbc2fe7705b58214568786c7bc3fd27aae Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 17 Jun 2026 16:52:04 +0530 Subject: [PATCH 25/82] Fix : corrected NominalStress Area superscript mm2 --- src/osdag/Common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdag/Common.py b/src/osdag/Common.py index 95b4d03ac..8b357e47f 100644 --- a/src/osdag/Common.py +++ b/src/osdag/Common.py @@ -2037,7 +2037,7 @@ def is_valid_custom(self): KEY_OUT_DISP_BASE_METAL_UTILIZATION = 'Base Metal Utilization' -KEY_DISP_BOLT_AREA = 'Nominal Stress Area (mm2)' +KEY_DISP_BOLT_AREA = 'Nominal Stress Area (mm\u00b2)' KEY_DISP_KB = 'K\u2082b' KEY_OUT_BOLT_IR_DETAILS = 'Bolt.IRDetails' From 12e724fbabe7ff39083c05b092fc29986a6367d8 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 17 Jun 2026 18:22:54 +0530 Subject: [PATCH 26/82] Fix: corrected Issue 24 Flange block shear capacity now displays both the formula and final value along with the substituted gross and net shear/tension areas --- src/osdag_core/Report_functions.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 076a68d42..4a658651b 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -453,13 +453,21 @@ 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'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}')) From 5a2cf90e3483af4baf64c5a1a1ce139cf22ffeec Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 17 Jun 2026 19:23:24 +0530 Subject: [PATCH 27/82] Fix: correctecd issue 27 section 2.5 plate area check it is written as mm2 with 2 as its power --- src/osdag/Common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdag/Common.py b/src/osdag/Common.py index 8b357e47f..d598e5052 100644 --- a/src/osdag/Common.py +++ b/src/osdag/Common.py @@ -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\u00b2)" KEY_FLANGE_SPACING ="Flange_plate.spacing" From ecf6fcf0b47ff3632d9284c8946e32b58afdf617 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 17 Jun 2026 19:39:00 +0530 Subject: [PATCH 28/82] Fix: correctecd Roundedntermediate calculation values to 2 nmber of decimal places efore displaying them in the report. --- src/osdag_core/Report_functions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 4a658651b..9cf7acc16 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -4030,9 +4030,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(round(y_max, 2)) + y_sqr = str(round(y_sqr, 2)) + T_b = str(round(T_b, 2)) 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( From aec2c4134a06e8ee3649db63ecb590c377126f78 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 18 Jun 2026 08:40:12 +0530 Subject: [PATCH 29/82] Fix: Corrected issue 31 reducing equation font size and text wrapped for better readability --- src/osdag_core/Report_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 9cf7acc16..4b30466e1 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -4762,7 +4762,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_ 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'& \footnotesize \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) \\ \\')) From 472fd34d6e4c0a542c918f3b4b1ed8c8d4829de2 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 18 Jun 2026 08:40:30 +0530 Subject: [PATCH 30/82] Fix: Corrected issue 31 reducing equation font size and text wrapped for better readability --- src/osdag_core/Report_functions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 4b30466e1..e4ed85d8e 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -4852,8 +4852,8 @@ 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'\begin{aligned} M_{ep}&= \text{max (0.5 X Tension in first bolt X end } \\')) + moment_acting_on_end_plate.append(NoEscape(r'& \text{distance,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 \times ' + t_b + r'\times' + e + ',~' + tb_2 + r'\times' + e + r'\\')) From db70543b348db61638616e4ed33c3b337b533bdf Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 18 Jun 2026 22:48:06 +0530 Subject: [PATCH 31/82] Fix: Corrected issues 29 unit conversion from N-mm to kNm in the calculation steps --- src/osdag_core/Report_functions.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index e4ed85d8e..19966436b 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -4752,6 +4752,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')} } \\')) @@ -4759,6 +4760,8 @@ 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')} }, ~ \\')) @@ -4854,9 +4857,11 @@ def moment_acting_on_end_plate_flush(M_ep, t_b, e, tb_2): moment_acting_on_end_plate.append(NoEscape(r'\begin{aligned} M_{ep}&= \text{max (0.5 X Tension in first bolt X end } \\')) moment_acting_on_end_plate.append(NoEscape(r'& \text{distance,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)\\')) + 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 From 0aa6b9848c2c9ac7d8fefec2207e307fd40702be Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Sun, 21 Jun 2026 19:49:58 +0530 Subject: [PATCH 32/82] Fix: Issue 27 plate area check it is written as mm^2 --- src/osdag_core/Common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index dab662304..44f62e4de 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -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" From fe6d206dcd6706caec46ae6a2f5d2631e5decc64 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Sun, 21 Jun 2026 19:55:09 +0530 Subject: [PATCH 33/82] Fix: corrected nominal stress area is now written as mm^2 --- src/osdag_core/Common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index 44f62e4de..b021cb1e5 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -2117,7 +2117,7 @@ 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_BOLT_AREA = 'Nominal Stress Area (mm\u00b2)' KEY_DISP_KB = r'$k_b$' KEY_OUT_BOLT_IR_DETAILS = 'Bolt.IRDetails' From 6f117171fbb0c98c3b600334518878350270d18f Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Mon, 22 Jun 2026 17:42:47 +0530 Subject: [PATCH 34/82] Fix: Issue 15 corrected units of p_d --- src/osdag_core/Report_functions.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 19966436b..6b3a0f0ed 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -397,11 +397,11 @@ 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 + r'}{\times' + 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'\\ \\')) @@ -500,9 +500,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' \\' + r'KN')) + slender_eqn.append(NoEscape(r'&= ' + Pd + r'> ' + P + r'~\text{kN} \\' )) else: - slender_eqn.append(NoEscape(r'&= ' + Pd + r'\leq ' + P + r' \\' + r'KN')) + 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 From 3405a7907846d2cbd6a08e69bce26ba72e6d2e11 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 24 Jun 2026 13:12:17 +0530 Subject: [PATCH 35/82] Fix: issue 24 fixed the call site area values and appearance of 'None' in the intermediate steps --- .../design_type/connection/column_cover_plate.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) 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..b3ad30c24 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,10 @@ 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, @@ -4040,7 +4043,16 @@ def save_design(self, popup_summary): t6 = ( KEY_DISP_BLOCKSHEARCAP_FLANGE, '', - cl_6_4_blockshear_capacity_member(Tdb=round(self.section.block_shear_capacity / 1000, 2)), '') + cl_6_4_blockshear_capacity_member(Tdb=round(self.section.block_shear_capacity / 1000, 2), + A_vg=round(self.Avg, 2), + A_vn=round(self.Avn, 2), + A_tg=round(self.Atg, 2), + A_tn=round(self.Atn, 2), + f_u=self.section.fu, + f_y=self.section.fy, + gamma_m0=gamma_m0, + gamma_m1=gamma_m1, + stress="shear"), '') self.report_check.append(t6) t1 = (KEY_DISP_FLANGE_TEN_CAPACITY, display_prov(round(self.flange_force / 1000, 2), "F_f"), From 32a83ae2e34f90967671474c71daf38a5b80e91d Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 24 Jun 2026 16:14:45 +0530 Subject: [PATCH 36/82] Fix: corrected axially loaded column crash, and added P_d units --- src/osdag_core/Report_functions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 6b3a0f0ed..13b0b8d9e 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -401,7 +401,7 @@ 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_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'}{\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'\\ \\')) @@ -500,9 +500,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'~\text{kN} \\' )) + slender_eqn.append(NoEscape(r'&= ' + Pd + r'> ' + P + r'~\mathrm{kN}' )) else: - slender_eqn.append(NoEscape(r'&= ' + Pd + r'\leq ' + P + r'~\text{kN} \\')) + slender_eqn.append(NoEscape(r'&= ' + Pd + r'\leq ' + P + r'~\mathrm{kN}')) slender_eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.7.1.2}] \end{aligned}')) return slender_eqn From ddc2132e86720c7e7ea90af8b7c7e79abc54bb4d Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 25 Jun 2026 13:31:22 +0530 Subject: [PATCH 37/82] Fix : issue 31 corrected equation formatting by increasing column width, decreasing 4th root font size --- src/osdag_core/Report_functions.py | 25 ++++++++++--------- .../connection/column_end_plate.py | 2 +- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 13b0b8d9e..adffd9eab 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -454,6 +454,7 @@ def cl_6_4_blockshear_capacity_member(Tdb, A_vg=None, A_vn=None, A_tg=None, A_tn 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'}\\ \\')) @@ -4448,31 +4449,31 @@ 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} v_bv~~ &= V_u / (n_r \times (n_c/2))\\' + r' (Applied shear per bolt)')) + Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} v_bv~~ &= V_u / (n_r \times (n_c/2)) \quad \text{(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} v_bv~~ &= V_u / ((n_r/2) \times n_c)\\' + r' (Applied shear per bolt)')) + Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} v_bv~~ &= V_u / ((n_r/2) \times n_c) \quad \text{(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} v_bv~~ &= V_u / (n_r \times n_c)\\' + r' (Applied shear per bolt)')) + Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} v_bv~~ &= V_u / (n_r \times n_c) \quad \text{(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't_mh~ &= \frac{M_d \times y_{\text{max}} }{ \Sigma r_i^2} \\' + ' Moment-induced force along the height (vertical component)')) + Vres_bolts_eqn.append(NoEscape(r't_mh~ &= \frac{M_d \times y_{\text{max}} }{ \Sigma r_i^2} \quad \text{(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' t_mv ~&= \frac{M_d \times x_{\text{max}}}{\Sigma r_i^2}\\' + ' Moment-induced force along the width (horizontal component)')) + Vres_bolts_eqn.append(NoEscape(r' t_mv ~&= \frac{M_d \times x_{\text{max}}}{\Sigma r_i^2} \quad \text{( 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' a_bh~ & = \frac{A_u }{(n_r \times n_c/2)}\\' + ' Additional bolt force from axial load (if applicable)')) + Vres_bolts_eqn.append(NoEscape(r' a_bh~ & = \frac{A_u }{(n_r \times n_c/2)} \quad \text{( 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' a_bh~ & = \frac{A_u }{((n_r/2) \times n_c)}\\' + ' Additional bolt force from axial load (if applicable)')) + Vres_bolts_eqn.append(NoEscape(r' a_bh~ & = \frac{A_u }{((n_r/2) \times n_c)} \quad \text{( 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' a_bh~ & = \frac{A_u }{(n_r \times n_c)}\\' + ' Additional bolt force from axial load (if applicable)')) + Vres_bolts_eqn.append(NoEscape(r' a_bh~ & = \frac{A_u }{(n_r \times n_c)} \quad \text{( 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'\\ \\')) @@ -4765,10 +4766,10 @@ 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' &= 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'& \footnotesize \sqrt[4]{\Bigg(' + t_b + r' - \frac{2 \times ' + q + r' \times ' + l_e + r'}{' + end_plate_thk_eqn.append(NoEscape(r'& {\small \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}')) @@ -4855,8 +4856,8 @@ 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 } \\')) - moment_acting_on_end_plate.append(NoEscape(r'& \text{distance,Tension in second bolt X end distance)} \\')) + 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]}\\')) 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..8fe46b18f 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{7.5cm}|p{4.0cm}|p{1.5cm}|') self.report_check.append(t1) if self.connection == "Flush End Plate": From 0ab493abc2686c6ddaf90033df2dec138fd2cc15 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Sat, 27 Jun 2026 09:57:17 +0530 Subject: [PATCH 38/82] Fix: corrected issue 5 replaced n_trials with R_u in calculation steps --- src/osdag_core/Report_functions.py | 38 +++++++++++++++--------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index adffd9eab..7ab550b99 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -453,21 +453,21 @@ 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'&= \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'&= \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'&= \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'&= \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}')) @@ -2154,7 +2154,7 @@ def cl_10_3_2_bolt_capacity(bolt_shear_capacity, bolt_bearing_capacity, bolt_cap bolt_bearing_capacity = str(bolt_bearing_capacity) bolt_capacity = str(bolt_capacity) 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}')) @@ -2186,7 +2186,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}')) @@ -4321,9 +4321,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 @@ -4449,35 +4449,35 @@ 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} v_bv~~ &= V_u / (n_r \times (n_c/2)) \quad \text{(Applied shear per bolt)}\\')) + Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} v_{\text{bv}}~~ &= V_u / (n_r \times (n_c/2)) \quad \text{(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} v_bv~~ &= V_u / ((n_r/2) \times n_c) \quad \text{(Applied shear per bolt)}\\')) + Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} v_{\text{bv}}~~ &= V_u / ((n_r/2) \times n_c) \quad \text{(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} v_bv~~ &= V_u / (n_r \times n_c) \quad \text{(Applied shear per bolt)}\\')) + Vres_bolts_eqn.append(NoEscape(r'\begin{aligned} v_{\text{bv}}~~ &= V_u / (n_r \times n_c) \quad \text{(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't_mh~ &= \frac{M_d \times y_{\text{max}} }{ \Sigma r_i^2} \quad \text{(Moment-induced force along the height (vertical component))} \\')) + Vres_bolts_eqn.append(NoEscape(r't_{\text{mh}}~ &= \frac{M_d \times y_{\text{max}} }{ \Sigma r_i^2} \quad \text{(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' t_mv ~&= \frac{M_d \times x_{\text{max}}}{\Sigma r_i^2} \quad \text{( Moment-induced force along the width (horizontal component))}\\')) + Vres_bolts_eqn.append(NoEscape(r' t_{\text{mv}} ~&= \frac{M_d \times x_{\text{max}}}{\Sigma r_i^2} \quad \text{( 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' a_bh~ & = \frac{A_u }{(n_r \times n_c/2)} \quad \text{( Additional bolt force from axial load (if applicable))}\\')) + Vres_bolts_eqn.append(NoEscape(r' a_{\text{bh}}~ & = \frac{A_u }{(n_r \times n_c/2)} \quad \text{( 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' a_bh~ & = \frac{A_u }{((n_r/2) \times n_c)} \quad \text{( Additional bolt force from axial load (if applicable))}\\')) + Vres_bolts_eqn.append(NoEscape(r' a_{\text{bh}}~ & = \frac{A_u }{((n_r/2) \times n_c)} \quad \text{( 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' a_bh~ & = \frac{A_u }{(n_r \times n_c)} \quad \text{( Additional bolt force from axial load (if applicable))}\\')) + Vres_bolts_eqn.append(NoEscape(r' a_{\text{bh}}~ & = \frac{A_u }{(n_r \times n_c)} \quad \text{( 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{(v_bv +t_mv) ^ 2 + (t_mh+a_bh) ^ 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}')) @@ -4661,10 +4661,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_b - 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_b - 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 From 0625b4feca19208d1c020861850d0975bd269842 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Sat, 27 Jun 2026 10:30:05 +0530 Subject: [PATCH 39/82] Fix : corrected issue 9v_dsb to v_bolt --- src/osdag_core/Common.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index b021cb1e5..bebbca5b5 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -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)' @@ -1549,7 +1549,7 @@ 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:' @@ -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' From ad6592c8ae028e48f7248a4aef0b883ff3745310 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Sat, 27 Jun 2026 11:19:29 +0530 Subject: [PATCH 40/82] Fix : issue 19 corrected Fy/Fu consistency --- src/osdag_core/Common.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index bebbca5b5..2cdc4568b 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -1165,8 +1165,8 @@ def is_valid_custom(self): DISP_MIN_PLATE_INNERLENGTH = 'Min. Inner Plate Length (mm)' -KEY_DISP_FU = r'Ultimate Strength, $f_u$ (MPa)' -KEY_DISP_FY = r'Yield Strength, $f_y$ (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)' @@ -1549,7 +1549,7 @@ def is_valid_custom(self): # KEY_PC = 'Bolt.PC' KEY_DISP_PC = 'Property Class *' -KEY_DISP_DP_BOLT_MATERIAL_G_O = r'Material grade overwrite (MPa), $f_u$' +KEY_DISP_DP_BOLT_MATERIAL_G_O = r'Material grade overwrite (MPa), f_u' KEY_DISP_DP_BOLT_DESIGN_PARA = 'HSFG Bolt:' From c4147f89a1d38b8438c61bb7b05221ed05d61375 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Sat, 27 Jun 2026 12:12:45 +0530 Subject: [PATCH 41/82] Fix: issue 15 added r'~\text{kN} \\' --- src/osdag_core/Report_functions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 7ab550b99..4a76c180b 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -501,9 +501,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'~\mathrm{kN}' )) + slender_eqn.append(NoEscape(r'&= ' + Pd + r'> ' + P + r'~\text{kN} \\' )) else: - slender_eqn.append(NoEscape(r'&= ' + Pd + r'\leq ' + P + r'~\mathrm{kN}')) + 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 From 7b0096922fbee9f942734d7c7ef3cabab6aa14c8 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Sat, 27 Jun 2026 20:16:15 +0530 Subject: [PATCH 42/82] Fix : issue 21 added notation legend for symbols Vbv abh tmh tmv --- src/osdag_core/Report_functions.py | 27 ++++++++++--------- .../connection/fin_plate_connection.py | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 4a76c180b..b34e88529 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -501,9 +501,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'~\text{kN} \\' )) + slender_eqn.append(NoEscape(r'&= ' + Pd + r'> ' + P + r'\\' )) else: - slender_eqn.append(NoEscape(r'&= ' + Pd + r'\leq ' + P + r'~\text{kN} \\')) + slender_eqn.append(NoEscape(r'&= ' + Pd + r'\leq ' + P + r'\\')) slender_eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.7.1.2}] \end{aligned}')) return slender_eqn @@ -3078,10 +3078,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'\\ \\')) @@ -4449,31 +4449,34 @@ 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} v_{\text{bv}}~~ &= V_u / (n_r \times (n_c/2)) \quad \text{(Applied shear per bolt)}\\')) + 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} v_{\text{bv}}~~ &= V_u / ((n_r/2) \times n_c) \quad \text{(Applied shear per bolt)}\\')) + 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} v_{\text{bv}}~~ &= V_u / (n_r \times n_c) \quad \text{(Applied shear per bolt)}\\')) + 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't_{\text{mh}}~ &= \frac{M_d \times y_{\text{max}} }{ \Sigma r_i^2} \quad \text{(Moment-induced force along the height (vertical component))} \\')) + 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' t_{\text{mv}} ~&= \frac{M_d \times x_{\text{max}}}{\Sigma r_i^2} \quad \text{( Moment-induced force along the width (horizontal component))}\\')) + 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' a_{\text{bh}}~ & = \frac{A_u }{(n_r \times n_c/2)} \quad \text{( Additional bolt force from axial load (if applicable))}\\')) + 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' a_{\text{bh}}~ & = \frac{A_u }{((n_r/2) \times n_c)} \quad \text{( Additional bolt force from axial load (if applicable))}\\')) + 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' a_{\text{bh}}~ & = \frac{A_u }{(n_r \times n_c)} \quad \text{( Additional bolt force from axial load (if applicable))}\\')) + 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'\\ \\')) 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) From 04cc3b52fca96569f1dcb743341a5f89934168a9 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Sat, 27 Jun 2026 23:25:32 +0530 Subject: [PATCH 43/82] Fix : issue 31 corrected text formatting and decreased font size of 4th root --- src/osdag_core/Report_functions.py | 4 ++-- src/osdag_core/design_type/connection/column_end_plate.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index b34e88529..cf7a344b1 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -4769,10 +4769,10 @@ 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' &= 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'& {\small \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}')) 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 8fe46b18f..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.0cm}|p{7.5cm}|p{4.0cm}|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": From 3d7c1d4e8c8d9f458f878b7abe3ec60cbd2bf922 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Sun, 28 Jun 2026 14:39:00 +0530 Subject: [PATCH 44/82] Fix: issue 26 Displayed all individual thickness values of final grip strength --- src/osdag_core/Report_functions.py | 13 +++++++++++-- .../design_type/connection/column_cover_plate.py | 16 ++++++++++------ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index cf7a344b1..08fe8ef41 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -3125,7 +3125,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 @@ -3159,6 +3159,13 @@ 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) @@ -3166,8 +3173,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: 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 b3ad30c24..c04535431 100644 --- a/src/osdag_core/design_type/connection/column_cover_plate.py +++ b/src/osdag_core/design_type/connection/column_cover_plate.py @@ -1815,10 +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.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, @@ -3499,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", @@ -3653,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, From 2ea9b5dc7d3a0226d05ab031bd5df4d7d65b965d Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Sun, 28 Jun 2026 14:56:26 +0530 Subject: [PATCH 45/82] Fix: issue 7 c and r in subscript of n --- src/osdag_core/Report_functions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 08fe8ef41..04aa57432 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -3017,7 +3017,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 \\ \\')) @@ -5562,7 +5562,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}')) From a527f05078b8bc2b329515ecbba5929e415116a9 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Sun, 28 Jun 2026 15:26:49 +0530 Subject: [PATCH 46/82] Fix : issue 9 corrected beta limiting condition in steps --- src/osdag_core/Report_functions.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 04aa57432..6a4c7aa52 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -397,6 +397,7 @@ 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}}{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 \\ \\')) @@ -404,6 +405,19 @@ def cl_6_3_3_tension_rupture_member(A_nc, A_go, F_u, F_y, L_c, w, b_s, t, gamma_ 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)\\')) From b5ae173bcbeab519a297367e6255230d8c48f6a8 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Sun, 28 Jun 2026 15:31:32 +0530 Subject: [PATCH 47/82] Fix : Corrected issues 16,17,19 --- src/osdag_core/Common.py | 2 +- .../design_type/connection/butt_joint_bolted.py | 16 +++++++--------- .../design_type/connection/lap_joint_bolted.py | 12 ++++++------ 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index 2cdc4568b..bf78a38db 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -2118,7 +2118,7 @@ def is_valid_custom(self): KEY_OUT_DISP_BASE_METAL_UTILIZATION = 'Connected Plate Utilization' KEY_DISP_BOLT_AREA = 'Nominal Stress Area (mm\u00b2)' -KEY_DISP_KB = r'$k_b$' +KEY_DISP_KB = r'K_b' KEY_OUT_BOLT_IR_DETAILS = 'Bolt.IRDetails' KEY_OUT_BOLT_IR_DETAILS_SPTD = 'Bolt.IRDetails_sptd' 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 67ea71e64..144e9f304 100644 --- a/src/osdag_core/design_type/connection/butt_joint_bolted.py +++ b/src/osdag_core/design_type/connection/butt_joint_bolted.py @@ -1732,8 +1732,6 @@ def as_int(x, default=0): "SubSection", "Bolt Arrangement", "|p{4cm}|p{5cm}|p{5.5cm}|p{1.5cm}|" ]) - int cols - str col_text if cols == 1: col_text = "column" @@ -1767,11 +1765,11 @@ def as_int(x, default=0): 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 + #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'&=' + 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/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, ""]) @@ -1786,11 +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) + #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'&= \frac{0.9 \times ' + f'{An_disp:.2f}' + r' \times ' + str(fu) + r'}{1.25}\\')) + 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_bolted.py b/src/osdag_core/design_type/connection/lap_joint_bolted.py index 454807bbf..74c90766b 100644 --- a/src/osdag_core/design_type/connection/lap_joint_bolted.py +++ b/src/osdag_core/design_type/connection/lap_joint_bolted.py @@ -1522,11 +1522,11 @@ def as_int(x, default=0): yield_req = Math(inline=True) yield_req.append(NoEscape(r'\begin{aligned}\\')) - Tdg_kn = round(self.section.yield_req / 1000, 2) + #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'&=' + str(Tdg_kn) + 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, ""]) @@ -1535,10 +1535,10 @@ 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) + #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'&= ' + 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, ""]) From b8d66fbe884b1a4e6c69627c8a87a3853919f80a Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Mon, 29 Jun 2026 08:12:19 +0530 Subject: [PATCH 48/82] Fix: issue 19 corrected --- src/osdag_core/Common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index bf78a38db..8e7bc4f13 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -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' From f1680818590e238bcf16847ad11d6257829c2b0a Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Mon, 29 Jun 2026 08:16:53 +0530 Subject: [PATCH 49/82] undid the changes from osdag files --- src/osdag/Common.py | 4 ++-- src/osdag/Report_functions_a.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/osdag/Common.py b/src/osdag/Common.py index d598e5052..a4428c7af 100644 --- a/src/osdag/Common.py +++ b/src/osdag/Common.py @@ -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 (mm\u00b2)" +KEY_DISP_AREA_CHECK ="Plate Area Check (mm)" KEY_FLANGE_SPACING ="Flange_plate.spacing" diff --git a/src/osdag/Report_functions_a.py b/src/osdag/Report_functions_a.py index 3852fdc34..d6483cde2 100644 --- a/src/osdag/Report_functions_a.py +++ b/src/osdag/Report_functions_a.py @@ -407,9 +407,9 @@ def get_trial_bolts(V_u, A_u,bolt_capacity,multiple=1,conn=None): trial_bolts_eqn.append(NoEscape(r'\begin{aligned}R_{u} &= \sqrt{V_u^2+A_u^2}\\')) trial_bolts_eqn.append(NoEscape(r'n_{trial} &= R_u/ V_{bolt}\\')) if conn == "flange_web": - trial_bolts_eqn.append(NoEscape(r'n_{trial} &= \frac{2*\sqrt{' + V_u + r'^2+' + A_u + r'^2}}{' + bolt_capacity + r'}\\')) + trial_bolts_eqn.append(NoEscape(r'R_{u} &= \frac{2*\sqrt{' + V_u + r'^2+' + A_u + r'^2}}{' + bolt_capacity + r'}\\')) else: - trial_bolts_eqn.append(NoEscape(r'n_{trial} &= \frac{\sqrt{'+V_u+r'^2+'+A_u+r'^2}}{'+bolt_capacity+ r'}\\')) + 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'&='+trial_bolts+ r'\end{aligned}')) return trial_bolts_eqn From 280223bc00daee9870d79808276e10a241cadb03 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Mon, 29 Jun 2026 09:41:02 +0530 Subject: [PATCH 50/82] fix: issue 26 resolved crash --- src/osdag_core/Report_functions.py | 3 ++- .../design_type/connection/column_cover_plate.py | 13 ++----------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 6a4c7aa52..c22dfda80 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -3174,12 +3174,13 @@ def cl_10_3_3_2_large_grip_bolted_prov(t_sum, d, beta_lj=1.0, t_list=None): 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) 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 c04535431..e9ab376d8 100644 --- a/src/osdag_core/design_type/connection/column_cover_plate.py +++ b/src/osdag_core/design_type/connection/column_cover_plate.py @@ -3659,7 +3659,7 @@ def save_design(self, popup_summary): 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, t_list=self.t_list), "") + self.flange_plate.beta_lj, t_list= self.t_list ), "") self.report_check.append(t10) ## # t5 = (KEY_OUT_DISP_BOLT_CAPACITY, bolt_force_kn, @@ -4047,16 +4047,7 @@ def save_design(self, popup_summary): t6 = ( KEY_DISP_BLOCKSHEARCAP_FLANGE, '', - cl_6_4_blockshear_capacity_member(Tdb=round(self.section.block_shear_capacity / 1000, 2), - A_vg=round(self.Avg, 2), - A_vn=round(self.Avn, 2), - A_tg=round(self.Atg, 2), - A_tn=round(self.Atn, 2), - f_u=self.section.fu, - f_y=self.section.fy, - gamma_m0=gamma_m0, - gamma_m1=gamma_m1, - stress="shear"), '') + cl_6_4_blockshear_capacity_member(Tdb=round(self.section.block_shear_capacity / 1000, 2)), '') self.report_check.append(t6) t1 = (KEY_DISP_FLANGE_TEN_CAPACITY, display_prov(round(self.flange_force / 1000, 2), "F_f"), From 3828608a0bfe4135da98718b54328e9d6467d7eb Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Mon, 29 Jun 2026 16:30:52 +0530 Subject: [PATCH 51/82] Fix: resolved issue 15 P_d unit --- src/osdag_core/Report_functions.py | 4 ++-- .../design_type/connection/butt_joint_bolted.py | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index c22dfda80..0e6c787a0 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -515,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 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 144e9f304..01817eb3b 100644 --- a/src/osdag_core/design_type/connection/butt_joint_bolted.py +++ b/src/osdag_core/design_type/connection/butt_joint_bolted.py @@ -1732,14 +1732,14 @@ def as_int(x, default=0): "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} {col_text}", "" + "Bolt Pattern", "2", f"Arrangement: {rows} rows × {cols} columns", "" ]) #================================ @@ -1769,7 +1769,7 @@ def as_int(x, default=0): 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/1000:.2f}' + r' \text{ kN}\\')) + yield_req.append(NoEscape(r'&= ' + f'{T_dg:.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, ""]) @@ -1786,9 +1786,9 @@ def as_int(x, default=0): 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'&=' + 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/1000:.2f}' + r' \text{ kN}\\')) + rup_req.append(NoEscape(r'&= ' + f'{T_dn:.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, ""]) From bd37124c408f2a872c2c5a516b945afd193a55f6 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Mon, 29 Jun 2026 17:49:05 +0530 Subject: [PATCH 52/82] Fix: corrected issue 16,17,18 --- src/osdag_core/Report_functions.py | 6 +++--- .../design_type/connection/butt_joint_bolted.py | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 0e6c787a0..4e836b4ef 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -4055,9 +4055,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(round(y_max, 2)) - y_sqr = str(round(y_sqr, 2)) - T_b = str(round(T_b, 2)) + 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( 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 01817eb3b..be1e18f83 100644 --- a/src/osdag_core/design_type/connection/butt_joint_bolted.py +++ b/src/osdag_core/design_type/connection/butt_joint_bolted.py @@ -1732,14 +1732,14 @@ def as_int(x, default=0): "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}", "" ]) #================================ @@ -1769,7 +1769,7 @@ def as_int(x, default=0): 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, ""]) @@ -1788,7 +1788,7 @@ def as_int(x, default=0): 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, ""]) From afd140efee4dfd66299d3f2931cb8e82b1cef6d0 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 1 Jul 2026 12:54:56 +0530 Subject: [PATCH 53/82] Fix : issue 35 used consistent symbol 't' for tt, tw,tf, Tw,Tf --- src/osdag_core/Report_functions.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 4e836b4ef..09b83cc8d 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -2745,7 +2745,7 @@ def cl_10_5_2_3_min_fillet_weld_size_required(conn_plates_weld, min_weld_size, r weld_min = str(min_weld_size) min_weld_size_eqn = Math(inline=True) - min_weld_size_eqn.append(NoEscape(r'\begin{aligned} & t_{w_{\text{min}}}~ \text{based on thinner part} \\')) + min_weld_size_eqn.append(NoEscape(r'\begin{aligned} & t_{{\text{min}}}~ \text{based on thinner part} \\')) min_weld_size_eqn.append(NoEscape(r'& = \max (' + tmax + ',~ ' + tmin + r') \\ \\')) # min_weld_size_eqn.append(NoEscape(r'& IS800:2007~cl.10.5.2.3~Table 21\\ \\')) @@ -2943,7 +2943,7 @@ def cl_10_5_7_1_1_weld_strength(conn_plates_weld_fu, gamma_mw, t_t, f_w, type=No weld_strength_eqn.append(NoEscape(r'\begin{aligned} f_w &=\frac{f_u}{\sqrt{3} \gamma_{mw}}\\')) weld_strength_eqn.append(NoEscape(r'&=\frac{' + f_u + r'}{\sqrt{3}\times' + gamma_mw + r'}\\')) else: - weld_strength_eqn.append(NoEscape(r'\begin{aligned} f_w &=\frac{t_t f_u}{\sqrt{3} \gamma_{mw}}\\')) + weld_strength_eqn.append(NoEscape(r'\begin{aligned} f_w &=\frac{t f_u}{\sqrt{3} \gamma_{mw}}\\')) weld_strength_eqn.append(NoEscape(r'&=\frac{' + t_t + r'\times' + f_u + r'}{\sqrt{3}\times' + gamma_mw + r'}\\')) weld_strength_eqn.append(NoEscape(r'&=' + f_w + r'\\ \\')) weld_strength_eqn.append(NoEscape(r'& [ \text{Ref. IS 800:2007, Cl.10.5.7.1.1}] \end{aligned}')) @@ -4031,7 +4031,7 @@ def total_bolt_tension_force(T_ba, Q, T_b, bolt_type=''): if bolt_type == "Bearing Bolt": total_tension_in_bolt.append(NoEscape(r'\begin{aligned} T_b &= T_{1} + Q \\')) else: - total_tension_in_bolt.append(NoEscape(r'\begin{aligned} T_f &= T_{1} + Q \\')) + total_tension_in_bolt.append(NoEscape(r'\begin{aligned} t &= T_{1} + Q \\')) total_tension_in_bolt.append(NoEscape(r'&=' + T_ba + '+' + Q + r' \\')) total_tension_in_bolt.append(NoEscape(r'&=' + T_b + r' \end{aligned}')) @@ -4286,16 +4286,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`_{min}+s)+t\\')) 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`_{min}+R_r)+t\\')) 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`_{min}+s)+t\\')) end_plate_gauge.append(NoEscape(r'&= 2(' + e_min + '+' + s + ')+' + t_w + r'\\')) end_plate_gauge.append(NoEscape(r'&=' + g1 + r' \end{aligned}')) @@ -4717,10 +4717,10 @@ def ep_max_plate_width_avail(conn, D, T_w, R_r, T_f, wp_max): wp_max = str(wp_max) ep_max_plate_w_eqn = Math(inline=True) if conn == VALUES_CONN_1[0]: - ep_max_plate_w_eqn.append(NoEscape(r'\begin{aligned} w_{p_{\text{max}}} &= T_f \\')) + ep_max_plate_w_eqn.append(NoEscape(r'\begin{aligned} w_{p_{\text{max}}} &= t \\')) ep_max_plate_w_eqn.append(NoEscape(r'&=' + wp_max + '\end{aligned}')) elif conn == VALUES_CONN_1[1]: - ep_max_plate_w_eqn.append(NoEscape(r'\begin{aligned} w_{p_{\text{max}}} &= D - 2T_f - 2R_r \\')) + ep_max_plate_w_eqn.append(NoEscape(r'\begin{aligned} w_{p_{\text{max}}} &= D - 2t - 2R_r \\')) ep_max_plate_w_eqn.append(NoEscape(r'&=' + D + r'-2\times' + T_f + r'-2\times' + R_r + r'\\')) ep_max_plate_w_eqn.append(NoEscape(r'&=' + wp_max + '\end{aligned}')) else: @@ -5525,8 +5525,8 @@ def end_plate_moment_demand(connectivity, g, T_w, R_r, t_w, s, T_e, M): EP_Mom = Math(inline=True) EP_Mom.append(NoEscape(r'\begin{aligned}M &= T_e \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'\\')) + EP_Mom.append(NoEscape(r'ecc_1 &=\frac{g}{2}-\frac{t}{2}-s &=' + ecc1 + r'\\')) + EP_Mom.append(NoEscape(r'ecc_2 &=\frac{g}{2}-\frac{t}{2}-R_r &=' + ecc2 + r'\\')) EP_Mom.append(NoEscape(r'& \text{max} (ecc_1,~ecc_2) &=' + ecc + r'\\ \\')) else: EP_Mom.append(NoEscape(r'ecc &=\frac{g}{2}-\frac{t_w}{2}-s &=' + ecc1 + r'\\ \\')) @@ -5989,7 +5989,7 @@ def min_plate_ht_req(D, r_r, t_f, min_req_width): 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_1)\\')) + web_width_min_eqn.append(NoEscape(r'\begin{aligned} & 0.6 \times (d_b - 2 \times t - 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')\\')) web_width_min_eqn.append(NoEscape(r'&=' + min_plate_ht + r'\\ \\')) From 82b18a8602fc7fc96cb311b791106c9167e33b7d Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 1 Jul 2026 14:57:37 +0530 Subject: [PATCH 54/82] Fix : issue 37,38 same notation for length as 'D', and T_1 for tension force --- src/osdag_core/Report_functions.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 09b83cc8d..cc0ebedc5 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 + @@ -2662,7 +2662,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 @@ -4013,7 +4013,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}\\')) @@ -4286,16 +4286,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\\')) + end_plate_gauge.append(NoEscape(r'\begin{aligned}g_1 &= 2(e\textquotesingle_{\min}+s)+t\\')) 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\\')) + end_plate_gauge.append(NoEscape(r'g_2 &= 2(e\textquotesingle_{\min}+R_r)+t\\')) 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\\')) + end_plate_gauge.append(NoEscape(r'\begin{aligned}g_{min} &= 2(e\textquotesingle_{\min}+s)+t\\')) end_plate_gauge.append(NoEscape(r'&= 2(' + e_min + '+' + s + ')+' + t_w + r'\\')) end_plate_gauge.append(NoEscape(r'&=' + g1 + r' \end{aligned}')) @@ -5523,7 +5523,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}{2}-s &=' + ecc1 + r'\\')) EP_Mom.append(NoEscape(r'ecc_2 &=\frac{g}{2}-\frac{t}{2}-R_r &=' + ecc2 + r'\\')) From 66365d05696d7ef2071767f50f54872997e18321 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 1 Jul 2026 15:05:04 +0530 Subject: [PATCH 55/82] Fix : issue 39 added multiplication sign --- src/osdag_core/Report_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index cc0ebedc5..c2561dc09 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -4702,7 +4702,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 From 8fc79c0d7951bf0a2066e83725c32f91facaff8a Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 1 Jul 2026 15:55:31 +0530 Subject: [PATCH 56/82] Fix : issue 40,41 ; corrected formatting of K_b, and gamma_m0 --- src/osdag_core/Report_functions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index c2561dc09..7dd0b0a9e 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -2302,7 +2302,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')\\')) @@ -2356,7 +2356,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': @@ -5630,7 +5630,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' \\ \\')) From 01563f3226cb1205f1f71a31f17354554cd56c6d Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 2 Jul 2026 02:20:33 +0530 Subject: [PATCH 57/82] Fix: issue 44, 57 consistent notation of D/db as D and beta_b --- src/osdag_core/Common.py | 2 +- src/osdag_core/Report_functions.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index 8e7bc4f13..2784cfbdf 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)' diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 7dd0b0a9e..39db34ff0 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -4688,10 +4688,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_1 + \text{gap})\\')) + max_plate_ht_eqn.append(NoEscape(r'\begin{aligned} &D - 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_1 - notch_h\\')) + max_plate_ht_eqn.append(NoEscape(r'\begin{aligned} &D - 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 @@ -5989,7 +5989,7 @@ def min_plate_ht_req(D, r_r, t_f, min_req_width): 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 - 2 \times R_1)\\')) + web_width_min_eqn.append(NoEscape(r'\begin{aligned} & 0.6 \times (D - 2 \times t - 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')\\')) web_width_min_eqn.append(NoEscape(r'&=' + min_plate_ht + r'\\ \\')) From 20802c816cfa887dd6597c6c41307baca43fcc94 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 2 Jul 2026 02:36:34 +0530 Subject: [PATCH 58/82] fix : issue 55 grammatical error rows and columns --- src/osdag_core/Common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index 2784cfbdf..4f74a4e3c 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -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 = r'No. of Bolt Columns ("$n_c$")' +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*' From 9c144670491a97195cecc2d73cd8ebe0345c2e27 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 2 Jul 2026 19:33:18 +0530 Subject: [PATCH 59/82] Fix : issue 35 removed changes --- src/osdag_core/Report_functions.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 39db34ff0..592482810 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -2745,7 +2745,7 @@ def cl_10_5_2_3_min_fillet_weld_size_required(conn_plates_weld, min_weld_size, r weld_min = str(min_weld_size) min_weld_size_eqn = Math(inline=True) - min_weld_size_eqn.append(NoEscape(r'\begin{aligned} & t_{{\text{min}}}~ \text{based on thinner part} \\')) + min_weld_size_eqn.append(NoEscape(r'\begin{aligned} & t_{w_{\text{min}}}~ \text{based on thinner part} \\')) min_weld_size_eqn.append(NoEscape(r'& = \max (' + tmax + ',~ ' + tmin + r') \\ \\')) # min_weld_size_eqn.append(NoEscape(r'& IS800:2007~cl.10.5.2.3~Table 21\\ \\')) @@ -2943,7 +2943,7 @@ def cl_10_5_7_1_1_weld_strength(conn_plates_weld_fu, gamma_mw, t_t, f_w, type=No weld_strength_eqn.append(NoEscape(r'\begin{aligned} f_w &=\frac{f_u}{\sqrt{3} \gamma_{mw}}\\')) weld_strength_eqn.append(NoEscape(r'&=\frac{' + f_u + r'}{\sqrt{3}\times' + gamma_mw + r'}\\')) else: - weld_strength_eqn.append(NoEscape(r'\begin{aligned} f_w &=\frac{t f_u}{\sqrt{3} \gamma_{mw}}\\')) + weld_strength_eqn.append(NoEscape(r'\begin{aligned} f_w &=\frac{t_t f_u}{\sqrt{3} \gamma_{mw}}\\')) weld_strength_eqn.append(NoEscape(r'&=\frac{' + t_t + r'\times' + f_u + r'}{\sqrt{3}\times' + gamma_mw + r'}\\')) weld_strength_eqn.append(NoEscape(r'&=' + f_w + r'\\ \\')) weld_strength_eqn.append(NoEscape(r'& [ \text{Ref. IS 800:2007, Cl.10.5.7.1.1}] \end{aligned}')) @@ -4031,7 +4031,7 @@ def total_bolt_tension_force(T_ba, Q, T_b, bolt_type=''): if bolt_type == "Bearing Bolt": total_tension_in_bolt.append(NoEscape(r'\begin{aligned} T_b &= T_{1} + Q \\')) else: - total_tension_in_bolt.append(NoEscape(r'\begin{aligned} t &= T_{1} + Q \\')) + total_tension_in_bolt.append(NoEscape(r'\begin{aligned} T_f &= T_{1} + Q \\')) total_tension_in_bolt.append(NoEscape(r'&=' + T_ba + '+' + Q + r' \\')) total_tension_in_bolt.append(NoEscape(r'&=' + T_b + r' \end{aligned}')) @@ -4286,16 +4286,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\textquotesingle_{\min}+s)+t\\')) + 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\textquotesingle_{\min}+R_r)+t\\')) + 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\textquotesingle_{\min}+s)+t\\')) + 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}')) @@ -4717,10 +4717,10 @@ def ep_max_plate_width_avail(conn, D, T_w, R_r, T_f, wp_max): wp_max = str(wp_max) ep_max_plate_w_eqn = Math(inline=True) if conn == VALUES_CONN_1[0]: - ep_max_plate_w_eqn.append(NoEscape(r'\begin{aligned} w_{p_{\text{max}}} &= t \\')) + ep_max_plate_w_eqn.append(NoEscape(r'\begin{aligned} w_{p_{\text{max}}} &= T_f \\')) ep_max_plate_w_eqn.append(NoEscape(r'&=' + wp_max + '\end{aligned}')) elif conn == VALUES_CONN_1[1]: - ep_max_plate_w_eqn.append(NoEscape(r'\begin{aligned} w_{p_{\text{max}}} &= D - 2t - 2R_r \\')) + ep_max_plate_w_eqn.append(NoEscape(r'\begin{aligned} w_{p_{\text{max}}} &= D - 2T_f - 2R_r \\')) ep_max_plate_w_eqn.append(NoEscape(r'&=' + D + r'-2\times' + T_f + r'-2\times' + R_r + r'\\')) ep_max_plate_w_eqn.append(NoEscape(r'&=' + wp_max + '\end{aligned}')) else: @@ -5525,8 +5525,8 @@ def end_plate_moment_demand(connectivity, g, T_w, R_r, t_w, s, T_e, M): EP_Mom = Math(inline=True) 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}{2}-s &=' + ecc1 + r'\\')) - EP_Mom.append(NoEscape(r'ecc_2 &=\frac{g}{2}-\frac{t}{2}-R_r &=' + ecc2 + r'\\')) + 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'\\')) EP_Mom.append(NoEscape(r'& \text{max} (ecc_1,~ecc_2) &=' + ecc + r'\\ \\')) else: EP_Mom.append(NoEscape(r'ecc &=\frac{g}{2}-\frac{t_w}{2}-s &=' + ecc1 + r'\\ \\')) @@ -5989,7 +5989,7 @@ def min_plate_ht_req(D, r_r, t_f, min_req_width): 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 - 2 \times t - 2 \times R_1)\\')) + web_width_min_eqn.append(NoEscape(r'\begin{aligned} & 0.6 \times (D - 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')\\')) web_width_min_eqn.append(NoEscape(r'&=' + min_plate_ht + r'\\ \\')) From f900b5f4f6758d463bb324d0c19ff08e331a0f31 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 2 Jul 2026 20:33:31 +0530 Subject: [PATCH 60/82] Fix: issue 35 --- src/osdag_core/Report_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 592482810..615a43c88 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -4286,7 +4286,7 @@ 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\textquotesingle_{\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\textquotesingle_{\min}+R_r)+T_w\\')) From f9d254cb5148f51ec4492bd1b04ce71e05d2d7b7 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 2 Jul 2026 20:46:51 +0530 Subject: [PATCH 61/82] Fix : issue 73 drawing image in file --- src/osdag_core/design_report/reportGenerator_latex.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/osdag_core/design_report/reportGenerator_latex.py b/src/osdag_core/design_report/reportGenerator_latex.py index 39ceca7f4..36ddb39f2 100644 --- a/src/osdag_core/design_report/reportGenerator_latex.py +++ b/src/osdag_core/design_report/reportGenerator_latex.py @@ -398,9 +398,9 @@ def save_latex(self, uiObj, Design_Check, reportsummary, filename, rel_path, Dis 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)')): From b4f62a245d4d43aa9eadf250c0a54a89adf50edf Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 2 Jul 2026 21:26:15 +0530 Subject: [PATCH 62/82] Fix : issues 59,60 resolved --- src/osdag_core/Report_functions.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 615a43c88..dfa104720 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -1010,14 +1010,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: @@ -1025,7 +1025,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) @@ -1035,7 +1035,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'\\ \\')) @@ -5800,7 +5800,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}')) From 72aa7d7d6cabd18a76e3f7ee2cbdf9e93788d484 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Sat, 4 Jul 2026 09:35:39 +0530 Subject: [PATCH 63/82] Fix : resolve issues 33,34,43,42,46 --- src/osdag_core/Report_functions.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index dfa104720..bc9fc40da 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -301,7 +301,7 @@ def cl_6_2_tension_yield_capacity_member(l, t, f_y, gamma, T_dg, multiple=None, area = str(area) f_y = str(f_y) gamma = str(gamma) - T_dg = str(T_dg) + T_dg = str(round(T_dg / 1000, 2)) tension_yield_eqn = Math(inline=True) 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: @@ -899,12 +899,25 @@ def cl_8_2_2_slenderness(beta_b,Z_e, Z_p, M_cr, f_y, l,sub = 'length'): f_y = str(f_y) l = str(l) sub = str(sub) + lambda_lt = (beta_b * Z_p * f_y / M_cr) ** 0.5 + lambda_limit = (1.2 * Z_e * f_y / M_cr) ** 0.5 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' &= \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'10^{6}\times'+M_cr+r'}}\\')) eqn.append(NoEscape(r'&= ' + l + r' \\')) eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.8.2.2}] \end{aligned}')) return eqn + ''' + eqn = Math(inline=True) + eqn.append(NoEscape(r'\begin{aligned}')) + eqn.append(NoEscape(r'\lambda_{LT} &= \sqrt{\frac{\beta_b Z_p f_y}{M_{cr}}} \le \sqrt{\frac{1.2 Z_e f_y}{M_{cr}}}\\')) + eqn.append(NoEscape(r'&= \sqrt{\frac{' + str(beta_b) + r' \times ' + str(Z_p) + r' \times ' + str(f_y) + + r'}{'+ r'10^{6}\times'+ str(M_cr) + r'}} \le \sqrt{\frac{1.2 \times ' + str(Z_e) + r' \times ' + str(f_y) + + r'}{'+r'10^{6}\times' + str(M_cr) + r'}}\\')) + eqn.append(NoEscape(r'&= ' + str(round(lambda_lt, 2)) + r' \le ' + str(round(lambda_limit, 2)) + r'\\')) + eqn.append(NoEscape(r'[\text{Ref. IS 800:2007, Cl.8.2.2}] \end{aligned}')) + return eqn def cl_8_2_2_Bending_Compressive(f_y,gamma_,lambd,phi,sub='0.49'): """ @@ -1089,7 +1102,7 @@ def cl_8_4_shear_yielding_capacity_member(h, t, f_y, gamma_m0, V_dg, multiple=1) f_y = str(f_y) gamma_m0 = str(gamma_m0) - V_dg = str(V_dg) + V_dg = str(round(V_dg / 1000, 2)) shear_yield_eqn = Math(inline=True) shear_yield_eqn.append(NoEscape(r'\begin{aligned} V_{d_y} &= \frac{A_vf_y}{\sqrt{3}\gamma_{m0}}\\')) @@ -1099,7 +1112,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 @@ -1639,7 +1652,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'\\')) @@ -2166,7 +2179,7 @@ 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{bolt}},~ V_{\text{dpb}})\\')) bolt_capacity_eqn.append(NoEscape(r'&= \min~ (' + bolt_shear_capacity + ',~' + bolt_bearing_capacity + r')\\')) From e3a0977c19943416b5b51a868410224387c34fd8 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Mon, 6 Jul 2026 16:08:51 +0530 Subject: [PATCH 64/82] fix : resolved issue 73 and 79 --- src/osdag_core/design_report/reportGenerator_latex.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/osdag_core/design_report/reportGenerator_latex.py b/src/osdag_core/design_report/reportGenerator_latex.py index 36ddb39f2..42c1204eb 100644 --- a/src/osdag_core/design_report/reportGenerator_latex.py +++ b/src/osdag_core/design_report/reportGenerator_latex.py @@ -394,8 +394,10 @@ 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 = Disp_2d_image[0] @@ -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': From fa46750786baacc382a4dde84431810fa1326899 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 7 Jul 2026 08:38:09 +0530 Subject: [PATCH 65/82] Fix: issues 46,47,48,49, 51,54,56 --- src/osdag_core/Report_functions.py | 7 ++++--- src/osdag_core/design_type/flexural_member/flexure.py | 7 +++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index bc9fc40da..cbcc87603 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -1461,7 +1461,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(\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}')) @@ -1505,7 +1505,7 @@ 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'\begin{aligned} &= \frac{f_y \gamma_{mo}}{\phi + \sqrt{\phi^2 - \bar\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'&='+ sub + r'\leq ' + sub1 + r'\end{aligned}')) # slender_eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.8.7.1.5}] \end{aligned}')) @@ -4435,6 +4435,7 @@ def moment_demand_req_bolt_force(shear_load, web_moment, moment_demand, ecc): ecc = str(ecc) web_moment = str(web_moment) + moment_demand = round(moment_demand/1000,2) moment_demand = str(moment_demand) shear_load = str(shear_load) loads_req_bolt_force_eqn = Math(inline=True) @@ -4444,7 +4445,7 @@ def moment_demand_req_bolt_force(shear_load, web_moment, moment_demand, ecc): loads_req_bolt_force_eqn.append(NoEscape(r'& M_w = \text{external moment acting on web} \\ \\')) loads_req_bolt_force_eqn.append( NoEscape(r' &= \frac{(' + shear_load + r' \times 10^3 \times' + ecc + ' + ' + web_moment + r'\times10^6)}{10^6}\\')) - loads_req_bolt_force_eqn.append(NoEscape(r' & =' + moment_demand + r'\end{aligned}')) + loads_req_bolt_force_eqn.append(NoEscape(r' & =' + moment_demand + r'~\mathrm{kNm} \end{aligned}')) return loads_req_bolt_force_eqn diff --git a/src/osdag_core/design_type/flexural_member/flexure.py b/src/osdag_core/design_type/flexural_member/flexure.py index cf7f16bb7..bc85731f2 100644 --- a/src/osdag_core/design_type/flexural_member/flexure.py +++ b/src/osdag_core/design_type/flexural_member/flexure.py @@ -2883,13 +2883,16 @@ def save_design(self, popup_summary): ' ') self.report_check.append(t1) + import math + lambda_bar = round(self.result_eff_sr * math.sqrt(self.material_property.fy / (math.pi**2 * self.section_property.modulus_of_elasticity)), 2) + 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,lambda_bar,self.result_eff_sr, 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,lambda_bar,self.result_eff_sr,self.result_phi_zz,self.result_fcd_2,self.result_fcd), ' ') self.report_check.append(t1) From e771e787b83946514a24e2cf20b2ccf720e08439 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 8 Jul 2026 18:31:04 +0530 Subject: [PATCH 66/82] Fix : issue 61 resolved --- src/osdag_core/Report_functions.py | 10 +++++----- .../design_type/connection/cleat_angle_connection.py | 7 ++++++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index cbcc87603..34086a1d2 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -4702,10 +4702,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 - 2 (t_{bf} + R_1 + \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 - t_{bf} + R_1 - 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 @@ -5998,14 +5998,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 - 2 \times t_f - 2 \times R_1)\\')) + 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_type/connection/cleat_angle_connection.py b/src/osdag_core/design_type/connection/cleat_angle_connection.py index 53692db0e..d720100a0 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) @@ -1722,7 +1727,7 @@ 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, bolt_capacity_kn, get_pass_fail(bolt_force_kn, bolt_capacity_kn, relation="lesser"), cl_10_3_2_bolt_capacity(bolt_shear_capacity_kn, bolt_bearing_capacity_kn, bolt_capacity_kn), '') self.report_check.append(t3) From cc41d7e103ee3213f642a1e6a2412a286bad9fd5 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 9 Jul 2026 17:14:30 +0530 Subject: [PATCH 67/82] Fix: issue 42 resolved --- src/osdag_core/Report_functions.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 34086a1d2..914edbf4b 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -892,13 +892,20 @@ 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 + + beta_b = float(beta_b) + Z_p = float(Z_p) + f_y = float(f_y) + M_cr = float(M_cr) + Z_e = float(Z_e) + ''' 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) sub = str(sub) + ''' lambda_lt = (beta_b * Z_p * f_y / M_cr) ** 0.5 lambda_limit = (1.2 * Z_e * f_y / M_cr) ** 0.5 eqn = Math(inline=True) @@ -914,7 +921,7 @@ def cl_8_2_2_slenderness(beta_b,Z_e, Z_p, M_cr, f_y, l,sub = 'length'): eqn.append(NoEscape(r'\lambda_{LT} &= \sqrt{\frac{\beta_b Z_p f_y}{M_{cr}}} \le \sqrt{\frac{1.2 Z_e f_y}{M_{cr}}}\\')) eqn.append(NoEscape(r'&= \sqrt{\frac{' + str(beta_b) + r' \times ' + str(Z_p) + r' \times ' + str(f_y) + r'}{'+ r'10^{6}\times'+ str(M_cr) + r'}} \le \sqrt{\frac{1.2 \times ' + str(Z_e) + r' \times ' + str(f_y) + - r'}{'+r'10^{6}\times' + str(M_cr) + r'}}\\')) + r'}{' + str(M_cr) + r' \times 10^{6}}}\\')) eqn.append(NoEscape(r'&= ' + str(round(lambda_lt, 2)) + r' \le ' + str(round(lambda_limit, 2)) + r'\\')) eqn.append(NoEscape(r'[\text{Ref. IS 800:2007, Cl.8.2.2}] \end{aligned}')) return eqn From 5fa6b4b9d895b6b9f5d0e4af7f28f2584b8cfe79 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Mon, 13 Jul 2026 10:22:45 +0530 Subject: [PATCH 68/82] Fix : resolved subscripts in report --- .../plate_girder/report/latex_report.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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..43d6910bc 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 @@ -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 @@ -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)}") From 564cb8807a25c5824649e542415a508308a2d1e7 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Mon, 13 Jul 2026 11:13:32 +0530 Subject: [PATCH 69/82] Fix : issue 66,67 --- src/osdag_core/design_type/plate_girder/report/latex_report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 43d6910bc..777540b4c 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 @@ -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([ From bc8f6a3a14bc0d7696e65302ca07596acd50c8e5 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 14 Jul 2026 09:27:54 +0530 Subject: [PATCH 70/82] Fix issue 33,34,44 --- src/osdag_core/Report_functions.py | 35 ++++--------------- .../design_type/flexural_member/flexure.py | 7 ++-- 2 files changed, 9 insertions(+), 33 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 914edbf4b..ba8a3ef36 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -301,7 +301,7 @@ def cl_6_2_tension_yield_capacity_member(l, t, f_y, gamma, T_dg, multiple=None, area = str(area) f_y = str(f_y) gamma = str(gamma) - T_dg = str(round(T_dg / 1000, 2)) + T_dg = str(T_dg) tension_yield_eqn = Math(inline=True) 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: @@ -892,39 +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 - - beta_b = float(beta_b) - Z_p = float(Z_p) - f_y = float(f_y) - M_cr = float(M_cr) - Z_e = float(Z_e) - ''' 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) sub = str(sub) - ''' - lambda_lt = (beta_b * Z_p * f_y / M_cr) ** 0.5 - lambda_limit = (1.2 * Z_e * f_y / M_cr) ** 0.5 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'10^{6}\times'+M_cr+r'}}\\')) eqn.append(NoEscape(r'&= ' + l + r' \\')) eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.8.2.2}] \end{aligned}')) return eqn - ''' - eqn = Math(inline=True) - eqn.append(NoEscape(r'\begin{aligned}')) - eqn.append(NoEscape(r'\lambda_{LT} &= \sqrt{\frac{\beta_b Z_p f_y}{M_{cr}}} \le \sqrt{\frac{1.2 Z_e f_y}{M_{cr}}}\\')) - eqn.append(NoEscape(r'&= \sqrt{\frac{' + str(beta_b) + r' \times ' + str(Z_p) + r' \times ' + str(f_y) + - r'}{'+ r'10^{6}\times'+ str(M_cr) + r'}} \le \sqrt{\frac{1.2 \times ' + str(Z_e) + r' \times ' + str(f_y) + - r'}{' + str(M_cr) + r' \times 10^{6}}}\\')) - eqn.append(NoEscape(r'&= ' + str(round(lambda_lt, 2)) + r' \le ' + str(round(lambda_limit, 2)) + r'\\')) - eqn.append(NoEscape(r'[\text{Ref. IS 800:2007, Cl.8.2.2}] \end{aligned}')) - return eqn def cl_8_2_2_Bending_Compressive(f_y,gamma_,lambd,phi,sub='0.49'): """ @@ -1109,7 +1089,7 @@ def cl_8_4_shear_yielding_capacity_member(h, t, f_y, gamma_m0, V_dg, multiple=1) f_y = str(f_y) gamma_m0 = str(gamma_m0) - V_dg = str(round(V_dg / 1000, 2)) + V_dg = str(V_dg) shear_yield_eqn = Math(inline=True) shear_yield_eqn.append(NoEscape(r'\begin{aligned} V_{d_y} &= \frac{A_vf_y}{\sqrt{3}\gamma_{m0}}\\')) @@ -1468,7 +1448,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) + \bar{\lambda}^{2}) \\')) + slender_eqn.append(NoEscape(r'\begin{aligned} &= 0.5(1 + \alpha(\lambda - 0.2) + \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}')) @@ -1512,7 +1492,7 @@ 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 - \bar\lambda^2}} \leq f_y / \gamma_{mo} \\')) + 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'&='+ sub + r'\leq ' + sub1 + r'\end{aligned}')) # slender_eqn.append(NoEscape(r'& [\text{Ref. IS 800:2007, Cl.8.7.1.5}] \end{aligned}')) @@ -2186,7 +2166,7 @@ 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(round(bolt_capacity / 1000, 2)) + bolt_capacity = str(bolt_capacity) bolt_capacity_eqn = Math(inline=True) 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')\\')) @@ -4442,7 +4422,6 @@ def moment_demand_req_bolt_force(shear_load, web_moment, moment_demand, ecc): ecc = str(ecc) web_moment = str(web_moment) - moment_demand = round(moment_demand/1000,2) moment_demand = str(moment_demand) shear_load = str(shear_load) loads_req_bolt_force_eqn = Math(inline=True) @@ -4452,7 +4431,7 @@ def moment_demand_req_bolt_force(shear_load, web_moment, moment_demand, ecc): loads_req_bolt_force_eqn.append(NoEscape(r'& M_w = \text{external moment acting on web} \\ \\')) loads_req_bolt_force_eqn.append( NoEscape(r' &= \frac{(' + shear_load + r' \times 10^3 \times' + ecc + ' + ' + web_moment + r'\times10^6)}{10^6}\\')) - loads_req_bolt_force_eqn.append(NoEscape(r' & =' + moment_demand + r'~\mathrm{kNm} \end{aligned}')) + loads_req_bolt_force_eqn.append(NoEscape(r' & =' + moment_demand + r'\end{aligned}')) return loads_req_bolt_force_eqn diff --git a/src/osdag_core/design_type/flexural_member/flexure.py b/src/osdag_core/design_type/flexural_member/flexure.py index bc85731f2..cf7f16bb7 100644 --- a/src/osdag_core/design_type/flexural_member/flexure.py +++ b/src/osdag_core/design_type/flexural_member/flexure.py @@ -2883,16 +2883,13 @@ def save_design(self, popup_summary): ' ') self.report_check.append(t1) - import math - lambda_bar = round(self.result_eff_sr * math.sqrt(self.material_property.fy / (math.pi**2 * self.section_property.modulus_of_elasticity)), 2) - t1 = ('$\phi$', ' ', - cl_8_7_1_5_phi(0.49,lambda_bar,self.result_eff_sr, self.result_phi_zz), + cl_8_7_1_5_phi(0.49,self.result_eff_sr, 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,lambda_bar,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_eff_sr,self.result_phi_zz,self.result_fcd_2,self.result_fcd), ' ') self.report_check.append(t1) From f0baed5a4b74621513509d81fbe077544dbe9d0e Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 14 Jul 2026 09:40:55 +0530 Subject: [PATCH 71/82] fix : issue 64 corrected material grade value --- .../design_type/plate_girder/report/latex_report.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 777540b4c..f82a0517a 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) From 5a7a6a840eb0a33a1c2297136aeb35f71286476d Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 14 Jul 2026 09:53:44 +0530 Subject: [PATCH 72/82] Fix : issue 65 bearing length value --- src/osdag_core/design_type/plate_girder/report/latex_report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f82a0517a..db0150eda 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 @@ -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' From 13a66ef19f0ee4e17b5fdab6da0196dc784de0ee Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 14 Jul 2026 17:18:55 +0530 Subject: [PATCH 73/82] Fix : issues 69 additional input visible on input dock --- .../plate_girder/core/plate_girder.py | 47 ++++++++++++------- .../plate_girder/report/latex_report.py | 19 +++----- 2 files changed, 38 insertions(+), 28 deletions(-) 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..b36906a2c 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, @@ -1457,17 +1465,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 @@ -2044,10 +2056,14 @@ 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": @@ -2055,7 +2071,7 @@ def design_check_optimized_version(self,design_dictionary): if self.stiffener_type == "transverse_and_two_longitudinal_neutral": second_stiffener = True # Placeholder for longitudinal stiffener check - pass + pass if self.c == 'NA': # Calculate c per IS 800:2007 when not provided @@ -2513,11 +2529,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 db0150eda..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 @@ -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 ==================== @@ -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) From 1d352b535d22f872bdeac8088166e75e3149b056 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 14 Jul 2026 17:30:33 +0530 Subject: [PATCH 74/82] Fix : issue 70 fixed --- .../design_report/reportGenerator_latex.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/osdag_core/design_report/reportGenerator_latex.py b/src/osdag_core/design_report/reportGenerator_latex.py index 42c1204eb..f1630c82c 100644 --- a/src/osdag_core/design_report/reportGenerator_latex.py +++ b/src/osdag_core/design_report/reportGenerator_latex.py @@ -515,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' @@ -524,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: From 1e73a9b9f10c82d1e248d23c595ec7e35d28891c Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Tue, 14 Jul 2026 17:56:23 +0530 Subject: [PATCH 75/82] Fix : issue 68 --- .../design_type/plate_girder/core/plate_girder.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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 b36906a2c..eb3446296 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 @@ -1277,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: @@ -1503,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 From 943a7c5327694f3fe98d96a2e3a09559119100bf Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 15 Jul 2026 14:25:49 +0530 Subject: [PATCH 76/82] Fix --- src/osdag_core/design_type/flexural_member/flexure.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/osdag_core/design_type/flexural_member/flexure.py b/src/osdag_core/design_type/flexural_member/flexure.py index cf7f16bb7..a1951c9de 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) From 69a81e0f6c0dc86271569eb81a492ab4c81c2ca2 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 15 Jul 2026 15:39:06 +0530 Subject: [PATCH 77/82] Fix : issue 35 and 53 resolved unit conversion --- src/osdag_core/Report_functions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index ba8a3ef36..8b9428782 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -2166,7 +2166,7 @@ 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{bolt}},~ V_{\text{dpb}})\\')) bolt_capacity_eqn.append(NoEscape(r'&= \min~ (' + bolt_shear_capacity + ',~' + bolt_bearing_capacity + r')\\')) @@ -4422,7 +4422,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) @@ -4431,7 +4431,7 @@ def moment_demand_req_bolt_force(shear_load, web_moment, moment_demand, ecc): loads_req_bolt_force_eqn.append(NoEscape(r'& M_w = \text{external moment acting on web} \\ \\')) loads_req_bolt_force_eqn.append( NoEscape(r' &= \frac{(' + shear_load + r' \times 10^3 \times' + ecc + ' + ' + web_moment + r'\times10^6)}{10^6}\\')) - loads_req_bolt_force_eqn.append(NoEscape(r' & =' + moment_demand + r'\end{aligned}')) + loads_req_bolt_force_eqn.append(NoEscape(r' & =' + moment_demand + r'\text kNm'+ r'\end{aligned}')) return loads_req_bolt_force_eqn From 89a9f83a9f731d659506f44e1f6c90468081bcc5 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 15 Jul 2026 16:16:25 +0530 Subject: [PATCH 78/82] fix : issue 54 added subsection for bolt shear capacity, bearing capacity, governing bolt value, bolt force calculation --- src/osdag_core/Report_functions.py | 2 +- .../connection/cleat_angle_connection.py | 15 ++++++++++----- src/osdag_core/utils/common/component.py | 1 + 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 8b9428782..9fe41e860 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -4431,7 +4431,7 @@ def moment_demand_req_bolt_force(shear_load, web_moment, moment_demand, ecc): loads_req_bolt_force_eqn.append(NoEscape(r'& M_w = \text{external moment acting on web} \\ \\')) loads_req_bolt_force_eqn.append( NoEscape(r' &= \frac{(' + shear_load + r' \times 10^3 \times' + ecc + ' + ' + web_moment + r'\times10^6)}{10^6}\\')) - loads_req_bolt_force_eqn.append(NoEscape(r' & =' + moment_demand + r'\text kNm'+ r'\end{aligned}')) + loads_req_bolt_force_eqn.append(NoEscape(r' & =' + moment_demand + r'\end{aligned}')) return loads_req_bolt_force_eqn 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 d720100a0..961e6038b 100644 --- a/src/osdag_core/design_type/connection/cleat_angle_connection.py +++ b/src/osdag_core/design_type/connection/cleat_angle_connection.py @@ -1651,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: @@ -1727,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, '', bolt_force_kn, bolt_capacity_kn, get_pass_fail(bolt_force_kn, bolt_capacity_kn, relation="lesser"), + 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, '', @@ -1738,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/utils/common/component.py b/src/osdag_core/utils/common/component.py index 288d9c73e..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 From 9d7c2d4227ca31836c0e9325b93a2303fee508c8 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 22 Jul 2026 06:41:05 +0530 Subject: [PATCH 79/82] Fix: resolved issues in simply support beam --- src/osdag_core/Report_functions.py | 12 +++++++----- .../design_type/connection/column_cover_plate.py | 6 +++++- .../design_type/flexural_member/flexure.py | 4 ++-- .../flexural_member/flexure_cantilever.py | 4 ++-- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 9fe41e860..0af55fce0 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -892,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'10^{6}\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 @@ -1492,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 - \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 @@ -1688,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'\\')) 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 e9ab376d8..315badbab 100644 --- a/src/osdag_core/design_type/connection/column_cover_plate.py +++ b/src/osdag_core/design_type/connection/column_cover_plate.py @@ -3655,7 +3655,7 @@ def save_design(self, popup_summary): 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] + 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, @@ -3844,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/flexural_member/flexure.py b/src/osdag_core/design_type/flexural_member/flexure.py index a1951c9de..f4aa1a1eb 100644 --- a/src/osdag_core/design_type/flexural_member/flexure.py +++ b/src/osdag_core/design_type/flexural_member/flexure.py @@ -2890,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) From cd4ba50b9b34a425a0e45b614cd261b3154f1494 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Wed, 22 Jul 2026 15:25:50 +0530 Subject: [PATCH 80/82] Fix : simply supported beam and plate girder resolved --- src/osdag_core/Report_functions.py | 4 +-- .../plate_girder/core/plate_girder.py | 35 +++++++++++++++++-- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/osdag_core/Report_functions.py b/src/osdag_core/Report_functions.py index 0af55fce0..3da2be92c 100644 --- a/src/osdag_core/Report_functions.py +++ b/src/osdag_core/Report_functions.py @@ -1450,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}')) @@ -1494,7 +1494,7 @@ 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}\left(\phi + \sqrt{\phi^2 - \lambda^2}\right)} \leq f_y / \gamma_{mo} \\')) + 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}')) 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 eb3446296..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 @@ -1931,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}") @@ -2077,9 +2084,31 @@ def design_check_optimized_version(self,design_dictionary): 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() From d09dd9bda2e2a41ab0ccb7eb9c8debb4b2c34469 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 23 Jul 2026 12:17:42 +0530 Subject: [PATCH 81/82] Fix : flexural member calculation --- .../design_type/flexural_member/flexure_purlin.py | 2 +- src/osdag_gui/ui/windows/template_page.py | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) 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_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}") From 1820e8ad0a9f31e358666ac6cbedb587f63f54c0 Mon Sep 17 00:00:00 2001 From: smansipillai90 Date: Thu, 23 Jul 2026 12:31:14 +0530 Subject: [PATCH 82/82] Fix in column cover plate --- src/osdag_core/Common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osdag_core/Common.py b/src/osdag_core/Common.py index 4f74a4e3c..790fe07d2 100644 --- a/src/osdag_core/Common.py +++ b/src/osdag_core/Common.py @@ -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 (mm\u00b2))" +KEY_DISP_AREA_CHECK ="Plate Area Check (mm\u00b2)" KEY_FLANGE_SPACING ="Flange_plate.spacing"