fekt-scara/scripts/generate_assembly_images.py
2025-01-07 21:05:43 +01:00

74 lines
2.5 KiB
Python
Executable file

#!/usr/bin/freecadcmd
import os
import FreeCAD as App # type: ignore
import FreeCADGui as Gui # type: ignore
# Define the project root directory
project_root = os.path.abspath(
os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir)
)
# Define the CAD directory
cad_dir = os.path.join(project_root, "cad")
# Define the output directory
output_dir = os.path.join(project_root, "tex", "images", "2_prakticka_cast")
# Ensure the output directory exists
os.makedirs(output_dir, exist_ok=True)
# Iterate over all files in the CAD directory (excluding nested directories)
for file in os.listdir(cad_dir):
if file.endswith(".FCStd"):
file_path = os.path.join(cad_dir, file)
App.Console.PrintMessage(f"\nProcessing {file_path}\n")
# Open the FreeCAD document
doc = App.open(file_path)
App.setActiveDocument(doc.Name)
App.ActiveDocument.recompute()
# Check if the document contains any assemblies (App::Part)
has_assembly = any(
hasattr(obj, "Type") and obj.Type == "Assembly" for obj in doc.Objects
)
if has_assembly:
# Gui.showMainWindow()
# Set visibility to true for all objects in the assembly and hide all objects outside of the assembly
for obj in doc.Objects:
if hasattr(obj, "Type") and obj.Type == "Assembly":
for sub_obj in obj.OutList:
if sub_obj.ViewObject is not None:
sub_obj.ViewObject.Visibility = True
else:
if obj.ViewObject is not None:
obj.ViewObject.Visibility = False
for view in [
"ViewIsometric",
"ViewFront",
"ViewTop",
"ViewRight",
"ViewRear",
"ViewBottom",
"ViewLeft",
]:
Gui.ActiveDocument.sendMsgToViews(view)
output_path = os.path.join(
output_dir, f'{file.replace(".FCStd", "")}_{view}.png'
)
Gui.ActiveDocument.ActiveView.saveImage(
output_path, 1920, 1080, "Transparent"
)
App.Console.PrintMessage(f"Exported {view} view to {output_path}\n")
else:
App.Console.PrintMessage(
f"No assembly found in {file_path}, skipping image generation.\n"
)
# Close the FreeCAD document
App.closeDocument(doc.Name)