Merge branch 'experimental' of https://github.com/kliment/Printrun into experimental
Conflicts: pronterface.pymaster
commit
fd08509b75
143
README.md
143
README.md
|
@ -5,80 +5,44 @@ Printrun consists of printcore, pronsole and pronterface, and a small collection
|
||||||
* pronterface.py is a graphical host software with the same functionality as pronsole
|
* pronterface.py is a graphical host software with the same functionality as pronsole
|
||||||
* webinterface.py is a browser-usable remote control function for Pronterface
|
* webinterface.py is a browser-usable remote control function for Pronterface
|
||||||
|
|
||||||
# INSTALLING DEPENDENCIES
|
# GETTING PRINTRUN
|
||||||
|
|
||||||
|
This section suggests using precompiled binaries, this way you get everything bundled into one single package for an easy installation.
|
||||||
|
|
||||||
|
If you want the newest, shiniest features, you can run Printrun from source using the instructions further down this README.
|
||||||
|
|
||||||
## Windows
|
## Windows
|
||||||
|
|
||||||
A precompiled version is available at http://koti.kapsi.fi/~kliment/printrun/
|
A precompiled version is available at http://koti.kapsi.fi/~kliment/printrun/
|
||||||
|
|
||||||
Download the following, and install in this order:
|
## Mac OS X
|
||||||
|
|
||||||
1. http://python.org/ftp/python/2.7.2/python-2.7.2.msi
|
A precompiled version is available at http://koti.kapsi.fi/~kliment/printrun/
|
||||||
2. http://pypi.python.org/packages/any/p/pyserial/pyserial-2.5.win32.exe
|
|
||||||
3. http://downloads.sourceforge.net/wxpython/wxPython2.8-win32-unicode-2.8.12.0-py27.exe
|
|
||||||
4. http://launchpad.net/pyreadline/1.7/1.7/+download/pyreadline-1.7.win32.exe
|
|
||||||
5. http://pyglet.googlecode.com/files/pyglet-1.1.4.zip
|
|
||||||
|
|
||||||
For the last one, you will need to unpack it, open a command terminal,
|
## Linux
|
||||||
go into the the directory you unpacked it in and run
|
### Ubuntu/Debian
|
||||||
`python setup.py install`
|
|
||||||
|
You can run Printrun directly from source, as there are no packages available yet. Fetch and install the dependencies using
|
||||||
|
|
||||||
## Ubuntu/Debian
|
|
||||||
`sudo apt-get install python-serial python-wxgtk2.8 python-pyglet`
|
`sudo apt-get install python-serial python-wxgtk2.8 python-pyglet`
|
||||||
|
|
||||||
## Fedora 15
|
### Fedora 15 and newer
|
||||||
|
|
||||||
|
You can run Printrun directly from source, as there are no packages available yet. Fetch and install the dependencies using
|
||||||
|
|
||||||
`sudo yum install pyserial wxpython pyglet`
|
`sudo yum install pyserial wxpython pyglet`
|
||||||
|
|
||||||
## Mac OS X Lion
|
### Archlinux
|
||||||
|
|
||||||
A precompiled version is available at http://koti.kapsi.fi/~kliment/printrun/
|
Packages are available in AUR. Just run
|
||||||
|
|
||||||
1. Ensure that the active Python is the system version. (`brew uninstall python` or other appropriate incantations)
|
`yaourt printrun`
|
||||||
2. Download an install [wxPython2.8-osx-unicode] matching to your python version (most likely 2.7 on Lion,
|
|
||||||
check with: python --version) from: http://wxpython.org/download.php#stable
|
|
||||||
Known to work PythonWX: http://superb-sea2.dl.sourceforge.net/project/wxpython/wxPython/2.8.12.1/wxPython2.8-osx-unicode-2.8.12.1-universal-py2.7.dmg
|
|
||||||
3. Download and unpack pyserial from http://pypi.python.org/packages/source/p/pyserial/pyserial-2.5.tar.gz
|
|
||||||
4. In a terminal, change to the folder you unzipped to, then type in: `sudo python setup.py install`
|
|
||||||
5. Repeat 4. with http://http://pyglet.googlecode.com/files/pyglet-1.1.4.zip
|
|
||||||
|
|
||||||
The tools will probably run just fine in 64bit on Lion, you don't need to mess
|
and enjoy the `pronterface`, `pronsole`, ... commands directly.
|
||||||
with any of the 32bit settings. In case they don't, try
|
|
||||||
5. export VERSIONER_PYTHON_PREFER_32_BIT=yes
|
|
||||||
in a terminal before running Pronterface
|
|
||||||
|
|
||||||
## Mac OS X (pre Lion)
|
|
||||||
|
|
||||||
A precompiled version is available at http://koti.kapsi.fi/~kliment/printrun/
|
|
||||||
|
|
||||||
1. Download and install http://downloads.sourceforge.net/wxpython/wxPython2.8-osx-unicode-2.8.12.0-universal-py2.6.dmg
|
|
||||||
2. Grab the source for pyserial from http://pypi.python.org/packages/source/p/pyserial/pyserial-2.5.tar.gz
|
|
||||||
3. Unzip pyserial to a folder. Then, in a terminal, change to the folder you unzipped to, then type in:
|
|
||||||
|
|
||||||
`defaults write com.apple.versioner.python Prefer-32-Bit -bool yes`
|
|
||||||
|
|
||||||
`sudo python setup.py install`
|
|
||||||
|
|
||||||
Alternatively, you can run python in 32 bit mode by setting the following environment variable before running the setup.py command:
|
|
||||||
|
|
||||||
This alternative approach is confirmed to work on Mac OS X 10.6.8.
|
|
||||||
|
|
||||||
`export VERSIONER_PYTHON_PREFER_32_BIT=yes`
|
|
||||||
|
|
||||||
`sudo python setup.py install`
|
|
||||||
|
|
||||||
Then repeat the same with http://http://pyglet.googlecode.com/files/pyglet-1.1.4.zip
|
|
||||||
|
|
||||||
# USING PRONTERFACE
|
# USING PRONTERFACE
|
||||||
|
|
||||||
To use pronterface, you need:
|
When you're done setting up Printrun, you can start pronterface.py in the directory you unpacked it.
|
||||||
|
|
||||||
* python (ideally 2.6.x or 2.7.x),
|
|
||||||
* pyserial (or python-serial on ubuntu/debian),
|
|
||||||
* pyglet
|
|
||||||
* pyreadline (not needed on Linux) and
|
|
||||||
* wxPython
|
|
||||||
|
|
||||||
Download and install the above, and start pronterface.py
|
|
||||||
Select the port name you are using from the first drop-down, select your baud rate, and hit connect.
|
Select the port name you are using from the first drop-down, select your baud rate, and hit connect.
|
||||||
Load an STL (see the note on skeinforge below) or GCODE file, and you can upload it to SD or print it directly.
|
Load an STL (see the note on skeinforge below) or GCODE file, and you can upload it to SD or print it directly.
|
||||||
The "monitor printer" function, when enabled, checks the printer state (temperatures, SD print progress) every 3 seconds.
|
The "monitor printer" function, when enabled, checks the printer state (temperatures, SD print progress) every 3 seconds.
|
||||||
|
@ -133,6 +97,73 @@ sender, or the following code example:
|
||||||
p.resume()
|
p.resume()
|
||||||
p.disconnect()
|
p.disconnect()
|
||||||
|
|
||||||
|
# RUNNING FROM SOURCE
|
||||||
|
|
||||||
|
Run Printrun for source if you want to test out the latest features.
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
To use pronterface, you need:
|
||||||
|
|
||||||
|
* python (ideally 2.6.x or 2.7.x),
|
||||||
|
* pyserial (or python-serial on ubuntu/debian),
|
||||||
|
* pyglet
|
||||||
|
* pyreadline (not needed on Linux) and
|
||||||
|
* wxPython
|
||||||
|
|
||||||
|
Please see specific instructions for Windows and Mac OS X below. Under Linux, you should use your package manager directly (see the "GETTING PRINTRUN" section)
|
||||||
|
|
||||||
|
## Windows
|
||||||
|
|
||||||
|
Download the following, and install in this order:
|
||||||
|
|
||||||
|
1. http://python.org/ftp/python/2.7.2/python-2.7.2.msi
|
||||||
|
2. http://pypi.python.org/packages/any/p/pyserial/pyserial-2.5.win32.exe
|
||||||
|
3. http://downloads.sourceforge.net/wxpython/wxPython2.8-win32-unicode-2.8.12.0-py27.exe
|
||||||
|
4. http://launchpad.net/pyreadline/1.7/1.7/+download/pyreadline-1.7.win32.exe
|
||||||
|
5. http://pyglet.googlecode.com/files/pyglet-1.1.4.zip
|
||||||
|
|
||||||
|
For the last one, you will need to unpack it, open a command terminal,
|
||||||
|
go into the the directory you unpacked it in and run
|
||||||
|
`python setup.py install`
|
||||||
|
|
||||||
|
## Mac OS X Lion
|
||||||
|
|
||||||
|
1. Ensure that the active Python is the system version. (`brew uninstall python` or other appropriate incantations)
|
||||||
|
2. Download an install [wxPython2.8-osx-unicode] matching to your python version (most likely 2.7 on Lion,
|
||||||
|
check with: python --version) from: http://wxpython.org/download.php#stable
|
||||||
|
Known to work PythonWX: http://superb-sea2.dl.sourceforge.net/project/wxpython/wxPython/2.8.12.1/wxPython2.8-osx-unicode-2.8.12.1-universal-py2.7.dmg
|
||||||
|
3. Download and unpack pyserial from http://pypi.python.org/packages/source/p/pyserial/pyserial-2.5.tar.gz
|
||||||
|
4. In a terminal, change to the folder you unzipped to, then type in: `sudo python setup.py install`
|
||||||
|
5. Repeat 4. with http://http://pyglet.googlecode.com/files/pyglet-1.1.4.zip
|
||||||
|
|
||||||
|
The tools will probably run just fine in 64bit on Lion, you don't need to mess
|
||||||
|
with any of the 32bit settings. In case they don't, try
|
||||||
|
5. export VERSIONER_PYTHON_PREFER_32_BIT=yes
|
||||||
|
in a terminal before running Pronterface
|
||||||
|
|
||||||
|
## Mac OS X (pre Lion)
|
||||||
|
|
||||||
|
A precompiled version is available at http://koti.kapsi.fi/~kliment/printrun/
|
||||||
|
|
||||||
|
1. Download and install http://downloads.sourceforge.net/wxpython/wxPython2.8-osx-unicode-2.8.12.0-universal-py2.6.dmg
|
||||||
|
2. Grab the source for pyserial from http://pypi.python.org/packages/source/p/pyserial/pyserial-2.5.tar.gz
|
||||||
|
3. Unzip pyserial to a folder. Then, in a terminal, change to the folder you unzipped to, then type in:
|
||||||
|
|
||||||
|
`defaults write com.apple.versioner.python Prefer-32-Bit -bool yes`
|
||||||
|
|
||||||
|
`sudo python setup.py install`
|
||||||
|
|
||||||
|
Alternatively, you can run python in 32 bit mode by setting the following environment variable before running the setup.py command:
|
||||||
|
|
||||||
|
This alternative approach is confirmed to work on Mac OS X 10.6.8.
|
||||||
|
|
||||||
|
`export VERSIONER_PYTHON_PREFER_32_BIT=yes`
|
||||||
|
|
||||||
|
`sudo python setup.py install`
|
||||||
|
|
||||||
|
Then repeat the same with http://http://pyglet.googlecode.com/files/pyglet-1.1.4.zip
|
||||||
|
|
||||||
# LICENSE
|
# LICENSE
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
|
@ -1,17 +1,6 @@
|
||||||
# Sample .pronsolerc file - copy this into your home directory and rename it to .pronsolerc
|
# Sample .pronsolerc file - copy this into your home directory and rename it to .pronsolerc
|
||||||
!print "Loaded " + self.rc_filename
|
!print "Loaded " + self.rc_filename
|
||||||
|
|
||||||
macro loud
|
|
||||||
!if self.p.loud:
|
|
||||||
!self.p.loud = 0
|
|
||||||
!if hasattr(self,"cur_button") and self.cur_button is not None:
|
|
||||||
!self.onecmd('button %d "loud (off)" /c green loud' % self.cur_button)
|
|
||||||
!else:
|
|
||||||
!self.p.loud = 1
|
|
||||||
!if hasattr(self,"cur_button") and self.cur_button is not None:
|
|
||||||
!self.onecmd('button %d "loud (on)" /c yellow loud' % self.cur_button)
|
|
||||||
button 0 "loud (off)" /c "green" loud
|
|
||||||
|
|
||||||
macro fan
|
macro fan
|
||||||
!global _fan
|
!global _fan
|
||||||
!if '_fan' in globals() and _fan:
|
!if '_fan' in globals() and _fan:
|
||||||
|
@ -24,4 +13,4 @@ macro fan
|
||||||
M106
|
M106
|
||||||
!if hasattr(self,"cur_button") and self.cur_button is not None:
|
!if hasattr(self,"cur_button") and self.cur_button is not None:
|
||||||
!self.onecmd('button %d "fan (on)" /c yellow fan' % self.cur_button)
|
!self.onecmd('button %d "fan (on)" /c yellow fan' % self.cur_button)
|
||||||
button 1 "fan (off)" /c "green" fan
|
button 0 "fan (off)" /c "green" fan
|
|
@ -147,13 +147,19 @@ class printcore():
|
||||||
pass
|
pass
|
||||||
#callback for errors
|
#callback for errors
|
||||||
pass
|
pass
|
||||||
|
# Teststrings for resend parsing # Firmware exp. result
|
||||||
|
# line="rs N2 Expected checksum 67" # Teacup 2
|
||||||
if line.lower().startswith("resend") or line.startswith("rs"):
|
if line.lower().startswith("resend") or line.startswith("rs"):
|
||||||
try:
|
line=line.replace("N:"," ").replace("N"," ").replace(":"," ")
|
||||||
toresend=int(line.replace("N:"," ").replace("N"," ").replace(":"," ").split()[-1])
|
linewords=line.split()
|
||||||
except:
|
while len(linewords) != 0:
|
||||||
if line.startswith("rs"):
|
try:
|
||||||
toresend=int(line.split()[1])
|
toresend=int(linewords.pop(0))
|
||||||
self.resendfrom=toresend
|
self.resendfrom=toresend
|
||||||
|
#print str(toresend)
|
||||||
|
break
|
||||||
|
except:
|
||||||
|
pass
|
||||||
self.clear=True
|
self.clear=True
|
||||||
self.clear=True
|
self.clear=True
|
||||||
#callback for disconnect
|
#callback for disconnect
|
||||||
|
|
|
@ -623,6 +623,9 @@ class pronsole(cmd.Cmd):
|
||||||
print "Disconnects from the printer"
|
print "Disconnects from the printer"
|
||||||
|
|
||||||
def do_load(self,l):
|
def do_load(self,l):
|
||||||
|
self._do_load(l)
|
||||||
|
|
||||||
|
def _do_load(self,l):
|
||||||
if len(l)==0:
|
if len(l)==0:
|
||||||
print "No file name given."
|
print "No file name given."
|
||||||
return
|
return
|
||||||
|
@ -876,14 +879,16 @@ class pronsole(cmd.Cmd):
|
||||||
def default(self,l):
|
def default(self,l):
|
||||||
if(l[0] in self.commandprefixes.upper()):
|
if(l[0] in self.commandprefixes.upper()):
|
||||||
if(self.p and self.p.online):
|
if(self.p and self.p.online):
|
||||||
print "SENDING:"+l
|
if(not self.p.loud):
|
||||||
|
print "SENDING:"+l
|
||||||
self.p.send_now(l)
|
self.p.send_now(l)
|
||||||
else:
|
else:
|
||||||
print "Printer is not online."
|
print "Printer is not online."
|
||||||
return
|
return
|
||||||
elif(l[0] in self.commandprefixes.lower()):
|
elif(l[0] in self.commandprefixes.lower()):
|
||||||
if(self.p and self.p.online):
|
if(self.p and self.p.online):
|
||||||
print "SENDING:"+l.upper()
|
if(not self.p.loud):
|
||||||
|
print "SENDING:"+l.upper()
|
||||||
self.p.send_now(l.upper())
|
self.p.send_now(l.upper())
|
||||||
else:
|
else:
|
||||||
print "Printer is not online."
|
print "Printer is not online."
|
||||||
|
|
|
@ -174,6 +174,8 @@ class PronterWindow(wx.Frame,pronsole.pronsole):
|
||||||
print _("Failed to start web interface")
|
print _("Failed to start web interface")
|
||||||
traceback.print_exc(file = sys.stdout)
|
traceback.print_exc(file = sys.stdout)
|
||||||
self.webInterface = None
|
self.webInterface = None
|
||||||
|
if self.filename is not None:
|
||||||
|
self.do_load(self.filename)
|
||||||
|
|
||||||
def startcb(self):
|
def startcb(self):
|
||||||
self.starttime=time.time()
|
self.starttime=time.time()
|
||||||
|
@ -391,9 +393,7 @@ class PronterWindow(wx.Frame,pronsole.pronsole):
|
||||||
self.capture_skip[pat] -= 1
|
self.capture_skip[pat] -= 1
|
||||||
self.capture_skip_newline = True
|
self.capture_skip_newline = True
|
||||||
return
|
return
|
||||||
wx.CallAfter(self.logbox.AppendText,l)
|
wx.CallAfter(self.addtexttolog,l);
|
||||||
if self.webInterface:
|
|
||||||
self.webInterface.AppendLog(l)
|
|
||||||
|
|
||||||
def scanserial(self):
|
def scanserial(self):
|
||||||
"""scan for available ports. return a list of device names."""
|
"""scan for available ports. return a list of device names."""
|
||||||
|
@ -437,6 +437,12 @@ class PronterWindow(wx.Frame,pronsole.pronsole):
|
||||||
self.Bind(wx.EVT_MENU, lambda *e:options(self), m.Append(-1,_("&Options"),_(" Options dialog")))
|
self.Bind(wx.EVT_MENU, lambda *e:options(self), m.Append(-1,_("&Options"),_(" Options dialog")))
|
||||||
|
|
||||||
self.Bind(wx.EVT_MENU, lambda x:threading.Thread(target=lambda :self.do_skein("set")).start(), m.Append(-1,_("Slicing Settings"),_(" Adjust slicing settings")))
|
self.Bind(wx.EVT_MENU, lambda x:threading.Thread(target=lambda :self.do_skein("set")).start(), m.Append(-1,_("Slicing Settings"),_(" Adjust slicing settings")))
|
||||||
|
|
||||||
|
mItem = m.AppendCheckItem(-1, _("Debug G-code"),
|
||||||
|
_("Print all G-code sent to and received from the printer."))
|
||||||
|
m.Check(mItem.GetId(), self.p.loud)
|
||||||
|
self.Bind(wx.EVT_MENU, self.setloud, mItem)
|
||||||
|
|
||||||
#try:
|
#try:
|
||||||
# from SkeinforgeQuickEditDialog import SkeinforgeQuickEditDialog
|
# from SkeinforgeQuickEditDialog import SkeinforgeQuickEditDialog
|
||||||
# self.Bind(wx.EVT_MENU, lambda *e:SkeinforgeQuickEditDialog(self), m.Append(-1,_("SFACT Quick Settings"),_(" Quickly adjust SFACT settings for active profile")))
|
# self.Bind(wx.EVT_MENU, lambda *e:SkeinforgeQuickEditDialog(self), m.Append(-1,_("SFACT Quick Settings"),_(" Quickly adjust SFACT settings for active profile")))
|
||||||
|
@ -544,14 +550,15 @@ class PronterWindow(wx.Frame,pronsole.pronsole):
|
||||||
self.rescanbtn=wx.Button(self.panel,-1,_("Port"),size=buttonSize)
|
self.rescanbtn=wx.Button(self.panel,-1,_("Port"),size=buttonSize)
|
||||||
self.rescanbtn.SetToolTip(wx.ToolTip("Communication Settings\nClick to rescan ports"))
|
self.rescanbtn.SetToolTip(wx.ToolTip("Communication Settings\nClick to rescan ports"))
|
||||||
self.rescanbtn.Bind(wx.EVT_BUTTON,self.rescanports)
|
self.rescanbtn.Bind(wx.EVT_BUTTON,self.rescanports)
|
||||||
|
|
||||||
uts.Add(self.rescanbtn,0,wx.TOP|wx.LEFT,0)
|
uts.Add(self.rescanbtn,0,wx.TOP|wx.LEFT,0)
|
||||||
|
|
||||||
self.serialport = wx.ComboBox(self.panel, -1,
|
self.serialport = wx.ComboBox(self.panel, -1,
|
||||||
choices=self.scanserial(),
|
choices=self.scanserial(),
|
||||||
style=wx.CB_DROPDOWN, size=(100, 25))
|
style=wx.CB_DROPDOWN, size=(100, 25))
|
||||||
self.serialport.SetToolTip(wx.ToolTip("Select Port Printer is connected to"))
|
self.serialport.SetToolTip(wx.ToolTip("Select Port Printer is connected to"))
|
||||||
self.rescanports()
|
self.rescanports()
|
||||||
uts.Add(self.serialport)
|
uts.Add(self.serialport)
|
||||||
|
|
||||||
uts.Add(wx.StaticText(self.panel,-1,"@"),0,wx.RIGHT|wx.ALIGN_CENTER,0)
|
uts.Add(wx.StaticText(self.panel,-1,"@"),0,wx.RIGHT|wx.ALIGN_CENTER,0)
|
||||||
self.baud = wx.ComboBox(self.panel, -1,
|
self.baud = wx.ComboBox(self.panel, -1,
|
||||||
choices=["2400", "9600", "19200", "38400", "57600", "115200", "250000"],
|
choices=["2400", "9600", "19200", "38400", "57600", "115200", "250000"],
|
||||||
|
@ -563,20 +570,22 @@ class PronterWindow(wx.Frame,pronsole.pronsole):
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
uts.Add(self.baud)
|
uts.Add(self.baud)
|
||||||
|
|
||||||
self.connectbtn=wx.Button(self.panel,-1,_("Connect"), size=buttonSize)
|
self.connectbtn=wx.Button(self.panel,-1,_("Connect"), size=buttonSize)
|
||||||
uts.Add(self.connectbtn)
|
|
||||||
self.connectbtn.SetToolTip(wx.ToolTip("Connect to the printer"))
|
self.connectbtn.SetToolTip(wx.ToolTip("Connect to the printer"))
|
||||||
self.connectbtn.Bind(wx.EVT_BUTTON,self.connect)
|
self.connectbtn.Bind(wx.EVT_BUTTON,self.connect)
|
||||||
|
uts.Add(self.connectbtn)
|
||||||
|
|
||||||
self.resetbtn=wx.Button(self.panel,-1,_("Reset"),style=wx.BU_EXACTFIT,size=(-1,buttonSize[1]))
|
self.resetbtn=wx.Button(self.panel,-1,_("Reset"),style=wx.BU_EXACTFIT,size=(-1,buttonSize[1]))
|
||||||
self.resetbtn.Bind(wx.EVT_BUTTON,self.reset)
|
self.resetbtn.Bind(wx.EVT_BUTTON,self.reset)
|
||||||
self.resetbtn.SetToolTip(wx.ToolTip("Reset the printer"))
|
self.resetbtn.SetToolTip(wx.ToolTip("Reset the printer"))
|
||||||
uts.Add(self.resetbtn)
|
uts.Add(self.resetbtn)
|
||||||
#self.minibtn=wx.Button(self.panel,-1,_("Mini mode"),style=wx.BU_EXACTFIT)
|
|
||||||
#self.minibtn.Bind(wx.EVT_BUTTON,self.toggleview)
|
|
||||||
|
|
||||||
#uts.Add((25,-1))
|
#uts.Add((25,-1))
|
||||||
|
|
||||||
#uts.Add((15,-1),flag=wx.EXPAND)
|
#uts.Add((15,-1),flag=wx.EXPAND)
|
||||||
|
#self.minibtn=wx.Button(self.panel,-1,_("Mini mode"),style=wx.BU_EXACTFIT)
|
||||||
|
#self.minibtn.Bind(wx.EVT_BUTTON,self.toggleview)
|
||||||
#uts.Add(self.minibtn,0,wx.ALIGN_CENTER)
|
#uts.Add(self.minibtn,0,wx.ALIGN_CENTER)
|
||||||
|
|
||||||
#SECOND ROW
|
#SECOND ROW
|
||||||
|
@ -1316,15 +1325,23 @@ class PronterWindow(wx.Frame,pronsole.pronsole):
|
||||||
else:
|
else:
|
||||||
wx.CallAfter(self.graph.StopPlotting)
|
wx.CallAfter(self.graph.StopPlotting)
|
||||||
|
|
||||||
|
def addtexttolog(self,text):
|
||||||
|
try:
|
||||||
|
self.logbox.AppendText(text)
|
||||||
|
except:
|
||||||
|
print "attempted to write invalid text to console"
|
||||||
|
pass
|
||||||
|
if self.webInterface:
|
||||||
|
self.webInterface.AppendLog(text)
|
||||||
|
|
||||||
|
def setloud(self,e):
|
||||||
|
self.p.loud=e.IsChecked()
|
||||||
|
|
||||||
def sendline(self,e):
|
def sendline(self,e):
|
||||||
command=self.commandbox.GetValue()
|
command=self.commandbox.GetValue()
|
||||||
if not len(command):
|
if not len(command):
|
||||||
return
|
return
|
||||||
wx.CallAfter(self.logbox.AppendText,">>>"+command+"\n")
|
wx.CallAfter(self.addtexttolog,">>>"+command+"\n");
|
||||||
if self.webInterface:
|
|
||||||
self.webInterface.AppendLog(">>>"+command+"\n")
|
|
||||||
self.onecmd(str(command))
|
self.onecmd(str(command))
|
||||||
self.commandbox.SetSelection(0,len(command))
|
self.commandbox.SetSelection(0,len(command))
|
||||||
self.commandbox.history+=[command]
|
self.commandbox.history+=[command]
|
||||||
|
@ -1418,10 +1435,10 @@ class PronterWindow(wx.Frame,pronsole.pronsole):
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
tstring=l.rstrip()
|
tstring=l.rstrip()
|
||||||
#print tstring
|
#print tstring
|
||||||
if (tstring!="ok") and (tstring!="wait") and ("ok T:" not in tstring):
|
if (tstring!="ok") and (tstring!="wait") and ("ok T:" not in tstring) and (not self.p.loud):
|
||||||
# print "*"+tstring+"*"
|
# print "*"+tstring+"*"
|
||||||
# print "[" + time.strftime('%H:%M:%S',time.localtime(time.time())) + "] " + tstring
|
# print "[" + time.strftime('%H:%M:%S',time.localtime(time.time())) + "] " + tstring
|
||||||
wx.CallAfter(self.logbox.AppendText,tstring+"\n")
|
wx.CallAfter(self.addtexttolog,tstring+"\n");
|
||||||
for i in self.recvlisteners:
|
for i in self.recvlisteners:
|
||||||
i(l)
|
i(l)
|
||||||
|
|
||||||
|
@ -1542,6 +1559,12 @@ class PronterWindow(wx.Frame,pronsole.pronsole):
|
||||||
thread(target=self.skein_func).start()
|
thread(target=self.skein_func).start()
|
||||||
thread(target=self.skein_monitor).start()
|
thread(target=self.skein_monitor).start()
|
||||||
|
|
||||||
|
def do_load(self,l):
|
||||||
|
if hasattr(self, 'skeining'):
|
||||||
|
self.loadfile(None, l)
|
||||||
|
else:
|
||||||
|
self._do_load(l)
|
||||||
|
|
||||||
def loadfile(self,event,filename=None):
|
def loadfile(self,event,filename=None):
|
||||||
if self.skeining and self.skeinp is not None:
|
if self.skeining and self.skeinp is not None:
|
||||||
self.skeinp.terminate()
|
self.skeinp.terminate()
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
(Created by G-code exporter)
|
||||||
|
(Fri Apr 27 22:20:09 2012)
|
||||||
|
(Board size: 100.00 x 130.00 mm)
|
||||||
|
(---------------------------------)
|
||||||
|
G21
|
||||||
|
G90
|
||||||
|
G0 X14.392 Y30.94113 Z1.
|
||||||
|
G4
|
||||||
|
M104 S255
|
||||||
|
G1 Z-0.2 F60
|
||||||
|
G1 X14.05334 Y30.60247
|
||||||
|
G1 X12.02134 Y30.60247
|
||||||
|
G1 X11.598 Y30.85647
|
||||||
|
G1 X11.00534 Y31.5338
|
||||||
|
G1 X10.074 Y32.5498
|
||||||
|
G1 X9.98933 Y34.41247
|
||||||
|
G0 Z1.
|
||||||
|
(RepRap Gen7 v1.4)
|
||||||
|
G0 Z1.
|
||||||
|
(R)
|
||||||
|
G0 X9.9753 Y6.9723
|
||||||
|
G1 Z-0.20 F60
|
||||||
|
G1 X11.4761 Y6.9723 F250
|
||||||
|
G1 X11.8514 Y6.5971
|
||||||
|
G1 X11.8514 Y5.8467
|
||||||
|
G1 X11.4761 Y5.4715
|
||||||
|
G1 X10.3505 Y5.4715
|
||||||
|
G1 X11.8514 Y3.9456
|
||||||
|
G0 Z1.
|
||||||
|
G0 X10.3505 Y6.9723
|
||||||
|
G1 Z-0.20 F60
|
||||||
|
G1 X10.3505 Y3.9456 F250
|
||||||
|
G0 Z1.
|
||||||
|
(e)
|
||||||
|
G0 X12.7519 Y4.696
|
||||||
|
G1 Z-0.20 F60
|
||||||
|
G1 X14.2778 Y4.696 F250
|
||||||
|
G1 X14.2778 Y5.0962
|
||||||
|
G1 X13.9025 Y5.4715
|
||||||
|
G1 X13.1271 Y5.4715
|
||||||
|
G1 X12.7519 Y5.0962
|
||||||
|
G1 X12.7519 Y4.3208
|
||||||
|
G1 X13.1271 Y3.9456
|
||||||
|
G1 X14.2778 Y3.9456
|
||||||
|
G0 Z1.
|
||||||
|
(p)
|
||||||
|
G0 X15.5535 Y2.8199
|
||||||
|
G1 Z-0.20 F60
|
||||||
|
G1 X15.5535 Y5.0962 F250
|
||||||
|
G1 X15.1783 Y5.4715
|
||||||
|
G1 X15.5535 Y5.0962
|
||||||
|
G1 X15.9287 Y5.4715
|
||||||
|
G1 X16.6792 Y5.4715
|
||||||
|
G1 X17.0544 Y5.0962
|
||||||
|
G1 X17.0544 Y4.3208
|
||||||
|
G1 X16.6792 Y3.9456
|
||||||
|
G1 X15.9287 Y3.9456
|
||||||
|
G1 X15.5535 Y4.3208
|
||||||
|
G0 Z1.
|
||||||
|
G4
|
||||||
|
M104 S0
|
||||||
|
(tool change position)
|
||||||
|
G1 X2. Y2. Z40. F400
|
||||||
|
M2
|
Loading…
Reference in New Issue