diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 31037594..8504d061 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -175,7 +175,18 @@ class App(QtCore.QObject): "geometry_paintmargin": 0.0, "cncjob_plot": True, "cncjob_tooldia": 0.016, - "cncjob_append": "" + "cncjob_append": "", + + # Constants... + "defaults_save_period_ms": 20000, # Time between default saves. + "shell_shape": [500, 300], # Shape of the shell in pixels. + "shell_at_startup": False, # Show the shell at startup. + "recent_limit": 10, # Max. items in recent list. + "fit_key": '1', + "zoom_out_key": '2', + "zoom_in_key": '3', + "zoom_ratio": 1.5, + "point_clipboard_format": "(%.4f, %.4f)" }) self.load_defaults() @@ -188,9 +199,9 @@ class App(QtCore.QObject): try: self.save_defaults() finally: - QtCore.QTimer.singleShot(20000, auto_save_defaults) + QtCore.QTimer.singleShot(self.defaults["defaults_save_period_ms"], auto_save_defaults) - QtCore.QTimer.singleShot(20000, auto_save_defaults) + QtCore.QTimer.singleShot(self.defaults["defaults_save_period_ms"], auto_save_defaults) self.options_form = GlobalOptionsUI() self.options_form_fields = { @@ -286,9 +297,10 @@ class App(QtCore.QObject): self.thr2 = QtCore.QThread() self.worker2.moveToThread(self.thr2) self.connect(self.thr2, QtCore.SIGNAL("started()"), self.worker2.run) - self.connect(self.thr2, QtCore.SIGNAL("started()"), lambda: self.worker_task.emit({'fcn': self.version_check, - 'params': [], - 'worker_name': "worker2"})) + self.connect(self.thr2, QtCore.SIGNAL("started()"), + lambda: self.worker_task.emit({'fcn': self.version_check, + 'params': [], + 'worker_name': "worker2"})) self.thr2.start() ### Signal handling ### @@ -314,6 +326,7 @@ class App(QtCore.QObject): self.ui.menueditnew.triggered.connect(lambda: self.new_object('geometry', 'New Geometry', lambda x, y: None)) self.ui.menueditedit.triggered.connect(self.edit_geometry) self.ui.menueditok.triggered.connect(self.editor2geometry) + self.ui.menueditjoin.triggered.connect(self.on_edit_join) self.ui.menueditdelete.triggered.connect(self.on_delete) self.ui.menuoptions_transfer_a2o.triggered.connect(self.on_options_app2object) self.ui.menuoptions_transfer_a2p.triggered.connect(self.on_options_app2project) @@ -370,8 +383,9 @@ class App(QtCore.QObject): self.shell = FCShell(self) self.shell.setWindowIcon(self.ui.app_icon) self.shell.setWindowTitle("FlatCAM Shell") - self.shell.show() - self.shell.resize(550, 300) + if self.defaults["shell_at_startup"]: + self.shell.show() + self.shell.resize(*self.defaults["shell_shape"]) self.shell.append_output("FlatCAM %s\n(c) 2014 Juan Pablo Caram\n\n" % self.version) self.shell.append_output("Type help to get started.\n\n") self.tcl = Tkinter.Tcl() @@ -448,7 +462,7 @@ class App(QtCore.QObject): """ Transfers the geometry in the editor to the current geometry object. - :return: + :return: None """ geo = self.collection.get_active() if not isinstance(geo, FlatCAMGeometry): @@ -476,7 +490,7 @@ class App(QtCore.QObject): def exec_command(self, text): """ - Hadles input from the shell. See FlatCAMApp.setup_shell for shell commands. + Handles input from the shell. See FlatCAMApp.setup_shell for shell commands. :param text: Input command :return: None @@ -530,6 +544,12 @@ class App(QtCore.QObject): #self.shell.append_error("?\n") def info(self, text): + """ + Writes on the status bar. + + :param text: Text to write. + :return: None + """ self.ui.info_label.setText(QtCore.QString(text)) def load_defaults(self): @@ -577,7 +597,7 @@ class App(QtCore.QObject): self.recent.insert(0, record) - if len(self.recent) > 10: # Limit reached + if len(self.recent) > self.defaults['recent_limit']: # Limit reached self.recent.pop() try: @@ -790,6 +810,20 @@ class App(QtCore.QObject): self.inform.emit("Defaults saved.") + def on_edit_join(self): + """ + Callback for Edit->Join. Joins the selected geometry objects into + a new one. + + :return: None + """ + objs = self.collection.get_selected() + + def initialize(obj, app): + FlatCAMGeometry.merge(objs, obj) + + self.new_object("geometry", "Combo", initialize) + def on_options_app2project(self): """ Callback for Options->Transfer Options->App=>Project. Copies options @@ -1122,16 +1156,16 @@ class App(QtCore.QObject): :return: None """ - if event.key == '1': # 1 + if event.key == self.defaults['fit_key']: # 1 self.on_zoom_fit(None) return - if event.key == '2': # 2 - self.plotcanvas.zoom(1 / 1.5, self.mouse) + if event.key == self.defaults['zoom_out_key']: # 2 + self.plotcanvas.zoom(1 / self.defaults['zoom_ratio'], self.mouse) return - if event.key == '3': # 3 - self.plotcanvas.zoom(1.5, self.mouse) + if event.key == self.defaults['zoom_in_key']: # 3 + self.plotcanvas.zoom(self.defaults['zoom_ratio'], self.mouse) return # if event.key == 'm': @@ -1163,7 +1197,7 @@ class App(QtCore.QObject): App.log.debug('button=%d, x=%d, y=%d, xdata=%f, ydata=%f' % ( event.button, event.x, event.y, event.xdata, event.ydata)) - self.clipboard.setText("(%.4f, %.4f)" % (event.xdata, event.ydata)) + self.clipboard.setText(self.defaults["point_clipboard_format"] % (event.xdata, event.ydata)) except Exception, e: App.log.debug("Outside plot?") @@ -1905,6 +1939,19 @@ class App(QtCore.QObject): except Exception, e: return "ERROR: %s" % str(e) + def get_sys(param): + if param in self.defaults: + return self.defaults[param] + + return "ERROR: No such system parameter." + + def set_sys(param, value): + if param in self.defaults: + self.defaults[param] = value + return + + return "ERROR: No such system parameter." + commands = { 'help': { 'fcn': shelp, @@ -2063,6 +2110,19 @@ class App(QtCore.QObject): '> follow [-outname ]\n' + ' name: Name of the gerber object.\n' + ' outname: Name of the output geometry object.' + }, + 'get_sys': { + 'fcn': get_sys, + 'help': 'Get the value of a system parameter (FlatCAM constant)\n' + + '> get_sys \n' + + ' sysparam: Name of the parameter.' + }, + 'set_sys': { + 'fcn': set_sys, + 'help': 'Set the value of a system parameter (FlatCAM constant)\n' + + '> set_sys \n' + + ' sysparam: Name of the parameter.\n' + + ' paramvalue: Value to set.' } } diff --git a/FlatCAMGUI.py b/FlatCAMGUI.py index 292e3e98..93283e51 100644 --- a/FlatCAMGUI.py +++ b/FlatCAMGUI.py @@ -71,6 +71,7 @@ class FlatCAMGUI(QtGui.QMainWindow): self.menueditedit = self.menuedit.addAction(QtGui.QIcon('share/edit16.png'), 'Edit Geometry') self.menueditok = self.menuedit.addAction(QtGui.QIcon('share/edit_ok16.png'), 'Update Geometry') #self.menueditcancel = self.menuedit.addAction(QtGui.QIcon('share/cancel_edit16.png'), "Cancel Edit") + self.menueditjoin = self.menuedit.addAction(QtGui.QIcon('share/join16.png'), 'Join Geometry') self.menueditdelete = self.menuedit.addAction(QtGui.QIcon('share/trash16.png'), 'Delete') ### Options ### diff --git a/FlatCAMObj.py b/FlatCAMObj.py index dff9c6a8..221fa688 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -539,8 +539,6 @@ class FlatCAMGerber(FlatCAMObj, Gerber): self.axes.plot(x, y, linespec) self.app.plotcanvas.auto_adjust_axes() - #GLib.idle_add(self.app.plotcanvas.auto_adjust_axes) - #self.emit(QtCore.SIGNAL("plotChanged"), self) def serialize(self): return { @@ -857,6 +855,25 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): ui_type = GeometryObjectUI + @staticmethod + def merge(geo_list, geo_final): + """ + Merges the geometry of objects in geo_list into + the geometry of geo_final. + + :param geo_list: List of FlatCAMGeometry Objects to join. + :param geo_final: Destination FlatCAMGeometry object. + :return: None + """ + geo_final.solid_geometry = [] + + for geo in geo_list: + try: + for shape in geo.solid_geometry: + geo_final.solid_geometry.append(shape) + except: + geo_final.solid_geometry.append(geo) + def __init__(self, name): FlatCAMObj.__init__(self, name) Geometry.__init__(self) @@ -884,8 +901,6 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): def build_ui(self): FlatCAMObj.build_ui(self) - - def set_ui(self, ui): FlatCAMObj.set_ui(self, ui) diff --git a/ObjectCollection.py b/ObjectCollection.py index bec42ea9..92526d34 100644 --- a/ObjectCollection.py +++ b/ObjectCollection.py @@ -28,13 +28,23 @@ class ObjectCollection(QtCore.QAbstractListModel): for kind in ObjectCollection.icon_files: self.icons[kind] = QtGui.QPixmap(ObjectCollection.icon_files[kind]) + ### Data ### self.object_list = [] + self.checked_indexes = [] + ### View self.view = QtGui.QListView() + self.view.setSelectionMode(Qt.QAbstractItemView.ExtendedSelection) self.view.setModel(self) + + self.click_modifier = None + self.view.selectionModel().selectionChanged.connect(self.on_list_selection_change) self.view.activated.connect(self.on_item_activated) + def on_mouse_down(self, event): + print "Mouse button pressed on list" + def rowCount(self, parent=QtCore.QModelIndex(), *args, **kwargs): return len(self.object_list) @@ -49,6 +59,11 @@ class ObjectCollection(QtCore.QAbstractListModel): return self.object_list[row].options["name"] if role == Qt.Qt.DecorationRole: return self.icons[self.object_list[row].kind] + # if role == Qt.Qt.CheckStateRole: + # if row in self.checked_indexes: + # return Qt.Qt.Checked + # else: + # return Qt.Qt.Unchecked def print_list(self): for obj in self.object_list: @@ -62,6 +77,7 @@ class ObjectCollection(QtCore.QAbstractListModel): # Required before appending self.beginInsertRows(QtCore.QModelIndex(), len(self.object_list), len(self.object_list)) + # Simply append to the python list self.object_list.append(obj) # Required after appending @@ -146,6 +162,14 @@ class ObjectCollection(QtCore.QAbstractListModel): row = selections[0].row() return self.object_list[row] + def get_selected(self): + """ + Returns list of objects selected in the view. + + :return: List of objects + """ + return [self.object_list[sel.row()] for sel in self.view.selectedIndexes()] + def set_active(self, name): """ Selects object by name from the project list. This triggers the @@ -169,6 +193,12 @@ class ObjectCollection(QtCore.QAbstractListModel): self.object_list[selection_index].build_ui() def on_item_activated(self, index): + """ + Double-click or Enter on item. + + :param index: Index of the item in the list. + :return: None + """ self.object_list[index.row()].build_ui() def delete_all(self): @@ -177,6 +207,7 @@ class ObjectCollection(QtCore.QAbstractListModel): self.beginResetModel() self.object_list = [] + self.checked_indexes = [] self.endResetModel() diff --git a/bugs/.doctrees/active.doctree b/bugs/.doctrees/active.doctree new file mode 100644 index 00000000..826b0654 Binary files /dev/null and b/bugs/.doctrees/active.doctree differ diff --git a/bugs/.doctrees/index.doctree b/bugs/.doctrees/index.doctree new file mode 100644 index 00000000..0a6e0897 Binary files /dev/null and b/bugs/.doctrees/index.doctree differ diff --git a/bugs/Makefile b/bugs/Makefile new file mode 100644 index 00000000..5ca5d103 --- /dev/null +++ b/bugs/Makefile @@ -0,0 +1,177 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/FlatCAMBugs.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/FlatCAMBugs.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/FlatCAMBugs" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/FlatCAMBugs" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/bugs/_images/drill_parse_problem1.png b/bugs/_images/drill_parse_problem1.png new file mode 100644 index 00000000..e28125b3 Binary files /dev/null and b/bugs/_images/drill_parse_problem1.png differ diff --git a/bugs/_images/drill_parse_problem2.png b/bugs/_images/drill_parse_problem2.png new file mode 100644 index 00000000..74a963e4 Binary files /dev/null and b/bugs/_images/drill_parse_problem2.png differ diff --git a/bugs/_sources/active.txt b/bugs/_sources/active.txt new file mode 100644 index 00000000..148c93de --- /dev/null +++ b/bugs/_sources/active.txt @@ -0,0 +1,79 @@ +Active Bugs +=================== + +Drill number parsing +-------------------- + +The screenshot below show the problematic file: + +.. image:: drill_parse_problem1.png + :align: center + +The file reads:: + + G81 + M48 + METRIC + T1C00.127 + T2C00.889 + T3C00.900 + T4C01.524 + T5C01.600 + T6C02.032 + T7C02.540 + % + T002 + X03874Y08092 + X03874Y23333 + X06414Y08092 + X06414Y23333 + X08954Y08092 + ... + T007 + X02664Y03518 + X02664Y41618 + X76324Y03518 + X76324Y41618 + ... + +After scaling by 10.0: + +.. image:: drill_parse_problem2.png + :align: center + +The code involved is: + +.. code-block:: python + + def __init__(self): + ... + self.zeros = "T" + ... + + def parse_number(self, number_str): + + if self.zeros == "L": + match = self.leadingzeros_re.search(number_str) + return float(number_str)/(10**(len(match.group(2))-2+len(match.group(1)))) + else: # Trailing + return float(number_str)/10000 + +The numbers are being divided by 10000. If "L" had been specified, +the following regex would have applied: + +.. code-block:: python + + # Parse coordinates + self.leadingzeros_re = re.compile(r'^(0*)(\d*)') + +Then the number 02664 would have been divided by 10**(4-2+1) = 10**3 = 1000, +which is what is desired. + +Leading zeros weren't specified, but www.excellon.com says: + + The CNC-7 uses leading zeros unless you specify + otherwise through a part program or the console. + +.. note:: + The parser has been modified to default to leading + zeros. \ No newline at end of file diff --git a/doc/build/_sources/index.txt b/bugs/_sources/index.txt similarity index 54% rename from doc/build/_sources/index.txt rename to bugs/_sources/index.txt index ad3a7349..86df8646 100644 --- a/doc/build/_sources/index.txt +++ b/bugs/_sources/index.txt @@ -1,23 +1,17 @@ -.. Cirkuix documentation master file, created by - sphinx-quickstart on Fri Jan 24 22:13:35 2014. +.. FlatCAM Bugs documentation master file, created by + sphinx-quickstart on Thu Nov 13 12:42:40 2014. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. - - -Welcome to FlatCAM's documentation! -=================================== +Welcome to FlatCAM Bugs's documentation! +======================================== Contents: .. toctree:: :maxdepth: 2 - camlib - flatcamobj - app - devman - + active Indices and tables diff --git a/doc/build/_static/ajax-loader.gif b/bugs/_static/ajax-loader.gif similarity index 100% rename from doc/build/_static/ajax-loader.gif rename to bugs/_static/ajax-loader.gif diff --git a/doc/build/_static/basic.css b/bugs/_static/basic.css similarity index 100% rename from doc/build/_static/basic.css rename to bugs/_static/basic.css diff --git a/doc/build/_static/comment-bright.png b/bugs/_static/comment-bright.png similarity index 100% rename from doc/build/_static/comment-bright.png rename to bugs/_static/comment-bright.png diff --git a/doc/build/_static/comment-close.png b/bugs/_static/comment-close.png similarity index 100% rename from doc/build/_static/comment-close.png rename to bugs/_static/comment-close.png diff --git a/doc/build/_static/comment.png b/bugs/_static/comment.png similarity index 100% rename from doc/build/_static/comment.png rename to bugs/_static/comment.png diff --git a/bugs/_static/default.css b/bugs/_static/default.css new file mode 100644 index 00000000..e534a078 --- /dev/null +++ b/bugs/_static/default.css @@ -0,0 +1,256 @@ +/* + * default.css_t + * ~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- default theme. + * + * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: #ffffff; + color: #000000; + padding: 0 20px 30px 20px; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ffffff; + text-decoration: underline; +} + +div.related { + background-color: #133f52; + line-height: 30px; + color: #ffffff; +} + +div.related a { + color: #ffffff; +} + +div.sphinxsidebar { +} + +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: #ffffff; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #ffffff; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #ffffff; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + + + +/* -- hyperlink styles ------------------------------------------------------ */ + +a { + color: #355f7c; + text-decoration: none; +} + +a:visited { + color: #355f7c; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + + + +/* -- body styles ----------------------------------------------------------- */ + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: #eeffcc; + color: #333333; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +tt { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +th { + background-color: #ede; +} + +.warning tt { + background: #efc2c2; +} + +.note tt { + background: #d6d6d6; +} + +.viewcode-back { + font-family: sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} \ No newline at end of file diff --git a/doc/build/_static/doctools.js b/bugs/_static/doctools.js similarity index 100% rename from doc/build/_static/doctools.js rename to bugs/_static/doctools.js diff --git a/doc/build/_static/down-pressed.png b/bugs/_static/down-pressed.png similarity index 100% rename from doc/build/_static/down-pressed.png rename to bugs/_static/down-pressed.png diff --git a/doc/build/_static/down.png b/bugs/_static/down.png similarity index 100% rename from doc/build/_static/down.png rename to bugs/_static/down.png diff --git a/doc/build/_static/file.png b/bugs/_static/file.png similarity index 100% rename from doc/build/_static/file.png rename to bugs/_static/file.png diff --git a/doc/build/_static/jquery.js b/bugs/_static/jquery.js similarity index 100% rename from doc/build/_static/jquery.js rename to bugs/_static/jquery.js diff --git a/doc/build/_static/minus.png b/bugs/_static/minus.png similarity index 100% rename from doc/build/_static/minus.png rename to bugs/_static/minus.png diff --git a/doc/build/_static/plus.png b/bugs/_static/plus.png similarity index 100% rename from doc/build/_static/plus.png rename to bugs/_static/plus.png diff --git a/doc/build/_static/pygments.css b/bugs/_static/pygments.css similarity index 100% rename from doc/build/_static/pygments.css rename to bugs/_static/pygments.css diff --git a/doc/build/_static/searchtools.js b/bugs/_static/searchtools.js similarity index 100% rename from doc/build/_static/searchtools.js rename to bugs/_static/searchtools.js diff --git a/bugs/_static/sidebar.js b/bugs/_static/sidebar.js new file mode 100644 index 00000000..874a890a --- /dev/null +++ b/bugs/_static/sidebar.js @@ -0,0 +1,159 @@ +/* + * sidebar.js + * ~~~~~~~~~~ + * + * This script makes the Sphinx sidebar collapsible. + * + * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds + * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton + * used to collapse and expand the sidebar. + * + * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden + * and the width of the sidebar and the margin-left of the document + * are decreased. When the sidebar is expanded the opposite happens. + * This script saves a per-browser/per-session cookie used to + * remember the position of the sidebar among the pages. + * Once the browser is closed the cookie is deleted and the position + * reset to the default (expanded). + * + * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +$(function() { + + + + + + + + + // global elements used by the functions. + // the 'sidebarbutton' element is defined as global after its + // creation, in the add_sidebar_button function + var bodywrapper = $('.bodywrapper'); + var sidebar = $('.sphinxsidebar'); + var sidebarwrapper = $('.sphinxsidebarwrapper'); + + // for some reason, the document has no sidebar; do not run into errors + if (!sidebar.length) return; + + // original margin-left of the bodywrapper and width of the sidebar + // with the sidebar expanded + var bw_margin_expanded = bodywrapper.css('margin-left'); + var ssb_width_expanded = sidebar.width(); + + // margin-left of the bodywrapper and width of the sidebar + // with the sidebar collapsed + var bw_margin_collapsed = '.8em'; + var ssb_width_collapsed = '.8em'; + + // colors used by the current theme + var dark_color = $('.related').css('background-color'); + var light_color = $('.document').css('background-color'); + + function sidebar_is_collapsed() { + return sidebarwrapper.is(':not(:visible)'); + } + + function toggle_sidebar() { + if (sidebar_is_collapsed()) + expand_sidebar(); + else + collapse_sidebar(); + } + + function collapse_sidebar() { + sidebarwrapper.hide(); + sidebar.css('width', ssb_width_collapsed); + bodywrapper.css('margin-left', bw_margin_collapsed); + sidebarbutton.css({ + 'margin-left': '0', + 'height': bodywrapper.height() + }); + sidebarbutton.find('span').text('»'); + sidebarbutton.attr('title', _('Expand sidebar')); + document.cookie = 'sidebar=collapsed'; + } + + function expand_sidebar() { + bodywrapper.css('margin-left', bw_margin_expanded); + sidebar.css('width', ssb_width_expanded); + sidebarwrapper.show(); + sidebarbutton.css({ + 'margin-left': ssb_width_expanded-12, + 'height': bodywrapper.height() + }); + sidebarbutton.find('span').text('«'); + sidebarbutton.attr('title', _('Collapse sidebar')); + document.cookie = 'sidebar=expanded'; + } + + function add_sidebar_button() { + sidebarwrapper.css({ + 'float': 'left', + 'margin-right': '0', + 'width': ssb_width_expanded - 28 + }); + // create the button + sidebar.append( + '
«
' + ); + var sidebarbutton = $('#sidebarbutton'); + light_color = sidebarbutton.css('background-color'); + // find the height of the viewport to center the '<<' in the page + var viewport_height; + if (window.innerHeight) + viewport_height = window.innerHeight; + else + viewport_height = $(window).height(); + sidebarbutton.find('span').css({ + 'display': 'block', + 'margin-top': (viewport_height - sidebar.position().top - 20) / 2 + }); + + sidebarbutton.click(toggle_sidebar); + sidebarbutton.attr('title', _('Collapse sidebar')); + sidebarbutton.css({ + 'color': '#FFFFFF', + 'border-left': '1px solid ' + dark_color, + 'font-size': '1.2em', + 'cursor': 'pointer', + 'height': bodywrapper.height(), + 'padding-top': '1px', + 'margin-left': ssb_width_expanded - 12 + }); + + sidebarbutton.hover( + function () { + $(this).css('background-color', dark_color); + }, + function () { + $(this).css('background-color', light_color); + } + ); + } + + function set_position_from_cookie() { + if (!document.cookie) + return; + var items = document.cookie.split(';'); + for(var k=0; k + + + + + + + Active Bugs — FlatCAM Bugs 1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

