import FreeCADGui as Gui import FreeCAD as App import ahb_utils class AHB_New_Step: def GetResources(self): return {"MenuText": "New Step", "ToolTip": "Creates a page for the next step (first, select the view of the preceding step, if any)", "Pixmap": "" } def IsActive(self): return True def Activated(self): import re import os import sys from PySide.QtCore import QTimer workbench = Gui.getWorkbench("AssemblyHandbookWorkbench") #: :type workbench: AssemblyHandbookWorkbench if len(Gui.Selection.getSelection()) > 1: raise Exception("Please either select exactly one TechDraw view, or nothing at all") prev_view = None if len(Gui.Selection.getSelection()) == 0 else Gui.Selection.getSelection()[0] if prev_view is not None and prev_view.TypeId != 'TechDraw::DrawViewPart': raise Exception("Selected object is not a TechDraw view") doc = App.ActiveDocument if prev_view is None else prev_view.Document freecad_path = os.path.normpath(os.path.dirname(sys.executable) + '/..') # 'usr' absolute path if prev_view is None: step_number = 1 keep_updated = False raster_view = True template_file_name = freecad_path + '/share/Mod/TechDraw/Templates/A4_Landscape_blank.svg' parent_group = None else: prev_page = workbench.techDrawExtensions.getViewPage(prev_view) prev_page_group = prev_page.getParentGroup() if prev_page_group is not None: parent_group = prev_page_group.getParentGroup() keep_updated = prev_page.KeepUpdated try: raster_view = prev_page.Assembly_handbook_RasterView except: raster_view = True if raster_view: keep_updated = False template_file_name = prev_page.Template.Template numbers = re.findall(r'\d+', prev_page.Label) if len(numbers) == 0: prev_number = 0 else: prev_number = max(1, int(numbers[-1])) step_number = prev_number + 1 step_num_str = str(step_number).zfill(3) group = doc.addObject('App::DocumentObjectGroup', 'Etape' + step_num_str) if parent_group is not None: parent_group.addObject(group) page_name = 'Etape' + step_num_str + '_Page' page = doc.addObject('TechDraw::DrawPage', page_name) group.addObject(page) if page.KeepUpdated != keep_updated: page.KeepUpdated = keep_updated template = doc.addObject('TechDraw::DrawSVGTemplate', 'Template') template.Template = template_file_name page.Template = template view = doc.addObject('TechDraw::DrawViewPart', 'View') view.Perspective = False view.CoarseView = True view.addProperty("App::PropertyString", "Assembly_handbook_PreviousStepView", "Assembly_handbook") view.addProperty("App::PropertyBool", "Assembly_handbook_RasterView", "Assembly_handbook") view.addProperty("App::PropertyXLinkList", "Assembly_handbook_HideParts", "Assembly_handbook") view.Assembly_handbook_RasterView = raster_view if raster_view: view.Visibility = False if prev_view is None: try: workbench.techDrawExtensions.setCurrentViewDirection(view) except: pass else: view.Assembly_handbook_PreviousStepView = prev_view.Name view.X = prev_view.X view.Y = prev_view.Y view.Direction = prev_view.Direction view.XDirection = prev_view.XDirection view.ScaleType = prev_view.ScaleType view.Scale = prev_view.Scale view.XSource = prev_view.XSource page.addView(view) if raster_view: view.purgeTouched() else: view.recompute() # search for views after the prev view to relink them after the new view (i.e. we insert the new view as an intermediate step) # TODO: re-number next steps if needed if prev_view is not None: for obj in doc.Objects: if obj != view and obj.TypeId == 'TechDraw::DrawViewPart' and 'Assembly_handbook_PreviousStepView' in obj.PropertiesList and obj.Assembly_handbook_PreviousStepView == prev_view.Name: obj.Assembly_handbook_PreviousStepView = view.Name print(obj.Label + ' has been moved after the new step') if len(view.XSource) > 0: workbench.techDrawExtensions.forceRedrawPage(page) Gui.Selection.clearSelection() Gui.Selection.addSelection(page) from ahb_command import AHB_CommandWrapper AHB_CommandWrapper.addGuiCommand('AHB_new_step', AHB_New_Step())