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.

This commit is contained in:
Dion Moult
2019-02-21 21:36:10 +11:00
committed by Yorik van Havre
parent efa4f7cdc9
commit 7ab0574928
2 changed files with 32 additions and 17 deletions

View File

@@ -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)

View File

@@ -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"