diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e7eb9e2725..4b773b9273 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -36,6 +36,7 @@ from . import BuildVolume from . import CameraAnimation from . import PrintInformation from . import CuraActions +from . import MultiMaterialDecorator from PyQt5.QtCore import pyqtSlot, QUrl, Qt, pyqtSignal, pyqtProperty from PyQt5.QtGui import QColor, QIcon @@ -425,7 +426,25 @@ class CuraApplication(QtApplication): self.getActiveMachine().setSettingValueByKey(key, value) + @pyqtSlot() + def mergeSelected(self): + self.groupSelected() + try: + group_node = Selection.getAllSelectedObjects()[0] + except Exception as e: + return + multi_material_decorator = MultiMaterialDecorator.MultiMaterialDecorator() + group_node.addDecorator(multi_material_decorator) + # Reset the position of each node + for node in group_node.getChildren(): + new_position = node.getPosition() + new_position.setX(0) + new_position.setZ(0) + node.setPosition(new_position) + # Use the previously found center of the group bounding box as the new location of the group + group_node.setPosition((group_node.getBoundingBox().maximum + group_node.getBoundingBox().minimum) / 2) + @pyqtSlot() def groupSelected(self): group_node = SceneNode() diff --git a/cura/MultiMaterialDecorator.py b/cura/MultiMaterialDecorator.py new file mode 100644 index 0000000000..c702ecef13 --- /dev/null +++ b/cura/MultiMaterialDecorator.py @@ -0,0 +1,8 @@ +from UM.Scene.SceneNodeDecorator import SceneNodeDecorator + +class MultiMaterialDecorator(SceneNodeDecorator): + def __init__(self): + super().__init__() + + def isMultiMaterial(self): + return True \ No newline at end of file diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 20e5c9ecc4..7f6c1df3b9 100644 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -80,9 +80,18 @@ class PlatformPhysics: # Check for collisions between convex hulls for other_node in BreadthFirstIterator(root): # Ignore root, ourselves and anything that is not a normal SceneNode. - if other_node is root or type(other_node) is not SceneNode or other_node is node or other_node in node.getAllChildren() or node in other_node.getAllChildren(): + if other_node is root or type(other_node) is not SceneNode or other_node is node: continue + # Ignore colissions of a group with it's own children + if other_node in node.getAllChildren() or node in other_node.getAllChildren(): + continue + + # Ignore colissions within a group + if other_node.getParent().callDecoration("isGroup") is not None: + if node.getParent().callDecoration("isGroup") is other_node.getParent().callDecoration("isGroup"): + continue + # Ignore nodes that do not have the right properties set. if not other_node.callDecoration("getConvexHull") or not other_node.getBoundingBox(): continue @@ -95,7 +104,7 @@ class PlatformPhysics: overlap = node.callDecoration("getConvexHull").intersectsPolygon(other_node.callDecoration("getConvexHull")) if overlap is None: continue - + move_vector.setX(overlap[0] * 1.1) move_vector.setZ(overlap[1] * 1.1) convex_hull = node.callDecoration("getConvexHull") diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index a223e00bb7..d364b462b6 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -19,6 +19,8 @@ Item { property alias centerObject: centerObjectAction; property alias groupObjects: groupObjectsAction; property alias unGroupObjects:unGroupObjectsAction; + property alias mergeObjects: mergeObjectsAction; + //property alias unMergeObjects: unMergeObjectsAction; property alias multiplyObject: multiplyObjectAction; property alias splitObject: splitObjectAction; @@ -139,6 +141,13 @@ Item { enabled: UM.Scene.isGroupSelected } + Action + { + id: mergeObjectsAction + text: qsTr("Merge objects"); + enabled: UM.Scene.numObjectsSelected > 1 ? true: false + } + Action { id: multiplyObjectAction; //: Duplicate object action diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 3c87dffe8a..35a1ad5e6c 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -357,6 +357,11 @@ UM.MainWindow { { Printer.ungroupSelected() } + + mergeObjects.onTriggered: + { + Printer.mergeSelected() + } deleteAll.onTriggered: Printer.deleteAll() resetAllTranslation.onTriggered: Printer.resetAllTranslation() @@ -390,6 +395,7 @@ UM.MainWindow { MenuItem { action: actions.resetAll; } MenuItem { action: actions.groupObjects;} MenuItem { action: actions.unGroupObjects;} + MenuItem { action: actions.mergeObjects;} } Menu { @@ -400,6 +406,7 @@ UM.MainWindow { MenuItem { action: actions.resetAll; } MenuItem { action: actions.groupObjects;} MenuItem { action: actions.unGroupObjects;} + MenuItem { action: actions.mergeObjects;} } Connections {