diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..a1ae1445 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# 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: 48b478eea9386c5b6931925b620a4628 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/atc_setup.doctree b/.doctrees/atc_setup.doctree new file mode 100644 index 00000000..84641604 Binary files /dev/null and b/.doctrees/atc_setup.doctree differ diff --git a/.doctrees/custom_ux_hacking.doctree b/.doctrees/custom_ux_hacking.doctree new file mode 100644 index 00000000..5e01212e Binary files /dev/null and b/.doctrees/custom_ux_hacking.doctree differ diff --git a/.doctrees/dev_install.doctree b/.doctrees/dev_install.doctree new file mode 100644 index 00000000..1fd65d66 Binary files /dev/null and b/.doctrees/dev_install.doctree differ diff --git a/.doctrees/development_quick_start_apt.doctree b/.doctrees/development_quick_start_apt.doctree new file mode 100644 index 00000000..3f708a1f Binary files /dev/null and b/.doctrees/development_quick_start_apt.doctree differ diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 00000000..64dd7b35 Binary files /dev/null and b/.doctrees/environment.pickle differ diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 00000000..88cd3e1d Binary files /dev/null and b/.doctrees/index.doctree differ diff --git a/.doctrees/lathe_interface.doctree b/.doctrees/lathe_interface.doctree new file mode 100644 index 00000000..530fa1c4 Binary files /dev/null and b/.doctrees/lathe_interface.doctree differ diff --git a/.doctrees/machine_config.doctree b/.doctrees/machine_config.doctree new file mode 100644 index 00000000..583bd11d Binary files /dev/null and b/.doctrees/machine_config.doctree differ diff --git a/.doctrees/mill_interface.doctree b/.doctrees/mill_interface.doctree new file mode 100644 index 00000000..79c3a0e9 Binary files /dev/null and b/.doctrees/mill_interface.doctree differ diff --git a/.doctrees/probe_basic_parameters.doctree b/.doctrees/probe_basic_parameters.doctree new file mode 100644 index 00000000..cddc3f70 Binary files /dev/null and b/.doctrees/probe_basic_parameters.doctree differ diff --git a/.doctrees/probing.doctree b/.doctrees/probing.doctree new file mode 100644 index 00000000..25bd9327 Binary files /dev/null and b/.doctrees/probing.doctree differ diff --git a/.doctrees/quick_start.doctree b/.doctrees/quick_start.doctree new file mode 100644 index 00000000..135b48a5 Binary files /dev/null and b/.doctrees/quick_start.doctree differ diff --git a/.doctrees/stable_develop_branch_change.doctree b/.doctrees/stable_develop_branch_change.doctree new file mode 100644 index 00000000..48aa4658 Binary files /dev/null and b/.doctrees/stable_develop_branch_change.doctree differ diff --git a/.doctrees/stable_quick_start_apt.doctree b/.doctrees/stable_quick_start_apt.doctree new file mode 100644 index 00000000..411dce03 Binary files /dev/null and b/.doctrees/stable_quick_start_apt.doctree differ diff --git a/.doctrees/tool_length_setter.doctree b/.doctrees/tool_length_setter.doctree new file mode 100644 index 00000000..e3b0931f Binary files /dev/null and b/.doctrees/tool_length_setter.doctree differ diff --git a/.doctrees/user_tabs.doctree b/.doctrees/user_tabs.doctree new file mode 100644 index 00000000..83ad05c5 Binary files /dev/null and b/.doctrees/user_tabs.doctree differ diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/_images/01_Main.png b/_images/01_Main.png new file mode 100644 index 00000000..d82ba689 Binary files /dev/null and b/_images/01_Main.png differ diff --git a/_images/01_Main1.png b/_images/01_Main1.png new file mode 100644 index 00000000..b687a087 Binary files /dev/null and b/_images/01_Main1.png differ diff --git a/_images/01_Main_MDI.png b/_images/01_Main_MDI.png new file mode 100644 index 00000000..3bf7a5a6 Binary files /dev/null and b/_images/01_Main_MDI.png differ diff --git a/_images/02_File.png b/_images/02_File.png new file mode 100644 index 00000000..e47965b0 Binary files /dev/null and b/_images/02_File.png differ diff --git a/_images/02_File1.png b/_images/02_File1.png new file mode 100644 index 00000000..4d81947f Binary files /dev/null and b/_images/02_File1.png differ diff --git a/_images/03_ATC.png b/_images/03_ATC.png new file mode 100644 index 00000000..4bd5d3e1 Binary files /dev/null and b/_images/03_ATC.png differ diff --git a/_images/03_Offsets.png b/_images/03_Offsets.png new file mode 100644 index 00000000..eacbb907 Binary files /dev/null and b/_images/03_Offsets.png differ diff --git a/_images/04_Tool.png b/_images/04_Tool.png new file mode 100644 index 00000000..5aec5f3a Binary files /dev/null and b/_images/04_Tool.png differ diff --git a/_images/04_Touch_Off.png b/_images/04_Touch_Off.png new file mode 100644 index 00000000..e926602b Binary files /dev/null and b/_images/04_Touch_Off.png differ diff --git a/_images/05_Offsets.png b/_images/05_Offsets.png new file mode 100644 index 00000000..a8e12766 Binary files /dev/null and b/_images/05_Offsets.png differ diff --git a/_images/05_Tool_Table.png b/_images/05_Tool_Table.png new file mode 100644 index 00000000..a1fc8519 Binary files /dev/null and b/_images/05_Tool_Table.png differ diff --git a/_images/06_Probing.png b/_images/06_Probing.png new file mode 100644 index 00000000..88ec0707 Binary files /dev/null and b/_images/06_Probing.png differ diff --git a/_images/06_Probing1.png b/_images/06_Probing1.png new file mode 100644 index 00000000..77c768b1 Binary files /dev/null and b/_images/06_Probing1.png differ diff --git a/_images/07_Conversational.png b/_images/07_Conversational.png new file mode 100644 index 00000000..2009c1be Binary files /dev/null and b/_images/07_Conversational.png differ diff --git a/_images/07_Conversational_Facing.png b/_images/07_Conversational_Facing.png new file mode 100644 index 00000000..d8c7e9cd Binary files /dev/null and b/_images/07_Conversational_Facing.png differ diff --git a/_images/07_Conversational_Hole_Ops_Pattern.png b/_images/07_Conversational_Hole_Ops_Pattern.png new file mode 100644 index 00000000..568295fa Binary files /dev/null and b/_images/07_Conversational_Hole_Ops_Pattern.png differ diff --git a/_images/07_Conversational_Hole_Ops_XY_Coord.png b/_images/07_Conversational_Hole_Ops_XY_Coord.png new file mode 100644 index 00000000..1e0562d9 Binary files /dev/null and b/_images/07_Conversational_Hole_Ops_XY_Coord.png differ diff --git a/_images/08_Settings.png b/_images/08_Settings.png new file mode 100644 index 00000000..9fbd828a Binary files /dev/null and b/_images/08_Settings.png differ diff --git a/_images/08_Settings1.png b/_images/08_Settings1.png new file mode 100644 index 00000000..b2cee526 Binary files /dev/null and b/_images/08_Settings1.png differ diff --git a/_images/09_Settings.png b/_images/09_Settings.png new file mode 100644 index 00000000..ef6cda81 Binary files /dev/null and b/_images/09_Settings.png differ diff --git a/_images/09_Status.png b/_images/09_Status.png new file mode 100644 index 00000000..916efb0b Binary files /dev/null and b/_images/09_Status.png differ diff --git a/_images/atc.png b/_images/atc.png new file mode 100644 index 00000000..341ffa28 Binary files /dev/null and b/_images/atc.png differ diff --git a/_images/custom_ux_labels.png b/_images/custom_ux_labels.png new file mode 100644 index 00000000..dbd4b4cd Binary files /dev/null and b/_images/custom_ux_labels.png differ diff --git a/_images/enter_nano_file_save_name.png b/_images/enter_nano_file_save_name.png new file mode 100644 index 00000000..19447ba3 Binary files /dev/null and b/_images/enter_nano_file_save_name.png differ diff --git a/_images/icon.png b/_images/icon.png new file mode 100644 index 00000000..fa9a0092 Binary files /dev/null and b/_images/icon.png differ diff --git a/_images/nano_sources_list.png b/_images/nano_sources_list.png new file mode 100644 index 00000000..656a293e Binary files /dev/null and b/_images/nano_sources_list.png differ diff --git a/_images/nano_sources_list_edited.png b/_images/nano_sources_list_edited.png new file mode 100644 index 00000000..ffd49369 Binary files /dev/null and b/_images/nano_sources_list_edited.png differ diff --git a/_images/params_atc.png b/_images/params_atc.png new file mode 100644 index 00000000..7d1d1e50 Binary files /dev/null and b/_images/params_atc.png differ diff --git a/_images/params_programmable_coolant.png b/_images/params_programmable_coolant.png new file mode 100644 index 00000000..36306ff7 Binary files /dev/null and b/_images/params_programmable_coolant.png differ diff --git a/_images/params_tool_setter.png b/_images/params_tool_setter.png new file mode 100644 index 00000000..9977a480 Binary files /dev/null and b/_images/params_tool_setter.png differ diff --git a/_images/params_touch_probe.png b/_images/params_touch_probe.png new file mode 100644 index 00000000..90a68255 Binary files /dev/null and b/_images/params_touch_probe.png differ diff --git a/_images/pb_instruction_1.png b/_images/pb_instruction_1.png new file mode 100644 index 00000000..92bbcd1f Binary files /dev/null and b/_images/pb_instruction_1.png differ diff --git a/_images/pb_instruction_2.png b/_images/pb_instruction_2.png new file mode 100644 index 00000000..45de6541 Binary files /dev/null and b/_images/pb_instruction_2.png differ diff --git a/_images/pb_instruction_3.png b/_images/pb_instruction_3.png new file mode 100644 index 00000000..8b5b9fe8 Binary files /dev/null and b/_images/pb_instruction_3.png differ diff --git a/_images/pb_instruction_4.png b/_images/pb_instruction_4.png new file mode 100644 index 00000000..d41bb436 Binary files /dev/null and b/_images/pb_instruction_4.png differ diff --git a/_images/pb_instruction_5.png b/_images/pb_instruction_5.png new file mode 100644 index 00000000..c171db7b Binary files /dev/null and b/_images/pb_instruction_5.png differ diff --git a/_images/pb_instruction_7.png b/_images/pb_instruction_7.png new file mode 100644 index 00000000..8e5067b8 Binary files /dev/null and b/_images/pb_instruction_7.png differ diff --git a/_images/pb_instruction_8.png b/_images/pb_instruction_8.png new file mode 100644 index 00000000..0f34810a Binary files /dev/null and b/_images/pb_instruction_8.png differ diff --git a/_images/pb_instruction_9.png b/_images/pb_instruction_9.png new file mode 100644 index 00000000..4e654b0c Binary files /dev/null and b/_images/pb_instruction_9.png differ diff --git a/_images/pb_sources_list.png b/_images/pb_sources_list.png new file mode 100644 index 00000000..d4f4b531 Binary files /dev/null and b/_images/pb_sources_list.png differ diff --git a/_images/probe_00_parameters.png b/_images/probe_00_parameters.png new file mode 100644 index 00000000..f241540b Binary files /dev/null and b/_images/probe_00_parameters.png differ diff --git a/_images/probe_00_results_1.png b/_images/probe_00_results_1.png new file mode 100644 index 00000000..f8a25ea8 Binary files /dev/null and b/_images/probe_00_results_1.png differ diff --git a/_images/probe_00_work_offsets.png b/_images/probe_00_work_offsets.png new file mode 100644 index 00000000..e62cd470 Binary files /dev/null and b/_images/probe_00_work_offsets.png differ diff --git a/_images/probe_01_outside_corners.png b/_images/probe_01_outside_corners.png new file mode 100644 index 00000000..288964d8 Binary files /dev/null and b/_images/probe_01_outside_corners.png differ diff --git a/_images/probe_02_inside_corners.png b/_images/probe_02_inside_corners.png new file mode 100644 index 00000000..7715d067 Binary files /dev/null and b/_images/probe_02_inside_corners.png differ diff --git a/_images/probe_03_boss_and_pocket.png b/_images/probe_03_boss_and_pocket.png new file mode 100644 index 00000000..6b9667e9 Binary files /dev/null and b/_images/probe_03_boss_and_pocket.png differ diff --git a/_images/probe_04_ridge_and_valley.png b/_images/probe_04_ridge_and_valley.png new file mode 100644 index 00000000..8ba7d96e Binary files /dev/null and b/_images/probe_04_ridge_and_valley.png differ diff --git a/_images/probe_05_edge_angle.png b/_images/probe_05_edge_angle.png new file mode 100644 index 00000000..1bd874a2 Binary files /dev/null and b/_images/probe_05_edge_angle.png differ diff --git a/_images/probe_06_rotary_axis.png b/_images/probe_06_rotary_axis.png new file mode 100644 index 00000000..6d9120e1 Binary files /dev/null and b/_images/probe_06_rotary_axis.png differ diff --git a/_images/probe_07_calibrate.png b/_images/probe_07_calibrate.png new file mode 100644 index 00000000..11f2455f Binary files /dev/null and b/_images/probe_07_calibrate.png differ diff --git a/_images/probe_08_probe_help.png b/_images/probe_08_probe_help.png new file mode 100644 index 00000000..10e7ee4f Binary files /dev/null and b/_images/probe_08_probe_help.png differ diff --git a/_images/probe_help_01_step_off_width.png b/_images/probe_help_01_step_off_width.png new file mode 100644 index 00000000..3aa91a76 Binary files /dev/null and b/_images/probe_help_01_step_off_width.png differ diff --git a/_images/probe_help_02_extra_probe_depth.png b/_images/probe_help_02_extra_probe_depth.png new file mode 100644 index 00000000..0f7aee0b Binary files /dev/null and b/_images/probe_help_02_extra_probe_depth.png differ diff --git a/_images/probe_help_03_max_z_distance.png b/_images/probe_help_03_max_z_distance.png new file mode 100644 index 00000000..a190021b Binary files /dev/null and b/_images/probe_help_03_max_z_distance.png differ diff --git a/_images/probe_help_04_max_xy_distance.png b/_images/probe_help_04_max_xy_distance.png new file mode 100644 index 00000000..9cf793e4 Binary files /dev/null and b/_images/probe_help_04_max_xy_distance.png differ diff --git a/_images/probe_help_05_z_clearance.png b/_images/probe_help_05_z_clearance.png new file mode 100644 index 00000000..1826f551 Binary files /dev/null and b/_images/probe_help_05_z_clearance.png differ diff --git a/_images/probe_help_06_xz_clearance.png b/_images/probe_help_06_xz_clearance.png new file mode 100644 index 00000000..792f3ecc Binary files /dev/null and b/_images/probe_help_06_xz_clearance.png differ diff --git a/_images/probe_help_07_hint.png b/_images/probe_help_07_hint.png new file mode 100644 index 00000000..628d9ace Binary files /dev/null and b/_images/probe_help_07_hint.png differ diff --git a/_images/tool_length_measure.png b/_images/tool_length_measure.png new file mode 100644 index 00000000..56a6283f Binary files /dev/null and b/_images/tool_length_measure.png differ diff --git a/_images/toolsetter_page_doc_image.png b/_images/toolsetter_page_doc_image.png new file mode 100644 index 00000000..efae534f Binary files /dev/null and b/_images/toolsetter_page_doc_image.png differ diff --git a/_images/toolsetter_page_doc_image_1.png b/_images/toolsetter_page_doc_image_1.png new file mode 100644 index 00000000..e867d899 Binary files /dev/null and b/_images/toolsetter_page_doc_image_1.png differ diff --git a/_images/xfce_check_doc.png b/_images/xfce_check_doc.png new file mode 100644 index 00000000..6a0abf04 Binary files /dev/null and b/_images/xfce_check_doc.png differ diff --git a/_images/yes_nano_to_save.png b/_images/yes_nano_to_save.png new file mode 100644 index 00000000..59c90e81 Binary files /dev/null and b/_images/yes_nano_to_save.png differ diff --git a/_sources/atc_setup.rst.txt b/_sources/atc_setup.rst.txt new file mode 100644 index 00000000..63f3c24e --- /dev/null +++ b/_sources/atc_setup.rst.txt @@ -0,0 +1,8 @@ +================== +Carousel ATC Setup +================== + +TODO + +.. image:: images/mill/atc.png + :align: center diff --git a/_sources/custom_ux_hacking.rst.txt b/_sources/custom_ux_hacking.rst.txt new file mode 100644 index 00000000..54045373 --- /dev/null +++ b/_sources/custom_ux_hacking.rst.txt @@ -0,0 +1,68 @@ +========================= +Customisation with Python +========================= + +It is possible to make a simple customisations to the user interface, like renaming a button, by overriding the main window provider in you ``custom_config.yml`` and a simple python class that extends ``ProbeBasic`` + +These changes can be achieved with the standard instal of Probe Basic, no need for a Development install. Though you may need to dig into the ``probe_basic.ui`` file in Qt Designer to find the needed widget names (``editvcp probe_basic``). + +Button Renaming Example +----------------------- + +In the following python example the **FLOOD** button is rename to **FOO** and the **MIST** button is renamed to **BAR** + +.. image:: images/custom_ux_labels.png + :align: center + +To try out the following yourself, save the python below to a file called ``custom_probebasic.py`` under your machine config directory (``~/linuxcnc/configs/{my_machine}/custom_probebasic.py``). + +.. code:: python + + from probe_basic.probe_basic import ProbeBasic + + class CustomProbeBasic(ProbeBasic): + """Main window class for the ProbeBasic VCP. + + save this file as `custom_probebasic.py` in you configs directory + then your custom_config.yml add the `provider:` line below to the `mainwidow: section` + + ``` + windows: + mainwindow: + provider: custom_probebasic:CustomProbeBasic + kwargs: + confirm_exit: false + ``` + + """ + def __init__(self, *args, **kwargs): + super(CustomProbeBasic, self).__init__(*args, **kwargs) + + # rename the Flood button + self.flood_button.setText("Foo") + + # rename the Mist button + self.mist_button.setText("Bar") + + +Then edit the ``~/linuxcnc/configs/{my_machine}/custom_config.yml`` file and add the line ``provider: custom_probebasic:CustomProbeBasic`` just under ``mainwindow:`` + +**Before:** + +.. code:: yaml + + windows: + mainwindow: + kwargs: + confirm_exit: false + +**After:** + +.. code:: yaml + + windows: + mainwindow: + provider: custom_probebasic:CustomProbeBasic + kwargs: + confirm_exit: false + diff --git a/_sources/dev_install.rst.txt b/_sources/dev_install.rst.txt new file mode 100644 index 00000000..62952c20 --- /dev/null +++ b/_sources/dev_install.rst.txt @@ -0,0 +1,78 @@ +Probe Basic Development Installation +==================================== + + +This Dev install method uses an installer script and will install QtPyVCP and Probe Basic into a virtual environment (venv) which is now a requirement for pip installations on systems running python version 3.11 which is what comes on Linux Debian 12 Bookworm. This has been tested to work on a clean install of debian 12 bookworm using the xfce4 option and nonfree firmware cdnetinst iso. Download and install the bookworm iso from the link below for your pc type, typically the amd64 on normal pc's: + + +https://www.debian.org/releases/bookworm/debian-installer/ + +.. important:: + During Linux Bookworm installation, DO NOT set a root password when prompted, just press continue to move to the next section in the visual installer. Once installed, run all of your updating. + + +Installation Steps +------------------ + + 1. Install linuxcnc from terminal using apt: + + .. code-block:: bash + + sudo apt install linuxcnc-uspace linuxcnc-uspace-dev mesaflash + + 2. Next restart your computer + + 3. Ensure git is installed: + + .. code-block:: bash + + sudo apt install git + + 4. Ensure zenity is installed: + + .. code-block:: bash + + sudo apt install zenity + + 5. Create a directory and clone the repo to it. Either clone or download a zip file: + + .. code-block:: bash + + cd ~ + mkdir dev + cd dev + git clone https://github.com/Lcvette/qtpyvcp-bookworm-installer.git + cd qtpyvcp-bookworm-installer + ./install_for_qtpyvcp.sh + + +Getting Started with Probe Basic DEVELOPMENT +-------------------------------------------- + + You should now see a series of icons on your desktop, 3 probe basic mill instances consisting of an inch/metric/atc sim and 1 lathe sim instance. There should also be 2 qtpyvcp icons, one for mill and one for lathe. These icons must be used to enter QTdesigner for your develpment work. To test your edits in QTdesigner you must use the desktop launcher icons provided to start and run your instance of probe basic sim. This is required due to python3 requiring to be run in a VENV (virtual environment). Do not use the application drop down to run linuxcnc or you will not see your changes from your dev efforts. The changes will be saved in the dev folder files. When you have completed your edits and wish to create a .deb build file, you can follow the instructions under creating a .deb installation file in the probe basic instruction docs. (coming soon). + + +Updating QtPyVCP and Probe Basic +-------------------------------- + + To update QtPyVCP and Probe Basic, from terminal in the installer directory file, run the following script command: + + .. code-block:: bash + + ./updater.sh + + +Uninstalling QtPyVCP and Probe Basic +------------------------------------ + + To uninstall QtPyVCP and Probe Basic, delete the **/home/(your_pc_name)/dev** folder. Since this is a venv run in place install, it is removed once the directory is deleted. + + +Note +---- + + Files that must be executable: + + - install_for_qtpyvcp.sh + - sudo_helper.sh + - updater.sh diff --git a/_sources/development_quick_start_apt.rst.txt b/_sources/development_quick_start_apt.rst.txt new file mode 100644 index 00000000..3f227a44 --- /dev/null +++ b/_sources/development_quick_start_apt.rst.txt @@ -0,0 +1,103 @@ +=============================== +Probe Basic APT Develop Install +=============================== + +**Probe Basic APT Installation Guide for use with Debian 12 Bookworm and LinuxCNC version 2.9 or Later** + +Important Requirements +---------------------- + + - Probe Basic is currently designed for 1920x1080 screen sizes only! + - Probe Basic Install by apt is for amd64 only currently! + - Probe Basic requires graphics hardware that supports OpenGL 3.2 and OpenGL Shading Language (GLSL) 1.50 or later + - Probe Basic is tested on xfce4, during install of Debian 12 ISO: + - DO NOT enter a Root password during installation, leave blank and skip this page. + + During installation, this screen below will appear, be sure to uncheck gnome and check xfce as pictured below. No other changes on this page are needed. + + .. image:: images/xfce_check_doc.png + :align: center + + +Installation Steps +------------------ + +1. Download the Linux Debian 12 Bookworm ISO Image File +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Download from: https://www.debian.org/download + + Select the Linux Debian 12 Bookworm Netinst CD ISO from the above link. You will need to make a bootable DVD or USB thumb drive depending on how you plan to install. The below software is extremely easy and works flawlessly with Linux Debian OS images: + + https://www.balena.io/etcher/?ref=etcher_update + + Once you have created your flash stick for LinuxCNC, proceed to install and boot the system. (Note: It is advised to have an ethernet cable internet connection during install). Select the graphical installation option. Follow the steps on screen to complete installation. When you are greeted by the Linux Desktop Selection Page, uncheck the GNOME option and check the XFCE4 option. + +2. Update the System +^^^^^^^^^^^^^^^^^^^^ + + After installation, run the following commands in the main terminal: + + .. code-block:: bash + + sudo apt update + sudo apt upgrade + +3. Install LinuxCNC +^^^^^^^^^^^^^^^^^^^ + + If you have not already installed LinuxCNC from apt, use the following command: + + .. code-block:: bash + + sudo apt install linuxcnc-uspace linuxcnc-uspace-dev mesaflash + + Once you have installed LinuxCNC, open it and start the axis sim briefly and then shut it down to ensure the installation was successful. + +4. Add the APT Repository for the Installation type +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + **AMD64 for PC Installation Repository:** + + Run the following commands in the main terminal one at a time: + + .. code-block:: bash + + sudo apt install curl + echo 'deb [arch=amd64] https://repository.qtpyvcp.com/apt develop main' | sudo tee /etc/apt/sources.list.d/kcjengr.list + curl -sS https://repository.qtpyvcp.com/repo/kcjengr.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/kcjengr.gpg + gpg --keyserver keys.openpgp.org --recv-key 2DEC041F290DF85A + + + **NEW - ARM64 Raspberry Pi 4 and 5 Installation Repository:** + + Run the following commands in the main terminal one at a time: + + .. code-block:: bash + + sudo apt install curl + echo 'deb [arch=arm64] https://repository.qtpyvcp.com/apt develop main' | sudo tee /etc/apt/sources.list.d/kcjengr.list + curl -sS https://repository.qtpyvcp.com/repo/kcjengr.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/kcjengr.gpg + gpg --keyserver keys.openpgp.org --recv-key 2DEC041F290DF85A + +5. Update the Repositories +^^^^^^^^^^^^^^^^^^^^^^^^^^ + + .. code-block:: bash + + sudo apt update + +6. Install QtPyVCP and Probe Basic +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + .. code-block:: bash + + sudo apt install python3-qtpyvcp + sudo apt install python3-probe-basic + + You are now installed! You should be able to launch the Probe Basic sim from within the LinuxCNC applications dropdown menu. + +Updating and Configuration +-------------------------- + + Updating of Probe Basic and QtPyVCP will occur when you run the normal "sudo apt update, sudo apt upgrade" commands. During updating, the Probe Basic sim configuration files will be overwritten. It is strongly recommended to create your machine configuration files with unique names to avoid having them overwritten during updates. diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 00000000..e614984a --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,53 @@ +.. ProbeBasic documentation master file, created by + sphinx-quickstart on Sun Sep 29 11:22:41 2019. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. image:: _static/icon.png + +Probe Basic +=========== + +ProbeBasic is a `QtPyVCP `_ based user interface +for the `LinuxCNC `_ machine control. + +.. toctree:: + :maxdepth: 2 + :caption: Installation: + + stable_quick_start_apt + development_quick_start_apt + stable_develop_branch_change + quick_start + dev_install + +.. toctree:: + :maxdepth: 2 + :caption: Configuration: + + probe_basic_parameters + machine_config + atc_setup + +.. toctree:: + :maxdepth: 2 + :caption: Interface: + + Mill + Lathe + probing + tool_length_setter + +.. toctree:: + :maxdepth: 2 + :caption: Extending: + + user_tabs + custom_ux_hacking + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/_sources/lathe_interface.rst.txt b/_sources/lathe_interface.rst.txt new file mode 100644 index 00000000..a5a32c80 --- /dev/null +++ b/_sources/lathe_interface.rst.txt @@ -0,0 +1,50 @@ +========================================== +Probe Basic Lathe Interface +========================================== + +Main +---- +.. image:: images/lathe/01_Main.png + :align: center + +File +---- +.. image:: images/lathe/02_File.png + :align: center + +Offsets +------- +.. image:: images/lathe/03_Offsets.png + :align: center + +Touch Off +--------- +.. image:: images/lathe/04_Touch_Off.png + :align: center + +Tool Table +---------- +.. image:: images/lathe/05_Tool_Table.png + :align: center + +Probing +------- +.. image:: images/lathe/06_Probing.png + :align: center + +Conversational +-------------- +.. image:: images/lathe/07_Conversational.png + :align: center + +Settings +-------- +.. image:: images/lathe/08_Settings.png + :align: center + +Status +------ +.. image:: images/lathe/09_Settings.png + :align: center + + diff --git a/_sources/machine_config.rst.txt b/_sources/machine_config.rst.txt new file mode 100644 index 00000000..b675f09d --- /dev/null +++ b/_sources/machine_config.rst.txt @@ -0,0 +1,196 @@ +======================================= +Machine Configuration (INI, HAL, Files) +======================================= + +Creating a working Machine Configuration for Probe Basic +-------------------------------------------------------- + + Probe Basic uses some different methods to offer its feature-rich user experience, which requires customized files and settings inside the HAL and INI files to function properly. Below is a guide to help create a working machine configuration for Probe Basic. This guide assumes a basic installation with manual tool changes. A future document will be available for more complex configurations with ATC and Coolant Cannon functionality. + +Step 1: Create a basic configuration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + 1. Create a configuration for your machine using Pncconf or mesact/mesact2 from the LinuxCNC menu in the applications drop-down in the upper menu bar. In this example, we are using Pncconf. + 2. It is recommended to use the Axis GUI display for this initial build. + 3. Have your machine's wiring schematic premade to make filling in the required information fast, easy, and accurate in Pncconf. + 4. After completing the Pncconf configuration builder and creating a new machine configuration saved in the LinuxCNC config directory, start LinuxCNC using your new config to verify there are no errors. + 5. Test the machine to verify the base functionality is correct (e.g., jogging, spindle function, axis motion). + 6. Once completed and found to function correctly, proceed to step 2. + +Step 2: Copy required files +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + 1. In the LinuxCNC config folder, locate your new config folder and the "probe_basic_machine_config_setup_files" folder. + 2. Open two folder windows on the desktop: the new Pncconf folder created for your machine and the probe_basic_machine_config_setup_files folder. + 3. Clean up the Pncconf folder by removing unneeded files (see images below for reference). + 4. Copy the required files from the probe_basic_machine_config_setup_files folder to the Pncconf config folder. + + ***the latest DEVELOP version requires the "user_buttons" folder to be copied over also (not shown in pics below)!*** + + + **As built pncconfig folder** + + .. image:: images/pb_instruction_1.png + :align: center + + | + + + **Unneeded pncconfig files highlighted** + + .. image:: images/pb_instruction_2.png + :align: center + + | + + + **Cleaned up pncconfig folder** + + .. image:: images/pb_instruction_3.png + :align: center + + | + + + **Files to be Copied from probe_basic_machine_config_setup_files folder** + + .. image:: images/pb_instruction_4.png + :align: center + + | + + + **Files Copied to pncconfig folder** + + .. image:: images/pb_instruction_5.png + :align: center + :alt: Files Copied to pncconfig folder + + | + +Step 3: Edit INI files +^^^^^^^^^^^^^^^^^^^^^^ + + 1. Open the Pncconf "my_LinuxCNC_machine.ini" file side by side with the supplied "probe_basic_required_ini_items.ini" file in a text editor. + 2. Integrate the lines from "probe_basic_required_ini_items.ini" into your existing file: + - If a line is present in your machine file, use the Probe Basic settings for that line. + - If a line is not in your machine file, copy it to the appropriate section in "my_LinuxCNC_machine.ini". + 3. Note that only ONE postgui HAL file can be called. Add any additional items to the existing probe_basic_postgui.hal file. + 4. Save the file and delete the "probe_basic_required_ini_items.ini" file from the folder. + + + **Required ini file items for Probe Basic** + + .. code-block:: bash + + [DISPLAY] + DISPLAY = probe_basic + OPEN_FILE = ~/linuxcnc/nc_files/pb_examples/blank.ngc + CONFIG_FILE = custom_config.yml + MAX_FEED_OVERRIDE = 2.000000 # Recommended Setting for Probe Basic + MAX_SPINDLE_OVERRIDE = 2.000000 # Recommended Setting for Probe Basic + MIN_SPINDLE_OVERRIDE = 0.500000 # Recommended Setting for Probe Basic + INCREMENTS = JOG .01in .001in .0001in # REQUIRED Setting for Probe Basic + USER_TABS_PATH = user_tabs/ # REQUIRED Setting for Probe Basic + USER_BUTTONS_PATH = user_buttons/ # REQUIRED Setting for Probe Basic + + [RS274NGC] + RS274NGC_STARTUP_CODE = F10 S300 G20 G17 G40 G49 G54 G64 P0.001 G80 G90 G91.1 G92.1 G94 G97 G98 + PARAMETER_FILE = linuxcnc.var + OWORD_NARGS = 1 + NO_DOWNCASE_OWORD = 1 + SUBROUTINE_PATH = subroutines + + [HAL] + POSTGUI_HALFILE = hallib/probe_basic_postgui.hal + TWOPASS = on + + | + + + .. image:: images/pb_instruction_7.png + :align: center + + | + +Step 4: Modify Post Gui Hal Files +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Modify the following lines by commenting them out, they are used for testing in probe basic sim only and will error in the real machine configs. the spindle feedback line can be used if it is setup in the main hal and the hardware is on the machine to provide a spindle speed input to linuxcnc. + + .. code-block:: bash + + loadrt time + loadrt not + + addf time.0 servo-thread + addf not.0 servo-thread + net prog-running not.0.in <= halui.program.is-idle + net prog-paused halui.program.is-paused => time.0.pause + net cycle-timer time.0.start <= not.0.out + net cycle-seconds qtpyvcp.timerseconds.in <= time.0.seconds + net cycle-minutes qtpyvcp.timerminutes.in <= time.0.minutes + net cycle-hours qtpyvcp.timerhours.in <= time.0.hours + # *** Time items required for Probe Basic to run *** + + # ---manual tool change signals--- + net tool-change-request => qtpyvcp_manualtoolchange.change + net tool-change-confirmed <= qtpyvcp_manualtoolchange.changed + net tool-number => qtpyvcp_manualtoolchange.number + + # *** Probe graphic simulation trigger push probe tip *** + # net probe-in => qtpyvcp.probe-in.out <----comment this line out> + net probe-in <= qtpyvcp.probe-led.on + + # *** Set line below for actual spindle readout from your hal file *** + # net spindle-rpm-filtered scale_to_rpm.out => qtpyvcp.spindle-encoder-rpm.in <----comment this line out> + + + + +Step 5: Modify HAL file +^^^^^^^^^^^^^^^^^^^^^^^ + + 1. Add digital and analog IO to the HAL file by modifying the following line: + + :: + + loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS + + Add this to the end of the line: + + :: + + num_dio=6 num_aio=3 + + The finished edit should look like this: + + :: + + loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS num_dio=6 num_aio=3 + + .. image:: images/pb_instruction_8.png + :align: center + :alt: HAL file modification + + | + + 2. Remove the red highlighted manual tool change dialog section from the bottom of the hal file as shown in the image below. Probe basic uses its own built in dialog for manual tool changes which give the user better tool information and matches the ui visual theme more appropriately. + + .. image:: images/pb_instruction_9.png + :align: center + :alt: Tool change section to remove + + | + +Launching Probe Basic +--------------------- + + 1. Under the CNC section of the drop-down applications menu, find your machine configuration and select it to launch. + 2. Check the box at the bottom of the launch window to create a desktop icon for easier starts. + 3. To set the Probe Basic icon: + - Right-click the desktop launcher and select "edit launcher" + - Click the current icon image, this will open the icon folder + - Find and select the icon named "probe_basic_mill" + + You should now be ready to use Probe Basic with your machine configuration. diff --git a/_sources/mill_interface.rst.txt b/_sources/mill_interface.rst.txt new file mode 100644 index 00000000..be2d5a7e --- /dev/null +++ b/_sources/mill_interface.rst.txt @@ -0,0 +1,74 @@ +========================== +Probe Basic Mill Interface +========================== + + +Main +---- +GCODE +~~~~~ +.. image:: images/mill/01_Main.png + :align: center + +MDI +~~~ +.. image:: images/mill/01_Main_MDI.png + :align: center + +File +---- +.. image:: images/mill/02_File.png + :align: center + +ATC +--- +.. image:: images/mill/03_ATC.png + :align: center + +Tool +---- +.. image:: images/mill/04_Tool.png + :align: center + +Offsets +------- +.. image:: images/mill/05_Offsets.png + :align: center + +Probing +------- +.. image:: images/mill/06_Probing.png + :align: center + +:doc:`Probing Help` + +Conversational +-------------- + +Facing +~~~~~~ +.. image:: images/mill/07_Conversational_Facing.png + :align: center + +Holes +~~~~~ + +Pattern +^^^^^^^ +.. image:: images/mill/07_Conversational_Hole_Ops_Pattern.png + :align: center + +XY Coord +^^^^^^^^ +.. image:: images/mill/07_Conversational_Hole_Ops_XY_Coord.png + :align: center + +Settings +-------- +.. image:: images/mill/08_Settings.png + :align: center + +Status +------ +.. image:: images/mill/09_Status.png + :align: center diff --git a/_sources/probe_basic_parameters.rst.txt b/_sources/probe_basic_parameters.rst.txt new file mode 100644 index 00000000..b4be49e6 --- /dev/null +++ b/_sources/probe_basic_parameters.rst.txt @@ -0,0 +1,34 @@ +====================== +Probe Basic Parameters +====================== + +**Probe basic requires the following parameters be created in the var file** + + Probe Basic's devlop version is now using the var file in the configs folder for storing parameters used in subroutines and other functions throughout linuxcnc. These are callable the same as all other parameters which allows them to be used in remap subroutines. This will allow users a greater degree of flexibility in modifying and using features such as tool touch off during tool changes, programmable coolant, probing etc all while being able to make changes from the from within the probe basic user interfaces entry boxes. Once changes to the entries are made they are recorded to the var file and are available immediately after the changes are made. This allows users the ability to change vital settings to ensure their machines run optimally and reliably without major config modifications. + + The Probe Basic Sim Config Folder contains the sim.var file which has been updated with these now required parameters. please be sure to add them to your machine connfiguration for proper functionality. + +.. image:: images/params_programmable_coolant.png + :align: center + :scale: 100% + +| + +.. image:: images/params_tool_setter.png + :align: center + :scale: 100% + +| + +.. image:: images/params_touch_probe.png + :align: center + :scale: 100% + +| + +.. image:: images/params_atc.png + :align: center + :scale: 100% + +| + diff --git a/_sources/probing.rst.txt b/_sources/probing.rst.txt new file mode 100644 index 00000000..2d0973fd --- /dev/null +++ b/_sources/probing.rst.txt @@ -0,0 +1,241 @@ +========================================== +Probing +========================================== + +Probe Basic has a number of included probing routines. + +.. image:: images/mill/06_Probing.png + :align: center + +| + +Probing Setup +------------- + + 1. To begin probing, you first need to make sure you have connected ``motion.probe-input`` in your HAL file. + + 2. Next, add an entry in your Tool Table for the probe, including the tip diameter. The default recommended tool number is 99. (Finding the probe tool length offset will be covered below) + + 3. Enter the Probing Parameters on the Probing Page. A description for these can be found on the probing help tab or below in the docs. + + 4. Setting the touch probe tool length offset. The way I prefer to find the touch probe tool length offset is as follows: + + a. Use a facemill and measure the tool length of the facemill either by the tool setter or with a manual tool setter. + + b. Once the facemill tool data is measured, entered, and stored in the tool table, load it in the spindle with the LOAD TOOL feature on the tooling page. + + c. Mount a piece of scrap stock in the machine vise or on the table where it can be faced. + + d. Face the stock to have a true flat surface. Do not move the z axis once faced. + + e. Press the ZERO Z button in the DRO section of the interface. This will record the z work offset with the facemill's tool length offset applied. Move the spindle to a safe distance to remove the tool. + + f. Use the UNLOAD SPINDLE button on the tooling page and remove the facemill from the spindle. + + g. Load the probe tool in the spindle. Make sure the tool length offset in the tool table is set to 0.0000. + + h. Ensure all of the probe parameters have been set correctly, and move the probe over the faced surface of the stock. + + i. Use the "PROBE POSITION ONLY" button on the probe page. This will find the surface without resetting the offset. + + j. Press the Probe Z button on the probing page to probe the faced surface of the stock. The probed result for Z- PROBED will be the tool length offset for the touch probe. The number used will be absolute, no +/- sign entered as all tool length offsets are relative to the spindle nose gage line. + + k. Enter the absolute value in the probe tool length offset in the tool table, save and reload the tool table. + + l. Verify the tool length offset is correct by loading the probe tool using the LOAD SPINDLE button and probing the face of the stock again. + + m. The Z- PROBED result should show a probed position of 0.0000. This verifies that the probed surface from the facemill and the probed point are the same with tool length offsets applied, which is what we want. + + 5. Now that the probe has been set up in software and in the tool table, we need to calibrate it for the most accurate results. This will be covered in the calibration section below. + +Calibrating your Touch Probe +---------------------------- + + Probe Basic has a built-in probe calibration feature function which makes the calibration and calculations painless. Requirements are a precision gage pin or gage ring of known size mounted securely to the table. + + The software calibration assumes that you have mechanically zeroed the probe's stylus tip in the spindle and it has a TIR that meets your tolerance requirements. Ideally, 0.0000 TIR is the goal, but this may not always be possible. + + As most probes require a small deflection of the tip before tripping, **PROBE CALIBRATION OFFSET** is used to account for this and can be set using these calibration routines and an accurately measured standard gauge. + + .. tip:: + Calibration video from Lcvette https://youtu.be/Qr9L6dyXf2A + + 1. Select the CALIBRATE tab in Probe Basic. + 2. Enter the gage ring or gauge pin diameter in the CALIBRATION DIAMETER dialog box. + 3. Move the probe over the gage pin or gage ring as shown in the probe button graphic for which type is being used. The starting position for the probe routine should match the pink tip in the graphic. The probe should be slightly above the gage object as a z minus move is the first move. + 4. Select the appropriate probing button that corresponds to your gage ring or pin and press it. + 5. The probe routine should complete and afterwards will populate the PROBE CALIBRATION OFFSET box. This value will be used to account for the probe's trigger distance. + 6. Important notes: the probe feedrates will directly affect the trigger distance and the same feedrates used during calibration should be used in all subsequent probing. + 7. Move the probe to the previous starting position, and press the PROBE POSITION ONLY button. + 8. Select the BOSS AND POCKET probe tab. + 9. Select the same probe routine type for boss or pocket that was used in the calibration routine, and press it. + 10. The results should show a diameter that now matches the gage ring or within the tolerance that the machine is capable of probing. + 11. If the results do not match the gage ring known diameter, you can verify the stylus ball diameter is correct in the tool table, and try changing the speeds at which you probe. Then rerun the calibration routine above until your results are acceptable for your needs. + +Work Offsets +------------ + + .. image:: images/mill/probe_00_work_offsets.png + :align: center + + | + + This area allows you to select a Workpiece Coordinate Offset (WCO) and if it is to be updated as a result of probing. + + G5x: + Set the active Workpiece Coordinate Offset, which may be updated. + + PROBE POSITION ONLY: + This button when active (BLUE) will NOT set the currently active work offset to zero when a probe event occurs. It will record the probed positions and calculate Diameter, and X Y probe widths along with the Z position probed. This is useful for measuring or reverse engineering objects by using the probe tool. + + When not active, all probe events will set the currently active work offset to zero for each probed axis position recorded. The inactive mode should be used for setting work coordinates to zero for stock or part programs. + +Parameters +---------- + + .. image:: images/mill/probe_00_parameters.png + :align: center + + | + + - PROBE TOOL#: + This should be set to match the probe entry in your tool table. + - STEP OFF WIDTH: + How far the probe will travel in either X or Y before moving down a side. + - PROBE FAST FDRATE: + Fast feed rate, for first touch when probing. + - PROBE SLOW FDRATE: + Slow feed rate for second touch when probing. If set to 0 (zero) a second touch will not be performed and the result from the fast probe is used. + - PROBE TRAVERSE FDRATE: + This is the speed at which non-probing motion will move at such as traversing the top of a workpiece or repositioning for a subsequent probe event. + - MAX X/Y DISTANCE: + Maximum distance to travel in either X or Y before tripping out. + - X/Y CLEARANCE: + Retract distance for X and Y probing after touch, this should be at least larger than any backlash in the axis. + - MAX Z DISTANCE: + Maximum distance to travel in Z before tripping out. + - Z CLEARANCE: + Retract distance for Z probing after touch, this should be at least larger than any backlash in the axis. + - EXTRA PROBE DEPTH: + Extra distance to move down a side (after probe diameter) before probing in X or Y. + - EDGE WIDTH: + Distance between test points when probing for Edge Angle's. + +Probe Results +------------- + + .. image:: images/mill/probe_00_results_1.png + :align: center + + | + + This shows the results from the last probing run. There are reset buttons to clear the data if needed. + +Probing Routines +---------------- + + The purple dot in each button shows the position at which your probe tip should be approximately placed before starting the probe run. + The Z height above the workpiece should be no more than your "**MAX Z DISTANCE**" parameter. + + Outside Corners + ~~~~~~~~~~~~~~~ + + .. image:: images/mill/probe_01_outside_corners.png + :align: center + + | + + Inside Corners and Straight probes + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + .. image:: images/mill/probe_02_inside_corners.png + :align: center + + | + + Boss and Pocket + ~~~~~~~~~~~~~~~ + + .. image:: images/mill/probe_03_boss_and_pocket.png + :align: center + + | + + Ridge and Valley + ~~~~~~~~~~~~~~~~ + + .. image:: images/mill/probe_04_ridge_and_valley.png + :align: center + + | + + Edge Angle + ~~~~~~~~~~ + + .. image:: images/mill/probe_05_edge_angle.png + :align: center + + | + + Rotary Axis + ~~~~~~~~~~~ + + .. image:: images/mill/probe_06_rotary_axis.png + :align: center + + | + + Calibrate + ~~~~~~~~~ + + .. image:: images/mill/probe_07_calibrate.png + :align: center + + | + +Help +---- + + .. _probe_help: + + .. image:: images/mill/probe_08_probe_help.png + :align: center + + | + + **Included here for offline reference, though a running PB instance may have more up-to-date help.** + + .. image:: images/mill/probe_help_01_step_off_width.png + :align: center + + | + + .. image:: images/mill/probe_help_02_extra_probe_depth.png + :align: center + + | + + .. image:: images/mill/probe_help_03_max_z_distance.png + :align: center + + | + + .. image:: images/mill/probe_help_04_max_xy_distance.png + :align: center + + | + + .. image:: images/mill/probe_help_05_z_clearance.png + :align: center + + | + + .. image:: images/mill/probe_help_06_xz_clearance.png + :align: center + + | + + .. image:: images/mill/probe_help_07_hint.png + :align: center + + | diff --git a/_sources/quick_start.rst.txt b/_sources/quick_start.rst.txt new file mode 100644 index 00000000..ad12c50f --- /dev/null +++ b/_sources/quick_start.rst.txt @@ -0,0 +1,128 @@ +======================== +Probe Basic .deb Install +======================== + + +**Probe Basic .deb Installation Guide for use with Debian Bookworm and LinuxCNC version 2.9 or Later** + + +Important Requirements +---------------------- + + - Probe Basic is currently designed for 1920x1080 screen sizes only! + - Probe Basic Install by apt is for amd64 only currently! + - Probe Basic requires graphics hardware that supports OpenGL 3.2 and OpenGL Shading Language (GLSL) 1.50 or later + - Probe Basic is tested on xfce4, during install of Debian 12 ISO: + - DO NOT enter a Root password during installation, leave blank and skip this page. + + During installation, this screen below will appear, be sure to uncheck gnome and check xfce as pictured below. No other changes on this page are needed. + + .. image:: images/xfce_check_doc.png + :align: center + + | + + +Download the Linux Debian 12 Bookworm ISO Image File +---------------------------------------------------- + + Download from: https://www.debian.org/download + + Select the Linux Debian 12 Bookworm Netinst CD ISO from the above link. You will need to make a bootable DVD or USB thumb drive depending on how you plan to install. The software below is extremely easy and works flawlessly with Linux Debian OS images: + + https://www.balena.io/etcher/?ref=etcher_update + + We recommend using a 2-4GB USB drive for quicker flashing. + + +Installation Steps +------------------ + + 1. Create your flash stick for LinuxCNC and proceed to install and boot the system. (Note: It is advised to have an ethernet cable internet connection during install). + 2. Select the graphical installation option. + 3. Follow the steps on screen to complete installation. + 4. When you reach the Linux Desktop Selection Page, uncheck the GNOME option and check the XFCE4 option. + 5. After installation, open the main terminal and run the following commands: + + .. code-block:: bash + + sudo apt update + sudo apt upgrade + + +Installing Probe Basic +---------------------- + + Requirements: + + - Debian 12 Bookworm + - Python 3.11 + - LinuxCNC 2.9 or higher + - xfce4 desktop environment + - OpenGL 1.50 or Later graphics support + - QtPyVCP + - hiyapyco + + If you haven't installed LinuxCNC, use the following command: + + .. code-block:: bash + + sudo apt install linuxcnc-uspace linuxcnc-uspace-dev mesaflash + + After installation, open LinuxCNC and start the axis sim briefly to ensure successful installation. + + Download the following files: + + .. parsed-literal:: + + |probe_basic_deb_link| + + |qtpyvcp_deb_link| + + https://repository.qtpyvcp.com/repo/hiyapyco/python3-hiyapyco_0.5.1-1_all.deb + + +Installation Commands +--------------------- + + Navigate to the download directory, right-click, and select "Open Terminal Here". Run the following commands: + + .. code-block:: bash + + sudo apt install debhelper-compat dh-python python3-setuptools python3-yaml python3-pyqt5.qtmultimedia python3-pyqt5.qtquick qml-module-qtquick-controls libqt5multimedia5-plugins python3-dev python3-docopt python3-qtpy python3-pyudev python3-psutil python3-markupsafe python3-vtk9 python3-pyqtgraph python3-simpleeval python3-jinja2 python3-deepdiff python3-sqlalchemy qttools5-dev-tools python3-serial + + .. parsed-literal:: + + sudo dpkg -i python3-hiyapyco_0.5.1-1_all.deb + + .. parsed-literal:: + + sudo dpkg -i |qtpyvcp_deb| + + .. parsed-literal:: + + sudo dpkg -i |probe_basic_deb| + + You should now be able to launch the Probe Basic sim from within the LinuxCNC applications dropdown menu. + + Note: When updating/installing the latest .deb files, the Probe Basic sim configuration files will be overwritten. It is strongly recommended to create your machine configuration files with unique names to avoid having them overwritten during updates. + + To build your own machine configuration, please follow the instructions in this document: + https://forum.linuxcnc.org/qtpyvcp/48401-configuration-file-conversion-doc-for-probe-basic-py3 + + +Uninstallation +-------------- + + To uninstall, enter the following commands in the main terminal: + + .. code-block:: bash + + sudo dpkg -P python3-probe-basic + sudo dpkg -P python3-hiyapyco + sudo dpkg -P python3-qtpyvcp + + | + + + \ No newline at end of file diff --git a/_sources/stable_develop_branch_change.rst.txt b/_sources/stable_develop_branch_change.rst.txt new file mode 100644 index 00000000..c35b1440 --- /dev/null +++ b/_sources/stable_develop_branch_change.rst.txt @@ -0,0 +1,102 @@ +==================================== +Changing Stable <-> Develop Versions +==================================== + +Probe Basic STABLE and DEVELOP Version Information +-------------------------------------------------- + + Probe Basic now has STABLE and DEVELOP repositories from which users can select for apt updates. You can switch between repositories to test new and upcoming features, but must understand that the development repository will be a testing version. As such, it may be subject to bugs. If you select the develop branch, please be sure to report any bugs either on the forum or on git. + +Step-by-Step Guide to Change the Sources List for Stable and Develop APT Repository +----------------------------------------------------------------------------------- + +1. Edit the sources list +^^^^^^^^^^^^^^^^^^^^^^^^ + + Type or copy and paste the following line in a terminal, press ENTER, and type in your sudo password when prompted: + + .. code-block:: bash + + sudo nano /etc/apt/sources.list.d/kcjengr.list + + .. image:: images/pb_sources_list.png + :align: center + :scale: 80% + + | + +2. Modify the repository +^^^^^^^^^^^^^^^^^^^^^^^^ + + Edit the source list line to set the apt repository for either STABLE or DEVELOP version of Probe Basic: + + .. image:: images/nano_sources_list.png + :align: center + :scale: 80% + + | + + .. image:: images/nano_sources_list_edited.png + :align: center + :scale: 80% + + | + +3. Save changes +^^^^^^^^^^^^^^^ + + Exit and save the changes by pressing CTRL + X, then Y, then ENTER: + + .. image:: images/yes_nano_to_save.png + :align: center + :scale: 80% + + | + + .. image:: images/enter_nano_file_save_name.png + :align: center + :scale: 80% + + | + +4. Uninstall current Probe Basic +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Run the following commands in terminal to uninstall the current installation of Probe Basic: + + .. code-block:: bash + + sudo dpkg -P python3-probe-basic + sudo dpkg -P python3-qtpyvcp + +5. Install Probe Basic and QtPyVCP +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Run the following commands in terminal to install Probe Basic and QtPyVCP: + + .. code-block:: bash + + sudo apt install python3-qtpyvcp + sudo apt install python3-probe-basic + +6. Update and upgrade +^^^^^^^^^^^^^^^^^^^^^ + + Run apt update/upgrade by copying the following commands in the main terminal one line at a time. Select Y for yes if asked at any point during the update: + + .. code-block:: bash + + sudo apt update + sudo apt upgrade + +7. Important Note +^^^^^^^^^^^^^^^^^ + + The development versions will likely require edits, additions or updates to config files. These include but are not limited to the yaml, ini, hal, subroutine, python, and any other supporting configuration files. These changes may not always be fully documented as we test them and are making changes, so we urge users to be aware that the development version should be used in a testing environment only. Those wishing to retain stability in operational use should change to the STABLE version. + +Troubleshooting and Support +--------------------------- + + For bug reporting, general assistance, or troubleshooting, visit the QtPyVCP section of the LinuxCNC forum: + + https://forum.linuxcnc.org/qtpyvcp diff --git a/_sources/stable_quick_start_apt.rst.txt b/_sources/stable_quick_start_apt.rst.txt new file mode 100644 index 00000000..8da2803f --- /dev/null +++ b/_sources/stable_quick_start_apt.rst.txt @@ -0,0 +1,108 @@ +============================== +Probe Basic APT Stable Install +============================== + +**Probe Basic APT Installation Guide for use with Debian 12 Bookworm and LinuxCNC version 2.9 or Later** + +Important Requirements +---------------------- + + - Probe Basic is currently designed for 1920x1080 screen sizes only! + - Probe Basic Install by apt is for amd64 only currently! + - Probe Basic requires graphics hardware that supports OpenGL 3.2 and OpenGL Shading Language (GLSL) 1.50 or later + - Probe Basic is tested on xfce4, during install of Debian 12 ISO: + - DO NOT enter a Root password during installation, leave blank and skip this page. + + During installation, this screen below will appear, be sure to uncheck gnome and check xfce as pictured below. No other changes on this page are needed. + + .. image:: images/xfce_check_doc.png + :align: center + + +Installation Steps +------------------ + + +1. Download the Linux Debian 12 Bookworm ISO Image File +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Download from: https://www.debian.org/download + + Select the Linux Debian 12 Bookworm Netinst CD ISO from the above link. You will need to make a bootable DVD or USB thumb drive depending on how you plan to install. The below software is extremely easy and works flawlessly with Linux Debian OS images: + + https://www.balena.io/etcher/?ref=etcher_update + + Once you have created your flash stick for LinuxCNC, proceed to install and boot the system. (Note: It is advised to have an ethernet cable internet connection during install). Select the graphical installation option. Follow the steps on screen to complete installation. When you are greeted by the Linux Desktop Selection Page, uncheck the GNOME option and check the XFCE4 option. + + +2. Update the System +^^^^^^^^^^^^^^^^^^^^ + + After installation, run the following commands in the main terminal: + + .. code-block:: bash + + sudo apt update + sudo apt upgrade + + +3. Install LinuxCNC (if not already installed) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + .. code-block:: bash + + sudo apt install linuxcnc-uspace linuxcnc-uspace-dev mesaflash + + Once you have installed LinuxCNC, open it and start the axis sim briefly, then shut it down to ensure the installation was successful. + + +4. Add the APT Repository for the Installation type +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + **AMD64 for PC Installation Repository:** + + Run the following commands in the main terminal one at a time: + + .. code-block:: bash + + sudo apt install curl + echo 'deb [arch=amd64] https://repository.qtpyvcp.com/apt stable main' | sudo tee /etc/apt/sources.list.d/kcjengr.list + curl -sS https://repository.qtpyvcp.com/repo/kcjengr.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/kcjengr.gpg + gpg --keyserver keys.openpgp.org --recv-key 2DEC041F290DF85A + + + **ARM64 Raspberry Pi 4 and 5 Installation Repository:** + + Run the following commands in the main terminal one at a time: + + .. code-block:: bash + + sudo apt install curl + echo 'deb [arch=arm64] https://repository.qtpyvcp.com/apt stable main' | sudo tee /etc/apt/sources.list.d/kcjengr.list + curl -sS https://repository.qtpyvcp.com/repo/kcjengr.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/kcjengr.gpg + gpg --keyserver keys.openpgp.org --recv-key 2DEC041F290DF85A + + +5. Update the Repositories +^^^^^^^^^^^^^^^^^^^^^^^^^^ + + .. code-block:: bash + + sudo apt update + + +6. Install QtPyVCP and Probe Basic +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + .. code-block:: bash + + sudo apt install python3-qtpyvcp + sudo apt install python3-probe-basic + + Congratulations! You have now installed Probe Basic. You should be able to launch the Probe Basic sim from within the LinuxCNC applications dropdown menu. + + +Updating and Configuration +-------------------------- + + Updating of Probe Basic and QtPyVCP will occur when you run the normal "sudo apt update" and "sudo apt upgrade" commands. During updating, the Probe Basic sim configuration files will be overwritten. It is strongly recommended to create your machine configuration files with unique names to avoid having them overwritten during updates. diff --git a/_sources/tool_length_setter.rst.txt b/_sources/tool_length_setter.rst.txt new file mode 100644 index 00000000..dc744752 --- /dev/null +++ b/_sources/tool_length_setter.rst.txt @@ -0,0 +1,69 @@ +================== +Tool Length Setter +================== + + + We recently updated the tool touch off page and it is now located under a tab on the main probing tab. there are explanations and visual graphics for better understanding on the tool touch off setup and parameter functions. Be sure to review the updated information/explanation tabs. We also have eliminated the need to use G59.3 as a storing location for the probed coordinates used in the length offset calculation. Below is an image of the new toolsetter page for reference. + + + .. image:: images/mill/toolsetter_page_doc_image.png + :align: center + + | + +Tool Touch Off Position +----------------------- + + .. important:: + Tool touch off position (G30), X and Y should be centered on the fixed tool setter platter. Z should always be set to Z Home position Z0.0000 + + | + + 1. Setting the tool touch off position, jog the machine to the center point of the tool setter platter and indicate it in or probe it with the touch probe to find exact center point. + 2. Next, retract the z axis to the home position Z0.0000 + 3. Press the "SET TOOL TOUCH OFF POS" button, this will capture and store the current locating for probing tools from the touch off routine. + +Tool Touch Off Parameter Settings +--------------------------------- + + 1. Enter the desired Parameter settings for all parameters: + + - Spindle Zero + - Fast Probe Feedrate + - Slow Probe Feedrate + - Traverse Feedrate + - Z Max Travel + - XY Max Travel + - Retract distance + + | + + .. important:: + Spindle Zero is the length/distance from the empty spindle nose at the Z home Position Z0.0000 to the top of the tool setter (at the trip point) + the value for ``Spindle Zero`` can be measured by probing the top of the setter using the spindle nose itself to find the distance (spindle empty spindle no holder loaded) + + | + + 2. Select the if Tool Diameter Offset will be used. This feature will automatically offset the probing position by 1/2 of the tools stored diameter in the tool table. the direction the tool will move in relation to the ToolSetter platter is determined by the Tool Offset Direction Buttons in the parameter setting section. This feature can be useful when measuring tools that are larger than the platter of the tool setter, such as facemills etc. + + .. image:: images/mill/toolsetter_page_doc_image_1.png + :align: center + + | + + 3. The Tool Diam Probe button is a place holder only, measuring the diameter of a tool requires a specific type of tool setter capable of measuring in 3 dimensions. We felt it was safer for those wanting this functionality to creating their own probing routine specific to their machine and hardware. In the subroutines folder is in the tool_touch_off.ngc file the parameter is there and passed to be able to turn this on or off. This will allow users to add to the subroutine as needed and have control over that functionality from within the user interface. + + 4. With all of the parameters set and the touch off location defined, you are now ready to test your firt tool touch off routine. follow the instruction below to proceed. + + +Measuring Tools +--------------- + + 1. To measure a tool, Load the tool in the spindle using the tool page in the probe basic interface + + 2. Press the "TOUCH OFF CURRENT TOOL" button, this will initiate the tool touch off routine and move the machine to the tool touch off position and probe the tool length to capture and store the current length of the tool in the tool table. + + .. image:: images/mill/tool_length_measure.png + :align: center + + | diff --git a/_sources/user_tabs.rst.txt b/_sources/user_tabs.rst.txt new file mode 100644 index 00000000..42a5e069 --- /dev/null +++ b/_sources/user_tabs.rst.txt @@ -0,0 +1,7 @@ +========= +User Tabs +========= + +TODO: + +https://github.com/kcjengr/probe_basic/pull/84 diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 00000000..7577acb1 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/css/badge_only.css b/_static/css/badge_only.css new file mode 100644 index 00000000..c718cee4 --- /dev/null +++ b/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;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}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.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{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #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;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.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}} \ No newline at end of file diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff b/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff b/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_static/css/fonts/fontawesome-webfont.eot b/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_static/css/fonts/fontawesome-webfont.svg b/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/css/fonts/fontawesome-webfont.ttf b/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_static/css/fonts/fontawesome-webfont.woff b/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_static/css/fonts/fontawesome-webfont.woff2 b/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_static/css/fonts/lato-bold-italic.woff b/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_static/css/fonts/lato-bold-italic.woff2 b/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_static/css/fonts/lato-bold.woff b/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/_static/css/fonts/lato-bold.woff differ diff --git a/_static/css/fonts/lato-bold.woff2 b/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/_static/css/fonts/lato-bold.woff2 differ diff --git a/_static/css/fonts/lato-normal-italic.woff b/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_static/css/fonts/lato-normal-italic.woff2 b/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_static/css/fonts/lato-normal.woff b/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/_static/css/fonts/lato-normal.woff differ diff --git a/_static/css/fonts/lato-normal.woff2 b/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/_static/css/fonts/lato-normal.woff2 differ diff --git a/_static/css/theme.css b/_static/css/theme.css new file mode 100644 index 00000000..c03c88f0 --- /dev/null +++ b/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){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:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{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,form{margin:0}label{cursor:pointer}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=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.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{body,html,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^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink: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 p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.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 p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.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 p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink: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 p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink: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 p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink: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 p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.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.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.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,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.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 .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.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.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition 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.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.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}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.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-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.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:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(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;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #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-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.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;left:auto;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 .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{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:6px 12px 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:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-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 .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],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=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.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=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.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=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .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}.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)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@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%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.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]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all 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 td,.wy-table-horizontal th{border-width:0 0 1px;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}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-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}.rst-content .toctree-wrapper>p.caption,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;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.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 .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.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 .2s ease-in;-moz-transition:all .2s ease-in;transition:all .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:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.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;padding-top:inherit}.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,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@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-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.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:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;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:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.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{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #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;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.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}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.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,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.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 p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.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}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_static/debian_iso_download_picture.png b/_static/debian_iso_download_picture.png new file mode 100644 index 00000000..233d3f59 Binary files /dev/null and b/_static/debian_iso_download_picture.png differ diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 00000000..b57ae3b8 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/icon.png b/_static/icon.png new file mode 100644 index 00000000..fa9a0092 Binary files /dev/null and b/_static/icon.png differ diff --git a/_static/js/badge_only.js b/_static/js/badge_only.js new file mode 100644 index 00000000..526d7234 --- /dev/null +++ b/_static/js/badge_only.js @@ -0,0 +1 @@ +!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}}); \ No newline at end of file diff --git a/_static/js/html5shiv-printshiv.min.js b/_static/js/html5shiv-printshiv.min.js new file mode 100644 index 00000000..2b43bd06 --- /dev/null +++ b/_static/js/html5shiv-printshiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3-pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/html5shiv.min.js b/_static/js/html5shiv.min.js new file mode 100644 index 00000000..cd1c674f --- /dev/null +++ b/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/theme.js b/_static/js/theme.js new file mode 100644 index 00000000..1fddb6ee --- /dev/null +++ b/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..691aeb82 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,74 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/screenshots/1_main_page.png b/_static/screenshots/1_main_page.png new file mode 100644 index 00000000..29a8413f Binary files /dev/null and b/_static/screenshots/1_main_page.png differ diff --git a/_static/screenshots/2_file_page.png b/_static/screenshots/2_file_page.png new file mode 100644 index 00000000..c2b6657b Binary files /dev/null and b/_static/screenshots/2_file_page.png differ diff --git a/_static/screenshots/3_atc_page.png b/_static/screenshots/3_atc_page.png new file mode 100644 index 00000000..d008eeb4 Binary files /dev/null and b/_static/screenshots/3_atc_page.png differ diff --git a/_static/screenshots/4_tool_page.png b/_static/screenshots/4_tool_page.png new file mode 100644 index 00000000..efbba4f4 Binary files /dev/null and b/_static/screenshots/4_tool_page.png differ diff --git a/_static/screenshots/5_offsets_page.png b/_static/screenshots/5_offsets_page.png new file mode 100644 index 00000000..6097d05e Binary files /dev/null and b/_static/screenshots/5_offsets_page.png differ diff --git a/_static/screenshots/6_probing_page.png b/_static/screenshots/6_probing_page.png new file mode 100644 index 00000000..db9ae42b Binary files /dev/null and b/_static/screenshots/6_probing_page.png differ diff --git a/_static/screenshots/7_conversational_page.png b/_static/screenshots/7_conversational_page.png new file mode 100644 index 00000000..70f78b2e Binary files /dev/null and b/_static/screenshots/7_conversational_page.png differ diff --git a/_static/screenshots/8_status page.png b/_static/screenshots/8_status page.png new file mode 100644 index 00000000..ebbe08d5 Binary files /dev/null and b/_static/screenshots/8_status page.png differ diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 00000000..97d56a74 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 00000000..aae669d7 --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/atc_setup.html b/atc_setup.html new file mode 100644 index 00000000..9b629164 --- /dev/null +++ b/atc_setup.html @@ -0,0 +1,131 @@ + + + + + + + Carousel ATC Setup — ProbeBasic documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/custom_ux_hacking.html b/custom_ux_hacking.html new file mode 100644 index 00000000..b55b2c03 --- /dev/null +++ b/custom_ux_hacking.html @@ -0,0 +1,181 @@ + + + + + + + Customisation with Python — ProbeBasic documentation + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Customisation with Python

