diff --git a/plugins/SupportEraser/SupportEraser.py b/plugins/SupportEraser/SupportEraser.py new file mode 100644 index 0000000000..5a58d1bc2e --- /dev/null +++ b/plugins/SupportEraser/SupportEraser.py @@ -0,0 +1,68 @@ +from UM.Tool import Tool +from PyQt5.QtCore import Qt, QUrl +from UM.Application import Application +from UM.Event import Event +from UM.Mesh.MeshBuilder import MeshBuilder +from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation +from UM.Settings.SettingInstance import SettingInstance +from cura.Scene.CuraSceneNode import CuraSceneNode +from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator +from cura.Scene.BuildPlateDecorator import BuildPlateDecorator +from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator + +import os +import os.path + +class SupportEraser(Tool): + def __init__(self): + super().__init__() + self._shortcut_key = Qt.Key_G + self._controller = Application.getInstance().getController() + + def event(self, event): + super().event(event) + + if event.type == Event.ToolActivateEvent: + + # Load the remover mesh: + self._createEraserMesh() + + # After we load the mesh, deactivate the tool again: + self.getController().setActiveTool(None) + + def _createEraserMesh(self): + # Selection.clear() + + node = CuraSceneNode() + + node.setName("Eraser") + node.setSelectable(True) + mesh = MeshBuilder() + mesh.addCube(10,10,10) + node.setMeshData(mesh.build()) + + active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate + + node.addDecorator(SettingOverrideDecorator()) + node.addDecorator(BuildPlateDecorator(active_build_plate)) + node.addDecorator(SliceableObjectDecorator()) + + stack = node.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway. + if not stack: + node.addDecorator(SettingOverrideDecorator()) + stack = node.callDecoration("getStack") + + print(stack) + settings = stack.getTop() + + if not (settings.getInstance("anti_overhang_mesh") and settings.getProperty("anti_overhang_mesh", "value")): + definition = stack.getSettingDefinition("anti_overhang_mesh") + new_instance = SettingInstance(definition, settings) + new_instance.setProperty("value", True) + new_instance.resetState() # Ensure that the state is not seen as a user state. + settings.addInstance(new_instance) + + scene = self._controller.getScene() + op = AddSceneNodeOperation(node, scene.getRoot()) + op.push() + Application.getInstance().getController().getScene().sceneChanged.emit(node) diff --git a/plugins/SupportEraser/__init__.py b/plugins/SupportEraser/__init__.py new file mode 100644 index 0000000000..904a25b425 --- /dev/null +++ b/plugins/SupportEraser/__init__.py @@ -0,0 +1,20 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from . import SupportEraser + +from UM.i18n import i18nCatalog +i18n_catalog = i18nCatalog("uranium") + +def getMetaData(): + return { + "tool": { + "name": i18n_catalog.i18nc("@label", "Support Blocker"), + "description": i18n_catalog.i18nc("@info:tooltip", "Create a volume in which supports are not printed."), + "icon": "tool_icon.svg", + "weight": 4 + } + } + +def register(app): + return { "tool": SupportEraser.SupportEraser() } diff --git a/plugins/SupportEraser/plugin.json b/plugins/SupportEraser/plugin.json new file mode 100644 index 0000000000..5ccb639913 --- /dev/null +++ b/plugins/SupportEraser/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Support Eraser", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Creates an eraser mesh to block the printing of support in certain places", + "api": 4, + "i18n-catalog": "cura" +} diff --git a/plugins/SupportEraser/tool_icon.svg b/plugins/SupportEraser/tool_icon.svg new file mode 100644 index 0000000000..a0f8a3e3c3 --- /dev/null +++ b/plugins/SupportEraser/tool_icon.svg @@ -0,0 +1,11 @@ + + + Created with Sketch. + + + + + + + +