Waqasuet's picture
Create app.py
6c59865 verified
import gradio as gr
import numpy as np
from math import pi
# Beam Deflection Calculator (Euler-Bernoulli)
def beam_deflection(load, length, elasticity, inertia, support_type):
"""
Calculate deflection for common beam supports.
Units: Load (N), Length (m), Elasticity (Pa), Inertia (m^4)
"""
if support_type == "Simply Supported (Center Load)":
deflection = (load * length**3) / (48 * elasticity * inertia)
elif support_type == "Cantilever (End Load)":
deflection = (load * length**3) / (3 * elasticity * inertia)
elif support_type == "Simply Supported (Uniform Load)":
deflection = (5 * load * length**4) / (384 * elasticity * inertia)
else:
return "Invalid support type"
return f"Max Deflection: {deflection * 1000:.2f} mm"
# Section Properties Calculator
def section_properties(width, height, shape):
"""Calculate area and moment of inertia for rectangular or circular sections."""
if shape == "Rectangle":
area = width * height
inertia = (width * height**3) / 12
elif shape == "Circle":
diameter = width
area = pi * (diameter / 2)**2
inertia = pi * (diameter**4) / 64
else:
return "Invalid shape"
return f"Area: {area:.2f} m² | Moment of Inertia: {inertia:.4f} m⁴"
# Load Capacity Estimator (Simplified)
def load_capacity(material, cross_section_area, safety_factor):
"""Estimate allowable load based on material strength."""
material_strength = {
"Concrete (20MPa)": 20e6,
"Steel (A36)": 250e6,
"Wood (Pine)": 10e6
}
allowable_stress = material_strength[material] / safety_factor
capacity = allowable_stress * cross_section_area
return f"Allowable Load: {capacity / 1000:.2f} kN"
# Gradio UI
with gr.Blocks(title="Structural Engineering Toolkit") as app:
gr.Markdown("# 🏗️ Structural Engineering Toolkit")
with gr.Tab("Beam Deflection"):
gr.Markdown("### Calculate beam deflection under load")
with gr.Row():
load = gr.Number(label="Load (N)")
length = gr.Number(label="Length (m)")
elasticity = gr.Number(label="Elasticity Modulus (Pa)", value=2.1e11) # Steel default
inertia = gr.Number(label="Moment of Inertia (m⁴)", value=1e-6)
support_type = gr.Dropdown(
["Simply Supported (Center Load)", "Cantilever (End Load)", "Simply Supported (Uniform Load)"],
label="Support Type"
)
deflection_output = gr.Textbox(label="Result")
gr.Button("Calculate").click(
beam_deflection,
inputs=[load, length, elasticity, inertia, support_type],
outputs=deflection_output
)
with gr.Tab("Section Properties"):
gr.Markdown("### Calculate geometric properties of sections")
shape = gr.Dropdown(["Rectangle", "Circle"], label="Shape")
width = gr.Number(label="Width/Diameter (m)")
height = gr.Number(label="Height (m)", visible=True)
shape.change(
lambda x: gr.Number(visible=(x == "Rectangle")),
inputs=shape,
outputs=height
)
section_output = gr.Textbox(label="Result")
gr.Button("Calculate").click(
section_properties,
inputs=[width, height, shape],
outputs=section_output
)
with gr.Tab("Load Capacity"):
gr.Markdown("### Estimate allowable load for materials")
material = gr.Dropdown(
["Concrete (20MPa)", "Steel (A36)", "Wood (Pine)"],
label="Material"
)
cross_section_area = gr.Number(label="Cross-Section Area (m²)", value=0.01)
safety_factor = gr.Slider(1.5, 5, value=2.5, label="Safety Factor")
capacity_output = gr.Textbox(label="Result")
gr.Button("Calculate").click(
load_capacity,
inputs=[material, cross_section_area, safety_factor],
outputs=capacity_output
)
gr.Markdown("---\n**Note:** This is a simplified tool for educational purposes.")
app.launch()