+

It is possible to make a simple customisations to the user interface, like renaming a button, by overriding the main window provider in you custom_config.yml and a simple python class that extends ProbeBasic

+

These changes can be achieved with the standard instal of Probe Basic, no need for a Development install. Though you may need to dig into the probe_basic.ui file in Qt Designer to find the needed widget names (editvcp probe_basic).

+
+

Button Renaming Example

+

In the following python example the FLOOD button is rename to FOO and the MIST button is renamed to BAR

+_images/custom_ux_labels.png +

To try out the following yourself, save the python below to a file called custom_probebasic.py under your machine config directory (~/linuxcnc/configs/{my_machine}/custom_probebasic.py).

+
from probe_basic.probe_basic import ProbeBasic
+
+class CustomProbeBasic(ProbeBasic):
+    """Main window class for the ProbeBasic VCP.
+
+    save this file as `custom_probebasic.py` in you configs directory
+    then your custom_config.yml add the `provider:` line below to the `mainwidow: section`
+
+    ```
+    windows:
+      mainwindow:
+        provider: custom_probebasic:CustomProbeBasic
+        kwargs:
+          confirm_exit: false
+    ```
+
+    """
+    def __init__(self, *args, **kwargs):
+        super(CustomProbeBasic, self).__init__(*args, **kwargs)
+
+        # rename the Flood button
+        self.flood_button.setText("Foo")
+
+        # rename the Mist button
+        self.mist_button.setText("Bar")
+
+
+