Active Bugs

+
+

Drill number parsing

+

The screenshot below show the problematic file:

+_images/drill_parse_problem1.png +

The file reads:

+
G81
+M48
+METRIC
+T1C00.127
+T2C00.889
+T3C00.900
+T4C01.524
+T5C01.600
+T6C02.032
+T7C02.540
+%
+T002
+X03874Y08092
+X03874Y23333
+X06414Y08092
+X06414Y23333
+X08954Y08092
+...
+T007
+X02664Y03518
+X02664Y41618
+X76324Y03518
+X76324Y41618
+...
+
+

After scaling by 10.0:

+_images/drill_parse_problem2.png +

The code involved is:

+
def __init__(self):
+    ...
+    self.zeros = "T"
+    ...
+
+def parse_number(self, number_str):
+
+    if self.zeros == "L":
+        match = self.leadingzeros_re.search(number_str)
+        return float(number_str)/(10**(len(match.group(2))-2+len(match.group(1))))
+    else:  # Trailing
+        return float(number_str)/10000
+
+
+

The numbers are being divided by 10000. If “L” had been specified, +the following regex would have applied:

+
# Parse coordinates
+self.leadingzeros_re = re.compile(r'^(0*)(\d*)')
+
+
+

Then the number 02664 would have been divided by 10**(4-2+1) = 10**3 = 1000, +which is what is desired.

+

Leading zeros weren’t specified, but www.excellon.com says:

+
+
The CNC-7 uses leading zeros unless you specify +otherwise through a part program or the console.
+
+

Note

+

The parser has been modified to default to leading +zeros.

+
+
+
+ + +
+
+
+
+
+

Table Of Contents

+ + +

Previous topic

+

Welcome to FlatCAM Bugs’s documentation!

+

This Page

+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/bugs/active.rst b/bugs/active.rst new file mode 100644 index 00000000..148c93de --- /dev/null +++ b/bugs/active.rst @@ -0,0 +1,79 @@ +Active Bugs +=================== + +Drill number parsing +-------------------- + +The screenshot below show the problematic file: + +.. image:: drill_parse_problem1.png + :align: center + +The file reads:: + + G81 + M48 + METRIC + T1C00.127 + T2C00.889 + T3C00.900 + T4C01.524 + T5C01.600 + T6C02.032 + T7C02.540 + % + T002 + X03874Y08092 + X03874Y23333 + X06414Y08092 + X06414Y23333 + X08954Y08092 + ... + T007 + X02664Y03518 + X02664Y41618 + X76324Y03518 + X76324Y41618 + ... + +After scaling by 10.0: + +.. image:: drill_parse_problem2.png + :align: center + +The code involved is: + +.. code-block:: python + + def __init__(self): + ... + self.zeros = "T" + ... + + def parse_number(self, number_str): + + if self.zeros == "L": + match = self.leadingzeros_re.search(number_str) + return float(number_str)/(10**(len(match.group(2))-2+len(match.group(1)))) + else: # Trailing + return float(number_str)/10000 + +The numbers are being divided by 10000. If "L" had been specified, +the following regex would have applied: + +.. code-block:: python + + # Parse coordinates + self.leadingzeros_re = re.compile(r'^(0*)(\d*)') + +Then the number 02664 would have been divided by 10**(4-2+1) = 10**3 = 1000, +which is what is desired. + +Leading zeros weren't specified, but www.excellon.com says: + + The CNC-7 uses leading zeros unless you specify + otherwise through a part program or the console. + +.. note:: + The parser has been modified to default to leading + zeros. \ No newline at end of file diff --git a/bugs/conf.py b/bugs/conf.py new file mode 100644 index 00000000..df9a4b50 --- /dev/null +++ b/bugs/conf.py @@ -0,0 +1,258 @@ +# -*- coding: utf-8 -*- +# +# FlatCAM Bugs documentation build configuration file, created by +# sphinx-quickstart on Thu Nov 13 12:42:40 2014. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'FlatCAM Bugs' +copyright = u'2014, Juan Pablo Caram' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '1' +# The full version, including alpha/beta/rc tags. +release = '1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'FlatCAMBugsdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ('index', 'FlatCAMBugs.tex', u'FlatCAM Bugs Documentation', + u'Juan Pablo Caram', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'flatcambugs', u'FlatCAM Bugs Documentation', + [u'Juan Pablo Caram'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'FlatCAMBugs', u'FlatCAM Bugs Documentation', + u'Juan Pablo Caram', 'FlatCAMBugs', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False diff --git a/bugs/drill_parse_problem1.png b/bugs/drill_parse_problem1.png new file mode 100644 index 00000000..e28125b3 Binary files /dev/null and b/bugs/drill_parse_problem1.png differ diff --git a/bugs/drill_parse_problem2.png b/bugs/drill_parse_problem2.png new file mode 100644 index 00000000..74a963e4 Binary files /dev/null and b/bugs/drill_parse_problem2.png differ diff --git a/bugs/genindex.html b/bugs/genindex.html new file mode 100644 index 00000000..8819d067 --- /dev/null +++ b/bugs/genindex.html @@ -0,0 +1,92 @@ + + + + + + + + + Index — FlatCAM Bugs 1 documentation + + + + + + + + + + + + + +
+
+
+
+ + +

Index

+ +
+ +
+ + +
+
+
+
+
+ + + + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/bugs/index.html b/bugs/index.html new file mode 100644 index 00000000..4f5fd045 --- /dev/null +++ b/bugs/index.html @@ -0,0 +1,125 @@ + + + + + + + + Welcome to FlatCAM Bugs’s documentation! — FlatCAM Bugs 1 documentation + + + + + + + + + + + + + + +
+
+
+
+ +
+

Welcome to FlatCAM Bugs’s documentation!

+

Contents:

+ +
+
+

Indices and tables

+ +
+ + +
+
+
+
+
+

Table Of Contents

+ + +

Next topic

+

Active Bugs

+

This Page

+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/bugs/index.rst b/bugs/index.rst new file mode 100644 index 00000000..86df8646 --- /dev/null +++ b/bugs/index.rst @@ -0,0 +1,23 @@ +.. FlatCAM Bugs documentation master file, created by + sphinx-quickstart on Thu Nov 13 12:42:40 2014. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to FlatCAM Bugs's documentation! +======================================== + +Contents: + +.. toctree:: + :maxdepth: 2 + + active + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/bugs/make.bat b/bugs/make.bat new file mode 100644 index 00000000..f996789f --- /dev/null +++ b/bugs/make.bat @@ -0,0 +1,242 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\FlatCAMBugs.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\FlatCAMBugs.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +:end diff --git a/bugs/search.html b/bugs/search.html new file mode 100644 index 00000000..cb8424ba --- /dev/null +++ b/bugs/search.html @@ -0,0 +1,99 @@ + + + + + + + + Search — FlatCAM Bugs 1 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +

Search

+
+ +

+ Please activate JavaScript to enable the search + functionality. +

+
+

+ From here you can search these documents. Enter your search + words into the box below and click "search". Note that the search + function will automatically search for all of the words. Pages + containing fewer words won't appear in the result list. +

