Merge commit '96d014b2c4cef94dbbe4c3adc1c8d7a8ce929ad2'

master
Lawrence Johnston 2012-04-03 17:58:27 -07:00
commit 1755cb8c3f
11 changed files with 85 additions and 20 deletions

View File

@ -126,6 +126,8 @@ class GcodeSmallSkein:
self.output.write(';TYPE:FILL\n'); self.output.write(';TYPE:FILL\n');
elif line.startswith('(<alteration>'): elif line.startswith('(<alteration>'):
self.output.write(';TYPE:CUSTOM\n'); self.output.write(';TYPE:CUSTOM\n');
elif line.startswith('(<supportLayer>'):
self.output.write(';TYPE:SUPPORT\n');
elif line.startswith('(<layer>'): elif line.startswith('(<layer>'):
self.output.write(';LAYER:%d\n' % (self.layerNr)); self.output.write(';LAYER:%d\n' % (self.layerNr));
self.layerNr += 1 self.layerNr += 1

View File

@ -103,6 +103,30 @@ class InstallFirmware(wx.Dialog):
def OnClose(self, e): def OnClose(self, e):
self.Destroy() self.Destroy()
class VirtualPrinter():
def __init__(self):
self.readList = ['start\n']
def write(self, data):
if self.readList == None:
return
print "Send: %s" % (data.rstrip())
self.readList.append("ok\n")
def readline(self):
if self.readList == None:
return ''
while len(self.readList) < 1:
time.sleep(0.1)
if self.readList == None:
return ''
time.sleep(0.001)
print "Recv: %s" % (self.readList[0].rstrip())
return self.readList.pop(0)
def close(self):
self.readList = None
class MachineCom(): class MachineCom():
def __init__(self, port = None, baudrate = None): def __init__(self, port = None, baudrate = None):
if port == None: if port == None:
@ -124,6 +148,8 @@ class MachineCom():
except: except:
print "Unexpected error while connecting to serial port:" + port, sys.exc_info()[0] print "Unexpected error while connecting to serial port:" + port, sys.exc_info()[0]
programmer.close() programmer.close()
elif port == 'VIRTUAL':
self.serial = VirtualPrinter()
else: else:
try: try:
self.serial = Serial(port, baudrate, timeout=5) self.serial = Serial(port, baudrate, timeout=5)
@ -134,8 +160,8 @@ class MachineCom():
if self.serial == None: if self.serial == None:
return None return None
ret = self.serial.readline() ret = self.serial.readline()
if ret != '': #if ret != '':
print "Recv: " + ret.rstrip() # print "Recv: " + ret.rstrip()
return ret return ret
def close(self): def close(self):
@ -146,6 +172,6 @@ class MachineCom():
def sendCommand(self, cmd): def sendCommand(self, cmd):
if self.serial == None: if self.serial == None:
return return
print 'Send: ' + cmd #print 'Send: ' + cmd
self.serial.write(cmd + '\n') self.serial.write(cmd + '\n')

View File

@ -36,7 +36,7 @@ class mainWindow(configBase.configWindowBase):
super(mainWindow, self).__init__(title='Cura') super(mainWindow, self).__init__(title='Cura')
wx.EVT_CLOSE(self, self.OnClose) wx.EVT_CLOSE(self, self.OnClose)
self.SetIcon(icon.getMainIcon()) #self.SetIcon(icon.getMainIcon())
menubar = wx.MenuBar() menubar = wx.MenuBar()
fileMenu = wx.Menu() fileMenu = wx.Menu()

View File

@ -25,6 +25,10 @@ class preferencesDialog(configBase.configWindowBase):
c = configBase.SettingRow(left, 'Machine height (mm)', 'machine_height', '200', 'Size of the machine in mm', type = 'preference') c = configBase.SettingRow(left, 'Machine height (mm)', 'machine_height', '200', 'Size of the machine in mm', type = 'preference')
validators.validFloat(c, 10.0) validators.validFloat(c, 10.0)
configBase.TitleRow(left, 'Filament settings')
c = configBase.SettingRow(left, 'Filament density (kg/m3)', 'filament_density', '1300', 'Weight of the filament per m3. Around 1300 for PLA. And around 1040 for ABS. This value is used to estimate the weight if the filament used for the print.', type = 'preference')
validators.validFloat(c, 500.0, 3000.0)
configBase.TitleRow(left, 'Communication settings') configBase.TitleRow(left, 'Communication settings')
c = configBase.SettingRow(left, 'Serial port', 'serial_port', ['AUTO'] + machineCom.serialList(), 'Serial port to use for communication with the printer', type = 'preference') c = configBase.SettingRow(left, 'Serial port', 'serial_port', ['AUTO'] + machineCom.serialList(), 'Serial port to use for communication with the printer', type = 'preference')
c = configBase.SettingRow(left, 'Baudrate', 'serial_baud', '250000', 'Speed of the serial port communication\nNeeds to match your firmware settings\nCommon values are 250000, 115200, 57600', type = 'preference') c = configBase.SettingRow(left, 'Baudrate', 'serial_baud', '250000', 'Speed of the serial port communication\nNeeds to match your firmware settings\nCommon values are 250000, 115200, 57600', type = 'preference')