Then edit the ~/linuxcnc/configs/{my_machine}/custom_config.yml file and add the line provider: custom_probebasic:CustomProbeBasic just under mainwindow:

+

Before:

+
windows:
+  mainwindow:
+    kwargs:
+      confirm_exit: false
+
+
+

After:

+
windows:
+  mainwindow:
+    provider: custom_probebasic:CustomProbeBasic
+    kwargs:
+      confirm_exit: false
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/dev_install.html b/dev_install.html new file mode 100644 index 00000000..8fe6c2bc --- /dev/null +++ b/dev_install.html @@ -0,0 +1,207 @@ + + + + + + + Probe Basic Development Installation — ProbeBasic documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Probe Basic Development Installation

+

This Dev install method uses an installer script and will install QtPyVCP and Probe Basic into a virtual environment (venv) which is now a requirement for pip installations on systems running python version 3.11 which is what comes on Linux Debian 12 Bookworm. This has been tested to work on a clean install of debian 12 bookworm using the xfce4 option and nonfree firmware cdnetinst iso. Download and install the bookworm iso from the link below for your pc type, typically the amd64 on normal pc’s:

+

https://www.debian.org/releases/bookworm/debian-installer/

+
+

Important

+

During Linux Bookworm installation, DO NOT set a root password when prompted, just press continue to move to the next section in the visual installer. Once installed, run all of your updating.

