diff --git a/src/Mod/Draft/draftGui.py b/src/Mod/Draft/draftGui.py index c699ae51e..0f81ed4fb 100644 --- a/src/Mod/Draft/draftGui.py +++ b/src/Mod/Draft/draftGui.py @@ -64,7 +64,10 @@ class todo: for f, arg in todo.itinerary: try: # print "debug: executing",f - f(arg) + if arg: + f(arg) + else: + f() except: wrn = "[Draft.todo] Unexpected error:" + sys.exc_info()[0] FreeCAD.Console.PrintWarning (wrn) @@ -72,10 +75,14 @@ class todo: if todo.commitlist: for name,func in todo.commitlist: # print "debug: committing ",str(name) - name = str(name) - FreeCAD.ActiveDocument.openTransaction(name) - func() - FreeCAD.ActiveDocument.commitTransaction() + try: + name = str(name) + FreeCAD.ActiveDocument.openTransaction(name) + func() + FreeCAD.ActiveDocument.commitTransaction() + except: + wrn = "[Draft.todo] Unexpected error:" + sys.exc_info()[0] + FreeCAD.Console.PrintWarning (wrn) todo.commitlist = [] @staticmethod @@ -160,6 +167,7 @@ class DraftToolBar: self.textbuffer = [] self.crossedViews = [] self.isTaskOn = False + self.fillmode = Draft.getParam("fillmode") if self.taskmode: # only a dummy widget, since widgets are created on demand @@ -289,7 +297,7 @@ class DraftToolBar: self.radiusValue = self._lineedit("radiusValue", self.layout, width=60) self.radiusValue.setText("0.00") self.isRelative = self._checkbox("isRelative",self.layout,checked=True) - self.hasFill = self._checkbox("hasFill",self.layout,checked=Draft.getParam("fillmode")) + self.hasFill = self._checkbox("hasFill",self.layout,checked=self.fillmode) self.continueCmd = self._checkbox("continueCmd",self.layout,checked=False) self.occOffset = self._checkbox("occOffset",self.layout,checked=False) self.undoButton = self._pushbutton("undoButton", self.layout, icon='Draft_Rotate') @@ -339,6 +347,7 @@ class DraftToolBar: QtCore.QObject.connect(self.xzButton,QtCore.SIGNAL("clicked()"),self.selectXZ) QtCore.QObject.connect(self.yzButton,QtCore.SIGNAL("clicked()"),self.selectYZ) QtCore.QObject.connect(self.continueCmd,QtCore.SIGNAL("stateChanged(int)"),self.setContinue) + QtCore.QObject.connect(self.hasFill,QtCore.SIGNAL("stateChanged(int)"),self.setFill) QtCore.QObject.connect(self.currentViewButton,QtCore.SIGNAL("clicked()"),self.selectCurrentView) QtCore.QObject.connect(self.resetPlaneButton,QtCore.SIGNAL("clicked()"),self.selectResetPlane) QtCore.QObject.connect(self.xValue,QtCore.SIGNAL("escaped()"),self.finish) @@ -527,7 +536,7 @@ class DraftToolBar: def offUi(self): if self.taskmode: self.isTaskOn = False - FreeCADGui.Control.closeDialog() + todo.delay(FreeCADGui.Control.closeDialog,None) self.baseWidget = QtGui.QWidget() # print "UI turned off" else: @@ -662,12 +671,36 @@ class DraftToolBar: self.addButton.setEnabled(mode) self.delButton.setEnabled(mode) + def setNextFocus(self): + def isThere(widget): + if widget.isEnabled() and widget.isVisible(): + return True + else: + return False + if (not self.taskmode) or self.isTaskOn: + if isThere(self.xValue): + self.xValue.setFocus() + self.xValue.selectAll() + elif isThere(self.yValue): + self.yValue.setFocus() + self.yValue.selectAll() + elif isThere(self.zValue): + self.zValue.setFocus() + self.zValue.selectAll() + elif isThere(self.radiusValue): + self.radiusValue.setFocus() + self.radiusValue.selectAll() + + def setRelative(self): + if (not self.taskmode) or self.isTaskOn: + self.isRelative.show() + def relocate(self): "relocates the right-aligned buttons depending on the toolbar size" if self.baseWidget.geometry().width() < 400: self.layout.setDirection(QtGui.QBoxLayout.TopToBottom) else: - self.layout.setDirection(QtGui.QBoxLayout.LeftToRight) + self.layout.setDirection(QtGui.QBoxLayout.LeftToRight) #--------------------------------------------------------------------------- @@ -726,6 +759,9 @@ class DraftToolBar: def setContinue(self,val): self.continueMode = bool(val) + def setFill(self,val): + self.fillmode = bool(val) + def apply(self): for i in FreeCADGui.Selection.getSelection(): Draft.formatObject(i) diff --git a/src/Mod/Draft/draftTools.py b/src/Mod/Draft/draftTools.py index 7d72d6ed2..d813dc26d 100755 --- a/src/Mod/Draft/draftTools.py +++ b/src/Mod/Draft/draftTools.py @@ -1308,7 +1308,7 @@ class Line(Creator): if (len(self.node) > 1): self.commit(translate("draft","Create Wire"), partial(Draft.makeWire,self.node,closed, - face=self.ui.hasFill.isChecked(),support=self.support)) + face=self.ui.fillmode,support=self.support)) if self.ui: self.linetrack.finalize() self.constraintrack.finalize() @@ -1416,16 +1416,7 @@ class Line(Creator): self.drawSegment(point) if (not self.isWire and len(self.node) == 2): self.finish(False,cont=True) - if self.ui.xValue.isEnabled(): - self.ui.xValue.setFocus() - self.ui.xValue.selectAll() - elif self.ui.yValue.isEnabled(): - self.ui.yValue.setFocus() - self.ui.yValue.selectAll() - else: - self.ui.zValue.setFocus() - self.ui.zValue.selectAll() - + self.ui.setNextFocus() class Wire(Line): "a FreeCAD command for creating a wire" @@ -1520,9 +1511,12 @@ class BSpline(Line): if (len(self.node) > 1): old = self.obj.Name self.doc.removeObject(old) - self.commit(translate("draft","Create BSpline"), - partial(Draft.makeBSpline,self.node,closed, - face=self.ui.hasFill.isChecked(),support=self.support)) + try: + self.commit(translate("draft","Create BSpline"), + partial(Draft.makeBSpline,self.node,closed, + face=self.ui.fillmode,support=self.support)) + except: + print "Draft: error delaying commit" if self.ui: self.bsplinetrack.finalize() self.constraintrack.finalize() @@ -1632,10 +1626,14 @@ class Rectangle(Creator): if abs(fcvec.angle(p2.sub(p1),plane.v,plane.axis)) > 1: height = -height p = plane.getRotation() p.move(p1) - self.commit(translate("draft","Create Rectangle"), - partial(Draft.makeRectangle,length,height, - p,self.ui.hasFill.isChecked(),support=self.support)) + try: + self.commit(translate("draft","Create Rectangle"), + partial(Draft.makeRectangle,length,height, + p,self.ui.fillmode,support=self.support)) + except: + print "Draft: error delaying commit" self.finish(cont=True) + print "all done" def action(self,arg): "scene event handler" @@ -1667,7 +1665,7 @@ class Rectangle(Creator): self.createObject() else: msg(translate("draft", "Pick opposite point:\n")) - self.ui.isRelative.show() + self.ui.setRelative() self.rect.setorigin(point) self.rect.on() self.planetrack.set(point) @@ -1903,17 +1901,22 @@ class Arc(Creator): p = plane.getRotation() p.move(self.center) if self.closedCircle: - self.commit(translate("draft","Create Circle"), - partial(Draft.makeCircle,self.rad,p, - self.ui.hasFill.isChecked(),support=self.support)) + try: + self.commit(translate("draft","Create Circle"), + partial(Draft.makeCircle,self.rad,p, + self.ui.fillmode,support=self.support)) + except: + print "Draft: error delaying commit" else: sta = math.degrees(self.firstangle) end = math.degrees(self.firstangle+self.angle) - print "debug:",sta, end if end < sta: sta,end = end,sta - self.commit(translate("draft","Create Arc"), - partial(Draft.makeCircle,self.rad,p,self.ui.hasFill.isChecked(), - sta,end,support=self.support)) + try: + self.commit(translate("draft","Create Arc"), + partial(Draft.makeCircle,self.rad,p,self.ui.fillmode, + sta,end,support=self.support)) + except: + print "Draft: error delaying commit" self.finish(cont=True) def numericInput(self,numx,numy,numz): @@ -1924,7 +1927,7 @@ class Arc(Creator): self.arctrack.on() self.ui.radiusUi() self.step = 1 - self.ui.radiusValue.setFocus() + self.ui.setNextFocus() msg(translate("draft", "Pick radius:\n")) def numericRadius(self,rad): @@ -1948,14 +1951,14 @@ class Arc(Creator): else: self.step = 2 self.arctrack.setCenter(self.center) - self.ui.labelRadius.setText("Start angle") + self.ui.labelRadius.setText(str(translate("draft", "Start Angle"))) self.linetrack.p1(self.center) self.linetrack.on() self.ui.radiusValue.setText("") self.ui.radiusValue.setFocus() msg(translate("draft", "Pick start angle:\n")) elif (self.step == 2): - self.ui.labelRadius.setText("Aperture") + self.ui.labelRadius.setText(str(translate("draft", "Aperture"))) self.firstangle = math.radians(rad) if fcvec.equals(plane.axis, Vector(1,0,0)): u = Vector(0,self.rad,0) else: u = fcvec.scaleTo(Vector(1,0,0).cross(plane.axis), self.rad) @@ -2143,7 +2146,7 @@ class Polygon(Creator): p.move(self.center) self.commit(translate("draft","Create Polygon"), partial(Draft.makePolygon,self.ui.numFaces.value(),self.rad, - True,p,face=self.ui.hasFill.isChecked(),support=self.support)) + True,p,face=self.ui.fillmode,support=self.support)) self.finish(cont=True) def numericInput(self,numx,numy,numz):