Browse Source

LayerData now works by using decorators

Jaime van Kessel 9 years ago
parent
commit
c6f5ceaf56

+ 12 - 0
plugins/CuraEngineBackend/LayerDataDecorator.py

@@ -0,0 +1,12 @@
+from UM.Scene.SceneNodeDecorator import SceneNodeDecorator
+
+class LayerDataDecorator(SceneNodeDecorator):
+    def __init__(self):
+        super().__init__()
+        self._layer_data = None
+        
+    def getLayerData(self):
+        return self._layer_data
+    
+    def setLayerData(self, layer_data):
+        self._layer_data = layer_data

+ 10 - 4
plugins/CuraEngineBackend/ProcessSlicedObjectListJob.py

@@ -11,6 +11,7 @@ from UM.Message import Message
 from UM.i18n import i18nCatalog
 
 from . import LayerData
+from . import LayerDataDecorator
 
 import numpy
 import struct
@@ -36,7 +37,8 @@ class ProcessSlicedObjectListJob(Job):
         ## Put all nodes in a dict identified by ID
         for node in DepthFirstIterator(self._scene.getRoot()):
             if type(node) is SceneNode and node.getMeshData():
-                if hasattr(node.getMeshData(), "layerData"):
+                if node.callDecoration("getLayerData"):
+                #if hasattr(node.getMeshData(), "layerData"):
                     self._scene.getRoot().removeChild(node)
                 else:
                     objectIdMap[id(node)] = node
@@ -83,14 +85,18 @@ class ProcessSlicedObjectListJob(Job):
 
         # We are done processing all the layers we got from the engine, now create a mesh out of the data
         layerData.build()
-        mesh.layerData = layerData
 
         if self._progress:
             self._progress.setProgress(100)
-
+        
+        #Add layerdata decorator to scene node to indicate that the node has layerdata
+        decorator = LayerDataDecorator.LayerDataDecorator()
+        decorator.setLayerData(layerData)
+        new_node.addDecorator(decorator)
+        
         new_node.setMeshData(mesh)
         new_node.setParent(self._scene.getRoot())
-
+        
         view = Application.getInstance().getController().getActiveView()
         if view.getPluginId() == "LayerView":
             view.resetLayerData()

+ 6 - 7
plugins/LayerView/LayerView.py

@@ -68,10 +68,8 @@ class LayerView(View):
                 if node.getMeshData() and node.isVisible():
                     if Selection.isSelected(node):
                         renderer.queueNode(node, material = self._selection_material, transparent = True)
-
-                    try:
-                        layer_data = node.getMeshData().layerData
-                    except AttributeError:
+                    layer_data = node.callDecoration("getLayerData")
+                    if not layer_data:
                         continue
 
                     # Render all layers below a certain number as line mesh instead of vertices.
@@ -133,10 +131,11 @@ class LayerView(View):
             for node in DepthFirstIterator(scene.getRoot()):
                 if not node.render(renderer):
                     if node.getMeshData() and node.isVisible():
-                        try:
-                            layer_data = node.getMeshData().layerData
-                        except AttributeError:
+                        
+                        layer_data = node.callDecoration("getLayerData")
+                        if not layer_data:
                             continue
+
                         if new_max_layers < len(layer_data.getLayers()):
                             new_max_layers = len(layer_data.getLayers()) - 1