forked from youen/assembly_handbook
added commands to edit stages
This commit is contained in:
parent
2ce4102f88
commit
6e1514f684
61
InitGui.py
61
InitGui.py
@ -1,4 +1,5 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
import FreeCADGui as Gui
|
import FreeCADGui as Gui
|
||||||
import FreeCAD as App
|
import FreeCAD as App
|
||||||
|
|
||||||
@ -15,7 +16,10 @@ class AssemblyHandbookWorkbench(Gui.Workbench):
|
|||||||
MenuText = "Assembly handbook"
|
MenuText = "Assembly handbook"
|
||||||
ToolTip = "A workbench for automating creation of an assembly handbook"
|
ToolTip = "A workbench for automating creation of an assembly handbook"
|
||||||
Icon = ahb_icon
|
Icon = ahb_icon
|
||||||
toolbox = []
|
|
||||||
|
dev = True # indicates development mode (enables additional tools, log, debug checks, etc.)
|
||||||
|
|
||||||
|
context = None
|
||||||
|
|
||||||
def GetClassName(self):
|
def GetClassName(self):
|
||||||
return "Gui::PythonWorkbench"
|
return "Gui::PythonWorkbench"
|
||||||
@ -23,20 +27,15 @@ class AssemblyHandbookWorkbench(Gui.Workbench):
|
|||||||
def Initialize(self):
|
def Initialize(self):
|
||||||
"""
|
"""
|
||||||
This function is called at the first activation of the workbench.
|
This function is called at the first activation of the workbench.
|
||||||
here is the place to import all the commands
|
|
||||||
"""
|
"""
|
||||||
#from freecad.assembly_handbook import my_numpy_function
|
self.registerCommands()
|
||||||
#App.Console.PrintMessage("switching to workbench_starterkit\n")
|
|
||||||
#App.Console.PrintMessage("run a numpy function: sqrt(100) = {}\n".format(my_numpy_function.my_foo(100)))
|
|
||||||
|
|
||||||
self.appendToolbar("Tools", self.toolbox)
|
|
||||||
self.appendMenu("Tools", self.toolbox)
|
|
||||||
|
|
||||||
def Activated(self):
|
def Activated(self):
|
||||||
"""
|
"""
|
||||||
code which should be computed when a user switch to this workbench
|
code which should be computed when a user switch to this workbench
|
||||||
"""
|
"""
|
||||||
pass
|
if self.context is None:
|
||||||
|
self.initializeContext()
|
||||||
|
|
||||||
def Deactivated(self):
|
def Deactivated(self):
|
||||||
"""
|
"""
|
||||||
@ -44,6 +43,46 @@ class AssemblyHandbookWorkbench(Gui.Workbench):
|
|||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
Gui.addWorkbench(AssemblyHandbookWorkbench())
|
def initializeContext(self):
|
||||||
|
import ahb_context
|
||||||
|
self.context = ahb_context.AHB_Context()
|
||||||
|
|
||||||
print("Assembly Handbook workbench GUI loaded")
|
def registerCommands(self):
|
||||||
|
toolbox = []
|
||||||
|
|
||||||
|
self.importModule('ahb_cmd_export_csv')
|
||||||
|
toolbox.append("AHB_exportCsv")
|
||||||
|
|
||||||
|
self.importModule('ahb_cmd_set_active_stage')
|
||||||
|
toolbox.append("AHB_setActiveStage")
|
||||||
|
|
||||||
|
self.importModule('ahb_cmd_set_part_stage')
|
||||||
|
toolbox.append("AHB_setPartStage")
|
||||||
|
|
||||||
|
if self.dev:
|
||||||
|
self.importModule('ahb_cmd_reload')
|
||||||
|
toolbox.append("AHB_reload")
|
||||||
|
|
||||||
|
self.appendToolbar("Assembly Handbook", toolbox)
|
||||||
|
self.appendMenu("Assembly Handbook", toolbox)
|
||||||
|
|
||||||
|
def reload(self):
|
||||||
|
# Used for development only
|
||||||
|
self.removeToolbar("Assembly Handbook")
|
||||||
|
self.removeMenu("Assembly Handbook")
|
||||||
|
|
||||||
|
import importlib
|
||||||
|
import ahb_context
|
||||||
|
importlib.reload(ahb_context)
|
||||||
|
|
||||||
|
self.initializeContext()
|
||||||
|
self.registerCommands()
|
||||||
|
pass
|
||||||
|
|
||||||
|
def importModule(self, moduleName):
|
||||||
|
import importlib
|
||||||
|
module = importlib.import_module(moduleName)
|
||||||
|
if self.dev:
|
||||||
|
importlib.reload(module)
|
||||||
|
|
||||||
|
Gui.addWorkbench(AssemblyHandbookWorkbench())
|
||||||
|
58
ahb_cmd_export_csv.py
Normal file
58
ahb_cmd_export_csv.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
import FreeCADGui as Gui
|
||||||
|
import FreeCAD as App
|
||||||
|
|
||||||
|
class AHB_ExportCsv:
|
||||||
|
def GetResources(self):
|
||||||
|
return {"MenuText": "CSV export",
|
||||||
|
"ToolTip": "Export part list as a CSV file",
|
||||||
|
"Pixmap": ""
|
||||||
|
}
|
||||||
|
|
||||||
|
def IsActive(self):
|
||||||
|
return True
|
||||||
|
|
||||||
|
def Activated(self):
|
||||||
|
doc = App.activeDocument()
|
||||||
|
|
||||||
|
fileName: str = doc.FileName
|
||||||
|
if fileName is None:
|
||||||
|
raise BaseException("You must save your FreeCAD document before exporting to CSV")
|
||||||
|
|
||||||
|
csvFileName = os.path.splitext(fileName)[0] + ".csv"
|
||||||
|
|
||||||
|
print("Exporting parts to CSV file " + csvFileName + "...")
|
||||||
|
|
||||||
|
def readProp(obj, prop, default):
|
||||||
|
if prop in obj.PropertiesList:
|
||||||
|
return obj.getPropertyByName(prop)
|
||||||
|
else:
|
||||||
|
return default
|
||||||
|
|
||||||
|
parts = []
|
||||||
|
obj: App.DocumentObject
|
||||||
|
for obj in doc.Objects:
|
||||||
|
if obj.TypeId == 'Part::Feature':
|
||||||
|
parts.append((readProp(obj, 'Base_Layer', '').replace(',', '-') + "," + readProp(obj, 'Base_Reference', '').replace(',', '-'), "=\"" + obj.Label.replace(',', '-') + "\""))
|
||||||
|
|
||||||
|
parts.sort()
|
||||||
|
|
||||||
|
with open(csvFileName, 'w', encoding='utf8') as csvFile:
|
||||||
|
csvFile.write("Group, Reference, Name, Quantity\n")
|
||||||
|
|
||||||
|
quantity = 0
|
||||||
|
prevPart = parts[0]
|
||||||
|
for partIdx in range(len(parts) + 1):
|
||||||
|
part = parts[partIdx] if partIdx < len(parts) else ("eof", "eof")
|
||||||
|
if part[0] == prevPart[0]:
|
||||||
|
quantity += 1
|
||||||
|
else:
|
||||||
|
csvFile.write(prevPart[0] + "," + prevPart[1] + "," + str(quantity) + "\n")
|
||||||
|
quantity = 1
|
||||||
|
prevPart = part
|
||||||
|
|
||||||
|
print("CSV file exported")
|
||||||
|
|
||||||
|
from ahb_command import AHB_CommandWrapper
|
||||||
|
AHB_CommandWrapper.addGuiCommand('AHB_exportCsv', AHB_ExportCsv())
|
20
ahb_cmd_reload.py
Normal file
20
ahb_cmd_reload.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import FreeCADGui as Gui
|
||||||
|
import FreeCAD as App
|
||||||
|
|
||||||
|
class AHB_Reload:
|
||||||
|
def GetResources(self):
|
||||||
|
return {"MenuText": "[dev] Reload workbench",
|
||||||
|
"ToolTip": "Reload the workbench without restarting FreeCAD (development tool)",
|
||||||
|
"Pixmap": ""
|
||||||
|
}
|
||||||
|
|
||||||
|
def IsActive(self):
|
||||||
|
return True
|
||||||
|
|
||||||
|
def Activated(self):
|
||||||
|
print("Reloading AssemblyHandbookWorkbench")
|
||||||
|
workbench = Gui.getWorkbench("AssemblyHandbookWorkbench")
|
||||||
|
workbench.reload()
|
||||||
|
|
||||||
|
from ahb_command import AHB_CommandWrapper
|
||||||
|
AHB_CommandWrapper.addGuiCommand('AHB_reload', AHB_Reload())
|
29
ahb_cmd_set_active_stage.py
Normal file
29
ahb_cmd_set_active_stage.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import FreeCADGui as Gui
|
||||||
|
import FreeCAD as App
|
||||||
|
from PySide import QtGui
|
||||||
|
|
||||||
|
|
||||||
|
class AHB_SetActiveStage:
|
||||||
|
def GetResources(self):
|
||||||
|
return {"MenuText": "Set active stage",
|
||||||
|
"ToolTip": "Sets the stage which is the active stage, or creates a new stage if it doesn't exist",
|
||||||
|
"Pixmap": ""
|
||||||
|
}
|
||||||
|
|
||||||
|
def IsActive(self):
|
||||||
|
return True
|
||||||
|
|
||||||
|
def Activated(self, stageId = None):
|
||||||
|
if stageId is None:
|
||||||
|
reply = QtGui.QInputDialog.getText(None, "Set Active Stage", "Enter the stage number:")
|
||||||
|
if reply[1]:
|
||||||
|
# user clicked OK
|
||||||
|
stageId = int(reply[0])
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
|
workbench = Gui.getWorkbench("AssemblyHandbookWorkbench")
|
||||||
|
workbench.context.setActiveStage(stageId)
|
||||||
|
|
||||||
|
from ahb_command import AHB_CommandWrapper
|
||||||
|
AHB_CommandWrapper.addGuiCommand('AHB_setActiveStage', AHB_SetActiveStage())
|
33
ahb_cmd_set_part_stage.py
Normal file
33
ahb_cmd_set_part_stage.py
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
import FreeCADGui as Gui
|
||||||
|
import FreeCAD as App
|
||||||
|
|
||||||
|
class AHB_SetPartStage:
|
||||||
|
def GetResources(self):
|
||||||
|
return {"MenuText": "Set part stage",
|
||||||
|
"ToolTip": "Sets the stage for this part to the currently active stage",
|
||||||
|
"Pixmap": ""
|
||||||
|
}
|
||||||
|
|
||||||
|
def IsActive(self):
|
||||||
|
return True
|
||||||
|
|
||||||
|
def Activated(self, stageId: Optional[int] = None):
|
||||||
|
workbench = Gui.getWorkbench("AssemblyHandbookWorkbench")
|
||||||
|
if stageId is None:
|
||||||
|
stageId = workbench.context.getActiveStage()
|
||||||
|
if stageId is None:
|
||||||
|
raise BaseException("You must activate a stage before using this command")
|
||||||
|
|
||||||
|
obj: App.DocumentObject
|
||||||
|
for obj in Gui.Selection.getSelection():
|
||||||
|
if obj is not None and obj.TypeId == 'Part::Feature':
|
||||||
|
if not "AssemblyHandbook_Stage" in obj.PropertiesList:
|
||||||
|
obj.addProperty("App::PropertyInteger", "AssemblyHandbook_Stage", "AssemblyHandbook")
|
||||||
|
if obj.AssemblyHandbook_Stage != stageId:
|
||||||
|
obj.AssemblyHandbook_Stage = stageId
|
||||||
|
workbench.context.onPartStageChanged(obj)
|
||||||
|
|
||||||
|
from ahb_command import AHB_CommandWrapper
|
||||||
|
AHB_CommandWrapper.addGuiCommand('AHB_setPartStage', AHB_SetPartStage())
|
28
ahb_command.py
Normal file
28
ahb_command.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import FreeCADGui as Gui
|
||||||
|
|
||||||
|
global ahb_commands
|
||||||
|
ahb_commands = {}
|
||||||
|
|
||||||
|
class AHB_CommandWrapper:
|
||||||
|
def __init__(self, command_name):
|
||||||
|
self.command_name = command_name
|
||||||
|
|
||||||
|
def __getattr__(self, attrName):
|
||||||
|
instance = ahb_commands[self.command_name]
|
||||||
|
result = getattr(instance, attrName)
|
||||||
|
if callable(result):
|
||||||
|
# replace self
|
||||||
|
def f(*args, **kwargs): return result.__func__(instance, *args, **kwargs)
|
||||||
|
return f
|
||||||
|
else:
|
||||||
|
return result
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def addGuiCommand(command_name, command_instance):
|
||||||
|
#print(("adding" if not command_name in ahb_commands else "updating") + " command " + command_name)
|
||||||
|
ahb_commands.update({ command_name: command_instance })
|
||||||
|
Gui.addCommand(command_name, AHB_CommandWrapper(command_name))
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def listGuiCommands():
|
||||||
|
return ahb_commands.keys()
|
49
ahb_context.py
Normal file
49
ahb_context.py
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
import FreeCADGui as Gui
|
||||||
|
import FreeCAD as App
|
||||||
|
import random
|
||||||
|
|
||||||
|
def _rgb(r, g, b):
|
||||||
|
return r/255.0, g/255.0, b/255.0, 0.0
|
||||||
|
|
||||||
|
_colors = [
|
||||||
|
_rgb(94, 224, 174),
|
||||||
|
_rgb(223, 234, 70),
|
||||||
|
_rgb(35, 120, 200),
|
||||||
|
_rgb(188, 80, 33),
|
||||||
|
_rgb(26, 242, 69),
|
||||||
|
_rgb(13, 41, 107),
|
||||||
|
_rgb(153, 9, 52),
|
||||||
|
_rgb(211, 119, 0),
|
||||||
|
_rgb(34, 130, 7),
|
||||||
|
_rgb(221, 79, 249)
|
||||||
|
]
|
||||||
|
|
||||||
|
class AHB_Context:
|
||||||
|
_activeStageId: int = None
|
||||||
|
|
||||||
|
def setActiveStage(self, stageId):
|
||||||
|
self._activeStageId = stageId
|
||||||
|
|
||||||
|
def getActiveStage(self):
|
||||||
|
return self._activeStageId
|
||||||
|
|
||||||
|
def onPartStageChanged(self, part: App.DocumentObject):
|
||||||
|
allStages = set()
|
||||||
|
|
||||||
|
doc = App.ActiveDocument
|
||||||
|
for obj in doc.Objects:
|
||||||
|
if obj.TypeId == 'Part::Feature':
|
||||||
|
if 'AssemblyHandbook_Stage' in obj.PropertiesList:
|
||||||
|
allStages.add(obj.AssemblyHandbook_Stage)
|
||||||
|
|
||||||
|
allStages = list(allStages)
|
||||||
|
allStages.sort()
|
||||||
|
|
||||||
|
if not 'AssemblyHandbook_Stage' in part.PropertiesList:
|
||||||
|
part.ViewObject.ShapeColor = (0.8,0.8,0.8,0.0)
|
||||||
|
|
||||||
|
for obj in doc.Objects:
|
||||||
|
if obj.TypeId == 'Part::Feature':
|
||||||
|
if 'AssemblyHandbook_Stage' in obj.PropertiesList:
|
||||||
|
stageIndex = allStages.index(obj.AssemblyHandbook_Stage)
|
||||||
|
obj.ViewObject.ShapeColor = _colors[stageIndex % len(_colors)]
|
Loading…
Reference in New Issue
Block a user