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/ruida/driver.py
CHANGED
@@ -1,472 +1,534 @@
|
|
1
|
-
"""
|
2
|
-
Ruida Driver
|
3
|
-
|
4
|
-
The Driver has a set of different commands which are sent and utilizes those which can be performed by this driver.
|
5
|
-
"""
|
6
|
-
import time
|
7
|
-
|
8
|
-
from meerk40t.core.cutcode.cubiccut import CubicCut
|
9
|
-
from meerk40t.core.cutcode.dwellcut import DwellCut
|
10
|
-
from meerk40t.core.cutcode.gotocut import GotoCut
|
11
|
-
from meerk40t.core.cutcode.homecut import HomeCut
|
12
|
-
from meerk40t.core.cutcode.inputcut import InputCut
|
13
|
-
from meerk40t.core.cutcode.linecut import LineCut
|
14
|
-
from meerk40t.core.cutcode.outputcut import OutputCut
|
15
|
-
from meerk40t.core.cutcode.plotcut import PlotCut
|
16
|
-
from meerk40t.core.cutcode.quadcut import QuadCut
|
17
|
-
from meerk40t.core.cutcode.waitcut import WaitCut
|
18
|
-
from meerk40t.
|
19
|
-
from meerk40t.core.
|
20
|
-
from meerk40t.
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
self.
|
29
|
-
|
30
|
-
self.
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
self.
|
36
|
-
self.
|
37
|
-
|
38
|
-
self.
|
39
|
-
|
40
|
-
|
41
|
-
self.
|
42
|
-
|
43
|
-
|
44
|
-
self.
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
self.
|
60
|
-
|
61
|
-
def
|
62
|
-
self.
|
63
|
-
|
64
|
-
def
|
65
|
-
self.
|
66
|
-
|
67
|
-
def
|
68
|
-
self.
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
"""
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
""
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
@
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
"""
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
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
|
-
|
178
|
-
|
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
|
-
elif isinstance(q,
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
pass
|
233
|
-
elif isinstance(q,
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
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
|
-
self.
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
self.service.
|
326
|
-
|
327
|
-
|
328
|
-
)
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
self.
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
self.
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
@return:
|
364
|
-
"""
|
365
|
-
|
366
|
-
|
367
|
-
def
|
368
|
-
"""
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
def
|
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
|
-
This command asks that
|
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
|
-
self.service
|
435
|
-
|
436
|
-
def
|
437
|
-
"""
|
438
|
-
Wants
|
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
|
-
|
1
|
+
"""
|
2
|
+
Ruida Driver
|
3
|
+
|
4
|
+
The Driver has a set of different commands which are sent and utilizes those which can be performed by this driver.
|
5
|
+
"""
|
6
|
+
import time
|
7
|
+
|
8
|
+
from meerk40t.core.cutcode.cubiccut import CubicCut
|
9
|
+
from meerk40t.core.cutcode.dwellcut import DwellCut
|
10
|
+
from meerk40t.core.cutcode.gotocut import GotoCut
|
11
|
+
from meerk40t.core.cutcode.homecut import HomeCut
|
12
|
+
from meerk40t.core.cutcode.inputcut import InputCut
|
13
|
+
from meerk40t.core.cutcode.linecut import LineCut
|
14
|
+
from meerk40t.core.cutcode.outputcut import OutputCut
|
15
|
+
from meerk40t.core.cutcode.plotcut import PlotCut
|
16
|
+
from meerk40t.core.cutcode.quadcut import QuadCut
|
17
|
+
from meerk40t.core.cutcode.waitcut import WaitCut
|
18
|
+
from meerk40t.device.basedevice import PLOT_FINISH, PLOT_JOG, PLOT_RAPID, PLOT_SETTING
|
19
|
+
from meerk40t.core.parameters import Parameters
|
20
|
+
from meerk40t.core.plotplanner import PlotPlanner
|
21
|
+
from meerk40t.ruida.controller import RuidaController
|
22
|
+
from meerk40t.tools.geomstr import Geomstr
|
23
|
+
|
24
|
+
|
25
|
+
class RuidaDriver(Parameters):
|
26
|
+
def __init__(self, service, **kwargs):
|
27
|
+
super().__init__(**kwargs)
|
28
|
+
self.service = service
|
29
|
+
self.native_x = 0
|
30
|
+
self.native_y = 0
|
31
|
+
self.name = str(self.service)
|
32
|
+
|
33
|
+
name = self.service.safe_label
|
34
|
+
send = service.channel(f"{name}/send")
|
35
|
+
self.controller = RuidaController(self.service, send)
|
36
|
+
self.controller.job.set_magic(service.magic)
|
37
|
+
|
38
|
+
self.recv = service.channel(f"{name}/recv", pure=True)
|
39
|
+
self.recv.watch(self.controller.recv)
|
40
|
+
|
41
|
+
self.on_value = 0
|
42
|
+
self.power_dirty = True
|
43
|
+
self.speed_dirty = True
|
44
|
+
self.absolute_dirty = True
|
45
|
+
self._absolute = True
|
46
|
+
self.paused = False
|
47
|
+
self.is_relative = False
|
48
|
+
self.laser = False
|
49
|
+
|
50
|
+
self._shutdown = False
|
51
|
+
|
52
|
+
self.queue = list()
|
53
|
+
self._queue_current = 0
|
54
|
+
self._queue_total = 0
|
55
|
+
self.plot_planner = PlotPlanner(
|
56
|
+
dict(), single=True, ppi=False, shift=False, group=True
|
57
|
+
)
|
58
|
+
self._aborting = False
|
59
|
+
self._signal_updates = self.service.setting(bool, "signal_updates", True)
|
60
|
+
|
61
|
+
def __repr__(self):
|
62
|
+
return f"RuidaDriver({self.name})"
|
63
|
+
|
64
|
+
def get_internal_queue_status(self):
|
65
|
+
return self._queue_current, self._queue_total
|
66
|
+
|
67
|
+
def _set_queue_status(self, current, total):
|
68
|
+
self._queue_current = current
|
69
|
+
self._queue_total = total
|
70
|
+
|
71
|
+
#############
|
72
|
+
# DRIVER COMMANDS
|
73
|
+
#############
|
74
|
+
|
75
|
+
def job_start(self, job):
|
76
|
+
pass
|
77
|
+
|
78
|
+
def job_finish(self, job):
|
79
|
+
pass
|
80
|
+
|
81
|
+
def hold_work(self, priority):
|
82
|
+
"""
|
83
|
+
This is checked by the spooler to see if we should hold any work from being processed from the work queue.
|
84
|
+
|
85
|
+
For example if we pause, we don't want it trying to call some functions. Only priority jobs will execute if
|
86
|
+
we hold the work queue. This is so that "resume" commands can be processed.
|
87
|
+
|
88
|
+
@return:
|
89
|
+
"""
|
90
|
+
return priority <= 0 and self.paused
|
91
|
+
|
92
|
+
def get(self, key, default=None):
|
93
|
+
"""
|
94
|
+
Required.
|
95
|
+
|
96
|
+
@param key: Key to get.
|
97
|
+
@param default: Default value to use.
|
98
|
+
@return:
|
99
|
+
"""
|
100
|
+
return default
|
101
|
+
|
102
|
+
def set(self, key, value):
|
103
|
+
"""
|
104
|
+
Required.
|
105
|
+
|
106
|
+
Sets a laser parameter this could be speed, power, wobble, number_of_unicorns, or any unknown parameters for
|
107
|
+
yet to be written drivers.
|
108
|
+
|
109
|
+
@param key:
|
110
|
+
@param value:
|
111
|
+
@return:
|
112
|
+
"""
|
113
|
+
|
114
|
+
def status(self):
|
115
|
+
"""
|
116
|
+
Wants a status report of what the driver is doing.
|
117
|
+
@return:
|
118
|
+
"""
|
119
|
+
state_major, state_minor = self.controller.state
|
120
|
+
return (self.native_x, self.native_y), state_major, state_minor
|
121
|
+
|
122
|
+
def laser_off(self, *values):
|
123
|
+
"""
|
124
|
+
This command expects to stop pulsing the laser in place.
|
125
|
+
|
126
|
+
@param values:
|
127
|
+
@return:
|
128
|
+
"""
|
129
|
+
self.laser = False
|
130
|
+
|
131
|
+
def laser_on(self, *values):
|
132
|
+
"""
|
133
|
+
This command expects to start pulsing the laser in place.
|
134
|
+
|
135
|
+
@param values:
|
136
|
+
@return:
|
137
|
+
"""
|
138
|
+
self.laser = True
|
139
|
+
|
140
|
+
def plot(self, plot):
|
141
|
+
"""
|
142
|
+
This command is called with bits of cutcode as they are processed through the spooler. This should be optimized
|
143
|
+
bits of cutcode data with settings on them from paths etc.
|
144
|
+
|
145
|
+
@param plot:
|
146
|
+
@return:
|
147
|
+
"""
|
148
|
+
self.queue.append(plot)
|
149
|
+
|
150
|
+
def plot_start(self):
|
151
|
+
"""
|
152
|
+
Called at the end of plot commands to ensure the driver can deal with them all as a group.
|
153
|
+
|
154
|
+
@return:
|
155
|
+
"""
|
156
|
+
# Write layer header information.
|
157
|
+
self.controller.start_record()
|
158
|
+
self.controller.job.write_header(self.queue)
|
159
|
+
first = True
|
160
|
+
last_settings = None
|
161
|
+
total = len(self.queue)
|
162
|
+
current = 0
|
163
|
+
for q in self.queue:
|
164
|
+
current += 1
|
165
|
+
self._set_queue_status(current, total)
|
166
|
+
if hasattr(q, "settings"):
|
167
|
+
current_settings = q.settings
|
168
|
+
if current_settings is not last_settings:
|
169
|
+
self.controller.job.write_settings(current_settings)
|
170
|
+
last_settings = current_settings
|
171
|
+
|
172
|
+
x = self.native_x
|
173
|
+
y = self.native_y
|
174
|
+
start_x, start_y = q.start
|
175
|
+
if x != start_x or y != start_y or first:
|
176
|
+
self.on_value = 0
|
177
|
+
self.power_dirty = True
|
178
|
+
|
179
|
+
first = False
|
180
|
+
self._move(start_x, start_y, cut=False)
|
181
|
+
if self.on_value != 1.0:
|
182
|
+
self.power_dirty = True
|
183
|
+
self.on_value = 1.0
|
184
|
+
# Default-Values?!
|
185
|
+
qpower = q.settings.get("power", self.power)
|
186
|
+
qspeed = q.settings.get("speed", self.speed)
|
187
|
+
qraster_step_x = q.settings.get("raster_step_x")
|
188
|
+
qraster_step_y = q.settings.get("raster_step_y")
|
189
|
+
if qpower != self.power:
|
190
|
+
self.set("power", qpower)
|
191
|
+
if (
|
192
|
+
qspeed != self.speed
|
193
|
+
or qraster_step_x != self.raster_step_x
|
194
|
+
or qraster_step_y != self.raster_step_y
|
195
|
+
):
|
196
|
+
self.set("speed", qspeed)
|
197
|
+
self.settings.update(q.settings)
|
198
|
+
if isinstance(q, LineCut):
|
199
|
+
self._move(*q.end, cut=True)
|
200
|
+
elif isinstance(q, QuadCut):
|
201
|
+
interp = self.service.interpolate
|
202
|
+
g = Geomstr()
|
203
|
+
g.quad(complex(*q.start), complex(*q.c()), complex(*q.end))
|
204
|
+
for p in list(g.as_equal_interpolated_points(distance=interp))[1:]:
|
205
|
+
while self.paused:
|
206
|
+
time.sleep(0.05)
|
207
|
+
self._move(p.real, p.imag, cut=True)
|
208
|
+
elif isinstance(q, CubicCut):
|
209
|
+
interp = self.service.interpolate
|
210
|
+
g = Geomstr()
|
211
|
+
g.cubic(
|
212
|
+
complex(*q.start),
|
213
|
+
complex(*q.c1()),
|
214
|
+
complex(*q.c2()),
|
215
|
+
complex(*q.end),
|
216
|
+
)
|
217
|
+
for p in list(g.as_equal_interpolated_points(distance=interp))[1:]:
|
218
|
+
while self.paused:
|
219
|
+
time.sleep(0.05)
|
220
|
+
self._move(p.real, p.imag, cut=True)
|
221
|
+
elif isinstance(q, WaitCut):
|
222
|
+
self.controller.job.add_delay(q.dwell_time)
|
223
|
+
elif isinstance(q, HomeCut):
|
224
|
+
self.home()
|
225
|
+
elif isinstance(q, GotoCut):
|
226
|
+
start = q.start
|
227
|
+
self._move(start[0], start[1], cut=True)
|
228
|
+
elif isinstance(q, DwellCut):
|
229
|
+
self.controller.job.laser_interval(q.dwell_time)
|
230
|
+
elif isinstance(q, (InputCut, OutputCut)):
|
231
|
+
# Ruida has no core GPIO functionality
|
232
|
+
pass
|
233
|
+
elif isinstance(q, PlotCut):
|
234
|
+
self.set("power", 1000)
|
235
|
+
for ox, oy, on, x, y in q.plot:
|
236
|
+
while self.hold_work(0):
|
237
|
+
time.sleep(0.05)
|
238
|
+
# q.plot can have different on values, these are parsed
|
239
|
+
if self.on_value != on:
|
240
|
+
self.power_dirty = True
|
241
|
+
self.on_value = on
|
242
|
+
self._move(x, y, cut=True)
|
243
|
+
else:
|
244
|
+
# Rastercut
|
245
|
+
self.plot_planner.push(q)
|
246
|
+
for x, y, on in self.plot_planner.gen():
|
247
|
+
while self.hold_work(0):
|
248
|
+
time.sleep(0.05)
|
249
|
+
if on > 1:
|
250
|
+
# Special Command.
|
251
|
+
if isinstance(on, float):
|
252
|
+
on = int(on)
|
253
|
+
if on & PLOT_FINISH: # Plot planner is ending.
|
254
|
+
break
|
255
|
+
elif on & PLOT_SETTING: # Plot planner settings have changed.
|
256
|
+
p_set = Parameters(self.plot_planner.settings)
|
257
|
+
if p_set.power != self.power:
|
258
|
+
self.set("power", p_set.power)
|
259
|
+
if (
|
260
|
+
p_set.speed != self.speed
|
261
|
+
or p_set.raster_step_x != self.raster_step_x
|
262
|
+
or p_set.raster_step_y != self.raster_step_y
|
263
|
+
):
|
264
|
+
self.set("speed", p_set.speed)
|
265
|
+
self.settings.update(p_set.settings)
|
266
|
+
elif on & (
|
267
|
+
PLOT_RAPID | PLOT_JOG
|
268
|
+
): # Plot planner requests position change.
|
269
|
+
self._move(x, y, cut=False)
|
270
|
+
continue
|
271
|
+
if self.on_value != on:
|
272
|
+
self.power_dirty = True
|
273
|
+
self.on_value = on
|
274
|
+
self._move(x, y, cut=True)
|
275
|
+
self.queue.clear()
|
276
|
+
self._set_queue_status(0, 0)
|
277
|
+
# Ruida end data.
|
278
|
+
self.controller.job.write_tail()
|
279
|
+
self.controller.stop_record()
|
280
|
+
return False
|
281
|
+
|
282
|
+
def move_abs(self, x, y):
|
283
|
+
"""
|
284
|
+
Requests laser move to absolute position x, y in physical units
|
285
|
+
|
286
|
+
@param x:
|
287
|
+
@param y:
|
288
|
+
@return:
|
289
|
+
"""
|
290
|
+
old_current = self.service.current
|
291
|
+
job = self.controller.job
|
292
|
+
out = self.controller.write
|
293
|
+
job.speed_laser_1(100.0, output=out)
|
294
|
+
job.min_power_1(0, output=out)
|
295
|
+
job.min_power_2(0, output=out)
|
296
|
+
|
297
|
+
x, y = self.service.view.position(x, y)
|
298
|
+
|
299
|
+
dx = x - self.native_x
|
300
|
+
dy = y - self.native_y
|
301
|
+
if dx == 0:
|
302
|
+
if dy != 0:
|
303
|
+
job.rapid_move_y(dy, output=out)
|
304
|
+
elif dy == 0:
|
305
|
+
job.rapid_move_x(dx, output=out)
|
306
|
+
else:
|
307
|
+
job.rapid_move_xy(x, y, origin=True, output=out) # Not relative
|
308
|
+
self.native_x = x
|
309
|
+
self.native_y = y
|
310
|
+
new_current = self.service.current
|
311
|
+
if self._signal_updates:
|
312
|
+
self.service.signal(
|
313
|
+
"driver;position",
|
314
|
+
(old_current[0], old_current[1], new_current[0], new_current[1]),
|
315
|
+
)
|
316
|
+
|
317
|
+
def move_rel(self, dx, dy):
|
318
|
+
"""
|
319
|
+
Requests laser move relative position dx, dy in physical units
|
320
|
+
|
321
|
+
@param dx:
|
322
|
+
@param dy:
|
323
|
+
@return:
|
324
|
+
"""
|
325
|
+
old_current = self.service.current
|
326
|
+
job = self.controller.job
|
327
|
+
out = self.controller.write
|
328
|
+
dx, dy = self.service.view.position(dx, dy, vector=True)
|
329
|
+
if dx == 0:
|
330
|
+
if dy != 0:
|
331
|
+
job.rapid_move_y(dy, output=out)
|
332
|
+
elif dy == 0:
|
333
|
+
job.rapid_move_x(dx, output=out)
|
334
|
+
else:
|
335
|
+
job.rapid_move_xy(
|
336
|
+
self.native_x + dx,
|
337
|
+
self.native_y + dy,
|
338
|
+
origin=True,
|
339
|
+
output=out,
|
340
|
+
)
|
341
|
+
self.native_x += dx
|
342
|
+
self.native_y += dy
|
343
|
+
new_current = self.service.current
|
344
|
+
if self._signal_updates:
|
345
|
+
self.service.signal(
|
346
|
+
"driver;position",
|
347
|
+
(old_current[0], old_current[1], new_current[0], new_current[1]),
|
348
|
+
)
|
349
|
+
|
350
|
+
def focusz(self):
|
351
|
+
"""
|
352
|
+
This is a FocusZ routine on the Ruida Device.
|
353
|
+
@return:
|
354
|
+
"""
|
355
|
+
job = self.controller.job
|
356
|
+
out = self.controller.write
|
357
|
+
job.focus_z(output=out)
|
358
|
+
|
359
|
+
def home(self):
|
360
|
+
"""
|
361
|
+
This is called home, returns to center.
|
362
|
+
|
363
|
+
@return:
|
364
|
+
"""
|
365
|
+
self.move_abs(0, 0)
|
366
|
+
|
367
|
+
def physical_home(self):
|
368
|
+
""" "
|
369
|
+
This would be the command to go to a real physical home position (i.e. hitting endstops)
|
370
|
+
"""
|
371
|
+
job = self.controller.job
|
372
|
+
out = self.controller.write
|
373
|
+
job.home_xy(output=out)
|
374
|
+
|
375
|
+
def rapid_mode(self):
|
376
|
+
"""
|
377
|
+
Expects to be in rapid jogging mode.
|
378
|
+
@return:
|
379
|
+
"""
|
380
|
+
self.controller.rapid_mode()
|
381
|
+
|
382
|
+
def program_mode(self):
|
383
|
+
"""
|
384
|
+
Expects to run jobs at a speed in a programmed mode.
|
385
|
+
@return:
|
386
|
+
"""
|
387
|
+
self.controller.program_mode()
|
388
|
+
|
389
|
+
def raster_mode(self, *args):
|
390
|
+
"""
|
391
|
+
Expects to run a raster job. Raster information is set in special modes to stop the laser head from moving
|
392
|
+
too far.
|
393
|
+
|
394
|
+
@return:
|
395
|
+
"""
|
396
|
+
pass
|
397
|
+
|
398
|
+
def wait_finished(self):
|
399
|
+
"""
|
400
|
+
Expects to be caught up such that the next command will happen immediately rather than get queued.
|
401
|
+
|
402
|
+
@return:
|
403
|
+
"""
|
404
|
+
self.controller.wait_finished()
|
405
|
+
|
406
|
+
def function(self, function):
|
407
|
+
"""
|
408
|
+
This command asks that this function be executed at the appropriate time within the spooling cycle.
|
409
|
+
|
410
|
+
@param function:
|
411
|
+
@return:
|
412
|
+
"""
|
413
|
+
function()
|
414
|
+
|
415
|
+
def wait(self, time_in_ms):
|
416
|
+
"""
|
417
|
+
Wait asks that the work be stalled or current process held for the time time_in_ms in ms. If wait_finished is
|
418
|
+
called first this will attempt to stall the machine while performing no work. If the driver in question permits
|
419
|
+
waits to be placed within code this should insert waits into the current job. Returning instantly rather than
|
420
|
+
holding the processes.
|
421
|
+
|
422
|
+
@param time_in_ms:
|
423
|
+
@return:
|
424
|
+
"""
|
425
|
+
time.sleep(time_in_ms / 1000.0)
|
426
|
+
|
427
|
+
def console(self, value):
|
428
|
+
"""
|
429
|
+
This asks that the console command be executed at the appropriate time within the spooled cycle.
|
430
|
+
|
431
|
+
@param value: console command
|
432
|
+
@return:
|
433
|
+
"""
|
434
|
+
self.service(value)
|
435
|
+
|
436
|
+
def beep(self):
|
437
|
+
"""
|
438
|
+
Wants a system beep to be issued.
|
439
|
+
This command asks that a beep be executed at the appropriate time within the spooled cycle.
|
440
|
+
|
441
|
+
@return:
|
442
|
+
"""
|
443
|
+
self.service("beep\n")
|
444
|
+
|
445
|
+
def signal(self, signal, *args):
|
446
|
+
"""
|
447
|
+
Wants a system signal to be sent.
|
448
|
+
|
449
|
+
@param signal:
|
450
|
+
@param args:
|
451
|
+
@return:
|
452
|
+
"""
|
453
|
+
self.service.signal(signal, *args)
|
454
|
+
|
455
|
+
def pause(self):
|
456
|
+
"""
|
457
|
+
Wants the driver to pause.
|
458
|
+
@return:
|
459
|
+
"""
|
460
|
+
if self.paused:
|
461
|
+
self.resume()
|
462
|
+
return
|
463
|
+
self.paused = True
|
464
|
+
self.controller.pause()
|
465
|
+
self.service.signal("pause")
|
466
|
+
|
467
|
+
def resume(self):
|
468
|
+
"""
|
469
|
+
Wants the driver to resume.
|
470
|
+
|
471
|
+
This typically issues from the realtime queue which means it will call even if we tell work_hold that we should
|
472
|
+
hold the work.
|
473
|
+
|
474
|
+
@return:
|
475
|
+
"""
|
476
|
+
self.paused = False
|
477
|
+
self.controller.resume()
|
478
|
+
self.service.signal("pause")
|
479
|
+
|
480
|
+
def reset(self):
|
481
|
+
"""
|
482
|
+
Wants the job to be aborted and action to be stopped.
|
483
|
+
|
484
|
+
@return:
|
485
|
+
"""
|
486
|
+
self.controller.abort()
|
487
|
+
self.paused = False
|
488
|
+
self.service.signal("pause")
|
489
|
+
|
490
|
+
def dwell(self, time_in_ms):
|
491
|
+
"""
|
492
|
+
Requests that the laser fire in place for the given time period. This could be done in a series of commands,
|
493
|
+
move to a location, turn laser on, wait, turn laser off. However, some drivers have specific laser-in-place
|
494
|
+
commands so calling dwell is preferred.
|
495
|
+
|
496
|
+
@param time_in_ms:
|
497
|
+
@return:
|
498
|
+
"""
|
499
|
+
job = self.controller.job
|
500
|
+
out = self.controller.write
|
501
|
+
job.laser_interval(time_in_ms, output=out)
|
502
|
+
|
503
|
+
def set_abort(self):
|
504
|
+
self._aborting = True
|
505
|
+
|
506
|
+
####################
|
507
|
+
# PROTECTED DRIVER CODE
|
508
|
+
####################
|
509
|
+
|
510
|
+
def _move(self, x, y, cut=True):
|
511
|
+
old_current = self.service.current
|
512
|
+
job = self.controller.job
|
513
|
+
if self.power_dirty:
|
514
|
+
if self.power is not None:
|
515
|
+
job.max_power_1(self.power / 10.0 * self.on_value)
|
516
|
+
job.min_power_1(self.power / 10.0 * self.on_value)
|
517
|
+
self.power_dirty = False
|
518
|
+
if self.speed_dirty:
|
519
|
+
job.speed_laser_1(self.speed)
|
520
|
+
self.speed_dirty = False
|
521
|
+
dx = x - self.native_x
|
522
|
+
dy = y - self.native_y
|
523
|
+
if cut:
|
524
|
+
job.mark(x, y, dx, dy)
|
525
|
+
else:
|
526
|
+
job.jump(x, y, dx, dy)
|
527
|
+
self.native_x = x
|
528
|
+
self.native_y = y
|
529
|
+
new_current = self.service.current
|
530
|
+
if self._signal_updates:
|
531
|
+
self.service.signal(
|
532
|
+
"driver;position",
|
533
|
+
(old_current[0], old_current[1], new_current[0], new_current[1]),
|
534
|
+
)
|