import gradio as gr from apdl_generator.apdl_plate import generate_plate_apdl from apdl_generator.apdl_beam import generate_beam_apdl from simulators.python_simulation import run_python_simulation from visualization import visualize_results def simulation_workflow(tool_type, use_case, include_hole, include_force, include_load, thickness, length, width, hole_diameter, force, load): """ Main simulation workflow. Parameters: tool_type (str): 'Punch' or 'Die'. use_case (str): 'plate' or 'beam'. include_hole (bool): Whether to include a hole in the plate simulation. include_force (bool): Whether to include force in the simulation. include_load (bool): Whether to include load in the simulation. thickness (float): Thickness of the material. length (float): Length of the material. width (float): Width of the material. hole_diameter (float): Diameter of the hole (optional). force (float): Applied force (optional). load (float): Applied load (optional). Returns: results (str): Text result summarizing stress and deformation. graph_path (str): Path to the 2D visualization. """ # Handle optional parameters force = force if include_force else 0 load = load if include_load else 0 # Generate APDL script dynamically if use_case == "plate": hole_diameter = hole_diameter if include_hole else 0 apdl_path = generate_plate_apdl(thickness, length, width, hole_diameter, force) elif use_case == "beam": apdl_path = generate_beam_apdl(length, width, thickness, load) else: return "Invalid use case selected.", None # Run simulation using Python-based solver stress, deformation = run_python_simulation(apdl_path, use_case, thickness=thickness, length=length, width=width, force=force, load=load) # Generate 2D visualization graph_path, _ = visualize_results("Python-Based Solver", length, width, thickness, stress, deformation) return f"{tool_type} Simulation\nStress: {stress:.2f} MPa\nDeformation: {deformation:.2f} mm", graph_path interface = gr.Interface( fn=simulation_workflow, inputs=[ gr.Radio(["Punch", "Die"], label="Select Tool Type"), gr.Radio(["plate", "beam"], label="Select Use Case"), gr.Checkbox(label="Include Hole for Plate Simulation"), # Checkbox for optional hole gr.Checkbox(label="Include Force"), # Checkbox for optional force gr.Checkbox(label="Include Load"), # Checkbox for optional load gr.Slider(10, 50, step=1, label="Thickness (mm)"), gr.Slider(100, 500, step=10, label="Length (mm)"), gr.Slider(50, 200, step=10, label="Width (mm)"), gr.Slider(5, 25, step=1, label="Hole Diameter (mm)"), # Controlled by "Include Hole" gr.Slider(1000, 10000, step=500, label="Force (N)"), # Controlled by "Include Force" gr.Slider(1000, 20000, step=1000, label="Load (N)"), # Controlled by "Include Load" ], outputs=[ gr.Textbox(label="Simulation Results"), gr.Image(label="2D Results Visualization") ], title="Punch and Die Simulation Tool (Python-Based)", live=True ) interface.launch()