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()