import math
import pandas as pd
# --- LOAD SECTION PROPERTIES ---
try:
df = pd.read_excel("Steel [Link]", sheet_name="Base Plate")
[Link] = [Link]()
except Exception as e:
print(f"❌ Error reading Excel file: {e}")
exit()
# --- INPUT SECTION ---
section = input("Enter Section (e.g., ISHB200): ").strip().upper()
bolt_grade = input("Enter Bolt Grade (e.g., 8.8): ").strip()
member_grade = input("Enter Member Grade (e.g., E250):
").strip().upper()
try:
bolt_dia = float(input("Enter Bolt Diameter in mm: "))
Fx = float(input("Enter factored shear force Fx (in kN): "))
Fz = float(input("Enter factored axial force Fz (in kN): "))
Mz = float(input("Enter factored moment Mz (in kNm): "))
My = float(input("Enter factored moment My (in kNm): "))
Mx = float(input("Enter factored moment Mx (in kNm): "))
a = float(input("Enter edge distance 'a' along depth (mm): "))
b = float(input("Enter edge distance 'b' along width (mm): "))
except ValueError:
print("❌ Invalid numeric input. Please enter valid numbers.")
exit()
# --- FETCH SECTION DATA ---
sec_data = df[df['Section'] == section]
if sec_data.empty:
print("❌ Section not found in database.")
print("Available sections:", df['Section'].tolist())
exit()
D = float(sec_data['D'].values[0])
Bf = float(sec_data['B'].values[0])
Tf = float(sec_data['Tf'].values[0])
Tw = float(sec_data['Tw'].values[0])
# --- MATERIAL STRENGTHS ---
gamma_m2 = 1.25
fck = 25 # Concrete grade M25
# Bolt grade properties
if bolt_grade == "8.8":
fub = 800
fyb = 640
elif bolt_grade == "10.9":
fub = 1040
fyb = 940
else:
print("❌ Unsupported bolt grade, defaulting to 400/240 MPa.")
fub = 400
fyb = 240
# Member steel grade properties
if member_grade in ["E250", "FE250"]:
fy = 250
fu = 410
elif member_grade in ["E350", "FE350"]:
fy = 350
fu = 490
elif member_grade in ["E450", "FE450"]:
fy = 450
fu = 570
elif member_grade in ["E550", "FE550"]:
fy = 550
fu = 600
else:
print("❌ Unsupported member grade, defaulting to E250 values.")
fy = 250
fu = 410
# --- BASE PLATE GEOMETRY ---
A = D + 2 * a
B = Bf + 2 * b
actual_base_plate_area = A * B
min_base_plate_area = Fx * 1000 / (0.45 * fck) # in mm²
w = Fx * 1000 / actual_base_plate_area # kN to N/mm² (pressure)
# Thickness calculation with safety check
val = (2.5 * w * (a ** 2 - 0.3 * b ** 2) * 1.1) / fy
if val <= 0:
print("❌ Invalid input parameters: negative sqrt argument in
thickness calculation.")
exit()
tmin = [Link](val)
t = max(10, tmin) # Assuming minimum thickness of 10 mm
# --- BOLT CAPACITY CALCULATION ---
bolt_area = [Link] * (bolt_dia ** 2) / 4
bolt_hole_dia = bolt_dia + 2
e1 = a / 2
e2 = b / 2
lever_y = A - 2 * e1
lever_z = B - 2 * e2
# Bolt shear capacity (Vdsb)
bolt_area_net = 0.78 * ([Link]/4 * bolt_dia ** 2 )
Vdsb = (fub / [Link](3)) * bolt_area_net / gamma_m2 / 1000 # kN
# Bolt bearing capacity (Vdpb)
Lvc = e1
kb = min(Lvc * bolt_dia / 3, fub / fu, 1)
Vdpb = 2.5 * kb * bolt_dia * t * fu / (gamma_m2 * 1000) # kN
# Bolt tension capacity (Tdb)
Tdb_nom1 = min (0.9 * fub * 0.78 * ([Link]/4) * bolt_dia ** 2,fyb *
([Link]/4 * bolt_dia ** 2 * 1.25)/1.1)
Tdb = Tdb_nom1 / gamma_m2 / 1000 # kN
# --- BOLT REQUIREMENTS ---
try:
n_bolt_y = [Link]((Fx + (My * 1000 / lever_z)) / min(Tdb, Vdpb)
/ 2) * 2
n_bolt_z = [Link]((Fx + (Mz * 1000 / lever_y)) / min(Tdb, Vdpb)
/ 2) * 2
n_bolt_in_shear = [Link](((Fx + (Mx * 1000 / min(lever_y,
lever_z))) / min(Vdsb, Vdpb)) / 2) * 2
except ZeroDivisionError:
print("❌ Error: Division by zero in bolt count calculations. Check
input values.")
exit()
n_total = max(n_bolt_y, n_bolt_z, n_bolt_in_shear)
# --- FORCES ON BOLTS ---
shear_on_bolt = (Fx + (Mx * 1000 / min(lever_y, lever_z))) / n_total
T_y = (Fx + (My * 1000 / lever_z)) / n_bolt_y if n_bolt_y != 0 else 0
T_z = (Fx + (Mz * 1000 / lever_y)) / n_bolt_z if n_bolt_z != 0 else 0
T_max = max(T_y, T_z)
# --- INTERACTION CHECK ---
interaction = (shear_on_bolt / Vdsb) ** 2 + (T_max / Tdb) ** 2
bolt_check = "PASS" if interaction <= 1.0 else "FAIL"
plate_check = "PASS" if actual_base_plate_area >= min_base_plate_area
else "FAIL"
# --- OUTPUT ---
print("\n--- BASE PLATE BOLT DESIGN RESULTS ---")
print(f"✅ Section Used: {section}")
print(f" Depth (D): {D} mm")
print(f" Flange Width (Bf): {Bf} mm")
print(f" Flange Thickness (Tf): {Tf} mm")
print(f" Web Thickness (Tw): {Tw} mm")
print(f"\nBase Plate Size A x B = {A:.1f} mm x {B:.1f} mm")
print(f"Required Base Plate Area ≥ {min_base_plate_area:.0f} mm² →
{plate_check}")
print(f"Thickness Required (tmin) = {tmin:.2f} mm, Assumed Thickness t
= {t:.2f} mm")
print(f"Bolt Dia = {bolt_dia} mm, Bolt Area = {bolt_area:.1f} mm²")
print("\n=== BOLT DESIGN STRENGTHS ===")
print(f"Shear Capacity Vdsb: {Vdsb:.2f} kN")
print(f"Bearing Capacity Vdpb: {Vdpb:.2f} kN")
print(f"Tensile Capacity Tdb: {Tdb:.2f} kN")
print("\n=== BOLT REQUIREMENTS ===")
print(f"Bolts Required in Y-Moment (n_bolt_y): {n_bolt_y}")
print(f"Bolts Required in Z-Moment (n_bolt_z): {n_bolt_z}")
print(f"Bolts Required in Shear: {n_bolt_in_shear}")
print(f"Final Number of Bolts (max of above): {n_total}")
print("\n=== FORCES ON BOLTS ===")
print(f"Shear Force on Each Bolt: {shear_on_bolt:.2f} kN")
print(f"Tensile Force on Each Bolt (Y): {T_y:.2f} kN")
print(f"Tensile Force on Each Bolt (Z): {T_z:.2f} kN")
print(f"Maximum Tensile Force on Bolt: {T_max:.2f} kN")
print("\n=== INTERACTION CHECK ===")
print(f"Interaction Value: {interaction:.2f}")
if bolt_check == "PASS":
print("✅ Bolt design is SAFE.")
else:
print("❌ Bolt design is NOT SAFE. Increase bolt size or number of
bolts.")
Enter Section (e.g., ISHB200): ismb400
Enter Bolt Grade (e.g., 8.8): 8.8
Enter Member Grade (e.g., E250): E350
Enter Bolt Diameter in mm: 16
Enter factored shear force Fx (in kN): 21.408
Enter factored axial force Fz (in kN): 9.366
Enter factored moment Mz (in kNm): 22.918
Enter factored moment My (in kNm): 13.984
Enter factored moment Mx (in kNm): 0
Enter edge distance 'a' along depth (mm): 62.5
Enter edge distance 'b' along width (mm): 57.5
--- BASE PLATE BOLT DESIGN RESULTS ---
✅ Section Used: ISMB400
Depth (D): 400.0 mm
Flange Width (Bf): 140.0 mm
Flange Thickness (Tf): 16.0 mm
Web Thickness (Tw): 8.9 mm
Base Plate Size A x B = 525.0 mm x 255.0 mm
Required Base Plate Area ≥ 1903 mm² → PASS
Thickness Required (tmin) = 1.91 mm, Assumed Thickness t = 10.00 mm
Bolt Dia = 16.0 mm, Bolt Area = 201.1 mm²
=== BOLT DESIGN STRENGTHS ===
Shear Capacity Vdsb: 57.95 kN
Bearing Capacity Vdpb: 156.80 kN
Tensile Capacity Tdb: 90.33 kN
=== BOLT REQUIREMENTS ===
Bolts Required in Y-Moment (n_bolt_y): 2
Bolts Required in Z-Moment (n_bolt_z): 2
Bolts Required in Shear: 2
Final Number of Bolts (max of above): 2
=== FORCES ON BOLTS ===
Shear Force on Each Bolt: 10.70 kN
Tensile Force on Each Bolt (Y): 46.11 kN
Tensile Force on Each Bolt (Z): 35.48 kN
Maximum Tensile Force on Bolt: 46.11 kN
=== INTERACTION CHECK ===
Interaction Value: 0.29
✅ Bolt design is SAFE.