meerk40t 0.9.3001__py2.py3-none-any.whl → 0.9.7020__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- meerk40t/__init__.py +1 -1
- meerk40t/balormk/balor_params.py +167 -167
- meerk40t/balormk/clone_loader.py +457 -457
- meerk40t/balormk/controller.py +1566 -1512
- meerk40t/balormk/cylindermod.py +64 -0
- meerk40t/balormk/device.py +966 -1959
- meerk40t/balormk/driver.py +778 -591
- meerk40t/balormk/galvo_commands.py +1194 -0
- meerk40t/balormk/gui/balorconfig.py +237 -111
- meerk40t/balormk/gui/balorcontroller.py +191 -184
- meerk40t/balormk/gui/baloroperationproperties.py +116 -115
- meerk40t/balormk/gui/corscene.py +845 -0
- meerk40t/balormk/gui/gui.py +179 -147
- meerk40t/balormk/livelightjob.py +466 -382
- meerk40t/balormk/mock_connection.py +131 -109
- meerk40t/balormk/plugin.py +133 -135
- meerk40t/balormk/usb_connection.py +306 -301
- meerk40t/camera/__init__.py +1 -1
- meerk40t/camera/camera.py +514 -397
- meerk40t/camera/gui/camerapanel.py +1241 -1095
- meerk40t/camera/gui/gui.py +58 -58
- meerk40t/camera/plugin.py +441 -399
- meerk40t/ch341/__init__.py +27 -27
- meerk40t/ch341/ch341device.py +628 -628
- meerk40t/ch341/libusb.py +595 -589
- meerk40t/ch341/mock.py +171 -171
- meerk40t/ch341/windriver.py +157 -157
- meerk40t/constants.py +13 -0
- meerk40t/core/__init__.py +1 -1
- meerk40t/core/bindalias.py +550 -539
- meerk40t/core/core.py +47 -47
- meerk40t/core/cutcode/cubiccut.py +73 -73
- meerk40t/core/cutcode/cutcode.py +315 -312
- meerk40t/core/cutcode/cutgroup.py +141 -137
- meerk40t/core/cutcode/cutobject.py +192 -185
- meerk40t/core/cutcode/dwellcut.py +37 -37
- meerk40t/core/cutcode/gotocut.py +29 -29
- meerk40t/core/cutcode/homecut.py +29 -29
- meerk40t/core/cutcode/inputcut.py +34 -34
- meerk40t/core/cutcode/linecut.py +33 -33
- meerk40t/core/cutcode/outputcut.py +34 -34
- meerk40t/core/cutcode/plotcut.py +335 -335
- meerk40t/core/cutcode/quadcut.py +61 -61
- meerk40t/core/cutcode/rastercut.py +168 -148
- meerk40t/core/cutcode/waitcut.py +34 -34
- meerk40t/core/cutplan.py +1843 -1316
- meerk40t/core/drivers.py +330 -329
- meerk40t/core/elements/align.py +801 -669
- meerk40t/core/elements/branches.py +1858 -1507
- meerk40t/core/elements/clipboard.py +229 -219
- meerk40t/core/elements/element_treeops.py +4595 -2837
- meerk40t/core/elements/element_types.py +125 -105
- meerk40t/core/elements/elements.py +4315 -3617
- meerk40t/core/elements/files.py +117 -64
- meerk40t/core/elements/geometry.py +473 -224
- meerk40t/core/elements/grid.py +467 -316
- meerk40t/core/elements/materials.py +158 -94
- meerk40t/core/elements/notes.py +50 -38
- meerk40t/core/elements/offset_clpr.py +934 -912
- meerk40t/core/elements/offset_mk.py +963 -955
- meerk40t/core/elements/penbox.py +339 -267
- meerk40t/core/elements/placements.py +300 -83
- meerk40t/core/elements/render.py +785 -687
- meerk40t/core/elements/shapes.py +2618 -2092
- meerk40t/core/elements/testcases.py +105 -0
- meerk40t/core/elements/trace.py +651 -563
- meerk40t/core/elements/tree_commands.py +415 -409
- meerk40t/core/elements/undo_redo.py +116 -58
- meerk40t/core/elements/wordlist.py +319 -200
- meerk40t/core/exceptions.py +9 -9
- meerk40t/core/laserjob.py +220 -220
- meerk40t/core/logging.py +63 -63
- meerk40t/core/node/blobnode.py +83 -86
- meerk40t/core/node/bootstrap.py +105 -103
- meerk40t/core/node/branch_elems.py +40 -31
- meerk40t/core/node/branch_ops.py +45 -38
- meerk40t/core/node/branch_regmark.py +48 -41
- meerk40t/core/node/cutnode.py +29 -32
- meerk40t/core/node/effect_hatch.py +375 -257
- meerk40t/core/node/effect_warp.py +398 -0
- meerk40t/core/node/effect_wobble.py +441 -309
- meerk40t/core/node/elem_ellipse.py +404 -309
- meerk40t/core/node/elem_image.py +1082 -801
- meerk40t/core/node/elem_line.py +358 -292
- meerk40t/core/node/elem_path.py +259 -201
- meerk40t/core/node/elem_point.py +129 -102
- meerk40t/core/node/elem_polyline.py +310 -246
- meerk40t/core/node/elem_rect.py +376 -286
- meerk40t/core/node/elem_text.py +445 -418
- meerk40t/core/node/filenode.py +59 -40
- meerk40t/core/node/groupnode.py +138 -74
- meerk40t/core/node/image_processed.py +777 -766
- meerk40t/core/node/image_raster.py +156 -113
- meerk40t/core/node/layernode.py +31 -31
- meerk40t/core/node/mixins.py +135 -107
- meerk40t/core/node/node.py +1427 -1304
- meerk40t/core/node/nutils.py +117 -114
- meerk40t/core/node/op_cut.py +463 -335
- meerk40t/core/node/op_dots.py +296 -251
- meerk40t/core/node/op_engrave.py +414 -311
- meerk40t/core/node/op_image.py +755 -369
- meerk40t/core/node/op_raster.py +787 -522
- meerk40t/core/node/place_current.py +37 -40
- meerk40t/core/node/place_point.py +329 -126
- meerk40t/core/node/refnode.py +58 -47
- meerk40t/core/node/rootnode.py +225 -219
- meerk40t/core/node/util_console.py +48 -48
- meerk40t/core/node/util_goto.py +84 -65
- meerk40t/core/node/util_home.py +61 -61
- meerk40t/core/node/util_input.py +102 -102
- meerk40t/core/node/util_output.py +102 -102
- meerk40t/core/node/util_wait.py +65 -65
- meerk40t/core/parameters.py +709 -707
- meerk40t/core/planner.py +875 -785
- meerk40t/core/plotplanner.py +656 -652
- meerk40t/core/space.py +120 -113
- meerk40t/core/spoolers.py +706 -705
- meerk40t/core/svg_io.py +1836 -1549
- meerk40t/core/treeop.py +534 -445
- meerk40t/core/undos.py +278 -124
- meerk40t/core/units.py +784 -680
- meerk40t/core/view.py +393 -322
- meerk40t/core/webhelp.py +62 -62
- meerk40t/core/wordlist.py +513 -504
- meerk40t/cylinder/cylinder.py +247 -0
- meerk40t/cylinder/gui/cylindersettings.py +41 -0
- meerk40t/cylinder/gui/gui.py +24 -0
- meerk40t/device/__init__.py +1 -1
- meerk40t/device/basedevice.py +322 -123
- meerk40t/device/devicechoices.py +50 -0
- meerk40t/device/dummydevice.py +163 -128
- meerk40t/device/gui/defaultactions.py +618 -602
- meerk40t/device/gui/effectspanel.py +114 -0
- meerk40t/device/gui/formatterpanel.py +253 -290
- meerk40t/device/gui/warningpanel.py +337 -260
- meerk40t/device/mixins.py +13 -13
- meerk40t/dxf/__init__.py +1 -1
- meerk40t/dxf/dxf_io.py +766 -554
- meerk40t/dxf/plugin.py +47 -35
- meerk40t/external_plugins.py +79 -79
- meerk40t/external_plugins_build.py +28 -28
- meerk40t/extra/cag.py +112 -116
- meerk40t/extra/coolant.py +403 -0
- meerk40t/extra/encode_detect.py +204 -0
- meerk40t/extra/ezd.py +1165 -1165
- meerk40t/extra/hershey.py +834 -340
- meerk40t/extra/imageactions.py +322 -316
- meerk40t/extra/inkscape.py +628 -622
- meerk40t/extra/lbrn.py +424 -424
- meerk40t/extra/outerworld.py +283 -0
- meerk40t/extra/param_functions.py +1542 -1556
- meerk40t/extra/potrace.py +257 -253
- meerk40t/extra/serial_exchange.py +118 -0
- meerk40t/extra/updater.py +602 -453
- meerk40t/extra/vectrace.py +147 -146
- meerk40t/extra/winsleep.py +83 -83
- meerk40t/extra/xcs_reader.py +597 -0
- meerk40t/fill/fills.py +781 -335
- meerk40t/fill/patternfill.py +1061 -1061
- meerk40t/fill/patterns.py +614 -567
- meerk40t/grbl/control.py +87 -87
- meerk40t/grbl/controller.py +990 -903
- meerk40t/grbl/device.py +1084 -768
- meerk40t/grbl/driver.py +989 -771
- meerk40t/grbl/emulator.py +532 -497
- meerk40t/grbl/gcodejob.py +783 -767
- meerk40t/grbl/gui/grblconfiguration.py +373 -298
- meerk40t/grbl/gui/grblcontroller.py +485 -271
- meerk40t/grbl/gui/grblhardwareconfig.py +269 -153
- meerk40t/grbl/gui/grbloperationconfig.py +105 -0
- meerk40t/grbl/gui/gui.py +147 -116
- meerk40t/grbl/interpreter.py +44 -44
- meerk40t/grbl/loader.py +22 -22
- meerk40t/grbl/mock_connection.py +56 -56
- meerk40t/grbl/plugin.py +294 -264
- meerk40t/grbl/serial_connection.py +93 -88
- meerk40t/grbl/tcp_connection.py +81 -79
- meerk40t/grbl/ws_connection.py +112 -0
- meerk40t/gui/__init__.py +1 -1
- meerk40t/gui/about.py +2042 -296
- meerk40t/gui/alignment.py +1644 -1608
- meerk40t/gui/autoexec.py +199 -0
- meerk40t/gui/basicops.py +791 -670
- meerk40t/gui/bufferview.py +77 -71
- meerk40t/gui/busy.py +232 -133
- meerk40t/gui/choicepropertypanel.py +1662 -1469
- meerk40t/gui/consolepanel.py +706 -542
- meerk40t/gui/devicepanel.py +687 -581
- meerk40t/gui/dialogoptions.py +110 -107
- meerk40t/gui/executejob.py +316 -306
- meerk40t/gui/fonts.py +90 -90
- meerk40t/gui/functionwrapper.py +252 -0
- meerk40t/gui/gui_mixins.py +729 -0
- meerk40t/gui/guicolors.py +205 -182
- meerk40t/gui/help_assets/help_assets.py +218 -201
- meerk40t/gui/helper.py +154 -0
- meerk40t/gui/hersheymanager.py +1440 -846
- meerk40t/gui/icons.py +3422 -2747
- meerk40t/gui/imagesplitter.py +555 -508
- meerk40t/gui/keymap.py +354 -344
- meerk40t/gui/laserpanel.py +897 -806
- meerk40t/gui/laserrender.py +1470 -1232
- meerk40t/gui/lasertoolpanel.py +805 -793
- meerk40t/gui/magnetoptions.py +436 -0
- meerk40t/gui/materialmanager.py +2944 -0
- meerk40t/gui/materialtest.py +1722 -1694
- meerk40t/gui/mkdebug.py +646 -359
- meerk40t/gui/mwindow.py +163 -140
- meerk40t/gui/navigationpanels.py +2605 -2467
- meerk40t/gui/notes.py +143 -142
- meerk40t/gui/opassignment.py +414 -410
- meerk40t/gui/operation_info.py +310 -299
- meerk40t/gui/plugin.py +500 -328
- meerk40t/gui/position.py +714 -669
- meerk40t/gui/preferences.py +901 -650
- meerk40t/gui/propertypanels/attributes.py +1461 -1131
- meerk40t/gui/propertypanels/blobproperty.py +117 -114
- meerk40t/gui/propertypanels/consoleproperty.py +83 -80
- meerk40t/gui/propertypanels/gotoproperty.py +77 -0
- meerk40t/gui/propertypanels/groupproperties.py +223 -217
- meerk40t/gui/propertypanels/hatchproperty.py +489 -469
- meerk40t/gui/propertypanels/imageproperty.py +2244 -1384
- meerk40t/gui/propertypanels/inputproperty.py +59 -58
- meerk40t/gui/propertypanels/opbranchproperties.py +82 -80
- meerk40t/gui/propertypanels/operationpropertymain.py +1890 -1638
- meerk40t/gui/propertypanels/outputproperty.py +59 -58
- meerk40t/gui/propertypanels/pathproperty.py +389 -380
- meerk40t/gui/propertypanels/placementproperty.py +1214 -383
- meerk40t/gui/propertypanels/pointproperty.py +140 -136
- meerk40t/gui/propertypanels/propertywindow.py +313 -181
- meerk40t/gui/propertypanels/rasterwizardpanels.py +996 -912
- meerk40t/gui/propertypanels/regbranchproperties.py +76 -0
- meerk40t/gui/propertypanels/textproperty.py +770 -755
- meerk40t/gui/propertypanels/waitproperty.py +56 -55
- meerk40t/gui/propertypanels/warpproperty.py +121 -0
- meerk40t/gui/propertypanels/wobbleproperty.py +255 -204
- meerk40t/gui/ribbon.py +2471 -2210
- meerk40t/gui/scene/scene.py +1100 -1051
- meerk40t/gui/scene/sceneconst.py +22 -22
- meerk40t/gui/scene/scenepanel.py +439 -349
- meerk40t/gui/scene/scenespacewidget.py +365 -365
- meerk40t/gui/scene/widget.py +518 -505
- meerk40t/gui/scenewidgets/affinemover.py +215 -215
- meerk40t/gui/scenewidgets/attractionwidget.py +315 -309
- meerk40t/gui/scenewidgets/bedwidget.py +120 -97
- meerk40t/gui/scenewidgets/elementswidget.py +137 -107
- meerk40t/gui/scenewidgets/gridwidget.py +785 -745
- meerk40t/gui/scenewidgets/guidewidget.py +765 -765
- meerk40t/gui/scenewidgets/laserpathwidget.py +66 -66
- meerk40t/gui/scenewidgets/machineoriginwidget.py +86 -86
- meerk40t/gui/scenewidgets/nodeselector.py +28 -28
- meerk40t/gui/scenewidgets/rectselectwidget.py +592 -346
- meerk40t/gui/scenewidgets/relocatewidget.py +33 -33
- meerk40t/gui/scenewidgets/reticlewidget.py +83 -83
- meerk40t/gui/scenewidgets/selectionwidget.py +2958 -2756
- meerk40t/gui/simpleui.py +362 -333
- meerk40t/gui/simulation.py +2451 -2094
- meerk40t/gui/snapoptions.py +208 -203
- meerk40t/gui/spoolerpanel.py +1227 -1180
- meerk40t/gui/statusbarwidgets/defaultoperations.py +480 -353
- meerk40t/gui/statusbarwidgets/infowidget.py +520 -483
- meerk40t/gui/statusbarwidgets/opassignwidget.py +356 -355
- meerk40t/gui/statusbarwidgets/selectionwidget.py +172 -171
- meerk40t/gui/statusbarwidgets/shapepropwidget.py +754 -236
- meerk40t/gui/statusbarwidgets/statusbar.py +272 -260
- meerk40t/gui/statusbarwidgets/statusbarwidget.py +268 -270
- meerk40t/gui/statusbarwidgets/strokewidget.py +267 -251
- meerk40t/gui/themes.py +200 -78
- meerk40t/gui/tips.py +590 -0
- meerk40t/gui/toolwidgets/circlebrush.py +35 -35
- meerk40t/gui/toolwidgets/toolcircle.py +248 -242
- meerk40t/gui/toolwidgets/toolcontainer.py +82 -77
- meerk40t/gui/toolwidgets/tooldraw.py +97 -90
- meerk40t/gui/toolwidgets/toolellipse.py +219 -212
- meerk40t/gui/toolwidgets/toolimagecut.py +25 -132
- meerk40t/gui/toolwidgets/toolline.py +39 -144
- meerk40t/gui/toolwidgets/toollinetext.py +79 -236
- meerk40t/gui/toolwidgets/toollinetext_inline.py +296 -0
- meerk40t/gui/toolwidgets/toolmeasure.py +163 -216
- meerk40t/gui/toolwidgets/toolnodeedit.py +2088 -2074
- meerk40t/gui/toolwidgets/toolnodemove.py +92 -94
- meerk40t/gui/toolwidgets/toolparameter.py +754 -668
- meerk40t/gui/toolwidgets/toolplacement.py +108 -108
- meerk40t/gui/toolwidgets/toolpoint.py +68 -59
- meerk40t/gui/toolwidgets/toolpointlistbuilder.py +294 -0
- meerk40t/gui/toolwidgets/toolpointmove.py +183 -0
- meerk40t/gui/toolwidgets/toolpolygon.py +288 -403
- meerk40t/gui/toolwidgets/toolpolyline.py +38 -196
- meerk40t/gui/toolwidgets/toolrect.py +211 -207
- meerk40t/gui/toolwidgets/toolrelocate.py +72 -72
- meerk40t/gui/toolwidgets/toolribbon.py +598 -113
- meerk40t/gui/toolwidgets/tooltabedit.py +546 -0
- meerk40t/gui/toolwidgets/tooltext.py +98 -89
- meerk40t/gui/toolwidgets/toolvector.py +213 -204
- meerk40t/gui/toolwidgets/toolwidget.py +39 -39
- meerk40t/gui/usbconnect.py +98 -91
- meerk40t/gui/utilitywidgets/buttonwidget.py +18 -18
- meerk40t/gui/utilitywidgets/checkboxwidget.py +90 -90
- meerk40t/gui/utilitywidgets/controlwidget.py +14 -14
- meerk40t/gui/utilitywidgets/cyclocycloidwidget.py +343 -340
- meerk40t/gui/utilitywidgets/debugwidgets.py +148 -0
- meerk40t/gui/utilitywidgets/handlewidget.py +27 -27
- meerk40t/gui/utilitywidgets/harmonograph.py +450 -447
- meerk40t/gui/utilitywidgets/openclosewidget.py +40 -40
- meerk40t/gui/utilitywidgets/rotationwidget.py +54 -54
- meerk40t/gui/utilitywidgets/scalewidget.py +75 -75
- meerk40t/gui/utilitywidgets/seekbarwidget.py +183 -183
- meerk40t/gui/utilitywidgets/togglewidget.py +142 -142
- meerk40t/gui/utilitywidgets/toolbarwidget.py +8 -8
- meerk40t/gui/wordlisteditor.py +985 -931
- meerk40t/gui/wxmeerk40t.py +1447 -1169
- meerk40t/gui/wxmmain.py +5644 -4112
- meerk40t/gui/wxmribbon.py +1591 -1076
- meerk40t/gui/wxmscene.py +1631 -1453
- meerk40t/gui/wxmtree.py +2416 -2089
- meerk40t/gui/wxutils.py +1769 -1099
- meerk40t/gui/zmatrix.py +102 -102
- meerk40t/image/__init__.py +1 -1
- meerk40t/image/dither.py +429 -0
- meerk40t/image/imagetools.py +2793 -2269
- meerk40t/internal_plugins.py +150 -130
- meerk40t/kernel/__init__.py +63 -12
- meerk40t/kernel/channel.py +259 -212
- meerk40t/kernel/context.py +538 -538
- meerk40t/kernel/exceptions.py +41 -41
- meerk40t/kernel/functions.py +463 -414
- meerk40t/kernel/jobs.py +100 -100
- meerk40t/kernel/kernel.py +3828 -3571
- meerk40t/kernel/lifecycles.py +71 -71
- meerk40t/kernel/module.py +49 -49
- meerk40t/kernel/service.py +147 -147
- meerk40t/kernel/settings.py +383 -343
- meerk40t/lihuiyu/controller.py +883 -876
- meerk40t/lihuiyu/device.py +1181 -1069
- meerk40t/lihuiyu/driver.py +1466 -1372
- meerk40t/lihuiyu/gui/gui.py +127 -106
- meerk40t/lihuiyu/gui/lhyaccelgui.py +377 -363
- meerk40t/lihuiyu/gui/lhycontrollergui.py +741 -651
- meerk40t/lihuiyu/gui/lhydrivergui.py +470 -446
- meerk40t/lihuiyu/gui/lhyoperationproperties.py +238 -237
- meerk40t/lihuiyu/gui/tcpcontroller.py +226 -190
- meerk40t/lihuiyu/interpreter.py +53 -53
- meerk40t/lihuiyu/laserspeed.py +450 -450
- meerk40t/lihuiyu/loader.py +90 -90
- meerk40t/lihuiyu/parser.py +404 -404
- meerk40t/lihuiyu/plugin.py +101 -102
- meerk40t/lihuiyu/tcp_connection.py +111 -109
- meerk40t/main.py +231 -165
- meerk40t/moshi/builder.py +788 -781
- meerk40t/moshi/controller.py +505 -499
- meerk40t/moshi/device.py +495 -442
- meerk40t/moshi/driver.py +862 -696
- meerk40t/moshi/gui/gui.py +78 -76
- meerk40t/moshi/gui/moshicontrollergui.py +538 -522
- meerk40t/moshi/gui/moshidrivergui.py +87 -75
- meerk40t/moshi/plugin.py +43 -43
- meerk40t/network/console_server.py +140 -57
- meerk40t/network/kernelserver.py +10 -9
- meerk40t/network/tcp_server.py +142 -140
- meerk40t/network/udp_server.py +103 -77
- meerk40t/network/web_server.py +404 -0
- meerk40t/newly/controller.py +1158 -1144
- meerk40t/newly/device.py +874 -732
- meerk40t/newly/driver.py +540 -412
- meerk40t/newly/gui/gui.py +219 -188
- meerk40t/newly/gui/newlyconfig.py +116 -101
- meerk40t/newly/gui/newlycontroller.py +193 -186
- meerk40t/newly/gui/operationproperties.py +51 -51
- meerk40t/newly/mock_connection.py +82 -82
- meerk40t/newly/newly_params.py +56 -56
- meerk40t/newly/plugin.py +1214 -1246
- meerk40t/newly/usb_connection.py +322 -322
- meerk40t/rotary/gui/gui.py +52 -46
- meerk40t/rotary/gui/rotarysettings.py +240 -232
- meerk40t/rotary/rotary.py +202 -98
- meerk40t/ruida/control.py +291 -91
- meerk40t/ruida/controller.py +138 -1088
- meerk40t/ruida/device.py +676 -231
- meerk40t/ruida/driver.py +534 -472
- meerk40t/ruida/emulator.py +1494 -1491
- meerk40t/ruida/exceptions.py +4 -4
- meerk40t/ruida/gui/gui.py +71 -76
- meerk40t/ruida/gui/ruidaconfig.py +239 -72
- meerk40t/ruida/gui/ruidacontroller.py +187 -184
- meerk40t/ruida/gui/ruidaoperationproperties.py +48 -47
- meerk40t/ruida/loader.py +54 -52
- meerk40t/ruida/mock_connection.py +57 -109
- meerk40t/ruida/plugin.py +124 -87
- meerk40t/ruida/rdjob.py +2084 -945
- meerk40t/ruida/serial_connection.py +116 -0
- meerk40t/ruida/tcp_connection.py +146 -0
- meerk40t/ruida/udp_connection.py +73 -0
- meerk40t/svgelements.py +9671 -9669
- meerk40t/tools/driver_to_path.py +584 -579
- meerk40t/tools/geomstr.py +5583 -4680
- meerk40t/tools/jhfparser.py +357 -292
- meerk40t/tools/kerftest.py +904 -890
- meerk40t/tools/livinghinges.py +1168 -1033
- meerk40t/tools/pathtools.py +987 -949
- meerk40t/tools/pmatrix.py +234 -0
- meerk40t/tools/pointfinder.py +942 -942
- meerk40t/tools/polybool.py +941 -940
- meerk40t/tools/rasterplotter.py +1660 -547
- meerk40t/tools/shxparser.py +1047 -901
- meerk40t/tools/ttfparser.py +726 -446
- meerk40t/tools/zinglplotter.py +595 -593
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/LICENSE +21 -21
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/METADATA +150 -139
- meerk40t-0.9.7020.dist-info/RECORD +446 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/WHEEL +1 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/top_level.txt +0 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/zip-safe +1 -1
- meerk40t/balormk/elementlightjob.py +0 -159
- meerk40t-0.9.3001.dist-info/RECORD +0 -437
- test/bootstrap.py +0 -63
- test/test_cli.py +0 -12
- test/test_core_cutcode.py +0 -418
- test/test_core_elements.py +0 -144
- test/test_core_plotplanner.py +0 -397
- test/test_core_viewports.py +0 -312
- test/test_drivers_grbl.py +0 -108
- test/test_drivers_lihuiyu.py +0 -443
- test/test_drivers_newly.py +0 -113
- test/test_element_degenerate_points.py +0 -43
- test/test_elements_classify.py +0 -97
- test/test_elements_penbox.py +0 -22
- test/test_file_svg.py +0 -176
- test/test_fill.py +0 -155
- test/test_geomstr.py +0 -1523
- test/test_geomstr_nodes.py +0 -18
- test/test_imagetools_actualize.py +0 -306
- test/test_imagetools_wizard.py +0 -258
- test/test_kernel.py +0 -200
- test/test_laser_speeds.py +0 -3303
- test/test_length.py +0 -57
- test/test_lifecycle.py +0 -66
- test/test_operations.py +0 -251
- test/test_operations_hatch.py +0 -57
- test/test_ruida.py +0 -19
- test/test_spooler.py +0 -22
- test/test_tools_rasterplotter.py +0 -29
- test/test_wobble.py +0 -133
- test/test_zingl.py +0 -124
- {test → meerk40t/cylinder}/__init__.py +0 -0
- /meerk40t/{core/element_commands.py → cylinder/gui/__init__.py} +0 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/entry_points.txt +0 -0
meerk40t/grbl/emulator.py
CHANGED
@@ -1,497 +1,532 @@
|
|
1
|
-
"""
|
2
|
-
GRBL Emulator
|
3
|
-
|
4
|
-
The GRBL Emulator converts our parsed Grbl/Gcode data into Driver-like calls.
|
5
|
-
"""
|
6
|
-
import re
|
7
|
-
|
8
|
-
from meerk40t.grbl.gcodejob import GcodeJob
|
9
|
-
|
10
|
-
GRBL_SET_RE = re.compile(r"\$(\d+)=([-+]?[0-9]*\.?[0-9]*)")
|
11
|
-
|
12
|
-
step_pulse_microseconds = 0
|
13
|
-
step_idle_delay = 25
|
14
|
-
step_pulse_invert = 2
|
15
|
-
step_direction_invert = 3
|
16
|
-
invert_step_enable_pin = 4
|
17
|
-
invert_limit_pins = 5
|
18
|
-
invert_probe_pin = 6
|
19
|
-
status_report_options = 10
|
20
|
-
junction_deviation = 11
|
21
|
-
arc_tolerance = 12
|
22
|
-
report_in_inches = 13
|
23
|
-
soft_limits_enabled = 20
|
24
|
-
hard_limits_enabled = 21
|
25
|
-
homing_cycle_enable = 22
|
26
|
-
homing_direction_invert = 23
|
27
|
-
homing_locate_feed_rate = 24
|
28
|
-
homing_search_seek_rate = 25
|
29
|
-
homing_switch_debounce_delay = 26
|
30
|
-
homing_switch_pulloff_distance = 27
|
31
|
-
maximum_spindle_speed = 30
|
32
|
-
minimum_spindle_speed = 31
|
33
|
-
laser_mode_enable = 32
|
34
|
-
x_axis_steps_per_millimeter = 100
|
35
|
-
y_axis_steps_per_millimeter = 101
|
36
|
-
z_axis_steps_per_millimeter = 102
|
37
|
-
x_axis_max_rate = 110
|
38
|
-
y_axis_max_rate = 111
|
39
|
-
z_axis_max_rate = 112
|
40
|
-
x_axis_acceleration = 120
|
41
|
-
y_axis_acceleration = 121
|
42
|
-
z_axis_acceleration = 122
|
43
|
-
x_axis_max_travel = 130
|
44
|
-
y_axis_max_travel = 131
|
45
|
-
z_axis_max_travel = 132
|
46
|
-
|
47
|
-
lookup = {
|
48
|
-
step_pulse_microseconds: "step_pulse_microseconds",
|
49
|
-
step_idle_delay: "step_idle_delay",
|
50
|
-
step_pulse_invert: "step_pulse_invert",
|
51
|
-
step_direction_invert: "step_direction_invert",
|
52
|
-
invert_step_enable_pin: "invert_step_enable_pin",
|
53
|
-
invert_limit_pins: "invert_limit_pins",
|
54
|
-
invert_probe_pin: "invert_probe_pin",
|
55
|
-
status_report_options: "status_report_options",
|
56
|
-
junction_deviation: "junction_deviation",
|
57
|
-
arc_tolerance: "arc_tolerance",
|
58
|
-
report_in_inches: "report_in_inches",
|
59
|
-
soft_limits_enabled: "soft_limits_enabled",
|
60
|
-
hard_limits_enabled: "hard_limits_enabled",
|
61
|
-
homing_cycle_enable: "homing_cycle_enable",
|
62
|
-
homing_direction_invert: "homing_direction_invert",
|
63
|
-
homing_locate_feed_rate: "homing_locate_feed_rate,",
|
64
|
-
homing_search_seek_rate: "homing_search_seek_rate",
|
65
|
-
homing_switch_debounce_delay: "homing_switch_debounce_delay,",
|
66
|
-
homing_switch_pulloff_distance: "homing_switch_pulloff_distance",
|
67
|
-
maximum_spindle_speed: "maximum_spindle_speed,",
|
68
|
-
minimum_spindle_speed: "minimum_spindle_speed,",
|
69
|
-
laser_mode_enable: "laser_mode_enable,",
|
70
|
-
x_axis_steps_per_millimeter: "x_axis_steps_per_millimeter",
|
71
|
-
y_axis_steps_per_millimeter: "y_axis_steps_per_millimeter",
|
72
|
-
z_axis_steps_per_millimeter: "z_axis_steps_per_millimeter",
|
73
|
-
x_axis_max_rate: "x_axis_max_rate",
|
74
|
-
y_axis_max_rate: "y_axis_max_rate",
|
75
|
-
z_axis_max_rate: "z_axis_max_rate",
|
76
|
-
x_axis_acceleration: "x_axis_acceleration",
|
77
|
-
y_axis_acceleration: "y_axis_acceleration",
|
78
|
-
z_axis_acceleration: "z_axis_acceleration",
|
79
|
-
x_axis_max_travel: "x_axis_max_travel",
|
80
|
-
y_axis_max_travel: "y_axis_max_travel",
|
81
|
-
z_axis_max_travel: "z_axis_max_travel",
|
82
|
-
}
|
83
|
-
|
84
|
-
|
85
|
-
class GRBLEmulator:
|
86
|
-
def __init__(
|
87
|
-
self, device=None, units_to_device_matrix=None, reply=None, channel=None
|
88
|
-
):
|
89
|
-
self.device = device
|
90
|
-
self.units_to_device_matrix = units_to_device_matrix
|
91
|
-
self.settings = {
|
92
|
-
"step_pulse_microseconds": 10, # step pulse microseconds
|
93
|
-
"step_idle_delay": 25, # step idle delay
|
94
|
-
"step_pulse_invert": 0, # step pulse invert
|
95
|
-
"step_direction_invert": 0, # step direction invert
|
96
|
-
"invert_step_enable_pin": 0, # invert step enable pin, boolean
|
97
|
-
"invert_limit_pins": 0, # invert limit pins, boolean
|
98
|
-
"invert_probe_pin": 0, # invert probe pin
|
99
|
-
"status_report_options": 255, # status report options
|
100
|
-
"junction_deviation": 0.010, # Junction deviation, mm
|
101
|
-
"arc_tolerance": 0.002, # arc tolerance, mm
|
102
|
-
"report_in_inches": 0, # Report in inches
|
103
|
-
"soft_limits_enabled": 0, # Soft limits enabled.
|
104
|
-
"hard_limits_enabled": 0, # hard limits enabled
|
105
|
-
"homing_cycle_enable": 1, # Homing cycle enable
|
106
|
-
"homing_direction_invert": 0, # Homing direction invert
|
107
|
-
"homing_locate_feed_rate": 25.000, # Homing locate feed rate, mm/min
|
108
|
-
"homing_search_seek_rate": 500.000, # Homing search seek rate, mm/min
|
109
|
-
"homing_switch_debounce_delay": 250, # Homing switch debounce delay, ms
|
110
|
-
"homing_switch_pulloff_distance": 1.000, # Homing switch pull-off distance, mm
|
111
|
-
"maximum_spindle_speed": 1000, # Maximum spindle speed, RPM
|
112
|
-
"minimum_spindle_speed": 0, # Minimum spindle speed, RPM
|
113
|
-
"laser_mode_enable": 1, # Laser mode enable, boolean
|
114
|
-
"x_axis_steps_per_millimeter": 250.000, # X-axis steps per millimeter
|
115
|
-
"y_axis_steps_per_millimeter": 250.000, # Y-axis steps per millimeter
|
116
|
-
"z_axis_steps_per_millimeter": 250.000, # Z-axis steps per millimeter
|
117
|
-
"x_axis_max_rate": 500.000, # X-axis max rate mm/min
|
118
|
-
"y_axis_max_rate": 500.000, # Y-axis max rate mm/min
|
119
|
-
"z_axis_max_rate": 500.000, # Z-axis max rate mm/min
|
120
|
-
"x_axis_acceleration": 10.000, # X-axis acceleration, mm/s^2
|
121
|
-
"y_axis_acceleration": 10.000, # Y-axis acceleration, mm/s^2
|
122
|
-
"z_axis_acceleration": 10.000, # Z-axis acceleration, mm/s^2
|
123
|
-
"x_axis_max_travel": 200.000, # X-axis max travel mm.
|
124
|
-
"y_axis_max_travel": 200.000, # Y-axis max travel mm
|
125
|
-
"z_axis_max_travel": 200.000, # Z-axis max travel mm.
|
126
|
-
}
|
127
|
-
|
128
|
-
self.speed_scale = 1.0
|
129
|
-
self.rapid_scale = 1.0
|
130
|
-
self.power_scale = 1.0
|
131
|
-
|
132
|
-
|
133
|
-
self.channel = channel
|
134
|
-
|
135
|
-
self._grbl_specific = False
|
136
|
-
|
137
|
-
self._buffer = list()
|
138
|
-
try:
|
139
|
-
driver = device.driver
|
140
|
-
except AttributeError:
|
141
|
-
driver = None
|
142
|
-
self.job = GcodeJob(
|
143
|
-
driver=driver,
|
144
|
-
priority=0,
|
145
|
-
channel=self.channel,
|
146
|
-
units_to_device_matrix=units_to_device_matrix,
|
147
|
-
)
|
148
|
-
self.
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
state =
|
178
|
-
x = self.
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
if
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
self.
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
elif c ==
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
self.
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
1
|
+
"""
|
2
|
+
GRBL Emulator
|
3
|
+
|
4
|
+
The GRBL Emulator converts our parsed Grbl/Gcode data into Driver-like calls.
|
5
|
+
"""
|
6
|
+
import re
|
7
|
+
|
8
|
+
from meerk40t.grbl.gcodejob import GcodeJob
|
9
|
+
|
10
|
+
GRBL_SET_RE = re.compile(r"\$(\d+)=([-+]?[0-9]*\.?[0-9]*)")
|
11
|
+
|
12
|
+
step_pulse_microseconds = 0
|
13
|
+
step_idle_delay = 25
|
14
|
+
step_pulse_invert = 2
|
15
|
+
step_direction_invert = 3
|
16
|
+
invert_step_enable_pin = 4
|
17
|
+
invert_limit_pins = 5
|
18
|
+
invert_probe_pin = 6
|
19
|
+
status_report_options = 10
|
20
|
+
junction_deviation = 11
|
21
|
+
arc_tolerance = 12
|
22
|
+
report_in_inches = 13
|
23
|
+
soft_limits_enabled = 20
|
24
|
+
hard_limits_enabled = 21
|
25
|
+
homing_cycle_enable = 22
|
26
|
+
homing_direction_invert = 23
|
27
|
+
homing_locate_feed_rate = 24
|
28
|
+
homing_search_seek_rate = 25
|
29
|
+
homing_switch_debounce_delay = 26
|
30
|
+
homing_switch_pulloff_distance = 27
|
31
|
+
maximum_spindle_speed = 30
|
32
|
+
minimum_spindle_speed = 31
|
33
|
+
laser_mode_enable = 32
|
34
|
+
x_axis_steps_per_millimeter = 100
|
35
|
+
y_axis_steps_per_millimeter = 101
|
36
|
+
z_axis_steps_per_millimeter = 102
|
37
|
+
x_axis_max_rate = 110
|
38
|
+
y_axis_max_rate = 111
|
39
|
+
z_axis_max_rate = 112
|
40
|
+
x_axis_acceleration = 120
|
41
|
+
y_axis_acceleration = 121
|
42
|
+
z_axis_acceleration = 122
|
43
|
+
x_axis_max_travel = 130
|
44
|
+
y_axis_max_travel = 131
|
45
|
+
z_axis_max_travel = 132
|
46
|
+
|
47
|
+
lookup = {
|
48
|
+
step_pulse_microseconds: "step_pulse_microseconds",
|
49
|
+
step_idle_delay: "step_idle_delay",
|
50
|
+
step_pulse_invert: "step_pulse_invert",
|
51
|
+
step_direction_invert: "step_direction_invert",
|
52
|
+
invert_step_enable_pin: "invert_step_enable_pin",
|
53
|
+
invert_limit_pins: "invert_limit_pins",
|
54
|
+
invert_probe_pin: "invert_probe_pin",
|
55
|
+
status_report_options: "status_report_options",
|
56
|
+
junction_deviation: "junction_deviation",
|
57
|
+
arc_tolerance: "arc_tolerance",
|
58
|
+
report_in_inches: "report_in_inches",
|
59
|
+
soft_limits_enabled: "soft_limits_enabled",
|
60
|
+
hard_limits_enabled: "hard_limits_enabled",
|
61
|
+
homing_cycle_enable: "homing_cycle_enable",
|
62
|
+
homing_direction_invert: "homing_direction_invert",
|
63
|
+
homing_locate_feed_rate: "homing_locate_feed_rate,",
|
64
|
+
homing_search_seek_rate: "homing_search_seek_rate",
|
65
|
+
homing_switch_debounce_delay: "homing_switch_debounce_delay,",
|
66
|
+
homing_switch_pulloff_distance: "homing_switch_pulloff_distance",
|
67
|
+
maximum_spindle_speed: "maximum_spindle_speed,",
|
68
|
+
minimum_spindle_speed: "minimum_spindle_speed,",
|
69
|
+
laser_mode_enable: "laser_mode_enable,",
|
70
|
+
x_axis_steps_per_millimeter: "x_axis_steps_per_millimeter",
|
71
|
+
y_axis_steps_per_millimeter: "y_axis_steps_per_millimeter",
|
72
|
+
z_axis_steps_per_millimeter: "z_axis_steps_per_millimeter",
|
73
|
+
x_axis_max_rate: "x_axis_max_rate",
|
74
|
+
y_axis_max_rate: "y_axis_max_rate",
|
75
|
+
z_axis_max_rate: "z_axis_max_rate",
|
76
|
+
x_axis_acceleration: "x_axis_acceleration",
|
77
|
+
y_axis_acceleration: "y_axis_acceleration",
|
78
|
+
z_axis_acceleration: "z_axis_acceleration",
|
79
|
+
x_axis_max_travel: "x_axis_max_travel",
|
80
|
+
y_axis_max_travel: "y_axis_max_travel",
|
81
|
+
z_axis_max_travel: "z_axis_max_travel",
|
82
|
+
}
|
83
|
+
|
84
|
+
|
85
|
+
class GRBLEmulator:
|
86
|
+
def __init__(
|
87
|
+
self, device=None, units_to_device_matrix=None, reply=None, channel=None
|
88
|
+
):
|
89
|
+
self.device = device
|
90
|
+
self.units_to_device_matrix = units_to_device_matrix
|
91
|
+
self.settings = {
|
92
|
+
"step_pulse_microseconds": 10, # step pulse microseconds
|
93
|
+
"step_idle_delay": 25, # step idle delay
|
94
|
+
"step_pulse_invert": 0, # step pulse invert
|
95
|
+
"step_direction_invert": 0, # step direction invert
|
96
|
+
"invert_step_enable_pin": 0, # invert step enable pin, boolean
|
97
|
+
"invert_limit_pins": 0, # invert limit pins, boolean
|
98
|
+
"invert_probe_pin": 0, # invert probe pin
|
99
|
+
"status_report_options": 255, # status report options
|
100
|
+
"junction_deviation": 0.010, # Junction deviation, mm
|
101
|
+
"arc_tolerance": 0.002, # arc tolerance, mm
|
102
|
+
"report_in_inches": 0, # Report in inches
|
103
|
+
"soft_limits_enabled": 0, # Soft limits enabled.
|
104
|
+
"hard_limits_enabled": 0, # hard limits enabled
|
105
|
+
"homing_cycle_enable": 1, # Homing cycle enable
|
106
|
+
"homing_direction_invert": 0, # Homing direction invert
|
107
|
+
"homing_locate_feed_rate": 25.000, # Homing locate feed rate, mm/min
|
108
|
+
"homing_search_seek_rate": 500.000, # Homing search seek rate, mm/min
|
109
|
+
"homing_switch_debounce_delay": 250, # Homing switch debounce delay, ms
|
110
|
+
"homing_switch_pulloff_distance": 1.000, # Homing switch pull-off distance, mm
|
111
|
+
"maximum_spindle_speed": 1000, # Maximum spindle speed, RPM
|
112
|
+
"minimum_spindle_speed": 0, # Minimum spindle speed, RPM
|
113
|
+
"laser_mode_enable": 1, # Laser mode enable, boolean
|
114
|
+
"x_axis_steps_per_millimeter": 250.000, # X-axis steps per millimeter
|
115
|
+
"y_axis_steps_per_millimeter": 250.000, # Y-axis steps per millimeter
|
116
|
+
"z_axis_steps_per_millimeter": 250.000, # Z-axis steps per millimeter
|
117
|
+
"x_axis_max_rate": 500.000, # X-axis max rate mm/min
|
118
|
+
"y_axis_max_rate": 500.000, # Y-axis max rate mm/min
|
119
|
+
"z_axis_max_rate": 500.000, # Z-axis max rate mm/min
|
120
|
+
"x_axis_acceleration": 10.000, # X-axis acceleration, mm/s^2
|
121
|
+
"y_axis_acceleration": 10.000, # Y-axis acceleration, mm/s^2
|
122
|
+
"z_axis_acceleration": 10.000, # Z-axis acceleration, mm/s^2
|
123
|
+
"x_axis_max_travel": 200.000, # X-axis max travel mm.
|
124
|
+
"y_axis_max_travel": 200.000, # Y-axis max travel mm
|
125
|
+
"z_axis_max_travel": 200.000, # Z-axis max travel mm.
|
126
|
+
}
|
127
|
+
|
128
|
+
self.speed_scale = 1.0
|
129
|
+
self.rapid_scale = 1.0
|
130
|
+
self.power_scale = 1.0
|
131
|
+
self._reply = None
|
132
|
+
|
133
|
+
self.channel = channel
|
134
|
+
|
135
|
+
self._grbl_specific = False
|
136
|
+
|
137
|
+
self._buffer = list()
|
138
|
+
try:
|
139
|
+
driver = device.driver
|
140
|
+
except AttributeError:
|
141
|
+
driver = None
|
142
|
+
self.job = GcodeJob(
|
143
|
+
driver=driver,
|
144
|
+
priority=0,
|
145
|
+
channel=self.channel,
|
146
|
+
units_to_device_matrix=units_to_device_matrix,
|
147
|
+
)
|
148
|
+
self.reply = reply
|
149
|
+
|
150
|
+
@property
|
151
|
+
def reply(self):
|
152
|
+
return self._reply
|
153
|
+
|
154
|
+
@reply.setter
|
155
|
+
def reply(self, value):
|
156
|
+
self._reply = value
|
157
|
+
self.job.reply = value
|
158
|
+
|
159
|
+
def __repr__(self):
|
160
|
+
return "GRBLInterpreter()"
|
161
|
+
|
162
|
+
def reply_code(self, cmd):
|
163
|
+
if cmd == -1:
|
164
|
+
# Do not reply.
|
165
|
+
return
|
166
|
+
if cmd == 0: # Execute GCode.
|
167
|
+
if self.reply:
|
168
|
+
self.reply("ok\r\n")
|
169
|
+
else:
|
170
|
+
if self.reply:
|
171
|
+
self.reply(f"error:{cmd}\r\n")
|
172
|
+
|
173
|
+
def status_update(self):
|
174
|
+
# TODO: This should reference only the driver.status.
|
175
|
+
# Idle, Run, Hold, Jog, Alarm, Door, Check, Home, Sleep
|
176
|
+
try:
|
177
|
+
pos, state, minor = self.device.driver.status()
|
178
|
+
x, y = self.units_to_device_matrix.point_in_inverse_space(pos)
|
179
|
+
z = 0.0
|
180
|
+
if state == "busy":
|
181
|
+
state = "Run"
|
182
|
+
elif state == "hold":
|
183
|
+
state = "Hold"
|
184
|
+
else:
|
185
|
+
state = "Idle"
|
186
|
+
f = self.device.driver.speed
|
187
|
+
s = self.device.driver.power
|
188
|
+
except AttributeError:
|
189
|
+
state = "Idle"
|
190
|
+
x = self.job.x
|
191
|
+
y = self.job.y
|
192
|
+
z = self.job.z
|
193
|
+
f = 0
|
194
|
+
s = 0
|
195
|
+
x /= self.job.scale
|
196
|
+
y /= self.job.scale
|
197
|
+
return f"<{state}|MPos:{x:.3f},{y:.3f},{z:.3f}|FS:{f},{s}>\r\n"
|
198
|
+
|
199
|
+
def write(self, data):
|
200
|
+
"""
|
201
|
+
Process data written to the parser. This is any gcode data realtime commands, grbl-specific commands,
|
202
|
+
or gcode itself.
|
203
|
+
|
204
|
+
@param data:
|
205
|
+
@return:
|
206
|
+
"""
|
207
|
+
# import time
|
208
|
+
# if not hasattr(self, "ignore"):
|
209
|
+
# self.ignore = time.time()
|
210
|
+
# return
|
211
|
+
# else:
|
212
|
+
# if self.ignore + 5 > time.time():
|
213
|
+
# return
|
214
|
+
|
215
|
+
if isinstance(data, str):
|
216
|
+
data = data.encode()
|
217
|
+
# print (f"Write received: {data}")
|
218
|
+
for c in data:
|
219
|
+
# Process and extract any realtime grbl commands.
|
220
|
+
if c == ord("?"):
|
221
|
+
if self.reply:
|
222
|
+
self.reply(self.status_update())
|
223
|
+
elif c == ord("~"):
|
224
|
+
try:
|
225
|
+
self.device.driver.resume()
|
226
|
+
except AttributeError:
|
227
|
+
pass
|
228
|
+
elif c == ord("!"):
|
229
|
+
try:
|
230
|
+
self.device.driver.pause()
|
231
|
+
except AttributeError:
|
232
|
+
pass
|
233
|
+
elif c in (13, 10): # "\r","\n"
|
234
|
+
# Process CRLF endlines
|
235
|
+
line = "".join(self._buffer)
|
236
|
+
# GRBL Specific commands, will not be passed to the GCodeJob
|
237
|
+
# and need hence to provide their own reply_code, any command
|
238
|
+
# passed to the GCodeJob will send the reply within the
|
239
|
+
# job execution.
|
240
|
+
if self._grbl_specific:
|
241
|
+
self._grbl_specific = False
|
242
|
+
self.reply_code(self._grbl_special(line))
|
243
|
+
else:
|
244
|
+
self.job.write(line)
|
245
|
+
try:
|
246
|
+
self.device.spooler.send(self.job, prevent_duplicate=True)
|
247
|
+
except AttributeError as e:
|
248
|
+
# print (f"Execute encountered error: {e}")
|
249
|
+
self.job.execute(None)
|
250
|
+
# self.reply_code(0)
|
251
|
+
self._buffer.clear()
|
252
|
+
elif c == 0x08:
|
253
|
+
# Process Backspaces.
|
254
|
+
if self._buffer:
|
255
|
+
del self._buffer[-1]
|
256
|
+
elif c == 0x18:
|
257
|
+
try:
|
258
|
+
self.device.driver.reset()
|
259
|
+
except AttributeError:
|
260
|
+
pass
|
261
|
+
self._buffer.clear()
|
262
|
+
if self.reply:
|
263
|
+
self.reply(
|
264
|
+
"Grbl 1.1f ['$' for help]\r\n" "[MSG:’$H’|’$X’ to unlock]\r\n"
|
265
|
+
)
|
266
|
+
elif c > 0x80:
|
267
|
+
if c == 0x84:
|
268
|
+
# Safety Door
|
269
|
+
pass
|
270
|
+
elif c == 0x85:
|
271
|
+
try:
|
272
|
+
self.device.driver.jog_abort()
|
273
|
+
except AttributeError:
|
274
|
+
pass
|
275
|
+
elif c == 0x90:
|
276
|
+
self.speed_scale = 1.0
|
277
|
+
try:
|
278
|
+
self.device.driver.set("speed_factor", self.speed_scale)
|
279
|
+
except AttributeError:
|
280
|
+
pass
|
281
|
+
elif c == 0x91:
|
282
|
+
self.speed_scale *= 1.1
|
283
|
+
try:
|
284
|
+
self.device.driver.set("speed_factor", self.speed_scale)
|
285
|
+
except AttributeError:
|
286
|
+
pass
|
287
|
+
elif c == 0x92:
|
288
|
+
self.speed_scale *= 0.9
|
289
|
+
try:
|
290
|
+
self.device.driver.set("speed_factor", self.speed_scale)
|
291
|
+
except AttributeError:
|
292
|
+
pass
|
293
|
+
elif c == 0x93:
|
294
|
+
self.speed_scale *= 1.01
|
295
|
+
try:
|
296
|
+
self.device.driver.set("speed_factor", self.speed_scale)
|
297
|
+
except AttributeError:
|
298
|
+
pass
|
299
|
+
elif c == 0x94:
|
300
|
+
self.speed_scale *= 0.99
|
301
|
+
try:
|
302
|
+
self.device.driver.set("speed_factor", self.speed_scale)
|
303
|
+
except AttributeError:
|
304
|
+
pass
|
305
|
+
elif c == 0x95:
|
306
|
+
self.rapid_scale = 1.0
|
307
|
+
try:
|
308
|
+
self.device.driver.set("rapid_factor", self.rapid_scale)
|
309
|
+
except AttributeError:
|
310
|
+
pass
|
311
|
+
elif c == 0x96:
|
312
|
+
self.rapid_scale = 0.5
|
313
|
+
try:
|
314
|
+
self.device.driver.set("rapid_factor", self.rapid_scale)
|
315
|
+
except AttributeError:
|
316
|
+
pass
|
317
|
+
elif c == 0x97:
|
318
|
+
self.rapid_scale = 0.25
|
319
|
+
try:
|
320
|
+
self.device.driver.set("rapid_factor", self.rapid_scale)
|
321
|
+
except AttributeError:
|
322
|
+
pass
|
323
|
+
elif c == 0x99:
|
324
|
+
self.power_scale = 1.0
|
325
|
+
try:
|
326
|
+
self.device.driver.set("power_factor", self.power_scale)
|
327
|
+
except AttributeError:
|
328
|
+
pass
|
329
|
+
elif c == 0x9A:
|
330
|
+
self.power_scale *= 1.1
|
331
|
+
try:
|
332
|
+
self.device.driver.set("power_factor", self.power_scale)
|
333
|
+
except AttributeError:
|
334
|
+
pass
|
335
|
+
elif c == 0x9B:
|
336
|
+
self.power_scale *= 0.9
|
337
|
+
try:
|
338
|
+
self.device.driver.set("power_factor", self.power_scale)
|
339
|
+
except AttributeError:
|
340
|
+
pass
|
341
|
+
elif c == 0x9C:
|
342
|
+
self.power_scale *= 1.01
|
343
|
+
try:
|
344
|
+
self.device.driver.set("power_factor", self.power_scale)
|
345
|
+
except AttributeError:
|
346
|
+
pass
|
347
|
+
elif c == 0x9D:
|
348
|
+
self.power_scale *= 0.99
|
349
|
+
try:
|
350
|
+
self.device.driver.set("power_factor", self.power_scale)
|
351
|
+
except AttributeError:
|
352
|
+
pass
|
353
|
+
elif c == 0x9E:
|
354
|
+
# Toggle Spindle Stop
|
355
|
+
pass
|
356
|
+
elif c == 0xA0:
|
357
|
+
# Toggle Flood Coolant
|
358
|
+
pass
|
359
|
+
elif c == 0xA1:
|
360
|
+
# Toggle Mist Coolant
|
361
|
+
# So let's see what we can do:
|
362
|
+
self.device.kernel.root.coolant.coolant_toggle(self.device)
|
363
|
+
elif c == ord("$"):
|
364
|
+
if not self._buffer:
|
365
|
+
# First character is "$" this is special grbl.
|
366
|
+
self._grbl_specific = True
|
367
|
+
self._buffer.append(chr(c))
|
368
|
+
else:
|
369
|
+
self._buffer.append(chr(c))
|
370
|
+
|
371
|
+
def _grbl_special(self, data):
|
372
|
+
"""
|
373
|
+
GRBL special commands are commands beginning with $ that do purely grbl specific things.
|
374
|
+
|
375
|
+
@param data:
|
376
|
+
@return:
|
377
|
+
"""
|
378
|
+
if data == "$":
|
379
|
+
if self.reply:
|
380
|
+
self.reply(
|
381
|
+
"[HLP:$$ $# $G $I $N $x=val $Nx=line $J=line $SLP $C $X $H ~ ! ? ctrl-x]\r\n"
|
382
|
+
)
|
383
|
+
return 0
|
384
|
+
elif data == "$$":
|
385
|
+
for s in lookup:
|
386
|
+
v = self.settings.get(lookup[s], 0)
|
387
|
+
if isinstance(v, int):
|
388
|
+
if self.reply:
|
389
|
+
self.reply("$%d=%d\r\n" % (s, v))
|
390
|
+
elif isinstance(v, float):
|
391
|
+
if self.reply:
|
392
|
+
self.reply("$%d=%.3f\r\n" % (s, v))
|
393
|
+
# if self.reply:
|
394
|
+
# self.reply("$298=donut\r\n")
|
395
|
+
# self.reply("$299=\r\n")
|
396
|
+
return 0
|
397
|
+
if GRBL_SET_RE.match(data):
|
398
|
+
settings = list(GRBL_SET_RE.findall(data))[0]
|
399
|
+
index = settings[0]
|
400
|
+
value = settings[1]
|
401
|
+
try:
|
402
|
+
name = lookup[index]
|
403
|
+
c = self.settings[name]
|
404
|
+
except KeyError:
|
405
|
+
return 3
|
406
|
+
if isinstance(c, float):
|
407
|
+
self.settings[name] = float(value)
|
408
|
+
else:
|
409
|
+
self.settings[name] = int(value)
|
410
|
+
return 0
|
411
|
+
elif data == "$I":
|
412
|
+
# View Build Info
|
413
|
+
return 0
|
414
|
+
elif data == "$#":
|
415
|
+
if self.reply:
|
416
|
+
data = [
|
417
|
+
"[G54:0.000,0.000,0.000]",
|
418
|
+
"[G55:0.000,0.000,0.000]",
|
419
|
+
"[G56:0.000,0.000,0.000]",
|
420
|
+
"[G57:0.000,0.000,0.000]",
|
421
|
+
"[G58:0.000,0.000,0.000]",
|
422
|
+
"[G59:0.000,0.000,0.000]",
|
423
|
+
"[G28:0.000,0.000,0.000]",
|
424
|
+
"[G30:0.000,0.000,0.000]",
|
425
|
+
"[G92:0.000,0.000,0.000]",
|
426
|
+
"[TLO:0.000]",
|
427
|
+
"[PRB:0.000,0.000,0.000:0]",
|
428
|
+
"",
|
429
|
+
]
|
430
|
+
self.reply("\r\n".join(data))
|
431
|
+
return 0
|
432
|
+
elif data == "$G":
|
433
|
+
# View GCode Parser state
|
434
|
+
if self.reply:
|
435
|
+
job = self.job
|
436
|
+
modals = list()
|
437
|
+
# G0 G54 G17 G21 G90 G94 M5 M9 T0 F0 S0
|
438
|
+
modals.append(f"G{job.move_mode}")
|
439
|
+
modals.append("G54") # default coord system.
|
440
|
+
modals.append("G17") # XY plane
|
441
|
+
modals.append("G21" if job.units == "mm" else "G20") # MM data.
|
442
|
+
modals.append("G91" if job.relative else "G90")
|
443
|
+
modals.append(
|
444
|
+
"G94" if job.feed_desc in ("inch/min", "mm/min") else "G93"
|
445
|
+
)
|
446
|
+
modals.append("M5") # Not currently in a program job.
|
447
|
+
modals.append("M9") # Mist cooling.
|
448
|
+
modals.append("T0") # Tool 0
|
449
|
+
modals.append(f"F{int(job.get_feed_rate())}")
|
450
|
+
modals.append(f"S{int(job.get_power_rate())}")
|
451
|
+
|
452
|
+
modes = " ".join(modals)
|
453
|
+
self.reply(f"[GC:{modes}]\r\n")
|
454
|
+
return 0
|
455
|
+
elif data == "$N":
|
456
|
+
# View saved start up code.
|
457
|
+
return 3
|
458
|
+
elif data == "$H":
|
459
|
+
if not self.settings["homing_cycle_enable"]:
|
460
|
+
return 5 # Homing cycle not enabled by settings.
|
461
|
+
try:
|
462
|
+
self.device.driver.physical_home()
|
463
|
+
except AttributeError:
|
464
|
+
pass
|
465
|
+
try:
|
466
|
+
self.device.driver.move_abs(0, 0)
|
467
|
+
except AttributeError:
|
468
|
+
pass
|
469
|
+
return 0
|
470
|
+
elif data.startswith("$J="):
|
471
|
+
"""
|
472
|
+
$Jx=line - Run jogging motion
|
473
|
+
|
474
|
+
New to Grbl v1.1, this command will execute a special jogging motion. There are three main
|
475
|
+
differences between a jogging motion and a motion commanded by a g-code line.
|
476
|
+
|
477
|
+
Like normal g-code commands, several jog motions may be queued into the planner buffer,
|
478
|
+
but the jogging can be easily canceled by a jog-cancel or feed-hold real-time command.
|
479
|
+
Grbl will immediately hold the current jog and then automatically purge the buffers
|
480
|
+
of any remaining commands.
|
481
|
+
Jog commands are completely independent of the g-code parser state. It will not change
|
482
|
+
any modes like G91 incremental distance mode. So, you no longer have to make sure
|
483
|
+
that you change it back to G90 absolute distance mode afterwards. This helps reduce
|
484
|
+
the chance of starting with the wrong g-code modes enabled.
|
485
|
+
If soft-limits are enabled, any jog command that exceeds a soft-limit will simply
|
486
|
+
return an error. It will not throw an alarm as it would with a normal g-code command.
|
487
|
+
This allows for a much more enjoyable and fluid GUI or joystick interaction.
|
488
|
+
|
489
|
+
Executing a jog requires a specific command structure, as described below:
|
490
|
+
|
491
|
+
The first three characters must be '$J=' to indicate the jog.
|
492
|
+
|
493
|
+
The jog command follows immediate after the '=' and works like a normal G1 command.
|
494
|
+
|
495
|
+
Feed rate is only interpreted in G94 units per minute. A prior G93 state is
|
496
|
+
ignored during jog.
|
497
|
+
|
498
|
+
Required words:
|
499
|
+
XYZ: One or more axis words with target value.
|
500
|
+
F - Feed rate value. NOTE: Each jog requires this value and is not treated as modal.
|
501
|
+
|
502
|
+
Optional words: Jog executes based on current G20/G21 and G90/G91 g-code parser state.
|
503
|
+
If one of the following optional words is passed, that state is overridden for one command only.
|
504
|
+
G20 or G21 - Inch and millimeter mode
|
505
|
+
G90 or G91 - Absolute and incremental distances
|
506
|
+
G53 - Move in machine coordinates
|
507
|
+
|
508
|
+
All other g-codes, m-codes, and value words are not accepted in the jog command.
|
509
|
+
|
510
|
+
Spaces and comments are allowed in the command. These are removed by the pre-parser.
|
511
|
+
|
512
|
+
Example: G21 and G90 are active modal states prior to jogging. These are sequential commands.
|
513
|
+
$J=X10.0 Y-1.5 will move to X=10.0mm and Y=-1.5mm in work coordinate frame (WPos).
|
514
|
+
$J=G91 G20 X0.5 will move +0.5 inches (12.7mm) to X=22.7mm (WPos).
|
515
|
+
Note that G91 and G20 are only applied to this jog command.
|
516
|
+
$J=G53 Y5.0 will move the machine to Y=5.0mm in the machine coordinate frame (MPos).
|
517
|
+
If the work coordinate offset for the y-axis is 2.0mm, then Y is 3.0mm in (WPos).
|
518
|
+
|
519
|
+
Jog commands behave almost identically to normal g-code streaming. Every jog command
|
520
|
+
will return an 'ok' when the jogging motion has been parsed and is setup for execution.
|
521
|
+
If a command is not valid or exceeds a soft-limit, Grbl will return an 'error:'.
|
522
|
+
Multiple jogging commands may be queued in sequence.
|
523
|
+
"""
|
524
|
+
data = data[3:]
|
525
|
+
# self._process_gcode(data, jog=True)
|
526
|
+
return 3 # not yet supported
|
527
|
+
elif data == "$X":
|
528
|
+
if self.reply:
|
529
|
+
self.reply("Alarm status was cleared\r\n")
|
530
|
+
return 0
|
531
|
+
else:
|
532
|
+
return 3 # GRBL '$' system command was not recognized or supported.
|