+
+ + + +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/camlib.py b/camlib.py index 53ef1c21..a16dc377 100644 --- a/camlib.py +++ b/camlib.py @@ -46,9 +46,13 @@ class Geometry(object): Base geometry class. """ + defaults = { + "init_units": 'in' + } + def __init__(self): # Units (in or mm) - self.units = 'in' + self.units = Geometry.defaults["init_units"] # Final geometry: MultiPolygon self.solid_geometry = None @@ -1493,7 +1497,7 @@ class Excellon(Geometry): ================ ==================================== """ - def __init__(self): + def __init__(self, zeros="L"): """ The constructor takes no parameters. @@ -1508,7 +1512,8 @@ class Excellon(Geometry): self.drills = [] # Trailing "T" or leading "L" (default) - self.zeros = "T" + #self.zeros = "T" + self.zeros = zeros # Attributes to be included in serialization # Always append to it because it carries contents @@ -1581,7 +1586,7 @@ class Excellon(Geometry): self.stop_re = re.compile(r'^((G04)|(M09)|(M06)|(M00)|(M30))') # Parse coordinates - self.leadingzeros_re = re.compile(r'^(0*)(\d*)') + self.leadingzeros_re = re.compile(r'^[-\+]?(0*)(\d*)') def parse_file(self, filename): """ @@ -1612,6 +1617,7 @@ class Excellon(Geometry): current_x = None current_y = None + #### Parsing starts here #### line_num = 0 # Line number for eline in elines: line_num += 1 @@ -1704,7 +1710,7 @@ class Excellon(Geometry): ## Units and number format ## match = self.units_re.match(eline) if match: - self.zeros = match.group(2) # "T" or "L" + self.zeros = match.group(2) or self.zeros # "T" or "L". Might be empty self.units = {"INCH": "IN", "METRIC": "MM"}[match.group(1)] continue @@ -1722,8 +1728,13 @@ class Excellon(Geometry): :rtype: foat """ if self.zeros == "L": + # r'^[-\+]?(0*)(\d*)' + # 6 digits are divided by 10^4 + # If less than size digits, they are automatically added, + # 5 digits then are divided by 10^3 match = self.leadingzeros_re.search(number_str) - return float(number_str)/(10**(len(match.group(2))-2+len(match.group(1)))) + return float(number_str)/(10**(len(match.group(1)) + len(match.group(2)) - 2)) + else: # Trailing return float(number_str)/10000 diff --git a/defaults.json b/defaults.json index 9e26dfee..b97181ec 100644 --- a/defaults.json +++ b/defaults.json @@ -1 +1 @@ -{} \ No newline at end of file +{"cncjob_append": "", "gerber_noncopperrounded": false, "geometry_paintoverlap": 0.15, "geometry_plot": true, "zoom_ratio": 1.5, "shell_at_startup": "1", "gerber_isotooldia": 0.016, "serial": "nuaxe92x4v5f2jeft4kr", "shell_shape": [500, 300], "zoom_in_key": "3", "zoom_out_key": "2", "stats": {"on_toggle_units": 6, "on_options_app2project": 32, "save_defaults": 4569, "on_delete": 29, "on_file_openproject": 1, "on_fileopengerber": 10, "obj_on_scale_button": 5, "on_file_saveproject": 2, "geometry_on_generatecnc_button": 2, "on_file_new": 32, "gerber_on_iso_button": 1, "exec_command": 4, "on_fileopenexcellon": 12}, "recent_limit": 10, "gerber_plot": true, "defaults_save_period_ms": 20000, "gerber_cutoutgapsize": 0.15, "geometry_feedrate": 3.0, "units": "IN", "excellon_travelz": 0.1, "gerber_multicolored": false, "gerber_solid": true, "gerber_isopasses": 1, "fit_key": "1", "excellon_plot": true, "excellon_feedrate": 3.0, "cncjob_tooldia": 0.016, "geometry_travelz": 0.1, "gerber_cutoutmargin": 0.1, "excellon_solid": false, "geometry_paintmargin": 0.0, "geometry_cutz": -0.002, "gerber_noncoppermargin": 0.0, "gerber_cutouttooldia": 0.07, "gerber_gaps": "4", "gerber_bboxmargin": 0.0, "point_clipboard_format": "(%.4f, %.4f)", "cncjob_plot": true, "excellon_drillz": -0.1, "gerber_isooverlap": 0.15, "gerber_bboxrounded": false, "geometry_cnctooldia": 0.016, "geometry_painttooldia": 0.07} \ No newline at end of file diff --git a/doc/build/.buildinfo b/doc/build/.buildinfo deleted file mode 100644 index d2a3eb3c..00000000 --- a/doc/build/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 5d14861db364fd07def06ca8fd4c733a -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/doc/build/.doctrees/camlib.doctree b/doc/build/.doctrees/camlib.doctree deleted file mode 100644 index 64e380e0..00000000 Binary files a/doc/build/.doctrees/camlib.doctree and /dev/null differ diff --git a/doc/build/.doctrees/environment.pickle b/doc/build/.doctrees/environment.pickle deleted file mode 100644 index 51584e1f..00000000 Binary files a/doc/build/.doctrees/environment.pickle and /dev/null differ diff --git a/doc/build/.doctrees/index.doctree b/doc/build/.doctrees/index.doctree deleted file mode 100644 index 2a44d653..00000000 Binary files a/doc/build/.doctrees/index.doctree and /dev/null differ diff --git a/doc/build/_sources/camlib.txt b/doc/build/_sources/camlib.txt deleted file mode 100644 index 6d18fa6e..00000000 --- a/doc/build/_sources/camlib.txt +++ /dev/null @@ -1,34 +0,0 @@ -Camlib -====== - -.. automodule:: camlib - -Geometry -~~~~~~~~ - -.. autoclass:: Geometry - :members: - -Gerber -~~~~~~ - -.. autoclass:: Gerber(Geometry) - :members: - -ApertureMacro -~~~~~~~~~~~~~ - -.. autoclass:: ApertureMacro - :members: - -Excellon -~~~~~~~~ - -.. autoclass:: Excellon(Geometry) - :members: - -CNCJob -~~~~~~ - -.. autoclass:: CNCjob(Geometry) - :members: diff --git a/doc/build/_static/css/badge_only.css b/doc/build/_static/css/badge_only.css deleted file mode 100644 index e67013ae..00000000 --- a/doc/build/_static/css/badge_only.css +++ /dev/null @@ -1 +0,0 @@ -.font-smooth,.icon:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:fontawesome-webfont;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#fontawesome-webfont") format("svg")}.icon:before{display:inline-block;font-family:fontawesome-webfont;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .icon{display:inline-block;text-decoration:inherit}li .icon{display:inline-block}li .icon-large:before,li .icon-large:before{width:1.875em}ul.icons{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.icons li .icon{width:0.8em}ul.icons li .icon-large:before,ul.icons li .icon-large:before{vertical-align:baseline}.icon-book:before{content:"\f02d"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}} diff --git a/doc/build/_static/css/theme.css b/doc/build/_static/css/theme.css deleted file mode 100644 index 481346bf..00000000 --- a/doc/build/_static/css/theme.css +++ /dev/null @@ -1 +0,0 @@ -*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:20px 0;padding:0}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:0.2em 0;background:#ccc;color:#000;padding:0.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.font-smooth,.icon:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-tag-input-group .wy-tag .wy-tag-remove:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-tag-input-group,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:fontawesome-webfont;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#fontawesome-webfont") format("svg")}.icon:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-tag-input-group .wy-tag .wy-tag-remove:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before{display:inline-block;font-family:fontawesome-webfont;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .icon,a .wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-success a .wy-input-context,a .wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-danger a .wy-input-context,a .wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-warning a .wy-input-context,a .wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-info a .wy-input-context,a .wy-tag-input-group .wy-tag .wy-tag-remove,.wy-tag-input-group .wy-tag a .wy-tag-remove,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink{display:inline-block;text-decoration:inherit}.icon-large:before{vertical-align:-10%;font-size:1.33333em}.btn .icon,.btn .wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-success .btn .wy-input-context,.btn .wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .btn .wy-input-context,.btn .wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .btn .wy-input-context,.btn .wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-info .btn .wy-input-context,.btn .wy-tag-input-group .wy-tag .wy-tag-remove,.wy-tag-input-group .wy-tag .btn .wy-tag-remove,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.nav .icon,.nav .wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-success .nav .wy-input-context,.nav .wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .nav .wy-input-context,.nav .wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .nav .wy-input-context,.nav .wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-info .nav .wy-input-context,.nav .wy-tag-input-group .wy-tag .wy-tag-remove,.wy-tag-input-group .wy-tag .nav .wy-tag-remove,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink{display:inline}.btn .icon.icon-large,.btn .wy-inline-validate.wy-inline-validate-success .icon-large.wy-input-context,.wy-inline-validate.wy-inline-validate-success .btn .icon-large.wy-input-context,.btn .wy-inline-validate.wy-inline-validate-danger .icon-large.wy-input-context,.wy-inline-validate.wy-inline-validate-danger .btn .icon-large.wy-input-context,.btn .wy-inline-validate.wy-inline-validate-warning .icon-large.wy-input-context,.wy-inline-validate.wy-inline-validate-warning .btn .icon-large.wy-input-context,.btn .wy-inline-validate.wy-inline-validate-info .icon-large.wy-input-context,.wy-inline-validate.wy-inline-validate-info .btn .icon-large.wy-input-context,.btn .wy-tag-input-group .wy-tag .icon-large.wy-tag-remove,.wy-tag-input-group .wy-tag .btn .icon-large.wy-tag-remove,.btn .rst-content .icon-large.admonition-title,.rst-content .btn .icon-large.admonition-title,.btn .rst-content h1 .icon-large.headerlink,.rst-content h1 .btn .icon-large.headerlink,.btn .rst-content h2 .icon-large.headerlink,.rst-content h2 .btn .icon-large.headerlink,.btn .rst-content h3 .icon-large.headerlink,.rst-content h3 .btn .icon-large.headerlink,.btn .rst-content h4 .icon-large.headerlink,.rst-content h4 .btn .icon-large.headerlink,.btn .rst-content h5 .icon-large.headerlink,.rst-content h5 .btn .icon-large.headerlink,.btn .rst-content h6 .icon-large.headerlink,.rst-content h6 .btn .icon-large.headerlink,.btn .rst-content dl dt .icon-large.headerlink,.rst-content dl dt .btn .icon-large.headerlink,.nav .icon.icon-large,.nav .wy-inline-validate.wy-inline-validate-success .icon-large.wy-input-context,.wy-inline-validate.wy-inline-validate-success .nav .icon-large.wy-input-context,.nav .wy-inline-validate.wy-inline-validate-danger .icon-large.wy-input-context,.wy-inline-validate.wy-inline-validate-danger .nav .icon-large.wy-input-context,.nav .wy-inline-validate.wy-inline-validate-warning .icon-large.wy-input-context,.wy-inline-validate.wy-inline-validate-warning .nav .icon-large.wy-input-context,.nav .wy-inline-validate.wy-inline-validate-info .icon-large.wy-input-context,.wy-inline-validate.wy-inline-validate-info .nav .icon-large.wy-input-context,.nav .wy-tag-input-group .wy-tag .icon-large.wy-tag-remove,.wy-tag-input-group .wy-tag .nav .icon-large.wy-tag-remove,.nav .rst-content .icon-large.admonition-title,.rst-content .nav .icon-large.admonition-title,.nav .rst-content h1 .icon-large.headerlink,.rst-content h1 .nav .icon-large.headerlink,.nav .rst-content h2 .icon-large.headerlink,.rst-content h2 .nav .icon-large.headerlink,.nav .rst-content h3 .icon-large.headerlink,.rst-content h3 .nav .icon-large.headerlink,.nav .rst-content h4 .icon-large.headerlink,.rst-content h4 .nav .icon-large.headerlink,.nav .rst-content h5 .icon-large.headerlink,.rst-content h5 .nav .icon-large.headerlink,.nav .rst-content h6 .icon-large.headerlink,.rst-content h6 .nav .icon-large.headerlink,.nav .rst-content dl dt .icon-large.headerlink,.rst-content dl dt .nav .icon-large.headerlink{line-height:0.9em}.btn .icon.icon-spin,.btn .wy-inline-validate.wy-inline-validate-success .icon-spin.wy-input-context,.wy-inline-validate.wy-inline-validate-success .btn .icon-spin.wy-input-context,.btn .wy-inline-validate.wy-inline-validate-danger .icon-spin.wy-input-context,.wy-inline-validate.wy-inline-validate-danger .btn .icon-spin.wy-input-context,.btn .wy-inline-validate.wy-inline-validate-warning .icon-spin.wy-input-context,.wy-inline-validate.wy-inline-validate-warning .btn .icon-spin.wy-input-context,.btn .wy-inline-validate.wy-inline-validate-info .icon-spin.wy-input-context,.wy-inline-validate.wy-inline-validate-info .btn .icon-spin.wy-input-context,.btn .wy-tag-input-group .wy-tag .icon-spin.wy-tag-remove,.wy-tag-input-group .wy-tag .btn .icon-spin.wy-tag-remove,.btn .rst-content .icon-spin.admonition-title,.rst-content .btn .icon-spin.admonition-title,.btn .rst-content h1 .icon-spin.headerlink,.rst-content h1 .btn .icon-spin.headerlink,.btn .rst-content h2 .icon-spin.headerlink,.rst-content h2 .btn .icon-spin.headerlink,.btn .rst-content h3 .icon-spin.headerlink,.rst-content h3 .btn .icon-spin.headerlink,.btn .rst-content h4 .icon-spin.headerlink,.rst-content h4 .btn .icon-spin.headerlink,.btn .rst-content h5 .icon-spin.headerlink,.rst-content h5 .btn .icon-spin.headerlink,.btn .rst-content h6 .icon-spin.headerlink,.rst-content h6 .btn .icon-spin.headerlink,.btn .rst-content dl dt .icon-spin.headerlink,.rst-content dl dt .btn .icon-spin.headerlink,.nav .icon.icon-spin,.nav .wy-inline-validate.wy-inline-validate-success .icon-spin.wy-input-context,.wy-inline-validate.wy-inline-validate-success .nav .icon-spin.wy-input-context,.nav .wy-inline-validate.wy-inline-validate-danger .icon-spin.wy-input-context,.wy-inline-validate.wy-inline-validate-danger .nav .icon-spin.wy-input-context,.nav .wy-inline-validate.wy-inline-validate-warning .icon-spin.wy-input-context,.wy-inline-validate.wy-inline-validate-warning .nav .icon-spin.wy-input-context,.nav .wy-inline-validate.wy-inline-validate-info .icon-spin.wy-input-context,.wy-inline-validate.wy-inline-validate-info .nav .icon-spin.wy-input-context,.nav .wy-tag-input-group .wy-tag .icon-spin.wy-tag-remove,.wy-tag-input-group .wy-tag .nav .icon-spin.wy-tag-remove,.nav .rst-content .icon-spin.admonition-title,.rst-content .nav .icon-spin.admonition-title,.nav .rst-content h1 .icon-spin.headerlink,.rst-content h1 .nav .icon-spin.headerlink,.nav .rst-content h2 .icon-spin.headerlink,.rst-content h2 .nav .icon-spin.headerlink,.nav .rst-content h3 .icon-spin.headerlink,.rst-content h3 .nav .icon-spin.headerlink,.nav .rst-content h4 .icon-spin.headerlink,.rst-content h4 .nav .icon-spin.headerlink,.nav .rst-content h5 .icon-spin.headerlink,.rst-content h5 .nav .icon-spin.headerlink,.nav .rst-content h6 .icon-spin.headerlink,.rst-content h6 .nav .icon-spin.headerlink,.nav .rst-content dl dt .icon-spin.headerlink,.rst-content dl dt .nav .icon-spin.headerlink{display:inline-block}.btn.icon:before,.wy-inline-validate.wy-inline-validate-success .btn.wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .btn.wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .btn.wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .btn.wy-input-context:before,.wy-tag-input-group .wy-tag .btn.wy-tag-remove:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before{opacity:0.5;-webkit-transition:opacity 0.05s ease-in;-moz-transition:opacity 0.05s ease-in;transition:opacity 0.05s ease-in}.btn.icon:hover:before,.wy-inline-validate.wy-inline-validate-success .btn.wy-input-context:hover:before,.wy-inline-validate.wy-inline-validate-danger .btn.wy-input-context:hover:before,.wy-inline-validate.wy-inline-validate-warning .btn.wy-input-context:hover:before,.wy-inline-validate.wy-inline-validate-info .btn.wy-input-context:hover:before,.wy-tag-input-group .wy-tag .btn.wy-tag-remove:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before{opacity:1}.btn-mini .icon:before,.btn-mini .wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .btn-mini .wy-input-context:before,.btn-mini .wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .btn-mini .wy-input-context:before,.btn-mini .wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .btn-mini .wy-input-context:before,.btn-mini .wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .btn-mini .wy-input-context:before,.btn-mini .wy-tag-input-group .wy-tag .wy-tag-remove:before,.wy-tag-input-group .wy-tag .btn-mini .wy-tag-remove:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before{font-size:14px;vertical-align:-15%}li .icon,li .wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-success li .wy-input-context,li .wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-danger li .wy-input-context,li .wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-warning li .wy-input-context,li .wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-info li .wy-input-context,li .wy-tag-input-group .wy-tag .wy-tag-remove,.wy-tag-input-group .wy-tag li .wy-tag-remove,li .rst-content .admonition-title,.rst-content li .admonition-title,li .rst-content h1 .headerlink,.rst-content h1 li .headerlink,li .rst-content h2 .headerlink,.rst-content h2 li .headerlink,li .rst-content h3 .headerlink,.rst-content h3 li .headerlink,li .rst-content h4 .headerlink,.rst-content h4 li .headerlink,li .rst-content h5 .headerlink,.rst-content h5 li .headerlink,li .rst-content h6 .headerlink,.rst-content h6 li .headerlink,li .rst-content dl dt .headerlink,.rst-content dl dt li .headerlink{display:inline-block}li .icon-large:before,li .icon-large:before{width:1.875em}ul.icons{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.icons li .icon,ul.icons li .wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-success ul.icons li .wy-input-context,ul.icons li .wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-danger ul.icons li .wy-input-context,ul.icons li .wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-warning ul.icons li .wy-input-context,ul.icons li .wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-info ul.icons li .wy-input-context,ul.icons li .wy-tag-input-group .wy-tag .wy-tag-remove,.wy-tag-input-group .wy-tag ul.icons li .wy-tag-remove,ul.icons li .rst-content .admonition-title,.rst-content ul.icons li .admonition-title,ul.icons li .rst-content h1 .headerlink,.rst-content h1 ul.icons li .headerlink,ul.icons li .rst-content h2 .headerlink,.rst-content h2 ul.icons li .headerlink,ul.icons li .rst-content h3 .headerlink,.rst-content h3 ul.icons li .headerlink,ul.icons li .rst-content h4 .headerlink,.rst-content h4 ul.icons li .headerlink,ul.icons li .rst-content h5 .headerlink,.rst-content h5 ul.icons li .headerlink,ul.icons li .rst-content h6 .headerlink,.rst-content h6 ul.icons li .headerlink,ul.icons li .rst-content dl dt .headerlink,.rst-content dl dt ul.icons li .headerlink{width:0.8em}ul.icons li .icon-large:before,ul.icons li .icon-large:before{vertical-align:baseline}.icon-glass:before{content:"\f000"}.icon-music:before{content:"\f001"}.icon-search:before{content:"\f002"}.icon-envelope-alt:before{content:"\f003"}.icon-heart:before{content:"\f004"}.icon-star:before{content:"\f005"}.icon-star-empty:before{content:"\f006"}.icon-user:before{content:"\f007"}.icon-film:before{content:"\f008"}.icon-th-large:before{content:"\f009"}.icon-th:before{content:"\f00a"}.icon-th-list:before{content:"\f00b"}.icon-ok:before{content:"\f00c"}.icon-remove:before,.wy-tag-input-group .wy-tag .wy-tag-remove:before{content:"\f00d"}.icon-zoom-in:before{content:"\f00e"}.icon-zoom-out:before{content:"\f010"}.icon-power-off:before,.icon-off:before{content:"\f011"}.icon-signal:before{content:"\f012"}.icon-gear:before,.icon-cog:before{content:"\f013"}.icon-trash:before{content:"\f014"}.icon-home:before{content:"\f015"}.icon-file-alt:before{content:"\f016"}.icon-time:before{content:"\f017"}.icon-road:before{content:"\f018"}.icon-download-alt:before{content:"\f019"}.icon-download:before{content:"\f01a"}.icon-upload:before{content:"\f01b"}.icon-inbox:before{content:"\f01c"}.icon-play-circle:before{content:"\f01d"}.icon-rotate-right:before,.icon-repeat:before{content:"\f01e"}.icon-refresh:before{content:"\f021"}.icon-list-alt:before{content:"\f022"}.icon-lock:before{content:"\f023"}.icon-flag:before{content:"\f024"}.icon-headphones:before{content:"\f025"}.icon-volume-off:before{content:"\f026"}.icon-volume-down:before{content:"\f027"}.icon-volume-up:before{content:"\f028"}.icon-qrcode:before{content:"\f029"}.icon-barcode:before{content:"\f02a"}.icon-tag:before{content:"\f02b"}.icon-tags:before{content:"\f02c"}.icon-book:before{content:"\f02d"}.icon-bookmark:before{content:"\f02e"}.icon-print:before{content:"\f02f"}.icon-camera:before{content:"\f030"}.icon-font:before{content:"\f031"}.icon-bold:before{content:"\f032"}.icon-italic:before{content:"\f033"}.icon-text-height:before{content:"\f034"}.icon-text-width:before{content:"\f035"}.icon-align-left:before{content:"\f036"}.icon-align-center:before{content:"\f037"}.icon-align-right:before{content:"\f038"}.icon-align-justify:before{content:"\f039"}.icon-list:before{content:"\f03a"}.icon-indent-left:before{content:"\f03b"}.icon-indent-right:before{content:"\f03c"}.icon-facetime-video:before{content:"\f03d"}.icon-picture:before{content:"\f03e"}.icon-pencil:before{content:"\f040"}.icon-map-marker:before{content:"\f041"}.icon-adjust:before{content:"\f042"}.icon-tint:before{content:"\f043"}.icon-edit:before{content:"\f044"}.icon-share:before{content:"\f045"}.icon-check:before{content:"\f046"}.icon-move:before{content:"\f047"}.icon-step-backward:before{content:"\f048"}.icon-fast-backward:before{content:"\f049"}.icon-backward:before{content:"\f04a"}.icon-play:before{content:"\f04b"}.icon-pause:before{content:"\f04c"}.icon-stop:before{content:"\f04d"}.icon-forward:before{content:"\f04e"}.icon-fast-forward:before{content:"\f050"}.icon-step-forward:before{content:"\f051"}.icon-eject:before{content:"\f052"}.icon-chevron-left:before{content:"\f053"}.icon-chevron-right:before{content:"\f054"}.icon-plus-sign:before{content:"\f055"}.icon-minus-sign:before{content:"\f056"}.icon-remove-sign:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:"\f057"}.icon-ok-sign:before{content:"\f058"}.icon-question-sign:before{content:"\f059"}.icon-info-sign:before{content:"\f05a"}.icon-screenshot:before{content:"\f05b"}.icon-remove-circle:before{content:"\f05c"}.icon-ok-circle:before{content:"\f05d"}.icon-ban-circle:before{content:"\f05e"}.icon-arrow-left:before{content:"\f060"}.icon-arrow-right:before{content:"\f061"}.icon-arrow-up:before{content:"\f062"}.icon-arrow-down:before{content:"\f063"}.icon-mail-forward:before,.icon-share-alt:before{content:"\f064"}.icon-resize-full:before{content:"\f065"}.icon-resize-small:before{content:"\f066"}.icon-plus:before{content:"\f067"}.icon-minus:before{content:"\f068"}.icon-asterisk:before{content:"\f069"}.icon-exclamation-sign:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:"\f06a"}.icon-gift:before{content:"\f06b"}.icon-leaf:before{content:"\f06c"}.icon-fire:before{content:"\f06d"}.icon-eye-open:before{content:"\f06e"}.icon-eye-close:before{content:"\f070"}.icon-warning-sign:before{content:"\f071"}.icon-plane:before{content:"\f072"}.icon-calendar:before{content:"\f073"}.icon-random:before{content:"\f074"}.icon-comment:before{content:"\f075"}.icon-magnet:before{content:"\f076"}.icon-chevron-up:before{content:"\f077"}.icon-chevron-down:before{content:"\f078"}.icon-retweet:before{content:"\f079"}.icon-shopping-cart:before{content:"\f07a"}.icon-folder-close:before{content:"\f07b"}.icon-folder-open:before{content:"\f07c"}.icon-resize-vertical:before{content:"\f07d"}.icon-resize-horizontal:before{content:"\f07e"}.icon-bar-chart:before{content:"\f080"}.icon-twitter-sign:before{content:"\f081"}.icon-facebook-sign:before{content:"\f082"}.icon-camera-retro:before{content:"\f083"}.icon-key:before{content:"\f084"}.icon-gears:before,.icon-cogs:before{content:"\f085"}.icon-comments:before{content:"\f086"}.icon-thumbs-up-alt:before{content:"\f087"}.icon-thumbs-down-alt:before{content:"\f088"}.icon-star-half:before{content:"\f089"}.icon-heart-empty:before{content:"\f08a"}.icon-signout:before{content:"\f08b"}.icon-linkedin-sign:before{content:"\f08c"}.icon-pushpin:before{content:"\f08d"}.icon-external-link:before{content:"\f08e"}.icon-signin:before{content:"\f090"}.icon-trophy:before{content:"\f091"}.icon-github-sign:before{content:"\f092"}.icon-upload-alt:before{content:"\f093"}.icon-lemon:before{content:"\f094"}.icon-phone:before{content:"\f095"}.icon-unchecked:before,.icon-check-empty:before{content:"\f096"}.icon-bookmark-empty:before{content:"\f097"}.icon-phone-sign:before{content:"\f098"}.icon-twitter:before{content:"\f099"}.icon-facebook:before{content:"\f09a"}.icon-github:before{content:"\f09b"}.icon-unlock:before{content:"\f09c"}.icon-credit-card:before{content:"\f09d"}.icon-rss:before{content:"\f09e"}.icon-hdd:before{content:"\f0a0"}.icon-bullhorn:before{content:"\f0a1"}.icon-bell:before{content:"\f0a2"}.icon-certificate:before{content:"\f0a3"}.icon-hand-right:before{content:"\f0a4"}.icon-hand-left:before{content:"\f0a5"}.icon-hand-up:before{content:"\f0a6"}.icon-hand-down:before{content:"\f0a7"}.icon-circle-arrow-left:before{content:"\f0a8"}.icon-circle-arrow-right:before{content:"\f0a9"}.icon-circle-arrow-up:before{content:"\f0aa"}.icon-circle-arrow-down:before{content:"\f0ab"}.icon-globe:before{content:"\f0ac"}.icon-wrench:before{content:"\f0ad"}.icon-tasks:before{content:"\f0ae"}.icon-filter:before{content:"\f0b0"}.icon-briefcase:before{content:"\f0b1"}.icon-fullscreen:before{content:"\f0b2"}.icon-group:before{content:"\f0c0"}.icon-link:before{content:"\f0c1"}.icon-cloud:before{content:"\f0c2"}.icon-beaker:before{content:"\f0c3"}.icon-cut:before{content:"\f0c4"}.icon-copy:before{content:"\f0c5"}.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6"}.icon-save:before{content:"\f0c7"}.icon-sign-blank:before{content:"\f0c8"}.icon-reorder:before{content:"\f0c9"}.icon-list-ul:before{content:"\f0ca"}.icon-list-ol:before{content:"\f0cb"}.icon-strikethrough:before{content:"\f0cc"}.icon-underline:before{content:"\f0cd"}.icon-table:before{content:"\f0ce"}.icon-magic:before{content:"\f0d0"}.icon-truck:before{content:"\f0d1"}.icon-pinterest:before{content:"\f0d2"}.icon-pinterest-sign:before{content:"\f0d3"}.icon-google-plus-sign:before{content:"\f0d4"}.icon-google-plus:before{content:"\f0d5"}.icon-money:before{content:"\f0d6"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-columns:before{content:"\f0db"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-envelope:before{content:"\f0e0"}.icon-linkedin:before{content:"\f0e1"}.icon-rotate-left:before,.icon-undo:before{content:"\f0e2"}.icon-legal:before{content:"\f0e3"}.icon-dashboard:before{content:"\f0e4"}.icon-comment-alt:before{content:"\f0e5"}.icon-comments-alt:before{content:"\f0e6"}.icon-bolt:before{content:"\f0e7"}.icon-sitemap:before{content:"\f0e8"}.icon-umbrella:before{content:"\f0e9"}.icon-paste:before{content:"\f0ea"}.icon-lightbulb:before{content:"\f0eb"}.icon-exchange:before{content:"\f0ec"}.icon-cloud-download:before{content:"\f0ed"}.icon-cloud-upload:before{content:"\f0ee"}.icon-user-md:before{content:"\f0f0"}.icon-stethoscope:before{content:"\f0f1"}.icon-suitcase:before{content:"\f0f2"}.icon-bell-alt:before{content:"\f0f3"}.icon-coffee:before{content:"\f0f4"}.icon-food:before{content:"\f0f5"}.icon-file-text-alt:before{content:"\f0f6"}.icon-building:before{content:"\f0f7"}.icon-hospital:before{content:"\f0f8"}.icon-ambulance:before{content:"\f0f9"}.icon-medkit:before{content:"\f0fa"}.icon-fighter-jet:before{content:"\f0fb"}.icon-beer:before{content:"\f0fc"}.icon-h-sign:before{content:"\f0fd"}.icon-plus-sign-alt:before{content:"\f0fe"}.icon-double-angle-left:before{content:"\f100"}.icon-double-angle-right:before{content:"\f101"}.icon-double-angle-up:before{content:"\f102"}.icon-double-angle-down:before{content:"\f103"}.icon-angle-left:before{content:"\f104"}.icon-angle-right:before{content:"\f105"}.icon-angle-up:before{content:"\f106"}.icon-angle-down:before{content:"\f107"}.icon-desktop:before{content:"\f108"}.icon-laptop:before{content:"\f109"}.icon-tablet:before{content:"\f10a"}.icon-mobile-phone:before{content:"\f10b"}.icon-circle-blank:before{content:"\f10c"}.icon-quote-left:before{content:"\f10d"}.icon-quote-right:before{content:"\f10e"}.icon-spinner:before{content:"\f110"}.icon-circle:before{content:"\f111"}.icon-mail-reply:before,.icon-reply:before{content:"\f112"}.icon-github-alt:before{content:"\f113"}.icon-folder-close-alt:before{content:"\f114"}.icon-folder-open-alt:before{content:"\f115"}.icon-expand-alt:before{content:"\f116"}.icon-collapse-alt:before{content:"\f117"}.icon-smile:before{content:"\f118"}.icon-frown:before{content:"\f119"}.icon-meh:before{content:"\f11a"}.icon-gamepad:before{content:"\f11b"}.icon-keyboard:before{content:"\f11c"}.icon-flag-alt:before{content:"\f11d"}.icon-flag-checkered:before{content:"\f11e"}.icon-terminal:before{content:"\f120"}.icon-code:before{content:"\f121"}.icon-reply-all:before{content:"\f122"}.icon-mail-reply-all:before{content:"\f122"}.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123"}.icon-location-arrow:before{content:"\f124"}.icon-crop:before{content:"\f125"}.icon-code-fork:before{content:"\f126"}.icon-unlink:before{content:"\f127"}.icon-question:before{content:"\f128"}.icon-info:before{content:"\f129"}.icon-exclamation:before{content:"\f12a"}.icon-superscript:before{content:"\f12b"}.icon-subscript:before{content:"\f12c"}.icon-eraser:before{content:"\f12d"}.icon-puzzle-piece:before{content:"\f12e"}.icon-microphone:before{content:"\f130"}.icon-microphone-off:before{content:"\f131"}.icon-shield:before{content:"\f132"}.icon-calendar-empty:before{content:"\f133"}.icon-fire-extinguisher:before{content:"\f134"}.icon-rocket:before{content:"\f135"}.icon-maxcdn:before{content:"\f136"}.icon-chevron-sign-left:before{content:"\f137"}.icon-chevron-sign-right:before{content:"\f138"}.icon-chevron-sign-up:before{content:"\f139"}.icon-chevron-sign-down:before{content:"\f13a"}.icon-html5:before{content:"\f13b"}.icon-css3:before{content:"\f13c"}.icon-anchor:before{content:"\f13d"}.icon-unlock-alt:before{content:"\f13e"}.icon-bullseye:before{content:"\f140"}.icon-ellipsis-horizontal:before{content:"\f141"}.icon-ellipsis-vertical:before{content:"\f142"}.icon-rss-sign:before{content:"\f143"}.icon-play-sign:before{content:"\f144"}.icon-ticket:before{content:"\f145"}.icon-minus-sign-alt:before{content:"\f146"}.icon-check-minus:before{content:"\f147"}.icon-level-up:before{content:"\f148"}.icon-level-down:before{content:"\f149"}.icon-check-sign:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:"\f14a"}.icon-edit-sign:before{content:"\f14b"}.icon-external-link-sign:before{content:"\f14c"}.icon-share-sign:before{content:"\f14d"}.icon-compass:before{content:"\f14e"}.icon-collapse:before{content:"\f150"}.icon-collapse-top:before{content:"\f151"}.icon-expand:before{content:"\f152"}.icon-euro:before,.icon-eur:before{content:"\f153"}.icon-gbp:before{content:"\f154"}.icon-dollar:before,.icon-usd:before{content:"\f155"}.icon-rupee:before,.icon-inr:before{content:"\f156"}.icon-yen:before,.icon-jpy:before{content:"\f157"}.icon-renminbi:before,.icon-cny:before{content:"\f158"}.icon-won:before,.icon-krw:before{content:"\f159"}.icon-bitcoin:before,.icon-btc:before{content:"\f15a"}.icon-file:before{content:"\f15b"}.icon-file-text:before{content:"\f15c"}.icon-sort-by-alphabet:before{content:"\f15d"}.icon-sort-by-alphabet-alt:before{content:"\f15e"}.icon-sort-by-attributes:before{content:"\f160"}.icon-sort-by-attributes-alt:before{content:"\f161"}.icon-sort-by-order:before{content:"\f162"}.icon-sort-by-order-alt:before{content:"\f163"}.icon-thumbs-up:before{content:"\f164"}.icon-thumbs-down:before{content:"\f165"}.icon-youtube-sign:before{content:"\f166"}.icon-youtube:before{content:"\f167"}.icon-xing:before{content:"\f168"}.icon-xing-sign:before{content:"\f169"}.icon-youtube-play:before{content:"\f16a"}.icon-dropbox:before{content:"\f16b"}.icon-stackexchange:before{content:"\f16c"}.icon-instagram:before{content:"\f16d"}.icon-flickr:before{content:"\f16e"}.icon-adn:before{content:"\f170"}.icon-bitbucket:before{content:"\f171"}.icon-bitbucket-sign:before{content:"\f172"}.icon-tumblr:before{content:"\f173"}.icon-tumblr-sign:before{content:"\f174"}.icon-long-arrow-down:before{content:"\f175"}.icon-long-arrow-up:before{content:"\f176"}.icon-long-arrow-left:before{content:"\f177"}.icon-long-arrow-right:before{content:"\f178"}.icon-apple:before{content:"\f179"}.icon-windows:before{content:"\f17a"}.icon-android:before{content:"\f17b"}.icon-linux:before{content:"\f17c"}.icon-dribbble:before{content:"\f17d"}.icon-skype:before{content:"\f17e"}.icon-foursquare:before{content:"\f180"}.icon-trello:before{content:"\f181"}.icon-female:before{content:"\f182"}.icon-male:before{content:"\f183"}.icon-gittip:before{content:"\f184"}.icon-sun:before{content:"\f185"}.icon-moon:before{content:"\f186"}.icon-archive:before{content:"\f187"}.icon-bug:before{content:"\f188"}.icon-vk:before{content:"\f189"}.icon-weibo:before{content:"\f18a"}.icon-renren:before{content:"\f18b"}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso{padding:12px;line-height:24px;margin-bottom:24px}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:transparent;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso{background:#f3f6f6}.wy-alert.wy-alert-neutral strong,.rst-content .wy-alert-neutral.note strong,.rst-content .wy-alert-neutral.attention strong,.rst-content .wy-alert-neutral.caution strong,.rst-content .wy-alert-neutral.danger strong,.rst-content .wy-alert-neutral.error strong,.rst-content .wy-alert-neutral.hint strong,.rst-content .wy-alert-neutral.important strong,.rst-content .wy-alert-neutral.tip strong,.rst-content .wy-alert-neutral.warning strong,.rst-content .wy-alert-neutral.seealso strong{color:#404040}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a{color:#2980b9}.wy-tray-container{position:fixed;top:-50px;left:0;width:100%;-webkit-transition:top 0.2s ease-in;-moz-transition:top 0.2s ease-in;transition:top 0.2s ease-in}.wy-tray-container.on{top:0}.wy-tray-container li{display:none;width:100%;background:#343131;padding:12px 24px;color:#fff;margin-bottom:6px;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1),0px -1px 2px -1px rgba(255,255,255,0.5) inset}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.btn{display:inline-block;*display:inline;zoom:1;line-height:normal;white-space:nowrap;vertical-align:baseline;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:100%;padding:6px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);border-bottom:solid 3px rgba(0,0,0,0.1);background-color:#27ae60;text-decoration:none;font-weight:500;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset;-webkit-transition:all 0.1s linear;-moz-transition:all 0.1s linear;transition:all 0.1s linear;outline-none:false}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;color:#fff;outline:0}.btn:active{border-top:solid 3px rgba(0,0,0,0.1);border-bottom:solid 1px rgba(0,0,0,0.1);box-shadow:0px 1px 2px -1px rgba(0,0,0,0.5) inset}.btn[disabled]{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-danger{background-color:#e74c3c !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#e67e22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#343131}.btn-invert:hover{background-color:#413d3d !important}.btn-link{background-color:transparent !important;color:#2980b9;border-color:transparent}.btn-link:hover{background-color:transparent !important;color:#409ad5;border-color:transparent}.btn-link:active{background-color:transparent !important;border-color:transparent;border-top:solid 1px transparent;border-bottom:solid 3px transparent}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown:hover .wy-dropdown-menu{display:block}.wy-dropdown .caret:after{font-family:fontawesome-webfont;content:"\f0d7";font-size:70%}.wy-dropdown-menu{position:absolute;top:100%;left:0;display:none;float:left;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:0.5em 1em 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:0.5em}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 0.3125em 0;color:#999;font-size:90%}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button{-webkit-appearance:button;cursor:pointer;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}input[type="datetime-local"]{padding:0.34375em 0.625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:0.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#2980b9}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#f3f6f6;color:#cad2d3}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#e9322d}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%}select,textarea{padding:0.5em 0.625em;display:inline-block;border:1px solid #ccc;font-size:0.8em;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fff;color:#cad2d3;border-color:transparent}.wy-checkbox,.wy-radio{margin:0.5em 0;color:#404040 !important;display:block}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{padding:6px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:0.5em 0.625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.wy-control-group{margin-bottom:24px;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 2px #e74c3c}.wy-control-group.wy-control-group-error textarea{border:solid 2px #e74c3c}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:0.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#ccc;font-size:70%;margin-top:0.3125em;font-style:italic}.wy-tag-input-group{padding:4px 4px 0px 4px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;background:#fff;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}.wy-tag-input-group .wy-tag{display:inline-block;background-color:rgba(0,0,0,0.1);padding:0.5em 0.625em;border-radius:2px;position:relative;margin-bottom:4px}.wy-tag-input-group .wy-tag .wy-tag-remove{color:#ccc;margin-left:5px}.wy-tag-input-group .wy-tag .wy-tag-remove:hover{color:#e74c3c}.wy-tag-input-group label{margin-left:5px;display:inline-block;margin-bottom:0}.wy-tag-input-group input{border:none;font-size:100%;margin-bottom:4px;box-shadow:none}.wy-form-upload{border:solid 1px #ccc;border-bottom:solid 3px #ccc;background-color:#fff;padding:24px;display:inline-block;text-align:center;cursor:pointer;color:#404040;-webkit-transition:border-color 0.1s ease-in;-moz-transition:border-color 0.1s ease-in;transition:border-color 0.1s ease-in;*zoom:1}.wy-form-upload:before,.wy-form-upload:after{display:table;content:""}.wy-form-upload:after{clear:both}@media screen and (max-width: 480px){.wy-form-upload{width:100%}}.wy-form-upload .image-drop{display:none}.wy-form-upload .image-desktop{display:none}.wy-form-upload .image-loading{display:none}.wy-form-upload .wy-form-upload-icon{display:block;font-size:32px;color:#b3b3b3}.wy-form-upload .image-drop .wy-form-upload-icon{color:#27ae60}.wy-form-upload p{font-size:90%}.wy-form-upload .wy-form-upload-image{float:left;margin-right:24px}@media screen and (max-width: 480px){.wy-form-upload .wy-form-upload-image{width:100%;margin-bottom:24px}}.wy-form-upload img{max-width:125px;max-height:125px;opacity:0.9;-webkit-transition:opacity 0.1s ease-in;-moz-transition:opacity 0.1s ease-in;transition:opacity 0.1s ease-in}.wy-form-upload .wy-form-upload-content{float:left}@media screen and (max-width: 480px){.wy-form-upload .wy-form-upload-content{width:100%}}.wy-form-upload:hover{border-color:#b3b3b3;color:#404040}.wy-form-upload:hover .image-desktop{display:block}.wy-form-upload:hover .image-drag{display:none}.wy-form-upload:hover img{opacity:1}.wy-form-upload:active{border-top:solid 3px #ccc;border-bottom:solid 1px #ccc}.wy-form-upload.wy-form-upload-big{width:100%;text-align:center;padding:72px}.wy-form-upload.wy-form-upload-big .wy-form-upload-content{float:none}.wy-form-upload.wy-form-upload-file p{margin-bottom:0}.wy-form-upload.wy-form-upload-file .wy-form-upload-icon{display:inline-block;font-size:inherit}.wy-form-upload.wy-form-upload-drop{background-color:#ddf7e8}.wy-form-upload.wy-form-upload-drop .image-drop{display:block}.wy-form-upload.wy-form-upload-drop .image-desktop{display:none}.wy-form-upload.wy-form-upload-drop .image-drag{display:none}.wy-form-upload.wy-form-upload-loading .image-drag{display:none}.wy-form-upload.wy-form-upload-loading .image-desktop{display:none}.wy-form-upload.wy-form-upload-loading .image-loading{display:block}.wy-form-upload.wy-form-upload-loading .wy-input-prefix{display:none}.wy-form-upload.wy-form-upload-loading p{margin-bottom:0}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}.wy-form-gallery-manage{margin-left:-12px;margin-right:-12px}.wy-form-gallery-manage li{float:left;padding:12px;width:20%;cursor:pointer}@media screen and (max-width: 768px){.wy-form-gallery-manage li{width:25%}}@media screen and (max-width: 480px){.wy-form-gallery-manage li{width:50%}}.wy-form-gallery-manage li:active{cursor:move}.wy-form-gallery-manage li>a{padding:12px;background-color:#fff;border:solid 1px #e1e4e5;border-bottom:solid 3px #e1e4e5;display:inline-block;-webkit-transition:all 0.1s ease-in;-moz-transition:all 0.1s ease-in;transition:all 0.1s ease-in}.wy-form-gallery-manage li>a:active{border:solid 1px #ccc;border-top:solid 3px #ccc}.wy-form-gallery-manage img{width:100%;-webkit-transition:all 0.05s ease-in;-moz-transition:all 0.05s ease-in;transition:all 0.05s ease-in}li.wy-form-gallery-edit{position:relative;color:#fff;padding:24px;width:100%;display:block;background-color:#343131;border-radius:4px}li.wy-form-gallery-edit .arrow{position:absolute;display:block;top:-50px;left:50%;margin-left:-25px;z-index:500;height:0;width:0;border-color:transparent;border-style:solid;border-width:25px;border-bottom-color:#343131}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:0.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0.3em;display:block}.wy-form label{margin-bottom:0.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:0.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-controls{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:0.2em 0 0.8em}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-grid-one-col{*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;max-width:1066px;margin-top:1.618em}.wy-grid-one-col:before,.wy-grid-one-col:after{display:table;content:""}.wy-grid-one-col:after{clear:both}.wy-grid-one-col section{display:block;float:left;margin-right:2.35765%;width:100%;background:#fcfcfc;padding:1.618em;margin-right:0}.wy-grid-one-col section:last-child{margin-right:0}.wy-grid-index-card{*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;max-width:460px;margin-top:1.618em;background:#fcfcfc;padding:1.618em}.wy-grid-index-card:before,.wy-grid-index-card:after{display:table;content:""}.wy-grid-index-card:after{clear:both}.wy-grid-index-card header,.wy-grid-index-card section,.wy-grid-index-card aside{display:block;float:left;margin-right:2.35765%;width:100%}.wy-grid-index-card header:last-child,.wy-grid-index-card section:last-child,.wy-grid-index-card aside:last-child{margin-right:0}.wy-grid-index-card.twocol{max-width:768px}.wy-grid-index-card.twocol section{display:block;float:left;margin-right:2.35765%;width:48.82117%}.wy-grid-index-card.twocol section:last-child{margin-right:0}.wy-grid-index-card.twocol aside{display:block;float:left;margin-right:2.35765%;width:48.82117%}.wy-grid-index-card.twocol aside:last-child{margin-right:0}.wy-grid-search-filter{*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;margin-bottom:24px}.wy-grid-search-filter:before,.wy-grid-search-filter:after{display:table;content:""}.wy-grid-search-filter:after{clear:both}.wy-grid-search-filter .wy-grid-search-filter-input{display:block;float:left;margin-right:2.35765%;width:74.41059%}.wy-grid-search-filter .wy-grid-search-filter-input:last-child{margin-right:0}.wy-grid-search-filter .wy-grid-search-filter-btn{display:block;float:left;margin-right:2.35765%;width:23.23176%}.wy-grid-search-filter .wy-grid-search-filter-btn:last-child{margin-right:0}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px;margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}a{color:#2980b9;text-decoration:none}a:hover{color:#3091d1}.link-danger{color:#e74c3c}.link-danger:hover{color:#d62c1a}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}small{font-size:80%}code,.rst-content tt{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:"Incosolata","Consolata","Monaco",monospace;color:#e74c3c;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.full-width{width:100%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li{list-style:square}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li{list-style:decimal;margin-left:24px}.wy-type-large{font-size:120%}.wy-type-normal{font-size:100%}.wy-type-small{font-size:100%}.wy-type-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980b9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27ae60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#e74c3c !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}.codeblock-example{border:1px solid #e1e4e5;border-bottom:none;padding:24px;padding-top:48px;font-weight:500;background:#fff;position:relative}.codeblock-example:after{content:"Example";position:absolute;top:0px;left:0px;background:#9b59b6;color:#fff;padding:6px 12px}.codeblock-example.prettyprint-example-only{border:1px solid #e1e4e5;margin-bottom:24px}.codeblock,.rst-content .literal-block,div[class^='highlight']{border:1px solid #e1e4e5;padding:0px;overflow-x:auto;background:#fff;margin:1px 0 24px 0}.codeblock div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{border:none;background:none;margin:0}div[class^='highlight'] td.code{width:100%}.linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:"Incosolata","Consolata","Monaco",monospace;font-size:12px;line-height:1.5;color:#d9d9d9}div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;font-family:"Incosolata","Consolata","Monaco",monospace;font-size:12px;line-height:1.5;display:block;overflow:auto;color:#404040}pre.literal-block{@extends .codeblock;}@media print{.codeblock,.rst-content .literal-block,div[class^='highlight'],div[class^='highlight'] pre{white-space:pre-wrap}}.hll{background-color:#ffc;margin:0 -12px;padding:0 12px;display:block}.c{color:#998;font-style:italic}.err{color:#a61717;background-color:#e3d2d2}.k{font-weight:bold}.o{font-weight:bold}.cm{color:#998;font-style:italic}.cp{color:#999;font-weight:bold}.c1{color:#998;font-style:italic}.cs{color:#999;font-weight:bold;font-style:italic}.gd{color:#000;background-color:#fdd}.gd .x{color:#000;background-color:#faa}.ge{font-style:italic}.gr{color:#a00}.gh{color:#999}.gi{color:#000;background-color:#dfd}.gi .x{color:#000;background-color:#afa}.go{color:#888}.gp{color:#555}.gs{font-weight:bold}.gu{color:purple;font-weight:bold}.gt{color:#a00}.kc{font-weight:bold}.kd{font-weight:bold}.kn{font-weight:bold}.kp{font-weight:bold}.kr{font-weight:bold}.kt{color:#458;font-weight:bold}.m{color:#099}.s{color:#d14}.n{color:#333}.na{color:teal}.nb{color:#0086b3}.nc{color:#458;font-weight:bold}.no{color:teal}.ni{color:purple}.ne{color:#900;font-weight:bold}.nf{color:#900;font-weight:bold}.nn{color:#555}.nt{color:navy}.nv{color:teal}.ow{font-weight:bold}.w{color:#bbb}.mf{color:#099}.mh{color:#099}.mi{color:#099}.mo{color:#099}.sb{color:#d14}.sc{color:#d14}.sd{color:#d14}.s2{color:#d14}.se{color:#d14}.sh{color:#d14}.si{color:#d14}.sx{color:#d14}.sr{color:#009926}.s1{color:#d14}.ss{color:#990073}.bp{color:#999}.vc{color:teal}.vg{color:teal}.vi{color:teal}.il{color:#099}.gc{color:#999;background-color:#eaf2f5}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical header{height:32px;display:inline-block;line-height:32px;padding:0 1.618em;display:block;font-weight:bold;text-transform:uppercase;font-size:80%;color:#2980b9;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:0.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical .local-toc li ul{display:block}.wy-menu-vertical li ul li a{margin-bottom:0;color:#b3b3b3;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:0.4045em 1.618em;display:block;position:relative;font-size:90%;color:#b3b3b3}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-side-nav-search{z-index:200;background-color:#2980b9;text-align:center;padding:0.809em;display:block;color:#fcfcfc;margin-bottom:0.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto 0.809em auto;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:0.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all 0.2s ease-in;-moz-transition:all 0.2s ease-in;transition:all 0.2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:left repeat-y #fcfcfc;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC);background-size:300px 1px}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:absolute;top:0;left:0;width:300px;overflow:hidden;min-height:100%;background:#343131;z-index:200}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:0.4045em 0.809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:#999}footer p{margin-bottom:12px}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1400px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}nav.stickynav{position:fixed;top:0}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-success .rst-versions .rst-current-version .wy-input-context,.rst-versions .rst-current-version .wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .rst-versions .rst-current-version .wy-input-context,.rst-versions .rst-current-version .wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .rst-versions .rst-current-version .wy-input-context,.rst-versions .rst-current-version .wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-info .rst-versions .rst-current-version .wy-input-context,.rst-versions .rst-current-version .wy-tag-input-group .wy-tag .wy-tag-remove,.wy-tag-input-group .wy-tag .rst-versions .rst-current-version .wy-tag-remove,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink{color:#fcfcfc}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}.rst-content img{max-width:100%;height:auto !important}.rst-content .section>img{margin-bottom:24px}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .line-block{margin-left:24px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto;display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink{display:none;visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after{visibility:visible;content:"\f0c1";font-family:fontawesome-webfont;display:inline-block}.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink{display:inline-block}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:super;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:#999}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none;padding-top:5px}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left;padding-left:0}.rst-content tt{color:#000}.rst-content tt big,.rst-content tt em{font-size:100% !important;line-height:normal}.rst-content tt .xref,a .rst-content tt{font-weight:bold}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:inline-block;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:gray}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040} diff --git a/doc/build/_static/font/fontawesome_webfont.eot b/doc/build/_static/font/fontawesome_webfont.eot deleted file mode 100644 index 0662cb96..00000000 Binary files a/doc/build/_static/font/fontawesome_webfont.eot and /dev/null differ diff --git a/doc/build/_static/font/fontawesome_webfont.svg b/doc/build/_static/font/fontawesome_webfont.svg deleted file mode 100644 index 2edb4ec3..00000000 --- a/doc/build/_static/font/fontawesome_webfont.svg +++ /dev/null @@ -1,399 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/doc/build/_static/font/fontawesome_webfont.ttf b/doc/build/_static/font/fontawesome_webfont.ttf deleted file mode 100644 index d3659246..00000000 Binary files a/doc/build/_static/font/fontawesome_webfont.ttf and /dev/null differ diff --git a/doc/build/_static/font/fontawesome_webfont.woff b/doc/build/_static/font/fontawesome_webfont.woff deleted file mode 100644 index b9bd17e1..00000000 Binary files a/doc/build/_static/font/fontawesome_webfont.woff and /dev/null differ diff --git a/doc/build/_static/js/theme.js b/doc/build/_static/js/theme.js deleted file mode 100644 index 60520cc3..00000000 --- a/doc/build/_static/js/theme.js +++ /dev/null @@ -1,47 +0,0 @@ -$( document ).ready(function() { - // Shift nav in mobile when clicking the menu. - $(document).on('click', "[data-toggle='wy-nav-top']", function() { - $("[data-toggle='wy-nav-shift']").toggleClass("shift"); - $("[data-toggle='rst-versions']").toggleClass("shift"); - }); - // Close menu when you click a link. - $(document).on('click', ".wy-menu-vertical .current ul li a", function() { - $("[data-toggle='wy-nav-shift']").removeClass("shift"); - $("[data-toggle='rst-versions']").toggleClass("shift"); - }); - $(document).on('click', "[data-toggle='rst-current-version']", function() { - $("[data-toggle='rst-versions']").toggleClass("shift-up"); - }); - // Make tables responsive - $("table.docutils:not(.field-list)").wrap("
"); -}); - -window.SphinxRtdTheme = (function (jquery) { - var stickyNav = (function () { - var navBar, - win, - stickyNavCssClass = 'stickynav', - applyStickNav = function () { - if (navBar.height() <= win.height()) { - navBar.addClass(stickyNavCssClass); - } else { - navBar.removeClass(stickyNavCssClass); - } - }, - enable = function () { - applyStickNav(); - win.on('resize', applyStickNav); - }, - init = function () { - navBar = jquery('nav.wy-nav-side:first'); - win = jquery(window); - }; - jquery(init); - return { - enable : enable - }; - }()); - return { - StickyNav : stickyNav - }; -}($)); diff --git a/doc/build/app.html b/doc/build/app.html deleted file mode 100644 index 1b463b34..00000000 --- a/doc/build/app.html +++ /dev/null @@ -1,1894 +0,0 @@ - - - - - - - - - - FlatCAM Application — Cirkuix 0.5 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -
-

