#!/usr/bin/python import cherrypy, pronterface, re, ConfigParser, threading, sys import os.path users = {} def PrintHeader(): return '\n\nPronterface-Web\n\n\n\n' def PrintMenu(): return '' def PrintFooter(): return "" def ReloadPage(action): return ""+action+"" def TReloadPage(action): return action def clear_text(mypass): return mypass gPronterPtr = 0 gWeblog = "" gLogRefresh =5 class SettingsPage(object): def __init__(self): self.name="
Pronterface Settings
" def index(self): pageText=PrintHeader()+self.name+PrintMenu() pageText=pageText+"
\n" pageText=pageText+"\n \n" pageText=pageText+" \n \n" pageText=pageText+" \n \n" pageText=pageText+" \n \n" pageText=pageText+" \n \n" pageText=pageText+" \n " pageText=pageText+PrintFooter() return pageText index.exposed = True class LogPage(object): def __init__(self): self.name="
Pronterface Console
" def index(self): pageText="" pageText+="
" pageText+=gPronterPtr.status.GetStatusText() pageText+="
" pageText=pageText+"
"+gWeblog+"
" pageText=pageText+"" return pageText index.exposed = True class ConsolePage(object): def __init__(self): self.name="
Pronterface Settings
" def index(self): pageText=PrintHeader()+self.name+PrintMenu() pageText+="
" pageText+=PrintFooter() return pageText index.exposed = True class ConnectButton(object): def index(self): #handle connect push, then reload page gPronterPtr.connect(0) return ReloadPage("Connect...") index.exposed = True index._cp_config = {'tools.basic_auth.on': True, 'tools.basic_auth.realm': 'My Print Server', 'tools.basic_auth.users': users, 'tools.basic_auth.encrypt': clear_text} class DisconnectButton(object): def index(self): #handle connect push, then reload page gPronterPtr.disconnect(0) return ReloadPage("Disconnect...") index.exposed = True index._cp_config = {'tools.basic_auth.on': True, 'tools.basic_auth.realm': 'My Print Server', 'tools.basic_auth.users': users, 'tools.basic_auth.encrypt': clear_text} class ResetButton(object): def index(self): #handle connect push, then reload page gPronterPtr.reset(0) return ReloadPage("Reset...") index.exposed = True index._cp_config = {'tools.basic_auth.on': True, 'tools.basic_auth.realm': 'My Print Server', 'tools.basic_auth.users': users, 'tools.basic_auth.encrypt': clear_text} class PrintButton(object): def index(self): #handle connect push, then reload page gPronterPtr.printfile(0) return ReloadPage("Print...") index.exposed = True index._cp_config = {'tools.basic_auth.on': True, 'tools.basic_auth.realm': 'My Print Server', 'tools.basic_auth.users': users, 'tools.basic_auth.encrypt': clear_text} class PauseButton(object): def index(self): #handle connect push, then reload page gPronterPtr.pause(0) return ReloadPage("Pause...") index.exposed = True index._cp_config = {'tools.basic_auth.on': True, 'tools.basic_auth.realm': 'My Print Server', 'tools.basic_auth.users': users, 'tools.basic_auth.encrypt': clear_text} class MoveButton(object): def axis(self, *args): if not args: raise cherrypy.HTTPError(400, "No Move Command Provided!") margs=list(args) axis = margs.pop(0) if(margs and axis == "x"): distance = margs.pop(0) gPronterPtr.onecmd('move X %s' % distance) return ReloadPage("Moving X Axis " + str(distance)) if(margs and axis == "y"): distance = margs.pop(0) gPronterPtr.onecmd('move Y %s' % distance) return ReloadPage("Moving Y Axis " + str(distance)) if(margs and axis == "z"): distance = margs.pop(0) gPronterPtr.onecmd('move Z %s' % distance) return ReloadPage("Moving Z Axis " + str(distance)) raise cherrypy.HTTPError(400, "Unmached Move Command!") axis.exposed = True axis._cp_config = {'tools.basic_auth.on': True, 'tools.basic_auth.realm': 'My Print Server', 'tools.basic_auth.users': users, 'tools.basic_auth.encrypt': clear_text} class CustomButton(object): def button(self, *args): if not args: raise cherrypy.HTTPError(400, "No Custom Command Provided!") margs=list(args) command = margs.pop(0) if(command): gPronterPtr.onecmd(command) return ReloadPage(str(command)) button.exposed = True button._cp_config = {'tools.basic_auth.on': True, 'tools.basic_auth.realm': 'My Print Server', 'tools.basic_auth.users': users, 'tools.basic_auth.encrypt': clear_text} class HomeButton(object): def axis(self, *args): if not args: raise cherrypy.HTTPError(400, "No Axis Provided!") margs=list(args) taxis = margs.pop(0) if(taxis == "x"): gPronterPtr.onecmd('home X') return ReloadPage("Home X") if(taxis == "y"): gPronterPtr.onecmd('home Y') return ReloadPage("Home Y") if(taxis == "z"): gPronterPtr.onecmd('home Z') return ReloadPage("Home Z") if(taxis == "all"): gPronterPtr.onecmd('home') return ReloadPage("Home All") axis.exposed = True axis._cp_config = {'tools.basic_auth.on': True, 'tools.basic_auth.realm': 'My Print Server', 'tools.basic_auth.users': users, 'tools.basic_auth.encrypt': clear_text} class XMLstatus(object): def index(self): #handle connect push, then reload page txt='\n\n' state="Offline" if gPronterPtr.statuscheck or gPronterPtr.p.online: state="Idle" if gPronterPtr.sdprinting: state="SDPrinting" if gPronterPtr.p.printing: state="Printing" if gPronterPtr.paused: state="Paused" txt=txt+''+state+'\n' txt=txt+''+str(gPronterPtr.filename)+'\n' txt=txt+''+str(gPronterPtr.status.GetStatusText())+'\n' try: temp = str(float(filter(lambda x:x.startswith("T:"),gPronterPtr.tempreport.split())[0].split(":")[1])) txt=txt+''+temp+'\n' except: txt=txt+'NA\n' pass try: temp = str(float(filter(lambda x:x.startswith("B:"),gPronterPtr.tempreport.split())[0].split(":")[1])) txt=txt+''+temp+'\n' except: txt=txt+'NA\n' pass if gPronterPtr.sdprinting: fractioncomplete = float(gPronterPtr.percentdone/100.0) txt+= _("%04.2f") % (gPronterPtr.percentdone,) txt+="\n" elif gPronterPtr.p.printing: fractioncomplete = float(gPronterPtr.p.queueindex)/len(gPronterPtr.p.mainqueue) txt+= _("%04.2f") % (100*float(gPronterPtr.p.queueindex)/len(gPronterPtr.p.mainqueue),) txt+="\n" else: txt+="NA\n" txt+='' return txt index.exposed = True class WebInterface(object): def __init__(self, pface): if (sys.version_info[1] > 6): # 'allow_no_value' wasn't added until 2.7 config = ConfigParser.SafeConfigParser(allow_no_value=True) else: config = ConfigParser.SafeConfigParser() config.read('auth.config') users[config.get("user", "user")] = config.get("user", "pass") self.pface = pface global gPronterPtr global gWeblog self.name="
Pronterface Web-Interface
" gWeblog = "" gPronterPtr = self.pface settings = SettingsPage() logpage = LogPage() console = ConsolePage() #actions connect = ConnectButton() disconnect = DisconnectButton() reset = ResetButton() printbutton = PrintButton() pausebutton = PrintButton() status = XMLstatus() home = HomeButton() move = MoveButton() custom =CustomButton() def index(self): pageText=PrintHeader()+self.name+PrintMenu() pageText+="
\n" pageText+="
\n" pageText+="
  • Connect
  • \n" pageText+="
  • Disconnect
  • \n" pageText+="
  • Reset
  • \n" pageText+="
  • Print
  • \n" pageText+="
  • Pause
  • \n" for i in gPronterPtr.cpbuttons: pageText+="
  • "+i[0]+"
  • \n" #for i in gPronterPtr.custombuttons: # print(str(i)); pageText+="
