File size: 5,738 Bytes
1acf1d8
89ed138
d7605f8
 
a17200d
 
 
 
 
 
 
1acf1d8
d7605f8
 
aad8c61
d7605f8
 
aad8c61
d7605f8
 
 
 
 
 
 
 
 
 
 
 
 
89ed138
d7605f8
 
 
 
 
 
 
aad8c61
a17200d
 
aad8c61
a17200d
aad8c61
a17200d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aad8c61
 
a17200d
aad8c61
a17200d
1acf1d8
a17200d
1acf1d8
 
a17200d
1acf1d8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aad8c61
1acf1d8
 
a17200d
 
aad8c61
a17200d
aad8c61
89ed138
a17200d
89ed138
 
 
1acf1d8
a17200d
1acf1d8
a17200d
1acf1d8
a17200d
1acf1d8
 
 
 
 
a17200d
 
1acf1d8
 
 
 
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import gradio as gr
import os
import cv2
import numpy as np
from OCC.Extend.DataExchange import read_step_file
from OCC.Core.BRepBnd import Bnd_Box
from OCC.Core.gp import gp_Pnt
from OCC.Core.BRep import BRep_Builder
from OCC.Core.TopAbs import TopAbs_SOLID
from OCC.Core.TopoDS import topods_Solid
from OCC.Core.STEPControl import STEPControl_Reader

# Function to process image and extract dimensions (example: simple edge detection)
def process_image_for_dimensions(image_file_path):
    """
    Process CAD image to extract dimensions. For simplicity, we assume
    a 2D image where we can detect the outline or significant objects.
    """
    # Load image
    image = cv2.imread(image_file_path, cv2.IMREAD_GRAYSCALE)
    _, thresholded = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY)
    
    # Find contours of the image
    contours, _ = cv2.findContours(thresholded, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    if not contours:
        raise ValueError("No contours found in the image.")
    
    # Get the bounding box of the largest contour (assuming it's the object of interest)
    contour = max(contours, key=cv2.contourArea)
    x, y, w, h = cv2.boundingRect(contour)

    # Example: assume extracted dimensions from bounding box
    width = w  # Width of the bounding box
    height = h  # Height of the bounding box
    depth = 50  # Default depth, you can modify this based on input or assumptions
    
    # Return the extracted dimensions
    return (width, height, depth)

# Function to process STEP file and extract dimensions
def process_step_file(step_file_path):
    """
    Process a STEP file to extract the 3D bounding box dimensions of the geometry.
    """
    # Read the STEP file
    reader = STEPControl_Reader()
    status = reader.ReadFile(step_file_path)
    
    if status != 1:
        raise ValueError(f"Failed to load STEP file: {step_file_path}")
    
    # Get the shape from the STEP file
    shape = reader.Shape()
    
    # Calculate bounding box
    bbox = Bnd_Box()
    builder = BRep_Builder()
    builder.Add(bbox, shape)
    
    # Get the bounds of the box
    xmin, ymin, zmin, xmax, ymax, zmax = bbox.Get()
    
    # Return dimensions (width, height, depth)
    width = xmax - xmin
    height = ymax - ymin
    depth = zmax - zmin
    
    return (width, height, depth)

# Function to generate APDL script from extracted properties
def generate_apdl_script(cad_file, element_type, material_ex, material_nu):
    """
    Generate an APDL script based on CAD file properties and user input.
    """
    file_extension = os.path.splitext(cad_file.name)[1].lower()
    
    # Extract dimensions based on the file type
    if file_extension in ['.png', '.jpg', '.jpeg', '.bmp']:  # For image files
        cad_dimensions = process_image_for_dimensions(cad_file.name)
    elif file_extension in ['.step', '.stp']:  # For STEP files
        cad_dimensions = process_step_file(cad_file.name)
    else:
        raise ValueError(f"Unsupported CAD file format: {file_extension}")
    
    # File name for the generated APDL script
    file_name = "generated_apdl_script.inp"
    
    # Generate the APDL script
    with open(file_name, 'w') as apdl_file:
        apdl_file.write("! APDL Script Generated from CAD File\n")
        apdl_file.write("/PREP7\n")
        apdl_file.write(f"ET,1,{element_type}\n")  # Define element type
        apdl_file.write(f"BLOCK,0,{cad_dimensions[0]},0,{cad_dimensions[1]},0,{cad_dimensions[2]}\n")  # Create a block
        apdl_file.write(f"MP,EX,1,{material_ex}\n")  # Define material property (Young's modulus)
        apdl_file.write(f"MP,NUXY,1,{material_nu}\n")  # Define material property (Poisson's ratio)
        apdl_file.write("MAT,1\n")
        apdl_file.write("ESEL,S,ALL\n")  # Select all elements
        apdl_file.write("ESIZE,10\n")  # Element size
        apdl_file.write("MSHAPE,1,3D\n")  # Define mesh shape
        apdl_file.write("MESH,ALL\n")  # Generate the mesh
        apdl_file.write("/SOLU\n")  # Switch to solution processor
        apdl_file.write("ANTYPE,STATIC\n")  # Define analysis type
        apdl_file.write("D,1,UX,0\n")  # Apply boundary condition (UX=0)
        apdl_file.write("D,1,UY,0\n")  # Apply boundary condition (UY=0)
        apdl_file.write("D,1,UZ,0\n")  # Apply boundary condition (UZ=0)
        apdl_file.write("FINISH\n")  # Finish pre-processing
        apdl_file.write("/POST1\n")  # Post-processing
        apdl_file.write("SET,LAST\n")  # Use the last result set
        apdl_file.write("PLDISP,ALL\n")  # Plot displacement
        apdl_file.write("FINISH\n")  # Finish post-processing
    
    return file_name

# Gradio Interface for CAD File Input (Image or STEP)
def generate_script_ui_from_cad(cad_file, element_type, material_ex, material_nu):
    """
    Interface function to generate an APDL script from CAD file (image or STEP).
    """
    try:
        file_path = generate_apdl_script(cad_file, element_type, material_ex, material_nu)
        return file_path
    except ValueError as e:
        return str(e)

# Gradio Input and Output for CAD File Upload
iface = gr.Interface(
    fn=generate_script_ui_from_cad,
    inputs=[
        gr.File(label="Upload CAD File (Image or STEP)"),
        gr.Textbox(label="Element Type (e.g., SOLID186)", value="SOLID186"),
        gr.Number(label="Material EX (Young's Modulus)", value=200e9),
        gr.Number(label="Material NU (Poisson's Ratio)", value=0.3),
    ],
    outputs=gr.File(label="Generated APDL Script"),
    title="APDL Script Generator from CAD File",
    description="Upload a CAD file (2D image or STEP format) and provide material properties to generate an APDL script."
)

# Launch the Interface
iface.launch()