File size: 3,044 Bytes
f1b3def
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import os
import trimesh
import gradio as gr
import matplotlib.pyplot as plt
import pyvista as pv
from pyvista import Plotter

# Install and start Xvfb
os.system("apt-get update && apt-get install -y xvfb libgl1-mesa-glx")
pv.start_xvfb()

def generate_cad_and_apdl(length, width, height):
    """
    Generate a 3D CAD model (box only) using Trimesh and output APDL script.
    """
    cad_model = trimesh.creation.box(extents=(length, width, height))
    cad_path = "/tmp/demo_model.stl"
    cad_model.export(cad_path)

    apdl_script = f"""
/prep7
block, 0, {length}, 0, {width}, 0, {height}
/mesh
esize, 10
vmesh, all
allsel, all
/solu
solve
/exit
"""
    apdl_path = "/tmp/demo_model_apdl.txt"
    with open(apdl_path, "w") as f:
        f.write(apdl_script)

    return cad_model, cad_path, apdl_path

def visualize_2d(cad_model):
    vertices = cad_model.vertices
    edges = cad_model.edges
    fig, ax = plt.subplots(figsize=(6, 6))
    for edge in edges:
        start, end = edge
        ax.plot(
            [vertices[start][0], vertices[end][0]],
            [vertices[start][1], vertices[end][1]],
            color="black",
            linewidth=2
        )
    ax.set_title("2D Projection (Top View)")
    ax.set_xlabel("X-axis")
    ax.set_ylabel("Y-axis")
    ax.grid(True)
    ax.set_aspect('equal')
    image_path = "/tmp/cad_2d_visualization.png"
    plt.savefig(image_path)
    plt.close(fig)
    return image_path

def visualize_3d(cad_model):
    vertices = cad_model.vertices
    faces = cad_model.faces
    faces_pv = []
    for face in faces:
        faces_pv.append(len(face))
        faces_pv.extend(face)
    mesh = pv.PolyData(vertices, faces_pv)
    plotter = Plotter(off_screen=True)
    plotter.add_mesh(mesh, color="lightblue", show_edges=True)
    plotter.set_background("white")
    plotter.view_isometric()
    image_path = "/tmp/cad_3d_visualization.png"
    plotter.screenshot(image_path)
    plotter.close()
    return image_path

def create_files_and_visualizations(length, width, height):
    cad_model, cad_file, apdl_file = generate_cad_and_apdl(length, width, height)
    cad_2d_path = visualize_2d(cad_model)
    cad_3d_path = visualize_3d(cad_model)
    return cad_file, apdl_file, cad_2d_path, cad_3d_path

with gr.Blocks() as app:
    with gr.Row():
        length = gr.Number(label="Length (mm)", value=100, precision=2)
        width = gr.Number(label="Width (mm)", value=50, precision=2)
        height = gr.Number(label="Height (mm)", value=20, precision=2)
    submit_button = gr.Button("Submit")
    with gr.Row():
        cad_file = gr.File(label="Download CAD Model (STL)")
        apdl_file = gr.File(label="Download APDL Script")
        cad_2d_image = gr.Image(label="2D Visualization (Top View)")
        cad_3d_image = gr.Image(label="3D Visualization")
    submit_button.click(
        fn=create_files_and_visualizations,
        inputs=[length, width, height],
        outputs=[cad_file, apdl_file, cad_2d_image, cad_3d_image]
    )

if __name__ == "__main__":
    app.launch()