+
+
+

Installation Steps

+
+
    +
  1. Install linuxcnc from terminal using apt:

    +
    sudo apt install linuxcnc-uspace linuxcnc-uspace-dev mesaflash
    +
    +
    +
  2. +
  3. Next restart your computer

  4. +
  5. Ensure git is installed:

    +
    sudo apt install git
    +
    +
    +
  6. +
  7. Ensure zenity is installed:

    +
    sudo apt install zenity
    +
    +
    +
  8. +
  9. Create a directory and clone the repo to it. Either clone or download a zip file:

    +
    cd ~
    +mkdir dev
    +cd dev
    +git clone https://github.com/Lcvette/qtpyvcp-bookworm-installer.git
    +cd qtpyvcp-bookworm-installer
    +./install_for_qtpyvcp.sh
    +
    +
    +
  10. +
+
+
+
+

Getting Started with Probe Basic DEVELOPMENT

+
+

You should now see a series of icons on your desktop, 3 probe basic mill instances consisting of an inch/metric/atc sim and 1 lathe sim instance. There should also be 2 qtpyvcp icons, one for mill and one for lathe. These icons must be used to enter QTdesigner for your develpment work. To test your edits in QTdesigner you must use the desktop launcher icons provided to start and run your instance of probe basic sim. This is required due to python3 requiring to be run in a VENV (virtual environment). Do not use the application drop down to run linuxcnc or you will not see your changes from your dev efforts. The changes will be saved in the dev folder files. When you have completed your edits and wish to create a .deb build file, you can follow the instructions under creating a .deb installation file in the probe basic instruction docs. (coming soon).

+
+
+
+

Updating QtPyVCP and Probe Basic

+
+

To update QtPyVCP and Probe Basic, from terminal in the installer directory file, run the following script command:

