import FreeCAD from FreeCAD import Gui from PySide import QtGui, QtCore import Boxer, BoxerDockWidget from Boxer import SideType class BoxerDocumentObserver: def __init__(self): pass def slotDeletedDocument(self, doc): gui.dockWidget.ui.generateButton.setEnabled(FreeCAD.ActiveDocument is not None) def slotActivateDocument(self, doc): gui.dockWidget.ui.generateButton.setEnabled(FreeCAD.ActiveDocument is not None) class BoxerGui(object): def __init__(self): self.cfg = Boxer.BoxCfg() self.cfg.outerDimmensions(100, 50, 200) self.cfg.notchUnitWidth = 10 def setupGui(self): doc = FreeCAD.ActiveDocument self.dockWidget = dockWidget = QtGui.QDockWidget() dockWidget.ui = BoxerDockWidget.Ui_BoxerDockWidget() dockWidget.generateClicked = self.generateButtonClicked dockWidget.viewBoxClicked = self.viewBoxButtonClicked dockWidget.copyToOthersClicked = self.copyToOthersClicked dockWidget.ui.setupUi(dockWidget) dockWidget.ui.generateButton.setEnabled(doc is not None) self.copyFromCfg() self.documentObserver = BoxerDocumentObserver() FreeCAD.addDocumentObserver(self.documentObserver) def copyFromCfg(self): ui = self.dockWidget.ui ui.outerWidth.setValue(self.cfg.outerWidth) ui.outerHeight.setValue(self.cfg.outerHeight) ui.outerDepth.setValue(self.cfg.outerDepth) ui.notchSize.setValue(self.cfg.notchUnitWidth) self.sideCheckBoxes = [ # yapf: disable (SideType.front, ui.frontCheckBox, ui.frontThickness), (SideType.back, ui.backCheckBox, ui.backThickness), (SideType.left, ui.leftCheckBox, ui.leftThickness), (SideType.right, ui.rightCheckBox, ui.rightThickness), (SideType.top, ui.topCheckBox, ui.topThickness), (SideType.bottom, ui.bottomCheckBox, ui.bottomThickness) # yapf: enable ] for (sideType, checkBox, thickness) in self.sideCheckBoxes: side = self.cfg.sideForType(sideType) checkBox.setChecked(side.enabled) thickness.setValue(side.thickness) def generateButtonClicked(self): ui = self.dockWidget.ui self.cfg.outerDimmensions(ui.outerWidth.value(), ui.outerHeight.value(), ui.outerDepth.value()) self.cfg.notchSize = self.dockWidget.ui.notchSize.value() for (sideType, checkBox, thickness) in self.sideCheckBoxes: side = self.cfg.sideForType(sideType) side.enabled = checkBox.isChecked() side.thickness = thickness.value() self.cfg.prt() doc = FreeCAD.ActiveDocument Boxer.removeEverything(doc) objects = Boxer.make(doc, self.cfg) itemsToSelect = objects['parts'] extrudes = objects['extrudes'] if extrudes is not None: itemsToSelect = extrudes Gui.Selection.clearSelection() [Gui.Selection.addSelection(e) for e in itemsToSelect.values()] Gui.SendMsgToActiveView("ViewSelection") Gui.Selection.clearSelection() # This results in some strange flickering. Perhaps all the items should be set visible=False while rotating Gui.SendMsgToActiveView("ViewAxo") def removeBox(self): doc = FreeCAD.ActiveDocument Boxer.removeEverything(doc) def viewBoxButtonClicked(self): Gui.SendMsgToActiveView("ViewFit") def copyToOthersClicked(self): front = self.cfg.sideForType(SideType.front) front.thickness = self.dockWidget.ui.frontThickness.value() for st in [st for st in SideType if st != SideType.front]: s = self.cfg.sideForType(st) s.thickness = front.thickness self.copyFromCfg() gui = BoxerGui() gui.setupGui()