View File

@ -459,6 +459,10 @@ class PreviewGLCanvas(glcanvas.GLCanvas):
glColor3f(c/2,c/2,0) glColor3f(c/2,c/2,0)
elif path.pathType == 'WALL-INNER': elif path.pathType == 'WALL-INNER':
glColor3f(0,c,0) glColor3f(0,c,0)
elif path.pathType == 'SUPPORT':
glColor3f(0,c,c)
elif path.pathType == 'SKIRT':
glColor3f(0,c/2,c/2)
else: else:
glColor3f(c,0,0) glColor3f(c,0,0)
if path.type == 'retract': if path.type == 'retract':

View File

@ -13,6 +13,7 @@ def printFile(filename):
global printWindowHandle global printWindowHandle
if printWindowHandle == None: if printWindowHandle == None:
printWindowHandle = printWindow() printWindowHandle = printWindow()
printWindowHandle.OnConnect(None)
printWindowHandle.Show(True) printWindowHandle.Show(True)
printWindowHandle.Raise() printWindowHandle.Raise()
printWindowHandle.LoadGCodeFile(filename) printWindowHandle.LoadGCodeFile(filename)
@ -24,12 +25,13 @@ class printWindow(wx.Frame):
self.machineCom = None self.machineCom = None
self.machineConnected = False self.machineConnected = False
self.thread = None self.thread = None
self.gcode = None
self.gcodeList = None self.gcodeList = None
self.printIdx = None self.printIdx = None
self.bufferLineCount = 4 self.bufferLineCount = 4
self.sendCnt = 0 self.sendCnt = 0
self.SetIcon(icon.getMainIcon()) #self.SetIcon(icon.getMainIcon())
self.SetSizer(wx.BoxSizer()) self.SetSizer(wx.BoxSizer())
self.panel = wx.Panel(self) self.panel = wx.Panel(self)
@ -39,18 +41,18 @@ class printWindow(wx.Frame):
sb = wx.StaticBox(self.panel, label="Statistics") sb = wx.StaticBox(self.panel, label="Statistics")
boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL) boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL)
self.statsText = wx.StaticText(self.panel, -1, "Filament: #.##m #.##g\nPrint time: ##:##") self.statsText = wx.StaticText(self.panel, -1, "Filament: ####.##m #.##g\nPrint time: #####:##")
boxsizer.Add(self.statsText, flag=wx.LEFT, border=5) boxsizer.Add(self.statsText, flag=wx.LEFT, border=5)
self.sizer.Add(boxsizer, pos=(0,0), span=(4,1), flag=wx.EXPAND) self.sizer.Add(boxsizer, pos=(0,0), span=(4,1), flag=wx.EXPAND)
self.connectButton = wx.Button(self.panel, -1, 'Connect') self.connectButton = wx.Button(self.panel, -1, 'Connect')
self.loadButton = wx.Button(self.panel, -1, 'Load GCode') #self.loadButton = wx.Button(self.panel, -1, 'Load GCode')
self.printButton = wx.Button(self.panel, -1, 'Print GCode') self.printButton = wx.Button(self.panel, -1, 'Print GCode')
self.cancelButton = wx.Button(self.panel, -1, 'Cancel print') self.cancelButton = wx.Button(self.panel, -1, 'Cancel print')
self.progress = wx.Gauge(self.panel, -1) self.progress = wx.Gauge(self.panel, -1)
self.sizer.Add(self.connectButton, pos=(0,1)) self.sizer.Add(self.connectButton, pos=(0,1))
self.sizer.Add(self.loadButton, pos=(1,1)) #self.sizer.Add(self.loadButton, pos=(1,1))
self.sizer.Add(self.printButton, pos=(2,1)) self.sizer.Add(self.printButton, pos=(2,1))
self.sizer.Add(self.cancelButton, pos=(3,1)) self.sizer.Add(self.cancelButton, pos=(3,1))
self.sizer.Add(self.progress, pos=(4,0), span=(1,2), flag=wx.EXPAND) self.sizer.Add(self.progress, pos=(4,0), span=(1,2), flag=wx.EXPAND)
@ -59,7 +61,7 @@ class printWindow(wx.Frame):
self.Bind(wx.EVT_CLOSE, self.OnClose) self.Bind(wx.EVT_CLOSE, self.OnClose)
self.connectButton.Bind(wx.EVT_BUTTON, self.OnConnect) self.connectButton.Bind(wx.EVT_BUTTON, self.OnConnect)
self.loadButton.Bind(wx.EVT_BUTTON, self.OnLoad) #self.loadButton.Bind(wx.EVT_BUTTON, self.OnLoad)
self.printButton.Bind(wx.EVT_BUTTON, self.OnPrint) self.printButton.Bind(wx.EVT_BUTTON, self.OnPrint)
self.cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel) self.cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)
@ -72,14 +74,19 @@ class printWindow(wx.Frame):
def UpdateButtonStates(self): def UpdateButtonStates(self):
self.connectButton.Enable(not self.machineConnected) self.connectButton.Enable(not self.machineConnected)
self.loadButton.Enable(self.printIdx == None) #self.loadButton.Enable(self.printIdx == None)
self.printButton.Enable(self.machineConnected and self.gcodeList != None and self.printIdx == None) self.printButton.Enable(self.machineConnected and self.gcodeList != None and self.printIdx == None)
self.cancelButton.Enable(self.printIdx != None) self.cancelButton.Enable(self.printIdx != None)
def UpdateProgress(self): def UpdateProgress(self):
status = "" status = ""
if self.gcode != None:
status += "Filament: %.2fm %.2fg\n" % (self.gcode.extrusionAmount / 1000, self.gcode.calculateWeight() * 1000)
status += "Print time: %02d:%02d\n" % (int(self.gcode.totalMoveTimeMinute / 60), int(self.gcode.totalMoveTimeMinute % 60))
if self.printIdx == None: if self.printIdx == None:
self.progress.SetValue(0) self.progress.SetValue(0)
if self.gcodeList != None:
status += 'Line: -/%d\n' % (len(self.gcodeList))
else: else:
self.progress.SetValue(self.printIdx) self.progress.SetValue(self.printIdx)
status += 'Line: %d/%d\n' % (self.printIdx, len(self.gcodeList)) status += 'Line: %d/%d\n' % (self.printIdx, len(self.gcodeList))
@ -122,6 +129,8 @@ class printWindow(wx.Frame):
self.Destroy() self.Destroy()
def LoadGCodeFile(self, filename): def LoadGCodeFile(self, filename):
if self.printIdx != None:
return
gcodeList = ["M110"] gcodeList = ["M110"]
for line in open(filename, 'r'): for line in open(filename, 'r'):
if ';' in line: if ';' in line:
@ -131,19 +140,19 @@ class printWindow(wx.Frame):
gcodeList.append(line) gcodeList.append(line)
gcode = gcodeInterpreter.gcode() gcode = gcodeInterpreter.gcode()
gcode.loadList(gcodeList) gcode.loadList(gcodeList)
print gcode.extrusionAmount
print gcode.totalMoveTimeMinute
print "Loaded: %s (%d)" % (filename, len(gcodeList)) print "Loaded: %s (%d)" % (filename, len(gcodeList))
self.progress.SetRange(len(gcodeList)) self.progress.SetRange(len(gcodeList))
self.gcode = gcode
self.gcodeList = gcodeList self.gcodeList = gcodeList
self.UpdateButtonStates() self.UpdateButtonStates()
self.UpdateProgress() self.UpdateProgress()
def sendLine(self, lineNr): def sendLine(self, lineNr):
if lineNr >= len(self.gcodeList): if lineNr >= len(self.gcodeList):
return return False
checksum = reduce(lambda x,y:x^y, map(ord, "N%d%s" % (lineNr, self.gcodeList[lineNr]))) checksum = reduce(lambda x,y:x^y, map(ord, "N%d%s" % (lineNr, self.gcodeList[lineNr])))
self.machineCom.sendCommand("N%d%s*%d" % (lineNr, self.gcodeList[lineNr], checksum)) self.machineCom.sendCommand("N%d%s*%d" % (lineNr, self.gcodeList[lineNr], checksum))
return True
def PrinterMonitor(self): def PrinterMonitor(self):
skipCount = 0 skipCount = 0
@ -151,7 +160,7 @@ class printWindow(wx.Frame):
line = self.machineCom.readline() line = self.machineCom.readline()
if line == None: if line == None:
self.machineConnected = False self.machineConnected = False
wx.CallAfter(self.UpdateButtonState) wx.CallAfter(self.UpdateButtonStates)
return return
if self.machineConnected: if self.machineConnected:
while self.sendCnt > 0: while self.sendCnt > 0:
@ -160,14 +169,17 @@ class printWindow(wx.Frame):
self.sendCnt -= 1 self.sendCnt -= 1
elif line.startswith("start"): elif line.startswith("start"):
self.machineConnected = True self.machineConnected = True
wx.CallAfter(self.UpdateButtonState) wx.CallAfter(self.UpdateButtonStates)
if self.printIdx != None: if self.printIdx != None:
if line.startswith("ok"): if line.startswith("ok"):
if skipCount > 0: if skipCount > 0:
skipCount -= 1 skipCount -= 1
else: else:
self.sendLine(self.printIdx) if self.sendLine(self.printIdx):
self.printIdx += 1 self.printIdx += 1
else:
self.printIdx = None
wx.CallAfter(self.UpdateButtonStates)
wx.CallAfter(self.UpdateProgress) wx.CallAfter(self.UpdateProgress)
elif "resend" in line.lower() or "rs" in line: elif "resend" in line.lower() or "rs" in line:
try: try:
@ -177,3 +189,4 @@ class printWindow(wx.Frame):
lineNr=int(line.split()[1]) lineNr=int(line.split()[1])
self.printIdx = lineNr self.printIdx = lineNr
#we should actually resend the line here, but we also get an "ok" for each error from Marlin. And thus we'll resend on the OK. #we should actually resend the line here, but we also get an "ok" for each error from Marlin. And thus we'll resend on the OK.

