From 25d347691dca2c5d30dd5bdab709dcd11f6e1194 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Fri, 13 Mar 2015 13:51:42 +0100 Subject: [PATCH] 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