\n" pageText+="
\n" pageText+="
\n" pageText+="
" pageText+="" pageText+='' pageText+='X Home' pageText+='Y Home' pageText+='All Home' pageText+='Z Home' pageText+='Y 100' pageText+='Y 10' pageText+='Y 1' pageText+='Y .1' pageText+='Y -.1' pageText+='Y -1' pageText+='Y -10' pageText+='Y -100' pageText+='X -100' pageText+='X 100' pageText+='X -10' pageText+='X 10' pageText+='X -1' pageText+='X 1' pageText+='X -.1' pageText+='X .1' pageText+="" pageText+="
\n" #endxy pageText+="
" pageText+="" pageText+='' pageText+='Z 10' pageText+='Z 1' pageText+='Z .1' pageText+='Z -.1' pageText+='Z -1' pageText+='Z -10' pageText+="" #TODO Map Z Moves pageText+="
\n" #endz pageText+="
\n" #endgui pageText+="
\n" #endcontent pageText+="
\n" # Temp Control TBD # pageText+="
" # pageText+="
" # pageText+="" # pageText+="
" # pageText+="
" # pageText+="" # pageText+="
" # pageText+="
" pageText=pageText+"
File Loaded: "+str(gPronterPtr.filename)+"
" pageText+="
" pageText+=PrintFooter() return pageText def AddLog(self, log): global gWeblog gWeblog=gWeblog+"
"+log def AppendLog(self, log): global gWeblog gWeblog=re.sub("\n", "
", gWeblog)+log index.exposed = True class WebInterfaceStub(object): def index(self): return "Web Interface Must be launched by running Pronterface!" index.exposed = True def KillWebInterfaceThread(): cherrypy.engine.exit() def StartWebInterfaceThread(webInterface): current_dir = os.path.dirname(os.path.abspath(__file__)) cherrypy.config.update({'engine.autoreload_on':False}) cherrypy.config.update("http.config") conf = {'/css/style.css': {'tools.staticfile.on': True, 'tools.staticfile.filename': os.path.join(current_dir, 'css/style.css'), }, '/images/control_xy.png': {'tools.staticfile.on': True, 'tools.staticfile.filename': os.path.join(current_dir, 'images/control_xy.png'), }, '/images/control_z.png': {'tools.staticfile.on': True, 'tools.staticfile.filename': os.path.join(current_dir, 'images/control_z.png'), }} cherrypy.config.update("http.config") cherrypy.quickstart(webInterface, '/', config=conf) if __name__ == '__main__': cherrypy.config.update("http.config") cherrypy.quickstart(WebInterfaceStub())
settingvalue
Build Dimenstions"+str(gPronterPtr.settings.build_dimensions)+"
Last Bed Temp"+str(gPronterPtr.settings.last_bed_temperature)+"
Last File Path"+gPronterPtr.settings.last_file_path+"
Last Temperature"+str(gPronterPtr.settings.last_temperature)+"
Preview Extrusion Width"+str(gPronterPtr.settings.preview_extrusion_width)+"
Filename"+str(gPronterPtr.filename)+"