diff --git a/Printer.qml b/Printer.qml index 5bf07f3d4c..b871a60de4 100644 --- a/Printer.qml +++ b/Printer.qml @@ -220,6 +220,32 @@ UM.MainWindow { deleteSelection.onTriggered: UM.Controller.removeSelection(); + deleteObject.onTriggered: { + if(objectContextMenu.id != 0) { + Printer.deleteObject(objectContextMenu.id); + objectContextMenu.id = 0; + } + } + + multiplyObject.onTriggered: { + if(objectContextMenu.id != 0) { + Printer.multiplyObject(objectContextMenu.id, 1); + objectContextMenu.id = 0; + } + } + + centerObject.onTriggered: { + if(objectContextMenu.id != 0) { + Printer.centerObject(objectContextMenu.id); + objectContextMenu.id = 0; + } + } + + deleteAll.onTriggered: Printer.deleteAll() + resetAllTranslation.onTriggered: Printer.resetAllTranslation() + resetAll.onTriggered: Printer.resetAll() + reloadAll.onTriggered: Printer.reloadAll() + addMachine.onTriggered: addMachine.visible = true; preferences.onTriggered: preferences.visible = true; diff --git a/PrinterApplication.py b/PrinterApplication.py index 0bc691d652..a2f9560c2b 100644 --- a/PrinterApplication.py +++ b/PrinterApplication.py @@ -8,10 +8,16 @@ from UM.Resources import Resources from UM.Scene.ToolHandle import ToolHandle from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Mesh.WriteMeshJob import WriteMeshJob +from UM.Mesh.ReadMeshJob import ReadMeshJob from UM.Scene.BoxRenderer import BoxRenderer from UM.Scene.Selection import Selection +from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation +from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation +from UM.Operations.GroupedOperation import GroupedOperation +from UM.Operations.SetTransformOperation import SetTransformOperation + from PlatformPhysics import PlatformPhysics from BuildVolume import BuildVolume from CameraAnimation import CameraAnimation @@ -22,6 +28,7 @@ from PyQt5.QtGui import QColor import os.path import numpy numpy.seterr(all='ignore') +import copy class PrinterApplication(QtApplication): def __init__(self): @@ -120,6 +127,106 @@ class PrinterApplication(QtApplication): requestAddPrinter = pyqtSignal() + @pyqtSlot('quint64') + def deleteObject(self, object_id): + object = self.getController().getScene().findObject(object_id) + + if object: + op = RemoveSceneNodeOperation(object) + op.push() + + @pyqtSlot('quint64', int) + def multiplyObject(self, object_id, count): + node = self.getController().getScene().findObject(object_id) + + if node: + op = GroupedOperation() + for i in range(count): + new_node = SceneNode() + new_node.setMeshData(node.getMeshData()) + new_node.setScale(node.getScale()) + new_node.translate(Vector((i + 1) * node.getBoundingBox().width, 0, 0)) + new_node.setSelectable(True) + op.addOperation(AddSceneNodeOperation(new_node, node.getParent())) + op.push() + + @pyqtSlot('quint64') + def centerObject(self, object_id): + node = self.getController().getScene().findObject(object_id) + + if node: + transform = node.getLocalTransformation() + transform.setTranslation(Vector(0, 0, 0)) + op = SetTransformOperation(node, transform) + op.push() + + @pyqtSlot() + def deleteAll(self): + nodes = [] + for node in DepthFirstIterator(self.getController().getScene().getRoot()): + if type(node) is not SceneNode or not node.getMeshData(): + continue + nodes.append(node) + + if nodes: + op = GroupedOperation() + + for node in nodes: + op.addOperation(RemoveSceneNodeOperation(node)) + + op.push() + + @pyqtSlot() + def resetAllTranslation(self): + nodes = [] + for node in DepthFirstIterator(self.getController().getScene().getRoot()): + if type(node) is not SceneNode or not node.getMeshData(): + continue + nodes.append(node) + + if nodes: + op = GroupedOperation() + + for node in nodes: + transform = node.getLocalTransformation() + transform.setTranslation(Vector(0, 0, 0)) + op.addOperation(SetTransformOperation(node, transform)) + + op.push() + + @pyqtSlot() + def resetAll(self): + nodes = [] + for node in DepthFirstIterator(self.getController().getScene().getRoot()): + if type(node) is not SceneNode or not node.getMeshData(): + continue + nodes.append(node) + + if nodes: + op = GroupedOperation() + + for node in nodes: + transform = Matrix() + op.addOperation(SetTransformOperation(node, transform)) + + op.push() + + @pyqtSlot() + def reloadAll(self): + nodes = [] + for node in DepthFirstIterator(self.getController().getScene().getRoot()): + if type(node) is not SceneNode or not node.getMeshData(): + continue + + nodes.append(node) + + if nodes: + file_name = node.getMeshData().getFileName() + + job = ReadMeshJob(file_name) + job.finished.connect(lambda j: node.setMeshData(j.getResult())) + job.start() + def _onActiveMachineChanged(self): machine = self.getActiveMachine() if machine: