diff options
-rw-r--r-- | Boxer.py | 217 | ||||
-rw-r--r-- | BoxerDockWidget.py | 78 | ||||
-rw-r--r-- | BoxerDockWidget.ui | 75 | ||||
-rw-r--r-- | BoxerGui.py | 31 | ||||
-rw-r--r-- | InitGui.py | 65 | ||||
-rw-r--r-- | README.md | 6 |
6 files changed, 249 insertions, 223 deletions
@@ -1,6 +1,3 @@ -# import Boxer; reload(Boxer); import BoxerGui as bg; reload(bg); - -#import FreeCAD from FreeCAD import Base, Vector, Matrix, Placement, Rotation import Part from enum import Enum @@ -88,10 +85,28 @@ class BoxSide(object): self.extrudeVector = Vector(extrudeVector) self.enabled = True self.sideTypesByLineDirections = sideTypesByLineDirections + self._thickness = 10 + + def left(self, lineDirection): + sideType = self.sideTypesByLineDirections[lineDirection][0] + return self.cfg.sides[sideType] - def opositeEnabled(self, lineDirection): - sideType = self.sideTypesByLineDirections[lineDirection] - return self.cfg.sides[sideType].enabled + def opposite(self, lineDirection): + sideType = self.sideTypesByLineDirections[lineDirection][1] + return self.cfg.sides[sideType] + + def right(self, lineDirection): + sideType = self.sideTypesByLineDirections[lineDirection][2] + return self.cfg.sides[sideType] + + @property + def thickness(self): + return self._thickness + + @thickness.setter + def thickness(self, thickness): + self._thickness = thickness + self.cfg.calculate() class NotchConfig(object): @@ -105,65 +120,60 @@ class NotchConfig(object): class BoxCfg(object): def __init__(self): - self._thickness = 10 - self._notchSize = 10 - self.generateExtrudes = True - self.generateCrossSections = False # Not very useful so off by default - self.outerDimmensions(100, 100, 100) + print('BoxCfg.__init__') + # yapf: disable self.sides = { SideType.front: BoxSide(self, 'Front', MeasurementDirection.width, MeasurementDirection.height, SideSize.large, (0, -1, 0), - {LineDirection.right: SideType.top, - LineDirection.down: SideType.right, - LineDirection.left: SideType.bottom, - LineDirection.up: SideType.left}), + {LineDirection.right: (SideType.left, SideType.top, SideType.right), + LineDirection.down: (SideType.top, SideType.right, SideType.bottom), + LineDirection.left: (SideType.right, SideType.bottom, SideType.left), + LineDirection.up: (SideType.bottom, SideType.left, SideType.top)}), SideType.back: BoxSide(self, 'Back', MeasurementDirection.width, MeasurementDirection.height, SideSize.large, (0, 1, 0), - {LineDirection.right: SideType.top, - LineDirection.down: SideType.right, - LineDirection.left: SideType.bottom, - LineDirection.up: SideType.left}), + {LineDirection.right: (SideType.right, SideType.top, SideType.left), + LineDirection.down: (SideType.top, SideType.left, SideType.bottom), + LineDirection.left: (SideType.left, SideType.bottom, SideType.right), + LineDirection.up: (SideType.bottom, SideType.right, SideType.top)}), SideType.left: BoxSide(self, 'Left', MeasurementDirection.depth, MeasurementDirection.height, SideSize.small, (-1, 0, 0), - {LineDirection.right: SideType.top, - LineDirection.down: SideType.front, - LineDirection.left: SideType.bottom, - LineDirection.up: SideType.back}), + {LineDirection.right: (SideType.front, SideType.top, SideType.back), + LineDirection.down: (SideType.top, SideType.back, SideType.bottom), + LineDirection.left: (SideType.back, SideType.bottom, SideType.front), + LineDirection.up: (SideType.bottom, SideType.front, SideType.top)}), SideType.right: BoxSide(self, 'Right', MeasurementDirection.depth, MeasurementDirection.height, SideSize.small, (1, 0, 0), - {LineDirection.right: SideType.top, - LineDirection.down: SideType.front, - LineDirection.left: SideType.bottom, - LineDirection.up: SideType.back}), + {LineDirection.right: (SideType.front, SideType.top, SideType.back), + LineDirection.down: (SideType.top, SideType.back, SideType.bottom), + LineDirection.left: (SideType.back, SideType.bottom, SideType.front), + LineDirection.up: (SideType.bottom, SideType.front, SideType.top)}), SideType.top: BoxSide(self, 'Top', MeasurementDirection.width, MeasurementDirection.depth, SideSize.medium, (0, 0, 1), - {LineDirection.right: SideType.back, - LineDirection.down: SideType.right, - LineDirection.left: SideType.back, - LineDirection.up: SideType.left}), + {LineDirection.right: (SideType.left, SideType.back, SideType.right), + LineDirection.down: (SideType.back, SideType.right, SideType.front), + LineDirection.left: (SideType.right, SideType.front, SideType.left), + LineDirection.up: (SideType.front, SideType.left, SideType.back)}), SideType.bottom: BoxSide(self, 'Bottom', MeasurementDirection.width, MeasurementDirection.depth, SideSize.medium, (0, 0, -1), - {LineDirection.right: SideType.back, - LineDirection.down: SideType.right, - LineDirection.left: SideType.back, - LineDirection.up: SideType.left}) + {LineDirection.right: (SideType.left, SideType.front, SideType.right), + LineDirection.down: (SideType.front, SideType.right, SideType.back), + LineDirection.left: (SideType.right, SideType.back, SideType.left), + LineDirection.up: (SideType.back, SideType.left, SideType.front)}) } # yapf: enable - self.calculate() - @property - def thickness(self): - return self._thickness + self._notchSize = 10 + self.outerDimmensions(100, 100, 100) - @thickness.setter - def thickness(self, thickness): - self._thickness = thickness self.calculate() -# TODO: replace this with a way to set number of notches in each direction -# @property -# def notches(self): -# return self._notches -# -# @notches.setter -# def notches(self, notches): -# self._notches = notches -# self.calculate() + self.generateExtrudes = True + self.generateCrossSections = False # Not very useful so off by default + + for s in self.sides: + s.enabled = False + self.sides[SideType.left].enabled = True + self.sides[SideType.left].thickness = 20 + self.sides[SideType.back].enabled = True + + @property + def thickness(self): + raise Exception('thickness is de-implemented') @property def notchSize(self): @@ -173,7 +183,8 @@ class BoxCfg(object): def notchSize(self, notchSize): self._notchSize = notchSize - def side(self, sideType): + def sideForType(self, sideType): + #print('sideForType: sideType=' + str(sideType)) return self.sides[sideType] def outerDimmensions(self, width, height, depth): @@ -181,7 +192,6 @@ class BoxCfg(object): self.outerHeight = height self.outerDepth = depth self.calculate() - return self def innerLength(self, lineDirection): if lineDirection == MeasurementDirection.width: @@ -209,21 +219,23 @@ class BoxCfg(object): return NotchConfig(count, size) def calculate(self): - self.innerWidth = self.outerWidth - 2 * self._thickness - self.innerHeight = self.outerHeight - 2 * self._thickness - self.innerDepth = self.outerDepth - 2 * self._thickness + self.innerWidth = self.outerWidth - self.sideForType(SideType.left).thickness - self.sideForType(SideType.right).thickness + self.innerHeight = self.outerHeight - self.sideForType(SideType.top).thickness - self.sideForType(SideType.bottom).thickness + self.innerDepth = self.outerDepth - self.sideForType(SideType.front).thickness - self.sideForType(SideType.back).thickness self._notchConfigWidth = self.createNotchConfig(self.innerWidth) self._notchConfigHeight = self.createNotchConfig(self.innerHeight) self._notchConfigDepth = self.createNotchConfig(self.innerDepth) def prt(self): print("Box configuration") - print("Thickness : " + str(self._thickness)) print("Outer w/h/d: " + str(self.outerWidth) + "/" + str(self.outerHeight) + "/" + str(self.outerDepth)) print("Inner w/h/d: " + str(self.innerWidth) + "/" + str(self.innerHeight) + "/" + str(self.innerDepth)) print("Sides:") - for (sideType, boxSide) in self.sides.items(): - print(" {:<9}: enabled: {}".format(boxSide.title, boxSide.enabled)) + for sideType in SideType: + boxSide = self.sideForType(sideType) + print(" " + str(boxSide.title)) + print(" enabled: " + str(boxSide.enabled)) + print(" thickness: " + str(boxSide.thickness)) print("Notch size : " + str(self._notchSize)) print(" Width: " + str(self.notchConfig(MeasurementDirection.width))) print(" Height: " + str(self.notchConfig(MeasurementDirection.height))) @@ -248,61 +260,69 @@ class VGen(object): self.move(self.dir.y_x * value, self.dir.y_y * value, 0) -def line(cfg, start, lineDirection, boxSide, notchConfig, innerLength): +# A line is though drawn from left to right, but is actually automatically +# rotated to go either right, down, left or up by the lineDirection parameter. +def line(cfg, start, boxSide, lineDirection, notchConfig, innerLength): sideSize = boxSide.sideSize + opposite = boxSide.opposite(lineDirection) + left = boxSide.left(lineDirection) + right = boxSide.right(lineDirection) + + print('line: lineDirection=' + str(lineDirection) + ', opposite=' + opposite.title + ', left=' + left.title + ', right=' + right.title) + inv = -1 if sideSize.inv(lineDirection) else 1 includeStart = sideSize.includeStart(lineDirection) - opositeEnabled = boxSide.opositeEnabled(lineDirection) - print("boxSide: " + str(boxSide)) - print("opositeEnabled: " + str(opositeEnabled)) - g = VGen(start, lineDirection) if includeStart: - g.moveX(cfg.thickness) + g.moveX(left.thickness) - if opositeEnabled: + if opposite.enabled: g.moveX(notchConfig.size) for i in range(0, notchConfig.count): - g.moveY(-cfg.thickness * inv) + g.moveY(-opposite.thickness * inv) g.moveX(notchConfig.size) - g.moveY(cfg.thickness * inv) + g.moveY(opposite.thickness * inv) g.moveX(notchConfig.size) else: - print("innerLength: " + str(innerLength)) g.moveX(innerLength) if includeStart: - g.moveX(cfg.thickness) + g.moveX(right.thickness) return g.list def makeBoxSide(cfg, boxSide): + print('makeBoxSide: boxSide=' + boxSide.title) + notchConfigX = cfg.notchConfig(boxSide.directionX) notchConfigY = cfg.notchConfig(boxSide.directionY) innerLengthX = cfg.innerLength(boxSide.directionX) innerLengthY = cfg.innerLength(boxSide.directionY) + opposite = boxSide.opposite(LineDirection.right) + left = boxSide.left(LineDirection.right) + # Offset the start so that the inner area starts at (0, 0) if boxSide.sideSize is SideSize.large: - start = Vector(-cfg.thickness, cfg.thickness, 0) + start = Vector(-left.thickness, opposite.thickness, 0) elif boxSide.sideSize is SideSize.medium: - start = Vector(-cfg.thickness, 0, 0) + start = Vector(-left.thickness, 0, 0) else: start = Vector(0, 0, 0) v = [start] - top = line(cfg, v[-1], LineDirection.right, boxSide, notchConfigX, innerLengthX) + top = line(cfg, v[-1], boxSide, LineDirection.right, notchConfigX, innerLengthX) v.extend(top) - left = line(cfg, v[-1], LineDirection.down, boxSide, notchConfigY, innerLengthY) + left = line(cfg, v[-1], boxSide, LineDirection.down, notchConfigY, innerLengthY) v.extend(left) - bottom = line(cfg, v[-1], LineDirection.left, boxSide, notchConfigX, innerLengthX) + bottom = line(cfg, v[-1], boxSide, LineDirection.left, notchConfigX, innerLengthX) v.extend(bottom) - right = line(cfg, v[-1], LineDirection.up, boxSide, notchConfigY, innerLengthY) + right = line(cfg, v[-1], boxSide, LineDirection.up, notchConfigY, innerLengthY) v.extend(right) return v @@ -312,16 +332,22 @@ def makeParts(doc, cfg): sep = cfg.outerWidth * 0.05 - def m(rotX, rotY, moveX, moveY, moveZ): - if rotX and rotY: - p = Placement(Vector(0, 0, 0), Rotation(Vector(1, 1, 1), 120)) - m = p.toMatrix() - else: - m = Matrix() - if rotX: - m.rotateX(math.radians(90)) - if rotY: - m.rotateY(math.radians(90)) + def m(rotX, rotY, rotZ, moveX, moveY, moveZ): + m = Matrix() + if rotX != 0: + x = Matrix() + x.rotateX(math.radians(rotX)) + m = m * x + + if rotY != 0: + y = Matrix() + y.rotateY(math.radians(rotY)) + m = m * y + + if rotZ != 0: + z = Matrix() + z.rotateZ(math.radians(rotZ)) + m = m * z v = Vector(cfg.innerWidth, cfg.innerDepth, cfg.innerHeight) v.scale(moveX, moveY, moveZ) @@ -331,17 +357,17 @@ def makeParts(doc, cfg): # yapf: disable ms = { - SideType.front: m(True, False, -0.5, -0.5, 0.5), - SideType.back: m(True, False, -0.5, 0.5, 0.5), - SideType.left: m(True, True, -0.5, -0.5, 0.5), - SideType.right: m(True, True, 0.5, -0.5, 0.5), - SideType.top: m(False, False, -0.5, 0.5, 0.5), - SideType.bottom: m(False, False, -0.5, 0.5, -0.5) + SideType.front: m( 90, 0, 0, -0.5, -0.5, 0.5), + SideType.back: m( 90, 180, 0, 0.5, 0.5, 0.5), + SideType.left: m( 90, 90, 0, -0.5, -0.5, 0.5), + SideType.right: m( 90, 90, 0, 0.5, -0.5, 0.5), + SideType.top: m( 0, 0, 0, -0.5, 0.5, 0.5), + SideType.bottom: m( 0, 180, 180, -0.5, -0.5, -0.5) } # yapf: enable for sideType in SideType: - boxSide = cfg.side(sideType) + boxSide = cfg.sideForType(sideType) if not boxSide.enabled: continue @@ -358,11 +384,11 @@ def makeParts(doc, cfg): def makeExtrudes(doc, parts, cfg): def makeExtrude(doc, cfg, sideType): - side = cfg.side(sideType) + side = cfg.sideForType(sideType) part = parts[sideType] extrude = doc.addObject("Part::Extrusion", side.title + "_Extrude") extrude.Base = part - extrude.Dir = side.extrudeVector * cfg.thickness + extrude.Dir = side.extrudeVector * side.thickness extrude.Solid = (True) extrude.TaperAngle = (0) extrude.Label = side.title + ' Extrude' @@ -390,6 +416,7 @@ def makeCrossSections(doc, cfg, extrudes): wires = list() shape = extrude.Shape + raise Exception('cfg.thickness is de-implemented') for i in shape.slice(Base.Vector(0, 0, 1), cfg.thickness / 2): wires.append(i) diff --git a/BoxerDockWidget.py b/BoxerDockWidget.py index 00c2350..59f0055 100644 --- a/BoxerDockWidget.py +++ b/BoxerDockWidget.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'BoxerDockWidget.ui' # -# Created: Sun Jun 12 11:53:34 2016 +# Created: Tue Jun 14 19:26:17 2016 # by: pyside-uic 0.2.15 running on PySide 1.2.2 # # WARNING! All changes made in this file will be lost! @@ -121,27 +121,48 @@ class Ui_BoxerDockWidget(object): self.groupBox = QtGui.QGroupBox(self.dockWidgetContents) self.groupBox.setEnabled(True) self.groupBox.setObjectName("groupBox") - self.verticalLayout_3 = QtGui.QVBoxLayout(self.groupBox) - self.verticalLayout_3.setObjectName("verticalLayout_3") + self.gridLayout = QtGui.QGridLayout(self.groupBox) + self.gridLayout.setObjectName("gridLayout") + self.leftCheckBox = QtGui.QCheckBox(self.groupBox) + self.leftCheckBox.setObjectName("leftCheckBox") + self.gridLayout.addWidget(self.leftCheckBox, 3, 0, 1, 1) + self.bottomCheckBox = QtGui.QCheckBox(self.groupBox) + self.bottomCheckBox.setObjectName("bottomCheckBox") + self.gridLayout.addWidget(self.bottomCheckBox, 6, 0, 1, 1) + self.rightCheckBox = QtGui.QCheckBox(self.groupBox) + self.rightCheckBox.setObjectName("rightCheckBox") + self.gridLayout.addWidget(self.rightCheckBox, 4, 0, 1, 1) self.frontCheckBox = QtGui.QCheckBox(self.groupBox) self.frontCheckBox.setTristate(False) self.frontCheckBox.setObjectName("frontCheckBox") - self.verticalLayout_3.addWidget(self.frontCheckBox) + self.gridLayout.addWidget(self.frontCheckBox, 1, 0, 1, 1) self.backCheckBox = QtGui.QCheckBox(self.groupBox) self.backCheckBox.setObjectName("backCheckBox") - self.verticalLayout_3.addWidget(self.backCheckBox) - self.leftCheckBox = QtGui.QCheckBox(self.groupBox) - self.leftCheckBox.setObjectName("leftCheckBox") - self.verticalLayout_3.addWidget(self.leftCheckBox) - self.rightCheckBox = QtGui.QCheckBox(self.groupBox) - self.rightCheckBox.setObjectName("rightCheckBox") - self.verticalLayout_3.addWidget(self.rightCheckBox) + self.gridLayout.addWidget(self.backCheckBox, 2, 0, 1, 1) self.topCheckBox = QtGui.QCheckBox(self.groupBox) self.topCheckBox.setObjectName("topCheckBox") - self.verticalLayout_3.addWidget(self.topCheckBox) - self.bottomCheckBox = QtGui.QCheckBox(self.groupBox) - self.bottomCheckBox.setObjectName("bottomCheckBox") - self.verticalLayout_3.addWidget(self.bottomCheckBox) + self.gridLayout.addWidget(self.topCheckBox, 5, 0, 1, 1) + self.label_3 = QtGui.QLabel(self.groupBox) + self.label_3.setObjectName("label_3") + self.gridLayout.addWidget(self.label_3, 0, 1, 1, 1) + self.frontThickness = QtGui.QSpinBox(self.groupBox) + self.frontThickness.setObjectName("frontThickness") + self.gridLayout.addWidget(self.frontThickness, 1, 1, 1, 1) + self.backThickness = QtGui.QSpinBox(self.groupBox) + self.backThickness.setObjectName("backThickness") + self.gridLayout.addWidget(self.backThickness, 2, 1, 1, 1) + self.leftThickness = QtGui.QSpinBox(self.groupBox) + self.leftThickness.setObjectName("leftThickness") + self.gridLayout.addWidget(self.leftThickness, 3, 1, 1, 1) + self.rightThickness = QtGui.QSpinBox(self.groupBox) + self.rightThickness.setObjectName("rightThickness") + self.gridLayout.addWidget(self.rightThickness, 4, 1, 1, 1) + self.topThickness = QtGui.QSpinBox(self.groupBox) + self.topThickness.setObjectName("topThickness") + self.gridLayout.addWidget(self.topThickness, 5, 1, 1, 1) + self.bottomThickness = QtGui.QSpinBox(self.groupBox) + self.bottomThickness.setObjectName("bottomThickness") + self.gridLayout.addWidget(self.bottomThickness, 6, 1, 1, 1) self.verticalLayout.addWidget(self.groupBox) self.generateButton = QtGui.QPushButton(self.dockWidgetContents) self.generateButton.setEnabled(False) @@ -177,12 +198,18 @@ class Ui_BoxerDockWidget(object): BoxerDockWidget.setTabOrder(self.innerDepth, self.notchSize) BoxerDockWidget.setTabOrder(self.notchSize, self.thickness) BoxerDockWidget.setTabOrder(self.thickness, self.frontCheckBox) - BoxerDockWidget.setTabOrder(self.frontCheckBox, self.backCheckBox) - BoxerDockWidget.setTabOrder(self.backCheckBox, self.leftCheckBox) - BoxerDockWidget.setTabOrder(self.leftCheckBox, self.rightCheckBox) - BoxerDockWidget.setTabOrder(self.rightCheckBox, self.topCheckBox) - BoxerDockWidget.setTabOrder(self.topCheckBox, self.bottomCheckBox) - BoxerDockWidget.setTabOrder(self.bottomCheckBox, self.generateButton) + BoxerDockWidget.setTabOrder(self.frontCheckBox, self.frontThickness) + BoxerDockWidget.setTabOrder(self.frontThickness, self.backCheckBox) + BoxerDockWidget.setTabOrder(self.backCheckBox, self.backThickness) + BoxerDockWidget.setTabOrder(self.backThickness, self.leftCheckBox) + BoxerDockWidget.setTabOrder(self.leftCheckBox, self.leftThickness) + BoxerDockWidget.setTabOrder(self.leftThickness, self.rightCheckBox) + BoxerDockWidget.setTabOrder(self.rightCheckBox, self.rightThickness) + BoxerDockWidget.setTabOrder(self.rightThickness, self.topCheckBox) + BoxerDockWidget.setTabOrder(self.topCheckBox, self.topThickness) + BoxerDockWidget.setTabOrder(self.topThickness, self.bottomCheckBox) + BoxerDockWidget.setTabOrder(self.bottomCheckBox, self.bottomThickness) + BoxerDockWidget.setTabOrder(self.bottomThickness, self.generateButton) BoxerDockWidget.setTabOrder(self.generateButton, self.fitViewButton) def retranslateUi(self, BoxerDockWidget): @@ -194,13 +221,14 @@ class Ui_BoxerDockWidget(object): self.outerLabel.setText(QtGui.QApplication.translate("BoxerDockWidget", "Outer", None, QtGui.QApplication.UnicodeUTF8)) self.depthLabel.setText(QtGui.QApplication.translate("BoxerDockWidget", "Depth", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate("BoxerDockWidget", "Thickness", None, QtGui.QApplication.UnicodeUTF8)) - self.groupBox.setTitle(QtGui.QApplication.translate("BoxerDockWidget", "Enabled sides", None, QtGui.QApplication.UnicodeUTF8)) - self.frontCheckBox.setText(QtGui.QApplication.translate("BoxerDockWidget", "Front", None, QtGui.QApplication.UnicodeUTF8)) - self.backCheckBox.setText(QtGui.QApplication.translate("BoxerDockWidget", "Back", None, QtGui.QApplication.UnicodeUTF8)) + self.groupBox.setTitle(QtGui.QApplication.translate("BoxerDockWidget", "Side configuration", None, QtGui.QApplication.UnicodeUTF8)) self.leftCheckBox.setText(QtGui.QApplication.translate("BoxerDockWidget", "Left", None, QtGui.QApplication.UnicodeUTF8)) + self.bottomCheckBox.setText(QtGui.QApplication.translate("BoxerDockWidget", "Bottom", None, QtGui.QApplication.UnicodeUTF8)) self.rightCheckBox.setText(QtGui.QApplication.translate("BoxerDockWidget", "Right", None, QtGui.QApplication.UnicodeUTF8)) + self.frontCheckBox.setText(QtGui.QApplication.translate("BoxerDockWidget", "Front", None, QtGui.QApplication.UnicodeUTF8)) + self.backCheckBox.setText(QtGui.QApplication.translate("BoxerDockWidget", "Back", None, QtGui.QApplication.UnicodeUTF8)) self.topCheckBox.setText(QtGui.QApplication.translate("BoxerDockWidget", "Top", None, QtGui.QApplication.UnicodeUTF8)) - self.bottomCheckBox.setText(QtGui.QApplication.translate("BoxerDockWidget", "Bottom", None, QtGui.QApplication.UnicodeUTF8)) + self.label_3.setText(QtGui.QApplication.translate("BoxerDockWidget", "Thickness", None, QtGui.QApplication.UnicodeUTF8)) self.generateButton.setText(QtGui.QApplication.translate("BoxerDockWidget", "Generate", None, QtGui.QApplication.UnicodeUTF8)) self.fitViewButton.setText(QtGui.QApplication.translate("BoxerDockWidget", "Fit all", None, QtGui.QApplication.UnicodeUTF8)) diff --git a/BoxerDockWidget.ui b/BoxerDockWidget.ui index 5b24987..2b631f7 100644 --- a/BoxerDockWidget.ui +++ b/BoxerDockWidget.ui @@ -204,54 +204,79 @@ <bool>true</bool> </property> <property name="title"> - <string>Enabled sides</string> + <string>Side configuration</string> </property> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <item> - <widget class="QCheckBox" name="frontCheckBox"> + <layout class="QGridLayout" name="gridLayout"> + <item row="3" column="0"> + <widget class="QCheckBox" name="leftCheckBox"> <property name="text"> - <string>Front</string> + <string>Left</string> </property> - <property name="tristate"> - <bool>false</bool> + </widget> + </item> + <item row="6" column="0"> + <widget class="QCheckBox" name="bottomCheckBox"> + <property name="text"> + <string>Bottom</string> </property> </widget> </item> - <item> - <widget class="QCheckBox" name="backCheckBox"> + <item row="4" column="0"> + <widget class="QCheckBox" name="rightCheckBox"> <property name="text"> - <string>Back</string> + <string>Right</string> </property> </widget> </item> - <item> - <widget class="QCheckBox" name="leftCheckBox"> + <item row="1" column="0"> + <widget class="QCheckBox" name="frontCheckBox"> <property name="text"> - <string>Left</string> + <string>Front</string> + </property> + <property name="tristate"> + <bool>false</bool> </property> </widget> </item> - <item> - <widget class="QCheckBox" name="rightCheckBox"> + <item row="2" column="0"> + <widget class="QCheckBox" name="backCheckBox"> <property name="text"> - <string>Right</string> + <string>Back</string> </property> </widget> </item> - <item> + <item row="5" column="0"> <widget class="QCheckBox" name="topCheckBox"> <property name="text"> <string>Top</string> </property> </widget> </item> - <item> - <widget class="QCheckBox" name="bottomCheckBox"> + <item row="0" column="1"> + <widget class="QLabel" name="label_3"> <property name="text"> - <string>Bottom</string> + <string>Thickness</string> </property> </widget> </item> + <item row="1" column="1"> + <widget class="QSpinBox" name="frontThickness"/> + </item> + <item row="2" column="1"> + <widget class="QSpinBox" name="backThickness"/> + </item> + <item row="3" column="1"> + <widget class="QSpinBox" name="leftThickness"/> + </item> + <item row="4" column="1"> + <widget class="QSpinBox" name="rightThickness"/> + </item> + <item row="5" column="1"> + <widget class="QSpinBox" name="topThickness"/> + </item> + <item row="6" column="1"> + <widget class="QSpinBox" name="bottomThickness"/> + </item> </layout> </widget> </item> @@ -317,11 +342,17 @@ <tabstop>notchSize</tabstop> <tabstop>thickness</tabstop> <tabstop>frontCheckBox</tabstop> + <tabstop>frontThickness</tabstop> <tabstop>backCheckBox</tabstop> + <tabstop>backThickness</tabstop> <tabstop>leftCheckBox</tabstop> + <tabstop>leftThickness</tabstop> <tabstop>rightCheckBox</tabstop> + <tabstop>rightThickness</tabstop> <tabstop>topCheckBox</tabstop> + <tabstop>topThickness</tabstop> <tabstop>bottomCheckBox</tabstop> + <tabstop>bottomThickness</tabstop> <tabstop>generateButton</tabstop> <tabstop>fitViewButton</tabstop> </tabstops> @@ -335,7 +366,7 @@ <hints> <hint type="sourcelabel"> <x>233</x> - <y>434</y> + <y>502</y> </hint> <hint type="destinationlabel"> <x>151</x> @@ -351,7 +382,7 @@ <hints> <hint type="sourcelabel"> <x>269</x> - <y>476</y> + <y>544</y> </hint> <hint type="destinationlabel"> <x>219</x> diff --git a/BoxerGui.py b/BoxerGui.py index 3c949da..5e0ce43 100644 --- a/BoxerGui.py +++ b/BoxerGui.py @@ -20,15 +20,14 @@ class BoxerDocumentObserver: class BoxerGui(object): def __init__(self): - self.cfg = Boxer.BoxCfg().outerDimmensions(100, 100, 100) + self.cfg = Boxer.BoxCfg() + self.cfg.outerDimmensions(100, 50, 200) self.cfg.notchUnitWidth = 10 - self.cfg.thickness = 10 def setupGui(self): doc = FreeCAD.ActiveDocument self.dockWidget = dockWidget = QtGui.QDockWidget() - dockWidget.setWindowTitle("Box config") dockWidget.ui = BoxerDockWidget.Ui_BoxerDockWidget() dockWidget.generateClicked = self.generateButtonClicked dockWidget.fitAllClicked = self.fitAllButtonClicked @@ -37,22 +36,23 @@ class BoxerGui(object): dockWidget.ui.outerWidth.setValue(self.cfg.outerWidth) dockWidget.ui.outerHeight.setValue(self.cfg.outerHeight) dockWidget.ui.outerDepth.setValue(self.cfg.outerDepth) - dockWidget.ui.thickness.setValue(self.cfg.thickness) dockWidget.ui.notchSize.setValue(self.cfg.notchUnitWidth) self.sideCheckBoxes = [ # yapf: disable - (SideType.front, dockWidget.ui.frontCheckBox), - (SideType.back, dockWidget.ui.backCheckBox), - (SideType.left, dockWidget.ui.leftCheckBox), - (SideType.right, dockWidget.ui.rightCheckBox), - (SideType.top, dockWidget.ui.topCheckBox), - (SideType.bottom, dockWidget.ui.bottomCheckBox) + (SideType.front, dockWidget.ui.frontCheckBox, dockWidget.ui.frontThickness), + (SideType.back, dockWidget.ui.backCheckBox, dockWidget.ui.backThickness), + (SideType.left, dockWidget.ui.leftCheckBox, dockWidget.ui.leftThickness), + (SideType.right, dockWidget.ui.rightCheckBox, dockWidget.ui.rightThickness), + (SideType.top, dockWidget.ui.topCheckBox, dockWidget.ui.topThickness), + (SideType.bottom, dockWidget.ui.bottomCheckBox, dockWidget.ui.bottomThickness) # yapf: enable ] - for (sideType, checkBox) in self.sideCheckBoxes: - checkBox.setChecked(self.cfg.side(sideType).enabled) + for (sideType, checkBox, thickness) in self.sideCheckBoxes: + side = self.cfg.sideForType(sideType) + checkBox.setChecked(side.enabled) + thickness.setValue(side.thickness) self.documentObserver = BoxerDocumentObserver() FreeCAD.addDocumentObserver(self.documentObserver) @@ -61,11 +61,12 @@ class BoxerGui(object): ui = self.dockWidget.ui self.cfg.outerDimmensions(ui.outerWidth.value(), ui.outerHeight.value(), ui.outerDepth.value()) - self.cfg.thickness = self.dockWidget.ui.thickness.value() self.cfg.notchSize = self.dockWidget.ui.notchSize.value() - for (sideType, checkBox) in self.sideCheckBoxes: - self.cfg.side(sideType).enabled = checkBox.isChecked() + 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 @@ -1,45 +1,3 @@ -class MakeBoxCommandClass(): - def GetResources(self): - return { #'Pixmap' : os.path.join( iconPath , 'AddWall.svg') , # the name of a svg file available in the resources - 'MenuText': "Make Box", - 'ToolTip': "Extends a wall from a side face of metal sheet" - } - - def Activated(self): - from Boxer import BoxCfg, makeBox - # TODO: put all objects in a group: - # group = doc.addObject("App::DocumentObjectGroup","Group") - - cfg = BoxCfg().outerDimmensions(300, 100, 50) - # cfg.notches = 2 - cfg.notchUnitWidth = 10 - cfg.thickness = 10 - cfg.prt() - - doc = FreeCAD.ActiveDocument - makeBox(doc, cfg) - - doc.recompute() - Gui.SendMsgToActiveView("ViewFit") - - return - - def IsActive(self): - return FreeCAD.ActiveDocument is not None - - -class RemoveBoxCommandClass(): - def GetResources(self): - return {'MenuText': "Remove Box", 'ToolTip': "Remove the box"} - - def Activated(self): - import BoxerGui - BoxerGui.gui.removeBox() - - def IsActive(self): - return FreeCAD.ActiveDocument is not None - - class ShowPanelCommandClass(): def GetResources(self): return {'MenuText': "Show Panel"} @@ -49,29 +7,10 @@ class ShowPanelCommandClass(): import BoxerGui print('ShowPanelCommandClass.Activated') - #dockWidget = QtGui.QDockWidget() - #dockWidget.setWindowTitle("Boxer 3") - #dockWidget.resize(656, 300) - #dockWidget.setObjectName("BoxerDockWidget") - #verticalLayout = QtGui.QVBoxLayout(dockWidget) - #verticalLayout.setObjectName("verticalLayout") - #tabSizeLabel = QtGui.QLabel(dockWidget) - #tabSizeLabel.setObjectName("tabSizeLabel") - #tabSizeLabel.setText("Tab size") - window = FreeCADGui.getMainWindow() window.addDockWidget(QtCore.Qt.RightDockWidgetArea, BoxerGui.gui.dockWidget) BoxerGui.gui.dockWidget.show() - # app = QtGui.qApp - # window = app.activeWindow() - # window.addDockWidget(QtCore.Qt.RightDockWidgetArea, dockWidget) - - # d = QtGui.QWidget() - # d.ui = BoxerDockWidget.Ui_BoxerDockWidget() - # d.ui.setupUi(d) - # d.show() - return def IsActive(self): @@ -84,7 +23,7 @@ class BoxerWorkbench(Workbench): ToolTip = "Box Maker" def Initialize(self): - self.list = ["BoxerMakeBox", "BoxerRemoveBox", "BoxerShowPanel"] + self.list = ["BoxerShowPanel"] self.appendToolbar("Boxer Commands", self.list) import BoxerGui # Loads the Boxer modules @@ -102,7 +41,5 @@ class BoxerWorkbench(Workbench): return "Gui::PythonWorkbench" -Gui.addCommand('BoxerMakeBox', MakeBoxCommandClass()) -Gui.addCommand('BoxerRemoveBox', RemoveBoxCommandClass()) Gui.addCommand('BoxerShowPanel', ShowPanelCommandClass()) Gui.addWorkbench(BoxerWorkbench()) @@ -9,10 +9,12 @@ When developing this module make sure you have the *Python console* and *report To reload the module when running: # This is only needed once - import Boxer; import BoxerGui; import BoxerDockWidget + def r(): + import Boxer; import BoxerGui; import BoxerDockWidget + reload(Boxer); reload(BoxerGui); reload(BoxerDockWidget) # Reloads all the modules - reload(Boxer); reload(BoxerGui); reload(BoxerDockWidget) + r() ## Possible new features |