FlatCAM Application

-
-

App

-
-
-class FlatCAM.App
-

The main application class. The constructor starts the GUI.

-
-
-disable_plots(except_current=False)
-

Disables all plots with exception of the current object if specified.

- --- - - - - - - - - -
Parameters:except_current – Wether to skip the current object.
Rtype except_current:
 boolean
Returns:None
-
- -
-
-file_chooser_action(on_success)
-

Opens the file chooser and runs on_success on a separate thread -upon completion of valid file choice.

- --- - - - - - -
Parameters:on_success (func) – A function to run upon completion of a valid file -selection. Takes 2 parameters: The app instance and the filename. -Note that it is run on a separate thread, therefore it must take the -appropriate precautions when accessing shared resources.
Returns:None
-
- -
-
-file_chooser_save_action(on_success)
-

Opens the file chooser and runs on_success upon completion of valid file choice.

- --- - - - - - -
Parameters:on_success – A function to run upon selection of a filename. Takes 2 -parameters: The instance of the application (App) and the chosen filename. This -gets run immediately in the same thread.
Returns:None
-
- -
-
-get_eval(widget_name)
-

Runs eval() on the on the text entry of name ‘widget_name’ -and returns the results.

- --- - - - - - -
Parameters:widget_name (str) – Name of Gtk.Entry
Returns:Depends on contents of the entry text.
-
- -
-
-get_radio_value(radio_set)
-

