From 177962f67a5cd40e097a72a6076f9c3453a66497 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 28 Jan 2015 12:00:43 +0100 Subject: [PATCH 01/13] Add a LayerView plugin that can render sliced meshes --- LayerView.py | 31 +++++++++++++++++++++++++++++++ __init__.py | 7 +++++++ 2 files changed, 38 insertions(+) create mode 100644 LayerView.py create mode 100644 __init__.py diff --git a/LayerView.py b/LayerView.py new file mode 100644 index 0000000000..e75ea6dff7 --- /dev/null +++ b/LayerView.py @@ -0,0 +1,31 @@ +from UM.View.View import View +from UM.View.Renderer import Renderer +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator +from UM.Resources import Resources + +class LayerView(View): + def __init__(self): + super().__init__() + self._material = None + + def beginRendering(self): + scene = self.getController().getScene() + renderer = self.getRenderer() + + if not self._material: + self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, 'basic.vert'), Resources.getPath(Resources.ShadersLocation, 'color.frag')) + + self._material.setUniformValue("u_color", [1.0, 0.0, 0.0, 1.0]) + + for node in DepthFirstIterator(scene.getRoot()): + if not node.render(renderer): + if node.getMeshData() and node.isVisible(): + try: + layerData = node.getMeshData().layerData + except AttributeError: + continue + + renderer.queueMesh(layerData, node.getGlobalTransformation(), material = self._material, mode = Renderer.RenderLineLoop) + + def endRendering(self): + pass diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000000..12efe8e8e7 --- /dev/null +++ b/__init__.py @@ -0,0 +1,7 @@ +from . import LayerView + +def getMetaData(): + return { "name": "LayerView", "type": "View" } + +def register(app): + app.getController().addView("LayerView", LayerView.LayerView()) From bd4459709f985025dfbc6c6ff3f84ba09902a76e Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 25 Feb 2015 16:31:25 +0100 Subject: [PATCH 02/13] Rename queueMesh to queueNode --- LayerView.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LayerView.py b/LayerView.py index e75ea6dff7..bb290fc329 100644 --- a/LayerView.py +++ b/LayerView.py @@ -25,7 +25,7 @@ class LayerView(View): except AttributeError: continue - renderer.queueMesh(layerData, node.getGlobalTransformation(), material = self._material, mode = Renderer.RenderLineLoop) + renderer.queueNode(node, mesh = layerData, material = self._material, mode = Renderer.RenderLineLoop) def endRendering(self): pass From 020015cccceb3c2391c4764ee2ec29dfc5c461c6 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 3 Mar 2015 14:51:47 +0100 Subject: [PATCH 03/13] Update plugin's register functions to return the object instance instead of performing the registration themselves --- __init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__init__.py b/__init__.py index 12efe8e8e7..b4264fd10f 100644 --- a/__init__.py +++ b/__init__.py @@ -4,4 +4,4 @@ def getMetaData(): return { "name": "LayerView", "type": "View" } def register(app): - app.getController().addView("LayerView", LayerView.LayerView()) + return LayerView.LayerView() From 638b8be8a07262803c087e796e40a51858c08983 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 3 Mar 2015 14:55:00 +0100 Subject: [PATCH 04/13] Update plugin metadata to the new format --- __init__.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/__init__.py b/__init__.py index b4264fd10f..a36fa0871e 100644 --- a/__init__.py +++ b/__init__.py @@ -1,7 +1,15 @@ from . import LayerView def getMetaData(): - return { "name": "LayerView", "type": "View" } + return { + 'type': 'view', + 'plugin': { + "name": "Layer View" + }, + 'view': { + 'name': 'Layers' + } + } def register(app): return LayerView.LayerView() From 4ccc5ea6cf25adb029f5e08cc0675e2b8415abdf Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 12 Mar 2015 13:31:14 +0100 Subject: [PATCH 05/13] Support colours for rendering the layer view --- LayerView.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LayerView.py b/LayerView.py index bb290fc329..25572cac51 100644 --- a/LayerView.py +++ b/LayerView.py @@ -13,7 +13,7 @@ class LayerView(View): renderer = self.getRenderer() if not self._material: - self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, 'basic.vert'), Resources.getPath(Resources.ShadersLocation, 'color.frag')) + self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, 'basic.vert'), Resources.getPath(Resources.ShadersLocation, 'vertexcolor.frag')) self._material.setUniformValue("u_color", [1.0, 0.0, 0.0, 1.0]) @@ -25,7 +25,7 @@ class LayerView(View): except AttributeError: continue - renderer.queueNode(node, mesh = layerData, material = self._material, mode = Renderer.RenderLineLoop) + renderer.queueNode(node, mesh = layerData, material = self._material, mode = Renderer.RenderLines) def endRendering(self): pass From 3b54a2de5888cf87669f9623a59bbba579cbfe6d Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Fri, 13 Mar 2015 13:49:38 +0100 Subject: [PATCH 06/13] Prevent rendering the selection outline in layer view --- LayerView.py | 1 + 1 file changed, 1 insertion(+) diff --git a/LayerView.py b/LayerView.py index 25572cac51..401ae862fd 100644 --- a/LayerView.py +++ b/LayerView.py @@ -11,6 +11,7 @@ class LayerView(View): def beginRendering(self): scene = self.getController().getScene() renderer = self.getRenderer() + renderer.setRenderSelection(False) if not self._material: self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, 'basic.vert'), Resources.getPath(Resources.ShadersLocation, 'vertexcolor.frag')) From 32e37066776d1bdbe276170749c1bb19d60b35ef Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 22 Apr 2015 11:00:12 +0200 Subject: [PATCH 07/13] Plugin registering is now done by dict instead of single object or list --- __init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__init__.py b/__init__.py index a36fa0871e..48da12a459 100644 --- a/__init__.py +++ b/__init__.py @@ -12,4 +12,4 @@ def getMetaData(): } def register(app): - return LayerView.LayerView() + return {"view":LayerView.LayerView()} From 0bc860a5d67d39a2c5cb31344f8ff1345615ea84 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 24 Apr 2015 12:31:40 +0200 Subject: [PATCH 08/13] Layer view now has an awesome slider! --- LayerView.py | 15 ++++++++++++--- LayerView.qml | 35 +++++++++++++++++++++++++++++++++++ __init__.py | 3 ++- 3 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 LayerView.qml diff --git a/LayerView.py b/LayerView.py index 401ae862fd..f1acc8a6a4 100644 --- a/LayerView.py +++ b/LayerView.py @@ -7,11 +7,14 @@ class LayerView(View): def __init__(self): super().__init__() self._material = None + self._num_layers = + self._layer_percentage = 0 #what percentage of layers need to be shown (SLider gives value between 0 - 100) def beginRendering(self): scene = self.getController().getScene() renderer = self.getRenderer() renderer.setRenderSelection(False) + self._num_layers = 0 if not self._material: self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, 'basic.vert'), Resources.getPath(Resources.ShadersLocation, 'vertexcolor.frag')) @@ -22,11 +25,17 @@ class LayerView(View): if not node.render(renderer): if node.getMeshData() and node.isVisible(): try: - layerData = node.getMeshData().layerData + layer_data = node.getMeshData().layerData + if self._num_layers < len(layer_data.getLayers()): + self._num_layers = len(layer_data.getLayers()) + except AttributeError: continue - renderer.queueNode(node, mesh = layerData, material = self._material, mode = Renderer.RenderLines) - + renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines) + + def setLayer(self, value): + self._layer_percentage = value + def endRendering(self): pass diff --git a/LayerView.qml b/LayerView.qml new file mode 100644 index 0000000000..16c9768eef --- /dev/null +++ b/LayerView.qml @@ -0,0 +1,35 @@ +import QtQuick 2.2 +import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.0 as UM + +Item +{ + width: 250 + height: 250 + /*Rectangle + { + color: "blue" + width: 250 + height:250 + }*/ + Slider + { + width: 10 + height: 250 + anchors.right : parent.right + //anchors.fill: parent + //Layout.preferredHeight: UM.Theme.sizes.section.height; + orientation: Qt.Vertical + minimumValue: 0; + maximumValue: 100; + + value: 50; + onValueChanged: UM.ActiveView.triggerAction("setLayer", value) + + style: UM.Theme.styles.slider; + //Component.onCompleted: {console.log(UM.Theme.styles.slider)} + } +} \ No newline at end of file diff --git a/__init__.py b/__init__.py index 48da12a459..ef71dffe0d 100644 --- a/__init__.py +++ b/__init__.py @@ -7,7 +7,8 @@ def getMetaData(): "name": "Layer View" }, 'view': { - 'name': 'Layers' + 'name': 'Layers', + 'view_panel': 'LayerView.qml' } } From ee52f96f296e8aa908cad5f9ce5e7213b7ca3996 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 24 Apr 2015 13:53:27 +0200 Subject: [PATCH 09/13] More documentation --- LayerView.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/LayerView.py b/LayerView.py index f1acc8a6a4..b79f789f84 100644 --- a/LayerView.py +++ b/LayerView.py @@ -3,12 +3,13 @@ from UM.View.Renderer import Renderer from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Resources import Resources +## View used to display g-code paths. class LayerView(View): def __init__(self): super().__init__() self._material = None self._num_layers = - self._layer_percentage = 0 #what percentage of layers need to be shown (SLider gives value between 0 - 100) + self._layer_percentage = 0 # what percentage of layers need to be shown (SLider gives value between 0 - 100) def beginRendering(self): scene = self.getController().getScene() @@ -18,7 +19,6 @@ class LayerView(View): if not self._material: self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, 'basic.vert'), Resources.getPath(Resources.ShadersLocation, 'vertexcolor.frag')) - self._material.setUniformValue("u_color", [1.0, 0.0, 0.0, 1.0]) for node in DepthFirstIterator(scene.getRoot()): @@ -26,7 +26,7 @@ class LayerView(View): if node.getMeshData() and node.isVisible(): try: layer_data = node.getMeshData().layerData - if self._num_layers < len(layer_data.getLayers()): + if self._num_layers < len(layer_data.getLayers()): self._num_layers = len(layer_data.getLayers()) except AttributeError: From 2bde36790e7544738bd9e71ca35d2cde63c5b0a5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 24 Apr 2015 15:31:02 +0200 Subject: [PATCH 10/13] Fixed caused by cleanup --- LayerView.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LayerView.py b/LayerView.py index b79f789f84..5f8a1f7d5f 100644 --- a/LayerView.py +++ b/LayerView.py @@ -8,7 +8,7 @@ class LayerView(View): def __init__(self): super().__init__() self._material = None - self._num_layers = + self._num_layers = 0 self._layer_percentage = 0 # what percentage of layers need to be shown (SLider gives value between 0 - 100) def beginRendering(self): From b0243a4caa7acd282abf5c3a181122d464afd0b9 Mon Sep 17 00:00:00 2001 From: daid Date: Fri, 24 Apr 2015 17:07:32 +0200 Subject: [PATCH 11/13] Some style fixing, and added a test script to test for the major style violations. --- LayerView.py | 1 + __init__.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/LayerView.py b/LayerView.py index 401ae862fd..d9d3772f6b 100644 --- a/LayerView.py +++ b/LayerView.py @@ -3,6 +3,7 @@ from UM.View.Renderer import Renderer from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Resources import Resources + class LayerView(View): def __init__(self): super().__init__() diff --git a/__init__.py b/__init__.py index 48da12a459..6b8576567d 100644 --- a/__init__.py +++ b/__init__.py @@ -1,5 +1,6 @@ from . import LayerView + def getMetaData(): return { 'type': 'view', @@ -11,5 +12,6 @@ def getMetaData(): } } + def register(app): return {"view":LayerView.LayerView()} From 1a50753914b274a444e237379c550c34b458371c Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 28 Apr 2015 11:31:29 +0200 Subject: [PATCH 12/13] Use the start and end parameters to QtGL2Renderer::queueNode to implement showing only a range of layers --- LayerView.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/LayerView.py b/LayerView.py index c1039936fe..3e65876ad0 100644 --- a/LayerView.py +++ b/LayerView.py @@ -3,7 +3,6 @@ from UM.View.Renderer import Renderer from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Resources import Resources - ## View used to display g-code paths. class LayerView(View): def __init__(self): @@ -16,7 +15,6 @@ class LayerView(View): scene = self.getController().getScene() renderer = self.getRenderer() renderer.setRenderSelection(False) - self._num_layers = 0 if not self._material: self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, 'basic.vert'), Resources.getPath(Resources.ShadersLocation, 'vertexcolor.frag')) @@ -27,13 +25,24 @@ class LayerView(View): if node.getMeshData() and node.isVisible(): try: layer_data = node.getMeshData().layerData - if self._num_layers < len(layer_data.getLayers()): - self._num_layers = len(layer_data.getLayers()) - except AttributeError: continue - renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines) + if self._layer_percentage < 100: + start = 0 + end_layer = round(len(layer_data.getLayers()) * (self._layer_percentage / 100)) + end = 0 + + element_counts = layer_data.getElementCounts() + for layer, counts in element_counts.items(): + end += sum(counts) * 2 + + if layer >= end_layer: + break + + renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines, start = start, end = end) + else: + renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines) def setLayer(self, value): self._layer_percentage = value From ffcf5c7885b5ebf9d99103b68f03fb86d5610d27 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 28 Apr 2015 11:50:54 +0200 Subject: [PATCH 13/13] Rename Polygon.count to Polygon.elementCount and return the proper element count --- LayerView.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LayerView.py b/LayerView.py index 3e65876ad0..ad1a5dc0f7 100644 --- a/LayerView.py +++ b/LayerView.py @@ -35,7 +35,7 @@ class LayerView(View): element_counts = layer_data.getElementCounts() for layer, counts in element_counts.items(): - end += sum(counts) * 2 + end += sum(counts) if layer >= end_layer: break