From 7ab0574928cbfaa6a656726f608bf9f13cbd7fe6 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 21 Feb 2019 21:36:10 +1100 Subject: [PATCH] Make movement vector a class variable of the move command, show error for unmovable elements, and move action into a commit to allow undo/redo. --- src/Mod/Draft/Draft.py | 3 +-- src/Mod/Draft/DraftTools.py | 46 +++++++++++++++++++++++++------------ 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index c7904dc5e2..6b55644cc3 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -1492,9 +1492,8 @@ def moveVertex(object, vertex_index, vertex, vector): points = object.Points points[vertex_index] = object.Placement.inverse().multVec(vertex).add(vector) object.Points = points - FreeCAD.ActiveDocument.recompute() -def moveEdge(object, edge_index, edge, vector): +def moveEdge(object, edge_index, vector): moveVertex(object, edge_index, object.Placement.multVec(object.Points[edge_index]), vector) moveVertex(object, edge_index+1, object.Placement.multVec(object.Points[edge_index+1]), vector) diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index 893a2d5597..aca8d1fcd5 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -2613,9 +2613,9 @@ class Move(Modifier): self.point, ctrlPoint, info = getPoint(self,arg) if (len(self.node) > 0): last = self.node[len(self.node)-1] - delta = self.point.sub(last) + self.vector = self.point.sub(last) for ghost in self.ghosts: - ghost.move(delta) + ghost.move(self.vector) ghost.on() if self.extendedCopy: if not hasMod(arg,MODALT): self.finish() @@ -2637,7 +2637,8 @@ class Move(Modifier): self.planetrack.set(self.point) else: last = self.node[0] - self.move(self.point.sub(last)) + self.vector = self.point.sub(last) + self.move() if hasMod(arg,MODALT): self.extendedCopy = True else: @@ -2658,29 +2659,44 @@ class Move(Modifier): ghost.on() self.ghosts.append(ghost) - def move(self, delta): + def move(self): if self.ui.isSubelementMode.isChecked(): - self.move_subelements(delta) + self.move_subelements() else: - self.move_object(delta) + self.move_object() - def move_subelements(self, delta): + def move_subelements(self): + try: + self.commit(translate("draft", "Move"), self.build_move_subelements_command()) + except: + FreeCAD.Console.PrintError(translate("draft", "Some subelements could not be moved.")) + + def build_move_subelements_command(self): + import Part + command = [] for object in self.selected_subelements: for index, subelement in enumerate(object.SubObjects): if isinstance(subelement, Part.Vertex): - Draft.moveVertex(getattr(FreeCAD.ActiveDocument, object.ObjectName), - int(object.SubElementNames[index][len("Vertex"):])-1, - subelement.Point, delta) + command.append('Draft.moveVertex(FreeCAD.ActiveDocument.{}, {}, {}, {})'.format( + object.ObjectName, + int(object.SubElementNames[index][len("Vertex"):])-1, + DraftVecUtils.toString(subelement.Point), + DraftVecUtils.toString(self.vector) + )) elif isinstance(subelement, Part.Edge): - Draft.moveEdge(getattr(FreeCAD.ActiveDocument, object.ObjectName), - int(object.SubElementNames[index][len("Edge"):])-1, - subelement, delta) + command.append('Draft.moveEdge(FreeCAD.ActiveDocument.{}, {}, {})'.format( + object.ObjectName, + int(object.SubElementNames[index][len("Edge"):])-1, + DraftVecUtils.toString(self.vector) + )) + command.append('FreeCAD.ActiveDocument.recompute()') + return command - def move_object(self, delta): + def move_object(self): objects = '[' + ','.join(['FreeCAD.ActiveDocument.' + object.Name for object in self.selected_objects]) + ']' FreeCADGui.addModule("Draft") self.commit(translate("draft","Copy" if self.ui.isCopy.isChecked() else "Move"), - ['Draft.move('+objects+','+DraftVecUtils.toString(delta)+',copy='+str(self.ui.isCopy.isChecked())+')', 'FreeCAD.ActiveDocument.recompute()']) + ['Draft.move('+objects+','+DraftVecUtils.toString(self.vector)+',copy='+str(self.ui.isCopy.isChecked())+')', 'FreeCAD.ActiveDocument.recompute()']) def numericInput(self,numx,numy,numz): "this function gets called by the toolbar when valid x, y, and z have been entered there"