+
./updater.sh
+
+
+
+
+
+

Uninstalling QtPyVCP and Probe Basic

+
+

To uninstall QtPyVCP and Probe Basic, delete the /home/(your_pc_name)/dev folder. Since this is a venv run in place install, it is removed once the directory is deleted.

+
+
+
+

Note

+
+

Files that must be executable:

+
    +
  • install_for_qtpyvcp.sh

  • +
  • sudo_helper.sh

  • +
  • updater.sh

  • +
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/development_quick_start_apt.html b/development_quick_start_apt.html new file mode 100644 index 00000000..713eb906 --- /dev/null +++ b/development_quick_start_apt.html @@ -0,0 +1,238 @@ + + + + + + + Probe Basic APT Develop Install — ProbeBasic documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Probe Basic APT Develop Install

+

Probe Basic APT Installation Guide for use with Debian 12 Bookworm and LinuxCNC version 2.9 or Later

+
+

Important Requirements

+
+
    +
  • Probe Basic is currently designed for 1920x1080 screen sizes only!

  • +
  • Probe Basic Install by apt is for amd64 only currently!

  • +
  • Probe Basic requires graphics hardware that supports OpenGL 3.2 and OpenGL Shading Language (GLSL) 1.50 or later

  • +
  • Probe Basic is tested on xfce4, during install of Debian 12 ISO:

  • +
  • DO NOT enter a Root password during installation, leave blank and skip this page.

  • +
+

During installation, this screen below will appear, be sure to uncheck gnome and check xfce as pictured below. No other changes on this page are needed.

+_images/xfce_check_doc.png +
+
+
+

Installation Steps

+
+

1. Download the Linux Debian 12 Bookworm ISO Image File

+
+

Download from: https://www.debian.org/download

+

Select the Linux Debian 12 Bookworm Netinst CD ISO from the above link. You will need to make a bootable DVD or USB thumb drive depending on how you plan to install. The below software is extremely easy and works flawlessly with Linux Debian OS images:

+

https://www.balena.io/etcher/?ref=etcher_update

+

Once you have created your flash stick for LinuxCNC, proceed to install and boot the system. (Note: It is advised to have an ethernet cable internet connection during install). Select the graphical installation option. Follow the steps on screen to complete installation. When you are greeted by the Linux Desktop Selection Page, uncheck the GNOME option and check the XFCE4 option.

+
+
+
+

2. Update the System

+
+

After installation, run the following commands in the main terminal:

+
sudo apt update
+sudo apt upgrade
+
+
+
+
+
+

3. Install LinuxCNC

+
+

If you have not already installed LinuxCNC from apt, use the following command:

+
sudo apt install linuxcnc-uspace linuxcnc-uspace-dev mesaflash
+
+
+

Once you have installed LinuxCNC, open it and start the axis sim briefly and then shut it down to ensure the installation was successful.

+
+
+
+

4. Add the APT Repository for the Installation type

+
+

AMD64 for PC Installation Repository:

+
+

Run the following commands in the main terminal one at a time:

+
sudo apt install curl
+echo 'deb [arch=amd64] https://repository.qtpyvcp.com/apt develop main' | sudo tee /etc/apt/sources.list.d/kcjengr.list
+curl -sS https://repository.qtpyvcp.com/repo/kcjengr.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/kcjengr.gpg
+gpg --keyserver keys.openpgp.org --recv-key 2DEC041F290DF85A
+
+
+
+

NEW - ARM64 Raspberry Pi 4 and 5 Installation Repository:

+
+

Run the following commands in the main terminal one at a time:

+
sudo apt install curl
+echo 'deb [arch=arm64] https://repository.qtpyvcp.com/apt develop main' | sudo tee /etc/apt/sources.list.d/kcjengr.list
+curl -sS https://repository.qtpyvcp.com/repo/kcjengr.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/kcjengr.gpg
+gpg --keyserver keys.openpgp.org --recv-key 2DEC041F290DF85A
+
+
+
+
+
+
+

5. Update the Repositories

+
+
sudo apt update
+
+
+
+
+
+

6. Install QtPyVCP and Probe Basic

+
+
sudo apt install python3-qtpyvcp
+sudo apt install python3-probe-basic
+
+
+

You are now installed! You should be able to launch the Probe Basic sim from within the LinuxCNC applications dropdown menu.

+
+
+
+
+

Updating and Configuration

+
+

Updating of Probe Basic and QtPyVCP will occur when you run the normal “sudo apt update, sudo apt upgrade” commands. During updating, the Probe Basic sim configuration files will be overwritten. It is strongly recommended to create your machine configuration files with unique names to avoid having them overwritten during updates.

+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 00000000..0c62ed7e --- /dev/null +++ b/genindex.html @@ -0,0 +1,125 @@ + + + + + + Index — ProbeBasic documentation + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2021, Chris Polanski.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..4977cb68 --- /dev/null +++ b/index.html @@ -0,0 +1,245 @@ + + + + + + + Probe Basic — ProbeBasic documentation + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + _images/icon.png +
+

Probe Basic

+

ProbeBasic is a QtPyVCP based user interface +for the LinuxCNC machine control.

+ + + + +
+
+

Indices and tables

+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/lathe_interface.html b/lathe_interface.html new file mode 100644 index 00000000..b212e1c5 --- /dev/null +++ b/lathe_interface.html @@ -0,0 +1,176 @@ + + + + + + + Probe Basic Lathe Interface — ProbeBasic documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Probe Basic Lathe Interface

+
+

Main

+_images/01_Main.png +
+
+

File

+_images/02_File.png +
+
+

Offsets

+_images/03_Offsets.png +
+
+

Touch Off

+_images/04_Touch_Off.png +
+
+

Tool Table

+_images/05_Tool_Table.png +
+
+

Probing

+_images/06_Probing.png +
+
+

Conversational

+_images/07_Conversational.png +
+
+

Settings

+_images/08_Settings.png +
+
+

Status

+_images/09_Settings.png +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/machine_config.html b/machine_config.html new file mode 100644 index 00000000..415f4f38 --- /dev/null +++ b/machine_config.html @@ -0,0 +1,319 @@ + + + + + + + Machine Configuration (INI, HAL, Files) — ProbeBasic documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Machine Configuration (INI, HAL, Files)

+
+

Creating a working Machine Configuration for Probe Basic

+
+

Probe Basic uses some different methods to offer its feature-rich user experience, which requires customized files and settings inside the HAL and INI files to function properly. Below is a guide to help create a working machine configuration for Probe Basic. This guide assumes a basic installation with manual tool changes. A future document will be available for more complex configurations with ATC and Coolant Cannon functionality.

+
+
+

Step 1: Create a basic configuration

+
+
    +
  1. Create a configuration for your machine using Pncconf or mesact/mesact2 from the LinuxCNC menu in the applications drop-down in the upper menu bar. In this example, we are using Pncconf.

  2. +
  3. It is recommended to use the Axis GUI display for this initial build.

  4. +
  5. Have your machine’s wiring schematic premade to make filling in the required information fast, easy, and accurate in Pncconf.

  6. +
  7. After completing the Pncconf configuration builder and creating a new machine configuration saved in the LinuxCNC config directory, start LinuxCNC using your new config to verify there are no errors.

  8. +
  9. Test the machine to verify the base functionality is correct (e.g., jogging, spindle function, axis motion).

  10. +
  11. Once completed and found to function correctly, proceed to step 2.

  12. +
+
+
+
+

Step 2: Copy required files

+
+
    +
  1. In the LinuxCNC config folder, locate your new config folder and the “probe_basic_machine_config_setup_files” folder.

  2. +
  3. Open two folder windows on the desktop: the new Pncconf folder created for your machine and the probe_basic_machine_config_setup_files folder.

  4. +
  5. Clean up the Pncconf folder by removing unneeded files (see images below for reference).

  6. +
  7. Copy the required files from the probe_basic_machine_config_setup_files folder to the Pncconf config folder.

  8. +
+

*the latest DEVELOP version requires the “user_buttons” folder to be copied over also (not shown in pics below)!*

+

As built pncconfig folder

+_images/pb_instruction_1.png +
+

+
+

Unneeded pncconfig files highlighted

+_images/pb_instruction_2.png +
+

+
+

Cleaned up pncconfig folder

+_images/pb_instruction_3.png +
+

+
+

Files to be Copied from probe_basic_machine_config_setup_files folder

+_images/pb_instruction_4.png +
+

+
+

Files Copied to pncconfig folder

+Files Copied to pncconfig folder +
+

+
+
+
+
+

Step 3: Edit INI files

+
+
    +
  1. Open the Pncconf “my_LinuxCNC_machine.ini” file side by side with the supplied “probe_basic_required_ini_items.ini” file in a text editor.

  2. +
  3. Integrate the lines from “probe_basic_required_ini_items.ini” into your existing file: +- If a line is present in your machine file, use the Probe Basic settings for that line. +- If a line is not in your machine file, copy it to the appropriate section in “my_LinuxCNC_machine.ini”.

  4. +
  5. Note that only ONE postgui HAL file can be called. Add any additional items to the existing probe_basic_postgui.hal file.

  6. +
  7. Save the file and delete the “probe_basic_required_ini_items.ini” file from the folder.

  8. +
+

Required ini file items for Probe Basic

+
+
[DISPLAY]
+DISPLAY = probe_basic
+OPEN_FILE = ~/linuxcnc/nc_files/pb_examples/blank.ngc
+CONFIG_FILE = custom_config.yml
+MAX_FEED_OVERRIDE = 2.000000            # Recommended Setting for Probe Basic
+MAX_SPINDLE_OVERRIDE = 2.000000         # Recommended Setting for Probe Basic
+MIN_SPINDLE_OVERRIDE = 0.500000         # Recommended Setting for Probe Basic
+INCREMENTS = JOG .01in .001in .0001in   # REQUIRED Setting for Probe Basic
+USER_TABS_PATH = user_tabs/             # REQUIRED Setting for Probe Basic
+USER_BUTTONS_PATH = user_buttons/       # REQUIRED Setting for Probe Basic
+
+[RS274NGC]
+RS274NGC_STARTUP_CODE = F10 S300 G20 G17 G40 G49 G54 G64 P0.001 G80 G90 G91.1 G92.1 G94 G97 G98
+PARAMETER_FILE = linuxcnc.var
+OWORD_NARGS = 1
+NO_DOWNCASE_OWORD = 1
+SUBROUTINE_PATH = subroutines
+
+[HAL]
+POSTGUI_HALFILE = hallib/probe_basic_postgui.hal
+TWOPASS = on
+
+
+
+

+
+
+_images/pb_instruction_7.png +
+

+
+
+
+
+

Step 4: Modify Post Gui Hal Files

+
+

Modify the following lines by commenting them out, they are used for testing in probe basic sim only and will error in the real machine configs. the spindle feedback line can be used if it is setup in the main hal and the hardware is on the machine to provide a spindle speed input to linuxcnc.

+
loadrt time
+loadrt not
+
+addf time.0 servo-thread
+addf not.0 servo-thread
+net prog-running not.0.in <= halui.program.is-idle
+net prog-paused halui.program.is-paused => time.0.pause
+net cycle-timer time.0.start <= not.0.out
+net cycle-seconds qtpyvcp.timerseconds.in <= time.0.seconds
+net cycle-minutes qtpyvcp.timerminutes.in <= time.0.minutes
+net cycle-hours qtpyvcp.timerhours.in <= time.0.hours
+# *** Time items required for Probe Basic to run ***
+
+#  ---manual tool change signals---
+net tool-change-request     =>  qtpyvcp_manualtoolchange.change
+net tool-change-confirmed   <=  qtpyvcp_manualtoolchange.changed
+net tool-number             =>  qtpyvcp_manualtoolchange.number
+
+# *** Probe graphic simulation trigger push probe tip ***
+# net probe-in  =>  qtpyvcp.probe-in.out     <----comment this line out>
+net probe-in  <=  qtpyvcp.probe-led.on
+
+# *** Set line below for actual spindle readout from your hal file ***
+# net spindle-rpm-filtered scale_to_rpm.out  =>  qtpyvcp.spindle-encoder-rpm.in   <----comment this line out>
+
+
+
+
+
+

Step 5: Modify HAL file

+
+
    +
  1. Add digital and analog IO to the HAL file by modifying the following line:

    +
    loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS
    +
    +
    +

    Add this to the end of the line:

    +
    num_dio=6 num_aio=3
    +
    +
    +

    The finished edit should look like this:

    +
    loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS num_dio=6 num_aio=3
    +
    +
    +
  2. +
+HAL file modification +
+

+
+
    +
  1. Remove the red highlighted manual tool change dialog section from the bottom of the hal file as shown in the image below. Probe basic uses its own built in dialog for manual tool changes which give the user better tool information and matches the ui visual theme more appropriately.

  2. +
+Tool change section to remove +
+

+
+
+
+
+
+

Launching Probe Basic

+
+
    +
  1. Under the CNC section of the drop-down applications menu, find your machine configuration and select it to launch.

  2. +
  3. Check the box at the bottom of the launch window to create a desktop icon for easier starts.

  4. +
  5. To set the Probe Basic icon: +- Right-click the desktop launcher and select “edit launcher” +- Click the current icon image, this will open the icon folder +- Find and select the icon named “probe_basic_mill”

  6. +
+

You should now be ready to use Probe Basic with your machine configuration.

+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/mill_interface.html b/mill_interface.html new file mode 100644 index 00000000..79d3ba8b --- /dev/null +++ b/mill_interface.html @@ -0,0 +1,210 @@ + + + + + + + Probe Basic Mill Interface — ProbeBasic documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Probe Basic Mill Interface

+
+

Main

+
+

GCODE

+_images/01_Main1.png +
+
+

MDI

+_images/01_Main_MDI.png +
+
+
+

File

+_images/02_File1.png +
+
+

ATC

+_images/03_ATC.png +
+
+

Tool

+_images/04_Tool.png +
+
+

Offsets

+_images/05_Offsets.png +
+
+

Probing

+_images/06_Probing1.png +

Probing Help

+
+
+

Conversational

+
+

Facing

+_images/07_Conversational_Facing.png +
+
+

Holes

+
+

Pattern

+_images/07_Conversational_Hole_Ops_Pattern.png +
+
+

XY Coord

+_images/07_Conversational_Hole_Ops_XY_Coord.png +
+
+
+
+

Settings

+_images/08_Settings1.png +
+
+

Status

+_images/09_Status.png +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 00000000..b2978311 Binary files /dev/null and b/objects.inv differ diff --git a/probe_basic_parameters.html b/probe_basic_parameters.html new file mode 100644 index 00000000..e868d57f --- /dev/null +++ b/probe_basic_parameters.html @@ -0,0 +1,150 @@ + + + + + + + Probe Basic Parameters — ProbeBasic documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Probe Basic Parameters

+

Probe basic requires the following parameters be created in the var file

+
+

Probe Basic’s devlop version is now using the var file in the configs folder for storing parameters used in subroutines and other functions throughout linuxcnc. These are callable the same as all other parameters which allows them to be used in remap subroutines. This will allow users a greater degree of flexibility in modifying and using features such as tool touch off during tool changes, programmable coolant, probing etc all while being able to make changes from the from within the probe basic user interfaces entry boxes. Once changes to the entries are made they are recorded to the var file and are available immediately after the changes are made. This allows users the ability to change vital settings to ensure their machines run optimally and reliably without major config modifications.

+

The Probe Basic Sim Config Folder contains the sim.var file which has been updated with these now required parameters. please be sure to add them to your machine connfiguration for proper functionality.

+
+_images/params_programmable_coolant.png +
+

+
+_images/params_tool_setter.png +
+

+
+_images/params_touch_probe.png +
+

+
+_images/params_atc.png +
+

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/probing.html b/probing.html new file mode 100644 index 00000000..7be0116a --- /dev/null +++ b/probing.html @@ -0,0 +1,362 @@ + + + + + + + Probing — ProbeBasic documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Probing

+

Probe Basic has a number of included probing routines.

+_images/06_Probing1.png +
+

+
+
+

Probing Setup

+
+
    +
  1. To begin probing, you first need to make sure you have connected motion.probe-input in your HAL file.

  2. +
  3. Next, add an entry in your Tool Table for the probe, including the tip diameter. The default recommended tool number is 99. (Finding the probe tool length offset will be covered below)

  4. +
  5. Enter the Probing Parameters on the Probing Page. A description for these can be found on the probing help tab or below in the docs.

  6. +
  7. Setting the touch probe tool length offset. The way I prefer to find the touch probe tool length offset is as follows:

    +
      +
    1. Use a facemill and measure the tool length of the facemill either by the tool setter or with a manual tool setter.

    2. +
    3. Once the facemill tool data is measured, entered, and stored in the tool table, load it in the spindle with the LOAD TOOL feature on the tooling page.

    4. +
    5. Mount a piece of scrap stock in the machine vise or on the table where it can be faced.

    6. +
    7. Face the stock to have a true flat surface. Do not move the z axis once faced.

    8. +
    9. Press the ZERO Z button in the DRO section of the interface. This will record the z work offset with the facemill’s tool length offset applied. Move the spindle to a safe distance to remove the tool.

    10. +
    11. Use the UNLOAD SPINDLE button on the tooling page and remove the facemill from the spindle.

    12. +
    13. Load the probe tool in the spindle. Make sure the tool length offset in the tool table is set to 0.0000.

    14. +
    15. Ensure all of the probe parameters have been set correctly, and move the probe over the faced surface of the stock.

    16. +
    17. Use the “PROBE POSITION ONLY” button on the probe page. This will find the surface without resetting the offset.

    18. +
    19. Press the Probe Z button on the probing page to probe the faced surface of the stock. The probed result for Z- PROBED will be the tool length offset for the touch probe. The number used will be absolute, no +/- sign entered as all tool length offsets are relative to the spindle nose gage line.

    20. +
    21. Enter the absolute value in the probe tool length offset in the tool table, save and reload the tool table.

    22. +
    23. Verify the tool length offset is correct by loading the probe tool using the LOAD SPINDLE button and probing the face of the stock again.

    24. +
    25. The Z- PROBED result should show a probed position of 0.0000. This verifies that the probed surface from the facemill and the probed point are the same with tool length offsets applied, which is what we want.

    26. +
    +
  8. +
  9. Now that the probe has been set up in software and in the tool table, we need to calibrate it for the most accurate results. This will be covered in the calibration section below.

  10. +