Returns the radio_set[key] of the radiobutton -whose name is key is active.

- --- - - - - - -
Parameters:radio_set (dict) – A dictionary containing widget_name: value pairs.
Returns:radio_set[key]
-
- -
-
-info(text)
-

Show text on the status bar. This method is thread safe.

- --- - - - - - -
Parameters:text (str) – Text to display.
Returns:None
-
- -
-
-load_defaults()
-

Loads the aplication’s default settings from defaults.json into -self.defaults.

- --- - - - -
Returns:None
-
- -
-
-new_object(kind, name, initialize)
-

Creates a new specalized FlatCAMObj and attaches it to the application, -this is, updates the GUI accordingly, any other records and plots it. -This method is thread-safe.

- --- - - - - - - - -
Parameters:
    -
  • kind (str) – The kind of object to create. One of ‘gerber’, -‘excellon’, ‘cncjob’ and ‘geometry’.
  • -
  • name (str) – Name for the object.
  • -
  • initialize (function) – Function to run after creation of the object -but before it is attached to the application. The function is -called with 2 parameters: the new object and the App instance.
  • -
-
Returns:

None

-
Return type:

None

-
-
- -
-
-on_about(widget)
-

Opens the ‘About’ dialog box.

- --- - - - - - -
Parameters:widget – Ignored.
Returns:None
-
- -
-
-on_activate_name(entry)
-

Hitting ‘Enter’ after changing the name of an item -updates the item dictionary and re-builds the item list.

- --- - - - - - -
Parameters:entry – The widget from which this was called.
Returns:None
-
- -
-
-on_canvas_configure(widget, event)
-

Called whenever the canvas changes size. The axes are updated such -as to use the whole canvas.

- --- - - - - - -
Parameters:
    -
  • widget – Ignored.
  • -
  • event – Ignored.
  • -
-
Returns:

None

-
-
- -
-
-on_cb_plot_toggled(widget)
-

Callback for toggling the “Plot” checkbox. Re-plots.

- --- - - - - - -
Parameters:widget – Ignored.
Returns:None
-
- -
-
-on_clear_plots(widget)
-

Callback for toolbar button. Clears all plots.

- --- - - - - - -
Parameters:widget – The widget from which this was called.
Returns:None
-
- -
-
-on_click_over_plot(event)
-

Callback for the mouse click event over the plot. This event is generated -by the Matplotlib backend and has been registered in self.__init__(). -For details, see: http://matplotlib.org/users/event_handling.html

-

Default actions are:

-
    -
  • Copy coordinates to clipboard. Ex.: (65.5473, -13.2679)
  • -
- --- - - - - - -
Parameters:event – Contains information about the event, like which button -was clicked, the pixel coordinates and the axes coordinates.
Returns:None
-
- -
-
-on_closewindow(param)
-

Callback for closing the main window.

- --- - - - - - -
Parameters:param – Whatever is passed by the event. Ignore.
Returns:None
-
- -
-
-on_cncjob_exportgcode(widget)
-

Called from button on CNCjob form to save the G-Code from the object.

- --- - - - - - -
Parameters:widget – The widget from which this was called.
Returns:None
-
- -
-
-on_create_aligndrill(widget)
-

Creates alignment holes Excellon object. Creates mirror duplicates -of the specified holes around the specified axis.

- --- - - - - - -
Parameters:widget – Ignored.
Returns:None
-
- -
-
-on_create_mirror(widget)
-

Creates a mirror image of an object to be used as a bottom layer.

- --- - - - - - -
Parameters:widget – Ignored.
Returns:None
-
- -
-
-on_delete(widget)
-

Delete the currently selected FlatCAMObj.

- --- - - - - - -
Parameters:widget – The widget from which this was called. Ignored.
Returns:None
-
- -
-
-on_entry_eval_activate(widget)
-

Called when an entry is activated (eg. by hitting enter) if -set to do so. Its text is eval()’d and set to the returned value. -The current object is updated.

- --- - - - - - -
Parameters:widget
Returns:
-
- -
-
-on_eval_update(widget)
-

Modifies the content of a Gtk.Entry by running -eval() on its contents and puting it back as a -string.

- --- - - - - - -
Parameters:widget – The widget from which this was called.
Returns:None
-
- -
-
-on_excellon_tool_choose(widget)
-

Callback for button on Excellon form to open up a window for -selecting tools.

- --- - - - - - -
Parameters:widget – The widget from which this was called.
Returns:None
-
- -
-
-on_file_new(param)
-

Callback for menu item File->New. Returns the application to its -startup state. This method is thread-safe.

- --- - - - - - -
Parameters:param – Whatever is passed by the event. Ignore.
Returns:None
-
- -
-
-on_file_openproject(param)
-

Callback for menu item File->Open Project. Opens a file chooser and calls -self.open_project() after successful selection of a filename.

- --- - - - - - -
Parameters:param – Ignored.
Returns:None
-
- -
-
-on_file_savedefaults(param)
-

Callback for menu item File->Save Defaults. Saves application default options -self.defaults to defaults.json.

- --- - - - - - -
Parameters:param – Ignored.
Returns:None
-
- -
-
-on_file_saveproject(param)
-

Callback for menu item File->Save Project. Saves the project to -self.project_filename or calls self.on_file_saveprojectas() -if set to None. The project is saved by calling self.save_project().

- --- - - - - - -
Parameters:param – Ignored.
Returns:None
-
- -
-
-on_file_saveprojectas(param)
-

Callback for menu item File->Save Project As... Opens a file -chooser and saves the project to the given file via -self.save_project().

- --- - - - - - -
Parameters:param – Ignored.
Returns:None
-
- -
-
-on_file_saveprojectcopy(param)
-

Callback for menu item File->Save Project Copy... Opens a file -chooser and saves the project to the given file via -self.save_project. It does not update self.project_filename so -subsequent save requests are done on the previous known filename.

- --- - - - - - -
Parameters:param – Ignore.
Returns:None
-
- -
-
-on_fileopenexcellon(param)
-

Callback for menu item File->Open Excellon. Defines a function that is then passed -to self.file_chooser_action(). It requests the creation of a FlatCAMExcellon object -and updates the progress bar throughout the process.

- --- - - - - - -
Parameters:param – Ignore
Returns:None
-
- -
-
-on_fileopengcode(param)
-

Callback for menu item File->Open G-Code. Defines a function that is then passed -to self.file_chooser_action(). It requests the creation of a FlatCAMCNCjob object -and updates the progress bar throughout the process.

- --- - - - - - -
Parameters:param – Ignore
Returns:None
-
- -
-
-on_fileopengerber(param)
-

Callback for menu item File->Open Gerber. Defines a function that is then passed -to self.file_chooser_action(). It requests the creation of a FlatCAMGerber object -and updates the progress bar throughout the process.

- --- - - - - - -
Parameters:param – Ignore
Returns:None
-
- -
-
-on_filequit(param)
-

Callback for menu item File->Quit. Closes the application.

- --- - - - - - -
Parameters:param – Whatever is passed by the event. Ignore.
Returns:None
-
- -
-
-on_generate_cncjob(widget)
-

Callback for button on geometry form to generate CNC job.

- --- - - - - - -
Parameters:widget – The widget from which this was called.
Returns:None
-
- -
-
-on_generate_excellon_cncjob(widget)
-

Callback for button active/click on Excellon form to -create a CNC Job for the Excellon file.

- --- - - - - - -
Parameters:widget – Ignored
Returns:None
-
- -
-
-on_generate_gerber_bounding_box(widget)
-

Callback for request from the Gerber form to generate a bounding box for the -geometry in the object. Creates a FlatCAMGeometry with the bounding box. -The box can have rounded corners if specified in the form.

- --- - - - - - -
Parameters:widget – Ignored.
Returns:None
-
- -
-
-on_generate_isolation(widget)
-

Callback for button on Gerber form to create isolation routing geometry.

- --- - - - - - -
Parameters:widget – The widget from which this was called.
Returns:None
-
- -
-
-on_generate_paintarea(widget)
-

Callback for button on geometry form. -Subscribes to the “Click on plot” event and continues -after the click. Finds the polygon containing -the clicked point and runs clear_poly() on it, resulting -in a new FlatCAMGeometry object.

- --- - - - - - -
Parameters:widget – The widget from which this was called.
Returns:None
-
- -
-
-on_gerber_generate_cutout(widget)
-

Callback for button on Gerber form to create geometry with lines -for cutting off the board.

- --- - - - - - -
Parameters:widget – The widget from which this was called.
Returns:None
-
- -
-
-on_gerber_generate_noncopper(widget)
-

Callback for button on Gerber form to create a geometry object -with polygons covering the area without copper or negative of the -Gerber.

- --- - - - - - -
Parameters:widget – The widget from which this was called.
Returns:None
-
- -
-
-on_key_over_plot(event)
-

Callback for the key pressed event when the canvas is focused. Keyboard -shortcuts are handled here. So far, these are the shortcuts:

- ---- - - - - - - - - - - - - - - - - - - - -
KeyAction
‘1’Zoom-fit. Fits the axes limits to the data.
‘2’Zoom-out.
‘3’Zoom-in.
‘m’Toggle on-off the measuring tool.
- --- - - - - - -
Parameters:event – Ignored.
Returns:None
-
- -
-
-on_mouse_move_over_plot(event)
-

Callback for the mouse motion event over the plot. This event is generated -by the Matplotlib backend and has been registered in self.__init__(). -For details, see: http://matplotlib.org/users/event_handling.html

- --- - - - - - -
Parameters:event – Contains information about the event.
Returns:None
-
- -
-
-on_offset_object(widget)
-

Offsets the object’s geometry by the vector specified -in the form. Re-plots.

- --- - - - - - -
Parameters:widget – Ignored
Returns:None
-
- -
-
-on_options_app2object(param)
-

Callback for Options->Transfer Options->App=>Object. Copies options -from application defaults to the currently selected object.

- --- - - - - - -
Parameters:param – Ignored.
Returns:None
-
- -
-
-on_options_app2project(param)
-

Callback for Options->Transfer Options->App=>Project. Copies options -from application defaults to project defaults.

- --- - - - - - -
Parameters:param – Ignored.
Returns:None
-
- -
-
-on_options_combo_change(widget)
-

Called when the combo box to choose between application defaults and -project option changes value. The corresponding variables are -copied to the UI.

- --- - - - - - -
Parameters:widget – The widget from which this was called. Ignore.
Returns:None
-
- -
-
-on_options_object2app(param)
-

Callback for Options->Transfer Options->Object=>App. Copies options -from the currently selected object to application defaults.

- --- - - - - - -
Parameters:param – Ignored.
Returns:None
-
- -
-
-on_options_object2project(param)
-

Callback for Options->Transfer Options->Object=>Project. Copies options -from the currently selected object to project defaults.

- --- - - - - - -
Parameters:param – Ignored.
Returns:None
-
- -
-
-on_options_project2app(param)
-

Callback for Options->Transfer Options->Project=>App. Copies options -from project defaults to application defaults.

- --- - - - - - -
Parameters:param – Ignored.
Returns:None
-
- -
-
-on_options_project2object(param)
-

Callback for Options->Transfer Options->Project=>Object. Copies options -from project defaults to the currently selected object.

- --- - - - - - -
Parameters:param – Ignored.
Returns:None
-
- -
-
-on_options_update(widget)
-

Called whenever a value in the options/defaults form changes. -All values are updated. Can be inhibited by setting self.options_update_ignore = True, -which may be necessary when updating the UI from code and not by the user.

- --- - - - - - -
Parameters:widget – The widget from which this was called. Ignore.
Returns:None
-
- -
-
-on_row_activated(widget, path, col)
-

Callback for selection activation (Enter or double-click) on the Project list. -Switches the notebook page to the object properties form. Calls -self.notebook.set_current_page(1).

- --- - - - - - -
Parameters:
    -
  • widget – Ignored.
  • -
  • path – Ignored.
  • -
  • col – Ignored.
  • -
-
Returns:

None

-
-
- -
-
-on_scale_object(widget)
-

Callback for request to change an objects geometry scale. The object -is re-scaled and replotted.

- --- - - - - - -
Parameters:widget – Ignored.
Returns:None
-
- -
-
-on_toggle_pointbox(widget)
-

Callback for radio selection change between point and box in the -Double-sided PCB tool. Updates the UI accordingly.

- --- - - - - - -
Parameters:widget – Ignored.
Returns:None
-
- -
-
-on_toggle_units(widget)
-

Callback for the Units radio-button change in the Options tab. -Changes the application’s default units or the current project’s units. -If changing the project’s units, the change propagates to all of -the objects in the project.

- --- - - - - - -
Parameters:widget – Ignored.
Returns:None
-
- -
-
-on_toolbar_replot(widget)
-

Callback for toolbar button. Re-plots all objects.

- --- - - - - - -
Parameters:widget – The widget from which this was called.
Returns:None
-
- -
-
-on_tools_doublesided(param)
-

Callback for menu item Tools->Double Sided PCB Tool. Launches the -tool placing its UI in the “Tool” tab in the notebook.

- --- - - - - - -
Parameters:param – Ignored.
Returns:None
-
- -
-
-on_update_plot(widget)
-

Callback for button on form for all kinds of objects. -Re-plots the current object only.

- --- - - - - - -
Parameters:widget – The widget from which this was called. Ignored.
Returns:None
-
- -
-
-on_zoom_fit(event)
-

Callback for zoom-out request. This can be either from the corresponding -toolbar button or the ‘1’ key when the canvas is focused. Calls self.adjust_axes() -with axes limits from the geometry bounds of all objects.

- --- - - - - - -
Parameters:event – Ignored.
Returns:None
-
- -
-
-on_zoom_in(event)
-

Callback for zoom-in request. This can be either from the corresponding -toolbar button or the ‘3’ key when the canvas is focused. Calls self.zoom().

- --- - - - - - -
Parameters:event – Ignored.
Returns:None
-
- -
-
-on_zoom_out(event)
-

Callback for zoom-out request. This can be either from the corresponding -toolbar button or the ‘2’ key when the canvas is focused. Calls self.zoom().

- --- - - - - - -
Parameters:event – Ignored.
Returns:None
-
- -
-
-open_project(filename)
-

Loads a project from the specified file.

- --- - - - - - -
Parameters:filename (str) – Name of the file from which to load.
Returns:None
-
- -
-
-options2form()
-

Sets the ‘Project Options’ or ‘Application Defaults’ form with values from -self.options or self.defaults.

- --- - - - - - -
Returns:None
Return type:None
-
- -
-
-plot_all()
-

Re-generates all plots from all objects.

- --- - - - -
Returns:None
-
- -
-
-populate_objects_combo(combo)
-

Populates a Gtk.Comboboxtext with the list of the object in the project.

- --- - - - - - -
Parameters:combo (str or Gtk.ComboBoxText) – Name or instance of the comboboxtext.
Returns:None
-
- -
-
-read_form()
-

Reads the options form into self.defaults/self.options.

- --- - - - - - -
Returns:None
Return type:None
-
- -
-
-read_form_item(name, dest)
-

Reads the value of a form item in the defaults/options form and -saves it to the corresponding dictionary.

- --- - - - - - -
Parameters:
    -
  • name (str) – Name of the form item. A key in self.defaults or -self.options.
  • -
  • dest (dict) – Dictionary to which to save the value.
  • -
-
Returns:

None

-
-
- -
-
-save_project(filename)
-

Saves the current project to the specified file.

- --- - - - - - -
Parameters:filename (str) – Name of the file in which to save.
Returns:None
-
- -
-
-set_form_item(name, value)
-

Sets a form item ‘name’ in the GUI with the given ‘value’. The syntax of -form names in the GUI is <kind>_app_<name>, where kind is one of: rb (radio button), -cb (check button), entry_eval or entry_text (entry), combo (combo box). name is -whatever name it’s been given. For self.defaults, name is a key in the dictionary.

- --- - - - - - -
Parameters:
    -
  • name (str) – Name of the form field.
  • -
  • value (Depends on field kind.) – The value to set the form field to.
  • -
-
Returns:

None

-
-
- -
-
-set_progress_bar(percentage, text='')
-

Sets the application’s progress bar to a given frac_digits and text.

- --- - - - - - -
Parameters:
    -
  • percentage (float) – The frac_digits (0.0-1.0) of the progress.
  • -
  • text (str) – Text to display on the progress bar.
  • -
-
Returns:

None

-
-
- -
-
-setup_component_editor()
-

Initial configuration of the component editor. Creates -a page titled “Selection” on the notebook on the left -side of the main window.

- --- - - - -
Returns:None
-
- -
-
-setup_obj_classes()
-

Sets up application specifics on the FlatCAMObj class.

- --- - - - -
Returns:None
-
- -
-
-version_check(*args)
-

Checks for the latest version of the program. Alerts the -user if theirs is outdated. This method is meant to be run -in a saeparate thread.

- --- - - - -
Returns:None
-
- -
- -
-
-

PlotCanvas

-
-
-class FlatCAM.PlotCanvas(container)
-

Class handling the plotting area in the application.

-
-
-adjust_axes(xmin, ymin, xmax, ymax)
-

Adjusts all axes while maintaining the use of the whole canvas -and an aspect ratio to 1:1 between x and y axes. The parameters are an original -request that will be modified to fit these restrictions.

- --- - - - - - -
Parameters:
    -
  • xmin (float) – Requested minimum value for the X axis.
  • -
  • ymin (float) – Requested minimum value for the Y axis.
  • -
  • xmax (float) – Requested maximum value for the X axis.
  • -
  • ymax (float) – Requested maximum value for the Y axis.
  • -
-
Returns:

None

-
-
- -
-
-auto_adjust_axes(*args)
-

Calls adjust_axes() using the extents of the base axes.

-

:rtype : None -:return: None

-
- -
-
-clear()
-

Clears axes and figure.

- --- - - - -
Returns:None
-
- -
-
-connect(event_name, callback)
-

Attach an event handler to the canvas through the native GTK interface.

- --- - - - - - -
Parameters:
    -
  • event_name (str) – Name of the event
  • -
  • callback (function) – Function to call
  • -
-
Returns:

Nothing

-
-
- -
-
-mpl_connect(event_name, callback)
-

Attach an event handler to the canvas through the Matplotlib interface.

- --- - - - - - - - -
Parameters:
    -
  • event_name (str) – Name of the event
  • -
  • callback (func) – Function to call
  • -
-
Returns:

Connection id

-
Return type:

int

-
-
- -
-
-mpl_disconnect(cid)
-

Disconnect callback with the give id. -:param cid: Callback id. -:return: None

-
- -
-
-new_axes(name)
-

Creates and returns an Axes object attached to this object’s Figure.

- --- - - - - - - - -
Parameters:name – Unique label for the axes.
Returns:Axes attached to the figure.
Return type:Axes
-
- -
-
-on_key_down(event)
-
--- - - - - - -
Parameters:event
Returns:
-
- -
-
-on_key_up(event)
-
--- - - - - - -
Parameters:event
Returns:
-
- -
-
-on_mouse_move(event)
-

Mouse movement event hadler.

- --- - - - - - -
Parameters:event – Contains information about the event.
Returns:None
-
- -
-
-on_scroll(canvas, event)
-

Scroll event handler.

- --- - - - - - -
Parameters:
    -
  • canvas – The widget generating the event. Ignored.
  • -
  • event – Event object containing the event information.
  • -
-
Returns:

None

-
-
- -
-
-zoom(factor, center=None)
-

Zooms the plot by factor around a given -center point. Takes care of re-drawing.

- --- - - - - - -
Parameters:
    -
  • factor (float) – Number by which to scale the plot.
  • -
  • center (list) – Coordinates [x, y] of the point around which to scale the plot.
  • -
-
Returns:

None

-
-
- -
- -
-
-

ObjectCollection

-
-
-class FlatCAM.ObjectCollection
-
-
-append(obj, active=False)
-

Add a FlatCAMObj the the collection. This method is thread-safe.

- --- - - - - - -
Parameters:
    -
  • obj (FlatCAMObj) – FlatCAMObj to append
  • -
  • active (bool) – If it is to become the active object after appending
  • -
-
Returns:

None

-
-
- -
-
-change_name(old_name, new_name)
-

Changes the name of FlatCAMObj named old_name to new_name.

- --- - - - - - - - -
Parameters:
    -
  • old_name (str) – Name of the object to change.
  • -
  • new_name (str) – New name.
  • -
-
Returns:

True if name change succeeded, False otherwise. Will fail -if no object with old_name is found.

-
Return type:

bool

-
-
- -
-
-get_bounds()
-

Finds coordinates bounding all objects in the collection.

- --- - - - - - -
Returns:[xmin, ymin, xmax, ymax]
Return type:list
-
- -
-
-get_by_name(name)
-

Fetches the FlatCAMObj with the given name.

