#!/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)