From 76cf1ceb39f39e8376a9aee9e2b6ed45aa9c490d Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Wed, 15 May 2019 19:48:58 -0300 Subject: [PATCH] Draft: Enhancements to Working Plane selection UI --- src/Mod/Draft/DraftGui.py | 53 ++++-- src/Mod/Draft/DraftTools.py | 335 +++++++++++++++++------------------- 2 files changed, 204 insertions(+), 184 deletions(-) diff --git a/src/Mod/Draft/DraftGui.py b/src/Mod/Draft/DraftGui.py index 6c164d8b1c..6e9c8667f8 100644 --- a/src/Mod/Draft/DraftGui.py +++ b/src/Mod/Draft/DraftGui.py @@ -441,9 +441,11 @@ class DraftToolBar: layout.addWidget(button) return button - def _label (self,name, layout, hide=True): + def _label (self,name, layout, hide=True,wrap=False): label = QtGui.QLabel(self.baseWidget) label.setObjectName(name) + if wrap: + label.setWordWrap(True) if hide: label.hide() layout.addWidget(label) return label @@ -580,6 +582,7 @@ class DraftToolBar: # options + self.WPLabel = self._label("WPLabel", self.layout,wrap=True) fl = QtGui.QHBoxLayout() self.layout.addLayout(fl) self.numFacesLabel = self._label("numfaceslabel", fl) @@ -642,7 +645,15 @@ class DraftToolBar: self.layout.addLayout(ml) self.mainlineLabel = self._label("mainlineLabel", ml) self.mainlineValue = self._spinbox("mainlineValue", ml) - self.centerPlane = self._checkbox("centerPlane",self.layout,checked = self.isCenterPlane) + gl = QtGui.QHBoxLayout() + self.layout.addLayout(gl) + self.centerLabel = self._label("centerLabel", gl) + self.centerPlane = self._checkbox("centerPlane",gl,checked = self.isCenterPlane) + gl = QtGui.QHBoxLayout() + self.layout.addLayout(gl) + self.snapLabel = self._label("snapLabel", gl) + self.snapValue = self._spinbox("snapValue", gl) + self.snapValue.setValue(Draft.getParam("snapRange",5)) # spacer if not self.taskmode: @@ -714,6 +725,7 @@ class DraftToolBar: QtCore.QObject.connect(self.gridValue,QtCore.SIGNAL("textEdited(QString)"),self.setGridSize) QtCore.QObject.connect(self.mainlineValue,QtCore.SIGNAL("valueChanged(int)"),self.setMainline) QtCore.QObject.connect(self.centerPlane,QtCore.SIGNAL("stateChanged(int)"),self.setCenterPlane) + QtCore.QObject.connect(self.snapValue,QtCore.SIGNAL("valueChanged(int)"),self.setSnapValue) # following lines can cause a crash and are not needed anymore when using the task panel # http://forum.freecadweb.org/viewtopic.php?f=3&t=6952 @@ -817,6 +829,7 @@ class DraftToolBar: self.finishButton.setToolTip(translate("draft", "Finishes the current drawing or editing operation")) self.continueCmd.setToolTip(translate("draft", "If checked, command will not finish until you press the command button again")) self.continueCmd.setText(translate("draft", "Continue")+" ("+inCommandShortcuts["Continue"][0]+")") + self.WPLabel.setText(translate("draft", "Select a face or working plane proxy or 3 vertices, or choose one of the options below")) self.occOffset.setToolTip(translate("draft", "If checked, an OCC-style offset will be performed instead of the classic offset")) self.occOffset.setText(translate("draft", "&OCC-style offset")) self.addButton.setToolTip(translate("draft", "Add points to the current object")) @@ -839,15 +852,15 @@ class DraftToolBar: self.numFaces.setToolTip(translate("draft", "Number of sides")) self.offsetLabel.setText(translate("draft", "Offset")) self.xyButton.setText(translate("draft", "XY (top)")) - self.xyButton.setToolTip(translate("draft", "Select XY plane")) + self.xyButton.setToolTip(translate("draft", "Sets the working plane on the ground XY plane")) self.xzButton.setText(translate("draft", "XZ (front)")) - self.xzButton.setToolTip(translate("draft", "Select XZ plane")) + self.xzButton.setToolTip(translate("draft", "Sets the working plane on the front XZ plane")) self.yzButton.setText(translate("draft", "YZ (side)")) - self.yzButton.setToolTip(translate("draft", "Select YZ plane")) + self.yzButton.setToolTip(translate("draft", "Setsthe working plane on the side YZ plane")) self.currentViewButton.setText(translate("draft", "View")) - self.currentViewButton.setToolTip(translate("draft", "Select plane perpendicular to the current view")) - self.resetPlaneButton.setText(translate("draft", "Auto")) - self.resetPlaneButton.setToolTip(translate("draft", "Do not project points to a drawing plane")) + self.currentViewButton.setToolTip(translate("draft", "Sets the working plane perpendicular to the current view")) + self.resetPlaneButton.setText(translate("draft", "Automatic")) + self.resetPlaneButton.setToolTip(translate("draft", "The working plane adapts to the current view when a command is started")) self.isCopy.setText(translate("draft", "Copy")+" ("+inCommandShortcuts["Copy"][0]+")") self.isCopy.setToolTip(translate("draft", "If checked, objects will be copied instead of moved. Preferences -> Draft -> Global copy mode to keep this mode in next commands")) self.isSubelementMode.setText(translate("draft", "Modify subelements")+" ("+inCommandShortcuts["SubelementMode"][0]+")") @@ -864,7 +877,10 @@ class DraftToolBar: self.gridValue.setToolTip(translate("draft", "The spacing between the grid lines")) self.mainlineLabel.setText(translate("draft", "Main line every")) self.mainlineValue.setToolTip(translate("draft", "The number of lines between main lines")) - self.centerPlane.setText(translate("draft", "Center plane on view")) + self.centerLabel.setText(translate("draft", "Center plane on view")) + self.centerPlane.setToolTip(translate("draft", "Centers the working plane on the current view")) + self.snapLabel.setText(translate("draft", "Snapping radius")) + self.snapValue.setToolTip(translate("draft", "This is the distance in screen pixels under which a point will be snapped. You can also change the radius while drawing, using keys")+" "+inCommandShortcuts["Increase"][0]+" , "+inCommandShortcuts["Decrease"][0]) self.retranslateTray(widget) # Update the maximum width of the push buttons @@ -934,7 +950,7 @@ class DraftToolBar: if FreeCADGui.Control.activeDialog(): FreeCADGui.Control.closeDialog() todo.delay(FreeCADGui.Control.showDialog,dummy(extra)) - self.setTitle(title) + self.setTitle(title,icon) def redraw(self): "utility function that is performed after each clicked point" @@ -959,7 +975,8 @@ class DraftToolBar: self.zValue.selectAll() def selectPlaneUi(self): - self.taskUi(translate("draft", "Select Plane")) + self.taskUi(title=translate("draft", "Working plane setup"),icon="Draft_SelectPlane") + self.WPLabel.show() self.xyButton.show() self.xzButton.show() self.yzButton.show() @@ -975,7 +992,12 @@ class DraftToolBar: self.mainlineValue.show() p = Draft.getParam("gridEvery",10) self.mainlineValue.setValue(p) + self.centerLabel.show() self.centerPlane.show() + self.snapLabel.show() + self.snapValue.show() + p = Draft.getParam("snapRange",5) + self.snapValue.setValue(p) def extraLineUi(self): '''shows length and angle controls''' @@ -1154,7 +1176,11 @@ class DraftToolBar: self.gridValue.hide() self.mainlineLabel.hide() self.mainlineValue.hide() + self.centerLabel.hide() self.centerPlane.hide() + self.snapLabel.hide() + self.snapValue.hide() + self.WPLabel.hide() def trimUi(self,title=translate("draft","Trim")): self.taskUi(title) @@ -2122,6 +2148,11 @@ class DraftToolBar: Draft.setParam("snapRange",par+val) FreeCADGui.Snapper.showradius() + def setSnapValue(self,val): + Draft.setParam("snapRange",val) + if hasattr(FreeCADGui,"Snapper"): + FreeCADGui.Snapper.showradius() + def constrain(self,val): if val == "angle": self.alock = not(self.alock) diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index 645cbacdcd..f348c19a84 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -326,116 +326,7 @@ class SelectPlane(DraftTool): DraftTool.Activated(self) self.offset = 0 if self.doc: - sel = FreeCADGui.Selection.getSelectionEx() - if len(sel) == 1: - sel = sel[0] - self.ui = FreeCADGui.draftToolBar - if Draft.getType(sel.Object) == "Axis": - plane.alignToEdges(sel.Object.Shape.Edges) - self.display(plane.axis) - self.finish() - return - elif Draft.getType(sel.Object) in ["WorkingPlaneProxy","BuildingPart"]: - plane.setFromPlacement(sel.Object.Placement,rebase=True) - plane.weak = False - if hasattr(sel.Object.ViewObject,"AutoWorkingPlane"): - if sel.Object.ViewObject.AutoWorkingPlane: - plane.weak = True - if hasattr(sel.Object.ViewObject,"RestoreView"): - if sel.Object.ViewObject.RestoreView: - if hasattr(sel.Object.ViewObject,"ViewData"): - if len(sel.Object.ViewObject.ViewData) >= 12: - d = sel.Object.ViewObject.ViewData - camtype = "orthographic" - if len(sel.Object.ViewObject.ViewData) == 13: - if d[12] == 1: - camtype = "perspective" - c = FreeCADGui.ActiveDocument.ActiveView.getCameraNode() - from pivy import coin - if isinstance(c,coin.SoOrthographicCamera): - if camtype == "perspective": - FreeCADGui.ActiveDocument.ActiveView.setCameraType("Perspective") - elif isinstance(c,coin.SoPerspectiveCamera): - if camtype == "orthographic": - FreeCADGui.ActiveDocument.ActiveView.setCameraType("Orthographic") - c = FreeCADGui.ActiveDocument.ActiveView.getCameraNode() - c.position.setValue([d[0],d[1],d[2]]) - c.orientation.setValue([d[3],d[4],d[5],d[6]]) - c.nearDistance.setValue(d[7]) - c.farDistance.setValue(d[8]) - c.aspectRatio.setValue(d[9]) - c.focalDistance.setValue(d[10]) - if camtype == "orthographic": - c.height.setValue(d[11]) - else: - c.heightAngle.setValue(d[11]) - if hasattr(sel.Object.ViewObject,"RestoreState"): - if sel.Object.ViewObject.RestoreState: - if hasattr(sel.Object.ViewObject,"VisibilityMap"): - if sel.Object.ViewObject.VisibilityMap: - for k,v in sel.Object.ViewObject.VisibilityMap.items(): - o = FreeCADGui.ActiveDocument.getObject(k) - if o: - if o.Visibility != (v == "True"): - FreeCADGui.doCommand("FreeCADGui.ActiveDocument.getObject(\""+k+"\").Visibility = "+v) - self.display(plane.axis) - self.ui.wplabel.setText(sel.Object.Label) - self.ui.wplabel.setToolTip(translate("draft", "Current working plane")+": "+self.ui.wplabel.text()) - self.finish() - return - elif Draft.getType(sel.Object) == "SectionPlane": - plane.setFromPlacement(sel.Object.Placement,rebase=True) - plane.weak = False - self.display(plane.axis) - self.ui.wplabel.setText(sel.Object.Label) - self.ui.wplabel.setToolTip(translate("draft", "Current working plane")+": "+self.ui.wplabel.text()) - self.finish() - return - elif sel.HasSubObjects: - if len(sel.SubElementNames) == 1: - if "Face" in sel.SubElementNames[0]: - plane.alignToFace(sel.SubObjects[0], self.offset) - self.display(plane.axis) - self.finish() - return - elif sel.SubElementNames[0] == "Plane": - plane.setFromPlacement(sel.Object.Placement,rebase=True) - self.display(plane.axis) - self.finish() - return - elif len(sel.SubElementNames) == 3: - if ("Vertex" in sel.SubElementNames[0]) \ - and ("Vertex" in sel.SubElementNames[1]) \ - and ("Vertex" in sel.SubElementNames[2]): - plane.alignTo3Points(sel.SubObjects[0].Point, - sel.SubObjects[1].Point, - sel.SubObjects[2].Point, - self.offset) - self.display(plane.axis) - self.finish() - return - elif sel.Object.isDerivedFrom("Part::Feature"): - if sel.Object.Shape: - if len(sel.Object.Shape.Faces) == 1: - plane.alignToFace(sel.Object.Shape.Faces[0], self.offset) - self.display(plane.axis) - self.finish() - return - elif sel: - subs = [] - import Part - for s in sel: - for so in s.SubObjects: - if isinstance(so,Part.Vertex): - subs.append(so) - if len(subs) == 3: - plane.alignTo3Points(subs[0].Point, - subs[1].Point, - subs[2].Point, - self.offset) - self.display(plane.axis) - self.finish() - return + self.ui.selectPlaneUi() msg(translate("draft", "Pick a face to define the drawing plane")+"\n") if plane.alignToSelection(self.offset): @@ -450,19 +341,117 @@ class SelectPlane(DraftTool): self.finish() if arg["Type"] == "SoMouseButtonEvent": if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): - cursor = arg["Position"] - doc = FreeCADGui.ActiveDocument - info = Draft.get3DView().getObjectInfo((cursor[0],cursor[1])) - if info: - try: - shape = doc.getObject(info["Object"]).Object.Shape - component = getattr(shape, info["Component"]) - if plane.alignToFace(component, self.offset) \ - or plane.alignToCurve(component, self.offset): - self.display(plane.axis) - self.finish() - except: - pass + # coin detection happens before the selection got a chance of being updated, sowe must delay + DraftGui.todo.delay(self.checkSelection,None) + + def checkSelection(self): + if self.handle(): + self.finish() + + def handle(self): + sel = FreeCADGui.Selection.getSelectionEx() + if len(sel) == 1: + sel = sel[0] + self.ui = FreeCADGui.draftToolBar + if Draft.getType(sel.Object) == "Axis": + plane.alignToEdges(sel.Object.Shape.Edges) + self.display(plane.axis) + return True + elif Draft.getType(sel.Object) in ["WorkingPlaneProxy","BuildingPart"]: + plane.setFromPlacement(sel.Object.Placement,rebase=True) + plane.weak = False + if hasattr(sel.Object.ViewObject,"AutoWorkingPlane"): + if sel.Object.ViewObject.AutoWorkingPlane: + plane.weak = True + if hasattr(sel.Object.ViewObject,"RestoreView"): + if sel.Object.ViewObject.RestoreView: + if hasattr(sel.Object.ViewObject,"ViewData"): + if len(sel.Object.ViewObject.ViewData) >= 12: + d = sel.Object.ViewObject.ViewData + camtype = "orthographic" + if len(sel.Object.ViewObject.ViewData) == 13: + if d[12] == 1: + camtype = "perspective" + c = FreeCADGui.ActiveDocument.ActiveView.getCameraNode() + from pivy import coin + if isinstance(c,coin.SoOrthographicCamera): + if camtype == "perspective": + FreeCADGui.ActiveDocument.ActiveView.setCameraType("Perspective") + elif isinstance(c,coin.SoPerspectiveCamera): + if camtype == "orthographic": + FreeCADGui.ActiveDocument.ActiveView.setCameraType("Orthographic") + c = FreeCADGui.ActiveDocument.ActiveView.getCameraNode() + c.position.setValue([d[0],d[1],d[2]]) + c.orientation.setValue([d[3],d[4],d[5],d[6]]) + c.nearDistance.setValue(d[7]) + c.farDistance.setValue(d[8]) + c.aspectRatio.setValue(d[9]) + c.focalDistance.setValue(d[10]) + if camtype == "orthographic": + c.height.setValue(d[11]) + else: + c.heightAngle.setValue(d[11]) + if hasattr(sel.Object.ViewObject,"RestoreState"): + if sel.Object.ViewObject.RestoreState: + if hasattr(sel.Object.ViewObject,"VisibilityMap"): + if sel.Object.ViewObject.VisibilityMap: + for k,v in sel.Object.ViewObject.VisibilityMap.items(): + o = FreeCADGui.ActiveDocument.getObject(k) + if o: + if o.Visibility != (v == "True"): + FreeCADGui.doCommand("FreeCADGui.ActiveDocument.getObject(\""+k+"\").Visibility = "+v) + self.display(plane.axis) + self.ui.wplabel.setText(sel.Object.Label) + self.ui.wplabel.setToolTip(translate("draft", "Current working plane")+": "+self.ui.wplabel.text()) + return True + elif Draft.getType(sel.Object) == "SectionPlane": + plane.setFromPlacement(sel.Object.Placement,rebase=True) + plane.weak = False + self.display(plane.axis) + self.ui.wplabel.setText(sel.Object.Label) + self.ui.wplabel.setToolTip(translate("draft", "Current working plane")+": "+self.ui.wplabel.text()) + return True + elif sel.HasSubObjects: + if len(sel.SubElementNames) == 1: + if "Face" in sel.SubElementNames[0]: + plane.alignToFace(sel.SubObjects[0], self.offset) + self.display(plane.axis) + return True + elif sel.SubElementNames[0] == "Plane": + plane.setFromPlacement(sel.Object.Placement,rebase=True) + self.display(plane.axis) + return True + elif len(sel.SubElementNames) == 3: + if ("Vertex" in sel.SubElementNames[0]) \ + and ("Vertex" in sel.SubElementNames[1]) \ + and ("Vertex" in sel.SubElementNames[2]): + plane.alignTo3Points(sel.SubObjects[0].Point, + sel.SubObjects[1].Point, + sel.SubObjects[2].Point, + self.offset) + self.display(plane.axis) + return True + elif sel.Object.isDerivedFrom("Part::Feature"): + if sel.Object.Shape: + if len(sel.Object.Shape.Faces) == 1: + plane.alignToFace(sel.Object.Shape.Faces[0], self.offset) + self.display(plane.axis) + return True + elif sel: + subs = [] + import Part + for s in sel: + for so in s.SubObjects: + if isinstance(so,Part.Vertex): + subs.append(so) + if len(subs) == 3: + plane.alignTo3Points(subs[0].Point, + subs[1].Point, + subs[2].Point, + self.offset) + self.display(plane.axis) + return True + return False def getCenterPoint(self,x,y,z): if not self.ui.isCenterPlane: @@ -1068,7 +1057,7 @@ class CubicBezCurve(Line): if ((self.point-self.node[0]).Length < Draft.tolerance()) and len(self.node) >= 4: #self.undolast() self.node=self.node[0:-2] - self.node.append(2 * self.node[0] - self.node[1]) #close the curve with a smooth simmetric knot + self.node.append(2 * self.node[0] - self.node[1]) #close the curve with a smooth simmetric knot self.finish(True,cont=True) msg(translate("draft", "Bezier curve has been closed")+"\n") if (arg["State"] == "UP") and (arg["Button"] == "BUTTON1"): #left click @@ -1088,7 +1077,7 @@ class CubicBezCurve(Line): self.finish(False,cont=True) if (len(self.node) > 2): #does this make sense for a BCurve? self.node[-3] = 2 * self.node[-2] - self.node[-1] - self.drawUpdate(self.point) + self.drawUpdate(self.point) # DNC: allows to close the curve # by placing ends close to each other # with tol = Draft tolerance @@ -1117,19 +1106,19 @@ class CubicBezCurve(Line): '''creates shape for display during creation process.''' # not quite right. draws 1 big bez. sb segmented edges = [] - + if len(pts) >= 2: #allow lower degree segment poles=pts[1:] else: poles=[] - + if self.degree: segpoleslst = [poles[x:x+self.degree] for x in range(0, len(poles), (self.degree or 1))] else: segpoleslst = [pts] - + startpoint=pts[0] - + for segpoles in segpoleslst: c = Part.BezierCurve() #last segment may have lower degree c.increase(len(segpoles)) @@ -4555,7 +4544,7 @@ class Edit(Modifier): msg(translate("draft", "Please select only one object")+"\n",'warning') self.finish() return - else: + else: self.ghost = None self.ui.selectUi() msg(translate("draft", "Select a Draft object to edit")+"\n") @@ -4591,33 +4580,33 @@ class Edit(Modifier): if hasattr(self.obj.ViewObject,"Selectable"): self.selectstate = self.obj.ViewObject.Selectable self.obj.ViewObject.Selectable = False - + FreeCADGui.Selection.clearSelection() self.editing = None self.editpoints = [] self.pl = None self.arc3Pt = False FreeCADGui.Snapper.setSelectMode(True) - + # Edit Gui setup is moved inside each kind of object - + # overwrite self.obj to match the right editing target if Draft.getType(self.obj) == "Wall": if Draft.getType(self.obj.Base) in ["Wire","Circle","Rectangle", "Polygon"]: self.obj=self.obj.Base - + if "Placement" in self.obj.PropertiesList: self.pl = self.obj.Placement self.invpl = self.pl.inverse() # setup of different object type (set editUi, set editTrackers) - + if Draft.getType(self.obj) in ["Wire","BSpline"]: self.ui.editUi("Wire") for p in self.obj.Points: if self.pl: p = self.pl.multVec(p) self.editpoints.append(p) - + elif Draft.getType(self.obj) == "BezCurve": self.ui.editUi("BezCurve") self.resetTrackersBezier() @@ -4629,7 +4618,7 @@ class Edit(Modifier): if self.planetrack: self.planetrack.set(self.obj.Shape.Edges[0].Curve.\ getPole(1)) - + elif Draft.getType(self.obj) == "Circle": self.setCirclePts() @@ -4644,12 +4633,12 @@ class Edit(Modifier): self.by = v[2].Point.sub(v[1].Point) if self.obj.Height < 0: self.by = self.by.negative() - + elif Draft.getType(self.obj) == "Polygon": self.ui.editUi() self.editpoints.append(self.obj.Placement.Base) self.editpoints.append(self.obj.Shape.Vertexes[0].Point) - + elif Draft.getType(self.obj) == "Dimension": self.ui.editUi() p = self.obj.ViewObject.Proxy.textpos.translation.getValue() @@ -4657,7 +4646,7 @@ class Edit(Modifier): self.editpoints.append(self.obj.End) self.editpoints.append(self.obj.Dimline) self.editpoints.append(Vector(p[0],p[1],p[2])) - + elif Draft.getType(self.obj) == "Wall": self.ui.editUi() if Draft.getType(self.obj.Base) == "Sketch": @@ -4666,7 +4655,7 @@ class Edit(Modifier): self.editpoints.append(self.obj.Base.getPoint(0,2)) else: msg(translate("draft","Wall base sketch is too complex to edit: it's suggested to edit directly the sketch")+"\n",'warning') - + elif Draft.getType(self.obj) == "Window": msg("Window was found \n") self.ui.editUi() @@ -4680,14 +4669,14 @@ class Edit(Modifier): pos.y+float(self.obj.Width)*math.sin(angle-math.pi/2), pos.z)) self.editpoints.append(FreeCAD.Vector(pos.x,pos.y,h)) - + elif Draft.getType(self.obj) == "Space": self.ui.editUi() try: self.editpoints.append(self.obj.ViewObject.Proxy.getTextPosition(self.obj.ViewObject)) except: pass - + elif Draft.getType(self.obj) == "Structure": self.ui.editUi() if self.obj.Nodes: @@ -4701,7 +4690,7 @@ class Edit(Modifier): if self.pl: p = self.pl.multVec(p) self.editpoints.append(p) - + elif Draft.getType(self.obj) == "PanelCut": self.ui.editUi() if self.obj.TagPosition.Length == 0: @@ -4709,7 +4698,7 @@ class Edit(Modifier): else: pos = self.pl.multVec(self.obj.TagPosition) self.editpoints.append(pos) - + elif Draft.getType(self.obj) == "PanelSheet": self.ui.editUi() self.editpoints.append(self.pl.multVec(self.obj.TagPosition)) @@ -4738,7 +4727,7 @@ class Edit(Modifier): else: msg(translate("draft", "This object type is not editable")+"\n",'warning') self.finish() - + else: self.finish() @@ -4777,18 +4766,18 @@ class Edit(Modifier): def action(self,arg): "scene event handler" - + if arg["Type"] == "SoKeyboardEvent": if arg["Key"] == "ESCAPE": self.finish() elif arg["Key"] == "f": self.finish() elif arg["Key"] == "c": - self.finish(closed=True) + self.finish(closed=True) elif arg["Key"] == "i": - if (arg["State"] == "DOWN") and Draft.getType(self.obj) == "Circle": - self.arcInvert() - + if (arg["State"] == "DOWN") and Draft.getType(self.obj) == "Circle": + self.arcInvert() + elif arg["Type"] == "SoLocation2Event": #mouse movement detection self.point,ctrlPoint,info = getPoint(self,arg) if self.editing != None: @@ -4802,12 +4791,12 @@ class Edit(Modifier): else: self.obj.ViewObject.Selectable = False redraw3DView() - + elif arg["Type"] == "SoMouseButtonEvent": - + if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): self.ui.redraw() - + if self.editing == None: p = FreeCADGui.ActiveDocument.ActiveView.getCursorPos() done = False @@ -4949,7 +4938,7 @@ class Edit(Modifier): pts[self.editing] = editPnt self.obj.Points = pts self.trackers[self.editing].set(v) - + elif Draft.getType(self.obj) == "Circle": self.updateCircle(v) elif Draft.getType(self.obj) == "Rectangle": @@ -4974,7 +4963,7 @@ class Edit(Modifier): self.obj.recompute() self.trackers[0].set(self.obj.Placement.Base) self.trackers[1].set(self.obj.Shape.Vertexes[2].Point) - + elif Draft.getType(self.obj) == "Polygon": delta = v.sub(self.obj.Placement.Base) if self.editing == 0: @@ -4991,7 +4980,7 @@ class Edit(Modifier): self.obj.Radius = rad self.obj.recompute() self.trackers[1].set(self.obj.Shape.Vertexes[0].Point) - + elif Draft.getType(self.obj) == "Dimension": if self.editing == 0: self.obj.Start = v @@ -5001,7 +4990,7 @@ class Edit(Modifier): self.obj.Dimline = v elif self.editing == 3: self.obj.ViewObject.TextPosition = v - + elif Draft.getType(self.obj) == "Wall": if self.editing == 0: self.obj.Base.movePoint(0,1,v) @@ -5010,7 +4999,7 @@ class Edit(Modifier): self.obj.Base.movePoint(0,2,v) self.obj.Base.recompute() self.obj.recompute() - + elif Draft.getType(self.obj) == "Window": pos=self.obj.Base.Placement.Base if self.editing == 0: @@ -5025,20 +5014,20 @@ class Edit(Modifier): for obj in self.obj.Hosts: obj.recompute() self.obj.recompute() - + elif Draft.getType(self.obj) == "Space": if self.editing == 0: self.obj.ViewObject.TextPosition = v - + elif Draft.getType(self.obj) == "Structure": nodes = self.obj.Nodes nodes[self.editing] = self.invpl.multVec(v) self.obj.Nodes = nodes - + elif Draft.getType(self.obj) == "PanelCut": if self.editing == 0: self.obj.TagPosition = self.invpl.multVec(v) - + elif Draft.getType(self.obj) == "PanelSheet": if self.editing == 0: self.obj.TagPosition = self.invpl.multVec(v) @@ -5061,7 +5050,7 @@ class Edit(Modifier): self.editpoints.append(self.obj.Shape.Vertexes[0].Point)#First endpoint self.editpoints.append(self.obj.Shape.Vertexes[1].Point)#Second endpoint self.editpoints.append(self.getArcMid())#Midpoint - + def updateCirclePts(self,ep1=1,ep2=1,ep3=1,ep4=1): self.obj.recompute() if ep1 == 1: @@ -5070,10 +5059,10 @@ class Edit(Modifier): self.trackers[1].set(self.obj.Shape.Vertexes[0].Point) if ep3 == 1: self.trackers[2].set(self.obj.Shape.Vertexes[1].Point) - if ep4 == 1: + if ep4 == 1: self.trackers[3].set(self.getArcMid()) - - + + def updateCircle(self,v): delta = v.sub(self.obj.Placement.Base) if self.obj.FirstAngle == self.obj.LastAngle:# object is a circle @@ -5085,9 +5074,9 @@ class Edit(Modifier): if self.editing == 1: self.obj.Radius = delta.Length self.updateCirclePts(0,0,0,0) - + else:#self.obj is an arc - + if self.arc3Pt == True:#edit by center radius FirstAngle LastAngle deltaX = v[0]-self.obj.Placement.Base[0] deltaY = v[1]-self.obj.Placement.Base[1] @@ -5109,7 +5098,7 @@ class Edit(Modifier): self.obj.Radius = delta.Length self.obj.recompute() self.updateCirclePts(0,1,1,1) - + elif self.arc3Pt == False: if self.editing == 0:#center point import DraftVecUtils @@ -5127,7 +5116,7 @@ class Edit(Modifier): if self.editing == 1:#first point p1=v p2=self.getArcMid() - p3=self.obj.Shape.Vertexes[1].Point + p3=self.obj.Shape.Vertexes[1].Point elif self.editing == 3:#midpoint p1=self.obj.Shape.Vertexes[0].Point p2=v @@ -5146,7 +5135,7 @@ class Edit(Modifier): deltaY = p3[1]-self.obj.Placement.Base[1] dangleL = math.degrees(math.atan2(deltaY,deltaX)) self.obj.FirstAngle = dangleF - self.obj.LastAngle = dangleL + self.obj.LastAngle = dangleL self.updateCirclePts() def getArcMid(self):#Returns object midpoint @@ -5165,7 +5154,7 @@ class Edit(Modifier): msg("wall edit mode: get midpoint") else: msg("Failed to get object midpoint during Editing") - + def arcInvert(self): FA=self.obj.FirstAngle self.obj.FirstAngle=self.obj.LastAngle