- --- - - - - - - - -
Parameters:name (str) – The name of the object.
Returns:The requested object or None if no such object.
Return type:FlatCAMObj or None
-
- -
-
-get_list()
-

Returns a list with all FlatCAMObj.

- --- - - - - - -
Returns:List with all FlatCAMObj.
Return type:list
-
- -
-
-get_names()
-

Gets a list of the names of all objects in the collection.

- --- - - - - - -
Returns:List of names.
Return type:list
-
- -
-
-on_list_selection_change(selection)
-

Callback for change in selection on the objects’ list. -Instructs the new selection to build the UI for its options.

- --- - - - - - -
Parameters:selection – Ignored.
Returns:None
-
- -
-
-on_row_activated(*args)
-

Does nothing right now. -:param args: Ignored. -:return: None

-
- -
-
-set_active(name)
-

Sets an object as the active object in the program. Same -as set_list_selection().

- --- - - - - - -
Parameters:name (str) – Name of the object.
Returns:None
-
- -
-
-set_list_selection(name)
-

Sets which object should be selected in the list.

- --- - - - - - - - -
Parameters:name – Name of the object.
Rtype name:str
Returns:None
-
- -
- -
-
-

Measurement

-
-
-class FlatCAM.Measurement(container, plotcanvas, update=None)
-
- -
-
- - -
- -
-
- -
- -
- - - - \ No newline at end of file diff --git a/doc/build/camlib.html b/doc/build/camlib.html deleted file mode 100644 index b81ed968..00000000 --- a/doc/build/camlib.html +++ /dev/null @@ -1,1329 +0,0 @@ - - - - - - - - - - Camlib — Cirkuix 0.5 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -
-

Camlib

-
-

Geometry

-
-
-class camlib.Geometry
-
-
-bounds()
-

Returns coordinates of rectangular bounds -of geometry: (xmin, ymin, xmax, ymax).

-
- -
-
-clear_polygon(polygon, tooldia, overlap=0.15)
-

Creates geometry inside a polygon for a tool to cover -the whole area.

-
- -
-
-convert_units(units)
-

Converts the units of the object to units by scaling all -the geometry appropriately. This call scale(). Don’t call -it again in descendents.

- --- - - - - - - - -
Parameters:units (str) – “IN” or “MM”
Returns:Scaling factor resulting from unit change.
Return type:float
-
- -
-
-from_dict(d)
-

Sets object’s attributes from a dictionary. -Attributes to include are listed in self.ser_attrs. -This method will look only for only and all the -attributes in self.ser_attrs. They must all -be present. Use only for deserializing saved -objects.

- --- - - - - - -
Parameters:d (dict) – Dictionary of attributes to set in the object.
Returns:None
-
- -
-
-get_empty_area(boundary=None)
-

Returns the complement of self.solid_geometry within -the given boundary polygon. If not specified, it defaults to -the rectangular bounding box of self.solid_geometry.

-
- -
-
-isolation_geometry(offset)
-

Creates contours around geometry at a given -offset distance.

- --- - - - - - - - -
Parameters:offset (float) – Offset distance.
Returns:The buffered geometry.
Return type:Shapely.MultiPolygon or Shapely.Polygon
-
- -
-
-offset(vect)
-

Offset the geometry by the given vector. Override this method.

- --- - - - - - -
Parameters:vect (tuple) – (x, y) vector by which to offset the object.
Returns:None
-
- -
-
-scale(factor)
-

Scales all of the object’s geometry by a given factor. Override -this method. -:param factor: Number by which to scale. -:type factor: float -:return: None -:rtype: None

-
- -
-
-size()
-

Returns (width, height) of rectangular -bounds of geometry.

-
- -
-
-to_dict()
-

Returns a respresentation of the object as a dictionary. -Attributes to include are listed in self.ser_attrs.

- --- - - - - - -
Returns:A dictionary-encoded copy of the object.
Return type:dict
-
- -
- -
-
-

Gerber

-
-
-class camlib.Gerber(Geometry)
-

ATTRIBUTES

-
    -
  • apertures (dict): The keys are names/identifiers of each aperture. -The values are dictionaries key/value pairs which describe the aperture. The -type key is always present and the rest depend on the key:
  • -
- ---- - - - - - - - - - - - - - -
KeyValue
type(str) “C”, “R”, “O”, “P”, or “AP”
othersDepend on type
-
    -
  • paths (list): A path is described by a line an aperture that follows that -line. Each paths[i] is a dictionary:
  • -
- ---- - - - - - - - - - - - - - -
KeyValue
linestring(Shapely.LineString) The actual path.
aperture(str) The key for an aperture in apertures.
-
    -
  • flashes (list): Flashes are single-point strokes of an aperture. Each -is a dictionary:
  • -
- ---- - - - - - - - - - - - - - -
KeyValue
loc(Point) Shapely Point indicating location.
aperture(str) The key for an aperture in apertures.
-
    -
  • regions (list): Are surfaces defined by a polygon (Shapely.Polygon), -which have an exterior and zero or more interiors. An aperture is also -associated with a region. Each is a dictionary:
  • -
- ---- - - - - - - - - - - - - - -
KeyValue
polygon(Shapely.Polygon) The polygon defining the region.
aperture(str) The key for an aperture in apertures.
-
    -
  • aperture_macros (dictionary): Are predefined geometrical structures -that can be instanciated with different parameters in an aperture -definition. See apertures above. The key is the name of the macro, -and the macro itself, the value, is a Aperture_Macro object.
  • -
  • flash_geometry (list): List of (Shapely) geometric object resulting -from flashes. These are generated from flashes in do_flashes().
  • -
  • buffered_paths (list): List of (Shapely) polygons resulting from -buffering (or thickening) the paths with the aperture. These are -generated from paths in buffer_paths().
  • -
-

USAGE:

-
g = Gerber()
-g.parse_file(filename)
-g.create_geometry()
-do_something(s.solid_geometry)
-
-
-
-
-aperture_parse(apertureId, apertureType, apParameters)
-

Parse gerber aperture definition into dictionary of apertures. -The following kinds and their attributes are supported:

-
    -
  • Circular (C): size (float)
  • -
  • Rectangle (R): width (float), height (float)
  • -
  • Obround (O): width (float), height (float).
  • -
  • Polygon (P): diameter(float), vertices(int), [rotation(float)]
  • -
  • Aperture Macro (AM): macro (ApertureMacro), modifiers (list)
  • -
- --- - - - - - - - -
Parameters:
    -
  • apertureId (str) – Id of the aperture being defined.
  • -
  • apertureType (str) – Type of the aperture.
  • -
  • apParameters (str) – Parameters of the aperture.
  • -
-
Returns:

Identifier of the aperture.

-
Return type:

str

-
-
- -
-
-buffer_paths()
-

This is part of the parsing process. “Thickens” the paths -by their appertures. This will only work for circular appertures.

- --- - - - -
Returns:None
-
- -
-
-create_geometry()
-

Geometry from a Gerber file is made up entirely of polygons. -Every stroke (linear or circular) has an aperture which gives -it thickness. Additionally, aperture strokes have non-zero area, -and regions naturally do as well.

-

:rtype : None -:return: None

-
- -
-
-do_flashes()
-

Creates geometry for Gerber flashes (aperture on a single point).

-
- -
-
-fix_regions()
-

Overwrites the region polygons with fixed -versions if found to be invalid (according to Shapely).

- --- - - - -
Returns:None
-
- -
-
-frac_digits = None
-

Number of fraction digits in Gerber numbers. Used during parsing.

-
- -
-
-get_bounding_box(margin=0.0, rounded=False)
-

Creates and returns a rectangular polygon bounding at a distance of -margin from the object’s solid_geometry. If margin > 0, the polygon -can optionally have rounded corners of radius equal to margin.

- --- - - - - - - - -
Parameters:
    -
  • margin (float) – Distance to enlarge the rectangular bounding -box in both positive and negative, x and y axes.
  • -
  • rounded (bool) – Wether or not to have rounded corners.
  • -
-
Returns:

The bounding box.

-
Return type:

Shapely.Polygon

-
-
- -
-
-int_digits = None
-

Number of integer digits in Gerber numbers. Used during parsing.

-
- -
-
-mirror(axis, point)
-

Mirrors the object around a specified axis passign through -the given point. What is affected:

-
    -
  • buffered_paths
  • -
  • flash_geometry
  • -
  • solid_geometry
  • -
  • regions
  • -
-

NOTE: -Does not modify the data used to create these elements. If these -are recreated, the scaling will be lost. This behavior was modified -because of the complexity reached in this class.

- --- - - - - - -
Parameters:
    -
  • axis (str) – “X” or “Y” indicates around which axis to mirror.
  • -
  • point (list) – [x, y] point belonging to the mirror axis.
  • -
-
Returns:

None

-
-
- -
-
-offset(vect)
-

Offsets the objects’ geometry on the XY plane by a given vector. -These are:

-
    -
  • buffered_paths
  • -
  • flash_geometry
  • -
  • solid_geometry
  • -
  • regions
  • -
-

NOTE: -Does not modify the data used to create these elements. If these -are recreated, the scaling will be lost. This behavior was modified -because of the complexity reached in this class.

- --- - - - - - -
Parameters:vect (tuple) – (x, y) offset vector.
Returns:None
-
- -
-
-parse_file(filename)
-

Calls Gerber.parse_lines() with array of lines -read from the given file.

- --- - - - - - -
Parameters:filename (str) – Gerber file to parse.
Returns:None
-
- -
-
-parse_lines(glines)
-

Main Gerber parser. Reads Gerber and populates self.paths, self.apertures, -self.flashes, self.regions and self.units.

- --- - - - - - - - -
Parameters:glines (list) – Gerber code as list of strings, each element being -one line of the source file.
Returns:None
Return type:None
-
- -
-
-scale(factor)
-

Scales the objects’ geometry on the XY plane by a given factor. -These are:

-
    -
  • buffered_paths
  • -
  • flash_geometry
  • -
  • solid_geometry
  • -
  • regions
  • -
-

NOTE: -Does not modify the data used to create these elements. If these -are recreated, the scaling will be lost. This behavior was modified -because of the complexity reached in this class.

- --- - - - -
Parameters:factor (float) – Number by which to scale.
-

:rtype : None

-
- -
- -
-
-

ApertureMacro

-
-
-class camlib.ApertureMacro(name=None)
-
-
-append(data)
-

Appends a string to the raw macro.

- --- - - - - - -
Parameters:data (str) – Part of the macro.
Returns:None
-
- -
-
-static default2zero(n, mods)
-

Pads the mods list with zeros resulting in an -list of length n.

- --- - - - - - - - -
Parameters:
    -
  • n (int) – Length of the resulting list.
  • -
  • mods (list) – List to be padded.
  • -
-
Returns:

Zero-padded list.

-
Return type:

list

-
-
- -
-
-from_dict(d)
-

Populates the object from a serial representation created -with self.to_dict().

- --- - - - - - -
Parameters:d – Serial representation of an ApertureMacro object.
Returns:None
-
- -
-
-static make_centerline(mods)
-
--- - - - - - -
Parameters:mods – (Exposure 0/1, width >=0, height >=0, x-center, y-center, -rotation angle around origin in degrees)
Returns:
-
- -
-
-static make_circle(mods)
-
--- - - - - - -
Parameters:mods – (Exposure 0/1, Diameter >=0, X-coord, Y-coord)
Returns:
-
- -
-
-make_geometry(modifiers)
-

Runs the macro for the given modifiers and generates -the corresponding geometry.

- --- - - - -
Parameters:modifiers (list) – Modifiers (parameters) for this macro
-
- -
-
-static make_lowerleftline(mods)
-
--- - - - - - -
Parameters:mods – (exposure 0/1, width >=0, height >=0, x-lowerleft, y-lowerleft, -rotation angle around origin in degrees)
Returns:
-
- -
-
-static make_moire(mods)
-

Note: Specs indicate that rotation is only allowed if the center -(x, y) == (0, 0). I will tolerate breaking this rule.

- --- - - - - - -
Parameters:mods – (x-center, y-center, outer_dia_outer_ring, ring thickness, -gap, max_rings, crosshair_thickness, crosshair_len, rotation -angle around origin in degrees)
Returns:
-
- -
-
-static make_outline(mods)
-
--- - - - - - -
Parameters:mods
Returns:
-
- -
-
-static make_polygon(mods)
-

Note: Specs indicate that rotation is only allowed if the center -(x, y) == (0, 0). I will tolerate breaking this rule.

- --- - - - - - -
Parameters:mods – (exposure 0/1, n_verts 3<=n<=12, x-center, y-center, -diameter of circumscribed circle >=0, rotation angle around origin)
Returns:
-
- -
-
-static make_thermal(mods)
-

Note: Specs indicate that rotation is only allowed if the center -(x, y) == (0, 0). I will tolerate breaking this rule.

- --- - - - - - -
Parameters:mods – [x-center, y-center, diameter-outside, diameter-inside, -gap-thickness, rotation angle around origin]
Returns:
-
- -
-
-static make_vectorline(mods)
-
--- - - - - - -
Parameters:mods – (Exposure 0/1, Line width >= 0, X-start, Y-start, X-end, Y-end, -rotation angle around origin in degrees)
Returns:
-
- -
-
-parse_content()
-

Creates numerical lists for all primitives in the aperture -macro (in self.raw) by replacing all variables by their -values iteratively and evaluating expressions. Results -are stored in self.primitives.

- --- - - - -
Returns:None
-
- -
-
-to_dict()
-

Returns the object in a serializable form. Only the name and -raw are required.

- --- - - - - - -
Returns:Dictionary representing the object. JSON ready.
Return type:dict
-
- -
- -
-
-

Excellon

-
-
-class camlib.Excellon(Geometry)
-

ATTRIBUTES

-
    -
  • tools (dict): The key is the tool name and the value is -a dictionary specifying the tool:
  • -
- ---- - - - - - - - - - - - - - -
KeyValue
CDiameter of the tool
OthersNot supported (Ignored).
-
    -
  • drills (list): Each is a dictionary:
  • -
- ---- - - - - - - - - - - - - - -
KeyValue
point(Shapely.Point) Where to drill
tool(str) A key in tools
-
-
-create_geometry()
-

Creates circles of the tool diameter at every point -specified in self.drills.

- --- - - - -
Returns:None
-
- -
-
-mirror(axis, point)
-
--- - - - - - -
Parameters:
    -
  • axis (str) – “X” or “Y” indicates around which axis to mirror.
  • -
  • point (list) – [x, y] point belonging to the mirror axis.
  • -
-
Returns:

None

-
-
- -
-
-offset(vect)
-

Offsets geometry on the XY plane in the object by a given vector.

- --- - - - - - -
Parameters:vect (tuple) – (x, y) offset vector.
Returns:None
-
- -
-
-parse_file(filename)
-

Reads the specified file as array of lines as -passes it to parse_lines().

- --- - - - - - -
Parameters:filename (str) – The file to be read and parsed.
Returns:None
-
- -
-
-parse_lines(elines)
-

Main Excellon parser.

- --- - - - - - -
Parameters:elines (list) – List of strings, each being a line of Excellon code.
Returns:None
-
- -
-
-scale(factor)
-

Scales geometry on the XY plane in the object by a given factor. -Tool sizes, feedrates an Z-plane dimensions are untouched.

- --- - - - - - - - -
Parameters:factor (float) – Number by which to scale the object.
Returns:None
Return type:NOne
-
- -
- -
-
-

CNCJob

-
-
-class camlib.CNCjob(Geometry)
-

Represents work to be done by a CNC machine.

-

ATTRIBUTES

-
    -
  • gcode_parsed (list): Each is a dictionary:
  • -
- ---- - - - - - - - - - - - - - -
KeyValue
geom(Shapely.LineString) Tool path (XY plane)
kind(string) “AB”, A is “T” (travel) or -“C” (cut). B is “F” (fast) or “S” (slow).
-
-
-gcode_parse()
-

G-Code parser (from self.gcode). Generates dictionary with -single-segment LineString’s and “kind” indicating cut or travel, -fast or feedrate speed.

-
- -
-
-generate_from_excellon(exobj)
-

Generates G-code for drilling from Excellon object. -self.gcode becomes a list, each element is a -different job for each tool in the excellon code.

-
- -
-
-generate_from_excellon_by_tool(exobj, tools='all')
-

Creates gcode for this object from an Excellon object -for the specified tools.

- --- - - - - - - - - - -
Parameters:
    -
  • exobj (Excellon) – Excellon object to process
  • -
  • tools – Comma separated tool names
  • -
-
Type:

tools: str

-
Returns:

None

-
Return type:

None

-
-
- -
-
-generate_from_geometry(geometry, append=True, tooldia=None, tolerance=0)
-

Generates G-Code from a Geometry object. Stores in self.gcode.

- --- - - - - - - - -
Parameters:
    -
  • geometry (Geometry) – Geometry defining the toolpath
  • -
  • append (bool) – Wether to append to self.gcode or re-write it.
  • -
  • tooldia (bool) – If given, sets the tooldia property but does -not affect the process in any other way.
  • -
  • tolerance – All points in the simplified object will be within the -tolerance distance of the original geometry.
  • -
-
Returns:

None

-
Return type:

None

-
-
- -
-
-linear2gcode(linear, tolerance=0)
-

Generates G-code to cut along the linear feature.

- --- - - - - - - - - - -
Parameters:
    -
  • linear – The path to cut along.
  • -
  • tolerance (float) – All points in the simplified object will be within the -tolerance distance of the original geometry.
  • -
-
Type:

Shapely.LinearRing or Shapely.Linear String

-
Returns:

G-code to cut alon the linear feature.

-
Return type:

str

-
-
- -
-
-offset(vect)
-

Offsets all the geometry on the XY plane in the object by the -given vector.

- --- - - - - - -
Parameters:vect (tuple) – (x, y) offset vector.
Returns:None
-
- -
-
-plot2(axes, tooldia=None, dpi=75, margin=0.1, color={'C': ['#5E6CFF', '#4650BD'], 'T': ['#F0E24D', '#B5AB3A']}, alpha={'C': 1.0, 'T': 0.3}, tool_tolerance=0.0005)
-

Plots the G-code job onto the given axes.

- --- - - - - - -
Parameters:
    -
  • axes – Matplotlib axes on which to plot.
  • -
  • tooldia – Tool diameter.
  • -
  • dpi – Not used!
  • -
  • margin – Not used!
  • -
  • color – Color specification.
  • -
  • alpha – Transparency specification.
  • -
  • tool_tolerance – Tolerance when drawing the toolshape.
  • -
-
Returns:

None

-
-
- -
-
-polygon2gcode(polygon, tolerance=0)
-

Creates G-Code for the exterior and all interior paths -of a polygon.

- --- - - - - - - - -
Parameters:
    -
  • polygon (Shapely.Polygon) – A Shapely.Polygon
  • -
  • tolerance (float) – All points in the simplified object will be within the -tolerance distance of the original geometry.
  • -
-
Returns:

G-code to cut along polygon.

-
Return type:

str

-
-
- -
-
-pre_parse(gtext)
-

Separates parts of the G-Code text into a list of dictionaries. -Used by self.gcode_parse().

- --- - - - -
Parameters:gtext – A single string with g-code
-
- -
-
-scale(factor)
-

Scales all the geometry on the XY plane in the object by the -given factor. Tool sizes, feedrates, or Z-axis dimensions are -not altered.

- --- - - - - - - - -
Parameters:factor (float) – Number by which to scale the object.
Returns:None
Return type:None
-
- -
- -
-
- - -
- -
-
- -
- -
- - - - \ No newline at end of file diff --git a/doc/build/devman.html b/doc/build/devman.html deleted file mode 100644 index 35a8adca..00000000 --- a/doc/build/devman.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - FlatCAM Developer Manual — Cirkuix 0.5 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -
-

FlatCAM Developer Manual

-
-

Options

-

There are Application Defaults, Project Options and Object Options in FlatCAM.

-

Application Defaults are stored in app.defaults. This gets populated (updated) from the defaults.json file upon startup. These can be edited from the Options tab, where each widget calls app.on_options_update() if a change is detected. This function iterates over the keys of app.defaults and reads the GUI elements whose name is type + "_app_" key. Therefore, for an option to be recognized, it must be added to defaults.json in the first place. When saving, done in app.on_file_savedefaults(), the file is updated, not overwritten.

-

Project Options inherit all options from Application Defaults upon startup. They can be changed thereafter from the UI or by opening a project, which contain previously saved Project Options. These are store in app.options and can be written and read from the Options tab in the same way as with Application defaults.

-

Object Options for each object are inherited from Project Options upon creation of each new object. They can be modified independently from the Project’s options thereafter through the UI, where the widget containing the option is identified by name: type + kind + "_" + option. They are stored in object.options. They are saved along the Project options when saving the project.

-

The syntax of UI widget names contain a type, which identifies what type of widget it is and how its value is supposed to be fetched, and a kind, which refer to what kind of FlatCAM Object it is for.

-
-
-

Serialization

-

Serialization refers to converting objects into a form that can be saved in a text file and recontructing objects from a text file.

-

Saving and loading projects require serialization. These are done in App.save_project(filename) and App.open_project(filename).

-

Serialization in FlatCAM takes 2 forms. The first is calling objects’ to_dict() method, which is inherited from Geometry.to_dict():

-
def to_dict(self):
-    """
-    Returns a respresentation of the object as a dictionary.
-    Attributes to include are listed in ``self.ser_attrs``.
-
-    :return: A dictionary-encoded copy of the object.
-    :rtype: dict
-    """
-    d = {}
-    for attr in self.ser_attrs:
-        d[attr] = getattr(self, attr)
-    return d
-
-
-

