Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import os | |
| import matplotlib.pyplot as plt | |
| from mpl_toolkits.mplot3d.art3d import Poly3DCollection | |
| import numpy as np | |
| from fenics import * | |
| # Function to process CAD file and extract geometric properties | |
| def process_cad_file(cad_file_path): | |
| file_extension = os.path.splitext(cad_file_path)[1].lower() | |
| if file_extension in ['.step', '.stp']: | |
| geometry_info = {"type": "block", "dimensions": (150, 75, 25)} | |
| elif file_extension in ['.iges', '.igs']: | |
| geometry_info = {"type": "block", "dimensions": (120, 60, 20)} | |
| elif file_extension == '.stl': | |
| geometry_info = {"type": "block", "dimensions": (200, 100, 50)} | |
| else: | |
| raise ValueError(f"Unsupported CAD file format: {file_extension}") | |
| return geometry_info | |
| # Generate 2D visualization | |
| def generate_2d_image(dimensions): | |
| length, width, _ = dimensions | |
| plt.figure(figsize=(5, 5)) | |
| plt.plot([0, length, length, 0, 0], [0, 0, width, width, 0], 'b-') | |
| plt.fill_between([0, length], [0, 0], [width, width], color='lightblue', alpha=0.3) | |
| plt.title("2D Top View") | |
| plt.xlabel("Length") | |
| plt.ylabel("Width") | |
| plt.grid() | |
| image_path = "2d_image.png" | |
| plt.savefig(image_path) | |
| plt.close() | |
| return image_path | |
| # Generate 3D visualization | |
| def generate_3d_image(dimensions): | |
| length, width, height = dimensions | |
| vertices = np.array([ | |
| [0, 0, 0], [length, 0, 0], [length, width, 0], [0, width, 0], | |
| [0, 0, height], [length, 0, height], [length, width, height], [0, width, height] | |
| ]) | |
| faces = [ | |
| [vertices[j] for j in [0, 1, 2, 3]], # Bottom | |
| [vertices[j] for j in [4, 5, 6, 7]], # Top | |
| [vertices[j] for j in [0, 1, 5, 4]], # Front | |
| [vertices[j] for j in [2, 3, 7, 6]], # Back | |
| [vertices[j] for j in [1, 2, 6, 5]], # Right | |
| [vertices[j] for j in [0, 3, 7, 4]] # Left | |
| ] | |
| fig = plt.figure() | |
| ax = fig.add_subplot(111, projection='3d') | |
| for face in faces: | |
| poly = Poly3DCollection([face], alpha=0.5, edgecolor='r') | |
| ax.add_collection3d(poly) | |
| ax.set_xlabel("Length") | |
| ax.set_ylabel("Width") | |
| ax.set_zlabel("Height") | |
| ax.set_xlim([0, length]) | |
| ax.set_ylim([0, width]) | |
| ax.set_zlim([0, height]) | |
| plt.title("3D View") | |
| image_path = "3d_image.png" | |
| plt.savefig(image_path) | |
| plt.close() | |
| return image_path | |
| # Simulate using FEniCS | |
| def simulate_with_fenics(dimensions): | |
| length, width, height = dimensions | |
| # Material properties | |
| E = 200e9 # Young's modulus (Pa) | |
| nu = 0.3 # Poisson's ratio | |
| mu = E / (2 * (1 + nu)) | |
| lmbda = E * nu / ((1 + nu) * (1 - 2 * nu)) | |
| # Create mesh | |
| mesh = BoxMesh(Point(0, 0, 0), Point(length, width, height), 10, 5, 3) | |
| # Define function space for displacement | |
| V = VectorFunctionSpace(mesh, "P", 1) | |
| # Boundary conditions | |
| def left_boundary(x, on_boundary): | |
| return on_boundary and near(x[0], 0) | |
| bc = DirichletBC(V, Constant((0, 0, 0)), left_boundary) | |
| # Define strain and stress | |
| def epsilon(u): | |
| return sym(grad(u)) | |
| def sigma(u): | |
| return lmbda * div(u) * Identity(3) + 2 * mu * epsilon(u) | |
| # Define variational problem | |
| u = TrialFunction(V) | |
| v = TestFunction(V) | |
| f = Constant((0, 0, -1000)) # Uniform load | |
| a = inner(sigma(u), epsilon(v)) * dx | |
| L = dot(f, v) * dx | |
| # Solve the problem | |
| u = Function(V) | |
| solve(a == L, u, bc) | |
| # Post-process results | |
| V_magnitude = FunctionSpace(mesh, "P", 1) | |
| u_magnitude = sqrt(dot(u, u)) | |
| u_magnitude = project(u_magnitude, V_magnitude) | |
| max_displacement = u_magnitude.vector().max() | |
| # Save results | |
| file = File("fenics_displacement.pvd") | |
| file << u | |
| return f"Maximum displacement: {max_displacement:.6f} mm" | |
| # Main function | |
| def process_and_simulate(cad_file): | |
| try: | |
| # Process CAD file | |
| geometry_info = process_cad_file(cad_file.name) | |
| dimensions = geometry_info["dimensions"] | |
| # Generate visualizations | |
| image_2d = generate_2d_image(dimensions) | |
| image_3d = generate_3d_image(dimensions) | |
| # Simulate using FEniCS | |
| simulation_output = simulate_with_fenics(dimensions) | |
| return "fenics_displacement.pvd", image_2d, image_3d, simulation_output | |
| except Exception as e: | |
| return f"Error: {str(e)}", None, None, None | |
| # Gradio Interface | |
| iface = gr.Interface( | |
| fn=process_and_simulate, | |
| inputs=gr.File(label="Upload CAD File (STEP, IGES, STL)"), | |
| outputs=[ | |
| gr.File(label="Displacement Results (PVD)"), | |
| gr.Image(label="2D Visualization"), | |
| gr.Image(label="3D Visualization"), | |
| gr.Textbox(label="Simulation Output Log"), | |
| ], | |
| title="FEniCS-Based Simulation Processor", | |
| description=( | |
| "Upload a CAD file (STEP, IGES, STL) to extract geometry, generate " | |
| "2D/3D visualizations, and simulate using FEniCS." | |
| ), | |
| ) | |
| # Launch the Interface | |
| iface.launch() | |