View File

@ -20,7 +20,7 @@ class simpleModeWindow(configBase.configWindowBase):
super(simpleModeWindow, self).__init__(title='Cura - Simple mode') super(simpleModeWindow, self).__init__(title='Cura - Simple mode')
wx.EVT_CLOSE(self, self.OnClose) wx.EVT_CLOSE(self, self.OnClose)
self.SetIcon(icon.getMainIcon()) #self.SetIcon(icon.getMainIcon())
menubar = wx.MenuBar() menubar = wx.MenuBar()
fileMenu = wx.Menu() fileMenu = wx.Menu()

View File

@ -7,6 +7,7 @@ import re
import os import os
from util import util3d from util import util3d
from util import profile
class gcodePath(): class gcodePath():
def __init__(self, newType, pathType, startPoint): def __init__(self, newType, pathType, startPoint):
@ -31,6 +32,12 @@ class gcode():
def loadList(self, l): def loadList(self, l):
self._load(l) self._load(l)
def calculateWeight(self):
#Calculates the weight of the filament in kg
radius = float(profile.getProfileSetting('filament_diameter')) / 2
volumeM3 = (self.extrusionAmount * (math.pi * radius * radius)) / (1000*1000*1000)
return volumeM3 * float(profile.getPreference('filament_density'))
def _load(self, gcodeFile): def _load(self, gcodeFile):
filePos = 0 filePos = 0
pos = util3d.Vector3() pos = util3d.Vector3()

