From 7fac74a211f7e4fad5145c81dbec6d75ccecf5d8 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Tue, 9 May 2017 23:36:41 -0300 Subject: [PATCH] Draft: New button to modify working plane during Wire drawing --- src/Mod/Draft/DraftGui.py | 14 ++++++++++++-- src/Mod/Draft/DraftTools.py | 26 +++++++++++++++++++++++++- src/Mod/Draft/WorkingPlane.py | 3 +++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/Mod/Draft/DraftGui.py b/src/Mod/Draft/DraftGui.py index eb8403775e..937d74964c 100644 --- a/src/Mod/Draft/DraftGui.py +++ b/src/Mod/Draft/DraftGui.py @@ -476,6 +476,7 @@ class DraftToolBar: self.finishButton = self._pushbutton("finishButton", self.layout, icon='Draft_Finish') self.closeButton = self._pushbutton("closeButton", self.layout, icon='Draft_Lock') self.wipeButton = self._pushbutton("wipeButton", self.layout, icon='Draft_Wipe') + self.orientWPButton = self._pushbutton("orientWPButton", self.layout, icon='Draft_SelectPlane') self.selectButton = self._pushbutton("selectButton", self.layout, icon='view-select') self.xyButton = self._pushbutton("xyButton", self.layout) self.xzButton = self._pushbutton("xzButton", self.layout) @@ -540,6 +541,7 @@ class DraftToolBar: QtCore.QObject.connect(self.finishButton,QtCore.SIGNAL("pressed()"),self.finish) QtCore.QObject.connect(self.closeButton,QtCore.SIGNAL("pressed()"),self.closeLine) QtCore.QObject.connect(self.wipeButton,QtCore.SIGNAL("pressed()"),self.wipeLine) + QtCore.QObject.connect(self.orientWPButton,QtCore.SIGNAL("pressed()"),self.orientWP) QtCore.QObject.connect(self.undoButton,QtCore.SIGNAL("pressed()"),self.undoSegment) QtCore.QObject.connect(self.selectButton,QtCore.SIGNAL("pressed()"),self.selectEdge) QtCore.QObject.connect(self.xyButton,QtCore.SIGNAL("clicked()"),self.selectXY) @@ -686,6 +688,8 @@ class DraftToolBar: self.closeButton.setToolTip(translate("draft", "Finishes and closes the current line (C)")) self.wipeButton.setText(translate("draft", "&Wipe")) self.wipeButton.setToolTip(translate("draft", "Wipes the existing segments of this line and starts again from the last point (W)")) + self.orientWPButton.setText(translate("draft", "&Set WP")) + self.orientWPButton.setToolTip(translate("draft", "Reorients the working plane on the last segment (S)")) self.selectButton.setText(translate("draft", "&Select edge")) self.selectButton.setToolTip(translate("draft", "Selects an existing edge to be measured by this dimension (E)")) self.numFacesLabel.setText(translate("draft", "Sides")) @@ -702,7 +706,7 @@ class DraftToolBar: self.resetPlaneButton.setText(translate("draft", "Auto")) self.resetPlaneButton.setToolTip(translate("draft", "Do not project points to a drawing plane")) self.isCopy.setText(translate("draft", "C&opy")) - self.isCopy.setToolTip(translate("draft", "If checked, objects will be copied instead of moved (C)")) + self.isCopy.setToolTip(translate("draft", "If checked, objects will be copied instead of moved (O)")) self.SStringValue.setToolTip(translate("draft", "Text string to draw")) self.labelSString.setText(translate("draft", "String")) self.SSizeValue.setToolTip(translate("draft", "Height of text")) @@ -844,6 +848,7 @@ class DraftToolBar: self.finishButton.show() self.closeButton.show() self.wipeButton.show() + self.orientWPButton.show() self.undoButton.show() self.continueCmd.show() @@ -915,6 +920,7 @@ class DraftToolBar: self.undoButton.hide() self.closeButton.hide() self.wipeButton.hide() + self.orientWPButton.hide() self.selectButton.hide() self.xyButton.hide() self.xzButton.hide() @@ -1400,7 +1406,11 @@ class DraftToolBar: def wipeLine(self): "wipes existing segments of a line" self.sourceCmd.wipe() - + + def orientWP(self): + "reorients the current working plane" + self.sourceCmd.orientWP() + def selectEdge(self): "allows the dimension command to select an edge" if hasattr(self.sourceCmd,"selectEdge"): diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index c1679670d3..f6d8313802 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -480,7 +480,8 @@ class Line(Creator): def Activated(self,name=translate("draft","Line")): Creator.Activated(self,name) if self.doc: - self.obj = None + self.obj = None # stores the temp shape + self.oldWP = None # stores the WP if we modify it if self.isWire: self.ui.wireUi(name) else: @@ -498,6 +499,12 @@ class Line(Creator): old = self.obj.Name todo.delay(self.doc.removeObject,old) self.obj = None + if self.oldWP: + FreeCAD.DraftWorkingPlane = self.oldWP + if hasattr(FreeCADGui,"Snapper"): + FreeCADGui.Snapper.setGrid() + FreeCADGui.Snapper.restack() + self.oldWP = None if (len(self.node) > 1): if (len(self.node) == 2) and Draft.getParam("UsePartPrimitives",False): # use Part primitive @@ -604,6 +611,23 @@ class Line(Creator): self.planetrack.set(self.node[0]) msg(translate("draft", "Pick next point:\n")) + def orientWP(self): + if hasattr(FreeCAD,"DraftWorkingPlane"): + if (len(self.node) > 1) and self.obj: + import DraftGeomUtils + n = DraftGeomUtils.getNormal(self.obj.Shape) + if not n: + n = FreeCAD.DraftWorkingPlane.axis + p = self.node[-1] + v = self.node[-2].sub(self.node[-1]) + v = v.negative() + if not self.oldWP: + self.oldWP = FreeCAD.DraftWorkingPlane.copy() + FreeCAD.DraftWorkingPlane.alignToPointAndAxis(p,n,upvec=v) + if hasattr(FreeCADGui,"Snapper"): + FreeCADGui.Snapper.setGrid() + FreeCADGui.Snapper.restack() + def numericInput(self,numx,numy,numz): "this function gets called by the toolbar when valid x, y, and z have been entered there" self.point = Vector(numx,numy,numz) diff --git a/src/Mod/Draft/WorkingPlane.py b/src/Mod/Draft/WorkingPlane.py index 8bf32a5a88..1808599088 100644 --- a/src/Mod/Draft/WorkingPlane.py +++ b/src/Mod/Draft/WorkingPlane.py @@ -59,6 +59,9 @@ class plane: def __repr__(self): return "Workplane x="+str(DraftVecUtils.rounded(self.u))+" y="+str(DraftVecUtils.rounded(self.v))+" z="+str(DraftVecUtils.rounded(self.axis)) + def copy(self): + return plane(u=self.u,v=self.v,w=self.axis,pos=self.position) + def offsetToPoint(self, p, direction=None): ''' Return the signed distance from p to the plane, such