From 4e6322d94e88b7a1c9c9cb2e91e3908309a9f46c Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 Mar 2015 18:10:44 +0100 Subject: [PATCH 1/8] Move backend location preference into the backend class and use the new api --- CuraEngineBackend.py | 4 +++- __init__.py | 3 --- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CuraEngineBackend.py b/CuraEngineBackend.py index 72ad3efcea..70595c69dc 100644 --- a/CuraEngineBackend.py +++ b/CuraEngineBackend.py @@ -17,6 +17,8 @@ class CuraEngineBackend(Backend): def __init__(self): super().__init__() + Preferences.getInstance().addPreference('backend/location', '../PinkUnicornEngine/CuraEngine') + self._scene = Application.getInstance().getController().getScene() self._scene.sceneChanged.connect(self._onSceneChanged) @@ -34,7 +36,7 @@ class CuraEngineBackend(Backend): self._center = None def getEngineCommand(self): - return [Preferences.getPreference("BackendLocation"), '--connect', "127.0.0.1:{0}".format(self._port)] + return [Preferences.getInstance().getValue("backend/location"), '--connect', "127.0.0.1:{0}".format(self._port)] def _onSceneChanged(self, source): if (type(source) is not SceneNode) or (source is self._scene.getRoot()): diff --git a/__init__.py b/__init__.py index 706676c030..7bea4d0113 100644 --- a/__init__.py +++ b/__init__.py @@ -1,8 +1,6 @@ #Shoopdawoop from . import CuraEngineBackend -from UM.Preferences import Preferences - def getMetaData(): return { 'type': 'backend', @@ -12,6 +10,5 @@ def getMetaData(): } def register(app): - Preferences.addPreference("BackendLocation","../PinkUnicornEngine/CuraEngine") return CuraEngineBackend.CuraEngineBackend() From 800faf6bcf862e1bddfc7776bbf8c375523c1ce3 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 12 Mar 2015 13:31:14 +0100 Subject: [PATCH 2/8] Support colours for rendering the layer view --- LayerData.py | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/LayerData.py b/LayerData.py index 692ef97f91..84f9c613a4 100644 --- a/LayerData.py +++ b/LayerData.py @@ -1,4 +1,5 @@ from UM.Mesh.MeshData import MeshData +from UM.Math.Color import Color import numpy import math @@ -7,16 +8,22 @@ class LayerData(MeshData): def __init__(self): super().__init__() self._layers = {} + self._element_counts = [] def addPolygon(self, layer, type, data): if layer not in self._layers: self._layers[layer] = [] - self._layers[layer].append(Polygon(self, type, data)) + p = Polygon(self, type, data) + self._layers[layer].append(p) + self._element_counts.append(p.count) def getLayers(self): return self._layers + def getElementCounts(self): + return self._element_counts + class Polygon(): NoneType = 0 Inset0Type = 1 @@ -30,11 +37,30 @@ class Polygon(): self._type = type self._begin = mesh._vertex_count mesh.addVertices(data) + self._end = self._begin + len(data) - indices = [self._begin + i for i in range(len(data))] + color = None + if type == self.Inset0Type: + color = [1, 0, 0, 1] + elif type == self.InsetXType: + color = [0, 1, 0, 1] + elif type == self.SkinType: + color = [1, 1, 0, 1] + elif type == self.SupportType: + color = [0, 1, 1, 1] + elif type == self.SkirtType: + color = [0, 1, 1, 1] + else: + color = [1, 1, 1, 1] + colors = [color for i in range(len(data))] + mesh.addColors(numpy.array(colors, dtype=numpy.float32)) + + indices = [] + for i in range(self._begin, self._end): + indices.append(i) + indices.append(i + 1) mesh.addIndices(numpy.array(indices, dtype=numpy.int32)) - self._end = mesh._vertex_count @property def type(self): @@ -43,3 +69,7 @@ class Polygon(): @property def data(self): return self._data + + @property + def count(self): + return self._end - self._begin From c03a368a0d7691a35cb3c5fd13a251a8c5cf0cfb Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Fri, 13 Mar 2015 12:16:59 +0100 Subject: [PATCH 3/8] Cancel the running timer when receiving another change notification in CuraEngineBackend --- CuraEngineBackend.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CuraEngineBackend.py b/CuraEngineBackend.py index 70595c69dc..18e86aba9d 100644 --- a/CuraEngineBackend.py +++ b/CuraEngineBackend.py @@ -35,6 +35,8 @@ class CuraEngineBackend(Backend): self._center = None + self._slice_interval = 0.5 + def getEngineCommand(self): return [Preferences.getInstance().getValue("backend/location"), '--connect', "127.0.0.1:{0}".format(self._port)] @@ -85,9 +87,9 @@ class CuraEngineBackend(Backend): return if self._changeTimer: - return + self._changeTimer.cancel() - self._changeTimer = threading.Timer(1, self._onChangeTimerFinished) + self._changeTimer = threading.Timer(self._slice_interval, self._onChangeTimerFinished) self._changeTimer.start() def _onChangeTimerFinished(self): From 17316edfeff5d00fe3e4adf7f872e7d229e1351f Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Fri, 13 Mar 2015 13:50:01 +0100 Subject: [PATCH 4/8] Ensure we update the view when the layer data has changed --- ProcessSlicedObjectListJob.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ProcessSlicedObjectListJob.py b/ProcessSlicedObjectListJob.py index 7cb5fa6760..c0b98f4482 100644 --- a/ProcessSlicedObjectListJob.py +++ b/ProcessSlicedObjectListJob.py @@ -40,3 +40,4 @@ class ProcessSlicedObjectListJob(Job): layerData.addPolygon(layer.id, polygon.type, points) mesh.layerData = layerData + objectIdMap[object.id].meshDataChanged.emit() From 25d347691dca2c5d30dd5bdab709dcd11f6e1194 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Fri, 13 Mar 2015 13:51:42 +0100 Subject: [PATCH 5/8] Enable killing and restarting the engine when we get a change and are busy slicing --- CuraEngineBackend.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/CuraEngineBackend.py b/CuraEngineBackend.py index 18e86aba9d..491b4fbd67 100644 --- a/CuraEngineBackend.py +++ b/CuraEngineBackend.py @@ -4,6 +4,7 @@ from UM.Scene.SceneNode import SceneNode from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Preferences import Preferences from UM.Math.Vector import Vector +from UM.Signal import Signal from . import Cura_pb2 from . import ProcessSlicedObjectListJob @@ -37,9 +38,17 @@ class CuraEngineBackend(Backend): self._slice_interval = 0.5 + self._slicing = False + self._restart = False + + self.changeTimerFinished.connect(self._onChangeTimerFinished) + self.backendConnected.connect(self._onBackendConnected) + def getEngineCommand(self): return [Preferences.getInstance().getValue("backend/location"), '--connect', "127.0.0.1:{0}".format(self._port)] + changeTimerFinished = Signal() + def _onSceneChanged(self, source): if (type(source) is not SceneNode) or (source is self._scene.getRoot()): return @@ -63,6 +72,8 @@ class CuraEngineBackend(Backend): job.start() def _onProgressMessage(self, message): + if message.amount >= 0.99: + self._slicing = False self.processingProgress.emit(message.amount) def _onGCodeMessage(self, message): @@ -89,10 +100,16 @@ class CuraEngineBackend(Backend): if self._changeTimer: self._changeTimer.cancel() - self._changeTimer = threading.Timer(self._slice_interval, self._onChangeTimerFinished) + self._changeTimer = threading.Timer(self._slice_interval, lambda: self.changeTimerFinished.emit()) self._changeTimer.start() def _onChangeTimerFinished(self): + if self._slicing: + self._slicing = False + self._restart = True + self._process.terminate() + return + objects = [] for node in DepthFirstIterator(self._scene.getRoot()): if type(node) is SceneNode and node.getMeshData(): @@ -102,6 +119,8 @@ class CuraEngineBackend(Backend): self._changeTimer = None return #No point in slicing an empty build plate + self._slicing = True + self._sendSettings() self._scene.acquireLock() @@ -302,3 +321,8 @@ class CuraEngineBackend(Backend): s.value = str(value).encode('utf-8') self._socket.sendMessage(msg) + + def _onBackendConnected(self): + if self._restart: + self._onChanged() + self._restart = False From 05dcd90b7854cc591c589c5be4b31a9a5f9cf2ca Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Fri, 13 Mar 2015 13:53:31 +0100 Subject: [PATCH 6/8] Emit a progress message when we start processing to improve user feedback --- CuraEngineBackend.py | 1 + 1 file changed, 1 insertion(+) diff --git a/CuraEngineBackend.py b/CuraEngineBackend.py index 491b4fbd67..f9bb46ce9c 100644 --- a/CuraEngineBackend.py +++ b/CuraEngineBackend.py @@ -120,6 +120,7 @@ class CuraEngineBackend(Backend): return #No point in slicing an empty build plate self._slicing = True + self.processingProgress.emit(0.0) self._sendSettings() From b751c90813bef12c377e5cafb50b71327394670f Mon Sep 17 00:00:00 2001 From: daid Date: Fri, 13 Mar 2015 18:20:10 +0100 Subject: [PATCH 7/8] Small for for when we get engine data for an object which is already removed from the scene. --- ProcessGCodeJob.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ProcessGCodeJob.py b/ProcessGCodeJob.py index 712fb76e28..195fc87747 100644 --- a/ProcessGCodeJob.py +++ b/ProcessGCodeJob.py @@ -18,10 +18,10 @@ class ProcessGCodeJob(Job): if type(node) is SceneNode and node.getMeshData(): objectIdMap[id(node)] = node - node = objectIdMap[self._message.id] - if node: + if self._message.id in objectIdMap: + node = objectIdMap[self._message.id] with open(self._message.filename) as f: data = f.read(None) setattr(node.getMeshData(), 'gcode', data) - os.remove(self._message.filename) + os.remove(self._message.filename) From 924cbaaac52c8d6ef40b3daf4dcdd3deb29497d5 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Fri, 13 Mar 2015 17:22:11 +0100 Subject: [PATCH 8/8] Fix LayerData to use the right indices for polygons --- LayerData.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/LayerData.py b/LayerData.py index 84f9c613a4..cfa2249d40 100644 --- a/LayerData.py +++ b/LayerData.py @@ -37,7 +37,7 @@ class Polygon(): self._type = type self._begin = mesh._vertex_count mesh.addVertices(data) - self._end = self._begin + len(data) + self._end = self._begin + len(data) - 1 color = None if type == self.Inset0Type: @@ -60,6 +60,9 @@ class Polygon(): for i in range(self._begin, self._end): indices.append(i) indices.append(i + 1) + + indices.append(self._end) + indices.append(self._begin) mesh.addIndices(numpy.array(indices, dtype=numpy.int32)) @property