MrDraw/Cura/webui/printer.py
2012-12-25 11:55:00 +01:00

208 lines
4.8 KiB
Python

# coding=utf-8
__author__ = 'Gina Häußge <osd@foosel.net>'
import time
import os
import Cura.util.machineCom as machineCom
from Cura.util import gcodeInterpreter
class Printer():
def __init__(self):
# state
self.temps = {
'actual': [],
'target': [],
'actualBed': [],
'targetBed': []
}
self.messages = []
self.log = []
self.state = None
self.currentZ = None
self.progress = None
self.printTime = None
self.printTimeLeft = None
self.currentTemp = None
self.currentBedTemp = None
self.gcode = None
self.gcodeList = None
self.filename = None
# comm
self.comm = None
def connect(self):
if self.comm != None:
self.comm.close()
self.comm = machineCom.MachineCom(port='VIRTUAL', callbackObject=self)
def disconnect(self):
if self.comm != None:
self.comm.close()
self.comm = None
def command(self, command):
self.comm.sendCommand(command)
def mcLog(self, message):
self.log.append(message)
self.log = self.log[-300:]
def mcTempUpdate(self, temp, bedTemp, targetTemp, bedTargetTemp):
currentTime = time.time()
self.temps['actual'].append((currentTime, temp))
self.temps['actual'] = self.temps['actual'][-300:]
self.temps['target'].append((currentTime, targetTemp))
self.temps['target'] = self.temps['target'][-300:]
self.temps['actualBed'].append((currentTime, bedTemp))
self.temps['actualBed'] = self.temps['actualBed'][-300:]
self.temps['targetBed'].append((currentTime, bedTargetTemp))
self.temps['targetBed'] = self.temps['targetBed'][-300:]
self.currentTemp = temp
self.currentBedTemp = bedTemp
def mcStateChange(self, state):
self.state = state
def mcMessage(self, message):
self.messages.append(message)
self.messages = self.message[-300:]
def mcProgress(self, lineNr):
self.printTime = self.comm.getPrintTime()
self.printTimeLeft = self.comm.getPrintTimeRemainingEstimate()
self.progress = self.comm.getPrintPos()
def mcZChange(self, newZ):
self.currentZ = newZ
def jobData(self):
if self.gcode != None:
formattedPrintTime = None
if (self.printTime):
"%02d:%02d" % (int(self.printTime / 60), int(self.printTime % 60))
formattedPrintTimeLeft = None
if (self.printTimeLeft):
"%02d:%02d" % (int(self.printTimeLeft / 60), int(self.printTimeLeft % 60))
data = {
'currentZ': self.currentZ,
'line': self.progress,
'totalLines': len(self.gcodeList),
'printTime': formattedPrintTime,
'printTimeLeft': formattedPrintTimeLeft,
'filament': "%.2fm %.2fg" % (
self.gcode.extrusionAmount / 1000,
self.gcode.calculateWeight() * 1000
),
'estimatedPrintTime': "%02d:%02d" % (
int(self.gcode.totalMoveTimeMinute / 60),
int(self.gcode.totalMoveTimeMinute % 60)
)
}
else:
data = None
return data
def getStateString(self):
if self.comm == None:
return 'Offline'
else:
return self.comm.getStateString()
def isClosedOrError(self):
return self.comm == None or self.comm.isClosedOrError()
def isOperational(self):
return self.comm != None and self.comm.isOperational()
def loadGcode(self, file):
if self.comm != None and self.comm.isPrinting():
return
# delete old temporary file
if self.filename != None:
os.remove(self.filename)
#Send an initial M110 to reset the line counter to zero.
prevLineType = lineType = 'CUSTOM'
gcodeList = ["M110"]
for line in open(file, 'r'):
if line.startswith(';TYPE:'):
lineType = line[6:].strip()
if ';' in line:
line = line[0:line.find(';')]
line = line.strip()
if len(line) > 0:
if prevLineType != lineType:
gcodeList.append((line, lineType, ))
else:
gcodeList.append(line)
prevLineType = lineType
gcode = gcodeInterpreter.gcode()
gcode.loadList(gcodeList)
#print "Loaded: %s (%d)" % (filename, len(gcodeList))
self.filename = file
self.gcode = gcode
self.gcodeList = gcodeList
def startPrint(self):
if self.comm == None or not self.comm.isOperational():
return
if self.gcodeList == None:
return
if self.comm.isPrinting():
return
self.currentZ = -1
self.comm.printGCode(self.gcodeList)
def togglePausePrint(self):
if self.comm == None:
return
self.comm.setPause(not self.comm.isPaused())
def cancelPrint(self):
if self.comm == None:
return
self.comm.cancelPrint()
self.comm.sendCommand("M84")
class Temperature():
def __init__(self, actual=None, target=None):
self._actual = actual
self._target = target
def actual(self):
return self._actual
def target(self):
return self._target
def asDict(self):
return {'actual': self._actual, 'target': self._target}
class Position():
def __init__(self, x=None, y=None, z=None):
self._x = x
self._y = y
self._z = z
def update(self, x=None, y=None, z=None):
if x != None:
self._x = x
if y != None:
self._y = y
if z != None:
self._z = z
def get(self):
return {'x': self._x, 'y': self._y, 'z': self._z}