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/core/laserjob.py
CHANGED
@@ -1,220 +1,220 @@
|
|
1
|
-
"""
|
2
|
-
LaserJob is the basic Spooler Job. It stores a list of items that are merely called in order on the driver. Between
|
3
|
-
each call a cycle is returned with False until the processing is finished and True is returned.
|
4
|
-
|
5
|
-
The LaserJob itself permits looping. This will send the list of items that many times until the job is completed.
|
6
|
-
This could be an infinite number of times.
|
7
|
-
"""
|
8
|
-
|
9
|
-
|
10
|
-
import time
|
11
|
-
from math import isinf
|
12
|
-
|
13
|
-
from meerk40t.core.cutcode.cutcode import CutCode
|
14
|
-
|
15
|
-
|
16
|
-
class LaserJob:
|
17
|
-
def __init__(self, label, items, driver=None, priority=0, loops=1, outline=None):
|
18
|
-
self.items = items
|
19
|
-
self.label = label
|
20
|
-
self.priority = priority
|
21
|
-
self.time_submitted = time.time()
|
22
|
-
self.time_started = None
|
23
|
-
self.runtime = 0
|
24
|
-
self.time_pass_started = None
|
25
|
-
self.steps_done = 0
|
26
|
-
self.steps_total = 0
|
27
|
-
self.avg_time_per_pass = None
|
28
|
-
self.loops = loops
|
29
|
-
self.loops_executed = 0
|
30
|
-
self._driver = driver
|
31
|
-
self.helper = False
|
32
|
-
self.item_index = 0
|
33
|
-
|
34
|
-
self._stopped = True
|
35
|
-
self.enabled = True
|
36
|
-
|
37
|
-
self._estimate = 0
|
38
|
-
|
39
|
-
for item in self.items:
|
40
|
-
if isinstance(item, CutCode):
|
41
|
-
stats = item.provide_statistics()
|
42
|
-
final_values = stats[-1]
|
43
|
-
self._estimate = final_values["time_at_end_of_burn"]
|
44
|
-
self.outline = outline
|
45
|
-
|
46
|
-
def __str__(self):
|
47
|
-
return f"{self.__class__.__name__}({self.label}{'' if self.enabled else '[x]'}: {self.loops_executed}/{self.loops})"
|
48
|
-
|
49
|
-
def bounds(self):
|
50
|
-
if self.outline is None:
|
51
|
-
return None
|
52
|
-
max_x = float("-inf")
|
53
|
-
max_y = float("-inf")
|
54
|
-
min_x = float("inf")
|
55
|
-
min_y = float("inf")
|
56
|
-
for x, y in self.outline:
|
57
|
-
if x > max_x:
|
58
|
-
max_x = x
|
59
|
-
if y > max_y:
|
60
|
-
max_y = y
|
61
|
-
if x < min_x:
|
62
|
-
min_x = x
|
63
|
-
if y < min_y:
|
64
|
-
min_y = y
|
65
|
-
return min_x, min_y, max_x, max_y
|
66
|
-
|
67
|
-
@property
|
68
|
-
def status(self):
|
69
|
-
if self.is_running():
|
70
|
-
if self.time_started:
|
71
|
-
return "Running"
|
72
|
-
else:
|
73
|
-
return "Queued"
|
74
|
-
else:
|
75
|
-
if self.enabled:
|
76
|
-
return "Waiting"
|
77
|
-
else:
|
78
|
-
return "Disabled"
|
79
|
-
|
80
|
-
def is_running(self):
|
81
|
-
return not self._stopped
|
82
|
-
|
83
|
-
def execute(self, driver=None):
|
84
|
-
"""
|
85
|
-
Execute calls each item in the list of items in order. This is intended to be called by the spooler thread. And
|
86
|
-
hold the spooler while these items are executing.
|
87
|
-
@return:
|
88
|
-
"""
|
89
|
-
self._stopped = False
|
90
|
-
self.time_started = time.time()
|
91
|
-
self.time_pass_started = time.time()
|
92
|
-
self.steps_total = 0
|
93
|
-
self.calc_steps()
|
94
|
-
try:
|
95
|
-
while self.loops_executed < self.loops:
|
96
|
-
self.steps_done = 0
|
97
|
-
if self._stopped:
|
98
|
-
return False
|
99
|
-
while self.item_index < len(self.items):
|
100
|
-
if self._stopped:
|
101
|
-
return False
|
102
|
-
item = self.items[self.item_index]
|
103
|
-
self.execute_item(item)
|
104
|
-
if self._stopped:
|
105
|
-
return False
|
106
|
-
self.item_index += 1
|
107
|
-
self.item_index = 0
|
108
|
-
self.loops_executed += 1
|
109
|
-
self.time_pass_started = time.time()
|
110
|
-
self.avg_time_per_pass = self.elapsed_time() / self.loops_executed
|
111
|
-
finally:
|
112
|
-
self.runtime += time.time() - self.time_started
|
113
|
-
self._stopped = True
|
114
|
-
return True
|
115
|
-
|
116
|
-
def calc_steps(self):
|
117
|
-
def simple_step(item):
|
118
|
-
if isinstance(item, tuple):
|
119
|
-
attr = item[0]
|
120
|
-
if hasattr(self._driver, attr):
|
121
|
-
self.steps_total += 1
|
122
|
-
# STRING
|
123
|
-
elif isinstance(item, str):
|
124
|
-
attr = item
|
125
|
-
if hasattr(self._driver, attr):
|
126
|
-
self.steps_total += 1
|
127
|
-
# .generator is a Generator
|
128
|
-
elif hasattr(item, "generate"):
|
129
|
-
item = getattr(item, "generate")
|
130
|
-
for p in item():
|
131
|
-
simple_step(p)
|
132
|
-
|
133
|
-
self.steps_total = 0
|
134
|
-
for pitem in self.items:
|
135
|
-
simple_step(pitem)
|
136
|
-
|
137
|
-
def execute_item(self, item):
|
138
|
-
"""
|
139
|
-
This executes the different classes of spoolable object.
|
140
|
-
|
141
|
-
* (str, attribute, ...) calls self.driver.str(*attributes)
|
142
|
-
* str, calls self.driver.str()
|
143
|
-
* has_attribute(generator), recursive call to list of lines produced by the
|
144
|
-
generator, recursive call to list of lines produced by generator
|
145
|
-
|
146
|
-
@param item:
|
147
|
-
@return:
|
148
|
-
"""
|
149
|
-
if isinstance(item, tuple):
|
150
|
-
attr = item[0]
|
151
|
-
if hasattr(self._driver, attr):
|
152
|
-
function = getattr(self._driver, attr)
|
153
|
-
function(*item[1:])
|
154
|
-
self.steps_done += 1
|
155
|
-
return
|
156
|
-
|
157
|
-
# STRING
|
158
|
-
if isinstance(item, str):
|
159
|
-
attr = item
|
160
|
-
|
161
|
-
if hasattr(self._driver, attr):
|
162
|
-
function = getattr(self._driver, attr)
|
163
|
-
function()
|
164
|
-
self.steps_done += 1
|
165
|
-
return
|
166
|
-
|
167
|
-
# .generator is a Generator
|
168
|
-
if hasattr(item, "generate"):
|
169
|
-
item = getattr(item, "generate")
|
170
|
-
|
171
|
-
# Generator item
|
172
|
-
for p in item():
|
173
|
-
if self._stopped:
|
174
|
-
return
|
175
|
-
self.execute_item(p)
|
176
|
-
|
177
|
-
def stop(self):
|
178
|
-
"""
|
179
|
-
Stop this current laser-job, cannot be called from the spooler thread.
|
180
|
-
@return:
|
181
|
-
"""
|
182
|
-
if not self._stopped:
|
183
|
-
self.runtime += time.time() - self.time_started
|
184
|
-
self._stopped = True
|
185
|
-
|
186
|
-
def stop_after_loop(self):
|
187
|
-
self.loops = self.loops_executed + 1
|
188
|
-
|
189
|
-
def add_another_loop(self):
|
190
|
-
if not isinf(self.loops):
|
191
|
-
self.loops += 1
|
192
|
-
|
193
|
-
def elapsed_time(self):
|
194
|
-
"""
|
195
|
-
How long is this job already running...
|
196
|
-
"""
|
197
|
-
if self.is_running():
|
198
|
-
return time.time() - self.time_started
|
199
|
-
else:
|
200
|
-
return self.runtime
|
201
|
-
|
202
|
-
def estimate_time(self):
|
203
|
-
"""
|
204
|
-
Give laser job time estimate.
|
205
|
-
|
206
|
-
This is rather 'simple', we have no clue what exactly this job is doing, but we have some ideas,
|
207
|
-
if and only if the job is_running:
|
208
|
-
a) we know the elapsed time
|
209
|
-
b) we know current and total steps (if the driver has such a property)
|
210
|
-
@return:
|
211
|
-
"""
|
212
|
-
if isinf(self.loops):
|
213
|
-
return float("inf")
|
214
|
-
if (
|
215
|
-
self.is_running()
|
216
|
-
and self.time_started is not None
|
217
|
-
and self.avg_time_per_pass
|
218
|
-
):
|
219
|
-
return self.avg_time_per_pass * self.loops
|
220
|
-
return self.loops * self._estimate
|
1
|
+
"""
|
2
|
+
LaserJob is the basic Spooler Job. It stores a list of items that are merely called in order on the driver. Between
|
3
|
+
each call a cycle is returned with False until the processing is finished and True is returned.
|
4
|
+
|
5
|
+
The LaserJob itself permits looping. This will send the list of items that many times until the job is completed.
|
6
|
+
This could be an infinite number of times.
|
7
|
+
"""
|
8
|
+
|
9
|
+
|
10
|
+
import time
|
11
|
+
from math import isinf
|
12
|
+
|
13
|
+
from meerk40t.core.cutcode.cutcode import CutCode
|
14
|
+
|
15
|
+
|
16
|
+
class LaserJob:
|
17
|
+
def __init__(self, label, items, driver=None, priority=0, loops=1, outline=None):
|
18
|
+
self.items = items
|
19
|
+
self.label = label
|
20
|
+
self.priority = priority
|
21
|
+
self.time_submitted = time.time()
|
22
|
+
self.time_started = None
|
23
|
+
self.runtime = 0
|
24
|
+
self.time_pass_started = None
|
25
|
+
self.steps_done = 0
|
26
|
+
self.steps_total = 0
|
27
|
+
self.avg_time_per_pass = None
|
28
|
+
self.loops = loops
|
29
|
+
self.loops_executed = 0
|
30
|
+
self._driver = driver
|
31
|
+
self.helper = False
|
32
|
+
self.item_index = 0
|
33
|
+
|
34
|
+
self._stopped = True
|
35
|
+
self.enabled = True
|
36
|
+
|
37
|
+
self._estimate = 0
|
38
|
+
|
39
|
+
for item in self.items:
|
40
|
+
if isinstance(item, CutCode):
|
41
|
+
stats = item.provide_statistics()
|
42
|
+
final_values = stats[-1]
|
43
|
+
self._estimate = final_values["time_at_end_of_burn"]
|
44
|
+
self.outline = outline
|
45
|
+
|
46
|
+
def __str__(self):
|
47
|
+
return f"{self.__class__.__name__}({self.label}{'' if self.enabled else '[x]'}: {self.loops_executed}/{self.loops})"
|
48
|
+
|
49
|
+
def bounds(self):
|
50
|
+
if self.outline is None:
|
51
|
+
return None
|
52
|
+
max_x = float("-inf")
|
53
|
+
max_y = float("-inf")
|
54
|
+
min_x = float("inf")
|
55
|
+
min_y = float("inf")
|
56
|
+
for x, y in self.outline:
|
57
|
+
if x > max_x:
|
58
|
+
max_x = x
|
59
|
+
if y > max_y:
|
60
|
+
max_y = y
|
61
|
+
if x < min_x:
|
62
|
+
min_x = x
|
63
|
+
if y < min_y:
|
64
|
+
min_y = y
|
65
|
+
return min_x, min_y, max_x, max_y
|
66
|
+
|
67
|
+
@property
|
68
|
+
def status(self):
|
69
|
+
if self.is_running():
|
70
|
+
if self.time_started:
|
71
|
+
return "Running"
|
72
|
+
else:
|
73
|
+
return "Queued"
|
74
|
+
else:
|
75
|
+
if self.enabled:
|
76
|
+
return "Waiting"
|
77
|
+
else:
|
78
|
+
return "Disabled"
|
79
|
+
|
80
|
+
def is_running(self):
|
81
|
+
return not self._stopped
|
82
|
+
|
83
|
+
def execute(self, driver=None):
|
84
|
+
"""
|
85
|
+
Execute calls each item in the list of items in order. This is intended to be called by the spooler thread. And
|
86
|
+
hold the spooler while these items are executing.
|
87
|
+
@return:
|
88
|
+
"""
|
89
|
+
self._stopped = False
|
90
|
+
self.time_started = time.time()
|
91
|
+
self.time_pass_started = time.time()
|
92
|
+
self.steps_total = 0
|
93
|
+
self.calc_steps()
|
94
|
+
try:
|
95
|
+
while self.loops_executed < self.loops:
|
96
|
+
self.steps_done = 0
|
97
|
+
if self._stopped:
|
98
|
+
return False
|
99
|
+
while self.item_index < len(self.items):
|
100
|
+
if self._stopped:
|
101
|
+
return False
|
102
|
+
item = self.items[self.item_index]
|
103
|
+
self.execute_item(item)
|
104
|
+
if self._stopped:
|
105
|
+
return False
|
106
|
+
self.item_index += 1
|
107
|
+
self.item_index = 0
|
108
|
+
self.loops_executed += 1
|
109
|
+
self.time_pass_started = time.time()
|
110
|
+
self.avg_time_per_pass = self.elapsed_time() / self.loops_executed
|
111
|
+
finally:
|
112
|
+
self.runtime += time.time() - self.time_started
|
113
|
+
self._stopped = True
|
114
|
+
return True
|
115
|
+
|
116
|
+
def calc_steps(self):
|
117
|
+
def simple_step(item):
|
118
|
+
if isinstance(item, tuple):
|
119
|
+
attr = item[0]
|
120
|
+
if hasattr(self._driver, attr):
|
121
|
+
self.steps_total += 1
|
122
|
+
# STRING
|
123
|
+
elif isinstance(item, str):
|
124
|
+
attr = item
|
125
|
+
if hasattr(self._driver, attr):
|
126
|
+
self.steps_total += 1
|
127
|
+
# .generator is a Generator
|
128
|
+
elif hasattr(item, "generate"):
|
129
|
+
item = getattr(item, "generate")
|
130
|
+
for p in item():
|
131
|
+
simple_step(p)
|
132
|
+
|
133
|
+
self.steps_total = 0
|
134
|
+
for pitem in self.items:
|
135
|
+
simple_step(pitem)
|
136
|
+
|
137
|
+
def execute_item(self, item):
|
138
|
+
"""
|
139
|
+
This executes the different classes of spoolable object.
|
140
|
+
|
141
|
+
* (str, attribute, ...) calls self.driver.str(*attributes)
|
142
|
+
* str, calls self.driver.str()
|
143
|
+
* has_attribute(generator), recursive call to list of lines produced by the
|
144
|
+
generator, recursive call to list of lines produced by generator
|
145
|
+
|
146
|
+
@param item:
|
147
|
+
@return:
|
148
|
+
"""
|
149
|
+
if isinstance(item, tuple):
|
150
|
+
attr = item[0]
|
151
|
+
if hasattr(self._driver, attr):
|
152
|
+
function = getattr(self._driver, attr)
|
153
|
+
function(*item[1:])
|
154
|
+
self.steps_done += 1
|
155
|
+
return
|
156
|
+
|
157
|
+
# STRING
|
158
|
+
if isinstance(item, str):
|
159
|
+
attr = item
|
160
|
+
|
161
|
+
if hasattr(self._driver, attr):
|
162
|
+
function = getattr(self._driver, attr)
|
163
|
+
function()
|
164
|
+
self.steps_done += 1
|
165
|
+
return
|
166
|
+
|
167
|
+
# .generator is a Generator
|
168
|
+
if hasattr(item, "generate"):
|
169
|
+
item = getattr(item, "generate")
|
170
|
+
|
171
|
+
# Generator item
|
172
|
+
for p in item():
|
173
|
+
if self._stopped:
|
174
|
+
return
|
175
|
+
self.execute_item(p)
|
176
|
+
|
177
|
+
def stop(self):
|
178
|
+
"""
|
179
|
+
Stop this current laser-job, cannot be called from the spooler thread.
|
180
|
+
@return:
|
181
|
+
"""
|
182
|
+
if not self._stopped:
|
183
|
+
self.runtime += time.time() - self.time_started
|
184
|
+
self._stopped = True
|
185
|
+
|
186
|
+
def stop_after_loop(self):
|
187
|
+
self.loops = self.loops_executed + 1
|
188
|
+
|
189
|
+
def add_another_loop(self):
|
190
|
+
if not isinf(self.loops):
|
191
|
+
self.loops += 1
|
192
|
+
|
193
|
+
def elapsed_time(self):
|
194
|
+
"""
|
195
|
+
How long is this job already running...
|
196
|
+
"""
|
197
|
+
if self.is_running():
|
198
|
+
return time.time() - self.time_started
|
199
|
+
else:
|
200
|
+
return self.runtime
|
201
|
+
|
202
|
+
def estimate_time(self):
|
203
|
+
"""
|
204
|
+
Give laser job time estimate.
|
205
|
+
|
206
|
+
This is rather 'simple', we have no clue what exactly this job is doing, but we have some ideas,
|
207
|
+
if and only if the job is_running:
|
208
|
+
a) we know the elapsed time
|
209
|
+
b) we know current and total steps (if the driver has such a property)
|
210
|
+
@return:
|
211
|
+
"""
|
212
|
+
if isinf(self.loops):
|
213
|
+
return float("inf")
|
214
|
+
if (
|
215
|
+
self.is_running()
|
216
|
+
and self.time_started is not None
|
217
|
+
and self.avg_time_per_pass
|
218
|
+
):
|
219
|
+
return self.avg_time_per_pass * self.loops
|
220
|
+
return self.loops * self._estimate
|
meerk40t/core/logging.py
CHANGED
@@ -1,63 +1,63 @@
|
|
1
|
-
from meerk40t.kernel import Service, Settings
|
2
|
-
|
3
|
-
"""
|
4
|
-
Logging is used by the spooler and could be used by other services. It provides a service for log information.
|
5
|
-
Currently this mostly logs spooler jobs that are completed.
|
6
|
-
"""
|
7
|
-
|
8
|
-
|
9
|
-
def plugin(kernel, lifecycle=None):
|
10
|
-
_ = kernel.translation
|
11
|
-
if lifecycle == "register":
|
12
|
-
kernel.add_service("logging", Logging(kernel))
|
13
|
-
|
14
|
-
|
15
|
-
class Logging(Service):
|
16
|
-
"""
|
17
|
-
The logging service is located at .logging and stores and saves logged information. This should not store critical
|
18
|
-
data and if the logging file is destroyed or deleted it should have no bearing on anything other than saved logs.
|
19
|
-
"""
|
20
|
-
|
21
|
-
def __init__(self, kernel, *args, **kwargs):
|
22
|
-
Service.__init__(self, kernel, "logging")
|
23
|
-
self._setting_config = Settings(self.kernel.name, "meerk40t.log")
|
24
|
-
self.logs = self._setting_config.literal_dict()
|
25
|
-
|
26
|
-
def matching_events(self, prefix, **kwargs):
|
27
|
-
for event_key in list(self.logs):
|
28
|
-
if not str(event_key).startswith(prefix):
|
29
|
-
continue
|
30
|
-
event = self.logs[event_key]
|
31
|
-
good = True
|
32
|
-
for key in kwargs:
|
33
|
-
if key in event and kwargs[key] != event[key]:
|
34
|
-
good = False
|
35
|
-
break
|
36
|
-
if good:
|
37
|
-
yield event_key, event
|
38
|
-
|
39
|
-
def uid(self, prefix):
|
40
|
-
if "uid" not in self.logs:
|
41
|
-
self.logs["uid"] = dict()
|
42
|
-
if prefix not in self.logs["uid"]:
|
43
|
-
self.logs["uid"][prefix] = 0
|
44
|
-
self.logs["uid"][prefix] += 1
|
45
|
-
return f"{prefix}{self.logs['uid'][prefix]}"
|
46
|
-
|
47
|
-
def event(self, event):
|
48
|
-
if "uid" in event:
|
49
|
-
uid = event["uid"]
|
50
|
-
del event["uid"]
|
51
|
-
else:
|
52
|
-
uid = self.uid("event")
|
53
|
-
self.logs[uid] = event
|
54
|
-
|
55
|
-
def shutdown(self, *args, **kwargs):
|
56
|
-
self._setting_config.set_dict(self.logs)
|
57
|
-
self._setting_config.write_configuration()
|
58
|
-
|
59
|
-
def service_detach(self, *args, **kwargs):
|
60
|
-
pass
|
61
|
-
|
62
|
-
def service_attach(self, *args, **kwargs):
|
63
|
-
pass
|
1
|
+
from meerk40t.kernel import Service, Settings
|
2
|
+
|
3
|
+
"""
|
4
|
+
Logging is used by the spooler and could be used by other services. It provides a service for log information.
|
5
|
+
Currently this mostly logs spooler jobs that are completed.
|
6
|
+
"""
|
7
|
+
|
8
|
+
|
9
|
+
def plugin(kernel, lifecycle=None):
|
10
|
+
_ = kernel.translation
|
11
|
+
if lifecycle == "register":
|
12
|
+
kernel.add_service("logging", Logging(kernel))
|
13
|
+
|
14
|
+
|
15
|
+
class Logging(Service):
|
16
|
+
"""
|
17
|
+
The logging service is located at .logging and stores and saves logged information. This should not store critical
|
18
|
+
data and if the logging file is destroyed or deleted it should have no bearing on anything other than saved logs.
|
19
|
+
"""
|
20
|
+
|
21
|
+
def __init__(self, kernel, *args, **kwargs):
|
22
|
+
Service.__init__(self, kernel, "logging")
|
23
|
+
self._setting_config = Settings(self.kernel.name, "meerk40t.log")
|
24
|
+
self.logs = self._setting_config.literal_dict()
|
25
|
+
|
26
|
+
def matching_events(self, prefix, **kwargs):
|
27
|
+
for event_key in list(self.logs):
|
28
|
+
if not str(event_key).startswith(prefix):
|
29
|
+
continue
|
30
|
+
event = self.logs[event_key]
|
31
|
+
good = True
|
32
|
+
for key in kwargs:
|
33
|
+
if key in event and kwargs[key] != event[key]:
|
34
|
+
good = False
|
35
|
+
break
|
36
|
+
if good:
|
37
|
+
yield event_key, event
|
38
|
+
|
39
|
+
def uid(self, prefix):
|
40
|
+
if "uid" not in self.logs:
|
41
|
+
self.logs["uid"] = dict()
|
42
|
+
if prefix not in self.logs["uid"]:
|
43
|
+
self.logs["uid"][prefix] = 0
|
44
|
+
self.logs["uid"][prefix] += 1
|
45
|
+
return f"{prefix}{self.logs['uid'][prefix]}"
|
46
|
+
|
47
|
+
def event(self, event):
|
48
|
+
if "uid" in event:
|
49
|
+
uid = event["uid"]
|
50
|
+
del event["uid"]
|
51
|
+
else:
|
52
|
+
uid = self.uid("event")
|
53
|
+
self.logs[uid] = event
|
54
|
+
|
55
|
+
def shutdown(self, *args, **kwargs):
|
56
|
+
self._setting_config.set_dict(self.logs)
|
57
|
+
self._setting_config.write_configuration()
|
58
|
+
|
59
|
+
def service_detach(self, *args, **kwargs):
|
60
|
+
pass
|
61
|
+
|
62
|
+
def service_attach(self, *args, **kwargs):
|
63
|
+
pass
|