SupportEraser.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. # Copyright (c) 2018 Ultimaker B.V.
  2. # Cura is released under the terms of the LGPLv3 or higher.
  3. from UM.Math.Vector import Vector
  4. from UM.Tool import Tool
  5. from PyQt5.QtCore import Qt, QUrl
  6. from UM.Application import Application
  7. from UM.Event import Event, MouseEvent
  8. from UM.Mesh.MeshBuilder import MeshBuilder
  9. from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation
  10. from UM.Settings.SettingInstance import SettingInstance
  11. from cura.Scene.CuraSceneNode import CuraSceneNode
  12. from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
  13. from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
  14. from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
  15. from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator
  16. from cura.DepthPass import DepthPass
  17. import os
  18. import os.path
  19. class SupportEraser(Tool):
  20. def __init__(self):
  21. super().__init__()
  22. self._shortcut_key = Qt.Key_G
  23. self._controller = Application.getInstance().getController()
  24. def event(self, event):
  25. super().event(event)
  26. if event.type == Event.MousePressEvent and self._controller.getToolsEnabled():
  27. active_camera = self._controller.getScene().getActiveCamera()
  28. # Create depth pass for picking
  29. depth_pass = DepthPass(active_camera.getViewportWidth(), active_camera.getViewportHeight())
  30. depth_pass.render()
  31. distance = depth_pass.getDepthAtPosition(event.x, event.y)
  32. ray = active_camera.getRay(event.x, event.y)
  33. picked_position = ray.getPointAlongRay(distance)
  34. # Add the anto_overhang_mesh cube:
  35. self._createEraserMesh(picked_position)
  36. def _createEraserMesh(self, position: Vector):
  37. node = CuraSceneNode()
  38. node.setName("Eraser")
  39. node.setSelectable(True)
  40. mesh = MeshBuilder()
  41. mesh.addCube(10,10,10)
  42. node.setMeshData(mesh.build())
  43. node.setPosition(position)
  44. active_build_plate = Application.getInstance().getMultiBuildPlateModel().activeBuildPlate
  45. node.addDecorator(SettingOverrideDecorator())
  46. node.addDecorator(BuildPlateDecorator(active_build_plate))
  47. node.addDecorator(SliceableObjectDecorator())
  48. stack = node.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway.
  49. if not stack:
  50. node.addDecorator(SettingOverrideDecorator())
  51. stack = node.callDecoration("getStack")
  52. settings = stack.getTop()
  53. if not (settings.getInstance("anti_overhang_mesh") and settings.getProperty("anti_overhang_mesh", "value")):
  54. definition = stack.getSettingDefinition("anti_overhang_mesh")
  55. new_instance = SettingInstance(definition, settings)
  56. new_instance.setProperty("value", True)
  57. new_instance.resetState() # Ensure that the state is not seen as a user state.
  58. settings.addInstance(new_instance)
  59. scene = self._controller.getScene()
  60. op = AddSceneNodeOperation(node, scene.getRoot())
  61. op.push()
  62. Application.getInstance().getController().getScene().sceneChanged.emit(node)