This creates a dictionary with attributes specified in the object’s ser_attrs list. If these are not in a serialized form, they will be processed later by the function to_dict():

-
def to_dict(geo):
-    """
-    Makes a Shapely geometry object into serializeable form.
-
-    :param geo: Shapely geometry.
-    :type geo: BaseGeometry
-    :return: Dictionary with serializable form if ``geo`` was
-        BaseGeometry, otherwise returns ``geo``.
-    """
-    if isinstance(geo, BaseGeometry):
-        return {
-            "__class__": "Shply",
-            "__inst__": sdumps(geo)
-        }
-    return geo
-
-
-

This is used in json.dump(d, f, default=to_dict) and is applied to objects that json encounters to be in a non-serialized form.

-
-
-

Geometry Processing

-
-
- - -
- -
-
- -
- -
- - - - \ No newline at end of file diff --git a/doc/build/flatcamobj.html b/doc/build/flatcamobj.html deleted file mode 100644 index 9cf0151a..00000000 --- a/doc/build/flatcamobj.html +++ /dev/null @@ -1,451 +0,0 @@ - - - - - - - - - - FlatCAM Objects — Cirkuix 0.5 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -
-

FlatCAM Objects

-
-

FlatCAMObj

-
-
-class FlatCAM.FlatCAMObj(name)
-

Base type of objects handled in FlatCAM. These become interactive -in the GUI, can be plotted, and their options can be modified -by the user in their respective forms.

-
-
-build_ui()
-

Sets up the UI/form for this object.

- --- - - - - - -
Returns:None
Return type:None
-
- -
-
-deserialize(obj_dict)
-

Re-builds an object from its serialized version.

- --- - - - - - -
Parameters:obj_dict (dict) – Dictionary representing a FlatCAMObj
Returns:None
-
- -
-
-plot()
-

Plot this object (Extend this method to implement the actual plotting). -Axes get created, appended to canvas and cleared before plotting. -Call this in descendants before doing the plotting.

- --- - - - - - -
Returns:Whether to continue plotting or not depending on the “plot” option.
Return type:bool
-
- -
-
-read_form()
-

Reads form into self.options.

- --- - - - - - -
Returns:None
Return type:None
-
- -
-
-read_form_item(option)
-

Reads the specified option from the UI form into self.options.

- --- - - - - - -
Parameters:option (str) – Name of the option.
Returns:None
-
- -
-
-serialize()
-

Returns a representation of the object as a dictionary so -it can be later exported as JSON. Override this method.

- --- - - - - - -
Returns:Dictionary representing the object
Return type:dict
-
- -
-
-set_form_item(option)
-

Copies the specified option to the UI form.

- --- - - - - - -
Parameters:option (str) – Name of the option (Key in self.options).
Returns:None
-
- -
-
-setup_axes(figure)
-

1) Creates axes if they don’t exist. 2) Clears axes. 3) Attaches -them to figure if not part of the figure. 4) Sets transparent -background. 5) Sets 1:1 scale aspect ratio.

- --- - - - - - - - -
Parameters:figure (matplotlib.figure.Figure) – A Matplotlib.Figure on which to add/configure axes.
Returns:None
Return type:None
-
- -
-
-to_form()
-

Copies options to the UI form.

- --- - - - -
Returns:None
-
- -
- -
-
-

FlatCAMGerber

-
-
-class FlatCAM.FlatCAMGerber(name)
-

Represents Gerber code.

-
-
-convert_units(units)
-

Converts the units of the object by scaling dimensions in all geometry -and options.

- --- - - - - - - - -
Parameters:units (str) – Units to which to convert the object: “IN” or “MM”.
Returns:None
Return type:None
-
- -
- -
-
-

FlatCAMExcellon

-
-
-class FlatCAM.FlatCAMExcellon(name)
-

Represents Excellon/Drill code.

-
- -
-
-

FlatCAMCNCjob

-
-
-class FlatCAM.FlatCAMCNCjob(name, units='in', kind='generic', z_move=0.1, feedrate=3.0, z_cut=-0.002, tooldia=0.0)
-

Represents G-Code.

-
- -
-
-

FlatCAMGeometry

-
-
-class FlatCAM.FlatCAMGeometry(name)
-

Geometric object not associated with a specific -format.

-
-
-offset(vect)
-

Offsets all geometry by a given vector/

- --- - - - - - - - -
Parameters:vect (tuple) – (x, y) vector by which to offset the object’s geometry.
Returns:None
Return type:None
-
- -
-
-plot()
-

Plots the object into its axes. If None, of if the axes -are not part of the app’s figure, it fetches new ones.

- --- - - - -
Returns:None
-
- -
-
-scale(factor)
-

Scales all geometry by a given factor.

- --- - - - - - - - -
Parameters:factor (float) – Factor by which to scale the object’s geometry/
Returns:None
Return type:None
-
- -
- -
-
- - -
- -
-
- -
- -
- - - - \ No newline at end of file diff --git a/doc/build/genindex.html b/doc/build/genindex.html deleted file mode 100644 index 25e8b0bd..00000000 --- a/doc/build/genindex.html +++ /dev/null @@ -1,1065 +0,0 @@ - - - - - - - - - - - Index — Cirkuix 0.5 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
-
    -
  • Docs »
  • - -
  • -
  • - -
  • -
-
-
-
- - -

Index

- -
- A - | B - | C - | D - | E - | F - | G - | I - | L - | M - | N - | O - | P - | R - | S - | T - | V - | Z - -
-

A

- - - -
- -
adjust_axes() (FlatCAM.PlotCanvas method) -
- - -
aperture_parse() (camlib.Gerber method) -
- - -
ApertureMacro (class in camlib) -
- -
- -
App (class in FlatCAM) -
- - -
append() (camlib.ApertureMacro method) -
- -
- -
(FlatCAM.ObjectCollection method) -
- -
- -
auto_adjust_axes() (FlatCAM.PlotCanvas method) -
- -
- -

B

- - - -
- -
bounds() (camlib.Geometry method) -
- - -
buffer_paths() (camlib.Gerber method) -
- -
- -
build_ui() (FlatCAM.FlatCAMObj method) -
- -
- -

C

- - - -
- -
camlib (module) -
- - -
change_name() (FlatCAM.ObjectCollection method) -
- - -
clear() (FlatCAM.PlotCanvas method) -
- - -
clear_polygon() (camlib.Geometry method) -
- -
- -
CNCjob (class in camlib) -
- - -
connect() (FlatCAM.PlotCanvas method) -
- - -
convert_units() (camlib.Geometry method) -
- -
- -
(FlatCAM.FlatCAMGerber method) -
- -
- -
create_geometry() (camlib.Excellon method) -
- -
- -
(camlib.Gerber method) -
- -
-
- -

D

- - - -
- -
default2zero() (camlib.ApertureMacro static method) -
- - -
deserialize() (FlatCAM.FlatCAMObj method) -
- -
- -
disable_plots() (FlatCAM.App method) -
- - -
do_flashes() (camlib.Gerber method) -
- -
- -

E

- - -
- -
Excellon (class in camlib) -
- -
- -

F

- - - -
- -
file_chooser_action() (FlatCAM.App method) -
- - -
file_chooser_save_action() (FlatCAM.App method) -
- - -
fix_regions() (camlib.Gerber method) -
- - -
FlatCAM (module), [1] -
- - -
FlatCAMCNCjob (class in FlatCAM) -
- - -
FlatCAMExcellon (class in FlatCAM) -
- -
- -
FlatCAMGeometry (class in FlatCAM) -
- - -
FlatCAMGerber (class in FlatCAM) -
- - -
FlatCAMObj (class in FlatCAM) -
- - -
frac_digits (camlib.Gerber attribute) -
- - -
from_dict() (camlib.ApertureMacro method) -
- -
- -
(camlib.Geometry method) -
- -
-
- -

G

- - - -
- -
gcode_parse() (camlib.CNCjob method) -
- - -
generate_from_excellon() (camlib.CNCjob method) -
- - -
generate_from_excellon_by_tool() (camlib.CNCjob method) -
- - -
generate_from_geometry() (camlib.CNCjob method) -
- - -
Geometry (class in camlib) -
- - -
Gerber (class in camlib) -
- - -
get_bounding_box() (camlib.Gerber method) -
- -
- -
get_bounds() (FlatCAM.ObjectCollection method) -
- - -
get_by_name() (FlatCAM.ObjectCollection method) -
- - -
get_empty_area() (camlib.Geometry method) -
- - -
get_eval() (FlatCAM.App method) -
- - -
get_list() (FlatCAM.ObjectCollection method) -
- - -
get_names() (FlatCAM.ObjectCollection method) -
- - -
get_radio_value() (FlatCAM.App method) -
- -
- -

I

- - - -
- -
info() (FlatCAM.App method) -
- - -
int_digits (camlib.Gerber attribute) -
- -
- -
isolation_geometry() (camlib.Geometry method) -
- -
- -

L

- - - -
- -
linear2gcode() (camlib.CNCjob method) -
- -
- -
load_defaults() (FlatCAM.App method) -
- -
- -

M

- - - -
- -
make_centerline() (camlib.ApertureMacro static method) -
- - -
make_circle() (camlib.ApertureMacro static method) -
- - -
make_geometry() (camlib.ApertureMacro method) -
- - -
make_lowerleftline() (camlib.ApertureMacro static method) -
- - -
make_moire() (camlib.ApertureMacro static method) -
- - -
make_outline() (camlib.ApertureMacro static method) -
- - -
make_polygon() (camlib.ApertureMacro static method) -
- -
- -
make_thermal() (camlib.ApertureMacro static method) -
- - -
make_vectorline() (camlib.ApertureMacro static method) -
- - -
Measurement (class in FlatCAM) -
- - -
mirror() (camlib.Excellon method) -
- -
- -
(camlib.Gerber method) -
- -
- -
mpl_connect() (FlatCAM.PlotCanvas method) -
- - -
mpl_disconnect() (FlatCAM.PlotCanvas method) -
- -
- -

N

- - - -
- -
new_axes() (FlatCAM.PlotCanvas method) -
- -
- -
new_object() (FlatCAM.App method) -
- -
- -

O

- - - -
- -
ObjectCollection (class in FlatCAM) -
- - -
offset() (camlib.CNCjob method) -
- -
- -
(FlatCAM.FlatCAMGeometry method) -
- - -
(camlib.Excellon method) -
- - -
(camlib.Geometry method) -
- - -
(camlib.Gerber method) -
- -
- -
on_about() (FlatCAM.App method) -
- - -
on_activate_name() (FlatCAM.App method) -
- - -
on_canvas_configure() (FlatCAM.App method) -
- - -
on_cb_plot_toggled() (FlatCAM.App method) -
- - -
on_clear_plots() (FlatCAM.App method) -
- - -
on_click_over_plot() (FlatCAM.App method) -
- - -
on_closewindow() (FlatCAM.App method) -
- - -
on_cncjob_exportgcode() (FlatCAM.App method) -
- - -
on_create_aligndrill() (FlatCAM.App method) -
- - -
on_create_mirror() (FlatCAM.App method) -
- - -
on_delete() (FlatCAM.App method) -
- - -
on_entry_eval_activate() (FlatCAM.App method) -
- - -
on_eval_update() (FlatCAM.App method) -
- - -
on_excellon_tool_choose() (FlatCAM.App method) -
- - -
on_file_new() (FlatCAM.App method) -
- - -
on_file_openproject() (FlatCAM.App method) -
- - -
on_file_savedefaults() (FlatCAM.App method) -
- - -
on_file_saveproject() (FlatCAM.App method) -
- - -
on_file_saveprojectas() (FlatCAM.App method) -
- - -
on_file_saveprojectcopy() (FlatCAM.App method) -
- - -
on_fileopenexcellon() (FlatCAM.App method) -
- - -
on_fileopengcode() (FlatCAM.App method) -
- - -
on_fileopengerber() (FlatCAM.App method) -
- - -
on_filequit() (FlatCAM.App method) -
- - -
on_generate_cncjob() (FlatCAM.App method) -
- - -
on_generate_excellon_cncjob() (FlatCAM.App method) -
- - -
on_generate_gerber_bounding_box() (FlatCAM.App method) -
- - -
on_generate_isolation() (FlatCAM.App method) -
- - -
on_generate_paintarea() (FlatCAM.App method) -
- -
- -
on_gerber_generate_cutout() (FlatCAM.App method) -
- - -
on_gerber_generate_noncopper() (FlatCAM.App method) -
- - -
on_key_down() (FlatCAM.PlotCanvas method) -
- - -
on_key_over_plot() (FlatCAM.App method) -
- - -
on_key_up() (FlatCAM.PlotCanvas method) -
- - -
on_list_selection_change() (FlatCAM.ObjectCollection method) -
- - -
on_mouse_move() (FlatCAM.PlotCanvas method) -
- - -
on_mouse_move_over_plot() (FlatCAM.App method) -
- - -
on_offset_object() (FlatCAM.App method) -
- - -
on_options_app2object() (FlatCAM.App method) -
- - -
on_options_app2project() (FlatCAM.App method) -
- - -
on_options_combo_change() (FlatCAM.App method) -
- - -
on_options_object2app() (FlatCAM.App method) -
- - -
on_options_object2project() (FlatCAM.App method) -
- - -
on_options_project2app() (FlatCAM.App method) -
- - -
on_options_project2object() (FlatCAM.App method) -
- - -
on_options_update() (FlatCAM.App method) -
- - -
on_row_activated() (FlatCAM.App method) -
- -
- -
(FlatCAM.ObjectCollection method) -
- -
- -
on_scale_object() (FlatCAM.App method) -
- - -
on_scroll() (FlatCAM.PlotCanvas method) -
- - -
on_toggle_pointbox() (FlatCAM.App method) -
- - -
on_toggle_units() (FlatCAM.App method) -
- - -
on_toolbar_replot() (FlatCAM.App method) -
- - -
on_tools_doublesided() (FlatCAM.App method) -
- - -
on_update_plot() (FlatCAM.App method) -
- - -
on_zoom_fit() (FlatCAM.App method) -
- - -
on_zoom_in() (FlatCAM.App method) -
- - -
on_zoom_out() (FlatCAM.App method) -
- - -
open_project() (FlatCAM.App method) -
- - -
options2form() (FlatCAM.App method) -
- -
- -

P

- - - -
- -
parse_content() (camlib.ApertureMacro method) -
- - -
parse_file() (camlib.Excellon method) -
- -
- -
(camlib.Gerber method) -
- -
- -
parse_lines() (camlib.Excellon method) -
- -
- -
(camlib.Gerber method) -
- -
- -
plot() (FlatCAM.FlatCAMGeometry method) -
- -
- -
(FlatCAM.FlatCAMObj method) -
- -
- -
plot2() (camlib.CNCjob method) -
- -
- -
plot_all() (FlatCAM.App method) -
- - -
PlotCanvas (class in FlatCAM) -
- - -
polygon2gcode() (camlib.CNCjob method) -
- - -
populate_objects_combo() (FlatCAM.App method) -
- - -
pre_parse() (camlib.CNCjob method) -
- -
- -

R

- - - -
- -
read_form() (FlatCAM.App method) -
- -
- -
(FlatCAM.FlatCAMObj method) -
- -
-
- -
read_form_item() (FlatCAM.App method) -
- -
- -
(FlatCAM.FlatCAMObj method) -
- -
-
- -

S

- - - -
- -
save_project() (FlatCAM.App method) -
- - -
scale() (camlib.CNCjob method) -
- -
- -
(FlatCAM.FlatCAMGeometry method) -
- - -
(camlib.Excellon method) -
- - -
(camlib.Geometry method) -
- - -
(camlib.Gerber method) -
- -
- -
serialize() (FlatCAM.FlatCAMObj method) -
- - -
set_active() (FlatCAM.ObjectCollection method) -
- - -
set_form_item() (FlatCAM.App method) -
- -
- -
(FlatCAM.FlatCAMObj method) -
- -
- -
set_list_selection() (FlatCAM.ObjectCollection method) -
- -
- -
set_progress_bar() (FlatCAM.App method) -
- - -
setup_axes() (FlatCAM.FlatCAMObj method) -
- - -
setup_component_editor() (FlatCAM.App method) -
- - -
setup_obj_classes() (FlatCAM.App method) -
- - -
size() (camlib.Geometry method) -
- -
- -

T

- - - -
- -
to_dict() (camlib.ApertureMacro method) -
- -
- -
(camlib.Geometry method) -
- -
-
- -
to_form() (FlatCAM.FlatCAMObj method) -
- -
- -

V

- - -
- -
version_check() (FlatCAM.App method) -
- -
- -

Z

- - -
- -
zoom() (FlatCAM.PlotCanvas method) -
- -
- - - -
- -
-
- -
- -
- - - - \ No newline at end of file diff --git a/doc/build/index.html b/doc/build/index.html deleted file mode 100644 index 6ee1597d..00000000 --- a/doc/build/index.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - Welcome to FlatCAM’s documentation! — Cirkuix 0.5 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
- - -
-
- -
- -
- - - - \ No newline at end of file diff --git a/doc/build/objects.inv b/doc/build/objects.inv deleted file mode 100644 index 1ce26fc5..00000000 Binary files a/doc/build/objects.inv and /dev/null differ diff --git a/doc/build/py-modindex.html b/doc/build/py-modindex.html deleted file mode 100644 index 963be33e..00000000 --- a/doc/build/py-modindex.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - - - - Python Module Index — Cirkuix 0.5 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
-
    -
  • Docs »
  • - -
  • -
  • - -
  • -
-
-
-
- - -

Python Module Index

- -
- c | - f -
- - - - - - - - - - - - -
 
- c
- camlib -
 
- f
- FlatCAM -
- - -
- -
-
- -
- -
- - - - \ No newline at end of file diff --git a/doc/build/search.html b/doc/build/search.html deleted file mode 100644 index b5d5e38e..00000000 --- a/doc/build/search.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - - - Search — Cirkuix 0.5 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
-
    -
  • Docs »
  • - -
  • -
  • - -
  • -