+
+
+
+

Calibrating your Touch Probe

+
+

Probe Basic has a built-in probe calibration feature function which makes the calibration and calculations painless. Requirements are a precision gage pin or gage ring of known size mounted securely to the table.

+

The software calibration assumes that you have mechanically zeroed the probe’s stylus tip in the spindle and it has a TIR that meets your tolerance requirements. Ideally, 0.0000 TIR is the goal, but this may not always be possible.

+

As most probes require a small deflection of the tip before tripping, PROBE CALIBRATION OFFSET is used to account for this and can be set using these calibration routines and an accurately measured standard gauge.

+
+

Tip

+

Calibration video from Lcvette https://youtu.be/Qr9L6dyXf2A

+
+
    +
  1. Select the CALIBRATE tab in Probe Basic.

  2. +
  3. Enter the gage ring or gauge pin diameter in the CALIBRATION DIAMETER dialog box.

  4. +
  5. Move the probe over the gage pin or gage ring as shown in the probe button graphic for which type is being used. The starting position for the probe routine should match the pink tip in the graphic. The probe should be slightly above the gage object as a z minus move is the first move.

  6. +
  7. Select the appropriate probing button that corresponds to your gage ring or pin and press it.

  8. +
  9. The probe routine should complete and afterwards will populate the PROBE CALIBRATION OFFSET box. This value will be used to account for the probe’s trigger distance.

  10. +
  11. Important notes: the probe feedrates will directly affect the trigger distance and the same feedrates used during calibration should be used in all subsequent probing.

  12. +
  13. Move the probe to the previous starting position, and press the PROBE POSITION ONLY button.

  14. +
  15. Select the BOSS AND POCKET probe tab.

  16. +
  17. Select the same probe routine type for boss or pocket that was used in the calibration routine, and press it.

  18. +
  19. The results should show a diameter that now matches the gage ring or within the tolerance that the machine is capable of probing.

  20. +
  21. If the results do not match the gage ring known diameter, you can verify the stylus ball diameter is correct in the tool table, and try changing the speeds at which you probe. Then rerun the calibration routine above until your results are acceptable for your needs.

  22. +
+
+
+
+

Work Offsets

+
+
_images/probe_00_work_offsets.png +
+

+
+

This area allows you to select a Workpiece Coordinate Offset (WCO) and if it is to be updated as a result of probing.

+
+
G5x:

Set the active Workpiece Coordinate Offset, which may be updated.

+
+
PROBE POSITION ONLY:

This button when active (BLUE) will NOT set the currently active work offset to zero when a probe event occurs. It will record the probed positions and calculate Diameter, and X Y probe widths along with the Z position probed. This is useful for measuring or reverse engineering objects by using the probe tool.

+

When not active, all probe events will set the currently active work offset to zero for each probed axis position recorded. The inactive mode should be used for setting work coordinates to zero for stock or part programs.

+
+
+
+
+
+

Parameters

+
+
_images/probe_00_parameters.png +
+

+
+
    +
  • +
    PROBE TOOL#:

    This should be set to match the probe entry in your tool table.

    +
    +
    +
  • +
  • +
    STEP OFF WIDTH:

    How far the probe will travel in either X or Y before moving down a side.

    +
    +
    +
  • +
  • +
    PROBE FAST FDRATE:

    Fast feed rate, for first touch when probing.

    +
    +
    +
  • +
  • +
    PROBE SLOW FDRATE:

    Slow feed rate for second touch when probing. If set to 0 (zero) a second touch will not be performed and the result from the fast probe is used.

    +
    +
    +
  • +
  • +
    PROBE TRAVERSE FDRATE:

    This is the speed at which non-probing motion will move at such as traversing the top of a workpiece or repositioning for a subsequent probe event.

    +
    +
    +
  • +
  • +
    MAX X/Y DISTANCE:

    Maximum distance to travel in either X or Y before tripping out.

    +
    +
    +
  • +
  • +
    X/Y CLEARANCE:

    Retract distance for X and Y probing after touch, this should be at least larger than any backlash in the axis.

    +
    +
    +
  • +
  • +
    MAX Z DISTANCE:

    Maximum distance to travel in Z before tripping out.

    +
    +
    +
  • +
  • +
    Z CLEARANCE:

    Retract distance for Z probing after touch, this should be at least larger than any backlash in the axis.

    +
    +
    +
  • +
  • +
    EXTRA PROBE DEPTH:

    Extra distance to move down a side (after probe diameter) before probing in X or Y.

    +
    +
    +
  • +
  • +
    EDGE WIDTH:

    Distance between test points when probing for Edge Angle’s.

    +
    +
    +
  • +
+
+
+
+

Probe Results

+
+
_images/probe_00_results_1.png +
+

+
+

This shows the results from the last probing run. There are reset buttons to clear the data if needed.

+
+
+
+

Probing Routines

+
+

The purple dot in each button shows the position at which your probe tip should be approximately placed before starting the probe run. +The Z height above the workpiece should be no more than your “MAX Z DISTANCE” parameter.

+_images/probe_01_outside_corners.png +
+

+
+_images/probe_02_inside_corners.png +
+

+
+_images/probe_03_boss_and_pocket.png +
+

+
+_images/probe_04_ridge_and_valley.png +
+

+
+_images/probe_05_edge_angle.png +
+

+
+_images/probe_06_rotary_axis.png +
+

+
+_images/probe_07_calibrate.png +
+

+
+
+
+
+

Help

+
+
_images/probe_08_probe_help.png +
+

+
+

Included here for offline reference, though a running PB instance may have more up-to-date help.

+_images/probe_help_01_step_off_width.png +
+

+
+_images/probe_help_02_extra_probe_depth.png +
+

+
+_images/probe_help_03_max_z_distance.png +
+

+
+_images/probe_help_04_max_xy_distance.png +
+

+
+_images/probe_help_05_z_clearance.png +
+

+
+_images/probe_help_06_xz_clearance.png +
+

+
+_images/probe_help_07_hint.png +
+

+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/quick_start.html b/quick_start.html new file mode 100644 index 00000000..1af9acd7 --- /dev/null +++ b/quick_start.html @@ -0,0 +1,239 @@ + + + + + + + Probe Basic .deb Install — ProbeBasic documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Probe Basic .deb Install

+

Probe Basic .deb Installation Guide for use with Debian Bookworm and LinuxCNC version 2.9 or Later

+
+

Important Requirements

+
+
    +
  • Probe Basic is currently designed for 1920x1080 screen sizes only!

  • +
  • Probe Basic Install by apt is for amd64 only currently!

  • +
  • Probe Basic requires graphics hardware that supports OpenGL 3.2 and OpenGL Shading Language (GLSL) 1.50 or later

  • +
  • Probe Basic is tested on xfce4, during install of Debian 12 ISO:

  • +
  • DO NOT enter a Root password during installation, leave blank and skip this page.

  • +
+

During installation, this screen below will appear, be sure to uncheck gnome and check xfce as pictured below. No other changes on this page are needed.

+_images/xfce_check_doc.png +
+

+
+
+
+
+

Download the Linux Debian 12 Bookworm ISO Image File

+
+

Download from: https://www.debian.org/download

+

Select the Linux Debian 12 Bookworm Netinst CD ISO from the above link. You will need to make a bootable DVD or USB thumb drive depending on how you plan to install. The software below is extremely easy and works flawlessly with Linux Debian OS images:

+

https://www.balena.io/etcher/?ref=etcher_update

+

We recommend using a 2-4GB USB drive for quicker flashing.

+
+
+
+

Installation Steps

+
+
    +
  1. Create your flash stick for LinuxCNC and proceed to install and boot the system. (Note: It is advised to have an ethernet cable internet connection during install).

  2. +
  3. Select the graphical installation option.

  4. +
  5. Follow the steps on screen to complete installation.

  6. +
  7. When you reach the Linux Desktop Selection Page, uncheck the GNOME option and check the XFCE4 option.

  8. +
  9. After installation, open the main terminal and run the following commands:

    +
    sudo apt update
    +sudo apt upgrade
    +
    +
    +
  10. +
+
+
+
+

Installing Probe Basic

+
+

Requirements:

+
    +
  • Debian 12 Bookworm

  • +
  • Python 3.11

  • +
  • LinuxCNC 2.9 or higher

  • +
  • xfce4 desktop environment

  • +
  • OpenGL 1.50 or Later graphics support

  • +
  • QtPyVCP

  • +
  • hiyapyco

  • +
+

If you haven’t installed LinuxCNC, use the following command:

+
sudo apt install linuxcnc-uspace linuxcnc-uspace-dev mesaflash
+
+
+

After installation, open LinuxCNC and start the axis sim briefly to ensure successful installation.

+

Download the following files:

+
https://repository.qtpyvcp.com/repo/probe-basic-dev/python3-probe-basic_0.6.0-7.dev_all.deb
+
+https://repository.qtpyvcp.com/repo/qtpyvcp-dev/python3-qtpyvcp_4.1.2-56.dev_all.deb
+
+https://repository.qtpyvcp.com/repo/hiyapyco/python3-hiyapyco_0.5.1-1_all.deb
+
+
+
+

Installation Commands

+
+

Navigate to the download directory, right-click, and select “Open Terminal Here”. Run the following commands:

+
sudo apt install debhelper-compat dh-python python3-setuptools python3-yaml python3-pyqt5.qtmultimedia python3-pyqt5.qtquick qml-module-qtquick-controls libqt5multimedia5-plugins python3-dev python3-docopt python3-qtpy python3-pyudev python3-psutil python3-markupsafe python3-vtk9 python3-pyqtgraph python3-simpleeval python3-jinja2 python3-deepdiff python3-sqlalchemy qttools5-dev-tools python3-serial
+
+
+
sudo dpkg -i python3-hiyapyco_0.5.1-1_all.deb
+
+
+
sudo dpkg -i python3-qtpyvcp_4.1.2-56.dev_all.deb
+
sudo dpkg -i python3-probe-basic_0.6.0-7.dev_all.deb
+

You should now be able to launch the Probe Basic sim from within the LinuxCNC applications dropdown menu.

+

Note: When updating/installing the latest .deb files, the Probe Basic sim configuration files will be overwritten. It is strongly recommended to create your machine configuration files with unique names to avoid having them overwritten during updates.

+

To build your own machine configuration, please follow the instructions in this document: +https://forum.linuxcnc.org/qtpyvcp/48401-configuration-file-conversion-doc-for-probe-basic-py3

+
+
+
+

Uninstallation

+
+

To uninstall, enter the following commands in the main terminal:

+
sudo dpkg -P python3-probe-basic
+sudo dpkg -P python3-hiyapyco
+sudo dpkg -P python3-qtpyvcp
+
+
+
+

