cadsimulation3 / app.py
karthikmn's picture
Update app.py
1aea4e5 verified
import trimesh
import gradio as gr
import matplotlib.pyplot as plt
import io
import base64
from PIL import Image
def generate_cad_model(base_length, base_width, base_height):
"""
Generate a CAD model as a 3D mesh.
"""
# Create a 3D box (CAD model representation)
mesh = trimesh.creation.box(extents=(base_length, base_width, base_height))
return mesh
def render_3d_cad_model(base_length, base_width, base_height):
"""
Render a 3D CAD model for interactive viewing.
"""
# Generate the 3D CAD model
mesh = generate_cad_model(base_length, base_width, base_height)
# Convert the mesh to GLB format for 3D visualization
glb_data = io.BytesIO()
mesh.export(glb_data, file_type="glb")
glb_data.seek(0)
return glb_data
def render_2d_cad_projection(base_length, base_width, base_height):
"""
Generate a 2D projection of the CAD model and return it as an image.
"""
# Generate the 3D CAD model
mesh = generate_cad_model(base_length, base_width, base_height)
# Create a 2D projection of the model
projection = mesh.section(plane_origin=(0, 0, 0), plane_normal=(0, 0, 1))
if projection is not None:
projection_img = trimesh.util.grid_2d(projection.to_image(), tile=(1, 1))
# Save the projection as an image
buffer = io.BytesIO()
plt.imshow(projection_img, cmap="gray")
plt.axis("off")
plt.savefig(buffer, format="png", bbox_inches="tight")
buffer.seek(0)
# Convert to Base64 for Gradio display
encoded_image = base64.b64encode(buffer.getvalue()).decode("utf-8")
return f"data:image/png;base64,{encoded_image}"
else:
return None
# Gradio Interface
def display_cad(base_length, base_width, base_height):
"""
Render both 3D and 2D CAD outputs.
"""
# Render 3D model
glb_data = render_3d_cad_model(base_length, base_width, base_height)
# Render 2D projection
cad_image = render_2d_cad_projection(base_length, base_width, base_height)
return glb_data, cad_image
# Gradio interface for 3D and 2D CAD visualization
demo = gr.Interface(
fn=display_cad,
inputs=[
gr.Number(label="Base Length (mm)", value=10),
gr.Number(label="Base Width (mm)", value=10),
gr.Number(label="Base Height (mm)", value=5),
],
outputs=[
gr.Model3D(label="3D CAD Model"), # Interactive 3D viewer
gr.Image(label="2D CAD Projection"), # Static 2D projection
],
live=True,
)
if __name__ == "__main__":
demo.launch()