-
-
-
- - - - -
- -
- -
- -
-
- -
- -
- - - - \ No newline at end of file diff --git a/doc/build/searchindex.js b/doc/build/searchindex.js deleted file mode 100644 index 23fbc99a..00000000 --- a/doc/build/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({envversion:42,terms:{represent:[2,3],all:[1,2,3,4],code:[1,2,3],skip:1,toolpath:3,replot:1,focus:1,follow:3,on_key_over_plot:1,make_outlin:3,whose:[1,4],make_circl:3,get_ev:1,on_options_upd:[1,4],flash:3,shply:4,gerber:[],program:1,text:[1,3,4],plot_al:1,geom:3,spec:3,isinst:4,cnc:[1,3],digit:3,sourc:3,everi:3,string:[1,3],getattr:4,far:1,mous:1,"5e6cff":3,obround:3,affect:3,on_cb_plot_toggl:1,toolshap:3,button:1,list:[1,3,4],iter:[3,4],item:1,vector:[1,2,3],specal:1,round:[1,3],get_radio_valu:1,create_geometri:3,natur:3,dimens:[2,3],resourc:1,zero:3,pass:[1,3],rectangular:3,click:1,append:[1,2,3],index:0,what:[3,4],load_default:1,new_ax:1,make_centerlin:3,current:1,delet:1,clipboard:1,"new":[1,2,4],method:[1,2,3,4],whatev:1,widget:[1,4],default2zero:3,flatcamgeometri:[],gener:[1,2,3],onli:[1,3],matplotlib:[1,2,3],adjust_ax:1,on_create_aligndril:1,path:[1,3],along:[3,4],vertic:3,modifi:[1,2,3,4],make_moir:3,valu:[1,3,4],box:[1,3],convert:[2,3,4],do_someth:3,on_file_saveprojectcopi:1,action:1,chang:[1,3,4],on_activate_nam:1,on_options_object2app:1,diamet:3,via:1,change_nam:1,primit:3,modul:0,on_fileopengerb:1,filenam:[1,3,4],"boolean":1,basegeometri:4,ymin:[1,3],select:1,frac_digit:[1,3],plot:[1,2,3],from:[1,2,3,4],describ:3,doubl:1,regist:1,setup_component_editor:1,call:[1,2,3,4],flash_geometri:3,dict:[1,2,3,4],type:[1,2,3,4],toggl:1,more:3,on_toolbar_replot:1,on_delet:1,combo:1,on_toggle_unit:1,on_gerber_generate_cutout:1,parse_fil:3,known:1,actual:[2,3],hole:1,must:[1,3,4],on_file_openproject:1,none:[1,2,3],left:1,ser_attr:[3,4],work:3,uniqu:1,gtext:3,crosshair_thick:3,can:[1,2,3,4],drill:[2,3],z_move:2,fetch:[1,2,4],def:4,overrid:[2,3],meant:1,polygon2gcod:3,give:[1,3],process:[1,3],share:1,indic:[],stroke:3,minimum:1,tab:[1,4],xmin:[1,3],"__inst__":4,serial:[],z_cut:2,apertureid:3,alwai:3,surfac:3,end:3,hadler:1,fix_region:3,write:3,fals:[1,3],circular:3,b5ab3a:3,recogn:4,on_key_down:1,make_polygon:3,after:1,befor:[1,2],plane:3,mai:1,circumscrib:3,data:[1,3],subsequ:1,entry_text:1,correspond:[1,3],element:[3,4],callback:1,"switch":1,maintain:1,allow:3,enter:1,on_fileopenexcellon:1,on_file_saveprojecta:1,travel:3,checkbox:1,rotat:3,over:[1,4],becaus:3,through:[1,3,4],untouch:3,on_excellon_tool_choos:1,paramet:[1,2,3],disconnect:1,fit:1,save_project:[1,4],chosen:1,fix:3,gtk:1,"__class__":4,set_list_select:1,window:1,html:1,transpar:[2,3],set_act:1,pcb:1,on_options_app2object:1,main:[1,3],pixel:1,on_zoom_out:1,non:[3,4],"float":[1,2,3],"return":[1,2,3,4],thei:[2,3,4],handl:[1,2],safe:1,rectangl:3,file_chooser_act:1,"break":3,vect:[2,3],build_list:[],project_filenam:1,choic:1,name:[1,2,3,4],edit:4,separ:[1,3],solid_geometri:3,each:[3,4],found:[1,3],updat:[1,4],gui:[1,2,4],read_form:[1,2],parse_lin:3,on_closewindow:1,replac:3,continu:[1,2],"static":3,connect:1,aperturetyp:3,on_key_up:1,event:1,out:1,variabl:[1,3],on_eval_upd:1,generate_from_excellon_by_tool:3,content:[0,1],adjust:1,set_current_pag:1,clear_polygon:3,on_scrol:1,flatcamcncjob:[],linear:3,insid:3,loc:3,deseri:[2,3],precaut:1,given:[1,2,3],like:1,flatcamexcellon:[],base:[1,2],dictionari:[1,2,3,4],org:1,care:1,generate_from_geometri:3,thread:1,launch:1,angl:3,success:1,motion:1,turn:[],length:3,notebook:1,place:[1,4],outsid:3,geometri:[],treeselect:[],onto:3,support:3,first:4,origin:[1,3],copper:1,on_zoom_in:1,arrai:3,independ:4,number:[1,3],restrict:1,saepar:1,instruct:1,done:[1,3,4],overwrit:3,thick:3,open:[1,4],predefin:3,size:[1,3],differ:3,setup_obj_class:1,width:3,associ:[2,3],interact:2,flatcamobj:[],get_list:1,attach:[1,2],circl:3,sdump:4,instanc:1,store:[3,4],editor:1,option:[],ratio:[1,2],tool:[1,3],copi:[1,2,3,4],specifi:[1,2,3,4],get_empty_area:3,generate_from_excellon:3,part:[2,3],pars:3,get_bounding_box:3,exposur:3,kind:[1,2,3,4],whenev:1,tree:[],entry_ev:1,structur:3,project:[1,4],str:[1,2,3],macro:3,posit:3,abov:3,thereaft:4,ani:[1,3],do_flash:3,raw:3,"_app_":[1,4],have:[1,3],recreat:3,inform:1,self:[1,2,3,4],note:[1,3],also:3,on_options_object2project:1,build:[1,2],which:[1,2,3,4],event_handl:1,interior:3,on_success:1,singl:3,simplifi:3,buffer:3,previou:1,reach:3,on_mouse_mov:1,pair:[1,3],alpha:3,segment:3,"class":[1,2,3],f0e24d:3,appertur:3,clear:[1,2],later:[2,4],cover:[1,3],on_mouse_move_over_plot:1,populate_objects_combo:1,neg:[1,3],axi:[1,3],thicken:3,recontruct:4,serializ:[3,4],show:1,on_click_over_plot:1,apertur:3,radiu:3,syntax:[1,4],radio:1,corner:[1,3],find:1,on_scale_object:1,new_object:1,slow:3,locat:3,menu:1,configur:[1,2],activ:1,written:4,should:1,comboboxtext:1,version:[1,2,3],suppos:4,factor:[1,2,3],elin:3,on_options_combo_chang:1,overwritten:4,hit:1,get:[1,2,4],express:3,nativ:1,on_options_app2project:1,geo:4,mpl_connect:1,requir:[3,4],multipolygon:3,bar:1,on_create_mirror:1,coord:3,whether:2,to_dict:[3,4],xmax:[1,3],contain:[1,4],comma:3,movement:1,where:[1,3,4],dpi:3,user:[1,2],set:[1,2,3],dump:4,noth:1,keyboard:1,startup:[1,4],on_cncjob_exportgcod:1,displai:1,"4650bd":3,see:[1,3],result:[1,3],arg:1,fail:1,close:1,contour:3,statu:1,detect:4,kei:[1,2,3,4],boundari:3,passign:3,label:1,state:1,max_r:3,between:1,progress:1,wether:[1,3],attribut:[3,4],accord:3,extend:2,numer:3,complement:3,isol:1,job:[1,3],succeed:1,here:1,extent:1,toler:3,auto_adjust_ax:1,popul:[1,3,4],both:3,feedrat:[2,3],rtype:[1,3,4],options2form:1,alon:3,setup_project_list:[],entir:3,lowerleft:3,whole:[1,3],col:1,obj_dict:2,parse_cont:3,load:[1,4],cncjob:[],figur:[1,2],color:3,on_gerber_generate_noncopp:1,creat:[1,2,3,4],enlarg:3,param:[1,3,4],respect:2,throughout:1,backend:1,quit:1,becom:[1,2,3],convert_unit:[2,3],addition:3,been:1,mark:[],compon:1,json:[1,2,3,4],get_curr:[],toolbar:1,open_project:[1,4],subscrib:1,immedi:1,radio_set:1,gcode:3,imag:1,search:0,gap:3,on_file_savedefault:[1,4],coordin:[1,3],on_options_project2object:1,func:1,present:3,versioncheck:1,inhibit:1,therefor:[1,4],apparamet:3,look:3,align:1,properti:[1,3],alter:3,dest:1,defin:[1,3],"while":1,setup_ax:2,behavior:3,margin:3,region:3,propag:1,layer:1,readi:3,them:2,equal:3,itself:3,exterior:3,on_fileopengcod:1,"__init__":1,around:[1,3],get_bound:1,make_lowerleftlin:3,make:4,belong:3,same:[1,4],respresent:[3,4],complex:3,pad:3,descend:[2,3],tool_toler:3,complet:1,http:1,widget_nam:1,upon:[1,4],alert:1,initi:1,canva:[1,2],implement:2,polygon:[1,3],appropri:[1,3],off:1,center:[1,3],build_ui:2,well:3,inherit:4,without:1,on_file_new:1,thi:[1,2,3,4],choos:1,on_generate_paintarea:1,make_vectorlin:3,rout:1,latest:1,distanc:3,identifi:[3,4],crosshair_len:3,isolation_geometri:3,"true":[1,3],entri:1,rest:3,shape:[3,4],aspect:[1,2],linestr:3,flatcamgerb:[],speed:3,previous:4,now:1,on_tools_doublesid:1,field:1,trigger:[],point:[1,3],except:1,shortcut:1,add:[1,2],other:[1,3],board:1,appli:4,save:[1,3,4],pre_pars:3,take:[1,4],gcode_pars:3,format:2,read:[1,2,3,4],on_file_saveproject:1,background:2,press:1,height:3,mod:3,lost:3,specif:[1,2,3],ring:3,zoom:1,integ:3,instanci:3,collect:1,from_dict:3,necessari:1,either:1,exobj:3,on_clear_plot:1,page:[0,1],depend:[1,2,3],encount:4,right:1,int_digit:3,creation:[1,4],back:1,percentag:1,on_zoom_fit:1,radiobutton:1,"export":2,mirror:[1,3],set_form_item:[1,2],on_generate_excellon_cncjob:1,scale:[1,2,3],bottom:1,cut:[1,3],definit:3,overlap:3,on_update_plot:1,buffer_path:3,unit:[1,2,3],duplic:1,refer:4,machin:3,object:[],run:[1,3],usag:3,how:4,offset:[1,2,3],on_toggle_pointbox:1,don:[2,3],about:1,obj:1,file_chooser_save_act:1,on_generate_cncjob:1,side:1,degre:3,dialog:1,constructor:1,options_update_ignor:1,disabl:1,make_therm:3,on_about:1,except_curr:1,chooser:1,within:3,encod:[3,4],bound:[1,3],excellon:[],pute:1,accordingli:1,ymax:[1,3],wai:[3,4],area:[1,3],outer_dia_outer_r:3,transfer:1,n_vert:3,fast:3,make_geometri:3,start:[1,3],clear_poli:1,handler:1,interfac:1,includ:[3,4],fraction:3,on_canvas_configur:1,"function":[1,4],on_generate_isol:1,linear2gcod:3,form:[1,2,3,4],tupl:[2,3],on_offset_object:1,old_nam:1,set_progress_bar:1,line:[1,3],on_entry_eval_activ:1,info:1,made:3,attr:4,on_generate_gerber_bounding_box:1,cid:1,new_nam:1,access:1,maximum:1,tooldia:[2,3],record:1,limit:1,otherwis:[1,4],featur:3,buffered_path:3,evalu:3,"int":[1,3],request:1,dure:3,parser:3,aperture_pars:3,repres:[2,3],plot2:3,on_row_activ:1,exist:2,file:[1,3,4],doe:[1,3],mpl_disconnect:1,check:1,again:3,aplic:1,get_nam:1,titl:1,to_form:2,when:[1,3,4],detail:1,invalid:3,"default":[1,3,4],valid:1,bool:[1,2,3],get_by_nam:1,gline:3,ignor:[1,3],on_options_project2app:1,read_form_item:[1,2],on_list_selection_chang:1,on_tree_selection_chang:[],draw:[1,3],event_nam:1,disable_plot:1,eval:1,outdat:1,rule:3,geometr:[2,3],aperture_macro:3,on_filequit:1,scroll:1},objtypes:{"0":"py:module","1":"py:method","2":"py:class","3":"py:staticmethod","4":"py:attribute"},objnames:{"0":["py","module","Python module"],"1":["py","method","Python method"],"2":["py","class","Python class"],"3":["py","staticmethod","Python static method"],"4":["py","attribute","Python attribute"]},filenames:["index","app","flatcamobj","camlib","devman"],titles:["Welcome to FlatCAM’s documentation!","FlatCAM Application","FlatCAM Objects","Camlib","FlatCAM Developer Manual"],objects:{"":{camlib:[3,0,0,"-"],FlatCAM:[2,0,0,"-"]},"camlib.CNCjob":{scale:[3,1,1,""],polygon2gcode:[3,1,1,""],generate_from_excellon_by_tool:[3,1,1,""],linear2gcode:[3,1,1,""],pre_parse:[3,1,1,""],generate_from_excellon:[3,1,1,""],gcode_parse:[3,1,1,""],generate_from_geometry:[3,1,1,""],offset:[3,1,1,""],plot2:[3,1,1,""]},FlatCAM:{PlotCanvas:[1,2,1,""],FlatCAMGeometry:[2,2,1,""],App:[1,2,1,""],FlatCAMObj:[2,2,1,""],ObjectCollection:[1,2,1,""],FlatCAMExcellon:[2,2,1,""],FlatCAMGerber:[2,2,1,""],Measurement:[1,2,1,""],FlatCAMCNCjob:[2,2,1,""]},"FlatCAM.FlatCAMGerber":{convert_units:[2,1,1,""]},"camlib.Geometry":{convert_units:[3,1,1,""],scale:[3,1,1,""],to_dict:[3,1,1,""],bounds:[3,1,1,""],get_empty_area:[3,1,1,""],isolation_geometry:[3,1,1,""],from_dict:[3,1,1,""],clear_polygon:[3,1,1,""],offset:[3,1,1,""],size:[3,1,1,""]},"FlatCAM.App":{on_options_object2app:[1,1,1,""],on_about:[1,1,1,""],file_chooser_action:[1,1,1,""],on_canvas_configure:[1,1,1,""],on_zoom_in:[1,1,1,""],on_delete:[1,1,1,""],on_toggle_units:[1,1,1,""],on_closewindow:[1,1,1,""],on_click_over_plot:[1,1,1,""],on_row_activated:[1,1,1,""],on_fileopengerber:[1,1,1,""],on_zoom_out:[1,1,1,""],on_zoom_fit:[1,1,1,""],on_file_savedefaults:[1,1,1,""],on_generate_excellon_cncjob:[1,1,1,""],set_form_item:[1,1,1,""],plot_all:[1,1,1,""],read_form:[1,1,1,""],on_generate_isolation:[1,1,1,""],on_key_over_plot:[1,1,1,""],on_offset_object:[1,1,1,""],on_gerber_generate_noncopper:[1,1,1,""],on_scale_object:[1,1,1,""],new_object:[1,1,1,""],on_activate_name:[1,1,1,""],get_eval:[1,1,1,""],on_cb_plot_toggled:[1,1,1,""],on_update_plot:[1,1,1,""],save_project:[1,1,1,""],on_options_object2project:[1,1,1,""],setup_component_editor:[1,1,1,""],open_project:[1,1,1,""],on_options_update:[1,1,1,""],on_file_new:[1,1,1,""],on_options_app2object:[1,1,1,""],on_options_project2app:[1,1,1,""],read_form_item:[1,1,1,""],versionCheck:[1,1,1,""],on_toolbar_replot:[1,1,1,""],on_entry_eval_activate:[1,1,1,""],on_tools_doublesided:[1,1,1,""],on_file_openproject:[1,1,1,""],on_options_combo_change:[1,1,1,""],setup_obj_classes:[1,1,1,""],on_file_saveproject:[1,1,1,""],on_generate_gerber_bounding_box:[1,1,1,""],on_options_project2object:[1,1,1,""],on_eval_update:[1,1,1,""],on_toggle_pointbox:[1,1,1,""],on_file_saveprojectas:[1,1,1,""],info:[1,1,1,""],disable_plots:[1,1,1,""],on_options_app2project:[1,1,1,""],set_progress_bar:[1,1,1,""],on_file_saveprojectcopy:[1,1,1,""],on_create_mirror:[1,1,1,""],file_chooser_save_action:[1,1,1,""],on_excellon_tool_choose:[1,1,1,""],on_generate_cncjob:[1,1,1,""],on_clear_plots:[1,1,1,""],on_mouse_move_over_plot:[1,1,1,""],on_fileopengcode:[1,1,1,""],on_gerber_generate_cutout:[1,1,1,""],load_defaults:[1,1,1,""],populate_objects_combo:[1,1,1,""],on_create_aligndrill:[1,1,1,""],on_generate_paintarea:[1,1,1,""],get_radio_value:[1,1,1,""],on_filequit:[1,1,1,""],on_cncjob_exportgcode:[1,1,1,""],options2form:[1,1,1,""],on_fileopenexcellon:[1,1,1,""]},"camlib.Gerber":{parse_lines:[3,1,1,""],scale:[3,1,1,""],frac_digits:[3,4,1,""],mirror:[3,1,1,""],aperture_parse:[3,1,1,""],offset:[3,1,1,""],create_geometry:[3,1,1,""],parse_file:[3,1,1,""],do_flashes:[3,1,1,""],buffer_paths:[3,1,1,""],fix_regions:[3,1,1,""],get_bounding_box:[3,1,1,""],int_digits:[3,4,1,""]},"camlib.ApertureMacro":{make_geometry:[3,1,1,""],default2zero:[3,3,1,""],to_dict:[3,1,1,""],make_polygon:[3,3,1,""],make_vectorline:[3,3,1,""],from_dict:[3,1,1,""],make_moire:[3,3,1,""],make_outline:[3,3,1,""],make_circle:[3,3,1,""],make_thermal:[3,3,1,""],make_centerline:[3,3,1,""],parse_content:[3,1,1,""],append:[3,1,1,""],make_lowerleftline:[3,3,1,""]},"FlatCAM.FlatCAMGeometry":{plot:[2,1,1,""],scale:[2,1,1,""],offset:[2,1,1,""]},"FlatCAM.PlotCanvas":{on_mouse_move:[1,1,1,""],on_scroll:[1,1,1,""],adjust_axes:[1,1,1,""],on_key_down:[1,1,1,""],mpl_disconnect:[1,1,1,""],clear:[1,1,1,""],zoom:[1,1,1,""],connect:[1,1,1,""],new_axes:[1,1,1,""],auto_adjust_axes:[1,1,1,""],on_key_up:[1,1,1,""],mpl_connect:[1,1,1,""]},camlib:{Excellon:[3,2,1,""],ApertureMacro:[3,2,1,""],Geometry:[3,2,1,""],CNCjob:[3,2,1,""],Gerber:[3,2,1,""]},"camlib.Excellon":{parse_lines:[3,1,1,""],scale:[3,1,1,""],offset:[3,1,1,""],create_geometry:[3,1,1,""],mirror:[3,1,1,""],parse_file:[3,1,1,""]},"FlatCAM.FlatCAMObj":{read_form:[2,1,1,""],plot:[2,1,1,""],serialize:[2,1,1,""],deserialize:[2,1,1,""],build_ui:[2,1,1,""],to_form:[2,1,1,""],setup_axes:[2,1,1,""],set_form_item:[2,1,1,""],read_form_item:[2,1,1,""]},"FlatCAM.ObjectCollection":{set_active:[1,1,1,""],get_names:[1,1,1,""],change_name:[1,1,1,""],on_row_activated:[1,1,1,""],get_list:[1,1,1,""],set_list_selection:[1,1,1,""],on_list_selection_change:[1,1,1,""],get_by_name:[1,1,1,""],get_bounds:[1,1,1,""],append:[1,1,1,""]}},titleterms:{cncjob:3,process:4,flatcamgerb:2,app:1,indic:0,aperturemacro:3,tabl:0,excellon:3,serial:4,flatcam:[0,1,2,4],flatcamgeometri:2,develop:4,welcom:0,flatcamobj:2,gerber:3,camlib:3,document:0,flatcamcncjob:2,applic:1,option:4,object:2,flatcamexcellon:2,plotcanva:1,measur:1,manual:4,geometri:[3,4],objectcollect:1}}) \ No newline at end of file diff --git a/doc/source/bugs.rst b/doc/source/bugs.rst new file mode 100644 index 00000000..66be3558 --- /dev/null +++ b/doc/source/bugs.rst @@ -0,0 +1,11 @@ +Active Bugs +=================== + +Drill number parsing +-------------------- + +The screenshot below show the problematic file: + +.. image:: drill_parse_problem1.png + ::align: center + diff --git a/doc/source/index.rst b/doc/source/index.rst index ad3a7349..5efb70fd 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -17,6 +17,7 @@ Contents: flatcamobj app devman + bugs diff --git a/manual/editor.rst b/manual/editor.rst index 95f80e30..401c94e6 100644 --- a/manual/editor.rst +++ b/manual/editor.rst @@ -1,4 +1,7 @@ Geometry Editor =============== -The Geometry Editor is a drawing CAD that allows you to edit FlatCAM Geometry Objects or create new ones from scratch. This provides the ultimate flexibility by letting you specify precisely and arbitrarily what you want your CNC router to do. \ No newline at end of file +The Geometry Editor is a drawing CAD that allows you to edit +FlatCAM Geometry Objects or create new ones from scratch. This +provides the ultimate flexibility by letting you specify precisely +and arbitrarily what you want your CNC router to do. \ No newline at end of file diff --git a/recent.json b/recent.json index 77baa459..0ca579f4 100644 --- a/recent.json +++ b/recent.json @@ -1 +1 @@ -[{"kind": "gerber", "filename": "C:/Users/jpcaram/Dropbox/CNC/pcbcam/test_files/Top3.gbr"}, {"kind": "excellon", "filename": "C:/Users/jpcaram/Dropbox/CNC/pcbcam/test_files/FlatCam_Drilling_Test/FlatCam_Drilling_Test.drl"}, {"kind": "gerber", "filename": "C:/Users/jpcaram/Dropbox/CNC/pcbcam/test_files/Top2.gbr"}, {"kind": "project", "filename": "C:/Users/jpcaram/Dropbox/CNC/pcbcam/test_files/easy_eda_test/easy_eda.fc"}] \ No newline at end of file +[{"kind": "excellon", "filename": "C:/Users/jpcaram/Dropbox/CNC/pcbcam/test_files/PlacaReles.drl"}, {"kind": "gerber", "filename": "C:/Users/jpcaram/Dropbox/CNC/pcbcam/test_files/bedini 7 coils capacitor discharge.gbr"}, {"kind": "excellon", "filename": "C:/Users/jpcaram/Dropbox/CNC/pcbcam/test_files/LockController_v1.0_pcb-RoundHoles.TXT/LockController_v1.0_pcb-RoundHoles.TXT"}, {"kind": "gerber", "filename": "C:/Users/jpcaram/Dropbox/CNC/pcbcam/test_files/Gerbers/AVR_Transistor_Tester.DRL"}, {"kind": "excellon", "filename": "C:/Users/jpcaram/Dropbox/CNC/pcbcam/test_files/Excellon_Planck/X-Y CONTROLLER - Drill Data - Through Hole.drl"}, {"kind": "excellon", "filename": "C:/Users/jpcaram/Dropbox/CNC/pcbcam/test_files/FlatCam_Drilling_Test/FlatCam_Drilling_Test.drl"}, {"kind": "project", "filename": "C:/Users/jpcaram/Dropbox/CNC/pcbcam/test_files/easy_eda_test/easy_eda.fc"}, {"kind": "gerber", "filename": "C:/Users/jpcaram/Dropbox/CNC/pcbcam/test_files/easy_eda_test/GTL"}, {"kind": "excellon", "filename": "C:/Users/jpcaram/Dropbox/CNC/pcbcam/test_files/easy_eda_test/DRL"}, {"kind": "excellon", "filename": "C:/Users/jpcaram/Dropbox/CNC/pcbcam/test_files/holes.drl"}] \ No newline at end of file