View File

@ -69,6 +69,7 @@ preferencesDefaultSettings = {
'machine_width': '205', 'machine_width': '205',
'machine_depth': '205', 'machine_depth': '205',
'machine_height': '200', 'machine_height': '200',
'filament_density': '1300',
'steps_per_e': '0', 'steps_per_e': '0',
'serial_port': 'AUTO', 'serial_port': 'AUTO',
'serial_baud': '250000', 'serial_baud': '250000',

View File

@ -16,7 +16,7 @@ BUILD_TARGET=${1:-win32}
##Do we need to create the final archive ##Do we need to create the final archive
ARCHIVE_FOR_DISTRIBUTION=1 ARCHIVE_FOR_DISTRIBUTION=1
##Which version name are we appending to the final archive ##Which version name are we appending to the final archive
BUILD_NAME=NewUI-Beta4 BUILD_NAME=RC1
TARGET_DIR=${BUILD_TARGET}-Cura-${BUILD_NAME} TARGET_DIR=${BUILD_TARGET}-Cura-${BUILD_NAME}
##Which versions of external programs to use ##Which versions of external programs to use
@ -159,6 +159,12 @@ if (( ${ARCHIVE_FOR_DISTRIBUTION} )); then
cd ${TARGET_DIR} cd ${TARGET_DIR}
7z a ../${TARGET_DIR}.zip * 7z a ../${TARGET_DIR}.zip *
cd .. cd ..
if [ ! -z `which wine` ]; then
#if we have wine, try to run our nsis script.
ln -sf `pwd`/${TARGET_DIR} scripts/win32/dist
wine ~/.wine/drive_c/Program\ Files/NSIS/makensis.exe /DVERSION=${BUILD_NAME} scripts/win32/installer.nsi
fi
else else
echo "Archiving to ${TARGET_DIR}.tar.gz" echo "Archiving to ${TARGET_DIR}.tar.gz"
$TAR cfp - ${TARGET_DIR} | gzip --best -c > ${TARGET_DIR}.tar.gz $TAR cfp - ${TARGET_DIR} | gzip --best -c > ${TARGET_DIR}.tar.gz

View File

@ -1,4 +1,6 @@
!define VERSION 'RC1' !ifndef VERSION
!define VERSION 'DEV'
!endif
; The name of the installer ; The name of the installer
Name "Cura ${VERSION}" Name "Cura ${VERSION}"