Browse Source

Added merging for multi material

Jaime van Kessel 9 years ago
parent
commit
19d711fb80

+ 19 - 0
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()

+ 8 - 0
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

+ 11 - 2
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") 

+ 9 - 0
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

+ 7 - 0
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 {