APDLscript / app.py
jithenderchoudary's picture
Update app.py
479542b verified
raw
history blame
4.66 kB
import FreeCAD, Fem, FemGui
from FreeCAD import Gui
import os
import sys
sys.path.append(r"C:\Program Files\FreeCAD 1.0\bin") # Path to FreeCAD's Python library
sys.path.append(r"C:\Program Files\FreeCAD 1.0\lib") # Additional FreeCAD modules
try:
import FreeCAD, Fem, FemGui
print("FreeCAD modules imported successfully.")
except ImportError as e:
print(f"Error importing FreeCAD modules: {e}")
def run_fea(step_file, output_dir):
"""
Automates FEA analysis in FreeCAD using the FEM Workbench.
Args:
step_file (str): Path to the STEP file.
output_dir (str): Directory to save output files (images and analysis data).
"""
# Create a new FreeCAD document
doc = FreeCAD.newDocument("FEM_Analysis")
# Import STEP file
obj = doc.addObject("Part::Feature", "ImportedPart")
obj.Shape = FreeCAD.importShape(step_file)
doc.recompute()
# Assign material properties
mat = doc.addObject("App::MaterialObjectPython", "Material")
mat.Material = {
"Name": "Steel",
"YoungsModulus": 210e9, # Pa (N/m²)
"PoissonRatio": 0.3,
}
doc.addObject("Fem::ConstraintMaterial", "MaterialConstraint").References = [(obj, "Face1")] # Adjust face as needed
doc.recompute()
# Create and configure the mesh
mesh = doc.addObject("Fem::FemMeshShapeNetgenObject", "FEMMesh")
mesh.Shape = obj.Shape
mesh.MaxSize = 5 # Set mesh size (adjust as required)
doc.recompute()
# Apply boundary conditions
fixed_constraint = doc.addObject("Fem::ConstraintFixed", "FixedConstraint")
fixed_constraint.References = [(obj, "Face1")] # Adjust face as needed
doc.recompute()
# Apply force
force_constraint = doc.addObject("Fem::ConstraintForce", "ForceConstraint")
force_constraint.References = [(obj, "Face2")] # Adjust face as needed
force_constraint.Force = 1000 # N
doc.recompute()
# Add solver (CalculiX)
solver = doc.addObject("Fem::SolverCalculixCcxTools", "Solver")
solver.InputFile = os.path.join(output_dir, "input.inp")
solver.WorkingDir = output_dir
doc.recompute()
# Write input file and run the solver
solver.write_input_file()
solver.run()
# Load and process results
results = solver.load_results()
results_obj = doc.addObject("Fem::FemResultObject", "Results")
results_obj.Mesh = results.Mesh
results_obj.NodeCount = len(results.Mesh.Nodes)
doc.recompute()
# Save 2D and 3D views as images
two_d_image_path = os.path.join(output_dir, "2D_View.png")
three_d_image_path = os.path.join(output_dir, "3D_View.png")
Gui.ActiveDocument.ActiveView.saveImage(two_d_image_path, 1024, 768, "White")
Gui.ActiveDocument.ActiveView.viewIsometric()
Gui.ActiveDocument.ActiveView.saveImage(three_d_image_path, 1024, 768, "White")
# Save the FreeCAD project file
doc.saveAs(os.path.join(output_dir, "FEM_Analysis.FCStd"))
print(f"Analysis completed successfully.")
print(f"2D View saved to: {two_d_image_path}")
print(f"3D View saved to: {three_d_image_path}")
# Example Usage
if __name__ == "__main__":
step_file = "path_to_your_step_file.stp" # Replace with your STEP file path
output_dir = "path_to_output_directory" # Replace with your desired output directory
if not os.path.exists(output_dir):
os.makedirs(output_dir)
run_fea(step_file, output_dir)
# Gradio interface
with gr.Blocks() as app:
gr.Markdown("# ANSYS APDL Script for 2D and 3D Views")
with gr.Row():
step_file = gr.File(label="Upload STEP File")
step_output = gr.Text(label="Upload Status")
step_file.upload(upload_step_file, inputs=step_file, outputs=step_output)
with gr.Row():
apdl_view = gr.Textbox(apdl_script, lines=20, label="APDL Script")
modify_button = gr.Button("Save Changes")
modify_button.click(modify_apdl_script, inputs=apdl_view, outputs=step_output)
with gr.Row():
execute_button = gr.Button("Run Script")
execution_output = gr.Text(label="Execution Status")
log_output = gr.Textbox(label="Output Log", lines=10, interactive=False)
execute_button.click(execute_script, outputs=[execution_output])
execute_button.click(read_output_log, outputs=log_output)
with gr.Row():
gr.Markdown("## Generated Images")
view_2d = gr.Image(label="2D View", interactive=False)
view_3d = gr.Image(label="3D View", interactive=False)
refresh_button = gr.Button("Refresh Images")
refresh_button.click(get_generated_images, outputs=[view_2d, view_3d])
app.launch()