Spaces:
Runtime error
Runtime error
| import cadquery as cq | |
| import numpy as np | |
| import matplotlib.pyplot as plt | |
| import pyvista as pv | |
| from reportlab.lib.pagesizes import letter | |
| from reportlab.pdfgen import canvas | |
| import gradio as gr | |
| import os | |
| from ansys.mapdl.core import launch_mapdl # For ANSYS integration | |
| # Function for Progressive Die Design | |
| def generate_die(length, width, thickness): | |
| try: | |
| 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) | |
| filename = "progressive_die.step" | |
| cq.exporters.export(die, filename) | |
| return filename | |
| except Exception as e: | |
| return f"Error generating die: {str(e)}" | |
| # Function to visualize die in 3D | |
| def visualize_die(length, width, thickness): | |
| try: | |
| 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) | |
| # Export to STL for visualization | |
| cq.exporters.exportShape(die.val(), "STL", "progressive_die.stl") | |
| # Visualize with PyVista | |
| mesh = pv.read("progressive_die.stl") | |
| plotter = pv.Plotter(off_screen=True) | |
| plotter.add_mesh(mesh, color="blue") | |
| screenshot = "progressive_die_visualization.png" | |
| plotter.screenshot(screenshot) | |
| return screenshot | |
| except Exception as e: | |
| return f"Error visualizing die: {str(e)}" | |
| # Function for Python-based Stress Analysis | |
| def stress_analysis(force, die_width, die_height, material_strength): | |
| try: | |
| stress = force / (die_width * die_height) | |
| safety_factor = material_strength / stress | |
| fig, ax = plt.subplots() | |
| ax.bar(["Stress", "Material Strength"], [stress, material_strength]) | |
| ax.set_ylabel("Stress (MPa)") | |
| ax.set_title("Stress Analysis") | |
| plt.close(fig) | |
| return f"Safety Factor: {round(safety_factor, 2)}", fig | |
| except Exception as e: | |
| return f"Error in stress analysis: {str(e)}", None | |
| # ANSYS Integration for Stress Analysis | |
| def run_ansys_simulation(force, die_width, die_height, material_strength): | |
| try: | |
| # Launch ANSYS MAPDL instance | |
| mapdl = launch_mapdl() | |
| mapdl.prep7() # Enter pre-processing module | |
| # Define geometry and material properties | |
| mapdl.rectng(0, die_width, 0, die_height) | |
| mapdl.mp('EX', 1, material_strength) | |
| mapdl.et(1, 'PLANE183') | |
| # Apply loads | |
| mapdl.nsel('S', 'LOC', 'X', 0) | |
| mapdl.d('ALL', 'UX', 0) | |
| mapdl.f('ALL', 'FY', -force) | |
| # Solve | |
| mapdl.run('/SOLU') | |
| mapdl.solve() | |
| mapdl.finish() | |
| # Post-processing | |
| mapdl.post1() | |
| stress = mapdl.get_value('NODE', 1, 'S', 'EQV') # Retrieve max equivalent stress | |
| mapdl.exit() | |
| return f"Max Stress: {stress:.2f} MPa" | |
| except Exception as e: | |
| return f"Error running ANSYS simulation: {str(e)}" | |
| # SolidWorks Placeholder for Stress Analysis | |
| def solidworks_stress_analysis(force, die_width, die_height, material_strength): | |
| # Replace this function with SolidWorks API or external script | |
| try: | |
| output_file = "/path/to/solidworks/output.txt" # Replace with actual path | |
| if os.path.exists(output_file): | |
| with open(output_file, "r") as file: | |
| result = file.read() | |
| return result.strip() | |
| else: | |
| return "SolidWorks simulation output not found." | |
| except Exception as e: | |
| return f"Error running SolidWorks simulation: {str(e)}" | |
| # Function to generate PDF report | |
| def generate_pdf_report(data, filename="report.pdf"): | |
| try: | |
| c = canvas.Canvas(filename, pagesize=letter) | |
| c.drawString(100, 750, "Simulation Report") | |
| c.drawString(100, 730, f"Max Stress: {data.get('stress', 'N/A')} MPa") | |
| c.drawString(100, 710, f"Safety Factor: {data.get('safety_factor', 'N/A')}") | |
| c.save() | |
| return filename | |
| except Exception as e: | |
| return f"Error generating report: {str(e)}" | |
| # Tool Optimization Function | |
| def optimize_tool(speed, feed_rate, depth_of_cut, material): | |
| try: | |
| # Example formula for tool optimization | |
| tool_life = 1000 / (speed * feed_rate * depth_of_cut) | |
| recommended_speed = 0.8 * speed | |
| recommended_feed_rate = 0.9 * feed_rate | |
| # Return optimization results in dictionary | |
| results = { | |
| "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) | |
| } | |
| return results | |
| except Exception as e: | |
| return {"Error": str(e)} | |
| # Gradio interface functions | |
| def stress_analysis_interface(force, die_width, die_height, material_strength, simulation_tool): | |
| if simulation_tool == "Python": | |
| # Python-based stress analysis | |
| safety_factor, fig = stress_analysis(force, die_width, die_height, material_strength) | |
| data = {"stress": force / (die_width * die_height), "safety_factor": safety_factor} | |
| pdf_filename = generate_pdf_report(data) | |
| return safety_factor, fig, pdf_filename | |
| elif simulation_tool == "ANSYS": | |
| # Run ANSYS-based simulation | |
| result = run_ansys_simulation(force, die_width, die_height, material_strength) | |
| return result, None, None | |
| elif simulation_tool == "SolidWorks": | |
| # Run SolidWorks-based simulation | |
| result = solidworks_stress_analysis(force, die_width, die_height, material_strength) | |
| return result, None, None | |
| else: | |
| return "Invalid simulation tool selected", None, None | |
| # Create Gradio App | |
| # 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) # Fixed the parenthesis here | |
| thickness = gr.Number(label="Thickness (mm)", value=10) | |
| die_output = gr.Textbox(label="Die Output File") | |
| visualization_output = gr.Image(label="3D Visualization") | |
| die_button = gr.Button("Generate Die") | |
| die_button.click( | |
| lambda l, w, t: (generate_die(l, w, t), visualize_die(l, w, t)), | |
| inputs=[length, width, thickness], | |
| outputs=[die_output, visualization_output], | |
| ) | |