+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 00000000..c83374a3 --- /dev/null +++ b/search.html @@ -0,0 +1,140 @@ + + + + + + Search — ProbeBasic documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2021, Chris Polanski.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 00000000..e117d51d --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["atc_setup", "custom_ux_hacking", "dev_install", "development_quick_start_apt", "index", "lathe_interface", "machine_config", "mill_interface", "probe_basic_parameters", "probing", "quick_start", "stable_develop_branch_change", "stable_quick_start_apt", "tool_length_setter", "user_tabs"], "filenames": ["atc_setup.rst", "custom_ux_hacking.rst", "dev_install.rst", "development_quick_start_apt.rst", "index.rst", "lathe_interface.rst", "machine_config.rst", "mill_interface.rst", "probe_basic_parameters.rst", "probing.rst", "quick_start.rst", "stable_develop_branch_change.rst", "stable_quick_start_apt.rst", "tool_length_setter.rst", "user_tabs.rst"], "titles": ["Carousel ATC Setup", "Customisation with Python", "Probe Basic Development Installation", "Probe Basic APT Develop Install", "Probe Basic", "Probe Basic Lathe Interface", "Machine Configuration (INI, HAL, Files)", "Probe Basic Mill Interface", "Probe Basic Parameters", "Probing", "Probe Basic .deb Install", "Changing Stable <-> Develop Versions", "Probe Basic APT Stable Install", "Tool Length Setter", "User Tabs"], "terms": {"todo": [0, 14], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "6": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 14], "7": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14], "g6efe18": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "python3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "qtpyvcp_4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "1": [0, 1, 2, 4, 5, 7, 8, 9, 10, 13, 14], "2": [0, 1, 2, 4, 5, 7, 8, 9, 10, 13, 14], "56": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "dev_al": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "deb": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14], "http": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "repositori": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 14], "qtpyvcp": [0, 1, 4, 5, 6, 7, 8, 9, 10, 13, 14], "com": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "repo": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "dev": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "probe": [0, 1, 13, 14], "basic_0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "basic": [0, 1, 9, 13, 14], "It": [1, 3, 6, 9, 10, 12], "i": [1, 2, 3, 4, 6, 8, 9, 10, 12, 13], "possibl": [1, 9], "make": [1, 3, 6, 8, 9, 10, 11, 12], "simpl": 1, "user": [1, 4, 6, 8, 11, 13], "interfac": [1, 8, 9, 13], "like": [1, 6, 11], "overrid": 1, "main": [1, 3, 4, 6, 10, 11, 12, 13], "window": [1, 6], "provid": [1, 2, 6], "you": [1, 2, 3, 6, 9, 10, 11, 12, 13], "custom_config": [1, 6], "yml": [1, 6], "class": 1, "extend": 1, "probebas": [1, 4], "These": [1, 2, 8, 11], "chang": [1, 2, 3, 4, 6, 8, 9, 10, 12], "can": [1, 2, 6, 9, 11, 13], "achiev": 1, "standard": [1, 9], "instal": [1, 6], "need": [1, 3, 9, 10, 12, 13], "develop": [1, 4, 6], "though": [1, 9], "mai": [1, 9, 11], "dig": 1, "probe_bas": [1, 6, 14], "ui": [1, 6], "file": [1, 2, 4, 8, 9, 11, 13], "qt": 1, "design": [1, 3, 10, 12], "find": [1, 6, 9, 13], "widget": 1, "name": [1, 3, 6, 10, 12], "editvcp": 1, "In": [1, 6, 13], "follow": [1, 2, 3, 6, 8, 9, 10, 11, 12, 13], "flood": 1, "foo": 1, "mist": 1, "bar": [1, 6], "To": [1, 2, 6, 9, 10, 13], "try": [1, 9], "out": [1, 6, 9], "yourself": 1, "save": [1, 2, 6, 9], "below": [1, 2, 3, 6, 9, 10, 12, 13], "call": [1, 6], "custom_probebas": 1, "py": 1, "under": [1, 2, 6, 13], "your": [1, 2, 3, 4, 6, 8, 10, 11, 12, 13], "machin": [1, 3, 4, 8, 9, 10, 12, 13], "config": [1, 6, 8, 11], "directori": [1, 2, 6, 10], "linuxcnc": [1, 2, 4, 6, 8, 10, 11], "my_machin": 1, "from": [1, 2, 3, 6, 8, 9, 10, 11, 12, 13], "import": [1, 4, 9], "customprobebas": 1, "vcp": 1, "thi": [1, 2, 3, 6, 8, 9, 10, 12, 13], "add": [1, 6, 8, 9, 13], "line": [1, 6, 9, 11], "mainwidow": 1, "section": [1, 2, 6, 9, 11, 13], "mainwindow": 1, "kwarg": 1, "confirm_exit": 1, "fals": 1, "def": 1, "__init__": 1, "self": 1, "arg": 1, "super": 1, "flood_button": 1, "settext": 1, "mist_button": 1, "Then": [1, 9], "edit": [1, 2], "just": [1, 2], "befor": [1, 9], "after": [1, 3, 6, 8, 9, 10, 12], "method": [2, 6], "us": [2, 3, 6, 8, 9, 10, 11, 12, 13], "an": [2, 3, 9, 10, 12, 13], "script": 2, "virtual": 2, "environ": [2, 10, 11], "venv": 2, "which": [2, 6, 8, 9, 11], "now": [2, 3, 6, 8, 9, 10, 11, 12, 13], "requir": [2, 4, 8, 9, 11, 13], "pip": 2, "system": [2, 10], "run": [2, 3, 6, 8, 9, 10, 11, 12], "python": [2, 4, 10, 11], "version": [2, 3, 4, 6, 8, 10, 12], "3": [2, 10, 13], "11": [2, 10], "what": [2, 9], "come": 2, "linux": [2, 4], "debian": [2, 4], "12": [2, 4], "bookworm": [2, 4], "ha": [2, 8, 9, 11], "been": [2, 8, 9], "test": [2, 3, 6, 9, 10, 11, 12, 13], "work": [2, 3, 4, 10, 12], "clean": [2, 6], "xfce4": [2, 3, 10, 12], "option": [2, 3, 10, 12], "nonfre": 2, "firmwar": 2, "cdnetinst": 2, "iso": [2, 4], "download": [2, 4], "link": [2, 3, 10, 12], "pc": [2, 3, 12], "type": [2, 9, 11, 13], "typic": 2, "amd64": [2, 3, 10, 12], "normal": [2, 3, 12], "": [2, 6, 8, 9], "www": [2, 3, 10, 12], "org": [2, 3, 10, 11, 12], "releas": 2, "dure": [2, 3, 8, 9, 10, 11, 12], "do": [2, 3, 9, 10, 12], "NOT": [2, 3, 9, 10, 12], "set": [2, 4, 6, 8, 9, 11], "root": [2, 3, 10, 12], "password": [2, 3, 10, 11, 12], "when": [2, 3, 9, 10, 11, 12, 13], "prompt": [2, 11], "press": [2, 9, 11, 13], "continu": 2, "move": [2, 9, 13], "next": [2, 9, 13], "visual": [2, 6, 13], "onc": [2, 3, 6, 8, 9, 12], "all": [2, 8, 9, 13], "termin": [2, 3, 10, 11, 12], "apt": [2, 4, 10], "sudo": [2, 3, 10, 11, 12], "uspac": [2, 3, 10, 12], "mesaflash": [2, 3, 10, 12], "restart": 2, "comput": 2, "ensur": [2, 3, 8, 9, 10, 12], "git": [2, 11], "zeniti": 2, "creat": [2, 3, 4, 8, 10, 12, 13], "clone": 2, "either": [2, 9, 11], "zip": 2, "cd": [2, 3, 10, 12], "mkdir": 2, "github": [2, 14], "lcvett": [2, 9], "install_for_qtpyvcp": 2, "sh": 2, "should": [2, 3, 6, 9, 10, 11, 12, 13], "see": [2, 6], "seri": 2, "icon": [2, 6], "desktop": [2, 3, 6, 10, 12], "mill": [2, 4], "instanc": [2, 9], "consist": 2, "inch": 2, "metric": 2, "atc": [2, 4, 6], "sim": [2, 3, 6, 8, 10, 12], "lath": [2, 4], "There": [2, 9], "also": [2, 6, 13], "one": [2, 3, 11, 12], "must": [2, 11], "enter": [2, 3, 9, 10, 11, 12, 13], "qtdesign": 2, "develp": 2, "launcher": [2, 6], "due": 2, "applic": [2, 3, 6, 10, 12], "drop": [2, 6], "down": [2, 3, 6, 9, 12], "effort": 2, "The": [2, 3, 6, 8, 9, 10, 11, 12, 13], "folder": [2, 6, 8, 13], "have": [2, 3, 6, 9, 10, 12, 13], "complet": [2, 3, 6, 9, 10, 12], "wish": [2, 11], "build": [2, 6, 10], "instruct": [2, 10, 13], "doc": [2, 9, 10], "soon": 2, "command": [2, 3, 4, 11, 12], "delet": [2, 6], "home": [2, 13], "your_pc_nam": 2, "sinc": 2, "place": [2, 9, 13], "remov": [2, 6, 9], "execut": 2, "sudo_help": 2, "guid": [3, 4, 6, 10, 12], "9": [3, 10, 12], "later": [3, 10, 12], "current": [3, 6, 9, 10, 12, 13], "1920x1080": [3, 10, 12], "screen": [3, 10, 12], "size": [3, 9, 10, 12], "onli": [3, 6, 9, 10, 11, 12, 13], "graphic": [3, 6, 9, 10, 12, 13], "hardwar": [3, 6, 10, 12, 13], "support": [3, 4, 10, 12], "opengl": [3, 10, 12], "shade": [3, 10, 12], "languag": [3, 10, 12], "glsl": [3, 10, 12], "50": [3, 10, 12], "leav": [3, 10, 12], "blank": [3, 6, 10, 12], "skip": [3, 10, 12], "page": [3, 4, 9, 10, 12, 13], "appear": [3, 10, 12], "sure": [3, 8, 9, 10, 11, 12, 13], "uncheck": [3, 10, 12], "gnome": [3, 10, 12], "check": [3, 6, 10, 12], "xfce": [3, 10, 12], "pictur": [3, 10, 12], "No": [3, 10, 12], "other": [3, 8, 10, 11, 12], "ar": [3, 6, 8, 9, 10, 11, 12, 13], "select": [3, 6, 9, 10, 11, 12, 13], "netinst": [3, 10, 12], "abov": [3, 9, 10, 12], "bootabl": [3, 10, 12], "dvd": [3, 10, 12], "usb": [3, 10, 12], "thumb": [3, 10, 12], "drive": [3, 10, 12], "depend": [3, 10, 12], "how": [3, 9, 10, 12], "plan": [3, 10, 12], "softwar": [3, 9, 10, 12], "extrem": [3, 10, 12], "easi": [3, 6, 10, 12], "flawlessli": [3, 10, 12], "o": [3, 10, 12], "balena": [3, 10, 12], "io": [3, 6, 10, 12], "etcher": [3, 10, 12], "ref": [3, 10, 12], "etcher_upd": [3, 10, 12], "flash": [3, 10, 12], "stick": [3, 10, 12], "proce": [3, 6, 10, 12, 13], "boot": [3, 10, 12], "note": [3, 4, 6, 9, 10, 12], "advis": [3, 10, 12], "ethernet": [3, 10, 12], "cabl": [3, 10, 12], "internet": [3, 10, 12], "connect": [3, 9, 10, 12], "greet": [3, 12], "upgrad": [3, 10, 12], "If": [3, 6, 9, 10, 11], "alreadi": 3, "open": [3, 6, 10, 12], "start": [3, 4, 6, 9, 10, 12], "axi": [3, 6, 9, 10, 12, 13], "briefli": [3, 10, 12], "shut": [3, 12], "wa": [3, 9, 12, 13], "success": [3, 10, 12], "time": [3, 6, 11, 12], "curl": [3, 12], "echo": [3, 12], "arch": [3, 12], "tee": [3, 12], "etc": [3, 8, 11, 12, 13], "sourc": [3, 4, 12], "list": [3, 4, 12], "d": [3, 11, 12], "kcjengr": [3, 11, 12, 14], "ss": [3, 12], "kei": [3, 12], "gpg": [3, 12], "dearmor": [3, 12], "trust": [3, 12], "keyserv": [3, 12], "openpgp": [3, 12], "recv": [3, 12], "2dec041f290df85a": [3, 12], "new": [3, 6, 11, 13], "arm64": [3, 12], "raspberri": [3, 12], "pi": [3, 12], "abl": [3, 8, 10, 12, 13], "launch": [3, 4, 10, 12], "within": [3, 8, 9, 10, 12, 13], "dropdown": [3, 10, 12], "menu": [3, 6, 10, 12], "occur": [3, 9, 12], "overwritten": [3, 10, 12], "strongli": [3, 10, 12], "recommend": [3, 6, 9, 10, 12], "uniqu": [3, 10, 12], "avoid": [3, 10, 12], "them": [3, 6, 8, 10, 11, 12], "base": [4, 6], "control": [4, 10, 13], "stabl": 4, "step": [4, 9], "updat": [4, 8, 9, 10, 13], "inform": [4, 6, 13], "troubleshoot": 4, "imag": [4, 6, 13], "uninstal": 4, "get": 4, "paramet": 4, "ini": [4, 11], "hal": [4, 9, 11], "carousel": 4, "setup": [4, 6, 13], "tool": [4, 6, 8, 9, 10], "offset": [4, 13], "convers": [4, 10], "statu": 4, "touch": [4, 8], "off": [4, 8, 9], "calibr": 4, "result": 4, "routin": [4, 13], "help": [4, 6, 7], "length": [4, 9], "setter": [4, 9], "posit": [4, 9], "measur": [4, 9], "tab": [4, 9, 13], "customis": 4, "button": [4, 9, 13], "renam": 4, "exampl": [4, 6], "index": 4, "modul": [4, 10], "search": 4, "some": 6, "differ": 6, "offer": 6, "its": 6, "featur": [6, 8, 9, 11, 13], "rich": 6, "experi": 6, "custom": 6, "insid": 6, "function": [6, 8, 9, 13], "properli": 6, "assum": [6, 9], "manual": [6, 9], "A": [6, 9], "futur": 6, "document": [6, 10, 11], "avail": [6, 8], "more": [6, 9], "complex": 6, "coolant": [6, 8], "cannon": 6, "pncconf": 6, "mesact": 6, "mesact2": 6, "upper": 6, "we": [6, 9, 10, 11, 13], "displai": 6, "initi": [6, 13], "wire": 6, "schemat": 6, "premad": 6, "fill": 6, "fast": [6, 9, 13], "accur": [6, 9], "builder": 6, "verifi": [6, 9], "error": 6, "correct": [6, 9], "e": 6, "g": 6, "jog": [6, 13], "spindl": [6, 9, 13], "motion": [6, 9], "found": [6, 9], "correctli": [6, 9], "locat": [6, 13], "probe_basic_machine_config_setup_fil": 6, "two": 6, "up": [6, 9], "unneed": 6, "refer": [6, 9, 13], "latest": [6, 10], "user_button": 6, "over": [6, 9, 13], "shown": [6, 9], "pic": 6, "As": [6, 9, 11], "built": [6, 9], "pncconfig": 6, "highlight": 6, "my_linuxcnc_machin": 6, "side": [6, 9], "suppli": 6, "probe_basic_required_ini_item": 6, "text": 6, "editor": 6, "integr": 6, "exist": 6, "present": 6, "appropri": [6, 9], "ONE": 6, "postgui": 6, "ani": [6, 9, 11], "addit": [6, 11], "item": 6, "probe_basic_postgui": 6, "open_fil": 6, "nc_file": 6, "pb_exampl": 6, "ngc": [6, 13], "config_fil": 6, "max_feed_overrid": 6, "000000": 6, "max_spindle_overrid": 6, "min_spindle_overrid": 6, "500000": 6, "increment": 6, "01in": 6, "001in": 6, "0001in": 6, "user_tabs_path": 6, "user_tab": 6, "user_buttons_path": 6, "rs274ngc": 6, "rs274ngc_startup_cod": 6, "f10": 6, "s300": 6, "g20": 6, "g17": 6, "g40": 6, "g49": 6, "g54": 6, "g64": 6, "p0": 6, "001": 6, "g80": 6, "g90": 6, "g91": 6, "g92": 6, "g94": 6, "g97": 6, "g98": 6, "parameter_fil": 6, "var": [6, 8], "oword_narg": 6, "no_downcase_oword": 6, "subroutine_path": 6, "subroutin": [6, 8, 11, 13], "postgui_halfil": 6, "hallib": 6, "twopass": 6, "comment": 6, "thei": [6, 8], "real": 6, "feedback": 6, "speed": [6, 9], "input": [6, 9], "loadrt": 6, "addf": 6, "servo": 6, "thread": 6, "net": 6, "prog": 6, "halui": 6, "program": [6, 9], "idl": 6, "paus": 6, "cycl": 6, "timer": 6, "second": [6, 9], "timersecond": 6, "minut": 6, "timerminut": 6, "hour": 6, "timerhour": 6, "signal": 6, "request": 6, "qtpyvcp_manualtoolchang": 6, "confirm": 6, "number": [6, 9], "simul": 6, "trigger": [6, 9], "push": 6, "tip": [6, 9], "led": 6, "actual": 6, "readout": 6, "rpm": 6, "filter": 6, "scale_to_rpm": 6, "encod": 6, "digit": 6, "analog": 6, "emcmot": 6, "servo_period_nsec": 6, "servo_period": 6, "num_joint": 6, "kin": 6, "joint": 6, "end": 6, "num_dio": 6, "num_aio": 6, "finish": 6, "look": 6, "red": 6, "dialog": [6, 9], "bottom": 6, "own": [6, 10, 13], "give": 6, "better": [6, 13], "match": [6, 9], "theme": 6, "cnc": 6, "box": [6, 8, 9], "easier": 6, "right": [6, 10], "click": [6, 10], "probe_basic_mil": 6, "readi": [6, 13], "devlop": 8, "store": [8, 9, 13], "throughout": 8, "callabl": 8, "same": [8, 9], "allow": [8, 9, 13], "remap": 8, "greater": 8, "degre": 8, "flexibl": 8, "modifi": 8, "programm": 8, "while": 8, "being": [8, 9], "entri": [8, 9], "made": 8, "record": [8, 9], "immedi": 8, "abil": 8, "vital": 8, "optim": 8, "reliabl": 8, "without": [8, 9], "major": 8, "modif": 8, "contain": 8, "pleas": [8, 10, 11], "connfigur": 8, "proper": 8, "includ": [9, 11], "begin": 9, "first": 9, "tabl": [9, 13], "diamet": [9, 13], "default": 9, "99": 9, "cover": 9, "descript": 9, "wai": 9, "prefer": 9, "facemil": [9, 13], "data": 9, "load": [9, 13], "mount": 9, "piec": 9, "scrap": 9, "stock": 9, "vise": 9, "where": 9, "face": 9, "true": 9, "flat": 9, "surfac": 9, "z": [9, 13], "zero": [9, 13], "dro": 9, "appli": 9, "safe": 9, "distanc": [9, 13], "unload": 9, "0000": [9, 13], "reset": 9, "absolut": 9, "sign": 9, "rel": 9, "nose": [9, 13], "gage": 9, "valu": [9, 13], "reload": 9, "again": 9, "show": 9, "point": [9, 11, 13], "want": [9, 13], "most": 9, "calcul": [9, 13], "painless": 9, "precis": 9, "pin": 9, "ring": 9, "known": 9, "secur": 9, "mechan": 9, "stylu": 9, "tir": 9, "meet": 9, "toler": 9, "ideal": 9, "goal": 9, "alwai": [9, 11, 13], "small": 9, "deflect": 9, "trip": [9, 13], "account": 9, "gaug": 9, "video": 9, "youtu": 9, "qr9l6dyxf2a": 9, "pink": 9, "slightli": 9, "object": 9, "minu": 9, "correspond": 9, "afterward": 9, "popul": 9, "feedrat": [9, 13], "directli": 9, "affect": 9, "subsequ": 9, "previou": 9, "boss": 9, "AND": 9, "pocket": 9, "capabl": [9, 13], "ball": 9, "rerun": 9, "until": 9, "accept": 9, "area": 9, "workpiec": 9, "coordin": [9, 13], "wco": 9, "g5x": 9, "activ": 9, "blue": 9, "event": 9, "x": [9, 11, 13], "y": [9, 11, 13], "width": 9, "along": 9, "revers": 9, "engin": 9, "each": 9, "inact": 9, "mode": 9, "part": 9, "far": 9, "travel": [9, 13], "fdrate": 9, "feed": 9, "rate": 9, "slow": [9, 13], "perform": 9, "travers": [9, 13], "non": 9, "top": [9, 13], "reposit": 9, "max": [9, 13], "maximum": 9, "clearanc": 9, "retract": [9, 13], "least": 9, "larger": [9, 13], "than": [9, 13], "backlash": 9, "extra": 9, "depth": 9, "edg": 9, "between": [9, 11], "angl": 9, "last": 9, "clear": 9, "purpl": 9, "dot": 9, "approxim": 9, "height": 9, "here": [9, 10], "offlin": 9, "pb": 9, "date": 9, "4gb": 10, "quicker": 10, "reach": 10, "higher": 10, "hiyapyco": 10, "haven": 10, "t": 10, "hiyapyco_0": 10, "5": 10, "1_all": 10, "navig": 10, "debhelp": 10, "compat": 10, "dh": 10, "setuptool": 10, "yaml": [10, 11], "pyqt5": 10, "qtmultimedia": 10, "qtquick": 10, "qml": 10, "libqt5multimedia5": 10, "plugin": 10, "docopt": 10, "qtpy": 10, "pyudev": 10, "psutil": 10, "markupsaf": 10, "vtk9": 10, "pyqtgraph": 10, "simpleev": 10, "jinja2": 10, "deepdiff": 10, "sqlalchemi": 10, "qttools5": 10, "serial": 10, "dpkg": [10, 11], "configur": [10, 11], "forum": [10, 11], "48401": 10, "py3": 10, "p": [10, 11], "switch": 11, "upcom": 11, "understand": [11, 13], "subject": 11, "bug": 11, "branch": 11, "report": 11, "copi": 11, "past": 11, "nano": 11, "exit": 11, "ctrl": 11, "ye": 11, "ask": 11, "limit": 11, "fulli": 11, "so": 11, "urg": 11, "awar": 11, "those": [11, 13], "retain": 11, "stabil": 11, "oper": 11, "For": 11, "gener": 11, "assist": 11, "visit": 11, "congratul": 12, "recent": 13, "explan": 13, "Be": 13, "review": 13, "elimin": 13, "g59": 13, "toolsett": 13, "g30": 13, "center": 13, "fix": 13, "platter": 13, "z0": 13, "indic": 13, "exact": 13, "po": 13, "captur": 13, "desir": 13, "xy": 13, "empti": 13, "itself": 13, "holder": 13, "automat": 13, "direct": 13, "relat": 13, "determin": 13, "diam": 13, "specif": 13, "dimens": 13, "felt": 13, "safer": 13, "tool_touch_off": 13, "pass": 13, "turn": 13, "With": 13, "defin": 13, "firt": 13, "pull": 14, "84": 14}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"carousel": 0, "atc": [0, 7], "setup": [0, 9], "customis": 1, "python": 1, "button": 1, "renam": 1, "exampl": 1, "probe": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], "basic": [2, 3, 4, 5, 6, 7, 8, 10, 11, 12], "develop": [2, 3, 11], "instal": [2, 3, 4, 10, 11, 12], "step": [2, 3, 6, 10, 11, 12], "get": 2, "start": 2, "updat": [2, 3, 11, 12], "qtpyvcp": [2, 3, 11, 12], "uninstal": [2, 10, 11], "note": [2, 11], "apt": [3, 11, 12], "import": [3, 10, 11, 12], "requir": [3, 6, 10, 12], "1": [3, 6, 11, 12], "download": [3, 10, 12], "linux": [3, 10, 12], "debian": [3, 10, 12], "12": [3, 10, 12], "bookworm": [3, 10, 12], "iso": [3, 10, 12], "imag": [3, 10, 12], "file": [3, 5, 6, 7, 10, 12], "2": [3, 6, 11, 12], "system": [3, 12], "3": [3, 6, 11, 12], "linuxcnc": [3, 12], "4": [3, 6, 11, 12], "add": [3, 12], "repositori": [3, 11, 12], "type": [3, 12], "5": [3, 6, 11, 12], "6": [3, 11, 12], "configur": [3, 4, 6, 12], "interfac": [4, 5, 7], "extend": 4, "indic": 4, "tabl": [4, 5], "lath": 5, "main": [5, 7], "offset": [5, 7, 9], "touch": [5, 9, 13], "off": [5, 13], "tool": [5, 7, 13], "convers": [5, 7], "set": [5, 7, 13], "statu": [5, 7], "machin": 6, "ini": 6, "hal": 6, "creat": 6, "work": [6, 9], "copi": 6, "edit": [6, 11], "modifi": [6, 11], "post": 6, "gui": 6, "launch": 6, "mill": 7, "gcode": 7, "mdi": 7, "face": 7, "hole": 7, "pattern": 7, "xy": 7, "coord": 7, "paramet": [8, 9, 13], "calibr": 9, "your": 9, "result": 9, "routin": 9, "help": 9, "deb": 10, "command": 10, "chang": 11, "stabl": [11, 12], "version": 11, "inform": 11, "guid": 11, "sourc": 11, "list": 11, "save": 11, "current": 11, "upgrad": 11, "7": 11, "troubleshoot": 11, "support": 11, "alreadi": 12, "length": 13, "setter": 13, "posit": 13, "measur": 13, "user": 14, "tab": 14}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 57}, "alltitles": {"Carousel ATC Setup": [[0, "carousel-atc-setup"]], "Customisation with Python": [[1, "customisation-with-python"]], "Button Renaming Example": [[1, "button-renaming-example"]], "Probe Basic Development Installation": [[2, "probe-basic-development-installation"]], "Installation Steps": [[2, "installation-steps"], [3, "installation-steps"], [10, "installation-steps"], [12, "installation-steps"]], "Getting Started with Probe Basic DEVELOPMENT": [[2, "getting-started-with-probe-basic-development"]], "Updating QtPyVCP and Probe Basic": [[2, "updating-qtpyvcp-and-probe-basic"]], "Uninstalling QtPyVCP and Probe Basic": [[2, "uninstalling-qtpyvcp-and-probe-basic"]], "Note": [[2, "note"]], "Probe Basic APT Develop Install": [[3, "probe-basic-apt-develop-install"]], "Important Requirements": [[3, "important-requirements"], [10, "important-requirements"], [12, "important-requirements"]], "1. Download the Linux Debian 12 Bookworm ISO Image File": [[3, "download-the-linux-debian-12-bookworm-iso-image-file"], [12, "download-the-linux-debian-12-bookworm-iso-image-file"]], "2. Update the System": [[3, "update-the-system"], [12, "update-the-system"]], "3. Install LinuxCNC": [[3, "install-linuxcnc"]], "4. Add the APT Repository for the Installation type": [[3, "add-the-apt-repository-for-the-installation-type"], [12, "add-the-apt-repository-for-the-installation-type"]], "5. Update the Repositories": [[3, "update-the-repositories"], [12, "update-the-repositories"]], "6. Install QtPyVCP and Probe Basic": [[3, "install-qtpyvcp-and-probe-basic"], [12, "install-qtpyvcp-and-probe-basic"]], "Updating and Configuration": [[3, "updating-and-configuration"], [12, "updating-and-configuration"]], "Probe Basic": [[4, "probe-basic"]], "Installation:": [[4, null]], "Configuration:": [[4, null]], "Interface:": [[4, null]], "Extending:": [[4, null]], "Indices and tables": [[4, "indices-and-tables"]], "Probe Basic Lathe Interface": [[5, "probe-basic-lathe-interface"]], "Main": [[5, "main"], [7, "main"]], "File": [[5, "file"], [7, "file"]], "Offsets": [[5, "offsets"], [7, "offsets"]], "Touch Off": [[5, "touch-off"]], "Tool Table": [[5, "tool-table"]], "Probing": [[5, "probing"], [7, "probing"], [9, "probing"]], "Conversational": [[5, "conversational"], [7, "conversational"]], "Settings": [[5, "settings"], [7, "settings"]], "Status": [[5, "status"], [7, "status"]], "Machine Configuration (INI, HAL, Files)": [[6, "machine-configuration-ini-hal-files"]], "Creating a working Machine Configuration for Probe Basic": [[6, "creating-a-working-machine-configuration-for-probe-basic"]], "Step 1: Create a basic configuration": [[6, "step-1-create-a-basic-configuration"]], "Step 2: Copy required files": [[6, "step-2-copy-required-files"]], "Step 3: Edit INI files": [[6, "step-3-edit-ini-files"]], "Step 4: Modify Post Gui Hal Files": [[6, "step-4-modify-post-gui-hal-files"]], "Step 5: Modify HAL file": [[6, "step-5-modify-hal-file"]], "Launching Probe Basic": [[6, "launching-probe-basic"]], "Probe Basic Mill Interface": [[7, "probe-basic-mill-interface"]], "GCODE": [[7, "gcode"]], "MDI": [[7, "mdi"]], "ATC": [[7, "atc"]], "Tool": [[7, "tool"]], "Facing": [[7, "facing"]], "Holes": [[7, "holes"]], "Pattern": [[7, "pattern"]], "XY Coord": [[7, "xy-coord"]], "Probe Basic Parameters": [[8, "probe-basic-parameters"]], "Probing Setup": [[9, "probing-setup"]], "Calibrating your Touch Probe": [[9, "calibrating-your-touch-probe"]], "Work Offsets": [[9, "work-offsets"]], "Parameters": [[9, "parameters"]], "Probe Results": [[9, "probe-results"]], "Probing Routines": [[9, "probing-routines"]], "Help": [[9, "help"]], "Probe Basic .deb Install": [[10, "probe-basic-deb-install"]], "Download the Linux Debian 12 Bookworm ISO Image File": [[10, "download-the-linux-debian-12-bookworm-iso-image-file"]], "Installing Probe Basic": [[10, "installing-probe-basic"]], "Installation Commands": [[10, "installation-commands"]], "Uninstallation": [[10, "uninstallation"]], "Changing Stable <-> Develop Versions": [[11, "changing-stable-develop-versions"]], "Probe Basic STABLE and DEVELOP Version Information": [[11, "probe-basic-stable-and-develop-version-information"]], "Step-by-Step Guide to Change the Sources List for Stable and Develop APT Repository": [[11, "step-by-step-guide-to-change-the-sources-list-for-stable-and-develop-apt-repository"]], "1. Edit the sources list": [[11, "edit-the-sources-list"]], "2. Modify the repository": [[11, "modify-the-repository"]], "3. Save changes": [[11, "save-changes"]], "4. Uninstall current Probe Basic": [[11, "uninstall-current-probe-basic"]], "5. Install Probe Basic and QtPyVCP": [[11, "install-probe-basic-and-qtpyvcp"]], "6. Update and upgrade": [[11, "update-and-upgrade"]], "7. Important Note": [[11, "important-note"]], "Troubleshooting and Support": [[11, "troubleshooting-and-support"]], "Probe Basic APT Stable Install": [[12, "probe-basic-apt-stable-install"]], "3. Install LinuxCNC (if not already installed)": [[12, "install-linuxcnc-if-not-already-installed"]], "Tool Length Setter": [[13, "tool-length-setter"]], "Tool Touch Off Position": [[13, "tool-touch-off-position"]], "Tool Touch Off Parameter Settings": [[13, "tool-touch-off-parameter-settings"]], "Measuring Tools": [[13, "measuring-tools"]], "User Tabs": [[14, "user-tabs"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/stable_develop_branch_change.html b/stable_develop_branch_change.html new file mode 100644 index 00000000..2c1fb2ab --- /dev/null +++ b/stable_develop_branch_change.html @@ -0,0 +1,236 @@ + + + + + + + Changing Stable <-> Develop Versions — ProbeBasic documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Changing Stable <-> Develop Versions

