chiark / gitweb /
Added icon to main window. Added win32 installer script, with drivers for Arduino...
[cura.git] / Cura / gui / printWindow.py
1 from __future__ import absolute_import\r
2 import __init__\r
3 \r
4 import wx, threading\r
5 \r
6 from gui import machineCom\r
7 from gui import icon\r
8 \r
9 printWindowHandle = None\r
10 \r
11 def printFile(filename):\r
12         global printWindowHandle\r
13         if printWindowHandle == None:\r
14                 printWindowHandle = printWindow()\r
15         printWindowHandle.Show(True)\r
16         printWindowHandle.Raise()\r
17         printWindowHandle.LoadGCodeFile(filename)\r
18 \r
19 class printWindow(wx.Frame):\r
20         "Main user interface window"\r
21         def __init__(self):\r
22                 super(printWindow, self).__init__(None, -1, title='Printing')\r
23                 self.machineCom = None\r
24                 self.thread = None\r
25                 self.gcodeList = None\r
26                 self.printIdx = None\r
27                 self.bufferLineCount = 4\r
28                 self.sendCnt = 0\r
29 \r
30                 self.SetIcon(icon.getMainIcon())\r
31                 \r
32                 self.SetSizer(wx.BoxSizer())\r
33                 self.panel = wx.Panel(self)\r
34                 self.GetSizer().Add(self.panel, 1, flag=wx.EXPAND)\r
35                 self.sizer = wx.GridBagSizer(2, 2)\r
36                 self.panel.SetSizer(self.sizer)\r
37                 \r
38                 sb = wx.StaticBox(self.panel, label="Statistics")\r
39                 boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL)\r
40                 boxsizer.Add(wx.StaticText(self.panel, -1, "Filament: #.##m #.##g"), flag=wx.LEFT, border=5)\r
41                 boxsizer.Add(wx.StaticText(self.panel, -1, "Print time: ##:##"), flag=wx.LEFT, border=5)\r
42                 \r
43                 self.sizer.Add(boxsizer, pos=(0,0), span=(4,1), flag=wx.EXPAND)\r
44                 \r
45                 self.connectButton = wx.Button(self.panel, -1, 'Connect')\r
46                 self.loadButton = wx.Button(self.panel, -1, 'Load GCode')\r
47                 self.printButton = wx.Button(self.panel, -1, 'Print GCode')\r
48                 self.cancelButton = wx.Button(self.panel, -1, 'Cancel print')\r
49                 self.sizer.Add(self.connectButton, pos=(0,1))\r
50                 self.sizer.Add(self.loadButton, pos=(1,1))\r
51                 self.sizer.Add(self.printButton, pos=(2,1))\r
52                 self.sizer.Add(self.cancelButton, pos=(3,1))\r
53                 self.sizer.Add(wx.Gauge(self.panel, -1), pos=(4,0), span=(1,2), flag=wx.EXPAND)\r
54                 self.sizer.AddGrowableRow(3)\r
55                 self.sizer.AddGrowableCol(0)\r
56                 \r
57                 self.Bind(wx.EVT_CLOSE, self.OnClose)\r
58                 self.connectButton.Bind(wx.EVT_BUTTON, self.OnConnect)\r
59                 self.loadButton.Bind(wx.EVT_BUTTON, self.OnLoad)\r
60                 self.printButton.Bind(wx.EVT_BUTTON, self.OnPrint)\r
61                 self.cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)\r
62                 \r
63                 self.Layout()\r
64                 self.Fit()\r
65                 self.Centre()\r
66         \r
67         def OnConnect(self, e):\r
68                 if self.machineCom != None:\r
69                         self.machineCom.close()\r
70                         self.thread.join()\r
71                 self.machineCom = machineCom.MachineCom()\r
72                 self.thread = threading.Thread(target=self.PrinterMonitor)\r
73                 self.thread.start()\r
74         \r
75         def OnLoad(self, e):\r
76                 pass\r
77         \r
78         def OnPrint(self, e):\r
79                 if self.machineCom == None:\r
80                         return\r
81                 if self.gcodeList == None:\r
82                         return\r
83                 if self.printIdx != None:\r
84                         return\r
85                 self.printIdx = 1\r
86                 self.sendLine(0)\r
87                 self.sendCnt = self.bufferLineCount\r
88         \r
89         def OnCancel(self, e):\r
90                 pass\r
91         \r
92         def OnClose(self, e):\r
93                 global printWindowHandle\r
94                 printWindowHandle = None\r
95                 if self.machineCom != None:\r
96                         self.machineCom.close()\r
97                         self.thread.join()\r
98                 self.Destroy()\r
99 \r
100         def LoadGCodeFile(self, filename):\r
101                 gcodeList = ["M110"]\r
102                 for line in open(filename, 'r'):\r
103                         if ';' in line:\r
104                                 line = line[0:line.find(';')]\r
105                         line = line.strip()\r
106                         if len(line) > 0:\r
107                                 gcodeList.append(line)\r
108                 print "Loaded: %s (%d)" % (filename, len(gcodeList))\r
109                 self.gcodeList = gcodeList\r
110 \r
111         def sendLine(self, lineNr):\r
112                 if lineNr >= len(self.gcodeList):\r
113                         return\r
114                 checksum = reduce(lambda x,y:x^y, map(ord, "N%d%s" % (lineNr, self.gcodeList[lineNr])))\r
115                 self.machineCom.sendCommand("N%d%s*%d" % (lineNr, self.gcodeList[lineNr], checksum))\r
116 \r
117         def PrinterMonitor(self):\r
118                 skipCount = 0\r
119                 while True:\r
120                         line = self.machineCom.readline()\r
121                         if line == None:\r
122                                 return\r
123                         while self.sendCnt > 0:\r
124                                 self.sendLine(self.printIdx)\r
125                                 self.printIdx += 1\r
126                                 self.sendCnt -= 1\r
127                         if self.printIdx != None:\r
128                                 if line.startswith("ok"):\r
129                                         if skipCount > 0:\r
130                                                 skipCount -= 1\r
131                                         else:\r
132                                                 self.sendLine(self.printIdx)\r
133                                                 self.printIdx += 1\r
134                                 elif "resend" in line.lower() or "rs" in line:\r
135                                         try:\r
136                                                 lineNr=int(line.replace("N:"," ").replace("N"," ").replace(":"," ").split()[-1])\r
137                                         except:\r
138                                                 if "rs" in line:\r
139                                                         lineNr=int(line.split()[1])\r
140                                         self.printIdx = lineNr\r