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/extra/potrace.py
CHANGED
@@ -1,253 +1,257 @@
|
|
1
|
-
from meerk40t.core.node.node import Fillrule
|
2
|
-
from meerk40t.svgelements import Color, Matrix, Path
|
3
|
-
|
4
|
-
"""
|
5
|
-
Potracer routines, please be aware that potrace is not part of the standard
|
6
|
-
distribution of meerk40t due to the more restrictive licensing of potrace
|
7
|
-
If you have installed it yourself via 'pip install potracer', well why not...
|
8
|
-
potracer is a pure python port of Peter Selinger's Potrace by Tatarize
|
9
|
-
potrace: https://potrace.sourceforge.net/
|
10
|
-
potracer: https://github.com/tatarize/potrace
|
11
|
-
|
12
|
-
- The turdsize parameter can be used to “despeckle” the bitmap to be traced,
|
13
|
-
by removing all curves whose enclosed area is below the given threshold.
|
14
|
-
The current default for the turdsize parameter is 2; its useful range is
|
15
|
-
from 0 to infinity.
|
16
|
-
|
17
|
-
- The turnpolicy parameter determines how to resolve ambiguities during
|
18
|
-
decomposition of bitmaps into paths. The possible choices for the turnpolicy
|
19
|
-
parameter are:
|
20
|
-
|
21
|
-
BLACK: prefers to connect black (foreground) components.
|
22
|
-
WHITE: prefers to connect white (background) components.
|
23
|
-
LEFT: always take a left turn.
|
24
|
-
RIGHT: always take a right turn.
|
25
|
-
MINORITY: prefers to connect the color (black or white) that occurs
|
26
|
-
least frequently in a local neighborhood of the current position.
|
27
|
-
MAJORITY: prefers to connect the color (black or white) that occurs most
|
28
|
-
frequently in a local neighborhood of the current position.
|
29
|
-
RANDOM: choose randomly.
|
30
|
-
The current default policy is MINORITY, which tends to keep
|
31
|
-
visual lines connected.
|
32
|
-
|
33
|
-
- The alphamax parameter is a threshold for the detection of corners.
|
34
|
-
It controls the smoothness of the traced curve.
|
35
|
-
The current default is 1.0; useful range of this parameter is
|
36
|
-
from 0.0 (polygon) to 1.3333 (no corners).
|
37
|
-
|
38
|
-
- The opticurve parameter is a boolean flag that controls whether Potrace
|
39
|
-
will attempt to “simplify” the final curve by reducing the number of
|
40
|
-
Bezier curve segments. Opticurve=1 turns on optimization,
|
41
|
-
and opticurve=0 turns it off. The current default is on.
|
42
|
-
|
43
|
-
- The opttolerance parameter defines the amount of error
|
44
|
-
allowed in this simplification. The current default is 0.2. Larger values tend to decrease the number of segments, at the expense of less accuracy. The useful range is from 0 to infinity, although in practice one would hardly choose values greater than 1 or so. For most purposes, the default value is a good tradeoff between space and accuracy.
|
45
|
-
|
46
|
-
"""
|
47
|
-
|
48
|
-
|
49
|
-
def plugin(kernel, lifecycle=None):
|
50
|
-
if lifecycle == "invalidate":
|
51
|
-
try:
|
52
|
-
import numpy
|
53
|
-
import potrace
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
if
|
79
|
-
|
80
|
-
if
|
81
|
-
|
82
|
-
if
|
83
|
-
|
84
|
-
if
|
85
|
-
|
86
|
-
if
|
87
|
-
|
88
|
-
if
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
if
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
if
|
103
|
-
image = image.
|
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
|
-
help=_("
|
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
|
-
if
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
if
|
219
|
-
|
220
|
-
if
|
221
|
-
|
222
|
-
if
|
223
|
-
|
224
|
-
if
|
225
|
-
|
226
|
-
if
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
1
|
+
from meerk40t.core.node.node import Fillrule
|
2
|
+
from meerk40t.svgelements import Color, Matrix, Path
|
3
|
+
|
4
|
+
"""
|
5
|
+
Potracer routines, please be aware that potrace is not part of the standard
|
6
|
+
distribution of meerk40t due to the more restrictive licensing of potrace
|
7
|
+
If you have installed it yourself via 'pip install potracer', well why not...
|
8
|
+
potracer is a pure python port of Peter Selinger's Potrace by Tatarize
|
9
|
+
potrace: https://potrace.sourceforge.net/
|
10
|
+
potracer: https://github.com/tatarize/potrace
|
11
|
+
|
12
|
+
- The turdsize parameter can be used to “despeckle” the bitmap to be traced,
|
13
|
+
by removing all curves whose enclosed area is below the given threshold.
|
14
|
+
The current default for the turdsize parameter is 2; its useful range is
|
15
|
+
from 0 to infinity.
|
16
|
+
|
17
|
+
- The turnpolicy parameter determines how to resolve ambiguities during
|
18
|
+
decomposition of bitmaps into paths. The possible choices for the turnpolicy
|
19
|
+
parameter are:
|
20
|
+
|
21
|
+
BLACK: prefers to connect black (foreground) components.
|
22
|
+
WHITE: prefers to connect white (background) components.
|
23
|
+
LEFT: always take a left turn.
|
24
|
+
RIGHT: always take a right turn.
|
25
|
+
MINORITY: prefers to connect the color (black or white) that occurs
|
26
|
+
least frequently in a local neighborhood of the current position.
|
27
|
+
MAJORITY: prefers to connect the color (black or white) that occurs most
|
28
|
+
frequently in a local neighborhood of the current position.
|
29
|
+
RANDOM: choose randomly.
|
30
|
+
The current default policy is MINORITY, which tends to keep
|
31
|
+
visual lines connected.
|
32
|
+
|
33
|
+
- The alphamax parameter is a threshold for the detection of corners.
|
34
|
+
It controls the smoothness of the traced curve.
|
35
|
+
The current default is 1.0; useful range of this parameter is
|
36
|
+
from 0.0 (polygon) to 1.3333 (no corners).
|
37
|
+
|
38
|
+
- The opticurve parameter is a boolean flag that controls whether Potrace
|
39
|
+
will attempt to “simplify” the final curve by reducing the number of
|
40
|
+
Bezier curve segments. Opticurve=1 turns on optimization,
|
41
|
+
and opticurve=0 turns it off. The current default is on.
|
42
|
+
|
43
|
+
- The opttolerance parameter defines the amount of error
|
44
|
+
allowed in this simplification. The current default is 0.2. Larger values tend to decrease the number of segments, at the expense of less accuracy. The useful range is from 0 to infinity, although in practice one would hardly choose values greater than 1 or so. For most purposes, the default value is a good tradeoff between space and accuracy.
|
45
|
+
|
46
|
+
"""
|
47
|
+
|
48
|
+
|
49
|
+
def plugin(kernel, lifecycle=None):
|
50
|
+
if lifecycle == "invalidate":
|
51
|
+
try:
|
52
|
+
import numpy
|
53
|
+
import potrace
|
54
|
+
if not hasattr(potrace, "Bitmap"):
|
55
|
+
# This is a strange variant, that we do not support!
|
56
|
+
print ("The version of potrace that is installed on your machine is incompatible. Please report this to the developers.")
|
57
|
+
return True
|
58
|
+
except ImportError:
|
59
|
+
# print("Potrace plugin could not load because potracer/pypotrace is not installed.")
|
60
|
+
return True
|
61
|
+
|
62
|
+
if lifecycle == "register":
|
63
|
+
_ = kernel.translation
|
64
|
+
import numpy
|
65
|
+
import potrace
|
66
|
+
|
67
|
+
def make_vector(
|
68
|
+
image,
|
69
|
+
interpolationpolicy=None,
|
70
|
+
invert=False,
|
71
|
+
turdsize=None,
|
72
|
+
alphamax=None,
|
73
|
+
opticurve=None,
|
74
|
+
opttolerance=None,
|
75
|
+
color=None,
|
76
|
+
blacklevel=None,
|
77
|
+
):
|
78
|
+
if interpolationpolicy is None:
|
79
|
+
interpolationpolicy = 4 # POTRACE_TURNPOLICY_MINORITY
|
80
|
+
if turdsize is None:
|
81
|
+
turdsize = 2
|
82
|
+
if alphamax is None:
|
83
|
+
alphamax = 1
|
84
|
+
if opticurve is None:
|
85
|
+
opticurve = True
|
86
|
+
if opttolerance is None:
|
87
|
+
opttolerance = 0.2
|
88
|
+
if color is None:
|
89
|
+
color = Color("black")
|
90
|
+
if invert is None:
|
91
|
+
invert = False
|
92
|
+
if blacklevel is None:
|
93
|
+
blacklevel = 0.5
|
94
|
+
using_pypotrace = hasattr(potrace, "potracelib_version")
|
95
|
+
if using_pypotrace:
|
96
|
+
# print ("Optimised version")
|
97
|
+
invert = not invert
|
98
|
+
|
99
|
+
if image.mode not in ("L", "1"):
|
100
|
+
image = image.convert("L")
|
101
|
+
|
102
|
+
if not invert:
|
103
|
+
image = image.point(lambda e: 0 if (e / 255.0) < blacklevel else 255)
|
104
|
+
else:
|
105
|
+
image = image.point(lambda e: 255 if (e / 255.0) < blacklevel else 0)
|
106
|
+
if image.mode != "1":
|
107
|
+
image = image.convert("1")
|
108
|
+
npimage = numpy.asarray(image)
|
109
|
+
bm = potrace.Bitmap(npimage)
|
110
|
+
plist = bm.trace(
|
111
|
+
turdsize=turdsize,
|
112
|
+
turnpolicy=interpolationpolicy,
|
113
|
+
alphamax=alphamax,
|
114
|
+
opticurve=opticurve,
|
115
|
+
opttolerance=opttolerance,
|
116
|
+
)
|
117
|
+
path = Path(
|
118
|
+
fill=color,
|
119
|
+
stroke=color,
|
120
|
+
fillrule=Fillrule.FILLRULE_NONZERO,
|
121
|
+
)
|
122
|
+
for curve in plist:
|
123
|
+
path.move(curve.start_point)
|
124
|
+
for segment in curve.segments:
|
125
|
+
if segment.is_corner:
|
126
|
+
path.line(segment.c)
|
127
|
+
path.line(segment.end_point)
|
128
|
+
else:
|
129
|
+
path.cubic(segment.c1, segment.c2, segment.end_point)
|
130
|
+
path.closed()
|
131
|
+
return path
|
132
|
+
|
133
|
+
kernel.register("render-op/make_vector", make_vector)
|
134
|
+
|
135
|
+
@kernel.console_option(
|
136
|
+
"turnpolicy",
|
137
|
+
"z",
|
138
|
+
type=str,
|
139
|
+
default="minority",
|
140
|
+
help=_("how to resolve ambiguities in path decomposition"),
|
141
|
+
)
|
142
|
+
@kernel.console_option(
|
143
|
+
"turdsize",
|
144
|
+
"t",
|
145
|
+
type=int,
|
146
|
+
default=2,
|
147
|
+
help=_("suppress speckles of up to this size (default 2)"),
|
148
|
+
)
|
149
|
+
@kernel.console_option(
|
150
|
+
"alphamax", "a", type=float, default=1, help=_("corner threshold parameter")
|
151
|
+
)
|
152
|
+
@kernel.console_option(
|
153
|
+
"opticurve",
|
154
|
+
"n",
|
155
|
+
type=bool,
|
156
|
+
action="store_true",
|
157
|
+
help=_("turn off curve optimization"),
|
158
|
+
)
|
159
|
+
@kernel.console_option(
|
160
|
+
"opttolerance",
|
161
|
+
"O",
|
162
|
+
type=float,
|
163
|
+
help=_("curve optimization tolerance"),
|
164
|
+
default=0.2,
|
165
|
+
)
|
166
|
+
@kernel.console_option(
|
167
|
+
"color",
|
168
|
+
"C",
|
169
|
+
type=Color,
|
170
|
+
help=_("set foreground color (default Black)"),
|
171
|
+
)
|
172
|
+
@kernel.console_option(
|
173
|
+
"invert",
|
174
|
+
"i",
|
175
|
+
type=bool,
|
176
|
+
action="store_true",
|
177
|
+
help=_("invert bitmap"),
|
178
|
+
)
|
179
|
+
@kernel.console_option(
|
180
|
+
"blacklevel",
|
181
|
+
"k",
|
182
|
+
type=float,
|
183
|
+
default=0.5,
|
184
|
+
help=_("blacklevel?!"),
|
185
|
+
)
|
186
|
+
@kernel.console_command(
|
187
|
+
"potrace",
|
188
|
+
help=_("return paths around image"),
|
189
|
+
input_type="image",
|
190
|
+
output_type="elements",
|
191
|
+
)
|
192
|
+
def do_potrace(
|
193
|
+
data,
|
194
|
+
turnpolicy=None,
|
195
|
+
turdsize=None,
|
196
|
+
alphamax=None,
|
197
|
+
opticurve=None,
|
198
|
+
opttolerance=None,
|
199
|
+
color=None,
|
200
|
+
invert=None,
|
201
|
+
blacklevel=None,
|
202
|
+
**kwargs,
|
203
|
+
):
|
204
|
+
policies = {
|
205
|
+
"black": 0, # POTRACE_TURNPOLICY_BLACK
|
206
|
+
"white": 1, # POTRACE_TURNPOLICY_WHITE
|
207
|
+
"left": 2, # POTRACE_TURNPOLICY_LEFT
|
208
|
+
"right": 3, # POTRACE_TURNPOLICY_RIGHT
|
209
|
+
"minority": 4, # POTRACE_TURNPOLICY_MINORITY
|
210
|
+
"majority": 5, # POTRACE_TURNPOLICY_MAJORITY
|
211
|
+
"random": 6, # POTRACE_TURNPOLICY_RANDOM
|
212
|
+
}
|
213
|
+
|
214
|
+
if turnpolicy not in policies:
|
215
|
+
turnpolicy = "minority"
|
216
|
+
ipolicy = policies[turnpolicy]
|
217
|
+
|
218
|
+
if turdsize is None:
|
219
|
+
turdsize = 2
|
220
|
+
if alphamax is None:
|
221
|
+
alphamax = 1
|
222
|
+
if opticurve is None:
|
223
|
+
opticurve = True
|
224
|
+
if opttolerance is None:
|
225
|
+
opttolerance = 0.2
|
226
|
+
if color is None:
|
227
|
+
color = Color("black")
|
228
|
+
if invert is None:
|
229
|
+
invert = False
|
230
|
+
if blacklevel is None:
|
231
|
+
blacklevel = 0.5
|
232
|
+
elements = kernel.root.elements
|
233
|
+
paths = []
|
234
|
+
for node in data:
|
235
|
+
matrix = node.matrix
|
236
|
+
image = node.image
|
237
|
+
path = make_vector(
|
238
|
+
image=image,
|
239
|
+
interpolationpolicy=ipolicy,
|
240
|
+
invert=invert,
|
241
|
+
turdsize=turdsize,
|
242
|
+
alphamax=alphamax,
|
243
|
+
opticurve=opticurve,
|
244
|
+
opttolerance=opttolerance,
|
245
|
+
color=color,
|
246
|
+
blacklevel=blacklevel,
|
247
|
+
)
|
248
|
+
path.transform *= Matrix(matrix)
|
249
|
+
node = elements.elem_branch.add(
|
250
|
+
path=abs(path),
|
251
|
+
stroke_width=500,
|
252
|
+
stroke_scaled=False,
|
253
|
+
type="elem path",
|
254
|
+
fillrule=Fillrule.FILLRULE_NONZERO,
|
255
|
+
)
|
256
|
+
paths.append(node)
|
257
|
+
return "elements", paths
|
@@ -0,0 +1,118 @@
|
|
1
|
+
"""
|
2
|
+
The serial_exchange command is intended to facilitate some basic serial exchanges, triggering success or failure events.
|
3
|
+
|
4
|
+
The command is blocking so that it can be used as part of a `Console Operation` and block the spooler until the exchange
|
5
|
+
is finished.
|
6
|
+
|
7
|
+
For example, if you have a z-bed and that needs controlling with an auxiliary GRBL device, you could use the exchange
|
8
|
+
to communicate the needed command to the GRBL, without extremely complex uses of the full driver.
|
9
|
+
"""
|
10
|
+
|
11
|
+
import time
|
12
|
+
|
13
|
+
|
14
|
+
def plugin(kernel, lifecycle=None):
|
15
|
+
if lifecycle == "invalidate":
|
16
|
+
# Plugin requires pyserial.
|
17
|
+
try:
|
18
|
+
import serial
|
19
|
+
except ImportError:
|
20
|
+
return True
|
21
|
+
if lifecycle == "register":
|
22
|
+
import serial
|
23
|
+
|
24
|
+
@kernel.console_option(
|
25
|
+
"port", "c", type=str, default="COM4", help="com port to use"
|
26
|
+
)
|
27
|
+
@kernel.console_option(
|
28
|
+
"baud_rate", "b", type=int, default=9600, help="baud rate"
|
29
|
+
)
|
30
|
+
@kernel.console_option(
|
31
|
+
"timeout", "t", type=float, default=30.0, help="timeout in seconds"
|
32
|
+
)
|
33
|
+
@kernel.console_option(
|
34
|
+
"delay",
|
35
|
+
"d",
|
36
|
+
type=float,
|
37
|
+
default=0.0,
|
38
|
+
help="Wait time before sending send_data.",
|
39
|
+
)
|
40
|
+
@kernel.console_option(
|
41
|
+
"failure_message", "f", type=str, help="match data to declare failure"
|
42
|
+
)
|
43
|
+
@kernel.console_option(
|
44
|
+
"failure_command", "F", type=str, help="command to execute on failure"
|
45
|
+
)
|
46
|
+
@kernel.console_option(
|
47
|
+
"success_message", "s", type=str, help="match data to declare success"
|
48
|
+
)
|
49
|
+
@kernel.console_option(
|
50
|
+
"success_command", "S", type=str, help="command to execute on success"
|
51
|
+
)
|
52
|
+
@kernel.console_argument("send_data", type=str, help="data to send to device")
|
53
|
+
@kernel.console_command(
|
54
|
+
"serial_exchange", help="Talk to a serial port in a blocking manner."
|
55
|
+
)
|
56
|
+
def serial_exchange_command(
|
57
|
+
channel,
|
58
|
+
_,
|
59
|
+
send_data,
|
60
|
+
delay=1.0,
|
61
|
+
port="COM4",
|
62
|
+
baud_rate=9600,
|
63
|
+
timeout=30.0,
|
64
|
+
success_message=None,
|
65
|
+
success_command=None,
|
66
|
+
failure_message=None,
|
67
|
+
failure_command=None,
|
68
|
+
**kwargs,
|
69
|
+
):
|
70
|
+
serial_device = None
|
71
|
+
try:
|
72
|
+
# Open the serial port
|
73
|
+
serial_device = serial.Serial(port, baud_rate, timeout=2)
|
74
|
+
|
75
|
+
if delay:
|
76
|
+
# Add in wakeup delay.
|
77
|
+
time.sleep(delay)
|
78
|
+
|
79
|
+
# Send data.
|
80
|
+
serial_device.write(send_data.encode("utf-8"))
|
81
|
+
|
82
|
+
end_time = time.time() + timeout
|
83
|
+
while end_time > time.time():
|
84
|
+
# Execute until timeout.
|
85
|
+
|
86
|
+
response = (
|
87
|
+
serial_device.readline()
|
88
|
+
.decode("utf-8", errors="ignore")
|
89
|
+
.strip()
|
90
|
+
)
|
91
|
+
channel(response)
|
92
|
+
if success_message and success_message in response:
|
93
|
+
# Actively succeeded
|
94
|
+
if success_command:
|
95
|
+
kernel.root(success_command)
|
96
|
+
return
|
97
|
+
if failure_message and failure_message in response:
|
98
|
+
# Actively failed.
|
99
|
+
if failure_command:
|
100
|
+
kernel.root(failure_command)
|
101
|
+
return
|
102
|
+
if not failure_message and not success_message and not response:
|
103
|
+
# Not matching criteria, read buffer and exit.
|
104
|
+
return
|
105
|
+
|
106
|
+
# We timed out.
|
107
|
+
channel(_("Timeout reached."))
|
108
|
+
if failure_command:
|
109
|
+
# Timeout is a failure condition.
|
110
|
+
kernel.root(failure_command)
|
111
|
+
except serial.SerialException as e:
|
112
|
+
channel(f"Error: {e}")
|
113
|
+
# Error is a failure condition.
|
114
|
+
kernel.root(failure_command)
|
115
|
+
finally:
|
116
|
+
# Close the serial port, if opened
|
117
|
+
if serial_device is not None and serial_device.is_open:
|
118
|
+
serial_device.close()
|