mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-07 06:57:28 -06:00
Click support eraser mesh to remove it from the scene
This commit is contained in:
parent
11be8f158f
commit
c25711797e
1 changed files with 24 additions and 3 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue