From c81ce5dea1b645d34986a5c55a040077e5f62541 Mon Sep 17 00:00:00 2001 From: Roy Date: Sat, 15 Jan 2022 18:23:05 +0100 Subject: [PATCH] Draft: fix task panel related issues This PR fixes several task panel related issues for Draft modifier commands. --- src/Mod/Draft/DraftGui.py | 9 +++++- src/Mod/Draft/draftfunctions/scale.py | 32 ++++++++++----------- src/Mod/Draft/draftguitools/gui_mirror.py | 1 - src/Mod/Draft/draftguitools/gui_move.py | 18 +++++++----- src/Mod/Draft/draftguitools/gui_rotate.py | 26 ++++++++++------- src/Mod/Draft/draftguitools/gui_scale.py | 21 ++++++++------ src/Mod/Draft/draftguitools/gui_stretch.py | 1 - src/Mod/Draft/draftguitools/gui_trackers.py | 18 ++++++------ src/Mod/Draft/drafttaskpanels/task_scale.py | 28 ++++++++++++++---- 9 files changed, 95 insertions(+), 59 deletions(-) diff --git a/src/Mod/Draft/DraftGui.py b/src/Mod/Draft/DraftGui.py index d68fb83032..6662e04ec5 100644 --- a/src/Mod/Draft/DraftGui.py +++ b/src/Mod/Draft/DraftGui.py @@ -615,7 +615,10 @@ class DraftToolBar: QtCore.QObject.connect(self.undoButton,QtCore.SIGNAL("pressed()"),self.undoSegment) QtCore.QObject.connect(self.selectButton,QtCore.SIGNAL("pressed()"),self.selectEdge) QtCore.QObject.connect(self.continueCmd,QtCore.SIGNAL("stateChanged(int)"),self.setContinue) + QtCore.QObject.connect(self.isCopy,QtCore.SIGNAL("stateChanged(int)"),self.setCopymode) + QtCore.QObject.connect(self.isSubelementMode, QtCore.SIGNAL("stateChanged(int)"), self.setSubelementMode) + QtCore.QObject.connect(self.isRelative,QtCore.SIGNAL("stateChanged(int)"),self.setRelative) QtCore.QObject.connect(self.isGlobal,QtCore.SIGNAL("stateChanged(int)"),self.setGlobal) QtCore.QObject.connect(self.hasFill,QtCore.SIGNAL("stateChanged(int)"),self.setFill) @@ -981,7 +984,8 @@ class DraftToolBar: def rotateSetCenterUi(self): self.pointUi(translate("draft", "Rotate"),icon="Draft_Rotate") - self.continueCmd.show() + self.modUi() + self.isRelative.hide() def pointUi(self, title=translate("draft","Point"), cancel=None, extra=None, getcoords=None, rel=False, icon="Draft_Draft"): @@ -1306,6 +1310,9 @@ class DraftToolBar: if self.sourceCmd.featureName == "Offset": p.SetBool("OffsetCopyMode",bool(val)) + def setSubelementMode(self): + self.sourceCmd.set_ghosts() + def relocate(self): """relocates the right-aligned buttons depending on the toolbar size""" if self.baseWidget.geometry().width() < 400: diff --git a/src/Mod/Draft/draftfunctions/scale.py b/src/Mod/Draft/draftfunctions/scale.py index 7e86e121c6..801fc13721 100644 --- a/src/Mod/Draft/draftfunctions/scale.py +++ b/src/Mod/Draft/draftfunctions/scale.py @@ -39,9 +39,9 @@ import draftmake.make_line as make_line def scale(objectslist, scale=App.Vector(1,1,1), center=App.Vector(0,0,0), copy=False): """scale(objects, scale, [center], copy) - - Scales the objects contained in objects (that can be a list of objects or - an object) of the given around given center. + + Scales the objects contained in objects (that can be a list of objects or + an object) of the given around given center. Parameters ---------- @@ -55,7 +55,7 @@ def scale(objectslist, scale=App.Vector(1,1,1), copy : bool If copy is True, the actual objects are not scaled, but copies - are created instead. + are created instead. Return ---------- @@ -124,8 +124,8 @@ def scale(objectslist, scale=App.Vector(1,1,1), obj.YSize = obj.YSize * scale.y if obj.ViewObject and hasattr(obj.ViewObject,"FontSize"): obj.ViewObject.FontSize = obj.ViewObject.FontSize * scale.y - - + + if copy: gui_utils.format_object(newobj,obj) newobjlist.append(newobj) @@ -148,7 +148,7 @@ def scale_vertex(obj, vertex_index, scale, center): """ points = obj.Points points[vertex_index] = obj.Placement.inverse().multVec( - scaleVectorFromCenter( + scale_vector_from_center( obj.Placement.multVec(points[vertex_index]), scale, center)) obj.Points = points @@ -173,11 +173,11 @@ def scale_edge(obj, edge_index, scale, center): Needed for SubObjects modifiers. Implemented by Dion Moult during 0.19 dev cycle (works only with Draft Wire). """ - scaleVertex(obj, edge_index, scale, center) - if utils.isClosedEdge(edge_index, obj): - scaleVertex(obj, 0, scale, center) + scale_vertex(obj, edge_index, scale, center) + if utils.is_closed_edge(edge_index, obj): + scale_vertex(obj, 0, scale, center) else: - scaleVertex(obj, edge_index+1, scale, center) + scale_vertex(obj, edge_index+1, scale, center) scaleEdge = scale_edge @@ -188,15 +188,15 @@ def copy_scaled_edge(obj, edge_index, scale, center): Needed for SubObjects modifiers. Implemented by Dion Moult during 0.19 dev cycle (works only with Draft Wire). """ - vertex1 = scaleVectorFromCenter( + vertex1 = scale_vector_from_center( obj.Placement.multVec(obj.Points[edge_index]), scale, center) - if utils.isClosedEdge(edge_index, obj): - vertex2 = scaleVectorFromCenter( + if utils.is_closed_edge(edge_index, obj): + vertex2 = scale_vector_from_center( obj.Placement.multVec(obj.Points[0]), scale, center) else: - vertex2 = scaleVectorFromCenter( + vertex2 = scale_vector_from_center( obj.Placement.multVec(obj.Points[edge_index+1]), scale, center) return make_line.make_line(vertex1, vertex2) @@ -212,7 +212,7 @@ def copy_scaled_edges(arguments): """ copied_edges = [] for argument in arguments: - copied_edges.append(copyScaledEdge(argument[0], argument[1], + copied_edges.append(copy_scaled_edge(argument[0], argument[1], argument[2], argument[3])) join.join_wires(copied_edges) diff --git a/src/Mod/Draft/draftguitools/gui_mirror.py b/src/Mod/Draft/draftguitools/gui_mirror.py index d0d4d5f94f..d3c2d7f801 100644 --- a/src/Mod/Draft/draftguitools/gui_mirror.py +++ b/src/Mod/Draft/draftguitools/gui_mirror.py @@ -84,7 +84,6 @@ class Mirror(gui_base_original.Modifier): self.sel = Gui.Selection.getSelection() self.ui.pointUi(title=translate("draft", self.featureName), icon="Draft_Mirror") - self.ui.modUi() self.ui.xValue.setFocus() self.ui.xValue.selectAll() # self.ghost = trackers.ghostTracker(self.sel) diff --git a/src/Mod/Draft/draftguitools/gui_move.py b/src/Mod/Draft/draftguitools/gui_move.py index 803d95b55e..98a80a449a 100644 --- a/src/Mod/Draft/draftguitools/gui_move.py +++ b/src/Mod/Draft/draftguitools/gui_move.py @@ -174,19 +174,23 @@ class Move(gui_base_original.Modifier): def set_ghosts(self): """Set the ghost to display.""" + for ghost in self.ghosts: + ghost.remove() if self.ui.isSubelementMode.isChecked(): - return self.set_subelement_ghosts() - self.ghosts = [trackers.ghostTracker(self.selected_objects)] + self.ghosts = self.get_subelement_ghosts() + else: + self.ghosts = [trackers.ghostTracker(self.selected_objects)] - def set_subelement_ghosts(self): - """Set ghost for the subelements.""" + def get_subelement_ghosts(self): + """Get ghost for the subelements (vertices, edges).""" import Part + ghosts = [] for object in self.selected_subelements: for subelement in object.SubObjects: - if (isinstance(subelement, Part.Vertex) - or isinstance(subelement, Part.Edge)): - self.ghosts.append(trackers.ghostTracker(subelement)) + if isinstance(subelement, (Part.Vertex, Part.Edge)): + ghosts.append(trackers.ghostTracker(subelement)) + return ghosts def move(self, is_copy=False): """Perform the move of the subelements or the entire object.""" diff --git a/src/Mod/Draft/draftguitools/gui_rotate.py b/src/Mod/Draft/draftguitools/gui_rotate.py index be7a5888b0..709f5f4964 100644 --- a/src/Mod/Draft/draftguitools/gui_rotate.py +++ b/src/Mod/Draft/draftguitools/gui_rotate.py @@ -94,7 +94,6 @@ class Rotate(gui_base_original.Modifier): self.step = 0 self.center = None self.ui.rotateSetCenterUi() - self.ui.modUi() self.arctrack = trackers.arcTracker() self.call = self.view.addEventCallback("SoEvent", self.action) _msg(translate("draft", "Pick rotation center")) @@ -235,19 +234,26 @@ class Rotate(gui_base_original.Modifier): def set_ghosts(self): """Set the ghost to display.""" + for ghost in self.ghosts: + ghost.remove() if self.ui.isSubelementMode.isChecked(): - return self.set_subelement_ghosts() - self.ghosts = [trackers.ghostTracker(self.selected_objects)] + self.ghosts = self.get_subelement_ghosts() + else: + self.ghosts = [trackers.ghostTracker(self.selected_objects)] + if self.center: + for ghost in self.ghosts: + ghost.center(self.center) - def set_subelement_ghosts(self): - """Set ghost for the subelements (vertices, edges).""" + def get_subelement_ghosts(self): + """Get ghost for the subelements (vertices, edges).""" import Part - for obj in self.selected_subelements: - for subelement in obj.SubObjects: - if (isinstance(subelement, Part.Vertex) - or isinstance(subelement, Part.Edge)): - self.ghosts.append(trackers.ghostTracker(subelement)) + ghosts = [] + for object in self.selected_subelements: + for subelement in object.SubObjects: + if isinstance(subelement, (Part.Vertex, Part.Edge)): + ghosts.append(trackers.ghostTracker(subelement)) + return ghosts def finish(self, closed=False, cont=False): """Finish the rotate operation.""" diff --git a/src/Mod/Draft/draftguitools/gui_scale.py b/src/Mod/Draft/draftguitools/gui_scale.py index 0f1e164639..27c26b8e45 100644 --- a/src/Mod/Draft/draftguitools/gui_scale.py +++ b/src/Mod/Draft/draftguitools/gui_scale.py @@ -99,7 +99,7 @@ class Scale(gui_base_original.Modifier): self.selected_subelements = Gui.Selection.getSelectionEx() self.refs = [] self.ui.pointUi(title=translate("draft",self.featureName), icon="Draft_Scale") - self.ui.modUi() + self.ui.isRelative.hide() self.ui.xValue.setFocus() self.ui.xValue.selectAll() self.pickmode = False @@ -108,19 +108,24 @@ class Scale(gui_base_original.Modifier): _msg(translate("draft", "Pick base point")) def set_ghosts(self): - """Set the previews of the objects to scale.""" - if self.ui.isSubelementMode.isChecked(): - return self.set_subelement_ghosts() - self.ghosts = [trackers.ghostTracker(self.selected_objects)] + """Set the ghost to display.""" + for ghost in self.ghosts: + ghost.remove() + if self.task and self.task.isSubelementMode.isChecked(): + self.ghosts = self.get_subelement_ghosts() + else: + self.ghosts = [trackers.ghostTracker(self.selected_objects)] - def set_subelement_ghosts(self): - """Set the previews of the subelements from an object to scale.""" + def get_subelement_ghosts(self): + """Get ghost for the subelements (vertices, edges).""" import Part + ghosts = [] for object in self.selected_subelements: for subelement in object.SubObjects: if isinstance(subelement, (Part.Vertex, Part.Edge)): - self.ghosts.append(trackers.ghostTracker(subelement)) + ghosts.append(trackers.ghostTracker(subelement)) + return ghosts def pickRef(self): """Pick a point of reference.""" diff --git a/src/Mod/Draft/draftguitools/gui_stretch.py b/src/Mod/Draft/draftguitools/gui_stretch.py index 79cf56e59a..17aa462883 100644 --- a/src/Mod/Draft/draftguitools/gui_stretch.py +++ b/src/Mod/Draft/draftguitools/gui_stretch.py @@ -118,7 +118,6 @@ class Stretch(gui_base_original.Modifier): self.step = 1 self.refpoint = None self.ui.pointUi(title=translate("draft", self.featureName), icon="Draft_Stretch") - self.ui.extUi() self.call = self.view.addEventCallback("SoEvent", self.action) self.rectracker = trackers.rectangleTracker(dotted=True, scolor=(0.0, 0.0, 1.0), diff --git a/src/Mod/Draft/draftguitools/gui_trackers.py b/src/Mod/Draft/draftguitools/gui_trackers.py index a8a552b33c..05cb0a011e 100644 --- a/src/Mod/Draft/draftguitools/gui_trackers.py +++ b/src/Mod/Draft/draftguitools/gui_trackers.py @@ -81,7 +81,9 @@ class Tracker: ToDo.delay(self._insertSwitch, self.switch) def finalize(self): - """Finish the command by removing the switch.""" + """Finish the command by removing the switch. + Also called by ghostTracker.remove. + """ ToDo.delay(self._removeSwitch, self.switch) self.switch = None @@ -694,14 +696,10 @@ class ghostTracker(Tracker): super().__init__(dotted, scolor, swidth, children=self.children, name="ghostTracker") - def update(self, obj): - """Recreate the ghost from a new object.""" - obj.ViewObject.show() - self.finalize() - sep = self.getNode(obj) - super().__init__(children=[sep]) - self.on() - obj.ViewObject.hide() + def remove(self): + """Remove the ghost when switching to and from subelement mode.""" + if self.switch: + self.finalize() def move(self, delta): """Move the ghost to a given position. @@ -1151,7 +1149,7 @@ class gridTracker(Tracker): loc = FreeCAD.Vector(-bound+self.space/2,-bound+self.space/2,0) hpts = BimProject.getHuman(loc) pts.extend([tuple(p) for p in hpts]) - pidx.append(len(hpts)) + pidx.append(len(hpts)) except Exception: # BIM not installed return diff --git a/src/Mod/Draft/drafttaskpanels/task_scale.py b/src/Mod/Draft/drafttaskpanels/task_scale.py index 28e31ab9fb..e8c0c6d3a8 100644 --- a/src/Mod/Draft/drafttaskpanels/task_scale.py +++ b/src/Mod/Draft/drafttaskpanels/task_scale.py @@ -46,28 +46,30 @@ class ScaleTaskPanel: """The task panel for the Draft Scale tool.""" def __init__(self): + decimals = App.ParamGet("User parameter:BaseApp/Preferences/Units").GetInt("Decimals", 2) self.sourceCmd = None self.form = QtGui.QWidget() + self.form.setWindowIcon(QtGui.QIcon(":/icons/Draft_Scale.svg")) layout = QtGui.QGridLayout(self.form) self.xLabel = QtGui.QLabel() layout.addWidget(self.xLabel, 0, 0, 1, 1) self.xValue = QtGui.QDoubleSpinBox() self.xValue.setRange(0.0000001, 1000000.0) - self.xValue.setDecimals(Draft.precision()) + self.xValue.setDecimals(decimals) self.xValue.setValue(1) layout.addWidget(self.xValue,0,1,1,1) self.yLabel = QtGui.QLabel() layout.addWidget(self.yLabel,1,0,1,1) self.yValue = QtGui.QDoubleSpinBox() - self.yValue.setRange(.0000001,1000000.0) - self.yValue.setDecimals(Draft.precision()) + self.yValue.setRange(0.0000001, 1000000.0) + self.yValue.setDecimals(decimals) self.yValue.setValue(1) layout.addWidget(self.yValue,1,1,1,1) self.zLabel = QtGui.QLabel() layout.addWidget(self.zLabel,2,0,1,1) self.zValue = QtGui.QDoubleSpinBox() - self.zValue.setRange(.0000001,1000000.0) - self.zValue.setDecimals(Draft.precision()) + self.zValue.setRange(0.0000001, 1000000.0) + self.zValue.setDecimals(decimals) self.zValue.setValue(1) layout.addWidget(self.zValue,2,1,1,1) self.lock = QtGui.QCheckBox() @@ -93,16 +95,23 @@ class ScaleTaskPanel: QtCore.QObject.connect(self.lock,QtCore.SIGNAL("toggled(bool)"),self.setLock) QtCore.QObject.connect(self.relative,QtCore.SIGNAL("toggled(bool)"),self.setRelative) QtCore.QObject.connect(self.isCopy,QtCore.SIGNAL("toggled(bool)"),self.setCopy) + QtCore.QObject.connect(self.isSubelementMode,QtCore.SIGNAL("toggled(bool)"),self.setSubelementMode) QtCore.QObject.connect(self.isClone,QtCore.SIGNAL("toggled(bool)"),self.setClone) self.retranslateUi() def setLock(self, state): """Set the uniform scaling.""" App.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetBool("ScaleUniform", state) + if state: + val = self.xValue.value() + self.yValue.setValue(val) + self.zValue.setValue(val) def setRelative(self, state): """Set the relative scaling.""" App.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetBool("ScaleRelative", state) + if self.sourceCmd: + self.sourceCmd.scaleGhost(self.xValue.value(),self.yValue.value(),self.zValue.value(),self.relative.isChecked()) def setCopy(self, state): """Set the scale and copy option.""" @@ -110,11 +119,20 @@ class ScaleTaskPanel: if state and self.isClone.isChecked(): self.isClone.setChecked(False) + def setSubelementMode(self, state): + if state and self.isClone.isChecked(): + self.isClone.setChecked(False) + if self.sourceCmd: + self.sourceCmd.set_ghosts() + self.sourceCmd.scaleGhost(self.xValue.value(),self.yValue.value(),self.zValue.value(),self.relative.isChecked()) + def setClone(self, state): """Set the clone and scale option.""" App.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").SetBool("ScaleClone", state) if state and self.isCopy.isChecked(): self.isCopy.setChecked(False) + if state and self.isSubelementMode.isChecked(): + self.isSubelementMode.setChecked(False) def setValue(self, val=None): """Set the value of the points."""