Enable killing and restarting the engine when we get a change and are busy slicing

This commit is contained in:
Arjen Hiemstra 2015-03-13 13:51:42 +01:00
parent 17316edfef
commit 25d347691d

View file

@ -4,6 +4,7 @@ from UM.Scene.SceneNode import SceneNode
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
from UM.Preferences import Preferences from UM.Preferences import Preferences
from UM.Math.Vector import Vector from UM.Math.Vector import Vector
from UM.Signal import Signal
from . import Cura_pb2 from . import Cura_pb2
from . import ProcessSlicedObjectListJob from . import ProcessSlicedObjectListJob
@ -37,9 +38,17 @@ class CuraEngineBackend(Backend):
self._slice_interval = 0.5 self._slice_interval = 0.5
self._slicing = False
self._restart = False
self.changeTimerFinished.connect(self._onChangeTimerFinished)
self.backendConnected.connect(self._onBackendConnected)
def getEngineCommand(self): def getEngineCommand(self):
return [Preferences.getInstance().getValue("backend/location"), '--connect', "127.0.0.1:{0}".format(self._port)] return [Preferences.getInstance().getValue("backend/location"), '--connect', "127.0.0.1:{0}".format(self._port)]
changeTimerFinished = Signal()
def _onSceneChanged(self, source): def _onSceneChanged(self, source):
if (type(source) is not SceneNode) or (source is self._scene.getRoot()): if (type(source) is not SceneNode) or (source is self._scene.getRoot()):
return return
@ -63,6 +72,8 @@ class CuraEngineBackend(Backend):
job.start() job.start()
def _onProgressMessage(self, message): def _onProgressMessage(self, message):
if message.amount >= 0.99:
self._slicing = False
self.processingProgress.emit(message.amount) self.processingProgress.emit(message.amount)
def _onGCodeMessage(self, message): def _onGCodeMessage(self, message):
@ -89,10 +100,16 @@ class CuraEngineBackend(Backend):
if self._changeTimer: if self._changeTimer:
self._changeTimer.cancel() 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() self._changeTimer.start()
def _onChangeTimerFinished(self): def _onChangeTimerFinished(self):
if self._slicing:
self._slicing = False
self._restart = True
self._process.terminate()
return
objects = [] objects = []
for node in DepthFirstIterator(self._scene.getRoot()): for node in DepthFirstIterator(self._scene.getRoot()):
if type(node) is SceneNode and node.getMeshData(): if type(node) is SceneNode and node.getMeshData():
@ -102,6 +119,8 @@ class CuraEngineBackend(Backend):
self._changeTimer = None self._changeTimer = None
return #No point in slicing an empty build plate return #No point in slicing an empty build plate
self._slicing = True
self._sendSettings() self._sendSettings()
self._scene.acquireLock() self._scene.acquireLock()
@ -302,3 +321,8 @@ class CuraEngineBackend(Backend):
s.value = str(value).encode('utf-8') s.value = str(value).encode('utf-8')
self._socket.sendMessage(msg) self._socket.sendMessage(msg)
def _onBackendConnected(self):
if self._restart:
self._onChanged()
self._restart = False