+
+

Probe Basic STABLE and DEVELOP Version Information

+
+

Probe Basic now has STABLE and DEVELOP repositories from which users can select for apt updates. You can switch between repositories to test new and upcoming features, but must understand that the development repository will be a testing version. As such, it may be subject to bugs. If you select the develop branch, please be sure to report any bugs either on the forum or on git.

+
+
+
+

Step-by-Step Guide to Change the Sources List for Stable and Develop APT Repository

+
+

1. Edit the sources list

+
+

Type or copy and paste the following line in a terminal, press ENTER, and type in your sudo password when prompted:

+
sudo nano /etc/apt/sources.list.d/kcjengr.list
+
+
+_images/pb_sources_list.png +
+

+
+
+
+
+

2. Modify the repository

+
+

Edit the source list line to set the apt repository for either STABLE or DEVELOP version of Probe Basic:

+_images/nano_sources_list.png +
+

+
+_images/nano_sources_list_edited.png +
+

+
+
+
+
+

3. Save changes

+
+

Exit and save the changes by pressing CTRL + X, then Y, then ENTER:

+_images/yes_nano_to_save.png +
+

+
+_images/enter_nano_file_save_name.png +
+

+
+
+
+
+

4. Uninstall current Probe Basic

+
+

Run the following commands in terminal to uninstall the current installation of Probe Basic:

+
sudo dpkg -P python3-probe-basic
+sudo dpkg -P python3-qtpyvcp
+
+
+
+
+
+

5. Install Probe Basic and QtPyVCP

+
+

Run the following commands in terminal to install Probe Basic and QtPyVCP:

+
sudo apt install python3-qtpyvcp
+sudo apt install python3-probe-basic
+
+
+
+
+
+

6. Update and upgrade

+
+

Run apt update/upgrade by copying the following commands in the main terminal one line at a time. Select Y for yes if asked at any point during the update:

+
sudo apt update
+sudo apt upgrade
+
+
+
+
+
+

7. Important Note

+
+

The development versions will likely require edits, additions or updates to config files. These include but are not limited to the yaml, ini, hal, subroutine, python, and any other supporting configuration files. These changes may not always be fully documented as we test them and are making changes, so we urge users to be aware that the development version should be used in a testing environment only. Those wishing to retain stability in operational use should change to the STABLE version.

+
+
+
+
+

Troubleshooting and Support

+
+

For bug reporting, general assistance, or troubleshooting, visit the QtPyVCP section of the LinuxCNC forum:

+

https://forum.linuxcnc.org/qtpyvcp

+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/stable_quick_start_apt.html b/stable_quick_start_apt.html new file mode 100644 index 00000000..4fdc81d6 --- /dev/null +++ b/stable_quick_start_apt.html @@ -0,0 +1,237 @@ + + + + + + + Probe Basic APT Stable Install — ProbeBasic documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Probe Basic APT Stable Install

+

Probe Basic APT Installation Guide for use with Debian 12 Bookworm and LinuxCNC version 2.9 or Later

+
+

Important Requirements

+
+
    +
  • Probe Basic is currently designed for 1920x1080 screen sizes only!

  • +
  • Probe Basic Install by apt is for amd64 only currently!

  • +
  • Probe Basic requires graphics hardware that supports OpenGL 3.2 and OpenGL Shading Language (GLSL) 1.50 or later

  • +
  • Probe Basic is tested on xfce4, during install of Debian 12 ISO:

  • +
  • DO NOT enter a Root password during installation, leave blank and skip this page.

  • +
+

During installation, this screen below will appear, be sure to uncheck gnome and check xfce as pictured below. No other changes on this page are needed.

+_images/xfce_check_doc.png +
+
+
+

Installation Steps

+
+

1. Download the Linux Debian 12 Bookworm ISO Image File

+
+

Download from: https://www.debian.org/download

+

Select the Linux Debian 12 Bookworm Netinst CD ISO from the above link. You will need to make a bootable DVD or USB thumb drive depending on how you plan to install. The below software is extremely easy and works flawlessly with Linux Debian OS images:

+

https://www.balena.io/etcher/?ref=etcher_update

+

Once you have created your flash stick for LinuxCNC, proceed to install and boot the system. (Note: It is advised to have an ethernet cable internet connection during install). Select the graphical installation option. Follow the steps on screen to complete installation. When you are greeted by the Linux Desktop Selection Page, uncheck the GNOME option and check the XFCE4 option.

+
+
+
+

2. Update the System

+
+

After installation, run the following commands in the main terminal:

+
sudo apt update
+sudo apt upgrade
+
+
+
+
+
+

3. Install LinuxCNC (if not already installed)

+
+
sudo apt install linuxcnc-uspace linuxcnc-uspace-dev mesaflash
+
+
+

Once you have installed LinuxCNC, open it and start the axis sim briefly, then shut it down to ensure the installation was successful.

+
+
+
+

4. Add the APT Repository for the Installation type

+
+

AMD64 for PC Installation Repository:

+
+

Run the following commands in the main terminal one at a time:

+
sudo apt install curl
+echo 'deb [arch=amd64] https://repository.qtpyvcp.com/apt stable main' | sudo tee /etc/apt/sources.list.d/kcjengr.list
+curl -sS https://repository.qtpyvcp.com/repo/kcjengr.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/kcjengr.gpg
+gpg --keyserver keys.openpgp.org --recv-key 2DEC041F290DF85A
+
+
+
+

ARM64 Raspberry Pi 4 and 5 Installation Repository:

+
+

Run the following commands in the main terminal one at a time:

+
sudo apt install curl
+echo 'deb [arch=arm64] https://repository.qtpyvcp.com/apt stable main' | sudo tee /etc/apt/sources.list.d/kcjengr.list
+curl -sS https://repository.qtpyvcp.com/repo/kcjengr.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/kcjengr.gpg
+gpg --keyserver keys.openpgp.org --recv-key 2DEC041F290DF85A
+
+
+
+
+
+
+

5. Update the Repositories

+
+
sudo apt update
+
+
+
+
+
+

6. Install QtPyVCP and Probe Basic

+
+
sudo apt install python3-qtpyvcp
+sudo apt install python3-probe-basic
+
+
+

Congratulations! You have now installed Probe Basic. You should be able to launch the Probe Basic sim from within the LinuxCNC applications dropdown menu.

+
+
+
+
+

Updating and Configuration

+
+

Updating of Probe Basic and QtPyVCP will occur when you run the normal “sudo apt update” and “sudo apt upgrade” commands. During updating, the Probe Basic sim configuration files will be overwritten. It is strongly recommended to create your machine configuration files with unique names to avoid having them overwritten during updates.

+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/tool_length_setter.html b/tool_length_setter.html new file mode 100644 index 00000000..3d6482d6 --- /dev/null +++ b/tool_length_setter.html @@ -0,0 +1,212 @@ + + + + + + + Tool Length Setter — ProbeBasic documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tool Length Setter

+
+

We recently updated the tool touch off page and it is now located under a tab on the main probing tab. there are explanations and visual graphics for better understanding on the tool touch off setup and parameter functions. Be sure to review the updated information/explanation tabs. We also have eliminated the need to use G59.3 as a storing location for the probed coordinates used in the length offset calculation. Below is an image of the new toolsetter page for reference.

+_images/toolsetter_page_doc_image.png +
+

+
+
+
+

Tool Touch Off Position

+
+
+

Important

+

Tool touch off position (G30), X and Y should be centered on the fixed tool setter platter. Z should always be set to Z Home position Z0.0000

+
+
+

+
+
    +
  1. Setting the tool touch off position, jog the machine to the center point of the tool setter platter and indicate it in or probe it with the touch probe to find exact center point.

  2. +
  3. Next, retract the z axis to the home position Z0.0000

  4. +
  5. Press the “SET TOOL TOUCH OFF POS” button, this will capture and store the current locating for probing tools from the touch off routine.

  6. +
+
+
+
+

Tool Touch Off Parameter Settings

+
+
    +
  1. Enter the desired Parameter settings for all parameters:

    +
      +
    • Spindle Zero

    • +
    • Fast Probe Feedrate

    • +
    • Slow Probe Feedrate

    • +
    • Traverse Feedrate

    • +
    • Z Max Travel

    • +
    • XY Max Travel

    • +
    • Retract distance

    • +
    +
  2. +
+
+

+
+
+

Important

+

Spindle Zero is the length/distance from the empty spindle nose at the Z home Position Z0.0000 to the top of the tool setter (at the trip point) +the value for Spindle Zero can be measured by probing the top of the setter using the spindle nose itself to find the distance (spindle empty spindle no holder loaded)

+
+
+

+
+
    +
  1. Select the if Tool Diameter Offset will be used. This feature will automatically offset the probing position by 1/2 of the tools stored diameter in the tool table. the direction the tool will move in relation to the ToolSetter platter is determined by the Tool Offset Direction Buttons in the parameter setting section. This feature can be useful when measuring tools that are larger than the platter of the tool setter, such as facemills etc.

    +_images/toolsetter_page_doc_image_1.png +
  2. +
+
+

+
+
    +
  1. The Tool Diam Probe button is a place holder only, measuring the diameter of a tool requires a specific type of tool setter capable of measuring in 3 dimensions. We felt it was safer for those wanting this functionality to creating their own probing routine specific to their machine and hardware. In the subroutines folder is in the tool_touch_off.ngc file the parameter is there and passed to be able to turn this on or off. This will allow users to add to the subroutine as needed and have control over that functionality from within the user interface.

  2. +
  3. With all of the parameters set and the touch off location defined, you are now ready to test your firt tool touch off routine. follow the instruction below to proceed.

  4. +
+
+
+
+

Measuring Tools

+
+
    +
  1. To measure a tool, Load the tool in the spindle using the tool page in the probe basic interface

  2. +
  3. Press the “TOUCH OFF CURRENT TOOL” button, this will initiate the tool touch off routine and move the machine to the tool touch off position and probe the tool length to capture and store the current length of the tool in the tool table.

  4. +
+_images/tool_length_measure.png +
+

+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/user_tabs.html b/user_tabs.html new file mode 100644 index 00000000..f6f7d473 --- /dev/null +++ b/user_tabs.html @@ -0,0 +1,131 @@ + + + + + + + User Tabs — ProbeBasic documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

User Tabs

+

TODO:

+

https://github.com/kcjengr/probe_basic/pull/84

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file