Click support eraser mesh to remove it from the scene

This commit is contained in:
fieldOfView 2018-03-15 12:46:22 +01:00
parent 11be8f158f
commit c25711797e

View file

@ -7,6 +7,7 @@ from UM.Application import Application
from UM.Event import Event, MouseEvent from UM.Event import Event, MouseEvent
from UM.Mesh.MeshBuilder import MeshBuilder from UM.Mesh.MeshBuilder import MeshBuilder
from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation
from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation
from UM.Settings.SettingInstance import SettingInstance from UM.Settings.SettingInstance import SettingInstance
from cura.Scene.CuraSceneNode import CuraSceneNode from cura.Scene.CuraSceneNode import CuraSceneNode
from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
@ -24,24 +25,39 @@ class SupportEraser(Tool):
self._shortcut_key = Qt.Key_G self._shortcut_key = Qt.Key_G
self._controller = Application.getInstance().getController() self._controller = Application.getInstance().getController()
self._selection_pass = None
Application.getInstance().globalContainerStackChanged.connect(self._updateEnabled) Application.getInstance().globalContainerStackChanged.connect(self._updateEnabled)
def event(self, event): def event(self, event):
super().event(event) super().event(event)
if event.type == Event.MousePressEvent and self._controller.getToolsEnabled(): if event.type == Event.MousePressEvent and self._controller.getToolsEnabled():
active_camera = self._controller.getScene().getActiveCamera()
if self._selection_pass is None:
# The selection renderpass is used to identify objects in the current view
self._selection_pass = Application.getInstance().getRenderer().getRenderPass("selection")
picked_node = self._controller.getScene().findObject(self._selection_pass.getIdAtPosition(event.x, event.y))
node_stack = picked_node.callDecoration("getStack")
if node_stack:
if node_stack.getProperty("anti_overhang_mesh", "value"):
self._removeEraserMesh(picked_node)
return
elif node_stack.getProperty("support_mesh", "value") or node_stack.getProperty("infill_mesh", "value") or node_stack.getProperty("cutting_mesh", "value"):
return
# Create a pass for picking a world-space location from the mouse location # Create a pass for picking a world-space location from the mouse location
active_camera = self._controller.getScene().getActiveCamera()
picking_pass = PickingPass(active_camera.getViewportWidth(), active_camera.getViewportHeight()) picking_pass = PickingPass(active_camera.getViewportWidth(), active_camera.getViewportHeight())
picking_pass.render() picking_pass.render()
picked_position = picking_pass.getPickedPosition(event.x, event.y) picked_position = picking_pass.getPickedPosition(event.x, event.y)
# Add the anti_overhang_mesh cube at the picked location # Add the anti_overhang_mesh cube at the picked location
self._createEraserMesh(picked_position) self._createEraserMesh(picked_node, picked_position)
def _createEraserMesh(self, position: Vector): def _createEraserMesh(self, parent: CuraSceneNode, position: Vector):
node = CuraSceneNode() node = CuraSceneNode()
node.setName("Eraser") node.setName("Eraser")
@ -76,6 +92,11 @@ class SupportEraser(Tool):
op.push() op.push()
Application.getInstance().getController().getScene().sceneChanged.emit(node) Application.getInstance().getController().getScene().sceneChanged.emit(node)
def _removeEraserMesh(self, node: CuraSceneNode):
op = RemoveSceneNodeOperation(node)
op.push()
Application.getInstance().getController().getScene().sceneChanged.emit(node)
def _updateEnabled(self): def _updateEnabled(self):
plugin_enabled = False plugin_enabled = False