From 51ae782f02ec382d13a37a9ec20d1826ae38d055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Sun, 15 Sep 2013 21:45:31 +0200 Subject: [PATCH] Moved octoprint sources to "src" folder, adjusted setup.py and run script accordingly --- MANIFEST.in | 4 +- octoprint/__init__.py | 1 - requirements-bbb.txt | 2 + requirements.txt | 1 - run | 75 +- octoprint.init => scripts/octoprint.init | 0 setup.py | 16 +- src/octoprint/__init__.py | 66 ++ {octoprint => src/octoprint}/daemon.py | 0 {octoprint => src/octoprint}/events.py | 0 .../octoprint}/filemanager/__init__.py | 0 .../octoprint}/filemanager/destinations.py | 0 .../octoprint}/filemanager/types.py | 0 {octoprint => src/octoprint}/gcodefiles.py | 0 {octoprint => src/octoprint}/printer.py | 0 {octoprint => src/octoprint}/server.py | 0 {octoprint => src/octoprint}/settings.py | 0 .../octoprint}/slicers/__init__.py | 0 .../octoprint}/slicers/cura/__init__.py | 0 .../slicers/cura/tests/test_cura.py | 0 .../octoprint}/static/css/bootstrap-modal.css | 0 .../static/css/bootstrap-responsive.css | 0 .../static/css/bootstrap-responsive.min.css | 0 .../octoprint}/static/css/bootstrap.css | 0 .../octoprint}/static/css/bootstrap.min.css | 0 .../static/css/font-awesome.min.css | 0 .../static/css/jquery.fileupload-ui.css | 0 .../static/css/jquery.pnotify.default.css | 0 .../octoprint}/static/css/octoprint.less | 0 .../octoprint}/static/font/FontAwesome.otf | Bin .../static/font/fontawesome-webfont.eot | Bin .../static/font/fontawesome-webfont.svg | 0 .../static/font/fontawesome-webfont.ttf | Bin .../static/font/fontawesome-webfont.woff | Bin .../css/cupertino/images/background.jpg | Bin .../ui-bg_diagonals-thick_90_eeeeee_40x40.png | Bin .../images/ui-bg_flat_15_cd0a0a_40x100.png | Bin .../images/ui-bg_glass_100_e4f1fb_1x400.png | Bin .../images/ui-bg_glass_50_3baae3_1x400.png | Bin .../images/ui-bg_glass_80_d7ebf9_1x400.png | Bin .../ui-bg_highlight-hard_100_f2f5f7_1x100.png | Bin .../ui-bg_highlight-hard_70_000000_1x100.png | Bin .../ui-bg_highlight-soft_100_deedf7_1x100.png | Bin .../ui-bg_highlight-soft_25_ffef8f_1x100.png | Bin .../images/ui-icons_2694e8_256x240.png | Bin .../images/ui-icons_2e83ff_256x240.png | Bin .../images/ui-icons_3d80b3_256x240.png | Bin .../images/ui-icons_72a7cf_256x240.png | Bin .../images/ui-icons_ffffff_256x240.png | Bin .../css/cupertino/images/uiTabsArrow.png | Bin .../css/cupertino/jquery-ui-1.9.0.custom.css | 0 .../cupertino/jquery-ui-1.9.0.custom.min.css | 0 .../static/gcodeviewer/css/style.css | 322 +++--- .../static/gcodeviewer/js/Worker.js | 946 +++++++++--------- .../static/gcodeviewer/js/gCodeReader.js | 414 ++++---- .../static/gcodeviewer/js/renderer.js | 834 +++++++-------- .../static/gcodeviewer/js/renderer3d.js | 0 .../octoprint}/static/gcodeviewer/js/ui.js | 688 ++++++------- .../gcodeviewer/lib/TrackballControls.js | 0 .../static/gcodeviewer/lib/codemirror.css | 0 .../static/gcodeviewer/lib/codemirror.js | 0 .../gcodeviewer/lib/mode_gcode/gcode_mode.js | 0 .../static/gcodeviewer/lib/three.js | 0 .../static/gcodeviewer/lib/three.min.js | 0 .../static/img/apple-touch-icon-114x114.png | Bin .../static/img/apple-touch-icon-144x144.png | Bin .../static/img/glyphicons-halflings-white.png | Bin .../static/img/glyphicons-halflings.png | Bin .../static/img/graph-background.png | Bin .../static/img/icon-sd-black-14.png | Bin .../octoprint}/static/img/logo.png | Bin .../static/img/tentacle-20x20-light.png | Bin .../static/img/tentacle-20x20-light@2x.png | Bin .../octoprint}/static/img/tentacle-20x20.png | Bin .../static/img/tentacle-20x20@2x.png | Bin .../octoprint}/static/img/tentacle-22x22.png | Bin .../octoprint}/static/img/tentacle-32x32.png | Bin .../octoprint}/static/img/tentacle-76x76.png | Bin .../octoprint}/static/img/watermark.png | Bin .../octoprint}/static/js/app/dataupdater.js | 0 .../octoprint}/static/js/app/helpers.js | 0 .../octoprint}/static/js/app/main.js | 0 .../static/js/app/viewmodels/appearance.js | 0 .../static/js/app/viewmodels/connection.js | 0 .../static/js/app/viewmodels/control.js | 0 .../static/js/app/viewmodels/firstrun.js | 0 .../static/js/app/viewmodels/gcode.js | 0 .../static/js/app/viewmodels/gcodefiles.js | 0 .../static/js/app/viewmodels/loginstate.js | 0 .../static/js/app/viewmodels/navigation.js | 0 .../static/js/app/viewmodels/printerstate.js | 0 .../static/js/app/viewmodels/settings.js | 0 .../static/js/app/viewmodels/temperature.js | 0 .../static/js/app/viewmodels/terminal.js | 0 .../static/js/app/viewmodels/timelapse.js | 0 .../static/js/app/viewmodels/users.js | 0 .../octoprint}/static/js/lib/avltree.js | 0 .../js/lib/bootstrap/bootstrap-modal.js | 0 .../lib/bootstrap/bootstrap-modalmanager.js | 0 .../static/js/lib/bootstrap/bootstrap.js | 0 .../static/js/lib/bootstrap/bootstrap.min.js | 0 .../static/js/lib/jquery/jquery.fileupload.js | 0 .../static/js/lib/jquery/jquery.flot.js | 0 .../js/lib/jquery/jquery.iframe-transport.js | 0 .../static/js/lib/jquery/jquery.min.js | 0 .../js/lib/jquery/jquery.pnotify.min.js | 0 .../static/js/lib/jquery/jquery.ui.core.js | 0 .../static/js/lib/jquery/jquery.ui.mouse.js | 0 .../static/js/lib/jquery/jquery.ui.slider.js | 0 .../static/js/lib/jquery/jquery.ui.widget.js | 0 .../octoprint}/static/js/lib/knockout.js | 0 .../static/js/lib/less-1.3.3.min.js | 0 .../static/js/lib/modernizr.custom.js | 0 .../static/js/lib/sockjs-0.3.4.min.js | 0 .../octoprint}/static/js/lib/underscore.js | 0 .../octoprint}/static/robots.txt | 0 .../octoprint}/templates/dialogs.jinja2 | 0 .../octoprint}/templates/index.jinja2 | 0 .../octoprint}/templates/settings.jinja2 | 0 .../octoprint}/tests/__init__.py | 0 .../octoprint}/tests/test_file_manager.py | 0 {octoprint => src/octoprint}/timelapse.py | 0 {octoprint => src/octoprint}/users.py | 0 {octoprint => src/octoprint}/util/README | 0 {octoprint => src/octoprint}/util/__init__.py | 0 .../octoprint}/util/avr_isp/__init__.py | 0 .../octoprint}/util/avr_isp/chipDB.py | 0 .../octoprint}/util/avr_isp/intelHex.py | 0 .../octoprint}/util/avr_isp/ispBase.py | 0 .../octoprint}/util/avr_isp/stk500v2.py | 0 {octoprint => src/octoprint}/util/comm.py | 0 .../octoprint}/util/gcodeInterpreter.py | 0 {octoprint => src/octoprint}/util/virtual.py | 0 133 files changed, 1699 insertions(+), 1670 deletions(-) delete mode 100644 octoprint/__init__.py rename octoprint.init => scripts/octoprint.init (100%) mode change 100755 => 100644 create mode 100644 src/octoprint/__init__.py rename {octoprint => src/octoprint}/daemon.py (100%) rename {octoprint => src/octoprint}/events.py (100%) rename {octoprint => src/octoprint}/filemanager/__init__.py (100%) rename {octoprint => src/octoprint}/filemanager/destinations.py (100%) rename {octoprint => src/octoprint}/filemanager/types.py (100%) rename {octoprint => src/octoprint}/gcodefiles.py (100%) rename {octoprint => src/octoprint}/printer.py (100%) rename {octoprint => src/octoprint}/server.py (100%) rename {octoprint => src/octoprint}/settings.py (100%) rename {octoprint => src/octoprint}/slicers/__init__.py (100%) rename {octoprint => src/octoprint}/slicers/cura/__init__.py (100%) rename {octoprint => src/octoprint}/slicers/cura/tests/test_cura.py (100%) rename {octoprint => src/octoprint}/static/css/bootstrap-modal.css (100%) rename {octoprint => src/octoprint}/static/css/bootstrap-responsive.css (100%) rename {octoprint => src/octoprint}/static/css/bootstrap-responsive.min.css (100%) rename {octoprint => src/octoprint}/static/css/bootstrap.css (100%) rename {octoprint => src/octoprint}/static/css/bootstrap.min.css (100%) rename {octoprint => src/octoprint}/static/css/font-awesome.min.css (100%) rename {octoprint => src/octoprint}/static/css/jquery.fileupload-ui.css (100%) rename {octoprint => src/octoprint}/static/css/jquery.pnotify.default.css (100%) rename {octoprint => src/octoprint}/static/css/octoprint.less (100%) rename {octoprint => src/octoprint}/static/font/FontAwesome.otf (100%) rename {octoprint => src/octoprint}/static/font/fontawesome-webfont.eot (100%) rename {octoprint => src/octoprint}/static/font/fontawesome-webfont.svg (100%) rename {octoprint => src/octoprint}/static/font/fontawesome-webfont.ttf (100%) rename {octoprint => src/octoprint}/static/font/fontawesome-webfont.woff (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/background.jpg (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/ui-bg_flat_15_cd0a0a_40x100.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/ui-bg_glass_100_e4f1fb_1x400.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/ui-bg_glass_50_3baae3_1x400.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/ui-bg_glass_80_d7ebf9_1x400.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-hard_70_000000_1x100.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-soft_100_deedf7_1x100.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-soft_25_ffef8f_1x100.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/ui-icons_2694e8_256x240.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/ui-icons_2e83ff_256x240.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/ui-icons_3d80b3_256x240.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/ui-icons_72a7cf_256x240.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/ui-icons_ffffff_256x240.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/images/uiTabsArrow.png (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/jquery-ui-1.9.0.custom.css (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/cupertino/jquery-ui-1.9.0.custom.min.css (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/css/style.css (94%) rename {octoprint => src/octoprint}/static/gcodeviewer/js/Worker.js (97%) rename {octoprint => src/octoprint}/static/gcodeviewer/js/gCodeReader.js (96%) rename {octoprint => src/octoprint}/static/gcodeviewer/js/renderer.js (97%) rename {octoprint => src/octoprint}/static/gcodeviewer/js/renderer3d.js (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/js/ui.js (97%) rename {octoprint => src/octoprint}/static/gcodeviewer/lib/TrackballControls.js (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/lib/codemirror.css (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/lib/codemirror.js (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/lib/mode_gcode/gcode_mode.js (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/lib/three.js (100%) rename {octoprint => src/octoprint}/static/gcodeviewer/lib/three.min.js (100%) rename {octoprint => src/octoprint}/static/img/apple-touch-icon-114x114.png (100%) rename {octoprint => src/octoprint}/static/img/apple-touch-icon-144x144.png (100%) rename {octoprint => src/octoprint}/static/img/glyphicons-halflings-white.png (100%) rename {octoprint => src/octoprint}/static/img/glyphicons-halflings.png (100%) rename {octoprint => src/octoprint}/static/img/graph-background.png (100%) rename {octoprint => src/octoprint}/static/img/icon-sd-black-14.png (100%) rename {octoprint => src/octoprint}/static/img/logo.png (100%) rename {octoprint => src/octoprint}/static/img/tentacle-20x20-light.png (100%) rename {octoprint => src/octoprint}/static/img/tentacle-20x20-light@2x.png (100%) rename {octoprint => src/octoprint}/static/img/tentacle-20x20.png (100%) rename {octoprint => src/octoprint}/static/img/tentacle-20x20@2x.png (100%) rename {octoprint => src/octoprint}/static/img/tentacle-22x22.png (100%) rename {octoprint => src/octoprint}/static/img/tentacle-32x32.png (100%) rename {octoprint => src/octoprint}/static/img/tentacle-76x76.png (100%) rename {octoprint => src/octoprint}/static/img/watermark.png (100%) rename {octoprint => src/octoprint}/static/js/app/dataupdater.js (100%) rename {octoprint => src/octoprint}/static/js/app/helpers.js (100%) rename {octoprint => src/octoprint}/static/js/app/main.js (100%) rename {octoprint => src/octoprint}/static/js/app/viewmodels/appearance.js (100%) rename {octoprint => src/octoprint}/static/js/app/viewmodels/connection.js (100%) rename {octoprint => src/octoprint}/static/js/app/viewmodels/control.js (100%) rename {octoprint => src/octoprint}/static/js/app/viewmodels/firstrun.js (100%) rename {octoprint => src/octoprint}/static/js/app/viewmodels/gcode.js (100%) rename {octoprint => src/octoprint}/static/js/app/viewmodels/gcodefiles.js (100%) rename {octoprint => src/octoprint}/static/js/app/viewmodels/loginstate.js (100%) rename {octoprint => src/octoprint}/static/js/app/viewmodels/navigation.js (100%) rename {octoprint => src/octoprint}/static/js/app/viewmodels/printerstate.js (100%) rename {octoprint => src/octoprint}/static/js/app/viewmodels/settings.js (100%) rename {octoprint => src/octoprint}/static/js/app/viewmodels/temperature.js (100%) rename {octoprint => src/octoprint}/static/js/app/viewmodels/terminal.js (100%) rename {octoprint => src/octoprint}/static/js/app/viewmodels/timelapse.js (100%) rename {octoprint => src/octoprint}/static/js/app/viewmodels/users.js (100%) rename {octoprint => src/octoprint}/static/js/lib/avltree.js (100%) rename {octoprint => src/octoprint}/static/js/lib/bootstrap/bootstrap-modal.js (100%) rename {octoprint => src/octoprint}/static/js/lib/bootstrap/bootstrap-modalmanager.js (100%) rename {octoprint => src/octoprint}/static/js/lib/bootstrap/bootstrap.js (100%) rename {octoprint => src/octoprint}/static/js/lib/bootstrap/bootstrap.min.js (100%) rename {octoprint => src/octoprint}/static/js/lib/jquery/jquery.fileupload.js (100%) rename {octoprint => src/octoprint}/static/js/lib/jquery/jquery.flot.js (100%) rename {octoprint => src/octoprint}/static/js/lib/jquery/jquery.iframe-transport.js (100%) rename {octoprint => src/octoprint}/static/js/lib/jquery/jquery.min.js (100%) rename {octoprint => src/octoprint}/static/js/lib/jquery/jquery.pnotify.min.js (100%) rename {octoprint => src/octoprint}/static/js/lib/jquery/jquery.ui.core.js (100%) rename {octoprint => src/octoprint}/static/js/lib/jquery/jquery.ui.mouse.js (100%) rename {octoprint => src/octoprint}/static/js/lib/jquery/jquery.ui.slider.js (100%) rename {octoprint => src/octoprint}/static/js/lib/jquery/jquery.ui.widget.js (100%) rename {octoprint => src/octoprint}/static/js/lib/knockout.js (100%) rename {octoprint => src/octoprint}/static/js/lib/less-1.3.3.min.js (100%) rename {octoprint => src/octoprint}/static/js/lib/modernizr.custom.js (100%) rename {octoprint => src/octoprint}/static/js/lib/sockjs-0.3.4.min.js (100%) rename {octoprint => src/octoprint}/static/js/lib/underscore.js (100%) rename {octoprint => src/octoprint}/static/robots.txt (100%) rename {octoprint => src/octoprint}/templates/dialogs.jinja2 (100%) rename {octoprint => src/octoprint}/templates/index.jinja2 (100%) rename {octoprint => src/octoprint}/templates/settings.jinja2 (100%) rename {octoprint => src/octoprint}/tests/__init__.py (100%) rename {octoprint => src/octoprint}/tests/test_file_manager.py (100%) rename {octoprint => src/octoprint}/timelapse.py (100%) rename {octoprint => src/octoprint}/users.py (100%) rename {octoprint => src/octoprint}/util/README (100%) rename {octoprint => src/octoprint}/util/__init__.py (100%) rename {octoprint => src/octoprint}/util/avr_isp/__init__.py (100%) rename {octoprint => src/octoprint}/util/avr_isp/chipDB.py (100%) rename {octoprint => src/octoprint}/util/avr_isp/intelHex.py (100%) rename {octoprint => src/octoprint}/util/avr_isp/ispBase.py (100%) rename {octoprint => src/octoprint}/util/avr_isp/stk500v2.py (100%) rename {octoprint => src/octoprint}/util/comm.py (100%) rename {octoprint => src/octoprint}/util/gcodeInterpreter.py (100%) rename {octoprint => src/octoprint}/util/virtual.py (100%) diff --git a/MANIFEST.in b/MANIFEST.in index 34aec812..d47da275 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1,2 @@ -recursive-include octoprint/static * -recursive-include octoprint/templates * +recursive-include src/octoprint/static * +recursive-include src/octoprint/templates * diff --git a/octoprint/__init__.py b/octoprint/__init__.py deleted file mode 100644 index 8b137891..00000000 --- a/octoprint/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/requirements-bbb.txt b/requirements-bbb.txt index aa093093..d456d12f 100644 --- a/requirements-bbb.txt +++ b/requirements-bbb.txt @@ -6,3 +6,5 @@ PyYAML==3.10 Flask-Login==0.2.2 Flask-Principal==0.3.5 netaddr>=0.7.10 +mock>=1.0.1 +nose>=1.3.0 diff --git a/requirements.txt b/requirements.txt index 56bc9e0a..01c0e9aa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,6 @@ sockjs-tornado>=1.0.0 PyYAML==3.10 Flask-Login==0.2.2 Flask-Principal==0.3.5 -numpy>=1.6.2 pyserial>=2.6 netaddr>=0.7.10 mock>=1.0.1 diff --git a/run b/run index ca1ec2f1..ec6c02ea 100755 --- a/run +++ b/run @@ -1,65 +1,16 @@ #!/usr/bin/env python + +print """ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!! You are using an old startup method for OctoPrint. !!! +!!! Please perform 'sudo python setup.py install' and !!! +!!! use the 'octoprint' executable instead. !!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +""" + import sys -from octoprint.daemon import Daemon -from octoprint.server import Server +sys.path.append("src") -class Main(Daemon): - def __init__(self, pidfile, configfile, basedir, host, port, debug): - Daemon.__init__(self, pidfile) - - self._configfile = configfile - self._basedir = basedir - self._host = host - self._port = port - self._debug = debug - - def run(self): - octoprint = Server(self._configfile, self._basedir, self._host, self._port, self._debug) - octoprint.run() - -def main(): - import argparse - - parser = argparse.ArgumentParser(prog="run") - - parser.add_argument("-d", "--debug", action="store_true", dest="debug", - help="Enable debug mode") - - parser.add_argument("--host", action="store", type=str, dest="host", - help="Specify the host on which to bind the server") - parser.add_argument("--port", action="store", type=int, dest="port", - help="Specify the port on which to bind the server") - - parser.add_argument("-c", "--config", action="store", dest="config", - help="Specify the config file to use. OctoPrint needs to have write access for the settings dialog to work. Defaults to ~/.octoprint/config.yaml") - parser.add_argument("-b", "--basedir", action="store", dest="basedir", - help="Specify the basedir to use for uploads, timelapses etc. OctoPrint needs to have write access. Defaults to ~/.octoprint") - - parser.add_argument("--daemon", action="store", type=str, choices=["start", "stop", "restart"], - help="Daemonize/control daemonized OctoPrint instance (only supported under Linux right now)") - parser.add_argument("--pid", action="store", type=str, dest="pidfile", default="/tmp/octoprint.pid", - help="Pidfile to use for daemonizing, defaults to /tmp/octoprint.pid") - - parser.add_argument("--iknowwhatimdoing", action="store_true", dest="allowRoot", - help="Allow OctoPrint to run as user root") - - args = parser.parse_args() - - if args.daemon: - if sys.platform == "darwin" or sys.platform == "win32": - print >> sys.stderr, "Sorry, daemon mode is only supported under Linux right now" - sys.exit(2) - - daemon = Main(args.pidfile, args.config, args.basedir, args.host, args.port, args.debug) - if "start" == args.daemon: - daemon.start() - elif "stop" == args.daemon: - daemon.stop() - elif "restart" == args.daemon: - daemon.restart() - else: - octoprint = Server(args.config, args.basedir, args.host, args.port, args.debug, args.allowRoot) - octoprint.run() - -if __name__ == "__main__": - main() +import octoprint +octoprint.main() diff --git a/octoprint.init b/scripts/octoprint.init old mode 100755 new mode 100644 similarity index 100% rename from octoprint.init rename to scripts/octoprint.init diff --git a/setup.py b/setup.py index 8d2bc6cc..4d95aca2 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup, find_packages -VERSION = "0.1.0" +VERSION = "1.1.0-dev" def params(): name = "OctoPrint" @@ -34,11 +34,23 @@ def params(): url = "http://octoprint.org" license = "AGPLv3" - packages = find_packages() + packages = find_packages(where="src") + package_dir = {"octoprint": "src/octoprint"} + include_package_data = True zip_safe = False install_requires = open("requirements.txt").read().split("\n") + entry_points = { + "console_scripts": [ + "octoprint = octoprint:main" + ] + } + + #scripts = { + # "scripts/octoprint.init": "/etc/init.d/octoprint" + #} + return locals() setup(**params()) diff --git a/src/octoprint/__init__.py b/src/octoprint/__init__.py new file mode 100644 index 00000000..1a7747fd --- /dev/null +++ b/src/octoprint/__init__.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +import sys +from octoprint.daemon import Daemon +from octoprint.server import Server + +class Main(Daemon): + def __init__(self, pidfile, configfile, basedir, host, port, debug): + Daemon.__init__(self, pidfile) + + self._configfile = configfile + self._basedir = basedir + self._host = host + self._port = port + self._debug = debug + + def run(self): + octoprint = Server(self._configfile, self._basedir, self._host, self._port, self._debug) + octoprint.run() + +def main(): + import argparse + + parser = argparse.ArgumentParser(prog="run") + + parser.add_argument("-d", "--debug", action="store_true", dest="debug", + help="Enable debug mode") + + parser.add_argument("--host", action="store", type=str, dest="host", + help="Specify the host on which to bind the server") + parser.add_argument("--port", action="store", type=int, dest="port", + help="Specify the port on which to bind the server") + + parser.add_argument("-c", "--config", action="store", dest="config", + help="Specify the config file to use. OctoPrint needs to have write access for the settings dialog to work. Defaults to ~/.octoprint/config.yaml") + parser.add_argument("-b", "--basedir", action="store", dest="basedir", + help="Specify the basedir to use for uploads, timelapses etc. OctoPrint needs to have write access. Defaults to ~/.octoprint") + + parser.add_argument("--daemon", action="store", type=str, choices=["start", "stop", "restart"], + help="Daemonize/control daemonized OctoPrint instance (only supported under Linux right now)") + parser.add_argument("--pid", action="store", type=str, dest="pidfile", default="/tmp/octoprint.pid", + help="Pidfile to use for daemonizing, defaults to /tmp/octoprint.pid") + + parser.add_argument("--iknowwhatimdoing", action="store_true", dest="allowRoot", + help="Allow OctoPrint to run as user root") + + args = parser.parse_args() + + if args.daemon: + if sys.platform == "darwin" or sys.platform == "win32": + print >> sys.stderr, "Sorry, daemon mode is only supported under Linux right now" + sys.exit(2) + + daemon = Main(args.pidfile, args.config, args.basedir, args.host, args.port, args.debug) + if "start" == args.daemon: + daemon.start() + elif "stop" == args.daemon: + daemon.stop() + elif "restart" == args.daemon: + daemon.restart() + else: + octoprint = Server(args.config, args.basedir, args.host, args.port, args.debug, args.allowRoot) + octoprint.run() + +if __name__ == "__main__": + main() + diff --git a/octoprint/daemon.py b/src/octoprint/daemon.py similarity index 100% rename from octoprint/daemon.py rename to src/octoprint/daemon.py diff --git a/octoprint/events.py b/src/octoprint/events.py similarity index 100% rename from octoprint/events.py rename to src/octoprint/events.py diff --git a/octoprint/filemanager/__init__.py b/src/octoprint/filemanager/__init__.py similarity index 100% rename from octoprint/filemanager/__init__.py rename to src/octoprint/filemanager/__init__.py diff --git a/octoprint/filemanager/destinations.py b/src/octoprint/filemanager/destinations.py similarity index 100% rename from octoprint/filemanager/destinations.py rename to src/octoprint/filemanager/destinations.py diff --git a/octoprint/filemanager/types.py b/src/octoprint/filemanager/types.py similarity index 100% rename from octoprint/filemanager/types.py rename to src/octoprint/filemanager/types.py diff --git a/octoprint/gcodefiles.py b/src/octoprint/gcodefiles.py similarity index 100% rename from octoprint/gcodefiles.py rename to src/octoprint/gcodefiles.py diff --git a/octoprint/printer.py b/src/octoprint/printer.py similarity index 100% rename from octoprint/printer.py rename to src/octoprint/printer.py diff --git a/octoprint/server.py b/src/octoprint/server.py similarity index 100% rename from octoprint/server.py rename to src/octoprint/server.py diff --git a/octoprint/settings.py b/src/octoprint/settings.py similarity index 100% rename from octoprint/settings.py rename to src/octoprint/settings.py diff --git a/octoprint/slicers/__init__.py b/src/octoprint/slicers/__init__.py similarity index 100% rename from octoprint/slicers/__init__.py rename to src/octoprint/slicers/__init__.py diff --git a/octoprint/slicers/cura/__init__.py b/src/octoprint/slicers/cura/__init__.py similarity index 100% rename from octoprint/slicers/cura/__init__.py rename to src/octoprint/slicers/cura/__init__.py diff --git a/octoprint/slicers/cura/tests/test_cura.py b/src/octoprint/slicers/cura/tests/test_cura.py similarity index 100% rename from octoprint/slicers/cura/tests/test_cura.py rename to src/octoprint/slicers/cura/tests/test_cura.py diff --git a/octoprint/static/css/bootstrap-modal.css b/src/octoprint/static/css/bootstrap-modal.css similarity index 100% rename from octoprint/static/css/bootstrap-modal.css rename to src/octoprint/static/css/bootstrap-modal.css diff --git a/octoprint/static/css/bootstrap-responsive.css b/src/octoprint/static/css/bootstrap-responsive.css similarity index 100% rename from octoprint/static/css/bootstrap-responsive.css rename to src/octoprint/static/css/bootstrap-responsive.css diff --git a/octoprint/static/css/bootstrap-responsive.min.css b/src/octoprint/static/css/bootstrap-responsive.min.css similarity index 100% rename from octoprint/static/css/bootstrap-responsive.min.css rename to src/octoprint/static/css/bootstrap-responsive.min.css diff --git a/octoprint/static/css/bootstrap.css b/src/octoprint/static/css/bootstrap.css similarity index 100% rename from octoprint/static/css/bootstrap.css rename to src/octoprint/static/css/bootstrap.css diff --git a/octoprint/static/css/bootstrap.min.css b/src/octoprint/static/css/bootstrap.min.css similarity index 100% rename from octoprint/static/css/bootstrap.min.css rename to src/octoprint/static/css/bootstrap.min.css diff --git a/octoprint/static/css/font-awesome.min.css b/src/octoprint/static/css/font-awesome.min.css similarity index 100% rename from octoprint/static/css/font-awesome.min.css rename to src/octoprint/static/css/font-awesome.min.css diff --git a/octoprint/static/css/jquery.fileupload-ui.css b/src/octoprint/static/css/jquery.fileupload-ui.css similarity index 100% rename from octoprint/static/css/jquery.fileupload-ui.css rename to src/octoprint/static/css/jquery.fileupload-ui.css diff --git a/octoprint/static/css/jquery.pnotify.default.css b/src/octoprint/static/css/jquery.pnotify.default.css similarity index 100% rename from octoprint/static/css/jquery.pnotify.default.css rename to src/octoprint/static/css/jquery.pnotify.default.css diff --git a/octoprint/static/css/octoprint.less b/src/octoprint/static/css/octoprint.less similarity index 100% rename from octoprint/static/css/octoprint.less rename to src/octoprint/static/css/octoprint.less diff --git a/octoprint/static/font/FontAwesome.otf b/src/octoprint/static/font/FontAwesome.otf similarity index 100% rename from octoprint/static/font/FontAwesome.otf rename to src/octoprint/static/font/FontAwesome.otf diff --git a/octoprint/static/font/fontawesome-webfont.eot b/src/octoprint/static/font/fontawesome-webfont.eot similarity index 100% rename from octoprint/static/font/fontawesome-webfont.eot rename to src/octoprint/static/font/fontawesome-webfont.eot diff --git a/octoprint/static/font/fontawesome-webfont.svg b/src/octoprint/static/font/fontawesome-webfont.svg similarity index 100% rename from octoprint/static/font/fontawesome-webfont.svg rename to src/octoprint/static/font/fontawesome-webfont.svg diff --git a/octoprint/static/font/fontawesome-webfont.ttf b/src/octoprint/static/font/fontawesome-webfont.ttf similarity index 100% rename from octoprint/static/font/fontawesome-webfont.ttf rename to src/octoprint/static/font/fontawesome-webfont.ttf diff --git a/octoprint/static/font/fontawesome-webfont.woff b/src/octoprint/static/font/fontawesome-webfont.woff similarity index 100% rename from octoprint/static/font/fontawesome-webfont.woff rename to src/octoprint/static/font/fontawesome-webfont.woff diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/background.jpg b/src/octoprint/static/gcodeviewer/css/cupertino/images/background.jpg similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/background.jpg rename to src/octoprint/static/gcodeviewer/css/cupertino/images/background.jpg diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_flat_15_cd0a0a_40x100.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_flat_15_cd0a0a_40x100.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_flat_15_cd0a0a_40x100.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_flat_15_cd0a0a_40x100.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_glass_100_e4f1fb_1x400.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_glass_100_e4f1fb_1x400.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_glass_100_e4f1fb_1x400.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_glass_100_e4f1fb_1x400.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_glass_50_3baae3_1x400.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_glass_50_3baae3_1x400.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_glass_50_3baae3_1x400.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_glass_50_3baae3_1x400.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_glass_80_d7ebf9_1x400.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_glass_80_d7ebf9_1x400.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_glass_80_d7ebf9_1x400.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_glass_80_d7ebf9_1x400.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-hard_70_000000_1x100.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-hard_70_000000_1x100.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-hard_70_000000_1x100.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-hard_70_000000_1x100.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-soft_100_deedf7_1x100.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-soft_100_deedf7_1x100.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-soft_100_deedf7_1x100.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-soft_100_deedf7_1x100.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-soft_25_ffef8f_1x100.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-soft_25_ffef8f_1x100.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-soft_25_ffef8f_1x100.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/ui-bg_highlight-soft_25_ffef8f_1x100.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_2694e8_256x240.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_2694e8_256x240.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_2694e8_256x240.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_2694e8_256x240.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_2e83ff_256x240.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_2e83ff_256x240.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_2e83ff_256x240.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_2e83ff_256x240.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_3d80b3_256x240.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_3d80b3_256x240.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_3d80b3_256x240.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_3d80b3_256x240.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_72a7cf_256x240.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_72a7cf_256x240.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_72a7cf_256x240.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_72a7cf_256x240.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_ffffff_256x240.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_ffffff_256x240.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_ffffff_256x240.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/ui-icons_ffffff_256x240.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/images/uiTabsArrow.png b/src/octoprint/static/gcodeviewer/css/cupertino/images/uiTabsArrow.png similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/images/uiTabsArrow.png rename to src/octoprint/static/gcodeviewer/css/cupertino/images/uiTabsArrow.png diff --git a/octoprint/static/gcodeviewer/css/cupertino/jquery-ui-1.9.0.custom.css b/src/octoprint/static/gcodeviewer/css/cupertino/jquery-ui-1.9.0.custom.css similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/jquery-ui-1.9.0.custom.css rename to src/octoprint/static/gcodeviewer/css/cupertino/jquery-ui-1.9.0.custom.css diff --git a/octoprint/static/gcodeviewer/css/cupertino/jquery-ui-1.9.0.custom.min.css b/src/octoprint/static/gcodeviewer/css/cupertino/jquery-ui-1.9.0.custom.min.css similarity index 100% rename from octoprint/static/gcodeviewer/css/cupertino/jquery-ui-1.9.0.custom.min.css rename to src/octoprint/static/gcodeviewer/css/cupertino/jquery-ui-1.9.0.custom.min.css diff --git a/octoprint/static/gcodeviewer/css/style.css b/src/octoprint/static/gcodeviewer/css/style.css similarity index 94% rename from octoprint/static/gcodeviewer/css/style.css rename to src/octoprint/static/gcodeviewer/css/style.css index d41a4f49..1df6f45e 100644 --- a/octoprint/static/gcodeviewer/css/style.css +++ b/src/octoprint/static/gcodeviewer/css/style.css @@ -1,161 +1,161 @@ -/*body,*/ -/*#wrap {*/ - /*width:1000px;*/ - /*height: 680px;*/ - /*position: absolute;*/ - /*top: 50%;*/ - /*margin-top: -350px;*/ - /*left: 50%;*/ - /*margin-left: -500px;*/ - /**/ - /*background:#ffffff;*/ - /*border: 5px outset #bbb;*/ - /*-moz-border-radius: 5px;*/ - /*-webkit-border-radius: 5px;*/ - /*border-radius: 5px;*/ -/*}*/ -/*#control {*/ - /*float:left;*/ - /*width:300px;*/ - /*margin-top: 10px;*/ - /*margin-left: 10px;*/ - /*background:#ffffff;*/ - /*margin-right: 10px;*/ - /*height: 680px;*/ -/*}*/ -#file_block { - /*margin-top: 20px;*/ - /*margin-left: 20px;*/ -} - -#control_bottom { - position: absolute; - bottom: 0; - width: 300px; - margin-bottom: 10px; -} -#options{ - float: left; - margin-left: 5px; - margin-bottom: 5px; -} -/*#gcode { - background: #ffffff; - float:right; - width: 680px; - height: 680px; - border-width: 2px; - border-style: none none none solid; -}*/ - -#canvas{ - /*float: left;*/ - clear:none; -} - -#drop_zone { - border: 2px dashed #bbb; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - padding: 40px; - margin: 5px; - text-align: center; - font: 20pt bold; - color: #bbb -} -#slider-vertical { - /*position: absolute;*/ - /*right: 0;*/ - /*top: 0;*/ - height: 580px; - width: 10px; - float: right; -} -#slider-horizontal { - height: 10px; - width: 570px; - /*position: absolute;*/ - /*bottom: 0;*/ -} - -#main_button_block { - /*float: right;*/ - margin-bottom: 5px; - margin-right: 5px; -} - -#gcode .mbut{ - height:60px; - width: 250px; - font-size: 1em; -} - -#tabs-min { - height: 680px; - padding: 0px; -} - -#gcode .mtab{ - background: transparent; - border: none; - font-weight: normal; - font-size: 0.5em; -} - -#gcode .mtab-defstate{ - background: transparent; - border: none; - -} - -#gcode .mtab-content{ - background: #ffffff; - background-image: none; - border: 0px none #dddddd; - border-bottom-style: none; - margin: 0px; -} - -#gcode .bar { - -webkit-transition: width 0s linear !important; - -moz-transition: width 0s linear !important; - -o-transition: width 0s linear !important; - transition: width 0s linear !important; -} - -#gcode .nav { - margin-bottom: 0px !important; -} - -#gcode .tab-content { - overflow: visible; -} - -#gcode .aboutpage { - margin: 10px; -} - -#accordion_top .ui-accordion-content{ - padding: 5px; -} - -#tabs-min .ui-tabs-panel { - padding: 0px; -} - -#progressBlock { - margin-left: 10px; - margin-right: 10px; - margin-bottom: 10px; -} - -#gcode .colorBox { - width: 50px; - height: 15px; - border: 1px solid #000000; - float:left; -} - -#gcode .activeline {background: #fff0b6 !important;} - +/*body,*/ +/*#wrap {*/ + /*width:1000px;*/ + /*height: 680px;*/ + /*position: absolute;*/ + /*top: 50%;*/ + /*margin-top: -350px;*/ + /*left: 50%;*/ + /*margin-left: -500px;*/ + /**/ + /*background:#ffffff;*/ + /*border: 5px outset #bbb;*/ + /*-moz-border-radius: 5px;*/ + /*-webkit-border-radius: 5px;*/ + /*border-radius: 5px;*/ +/*}*/ +/*#control {*/ + /*float:left;*/ + /*width:300px;*/ + /*margin-top: 10px;*/ + /*margin-left: 10px;*/ + /*background:#ffffff;*/ + /*margin-right: 10px;*/ + /*height: 680px;*/ +/*}*/ +#file_block { + /*margin-top: 20px;*/ + /*margin-left: 20px;*/ +} + +#control_bottom { + position: absolute; + bottom: 0; + width: 300px; + margin-bottom: 10px; +} +#options{ + float: left; + margin-left: 5px; + margin-bottom: 5px; +} +/*#gcode { + background: #ffffff; + float:right; + width: 680px; + height: 680px; + border-width: 2px; + border-style: none none none solid; +}*/ + +#canvas{ + /*float: left;*/ + clear:none; +} + +#drop_zone { + border: 2px dashed #bbb; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + padding: 40px; + margin: 5px; + text-align: center; + font: 20pt bold; + color: #bbb +} +#slider-vertical { + /*position: absolute;*/ + /*right: 0;*/ + /*top: 0;*/ + height: 580px; + width: 10px; + float: right; +} +#slider-horizontal { + height: 10px; + width: 570px; + /*position: absolute;*/ + /*bottom: 0;*/ +} + +#main_button_block { + /*float: right;*/ + margin-bottom: 5px; + margin-right: 5px; +} + +#gcode .mbut{ + height:60px; + width: 250px; + font-size: 1em; +} + +#tabs-min { + height: 680px; + padding: 0px; +} + +#gcode .mtab{ + background: transparent; + border: none; + font-weight: normal; + font-size: 0.5em; +} + +#gcode .mtab-defstate{ + background: transparent; + border: none; + +} + +#gcode .mtab-content{ + background: #ffffff; + background-image: none; + border: 0px none #dddddd; + border-bottom-style: none; + margin: 0px; +} + +#gcode .bar { + -webkit-transition: width 0s linear !important; + -moz-transition: width 0s linear !important; + -o-transition: width 0s linear !important; + transition: width 0s linear !important; +} + +#gcode .nav { + margin-bottom: 0px !important; +} + +#gcode .tab-content { + overflow: visible; +} + +#gcode .aboutpage { + margin: 10px; +} + +#accordion_top .ui-accordion-content{ + padding: 5px; +} + +#tabs-min .ui-tabs-panel { + padding: 0px; +} + +#progressBlock { + margin-left: 10px; + margin-right: 10px; + margin-bottom: 10px; +} + +#gcode .colorBox { + width: 50px; + height: 15px; + border: 1px solid #000000; + float:left; +} + +#gcode .activeline {background: #fff0b6 !important;} + diff --git a/octoprint/static/gcodeviewer/js/Worker.js b/src/octoprint/static/gcodeviewer/js/Worker.js similarity index 97% rename from octoprint/static/gcodeviewer/js/Worker.js rename to src/octoprint/static/gcodeviewer/js/Worker.js index feb4d953..e0aa50f5 100644 --- a/octoprint/static/gcodeviewer/js/Worker.js +++ b/src/octoprint/static/gcodeviewer/js/Worker.js @@ -1,473 +1,473 @@ -/** - * User: hudbrog (hudbrog@gmail.com) - * Date: 10/24/12 - * Time: 12:18 PM - */ - - var gcode; - var firstReport; - var z_heights = {}; - var model = []; - var gCodeOptions = { - sortLayers: false, - purgeEmptyLayers: true, - analyzeModel: false - }; - var max = {x: undefined, y: undefined, z: undefined}; - var min = {x: undefined, y: undefined, z: undefined}; - var modelSize = {x: undefined, y: undefined, z: undefined}; - var filamentByLayer = {}; - var totalFilament=0; - var printTime=0; - var printTimeByLayer = {}; - var layerHeight=0; - var layerCnt = 0; - var speeds = {extrude: [], retract: [], move: []}; - var speedsByLayer = {extrude: {}, retract: {}, move: {}}; - - - - var sendLayerToParent = function(layerNum, z, progress){ - self.postMessage({ - "cmd": "returnLayer", - "msg": { - cmds: model[layerNum], - layerNum: layerNum, - zHeightObject: {zValue: z, layer: z_heights[z]}, - isEmpty: false, - progress: progress - } - }); - }; - - var sendMultiLayerToParent = function(layerNum, z, progress){ - var tmpModel = []; - var tmpZHeight = {}; - - for(var i=0;iparseFloat(cmds[j].x)?parseFloat(max.x):parseFloat(cmds[j].x); - max.x = parseFloat(max.x)>parseFloat(cmds[j].prevX)?parseFloat(max.x):parseFloat(cmds[j].prevX); - min.x = parseFloat(min.x)parseFloat(cmds[j].y)?parseFloat(max.y):parseFloat(cmds[j].y); - max.y = parseFloat(max.y)>parseFloat(cmds[j].prevY)?parseFloat(max.y):parseFloat(cmds[j].prevY); - min.y = parseFloat(min.y)parseFloat(cmds[j].prevZ)?parseFloat(max.z):parseFloat(cmds[j].prevZ); - min.z = parseFloat(min.z)=tmp2?tmp1:tmp2; - }else if(cmds[j].retract!==0){ - printTimeAdd = Math.abs(parseFloat(cmds[j].extrusion)/(cmds[j].speed/60)); - } - - printTime += printTimeAdd; - if(typeof(printTimeByLayer[cmds[j].prevZ])==='undefined'){printTimeByLayer[cmds[j].prevZ]=0;} - printTimeByLayer[cmds[j].prevZ] += printTimeAdd; - - if(cmds[j].extrude&&cmds[j].retract===0){ - type = 'extrude'; - }else if(cmds[j].retract!==0){ - type = 'retract'; - }else if(!cmds[j].extrude&&cmds[j].retract===0){ - type = 'move'; - // if(cmds[j].prevZ == '17.1'){ - // self.postMessage({cmd: 'Got speed ' + cmds[j].speed + 'with line ' + cmds[j].gcodeLine}); - // } - }else { - self.postMessage({cmd: 'unknown type of move'}); - type = 'unknown'; - } - speedIndex = speeds[type].indexOf(cmds[j].speed); - if (speedIndex === -1) { - speeds[type].push(cmds[j].speed); - speedIndex = speeds[type].indexOf(cmds[j].speed); - } - if(typeof(speedsByLayer[type][cmds[j].prevZ]) === 'undefined'){ - speedsByLayer[type][cmds[j].prevZ] = []; - } - if(speedsByLayer[type][cmds[j].prevZ].indexOf(cmds[j].speed) === -1){ - speedsByLayer[type][cmds[j].prevZ][speedIndex] = cmds[j].speed; - } - - } - sendSizeProgress(i/model.length*100); - - } - purgeLayers(); - - modelSize.x = Math.abs(max.x - min.x); - modelSize.y = Math.abs(max.y - min.y); - modelSize.z = Math.abs(max.z - min.z); - layerHeight = (max.z-min.z)/(layerCnt-1); - - sendAnalyzeDone(); - }; - - var doParse = function(){ - var argChar, numSlice; - model=[]; - var sendLayer = undefined; - var sendLayerZ = 0; - var sendMultiLayer = []; - var sendMultiLayerZ = []; - var lastSend = 0; - // console.time("parseGCode timer"); - var reg = new RegExp(/^(?:G0|G1)\s/i); - var comment = new RegExp() - var j, layer= 0, extrude=false, prevRetract= 0, retract=0, x, y, z=0, f, prevZ=0, prevX, prevY,lastF=4000, prev_extrude = {a: undefined, b: undefined, c: undefined, e: undefined, abs: undefined}, extrudeRelative=false; - var dcExtrude=false; - var assumeNonDC = false; - - for(var i=0;i0; - if(prev_extrude["abs"]<0){ - prevRetract = -1; - retract = -1; - } - else if(prev_extrude["abs"]==0){ - retract = 0; - }else if(prev_extrude["abs"]>0&&prevRetract < 0){ - prevRetract = 0; - retract = 1; - } else { - retract = 0; - } - prev_extrude[argChar] = numSlice; - - break; - case 'f': - numSlice = args[j].slice(1); - lastF = numSlice; - break; - default: - break; - } - } - if(dcExtrude&&!assumeNonDC){ - extrude = true; - prev_extrude["abs"] = Math.sqrt((prevX-x)*(prevX-x)+(prevY-y)*(prevY-y)); - } - if(!model[layer])model[layer]=[]; - if(typeof(x) !== 'undefined' || typeof(y) !== 'undefined' ||typeof(z) !== 'undefined'||retract!=0) model[layer][model[layer].length] = {x: Number(x), y: Number(y), z: Number(z), extrude: extrude, retract: Number(retract), noMove: false, extrusion: (extrude||retract)?Number(prev_extrude["abs"]):0, prevX: Number(prevX), prevY: Number(prevY), prevZ: Number(prevZ), speed: Number(lastF), gcodeLine: Number(i), percentage: percentage}; - //{x: x, y: y, z: z, extrude: extrude, retract: retract, noMove: false, extrusion: (extrude||retract)?prev_extrude["abs"]:0, prevX: prevX, prevY: prevY, prevZ: prevZ, speed: lastF, gcodeLine: i}; - if(typeof(x) !== 'undefined') prevX = x; - if(typeof(y) !== 'undefined') prevY = y; - } else if(line.match(/^(?:M82)/i)){ - extrudeRelative = false; - }else if(line.match(/^(?:G91)/i)){ - extrudeRelative=true; - }else if(line.match(/^(?:G90)/i)){ - extrudeRelative=false; - }else if(line.match(/^(?:M83)/i)){ - extrudeRelative=true; - }else if(line.match(/^(?:M101)/i)){ - dcExtrude=true; - }else if(line.match(/^(?:M103)/i)){ - dcExtrude=false; - }else if(line.match(/^(?:G92)/i)){ - var args = line.split(/\s/); - for(j=0;j gcode.length*0.02 && sendMultiLayer.length != 0){ - lastSend = i; - sendMultiLayerToParent(sendMultiLayer, sendMultiLayerZ, i/gcode.length*100); - sendMultiLayer = []; - sendMultiLayerZ = []; - } - sendMultiLayer[sendMultiLayer.length] = sendLayer; - sendMultiLayerZ[sendMultiLayerZ.length] = sendLayerZ; - sendLayer = undefined; - sendLayerZ = undefined; - } - } - sendMultiLayerToParent(sendMultiLayer, sendMultiLayerZ, i/gcode.length*100); - }; - - - var parseGCode = function(message){ - gcode = message.gcode; - firstReport = message.options.firstReport; - - - doParse(); - gcode = []; - self.postMessage({ - "cmd": "returnModel", - "msg": { -// model: model - } - }); - - }; - - var runAnalyze = function(message){ - analyzeModel(); - model = []; - z_heights = []; - gcode = undefined; - firstReport = undefined; - z_heights = {}; - model = []; - max = {x: undefined, y: undefined, z: undefined}; - min = {x: undefined, y: undefined, z: undefined}; - modelSize = {x: undefined, y: undefined, z: undefined}; - filamentByLayer = {}; - totalFilament=0; - printTime=0; - printTimeByLayer = {}; - layerHeight=0; - layerCnt = 0; - speeds = {extrude: [], retract: [], move: []}; - speedsByLayer = {extrude: {}, retract: {}, move: {}}; - }; - var setOption = function(options){ - for(var opt in options){ - gCodeOptions[opt] = options[opt]; - } - }; - -onmessage = function (e){ - var data = e.data; - // for some reason firefox doesn't garbage collect when something inside closures is deleted, so we delete and recreate whole object eaech time - switch (data.cmd) { - case 'parseGCode': - parseGCode(data.msg); - break; - case 'setOption': - setOption(data.msg); - break; - case 'analyzeModel': - runAnalyze(data.msg); - break; - - default: - self.postMessage('Unknown command: ' + data.msg); - } - -}; +/** + * User: hudbrog (hudbrog@gmail.com) + * Date: 10/24/12 + * Time: 12:18 PM + */ + + var gcode; + var firstReport; + var z_heights = {}; + var model = []; + var gCodeOptions = { + sortLayers: false, + purgeEmptyLayers: true, + analyzeModel: false + }; + var max = {x: undefined, y: undefined, z: undefined}; + var min = {x: undefined, y: undefined, z: undefined}; + var modelSize = {x: undefined, y: undefined, z: undefined}; + var filamentByLayer = {}; + var totalFilament=0; + var printTime=0; + var printTimeByLayer = {}; + var layerHeight=0; + var layerCnt = 0; + var speeds = {extrude: [], retract: [], move: []}; + var speedsByLayer = {extrude: {}, retract: {}, move: {}}; + + + + var sendLayerToParent = function(layerNum, z, progress){ + self.postMessage({ + "cmd": "returnLayer", + "msg": { + cmds: model[layerNum], + layerNum: layerNum, + zHeightObject: {zValue: z, layer: z_heights[z]}, + isEmpty: false, + progress: progress + } + }); + }; + + var sendMultiLayerToParent = function(layerNum, z, progress){ + var tmpModel = []; + var tmpZHeight = {}; + + for(var i=0;iparseFloat(cmds[j].x)?parseFloat(max.x):parseFloat(cmds[j].x); + max.x = parseFloat(max.x)>parseFloat(cmds[j].prevX)?parseFloat(max.x):parseFloat(cmds[j].prevX); + min.x = parseFloat(min.x)parseFloat(cmds[j].y)?parseFloat(max.y):parseFloat(cmds[j].y); + max.y = parseFloat(max.y)>parseFloat(cmds[j].prevY)?parseFloat(max.y):parseFloat(cmds[j].prevY); + min.y = parseFloat(min.y)parseFloat(cmds[j].prevZ)?parseFloat(max.z):parseFloat(cmds[j].prevZ); + min.z = parseFloat(min.z)=tmp2?tmp1:tmp2; + }else if(cmds[j].retract!==0){ + printTimeAdd = Math.abs(parseFloat(cmds[j].extrusion)/(cmds[j].speed/60)); + } + + printTime += printTimeAdd; + if(typeof(printTimeByLayer[cmds[j].prevZ])==='undefined'){printTimeByLayer[cmds[j].prevZ]=0;} + printTimeByLayer[cmds[j].prevZ] += printTimeAdd; + + if(cmds[j].extrude&&cmds[j].retract===0){ + type = 'extrude'; + }else if(cmds[j].retract!==0){ + type = 'retract'; + }else if(!cmds[j].extrude&&cmds[j].retract===0){ + type = 'move'; + // if(cmds[j].prevZ == '17.1'){ + // self.postMessage({cmd: 'Got speed ' + cmds[j].speed + 'with line ' + cmds[j].gcodeLine}); + // } + }else { + self.postMessage({cmd: 'unknown type of move'}); + type = 'unknown'; + } + speedIndex = speeds[type].indexOf(cmds[j].speed); + if (speedIndex === -1) { + speeds[type].push(cmds[j].speed); + speedIndex = speeds[type].indexOf(cmds[j].speed); + } + if(typeof(speedsByLayer[type][cmds[j].prevZ]) === 'undefined'){ + speedsByLayer[type][cmds[j].prevZ] = []; + } + if(speedsByLayer[type][cmds[j].prevZ].indexOf(cmds[j].speed) === -1){ + speedsByLayer[type][cmds[j].prevZ][speedIndex] = cmds[j].speed; + } + + } + sendSizeProgress(i/model.length*100); + + } + purgeLayers(); + + modelSize.x = Math.abs(max.x - min.x); + modelSize.y = Math.abs(max.y - min.y); + modelSize.z = Math.abs(max.z - min.z); + layerHeight = (max.z-min.z)/(layerCnt-1); + + sendAnalyzeDone(); + }; + + var doParse = function(){ + var argChar, numSlice; + model=[]; + var sendLayer = undefined; + var sendLayerZ = 0; + var sendMultiLayer = []; + var sendMultiLayerZ = []; + var lastSend = 0; + // console.time("parseGCode timer"); + var reg = new RegExp(/^(?:G0|G1)\s/i); + var comment = new RegExp() + var j, layer= 0, extrude=false, prevRetract= 0, retract=0, x, y, z=0, f, prevZ=0, prevX, prevY,lastF=4000, prev_extrude = {a: undefined, b: undefined, c: undefined, e: undefined, abs: undefined}, extrudeRelative=false; + var dcExtrude=false; + var assumeNonDC = false; + + for(var i=0;i0; + if(prev_extrude["abs"]<0){ + prevRetract = -1; + retract = -1; + } + else if(prev_extrude["abs"]==0){ + retract = 0; + }else if(prev_extrude["abs"]>0&&prevRetract < 0){ + prevRetract = 0; + retract = 1; + } else { + retract = 0; + } + prev_extrude[argChar] = numSlice; + + break; + case 'f': + numSlice = args[j].slice(1); + lastF = numSlice; + break; + default: + break; + } + } + if(dcExtrude&&!assumeNonDC){ + extrude = true; + prev_extrude["abs"] = Math.sqrt((prevX-x)*(prevX-x)+(prevY-y)*(prevY-y)); + } + if(!model[layer])model[layer]=[]; + if(typeof(x) !== 'undefined' || typeof(y) !== 'undefined' ||typeof(z) !== 'undefined'||retract!=0) model[layer][model[layer].length] = {x: Number(x), y: Number(y), z: Number(z), extrude: extrude, retract: Number(retract), noMove: false, extrusion: (extrude||retract)?Number(prev_extrude["abs"]):0, prevX: Number(prevX), prevY: Number(prevY), prevZ: Number(prevZ), speed: Number(lastF), gcodeLine: Number(i), percentage: percentage}; + //{x: x, y: y, z: z, extrude: extrude, retract: retract, noMove: false, extrusion: (extrude||retract)?prev_extrude["abs"]:0, prevX: prevX, prevY: prevY, prevZ: prevZ, speed: lastF, gcodeLine: i}; + if(typeof(x) !== 'undefined') prevX = x; + if(typeof(y) !== 'undefined') prevY = y; + } else if(line.match(/^(?:M82)/i)){ + extrudeRelative = false; + }else if(line.match(/^(?:G91)/i)){ + extrudeRelative=true; + }else if(line.match(/^(?:G90)/i)){ + extrudeRelative=false; + }else if(line.match(/^(?:M83)/i)){ + extrudeRelative=true; + }else if(line.match(/^(?:M101)/i)){ + dcExtrude=true; + }else if(line.match(/^(?:M103)/i)){ + dcExtrude=false; + }else if(line.match(/^(?:G92)/i)){ + var args = line.split(/\s/); + for(j=0;j gcode.length*0.02 && sendMultiLayer.length != 0){ + lastSend = i; + sendMultiLayerToParent(sendMultiLayer, sendMultiLayerZ, i/gcode.length*100); + sendMultiLayer = []; + sendMultiLayerZ = []; + } + sendMultiLayer[sendMultiLayer.length] = sendLayer; + sendMultiLayerZ[sendMultiLayerZ.length] = sendLayerZ; + sendLayer = undefined; + sendLayerZ = undefined; + } + } + sendMultiLayerToParent(sendMultiLayer, sendMultiLayerZ, i/gcode.length*100); + }; + + + var parseGCode = function(message){ + gcode = message.gcode; + firstReport = message.options.firstReport; + + + doParse(); + gcode = []; + self.postMessage({ + "cmd": "returnModel", + "msg": { +// model: model + } + }); + + }; + + var runAnalyze = function(message){ + analyzeModel(); + model = []; + z_heights = []; + gcode = undefined; + firstReport = undefined; + z_heights = {}; + model = []; + max = {x: undefined, y: undefined, z: undefined}; + min = {x: undefined, y: undefined, z: undefined}; + modelSize = {x: undefined, y: undefined, z: undefined}; + filamentByLayer = {}; + totalFilament=0; + printTime=0; + printTimeByLayer = {}; + layerHeight=0; + layerCnt = 0; + speeds = {extrude: [], retract: [], move: []}; + speedsByLayer = {extrude: {}, retract: {}, move: {}}; + }; + var setOption = function(options){ + for(var opt in options){ + gCodeOptions[opt] = options[opt]; + } + }; + +onmessage = function (e){ + var data = e.data; + // for some reason firefox doesn't garbage collect when something inside closures is deleted, so we delete and recreate whole object eaech time + switch (data.cmd) { + case 'parseGCode': + parseGCode(data.msg); + break; + case 'setOption': + setOption(data.msg); + break; + case 'analyzeModel': + runAnalyze(data.msg); + break; + + default: + self.postMessage('Unknown command: ' + data.msg); + } + +}; diff --git a/octoprint/static/gcodeviewer/js/gCodeReader.js b/src/octoprint/static/gcodeviewer/js/gCodeReader.js similarity index 96% rename from octoprint/static/gcodeviewer/js/gCodeReader.js rename to src/octoprint/static/gcodeviewer/js/gCodeReader.js index f30fdc69..6b2a6db9 100644 --- a/octoprint/static/gcodeviewer/js/gCodeReader.js +++ b/src/octoprint/static/gcodeviewer/js/gCodeReader.js @@ -1,207 +1,207 @@ -/** - * User: hudbrog (hudbrog@gmail.com) - * Date: 10/21/12 - * Time: 7:31 AM - */ - -GCODE.gCodeReader = (function(){ -// ***** PRIVATE ****** - var gcode, lines; - var z_heights = {}; - var model = []; - var max = {x: undefined, y: undefined, z: undefined}; - var min = {x: undefined, y: undefined, z: undefined}; - var modelSize = {x: undefined, y: undefined, z: undefined}; - var filamentByLayer = {}; - var printTimeByLayer; - var totalFilament=0; - var printTime=0; - var speeds = {}; - var speedsByLayer = {}; - var gCodeOptions = { - sortLayers: false, - purgeEmptyLayers: true, - analyzeModel: false - }; - - var percentageTree = undefined; - - var prepareGCode = function(totalSize){ - if(!lines)return; - gcode = []; - var i, tmp, byteCount; - - byteCount = 0; - for(i=0;i 1 || tmp === -1) { - gcode.push({line: lines[i], percentage: byteCount * 100 / totalSize}); - } - } - lines = []; - }; - - var sortLayers = function(){ - var sortedZ = []; - var tmpModel = []; - - for(var layer in z_heights){ - sortedZ[z_heights[layer]] = layer; - } - - sortedZ.sort(function(a,b){ - return a-b; - }); - - for(var i=0;i 1 || tmp === -1) { + gcode.push({line: lines[i], percentage: byteCount * 100 / totalSize}); + } + } + lines = []; + }; + + var sortLayers = function(){ + var sortedZ = []; + var tmpModel = []; + + for(var layer in z_heights){ + sortedZ[z_heights[layer]] = layer; + } + + sortedZ.sort(function(a,b){ + return a-b; + }); + + for(var i=0;i0)delta=zoomFactorDelta; - else delta=-1*zoomFactorDelta; - if (delta) zoom(delta); - return evt.preventDefault() && false; - }; - canvas.addEventListener('DOMMouseScroll',handleScroll,false); - canvas.addEventListener('mousewheel',handleScroll,false); - - }; - - var drawGrid = function() { - var i; - ctx.strokeStyle = renderOptions["colorGrid"]; - ctx.lineWidth = 1; - var offsetX=0, offsetY=0; - if(renderOptions["moveModel"]){ - offsetX = offsetModelX; - offsetY = offsetModelY; - } - - ctx.beginPath(); - for(i=0;i<=gridSizeX;i+=gridStep){ - ctx.moveTo(i*zoomFactor-offsetX, 0-offsetY); - ctx.lineTo(i*zoomFactor-offsetX, -gridSizeY*zoomFactor-offsetY); - } - ctx.stroke(); - - ctx.beginPath(); - for(i=0;i<=gridSizeY;i+=gridStep){ - ctx.moveTo(0-offsetX, -i*zoomFactor-offsetY); - ctx.lineTo(gridSizeX*zoomFactor-offsetX, -i*zoomFactor-offsetY); - } - ctx.stroke(); - - }; - - var drawLayer = function(layerNum, fromProgress, toProgress, isNextLayer){ - var i, speedIndex= 0, prevZ = 0; - isNextLayer = typeof isNextLayer !== 'undefined' ? isNextLayer : false; - if(!isNextLayer){ - layerNumStore=layerNum; - progressStore = {from: fromProgress, to: toProgress}; - } - if(!model||!model[layerNum])return; - - var cmds = model[layerNum]; - var x, y; - -// if(toProgress === -1){ -// toProgress=cmds.length; -// } - - if(fromProgress>0){ - prevX = cmds[fromProgress-1].x*zoomFactor; - prevY = -cmds[fromProgress-1].y*zoomFactor; - }else if(fromProgress===0 && layerNum==0){ - if(model[0]&&model[0].x !== undefined &&model[0].y !== undefined){ - prevX = model[0].x*zoomFactor; - prevY = -model[0].y*zoomFactor; - }else { - prevX = 0; - prevY = 0; - } - }else if(typeof(cmds[0].prevX) !== 'undefined' && typeof(cmds[0].prevY) !== 'undefined'){ - prevX = cmds[0].prevX*zoomFactor; - prevY = -cmds[0].prevY*zoomFactor; - }else{ - if(model[layerNum-1]){ - prevX=undefined; - prevY=undefined; - for(i=model[layerNum-1].length-1;i>=0;i--){ - if(prevX === undefined && model[layerNum-1][i].x!==undefined)prevX=model[layerNum-1][i].x*zoomFactor; - if(prevY === undefined && model[layerNum-1][i].y!==undefined)prevY=-model[layerNum-1][i].y*zoomFactor; - } - if(prevX === undefined)prevX=0; - if(prevY === undefined)prevY=0; - }else{ - prevX=0; - prevY=0; - } - } - - prevZ = GCODE.renderer.getZ(layerNum); - -// ctx.strokeStyle = renderOptions["colorLine"]; - for(i=fromProgress;i<=toProgress;i++){ - ctx.lineWidth = 1; - - if(typeof(cmds[i]) === 'undefined')continue; - - if(typeof(cmds[i].prevX) !== 'undefined' && typeof(cmds[i].prevY) !== 'undefined'){ - prevX = cmds[i].prevX*zoomFactor; - prevY = -cmds[i].prevY*zoomFactor; - } -// console.log(cmds[i]); - if(typeof(cmds[i].x)==='undefined'||isNaN(cmds[i].x))x=prevX/zoomFactor; - else x = cmds[i].x; - if(typeof(cmds[i].y) === 'undefined'||isNaN(cmds[i].y))y=prevY/zoomFactor; - else y = -cmds[i].y; - if(renderOptions["differentiateColors"]&&!renderOptions['showNextLayer']){ -// if(speedsByLayer['extrude'][prevZ]){ - speedIndex = speeds['extrude'].indexOf(cmds[i].speed); -// speedIndex = GCODE.ui.ArrayIndexOf(speedsByLayer['extrude'][prevZ], function(obj) {return obj.speed === cmds[i].speed;}); -// } else { -// speedIndex = -1; -// } - if(speedIndex === -1){ - speedIndex = 0; - }else if(speedIndex > renderOptions["colorLine"].length -1){ - speedIndex = speedIndex % (renderOptions["colorLine"].length-1); - // console.log("Too much colors"); - } - }else if(renderOptions['showNextLayer']&&isNextLayer){ - speedIndex=3; - }else{ - speedIndex=0; - } - - - if(!cmds[i].extrude&&!cmds[i].noMove){ -// ctx.stroke(); - if(cmds[i].retract == -1){ - if(renderOptions["showRetracts"]){ - - ctx.strokeStyle = renderOptions["colorRetract"]; - ctx.fillStyle = renderOptions["colorRetract"]; - ctx.beginPath(); - ctx.arc(prevX, prevY, renderOptions["sizeRetractSpot"], 0, Math.PI*2, true); - ctx.stroke(); - ctx.fill(); - } - } - if(renderOptions["showMoves"]){ - ctx.strokeStyle = renderOptions["colorMove"]; - ctx.beginPath(); - ctx.moveTo(prevX, prevY); - ctx.lineTo(x*zoomFactor,y*zoomFactor); - ctx.stroke(); - } -// ctx.strokeStyle = renderOptions["colorLine"][0]; -// ctx.beginPath(); -// console.log("moveto: "+cmds[i].x+":"+cmds[i].y) -// ctx.moveTo(cmds[i].x*zoomFactor,cmds[i].y*zoomFactor); - } - else if(cmds[i].extrude){ - if(cmds[i].retract==0){ - ctx.strokeStyle = renderOptions["colorLine"][speedIndex]; - ctx.lineWidth = renderOptions['extrusionWidth']; - ctx.beginPath(); - ctx.moveTo(prevX, prevY); - ctx.lineTo(x*zoomFactor,y*zoomFactor); - ctx.stroke(); - }else { - if(renderOptions["showRetracts"]){ -// ctx.stroke(); - ctx.strokeStyle = renderOptions["colorRestart"]; - ctx.fillStyle = renderOptions["colorRestart"]; - ctx.beginPath(); - ctx.arc(prevX, prevY, renderOptions["sizeRetractSpot"], 0, Math.PI*2, true); - ctx.stroke(); - ctx.fill(); -// ctx.strokeStyle = renderOptions["colorLine"][0]; -// ctx.beginPath(); - } - } - } - prevX = x*zoomFactor; - prevY = y*zoomFactor; - } - ctx.stroke(); - }; - - -// ***** PUBLIC ******* - return { - init: function(){ - startCanvas(); - initialized = true; - ctx.translate(10,gridSizeY*zoomFactor+20); - }, - setOption: function(options){ - for(var opt in options){ - if(options.hasOwnProperty(opt))renderOptions[opt] = options[opt]; - }; - - if(initialized)reRender(); - }, - getOptions: function(){ - return renderOptions; - }, - debugGetModel: function(){ - return model; - }, - render: function(layerNum, fromProgress, toProgress){ - if(!initialized)this.init(); - if(!model){ - drawGrid(); - }else{ - if(layerNum < model.length){ - var p1 = ctx.transformedPoint(0,0); - var p2 = ctx.transformedPoint(canvas.width,canvas.height); - ctx.clearRect(p1.x,p1.y,p2.x-p1.x,p2.y-p1.y); - drawGrid(); -// ctx.globalAlpha = 0.5; - if(renderOptions['showNextLayer'] && layerNum < model.length - 1) { - drawLayer(layerNum+1, 0, this.getLayerNumSegments(layerNum+1), true); - } - drawLayer(layerNum, fromProgress, toProgress); - }else{ - console.log("Got request to render non-existent layer!!"); - } - } - }, - getModelNumLayers: function(){ - return model?model.length:1; - }, - getLayerNumSegments: function(layer){ - if(model){ - return model[layer]?model[layer].length:1; - }else{ - return 1; - } - }, - doRender: function(mdl, layerNum){ - var mdlInfo; - model = mdl; - prevX=0; - prevY=0; - if(!initialized)this.init(); - - mdlInfo = GCODE.gCodeReader.getModelInfo(); - speeds = mdlInfo.speeds; - speedsByLayer = mdlInfo.speedsByLayer; -// console.log(speeds); -// console.log(mdlInfo.min.x + ' ' + mdlInfo.modelSize.x); - offsetModelX = (gridSizeX/2-(mdlInfo.min.x+mdlInfo.modelSize.x/2))*zoomFactor; - offsetModelY = (mdlInfo.min.y+mdlInfo.modelSize.y/2)*zoomFactor-gridSizeY/2*zoomFactor; - if(ctx)ctx.translate(offsetModelX, offsetModelY); - - this.render(layerNum, 0, model[layerNum].length); - }, - getZ: function(layerNum){ - if(!model&&!model[layerNum]){ - return '-1'; - } - var cmds = model[layerNum]; - for(var i=0;i0)delta=zoomFactorDelta; + else delta=-1*zoomFactorDelta; + if (delta) zoom(delta); + return evt.preventDefault() && false; + }; + canvas.addEventListener('DOMMouseScroll',handleScroll,false); + canvas.addEventListener('mousewheel',handleScroll,false); + + }; + + var drawGrid = function() { + var i; + ctx.strokeStyle = renderOptions["colorGrid"]; + ctx.lineWidth = 1; + var offsetX=0, offsetY=0; + if(renderOptions["moveModel"]){ + offsetX = offsetModelX; + offsetY = offsetModelY; + } + + ctx.beginPath(); + for(i=0;i<=gridSizeX;i+=gridStep){ + ctx.moveTo(i*zoomFactor-offsetX, 0-offsetY); + ctx.lineTo(i*zoomFactor-offsetX, -gridSizeY*zoomFactor-offsetY); + } + ctx.stroke(); + + ctx.beginPath(); + for(i=0;i<=gridSizeY;i+=gridStep){ + ctx.moveTo(0-offsetX, -i*zoomFactor-offsetY); + ctx.lineTo(gridSizeX*zoomFactor-offsetX, -i*zoomFactor-offsetY); + } + ctx.stroke(); + + }; + + var drawLayer = function(layerNum, fromProgress, toProgress, isNextLayer){ + var i, speedIndex= 0, prevZ = 0; + isNextLayer = typeof isNextLayer !== 'undefined' ? isNextLayer : false; + if(!isNextLayer){ + layerNumStore=layerNum; + progressStore = {from: fromProgress, to: toProgress}; + } + if(!model||!model[layerNum])return; + + var cmds = model[layerNum]; + var x, y; + +// if(toProgress === -1){ +// toProgress=cmds.length; +// } + + if(fromProgress>0){ + prevX = cmds[fromProgress-1].x*zoomFactor; + prevY = -cmds[fromProgress-1].y*zoomFactor; + }else if(fromProgress===0 && layerNum==0){ + if(model[0]&&model[0].x !== undefined &&model[0].y !== undefined){ + prevX = model[0].x*zoomFactor; + prevY = -model[0].y*zoomFactor; + }else { + prevX = 0; + prevY = 0; + } + }else if(typeof(cmds[0].prevX) !== 'undefined' && typeof(cmds[0].prevY) !== 'undefined'){ + prevX = cmds[0].prevX*zoomFactor; + prevY = -cmds[0].prevY*zoomFactor; + }else{ + if(model[layerNum-1]){ + prevX=undefined; + prevY=undefined; + for(i=model[layerNum-1].length-1;i>=0;i--){ + if(prevX === undefined && model[layerNum-1][i].x!==undefined)prevX=model[layerNum-1][i].x*zoomFactor; + if(prevY === undefined && model[layerNum-1][i].y!==undefined)prevY=-model[layerNum-1][i].y*zoomFactor; + } + if(prevX === undefined)prevX=0; + if(prevY === undefined)prevY=0; + }else{ + prevX=0; + prevY=0; + } + } + + prevZ = GCODE.renderer.getZ(layerNum); + +// ctx.strokeStyle = renderOptions["colorLine"]; + for(i=fromProgress;i<=toProgress;i++){ + ctx.lineWidth = 1; + + if(typeof(cmds[i]) === 'undefined')continue; + + if(typeof(cmds[i].prevX) !== 'undefined' && typeof(cmds[i].prevY) !== 'undefined'){ + prevX = cmds[i].prevX*zoomFactor; + prevY = -cmds[i].prevY*zoomFactor; + } +// console.log(cmds[i]); + if(typeof(cmds[i].x)==='undefined'||isNaN(cmds[i].x))x=prevX/zoomFactor; + else x = cmds[i].x; + if(typeof(cmds[i].y) === 'undefined'||isNaN(cmds[i].y))y=prevY/zoomFactor; + else y = -cmds[i].y; + if(renderOptions["differentiateColors"]&&!renderOptions['showNextLayer']){ +// if(speedsByLayer['extrude'][prevZ]){ + speedIndex = speeds['extrude'].indexOf(cmds[i].speed); +// speedIndex = GCODE.ui.ArrayIndexOf(speedsByLayer['extrude'][prevZ], function(obj) {return obj.speed === cmds[i].speed;}); +// } else { +// speedIndex = -1; +// } + if(speedIndex === -1){ + speedIndex = 0; + }else if(speedIndex > renderOptions["colorLine"].length -1){ + speedIndex = speedIndex % (renderOptions["colorLine"].length-1); + // console.log("Too much colors"); + } + }else if(renderOptions['showNextLayer']&&isNextLayer){ + speedIndex=3; + }else{ + speedIndex=0; + } + + + if(!cmds[i].extrude&&!cmds[i].noMove){ +// ctx.stroke(); + if(cmds[i].retract == -1){ + if(renderOptions["showRetracts"]){ + + ctx.strokeStyle = renderOptions["colorRetract"]; + ctx.fillStyle = renderOptions["colorRetract"]; + ctx.beginPath(); + ctx.arc(prevX, prevY, renderOptions["sizeRetractSpot"], 0, Math.PI*2, true); + ctx.stroke(); + ctx.fill(); + } + } + if(renderOptions["showMoves"]){ + ctx.strokeStyle = renderOptions["colorMove"]; + ctx.beginPath(); + ctx.moveTo(prevX, prevY); + ctx.lineTo(x*zoomFactor,y*zoomFactor); + ctx.stroke(); + } +// ctx.strokeStyle = renderOptions["colorLine"][0]; +// ctx.beginPath(); +// console.log("moveto: "+cmds[i].x+":"+cmds[i].y) +// ctx.moveTo(cmds[i].x*zoomFactor,cmds[i].y*zoomFactor); + } + else if(cmds[i].extrude){ + if(cmds[i].retract==0){ + ctx.strokeStyle = renderOptions["colorLine"][speedIndex]; + ctx.lineWidth = renderOptions['extrusionWidth']; + ctx.beginPath(); + ctx.moveTo(prevX, prevY); + ctx.lineTo(x*zoomFactor,y*zoomFactor); + ctx.stroke(); + }else { + if(renderOptions["showRetracts"]){ +// ctx.stroke(); + ctx.strokeStyle = renderOptions["colorRestart"]; + ctx.fillStyle = renderOptions["colorRestart"]; + ctx.beginPath(); + ctx.arc(prevX, prevY, renderOptions["sizeRetractSpot"], 0, Math.PI*2, true); + ctx.stroke(); + ctx.fill(); +// ctx.strokeStyle = renderOptions["colorLine"][0]; +// ctx.beginPath(); + } + } + } + prevX = x*zoomFactor; + prevY = y*zoomFactor; + } + ctx.stroke(); + }; + + +// ***** PUBLIC ******* + return { + init: function(){ + startCanvas(); + initialized = true; + ctx.translate(10,gridSizeY*zoomFactor+20); + }, + setOption: function(options){ + for(var opt in options){ + if(options.hasOwnProperty(opt))renderOptions[opt] = options[opt]; + }; + + if(initialized)reRender(); + }, + getOptions: function(){ + return renderOptions; + }, + debugGetModel: function(){ + return model; + }, + render: function(layerNum, fromProgress, toProgress){ + if(!initialized)this.init(); + if(!model){ + drawGrid(); + }else{ + if(layerNum < model.length){ + var p1 = ctx.transformedPoint(0,0); + var p2 = ctx.transformedPoint(canvas.width,canvas.height); + ctx.clearRect(p1.x,p1.y,p2.x-p1.x,p2.y-p1.y); + drawGrid(); +// ctx.globalAlpha = 0.5; + if(renderOptions['showNextLayer'] && layerNum < model.length - 1) { + drawLayer(layerNum+1, 0, this.getLayerNumSegments(layerNum+1), true); + } + drawLayer(layerNum, fromProgress, toProgress); + }else{ + console.log("Got request to render non-existent layer!!"); + } + } + }, + getModelNumLayers: function(){ + return model?model.length:1; + }, + getLayerNumSegments: function(layer){ + if(model){ + return model[layer]?model[layer].length:1; + }else{ + return 1; + } + }, + doRender: function(mdl, layerNum){ + var mdlInfo; + model = mdl; + prevX=0; + prevY=0; + if(!initialized)this.init(); + + mdlInfo = GCODE.gCodeReader.getModelInfo(); + speeds = mdlInfo.speeds; + speedsByLayer = mdlInfo.speedsByLayer; +// console.log(speeds); +// console.log(mdlInfo.min.x + ' ' + mdlInfo.modelSize.x); + offsetModelX = (gridSizeX/2-(mdlInfo.min.x+mdlInfo.modelSize.x/2))*zoomFactor; + offsetModelY = (mdlInfo.min.y+mdlInfo.modelSize.y/2)*zoomFactor-gridSizeY/2*zoomFactor; + if(ctx)ctx.translate(offsetModelX, offsetModelY); + + this.render(layerNum, 0, model[layerNum].length); + }, + getZ: function(layerNum){ + if(!model&&!model[layerNum]){ + return '-1'; + } + var cmds = model[layerNum]; + for(var i=0;i colors.length -1){speedIndex = speedIndex % (colors.length-1);} - output.push("
= " + (parseFloat(layerSpeeds['extrude'][z][i])/60).toFixed(2)+"mm/s"); - } - if(typeof(layerSpeeds['move'][z]) !== 'undefined'){ - output.push("Move speeds:"); - for(i=0;i colors.length -1){speedIndex = speedIndex % (colors.length-1);} - output.push("
= " + (parseFloat(layerSpeeds['move'][z][i])/60).toFixed(2)+"mm/s"); - } - } - if(typeof(layerSpeeds['retract'][z]) !== 'undefined'){ - output.push("Retract speeds:"); - for(i=0;i colors.length -1){speedIndex = speedIndex % (colors.length-1);} - output.push(" = " +(parseFloat(layerSpeeds['retract'][z][i])/60).toFixed(2)+"mm/s"); - } - } - - $('#layerInfo').html(output.join('
')); -// chooseAccordion('layerAccordionTab'); - }; - - var handleFileSelect = function(evt) { -// console.log("handleFileSelect"); - evt.stopPropagation(); - evt.preventDefault(); - - var files = evt.dataTransfer?evt.dataTransfer.files:evt.target.files; // FileList object. - - var output = []; - for (var i = 0, f; f = files[i]; i++) { - if(f.name.toLowerCase().match(/^.*\.(?:gcode|g|txt)$/)){ - output.push('
  • File extensions suggests GCODE
  • '); - }else{ - output.push('
  • You should only upload *.gcode files! I will not work with this one!
  • '); - document.getElementById('errorList').innerHTML = '
      ' + output.join('') + '
    '; - return; - } - - reader = new FileReader(); - reader.onload = function(theFile){ - chooseAccordion('progressAccordionTab'); - setProgress('loadProgress', 0); - setProgress('analyzeProgress', 0); -// myCodeMirror.setValue(theFile.target.result); - GCODE.gCodeReader.loadFile(theFile); - if(showGCode){ - myCodeMirror.setValue(theFile.target.result); - }else{ - myCodeMirror.setValue("GCode view is disabled. You can enable it in 'GCode analyzer options' section.") - } - - }; - reader.readAsText(f); - } - }; - - var handleDragOver = function(evt) { - evt.stopPropagation(); - evt.preventDefault(); - evt.target.dropEffect = 'copy'; // Explicitly show this is a copy. - }; - - var initSliders = function(){ - var prevX=0; - var prevY=0; - var handle; - sliderVer = $( "#slider-vertical" ); - sliderHor = $( "#slider-horizontal" ); - - var onLayerChange = function(val){ - var progress = GCODE.renderer.getLayerNumSegments(val)-1; - GCODE.renderer.render(val,0, progress); - sliderHor.slider({max: progress, values: [0,progress]}); - setLinesColor(false); //clear current selection - gCodeLines = GCODE.gCodeReader.getGCodeLines(val, sliderHor.slider("values",0), sliderHor.slider("values",1)); - setLinesColor(true); // highlight lines - printLayerInfo(val); - }; - - sliderVer.slider({ - orientation: "vertical", - range: "min", - min: 0, - max: GCODE.renderer.getModelNumLayers()-1, - value: 0, - slide: function( event, ui ) { - onLayerChange(ui.value); - } - }); - - //this stops slider reacting to arrow keys, since we do it below manually - $( "#slider-vertical .ui-slider-handle" ).unbind('keydown'); - - sliderHor.slider({ - orientation: "horizontal", - range: "min", - min: 0, - max: GCODE.renderer.getLayerNumSegments(0)-1, - values: [0,GCODE.renderer.getLayerNumSegments(0)-1], - slide: function( event, ui ) { - setLinesColor(false); //clear current selection - gCodeLines = GCODE.gCodeReader.getGCodeLines(sliderVer.slider("value"),ui.values[0], ui.values[1]); - setLinesColor(true); // highlight lines - GCODE.renderer.render(sliderVer.slider("value"), ui.values[0], ui.values[1]); - } - }); - - window.onkeydown = function (event){ - if(event.keyCode === 38 || event.keyCode === 33){ - if(sliderVer.slider('value') < sliderVer.slider('option', 'max')){ - sliderVer.slider('value', sliderVer.slider('value')+1); - onLayerChange(sliderVer.slider('value')); - } - }else if(event.keyCode === 40 || event.keyCode === 34){ - if(sliderVer.slider('value') > 0){ - sliderVer.slider('value', sliderVer.slider('value')-1); - onLayerChange(sliderVer.slider('value')); - } - } - event.stopPropagation() - } - }; - - var processMessage = function(e){ - var data = e.data; - switch (data.cmd) { - case 'returnModel': - setProgress('loadProgress', 100); - worker.postMessage({ - "cmd":"analyzeModel", - "msg":{ - } - } - ); - break; - case 'analyzeDone': - var resultSet = []; - - setProgress('analyzeProgress',100); - GCODE.gCodeReader.processAnalyzeModelDone(data.msg); - GCODE.gCodeReader.passDataToRenderer(); - initSliders(); - resultSet.push("Model size is: " + data.msg.modelSize.x.toFixed(2) + 'x' + data.msg.modelSize.y.toFixed(2) + 'x' + data.msg.modelSize.z.toFixed(2)+'mm
    '); - resultSet.push("Total filament used: " + data.msg.totalFilament.toFixed(2) + "mm
    "); - resultSet.push("Estimated print time: " + parseInt(parseFloat(data.msg.printTime)/60/60) + ":" + parseInt((parseFloat(data.msg.printTime)/60)%60) + ":" + parseInt(parseFloat(data.msg.printTime)%60) + "
    "); - resultSet.push("Estimated layer height: " + data.msg.layerHeight.toFixed(2) + "mm
    "); - resultSet.push("Layer count: " + data.msg.layerCnt.toFixed(0) + "printed, " + data.msg.layerTotal.toFixed(0) + 'visited
    '); - document.getElementById('list').innerHTML = resultSet.join(''); - chooseAccordion('infoAccordionTab'); - $('#myTab a[href="#tab2d"]').tab('show'); - break; - case 'returnLayer': - GCODE.gCodeReader.processLayerFromWorker(data.msg); - setProgress('loadProgress',data.msg.progress); - break; - case 'returnMultiLayer': - GCODE.gCodeReader.processMultiLayerFromWorker(data.msg); - setProgress('loadProgress',data.msg.progress); - break; - case "analyzeProgress": - setProgress('analyzeProgress',data.msg.progress); - break; - default: - console.log("default msg received" + data.cmd); - } - }; - - var checkCapabilities = function(){ - var warnings = []; - var fatal = []; - - Modernizr.addTest('filereader', function () { - return !!(window.File && window.FileList && window.FileReader); - }); - - if(!Modernizr.canvas)fatal.push("
  • Your browser doesn't seem to support HTML5 Canvas, this application won't work without it.
  • "); - //if(!Modernizr.filereader)fatal.push("
  • Your browser doesn't seem to support HTML5 File API, this application won't work without it.
  • "); - if(!Modernizr.webworkers)fatal.push("
  • Your browser doesn't seem to support HTML5 Web Workers, this application won't work without it.
  • "); - if(!Modernizr.svg)fatal.push("
  • Your browser doesn't seem to support HTML5 SVG, this application won't work without it.
  • "); - - if(fatal.length>0){ - document.getElementById('errorList').innerHTML = '
      ' + fatal.join('') + '
    '; - console.log("Initialization failed: unsupported browser.") - return false; - } - - if(!Modernizr.webgl && GCODE.renderer3d){ - warnings.push("
  • Your browser doesn't seem to support HTML5 Web GL, 3d mode is not recommended, going to be SLOW!
  • "); - GCODE.renderer3d.setOption({rendererType: "canvas"}); - } - if(!Modernizr.draganddrop)warnings.push("
  • Your browser doesn't seem to support HTML5 Drag'n'Drop, Drop area will not work.
  • "); - - if(warnings.length>0){ - document.getElementById('errorList').innerHTML = '
      ' + wanings.join('') + '
    '; - console.log("Initialization succeeded with warnings.") - } - return true; - }; - - - return { - worker: undefined, - initHandlers: function(){ - var capabilitiesResult = checkCapabilities(); - if(!capabilitiesResult){ - return; - } - - setProgress('loadProgress', 0); - setProgress('analyzeProgress', 0); - - worker = new Worker('static/gcodeviewer/js/Worker.js'); - - worker.addEventListener('message', processMessage, false); - - GCODE.ui.processOptions(); - GCODE.renderer.render(0,0); - - console.log("Application initialized"); - - }, - - ArrayIndexOf: function(a, fnc) { - if (!fnc || typeof (fnc) != 'function') { - return -1; - } - if (!a || !a.length || a.length < 1) return -1; - for (var i = 0; i < a.length; i++) { - if(!a[i]) continue; - if (fnc(a[i])) return i; - } - return -1; - }, - updateLayerInfo: function(layerNum){ - printLayerInfo(layerNum); - }, - - processOptions: function(){ - if(document.getElementById('sortLayersCheckbox').checked)GCODE.gCodeReader.setOption({sortLayers: true}); - else GCODE.gCodeReader.setOption({sortLayers: false}); - - if(document.getElementById('purgeEmptyLayersCheckbox').checked)GCODE.gCodeReader.setOption({purgeEmptyLayers: true}); - else GCODE.gCodeReader.setOption({purgeEmptyLayers: false}); - - if(document.getElementById('showGCodeCheckbox').checked)showGCode = true; - else showGCode = false; - - -// if(document.getElementById('sortLayersCheckbox').checked) worker.postMessage({"cmd":"setOption", "msg":{sortLayers: true}}); -// else worker.postMessage({"cmd":"setOption", "msg":{sortLayers: false}}); -// -// if(document.getElementById('purgeEmptyLayersCheckbox').checked)worker.postMessage({"cmd":"setOption", "msg":{purgeEmptyLayers: true}}); -// else worker.postMessage({"cmd":"setOption", "msg":{purgeEmptyLayers: false}}); - -// if(document.getElementById('analyzeModelCheckbox').checked)worker.postMessage({"cmd":"setOption", "msg":{analyzeModel: true}}); -// else worker.postMessage({"cmd":"setOption", "msg":{analyzeModel: false}}); - - - if(document.getElementById('moveModelCheckbox').checked)GCODE.renderer.setOption({moveModel: true}); - else GCODE.renderer.setOption({moveModel: false}); - - if(document.getElementById('showMovesCheckbox').checked)GCODE.renderer.setOption({showMoves: true}); - else GCODE.renderer.setOption({showMoves: false}); - - if(document.getElementById('showRetractsCheckbox').checked)GCODE.renderer.setOption({showRetracts: true}); - else GCODE.renderer.setOption({showRetracts: false}); - - if(document.getElementById('differentiateColorsCheckbox').checked)GCODE.renderer.setOption({differentiateColors: true}); - else GCODE.renderer.setOption({differentiateColors: false}); - - var widthMod = 2; - if(Number($('#widthModifier').attr('value'))) {widthMod = Number($('#widthModifier').attr('value'));} - if(document.getElementById('thickExtrusionCheckbox').checked)GCODE.renderer.setOption({extrusionWidth: widthMod}); - else GCODE.renderer.setOption({extrusionWidth: 1}); - - if(document.getElementById('showNextLayer').checked)GCODE.renderer.setOption({showNextLayer: true}); - else GCODE.renderer.setOption({showNextLayer: false}); - } - } +/** + * User: hudbrog (hudbrog@gmail.com) + * Date: 10/21/12 + * Time: 7:45 AM + */ + +var GCODE = {}; + +GCODE.ui = (function(){ + var reader; + var myCodeMirror; + var sliderVer; + var sliderHor; + var gCodeLines = {first: 0, last: 0}; + var showGCode = false; + + var setProgress = function(id, progress){ + $('#'+id).width(parseInt(progress)+'%'); + $('#'+id).text(parseInt(progress)+'%'); + + }; + + var chooseAccordion = function(id){ +// debugger; + $('#'+id).collapse("show"); + }; + + var setLinesColor = function(toggle){ +// var i=0; +// for(i=gCodeLines.first;i colors.length -1){speedIndex = speedIndex % (colors.length-1);} + output.push("
    = " + (parseFloat(layerSpeeds['extrude'][z][i])/60).toFixed(2)+"mm/s"); + } + if(typeof(layerSpeeds['move'][z]) !== 'undefined'){ + output.push("Move speeds:"); + for(i=0;i colors.length -1){speedIndex = speedIndex % (colors.length-1);} + output.push("
    = " + (parseFloat(layerSpeeds['move'][z][i])/60).toFixed(2)+"mm/s"); + } + } + if(typeof(layerSpeeds['retract'][z]) !== 'undefined'){ + output.push("Retract speeds:"); + for(i=0;i colors.length -1){speedIndex = speedIndex % (colors.length-1);} + output.push(" = " +(parseFloat(layerSpeeds['retract'][z][i])/60).toFixed(2)+"mm/s"); + } + } + + $('#layerInfo').html(output.join('
    ')); +// chooseAccordion('layerAccordionTab'); + }; + + var handleFileSelect = function(evt) { +// console.log("handleFileSelect"); + evt.stopPropagation(); + evt.preventDefault(); + + var files = evt.dataTransfer?evt.dataTransfer.files:evt.target.files; // FileList object. + + var output = []; + for (var i = 0, f; f = files[i]; i++) { + if(f.name.toLowerCase().match(/^.*\.(?:gcode|g|txt)$/)){ + output.push('
  • File extensions suggests GCODE
  • '); + }else{ + output.push('
  • You should only upload *.gcode files! I will not work with this one!
  • '); + document.getElementById('errorList').innerHTML = '
      ' + output.join('') + '
    '; + return; + } + + reader = new FileReader(); + reader.onload = function(theFile){ + chooseAccordion('progressAccordionTab'); + setProgress('loadProgress', 0); + setProgress('analyzeProgress', 0); +// myCodeMirror.setValue(theFile.target.result); + GCODE.gCodeReader.loadFile(theFile); + if(showGCode){ + myCodeMirror.setValue(theFile.target.result); + }else{ + myCodeMirror.setValue("GCode view is disabled. You can enable it in 'GCode analyzer options' section.") + } + + }; + reader.readAsText(f); + } + }; + + var handleDragOver = function(evt) { + evt.stopPropagation(); + evt.preventDefault(); + evt.target.dropEffect = 'copy'; // Explicitly show this is a copy. + }; + + var initSliders = function(){ + var prevX=0; + var prevY=0; + var handle; + sliderVer = $( "#slider-vertical" ); + sliderHor = $( "#slider-horizontal" ); + + var onLayerChange = function(val){ + var progress = GCODE.renderer.getLayerNumSegments(val)-1; + GCODE.renderer.render(val,0, progress); + sliderHor.slider({max: progress, values: [0,progress]}); + setLinesColor(false); //clear current selection + gCodeLines = GCODE.gCodeReader.getGCodeLines(val, sliderHor.slider("values",0), sliderHor.slider("values",1)); + setLinesColor(true); // highlight lines + printLayerInfo(val); + }; + + sliderVer.slider({ + orientation: "vertical", + range: "min", + min: 0, + max: GCODE.renderer.getModelNumLayers()-1, + value: 0, + slide: function( event, ui ) { + onLayerChange(ui.value); + } + }); + + //this stops slider reacting to arrow keys, since we do it below manually + $( "#slider-vertical .ui-slider-handle" ).unbind('keydown'); + + sliderHor.slider({ + orientation: "horizontal", + range: "min", + min: 0, + max: GCODE.renderer.getLayerNumSegments(0)-1, + values: [0,GCODE.renderer.getLayerNumSegments(0)-1], + slide: function( event, ui ) { + setLinesColor(false); //clear current selection + gCodeLines = GCODE.gCodeReader.getGCodeLines(sliderVer.slider("value"),ui.values[0], ui.values[1]); + setLinesColor(true); // highlight lines + GCODE.renderer.render(sliderVer.slider("value"), ui.values[0], ui.values[1]); + } + }); + + window.onkeydown = function (event){ + if(event.keyCode === 38 || event.keyCode === 33){ + if(sliderVer.slider('value') < sliderVer.slider('option', 'max')){ + sliderVer.slider('value', sliderVer.slider('value')+1); + onLayerChange(sliderVer.slider('value')); + } + }else if(event.keyCode === 40 || event.keyCode === 34){ + if(sliderVer.slider('value') > 0){ + sliderVer.slider('value', sliderVer.slider('value')-1); + onLayerChange(sliderVer.slider('value')); + } + } + event.stopPropagation() + } + }; + + var processMessage = function(e){ + var data = e.data; + switch (data.cmd) { + case 'returnModel': + setProgress('loadProgress', 100); + worker.postMessage({ + "cmd":"analyzeModel", + "msg":{ + } + } + ); + break; + case 'analyzeDone': + var resultSet = []; + + setProgress('analyzeProgress',100); + GCODE.gCodeReader.processAnalyzeModelDone(data.msg); + GCODE.gCodeReader.passDataToRenderer(); + initSliders(); + resultSet.push("Model size is: " + data.msg.modelSize.x.toFixed(2) + 'x' + data.msg.modelSize.y.toFixed(2) + 'x' + data.msg.modelSize.z.toFixed(2)+'mm
    '); + resultSet.push("Total filament used: " + data.msg.totalFilament.toFixed(2) + "mm
    "); + resultSet.push("Estimated print time: " + parseInt(parseFloat(data.msg.printTime)/60/60) + ":" + parseInt((parseFloat(data.msg.printTime)/60)%60) + ":" + parseInt(parseFloat(data.msg.printTime)%60) + "
    "); + resultSet.push("Estimated layer height: " + data.msg.layerHeight.toFixed(2) + "mm
    "); + resultSet.push("Layer count: " + data.msg.layerCnt.toFixed(0) + "printed, " + data.msg.layerTotal.toFixed(0) + 'visited
    '); + document.getElementById('list').innerHTML = resultSet.join(''); + chooseAccordion('infoAccordionTab'); + $('#myTab a[href="#tab2d"]').tab('show'); + break; + case 'returnLayer': + GCODE.gCodeReader.processLayerFromWorker(data.msg); + setProgress('loadProgress',data.msg.progress); + break; + case 'returnMultiLayer': + GCODE.gCodeReader.processMultiLayerFromWorker(data.msg); + setProgress('loadProgress',data.msg.progress); + break; + case "analyzeProgress": + setProgress('analyzeProgress',data.msg.progress); + break; + default: + console.log("default msg received" + data.cmd); + } + }; + + var checkCapabilities = function(){ + var warnings = []; + var fatal = []; + + Modernizr.addTest('filereader', function () { + return !!(window.File && window.FileList && window.FileReader); + }); + + if(!Modernizr.canvas)fatal.push("
  • Your browser doesn't seem to support HTML5 Canvas, this application won't work without it.
  • "); + //if(!Modernizr.filereader)fatal.push("
  • Your browser doesn't seem to support HTML5 File API, this application won't work without it.
  • "); + if(!Modernizr.webworkers)fatal.push("
  • Your browser doesn't seem to support HTML5 Web Workers, this application won't work without it.
  • "); + if(!Modernizr.svg)fatal.push("
  • Your browser doesn't seem to support HTML5 SVG, this application won't work without it.
  • "); + + if(fatal.length>0){ + document.getElementById('errorList').innerHTML = '
      ' + fatal.join('') + '
    '; + console.log("Initialization failed: unsupported browser.") + return false; + } + + if(!Modernizr.webgl && GCODE.renderer3d){ + warnings.push("
  • Your browser doesn't seem to support HTML5 Web GL, 3d mode is not recommended, going to be SLOW!
  • "); + GCODE.renderer3d.setOption({rendererType: "canvas"}); + } + if(!Modernizr.draganddrop)warnings.push("
  • Your browser doesn't seem to support HTML5 Drag'n'Drop, Drop area will not work.
  • "); + + if(warnings.length>0){ + document.getElementById('errorList').innerHTML = '
      ' + wanings.join('') + '
    '; + console.log("Initialization succeeded with warnings.") + } + return true; + }; + + + return { + worker: undefined, + initHandlers: function(){ + var capabilitiesResult = checkCapabilities(); + if(!capabilitiesResult){ + return; + } + + setProgress('loadProgress', 0); + setProgress('analyzeProgress', 0); + + worker = new Worker('static/gcodeviewer/js/Worker.js'); + + worker.addEventListener('message', processMessage, false); + + GCODE.ui.processOptions(); + GCODE.renderer.render(0,0); + + console.log("Application initialized"); + + }, + + ArrayIndexOf: function(a, fnc) { + if (!fnc || typeof (fnc) != 'function') { + return -1; + } + if (!a || !a.length || a.length < 1) return -1; + for (var i = 0; i < a.length; i++) { + if(!a[i]) continue; + if (fnc(a[i])) return i; + } + return -1; + }, + updateLayerInfo: function(layerNum){ + printLayerInfo(layerNum); + }, + + processOptions: function(){ + if(document.getElementById('sortLayersCheckbox').checked)GCODE.gCodeReader.setOption({sortLayers: true}); + else GCODE.gCodeReader.setOption({sortLayers: false}); + + if(document.getElementById('purgeEmptyLayersCheckbox').checked)GCODE.gCodeReader.setOption({purgeEmptyLayers: true}); + else GCODE.gCodeReader.setOption({purgeEmptyLayers: false}); + + if(document.getElementById('showGCodeCheckbox').checked)showGCode = true; + else showGCode = false; + + +// if(document.getElementById('sortLayersCheckbox').checked) worker.postMessage({"cmd":"setOption", "msg":{sortLayers: true}}); +// else worker.postMessage({"cmd":"setOption", "msg":{sortLayers: false}}); +// +// if(document.getElementById('purgeEmptyLayersCheckbox').checked)worker.postMessage({"cmd":"setOption", "msg":{purgeEmptyLayers: true}}); +// else worker.postMessage({"cmd":"setOption", "msg":{purgeEmptyLayers: false}}); + +// if(document.getElementById('analyzeModelCheckbox').checked)worker.postMessage({"cmd":"setOption", "msg":{analyzeModel: true}}); +// else worker.postMessage({"cmd":"setOption", "msg":{analyzeModel: false}}); + + + if(document.getElementById('moveModelCheckbox').checked)GCODE.renderer.setOption({moveModel: true}); + else GCODE.renderer.setOption({moveModel: false}); + + if(document.getElementById('showMovesCheckbox').checked)GCODE.renderer.setOption({showMoves: true}); + else GCODE.renderer.setOption({showMoves: false}); + + if(document.getElementById('showRetractsCheckbox').checked)GCODE.renderer.setOption({showRetracts: true}); + else GCODE.renderer.setOption({showRetracts: false}); + + if(document.getElementById('differentiateColorsCheckbox').checked)GCODE.renderer.setOption({differentiateColors: true}); + else GCODE.renderer.setOption({differentiateColors: false}); + + var widthMod = 2; + if(Number($('#widthModifier').attr('value'))) {widthMod = Number($('#widthModifier').attr('value'));} + if(document.getElementById('thickExtrusionCheckbox').checked)GCODE.renderer.setOption({extrusionWidth: widthMod}); + else GCODE.renderer.setOption({extrusionWidth: 1}); + + if(document.getElementById('showNextLayer').checked)GCODE.renderer.setOption({showNextLayer: true}); + else GCODE.renderer.setOption({showNextLayer: false}); + } + } }()); \ No newline at end of file diff --git a/octoprint/static/gcodeviewer/lib/TrackballControls.js b/src/octoprint/static/gcodeviewer/lib/TrackballControls.js similarity index 100% rename from octoprint/static/gcodeviewer/lib/TrackballControls.js rename to src/octoprint/static/gcodeviewer/lib/TrackballControls.js diff --git a/octoprint/static/gcodeviewer/lib/codemirror.css b/src/octoprint/static/gcodeviewer/lib/codemirror.css similarity index 100% rename from octoprint/static/gcodeviewer/lib/codemirror.css rename to src/octoprint/static/gcodeviewer/lib/codemirror.css diff --git a/octoprint/static/gcodeviewer/lib/codemirror.js b/src/octoprint/static/gcodeviewer/lib/codemirror.js similarity index 100% rename from octoprint/static/gcodeviewer/lib/codemirror.js rename to src/octoprint/static/gcodeviewer/lib/codemirror.js diff --git a/octoprint/static/gcodeviewer/lib/mode_gcode/gcode_mode.js b/src/octoprint/static/gcodeviewer/lib/mode_gcode/gcode_mode.js similarity index 100% rename from octoprint/static/gcodeviewer/lib/mode_gcode/gcode_mode.js rename to src/octoprint/static/gcodeviewer/lib/mode_gcode/gcode_mode.js diff --git a/octoprint/static/gcodeviewer/lib/three.js b/src/octoprint/static/gcodeviewer/lib/three.js similarity index 100% rename from octoprint/static/gcodeviewer/lib/three.js rename to src/octoprint/static/gcodeviewer/lib/three.js diff --git a/octoprint/static/gcodeviewer/lib/three.min.js b/src/octoprint/static/gcodeviewer/lib/three.min.js similarity index 100% rename from octoprint/static/gcodeviewer/lib/three.min.js rename to src/octoprint/static/gcodeviewer/lib/three.min.js diff --git a/octoprint/static/img/apple-touch-icon-114x114.png b/src/octoprint/static/img/apple-touch-icon-114x114.png similarity index 100% rename from octoprint/static/img/apple-touch-icon-114x114.png rename to src/octoprint/static/img/apple-touch-icon-114x114.png diff --git a/octoprint/static/img/apple-touch-icon-144x144.png b/src/octoprint/static/img/apple-touch-icon-144x144.png similarity index 100% rename from octoprint/static/img/apple-touch-icon-144x144.png rename to src/octoprint/static/img/apple-touch-icon-144x144.png diff --git a/octoprint/static/img/glyphicons-halflings-white.png b/src/octoprint/static/img/glyphicons-halflings-white.png similarity index 100% rename from octoprint/static/img/glyphicons-halflings-white.png rename to src/octoprint/static/img/glyphicons-halflings-white.png diff --git a/octoprint/static/img/glyphicons-halflings.png b/src/octoprint/static/img/glyphicons-halflings.png similarity index 100% rename from octoprint/static/img/glyphicons-halflings.png rename to src/octoprint/static/img/glyphicons-halflings.png diff --git a/octoprint/static/img/graph-background.png b/src/octoprint/static/img/graph-background.png similarity index 100% rename from octoprint/static/img/graph-background.png rename to src/octoprint/static/img/graph-background.png diff --git a/octoprint/static/img/icon-sd-black-14.png b/src/octoprint/static/img/icon-sd-black-14.png similarity index 100% rename from octoprint/static/img/icon-sd-black-14.png rename to src/octoprint/static/img/icon-sd-black-14.png diff --git a/octoprint/static/img/logo.png b/src/octoprint/static/img/logo.png similarity index 100% rename from octoprint/static/img/logo.png rename to src/octoprint/static/img/logo.png diff --git a/octoprint/static/img/tentacle-20x20-light.png b/src/octoprint/static/img/tentacle-20x20-light.png similarity index 100% rename from octoprint/static/img/tentacle-20x20-light.png rename to src/octoprint/static/img/tentacle-20x20-light.png diff --git a/octoprint/static/img/tentacle-20x20-light@2x.png b/src/octoprint/static/img/tentacle-20x20-light@2x.png similarity index 100% rename from octoprint/static/img/tentacle-20x20-light@2x.png rename to src/octoprint/static/img/tentacle-20x20-light@2x.png diff --git a/octoprint/static/img/tentacle-20x20.png b/src/octoprint/static/img/tentacle-20x20.png similarity index 100% rename from octoprint/static/img/tentacle-20x20.png rename to src/octoprint/static/img/tentacle-20x20.png diff --git a/octoprint/static/img/tentacle-20x20@2x.png b/src/octoprint/static/img/tentacle-20x20@2x.png similarity index 100% rename from octoprint/static/img/tentacle-20x20@2x.png rename to src/octoprint/static/img/tentacle-20x20@2x.png diff --git a/octoprint/static/img/tentacle-22x22.png b/src/octoprint/static/img/tentacle-22x22.png similarity index 100% rename from octoprint/static/img/tentacle-22x22.png rename to src/octoprint/static/img/tentacle-22x22.png diff --git a/octoprint/static/img/tentacle-32x32.png b/src/octoprint/static/img/tentacle-32x32.png similarity index 100% rename from octoprint/static/img/tentacle-32x32.png rename to src/octoprint/static/img/tentacle-32x32.png diff --git a/octoprint/static/img/tentacle-76x76.png b/src/octoprint/static/img/tentacle-76x76.png similarity index 100% rename from octoprint/static/img/tentacle-76x76.png rename to src/octoprint/static/img/tentacle-76x76.png diff --git a/octoprint/static/img/watermark.png b/src/octoprint/static/img/watermark.png similarity index 100% rename from octoprint/static/img/watermark.png rename to src/octoprint/static/img/watermark.png diff --git a/octoprint/static/js/app/dataupdater.js b/src/octoprint/static/js/app/dataupdater.js similarity index 100% rename from octoprint/static/js/app/dataupdater.js rename to src/octoprint/static/js/app/dataupdater.js diff --git a/octoprint/static/js/app/helpers.js b/src/octoprint/static/js/app/helpers.js similarity index 100% rename from octoprint/static/js/app/helpers.js rename to src/octoprint/static/js/app/helpers.js diff --git a/octoprint/static/js/app/main.js b/src/octoprint/static/js/app/main.js similarity index 100% rename from octoprint/static/js/app/main.js rename to src/octoprint/static/js/app/main.js diff --git a/octoprint/static/js/app/viewmodels/appearance.js b/src/octoprint/static/js/app/viewmodels/appearance.js similarity index 100% rename from octoprint/static/js/app/viewmodels/appearance.js rename to src/octoprint/static/js/app/viewmodels/appearance.js diff --git a/octoprint/static/js/app/viewmodels/connection.js b/src/octoprint/static/js/app/viewmodels/connection.js similarity index 100% rename from octoprint/static/js/app/viewmodels/connection.js rename to src/octoprint/static/js/app/viewmodels/connection.js diff --git a/octoprint/static/js/app/viewmodels/control.js b/src/octoprint/static/js/app/viewmodels/control.js similarity index 100% rename from octoprint/static/js/app/viewmodels/control.js rename to src/octoprint/static/js/app/viewmodels/control.js diff --git a/octoprint/static/js/app/viewmodels/firstrun.js b/src/octoprint/static/js/app/viewmodels/firstrun.js similarity index 100% rename from octoprint/static/js/app/viewmodels/firstrun.js rename to src/octoprint/static/js/app/viewmodels/firstrun.js diff --git a/octoprint/static/js/app/viewmodels/gcode.js b/src/octoprint/static/js/app/viewmodels/gcode.js similarity index 100% rename from octoprint/static/js/app/viewmodels/gcode.js rename to src/octoprint/static/js/app/viewmodels/gcode.js diff --git a/octoprint/static/js/app/viewmodels/gcodefiles.js b/src/octoprint/static/js/app/viewmodels/gcodefiles.js similarity index 100% rename from octoprint/static/js/app/viewmodels/gcodefiles.js rename to src/octoprint/static/js/app/viewmodels/gcodefiles.js diff --git a/octoprint/static/js/app/viewmodels/loginstate.js b/src/octoprint/static/js/app/viewmodels/loginstate.js similarity index 100% rename from octoprint/static/js/app/viewmodels/loginstate.js rename to src/octoprint/static/js/app/viewmodels/loginstate.js diff --git a/octoprint/static/js/app/viewmodels/navigation.js b/src/octoprint/static/js/app/viewmodels/navigation.js similarity index 100% rename from octoprint/static/js/app/viewmodels/navigation.js rename to src/octoprint/static/js/app/viewmodels/navigation.js diff --git a/octoprint/static/js/app/viewmodels/printerstate.js b/src/octoprint/static/js/app/viewmodels/printerstate.js similarity index 100% rename from octoprint/static/js/app/viewmodels/printerstate.js rename to src/octoprint/static/js/app/viewmodels/printerstate.js diff --git a/octoprint/static/js/app/viewmodels/settings.js b/src/octoprint/static/js/app/viewmodels/settings.js similarity index 100% rename from octoprint/static/js/app/viewmodels/settings.js rename to src/octoprint/static/js/app/viewmodels/settings.js diff --git a/octoprint/static/js/app/viewmodels/temperature.js b/src/octoprint/static/js/app/viewmodels/temperature.js similarity index 100% rename from octoprint/static/js/app/viewmodels/temperature.js rename to src/octoprint/static/js/app/viewmodels/temperature.js diff --git a/octoprint/static/js/app/viewmodels/terminal.js b/src/octoprint/static/js/app/viewmodels/terminal.js similarity index 100% rename from octoprint/static/js/app/viewmodels/terminal.js rename to src/octoprint/static/js/app/viewmodels/terminal.js diff --git a/octoprint/static/js/app/viewmodels/timelapse.js b/src/octoprint/static/js/app/viewmodels/timelapse.js similarity index 100% rename from octoprint/static/js/app/viewmodels/timelapse.js rename to src/octoprint/static/js/app/viewmodels/timelapse.js diff --git a/octoprint/static/js/app/viewmodels/users.js b/src/octoprint/static/js/app/viewmodels/users.js similarity index 100% rename from octoprint/static/js/app/viewmodels/users.js rename to src/octoprint/static/js/app/viewmodels/users.js diff --git a/octoprint/static/js/lib/avltree.js b/src/octoprint/static/js/lib/avltree.js similarity index 100% rename from octoprint/static/js/lib/avltree.js rename to src/octoprint/static/js/lib/avltree.js diff --git a/octoprint/static/js/lib/bootstrap/bootstrap-modal.js b/src/octoprint/static/js/lib/bootstrap/bootstrap-modal.js similarity index 100% rename from octoprint/static/js/lib/bootstrap/bootstrap-modal.js rename to src/octoprint/static/js/lib/bootstrap/bootstrap-modal.js diff --git a/octoprint/static/js/lib/bootstrap/bootstrap-modalmanager.js b/src/octoprint/static/js/lib/bootstrap/bootstrap-modalmanager.js similarity index 100% rename from octoprint/static/js/lib/bootstrap/bootstrap-modalmanager.js rename to src/octoprint/static/js/lib/bootstrap/bootstrap-modalmanager.js diff --git a/octoprint/static/js/lib/bootstrap/bootstrap.js b/src/octoprint/static/js/lib/bootstrap/bootstrap.js similarity index 100% rename from octoprint/static/js/lib/bootstrap/bootstrap.js rename to src/octoprint/static/js/lib/bootstrap/bootstrap.js diff --git a/octoprint/static/js/lib/bootstrap/bootstrap.min.js b/src/octoprint/static/js/lib/bootstrap/bootstrap.min.js similarity index 100% rename from octoprint/static/js/lib/bootstrap/bootstrap.min.js rename to src/octoprint/static/js/lib/bootstrap/bootstrap.min.js diff --git a/octoprint/static/js/lib/jquery/jquery.fileupload.js b/src/octoprint/static/js/lib/jquery/jquery.fileupload.js similarity index 100% rename from octoprint/static/js/lib/jquery/jquery.fileupload.js rename to src/octoprint/static/js/lib/jquery/jquery.fileupload.js diff --git a/octoprint/static/js/lib/jquery/jquery.flot.js b/src/octoprint/static/js/lib/jquery/jquery.flot.js similarity index 100% rename from octoprint/static/js/lib/jquery/jquery.flot.js rename to src/octoprint/static/js/lib/jquery/jquery.flot.js diff --git a/octoprint/static/js/lib/jquery/jquery.iframe-transport.js b/src/octoprint/static/js/lib/jquery/jquery.iframe-transport.js similarity index 100% rename from octoprint/static/js/lib/jquery/jquery.iframe-transport.js rename to src/octoprint/static/js/lib/jquery/jquery.iframe-transport.js diff --git a/octoprint/static/js/lib/jquery/jquery.min.js b/src/octoprint/static/js/lib/jquery/jquery.min.js similarity index 100% rename from octoprint/static/js/lib/jquery/jquery.min.js rename to src/octoprint/static/js/lib/jquery/jquery.min.js diff --git a/octoprint/static/js/lib/jquery/jquery.pnotify.min.js b/src/octoprint/static/js/lib/jquery/jquery.pnotify.min.js similarity index 100% rename from octoprint/static/js/lib/jquery/jquery.pnotify.min.js rename to src/octoprint/static/js/lib/jquery/jquery.pnotify.min.js diff --git a/octoprint/static/js/lib/jquery/jquery.ui.core.js b/src/octoprint/static/js/lib/jquery/jquery.ui.core.js similarity index 100% rename from octoprint/static/js/lib/jquery/jquery.ui.core.js rename to src/octoprint/static/js/lib/jquery/jquery.ui.core.js diff --git a/octoprint/static/js/lib/jquery/jquery.ui.mouse.js b/src/octoprint/static/js/lib/jquery/jquery.ui.mouse.js similarity index 100% rename from octoprint/static/js/lib/jquery/jquery.ui.mouse.js rename to src/octoprint/static/js/lib/jquery/jquery.ui.mouse.js diff --git a/octoprint/static/js/lib/jquery/jquery.ui.slider.js b/src/octoprint/static/js/lib/jquery/jquery.ui.slider.js similarity index 100% rename from octoprint/static/js/lib/jquery/jquery.ui.slider.js rename to src/octoprint/static/js/lib/jquery/jquery.ui.slider.js diff --git a/octoprint/static/js/lib/jquery/jquery.ui.widget.js b/src/octoprint/static/js/lib/jquery/jquery.ui.widget.js similarity index 100% rename from octoprint/static/js/lib/jquery/jquery.ui.widget.js rename to src/octoprint/static/js/lib/jquery/jquery.ui.widget.js diff --git a/octoprint/static/js/lib/knockout.js b/src/octoprint/static/js/lib/knockout.js similarity index 100% rename from octoprint/static/js/lib/knockout.js rename to src/octoprint/static/js/lib/knockout.js diff --git a/octoprint/static/js/lib/less-1.3.3.min.js b/src/octoprint/static/js/lib/less-1.3.3.min.js similarity index 100% rename from octoprint/static/js/lib/less-1.3.3.min.js rename to src/octoprint/static/js/lib/less-1.3.3.min.js diff --git a/octoprint/static/js/lib/modernizr.custom.js b/src/octoprint/static/js/lib/modernizr.custom.js similarity index 100% rename from octoprint/static/js/lib/modernizr.custom.js rename to src/octoprint/static/js/lib/modernizr.custom.js diff --git a/octoprint/static/js/lib/sockjs-0.3.4.min.js b/src/octoprint/static/js/lib/sockjs-0.3.4.min.js similarity index 100% rename from octoprint/static/js/lib/sockjs-0.3.4.min.js rename to src/octoprint/static/js/lib/sockjs-0.3.4.min.js diff --git a/octoprint/static/js/lib/underscore.js b/src/octoprint/static/js/lib/underscore.js similarity index 100% rename from octoprint/static/js/lib/underscore.js rename to src/octoprint/static/js/lib/underscore.js diff --git a/octoprint/static/robots.txt b/src/octoprint/static/robots.txt similarity index 100% rename from octoprint/static/robots.txt rename to src/octoprint/static/robots.txt diff --git a/octoprint/templates/dialogs.jinja2 b/src/octoprint/templates/dialogs.jinja2 similarity index 100% rename from octoprint/templates/dialogs.jinja2 rename to src/octoprint/templates/dialogs.jinja2 diff --git a/octoprint/templates/index.jinja2 b/src/octoprint/templates/index.jinja2 similarity index 100% rename from octoprint/templates/index.jinja2 rename to src/octoprint/templates/index.jinja2 diff --git a/octoprint/templates/settings.jinja2 b/src/octoprint/templates/settings.jinja2 similarity index 100% rename from octoprint/templates/settings.jinja2 rename to src/octoprint/templates/settings.jinja2 diff --git a/octoprint/tests/__init__.py b/src/octoprint/tests/__init__.py similarity index 100% rename from octoprint/tests/__init__.py rename to src/octoprint/tests/__init__.py diff --git a/octoprint/tests/test_file_manager.py b/src/octoprint/tests/test_file_manager.py similarity index 100% rename from octoprint/tests/test_file_manager.py rename to src/octoprint/tests/test_file_manager.py diff --git a/octoprint/timelapse.py b/src/octoprint/timelapse.py similarity index 100% rename from octoprint/timelapse.py rename to src/octoprint/timelapse.py diff --git a/octoprint/users.py b/src/octoprint/users.py similarity index 100% rename from octoprint/users.py rename to src/octoprint/users.py diff --git a/octoprint/util/README b/src/octoprint/util/README similarity index 100% rename from octoprint/util/README rename to src/octoprint/util/README diff --git a/octoprint/util/__init__.py b/src/octoprint/util/__init__.py similarity index 100% rename from octoprint/util/__init__.py rename to src/octoprint/util/__init__.py diff --git a/octoprint/util/avr_isp/__init__.py b/src/octoprint/util/avr_isp/__init__.py similarity index 100% rename from octoprint/util/avr_isp/__init__.py rename to src/octoprint/util/avr_isp/__init__.py diff --git a/octoprint/util/avr_isp/chipDB.py b/src/octoprint/util/avr_isp/chipDB.py similarity index 100% rename from octoprint/util/avr_isp/chipDB.py rename to src/octoprint/util/avr_isp/chipDB.py diff --git a/octoprint/util/avr_isp/intelHex.py b/src/octoprint/util/avr_isp/intelHex.py similarity index 100% rename from octoprint/util/avr_isp/intelHex.py rename to src/octoprint/util/avr_isp/intelHex.py diff --git a/octoprint/util/avr_isp/ispBase.py b/src/octoprint/util/avr_isp/ispBase.py similarity index 100% rename from octoprint/util/avr_isp/ispBase.py rename to src/octoprint/util/avr_isp/ispBase.py diff --git a/octoprint/util/avr_isp/stk500v2.py b/src/octoprint/util/avr_isp/stk500v2.py similarity index 100% rename from octoprint/util/avr_isp/stk500v2.py rename to src/octoprint/util/avr_isp/stk500v2.py diff --git a/octoprint/util/comm.py b/src/octoprint/util/comm.py similarity index 100% rename from octoprint/util/comm.py rename to src/octoprint/util/comm.py diff --git a/octoprint/util/gcodeInterpreter.py b/src/octoprint/util/gcodeInterpreter.py similarity index 100% rename from octoprint/util/gcodeInterpreter.py rename to src/octoprint/util/gcodeInterpreter.py diff --git a/octoprint/util/virtual.py b/src/octoprint/util/virtual.py similarity index 100% rename from octoprint/util/virtual.py rename to src/octoprint/util/virtual.py