File size: 5,432 Bytes
38f21e9 be876fe 38f21e9 473d651 38f21e9 473d651 be876fe 38f21e9 473d651 be876fe 38f21e9 be876fe 473d651 38f21e9 473d651 38f21e9 c97d9a6 38f21e9 473d651 38f21e9 be876fe 38f21e9 473d651 38f21e9 473d651 38f21e9 473d651 38f21e9 473d651 38f21e9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
import cadquery as cq
import numpy as np
import matplotlib.pyplot as plt
import gradio as gr
import os
# Ensure there's a directory for saving files
if not os.path.exists("generated_files"):
os.makedirs("generated_files")
# Function for Progressive Die Design
def generate_die(length, width, thickness):
try:
# Generate the die design
plate = cq.Workplane("XY").box(length, width, thickness)
punch = cq.Workplane("XY").rect(10, 10).extrude(5).translate((length/4, width/4, thickness/2))
die = plate.cut(punch)
# Save the die to a file
filename = "generated_files/progressive_die.step"
cq.exporters.export(die, filename)
# Return success message and file path for download
return f"Progressive die design saved. [Download the file](/{filename})"
except Exception as e:
return f"Error generating die: {str(e)}"
# Function for Stress Analysis
def stress_analysis(force, die_width, die_height, material_strength):
try:
# Validate inputs to avoid invalid calculations
if force <= 0 or die_width <= 0 or die_height <= 0 or material_strength <= 0:
return "All values must be positive."
# Calculate stress and safety factor
stress = force / (die_width * die_height)
safety_factor = material_strength / stress
# Create stress analysis plot
fig, ax = plt.subplots()
ax.bar(["Stress", "Material Strength"], [stress, material_strength])
ax.set_ylabel("Stress (MPa)")
ax.set_title("Stress Analysis")
plt.tight_layout() # Ensure the plot is displayed correctly
plt.close(fig) # Close the plot so it doesn't render twice
# Return the results and plot
return f"Safety Factor: {round(safety_factor, 2)}", fig
except Exception as e:
return f"Error in stress analysis: {str(e)}", None
# Function for Tool Optimization
def optimize_tool(speed, feed_rate, depth_of_cut, material):
try:
# Adjust tool life estimate based on material
material_factor = {"Steel": 1.0, "Aluminum": 0.8, "Titanium": 1.2}
tool_life = 1000 / (speed * feed_rate * depth_of_cut * material_factor.get(material, 1.0))
recommended_speed = 0.8 * speed
recommended_feed_rate = 0.9 * feed_rate
# Return optimization results
return {
"Estimated Tool Life (hrs)": round(tool_life, 2),
"Recommended Speed (m/min)": round(recommended_speed, 2),
"Recommended Feed Rate (mm/rev)": round(recommended_feed_rate, 2)
}
except Exception as e:
return {"Error": str(e)}
# Gradio interface functions
def progressive_die_interface(length, width, thickness):
return generate_die(length, width, thickness)
def stress_analysis_interface(force, width, height, material_strength):
return stress_analysis(force, width, height, material_strength)
def tool_optimization_interface(speed, feed_rate, depth_of_cut, material):
return optimize_tool(speed, feed_rate, depth_of_cut, material)
# Create the Gradio Interface
with gr.Blocks() as app:
gr.Markdown("## Press Tool AI Suite")
gr.Markdown("Select a tool below to get started:")
with gr.Tabs():
# Tab for Progressive Die Design
with gr.Tab("Progressive Die Design"):
gr.Markdown("### Enter Dimensions for Progressive Die")
length = gr.Number(label="Length (mm)", value=100)
width = gr.Number(label="Width (mm)", value=50)
thickness = gr.Number(label="Thickness (mm)", value=10)
die_output = gr.Textbox(label="Output")
die_button = gr.Button("Generate Die")
die_button.click(progressive_die_interface, inputs=[length, width, thickness], outputs=die_output)
# Tab for Stress Analysis
with gr.Tab("Stress Analysis"):
gr.Markdown("### Enter Parameters for Stress Analysis")
force = gr.Number(label="Force (N)", value=10000)
die_width = gr.Number(label="Width (m)", value=0.05)
die_height = gr.Number(label="Height (m)", value=0.01)
material_strength = gr.Number(label="Material Strength (MPa)", value=250)
safety_factor_output = gr.Textbox(label="Safety Factor")
stress_chart = gr.Plot()
stress_button = gr.Button("Analyze Stress")
stress_button.click(stress_analysis_interface, inputs=[force, die_width, die_height, material_strength], outputs=[safety_factor_output, stress_chart])
# Tab for Tool Optimization
with gr.Tab("Tool Optimization"):
gr.Markdown("### Enter Machining Parameters for Tool Optimization")
speed = gr.Number(label="Cutting Speed (m/min)", value=100)
feed_rate = gr.Number(label="Feed Rate (mm/rev)", value=0.2)
depth_of_cut = gr.Number(label="Depth of Cut (mm)", value=1.0)
material = gr.Dropdown(choices=["Steel", "Aluminum", "Titanium"], label="Material", value="Steel")
optimization_results = gr.JSON(label="Optimization Results")
optimize_button = gr.Button("Optimize Tool")
optimize_button.click(tool_optimization_interface, inputs=[speed, feed_rate, depth_of_cut, material], outputs=optimization_results)
# Launch the app
app.launch()
|