diff --git a/src/Mod/Draft/DraftGui.py b/src/Mod/Draft/DraftGui.py index f3e1caf67d..6cb6d516a6 100644 --- a/src/Mod/Draft/DraftGui.py +++ b/src/Mod/Draft/DraftGui.py @@ -503,6 +503,7 @@ class DraftToolBar: self.sharpButton = self._pushbutton("sharpButton", self.layout, icon="Draft_BezSharpNode", width=22, checkable=True) self.tangentButton = self._pushbutton("tangentButton", self.layout, icon="Draft_BezTanNode", width=22, checkable=True) self.symmetricButton = self._pushbutton("symmetricButton", self.layout, icon="Draft_BezSymNode", width=22, checkable=True) + self.arc3PtButton = self._pushbutton("arc3PtButton", self.layout, icon="Draft_BezSymNode", width=22, checkable=True) # point @@ -647,6 +648,7 @@ class DraftToolBar: QtCore.QObject.connect(self.sharpButton,QtCore.SIGNAL("toggled(bool)"),self.setSharpMode) QtCore.QObject.connect(self.tangentButton,QtCore.SIGNAL("toggled(bool)"),self.setTangentMode) QtCore.QObject.connect(self.symmetricButton,QtCore.SIGNAL("toggled(bool)"),self.setSymmetricMode) + QtCore.QObject.connect(self.arc3PtButton,QtCore.SIGNAL("toggled(bool)"),self.arc3PtMode) 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) @@ -791,6 +793,7 @@ class DraftToolBar: self.sharpButton.setToolTip(translate("draft", "Make Bezier node sharp")) self.tangentButton.setToolTip(translate("draft", "Make Bezier node tangent")) self.symmetricButton.setToolTip(translate("draft", "Make Bezier node symmetric")) + self.arc3PtButton.setToolTip(translate("draft", "Activate 3 point arc editing")) self.undoButton.setText(translate("draft", "&Undo (CTRL+Z)")) self.undoButton.setToolTip(translate("draft", "Undo the last segment")) self.closeButton.setText(translate("draft", "Close")+" ("+inCommandShortcuts["Close"][0]+")") @@ -1057,6 +1060,7 @@ class DraftToolBar: self.sharpButton.hide() self.tangentButton.hide() self.symmetricButton.hide() + self.arc3PtButton.hide() self.undoButton.hide() self.closeButton.hide() self.wipeButton.hide() @@ -1187,6 +1191,7 @@ class DraftToolBar: self.makeDumbTask(extra,callback) def editUi(self, mode=None): + self.lastMode=mode self.taskUi(translate("draft", "Edit")) self.hideXYZ() self.numFaces.hide() @@ -1194,18 +1199,26 @@ class DraftToolBar: self.hasFill.hide() self.addButton.show() self.delButton.show() - if mode == 'BezCurve': + if mode == 'Wire': + self.setEditButtons(True) + self.setBezEditButtons(False) + elif mode == 'Arc': + self.addButton.hide() + self.delButton.hide() + self.arc3PtButton.show() + elif mode == 'BezCurve': self.sharpButton.show() self.tangentButton.show() self.symmetricButton.show() - self.finishButton.show() self.closeButton.show() + self.finishButton.show() # always start Edit with buttons unchecked self.addButton.setChecked(False) self.delButton.setChecked(False) self.sharpButton.setChecked(False) self.tangentButton.setChecked(False) self.symmetricButton.setChecked(False) + self.arc3PtButton.setChecked(False) def extUi(self): self.hasFill.show() @@ -1968,6 +1981,10 @@ class DraftToolBar: self.addButton.setChecked(False) self.delButton.setChecked(False) + def arc3PtMode(self,bool): + if self.arc3PtButton.isChecked(): + self.arc3PtButton.setChecked(True) + def setRadiusValue(self,val,unit=None): #print("DEBUG: setRadiusValue val: ", val, " unit: ", unit) if not isinstance(val, (int, float)): #??some code passes strings or ??? diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index c017bc330f..f0786882f2 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -4068,46 +4068,40 @@ class Edit(Modifier): self.obj = FreeCADGui.Selection.getSelection() if self.obj: self.obj = self.obj[0] + # we could skip next passage putting an "else" at the end of the proceed function if not Draft.getType(self.obj) in ["BezCurve","Wire","BSpline","Circle","Rectangle", "Polygon","Dimension","Space","Structure","PanelCut", "PanelSheet","Wall"]: msg(translate("draft", "This object type is not editable")+"\n",'warning') self.finish() return - if Draft.getType(self.obj) == "Wall": - if Draft.getType(self.obj.Base) in ["Wire","Circle","Rectangle", - "Polygon"]: - self.obj=self.obj.Base - if (Draft.getType(self.obj) == "BezCurve"): - self.ui.editUi("BezCurve") - else: - self.ui.editUi() # store selectable state of the object if hasattr(self.obj.ViewObject,"Selectable"): self.selectstate = self.obj.ViewObject.Selectable self.obj.ViewObject.Selectable = False FreeCADGui.Selection.clearSelection() - if Draft.getType(self.obj) in ["Wire","BSpline"]: - self.ui.setEditButtons(True) - self.ui.setBezEditButtons(False) - elif Draft.getType(self.obj) == "BezCurve": - self.ui.setEditButtons(True) - self.ui.setBezEditButtons(True) - else: - self.ui.setEditButtons(False) - self.ui.setBezEditButtons(False) 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() self.call = self.view.addEventCallback("SoEvent",self.action) self.running = True @@ -4118,13 +4112,16 @@ class Edit(Modifier): self.planetrack.set(self.editpoints[0]) elif Draft.getType(self.obj) == "Circle": self.editpoints.append(self.obj.Placement.Base) - if self.obj.FirstAngle == self.obj.LastAngle: + if self.obj.FirstAngle == self.obj.LastAngle:#self.obj is a circle + self.ui.editUi("Circle") self.editpoints.append(self.obj.Shape.Vertexes[0].Point) else:#self.obj is an arc + self.ui.editUi("Arc") 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 elif Draft.getType(self.obj) == "Rectangle": + self.ui.editUi() self.editpoints.append(self.obj.Placement.Base) self.editpoints.append(self.obj.Shape.Vertexes[2].Point) v = self.obj.Shape.Vertexes @@ -4135,20 +4132,24 @@ class Edit(Modifier): 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() self.editpoints.append(self.obj.Start) 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) == "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: self.originalDisplayMode = self.obj.ViewObject.DisplayMode self.originalPoints = self.obj.ViewObject.NodeSize @@ -4161,16 +4162,19 @@ class Edit(Modifier): p = self.pl.multVec(p) self.editpoints.append(p) elif Draft.getType(self.obj) == "PanelCut": + self.ui.editUi() if self.obj.TagPosition.Length == 0: pos = self.obj.Shape.BoundBox.Center 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)) for o in self.obj.Group: self.editpoints.append(self.pl.multVec(o.Placement.Base)) elif Draft.getType(self.obj) == "Wall": + self.ui.editUi() if Draft.getType(self.obj.Base) == "Sketch": if self.obj.Base.GeometryCount == 1: self.editpoints.append(self.obj.Base.getPoint(0,1)) @@ -4288,6 +4292,10 @@ class Edit(Modifier): if 'EditNode' in info["Component"]: self.smoothBezPoint(int(info["Component"][8:]), info, 'Symmetric') elif 'EditNode' in info["Component"]: + if self.ui.arc3PtButton.isChecked(): + self.arc3Pt = True#store arc 3 points edit mode + else: + self.arc3Pt = False#decide if it's deselected after every editing point self.ui.pointUi() self.ui.isRelative.show() self.editing = int(info["Component"][8:]) @@ -4368,37 +4376,83 @@ class Edit(Modifier): self.trackers[self.editing].set(v) elif Draft.getType(self.obj) == "Circle": delta = v.sub(self.obj.Placement.Base) - deltaX = v[0]-self.obj.Placement.Base[0] - deltaY = v[1]-self.obj.Placement.Base[1] - dangle = math.degrees(math.atan2(deltaY,deltaX)) - if self.editing == 0: - p = self.obj.Placement - p.move(delta) - self.obj.Placement = p - self.trackers[0].set(self.obj.Placement.Base) - if not self.obj.FirstAngle == self.obj.LastAngle: - self.trackers[2].set(self.obj.Shape.Vertexes[1].Point) - self.trackers[3].set(self.getArcMid())#self.obj is an arc - elif self.editing == 1: - if self.obj.FirstAngle == self.obj.LastAngle:#self.obj is a circle + if self.obj.FirstAngle == self.obj.LastAngle:# object is a circle + if self.editing == 0: + p = self.obj.Placement + p.move(delta) + self.obj.Placement = p + self.trackers[0].set(self.obj.Placement.Base) + if self.editing == 1: self.obj.Radius = delta.Length self.obj.recompute() - else:#self.obj is an arc - self.obj.FirstAngle=dangle + self.trackers[1].set(self.obj.Shape.Vertexes[0].Point) + else:#self.obj is an arc + if self.arc3Pt == False:#edit by center radius FirstAngle LastAngle + msg("CENTRO E RAGGIO") + deltaX = v[0]-self.obj.Placement.Base[0] + deltaY = v[1]-self.obj.Placement.Base[1] + dangle = math.degrees(math.atan2(deltaY,deltaX)) + if self.editing == 0: + p = self.obj.Placement + p.move(delta) + self.obj.Placement = p + self.trackers[0].set(self.obj.Placement.Base) + self.trackers[2].set(self.obj.Shape.Vertexes[1].Point) + self.trackers[3].set(self.getArcMid()) + elif self.editing == 1: + self.obj.FirstAngle=dangle + self.obj.recompute() + self.trackers[2].set(self.obj.Shape.Vertexes[1].Point) + self.trackers[3].set(self.getArcMid()) + elif self.editing == 2: + self.obj.LastAngle=dangle + self.obj.recompute() + self.trackers[2].set(self.obj.Shape.Vertexes[1].Point) + self.trackers[3].set(self.getArcMid()) + elif self.editing == 3: + self.obj.Radius = delta.Length + self.obj.recompute() + self.trackers[2].set(self.obj.Shape.Vertexes[1].Point) + self.trackers[3].set(self.getArcMid()) + self.trackers[1].set(self.obj.Shape.Vertexes[0].Point) + elif self.arc3Pt: + msg("3 PUNTI") + if self.editing == 0:#keep everithing as it is for the moment + p1=self.obj.Shape.Vertexes[0].Point + p2=self.getArcMid() + p3=self.obj.Shape.Vertexes[1].Point + arc=Part.ArcOfCircle(p1,p2,p3)#object is a support, do i have to delete it someway after? + if self.editing == 1: + p1=v + p2=self.getArcMid() + p3=self.obj.Shape.Vertexes[1].Point + arc=Part.ArcOfCircle(p1,p2,p3)#object is a support, do i have to delete it someway after? + elif self.editing == 3: + p1=self.obj.Shape.Vertexes[0].Point + p2=v + p3=self.obj.Shape.Vertexes[1].Point + arc=Part.ArcOfCircle(p1,p2,p3)#object is a support, do i have to delete it someway after? + elif self.editing == 2: + p1=self.obj.Shape.Vertexes[0].Point + p2=self.getArcMid() + p3=v + arc=Part.ArcOfCircle(p1,p2,p3)#object is a support, do i have to delete it someway after? + self.obj.Placement.Base=arc.Center + self.obj.Radius = arc.Radius + deltaX = p1[0]-self.obj.Placement.Base[0] + deltaY = p1[1]-self.obj.Placement.Base[1] + dangleF = math.degrees(math.atan2(deltaY,deltaX)) + deltaX = p3[0]-self.obj.Placement.Base[0] + 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.recompute() + self.trackers[0].set(self.obj.Placement.Base) + self.trackers[1].set(self.obj.Shape.Vertexes[0].Point) self.trackers[2].set(self.obj.Shape.Vertexes[1].Point) self.trackers[3].set(self.getArcMid()) - elif self.editing == 2: - self.obj.LastAngle=dangle - self.obj.recompute() - self.trackers[2].set(self.obj.Shape.Vertexes[1].Point) - self.trackers[3].set(self.getArcMid()) - elif self.editing == 3: - self.obj.Radius = delta.Length - self.obj.recompute() - self.trackers[2].set(self.obj.Shape.Vertexes[1].Point) - self.trackers[3].set(self.getArcMid()) - self.trackers[1].set(self.obj.Shape.Vertexes[0].Point) + elif Draft.getType(self.obj) == "Rectangle": delta = v.sub(self.obj.Placement.Base) if self.editing == 0: @@ -4477,7 +4531,6 @@ class Edit(Modifier): def getArcMid(self):#Returns object midpoint if Draft.getType(self.obj) == "Circle": - #self.obj.recompute() if self.obj.LastAngle>self.obj.FirstAngle: midAngle=math.radians(self.obj.FirstAngle+(self.obj.LastAngle-self.obj.FirstAngle)/2) else: @@ -4501,10 +4554,7 @@ class Edit(Modifier): self.update(v) self.doc.recompute() self.editing = None - if (Draft.getType(self.obj) == "BezCurve"): - self.ui.editUi("BezCurve") - else: - self.ui.editUi() + self.ui.editUi(self.ui.lastMode) self.node = [] def addPointOnEdge(self, newPoint, edgeIndex): @@ -4701,7 +4751,6 @@ class Edit(Modifier): objPoints = self.obj.Points[ep] if self.pl: objPoints = self.pl.multVec(objPoints) self.trackers.append(editTracker(objPoints,self.obj.Name,ep,self.obj.ViewObject.LineColor)) - class AddToGroup(): "The AddToGroup FreeCAD command definition"