Browse Source

Click support eraser mesh to remove it from the scene

fieldOfView 7 years ago
parent
commit
c25711797e
1 changed files with 24 additions and 3 deletions
  1. 24 3
      plugins/SupportEraser/SupportEraser.py

+ 24 - 3
plugins/SupportEraser/SupportEraser.py

@@ -7,6 +7,7 @@ from UM.Application import Application
 from UM.Event import Event, MouseEvent
 from UM.Mesh.MeshBuilder import MeshBuilder
 from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation
+from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation
 from UM.Settings.SettingInstance import SettingInstance
 from cura.Scene.CuraSceneNode import CuraSceneNode
 from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
@@ -24,24 +25,39 @@ class SupportEraser(Tool):
         self._shortcut_key = Qt.Key_G
         self._controller = Application.getInstance().getController()
 
+        self._selection_pass = None
         Application.getInstance().globalContainerStackChanged.connect(self._updateEnabled)
 
     def event(self, event):
         super().event(event)
 
         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
+            active_camera = self._controller.getScene().getActiveCamera()
             picking_pass = PickingPass(active_camera.getViewportWidth(), active_camera.getViewportHeight())
             picking_pass.render()
 
             picked_position = picking_pass.getPickedPosition(event.x, event.y)
 
             # 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.setName("Eraser")
@@ -76,6 +92,11 @@ class SupportEraser(Tool):
         op.push()
         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):
         plugin_enabled = False