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/undos.py
CHANGED
@@ -1,124 +1,278 @@
|
|
1
|
-
"""
|
2
|
-
Undo States
|
3
|
-
|
4
|
-
The undo class centralizes the undo stack and related commands. It's passed the
|
5
|
-
rootnode of the tree and can perform marks to save the current tree states and will
|
6
|
-
execute undo and redo operations for the tree.
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
self.
|
25
|
-
self.
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
self.
|
58
|
-
|
59
|
-
|
60
|
-
""
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
self.
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
if
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
self.
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
return
|
122
|
-
|
123
|
-
|
124
|
-
|
1
|
+
"""
|
2
|
+
Undo States
|
3
|
+
|
4
|
+
The undo class centralizes the undo stack and related commands. It's passed the
|
5
|
+
rootnode of the tree and can perform marks to save the current tree states and will
|
6
|
+
execute undo and redo operations for the tree.
|
7
|
+
|
8
|
+
|
9
|
+
For every change announced in the program ( with elements.undoscope("tag"): )
|
10
|
+
a complete backup of the element tree is being made before applying the changes
|
11
|
+
So the undo_stack contains the state before the change. And "undo" of that
|
12
|
+
undo_index will restore the state before.
|
13
|
+
If we have already made an undo (ie the undo_index is not the highest number
|
14
|
+
but below) then another mark will effectively create a new history.
|
15
|
+
|
16
|
+
"""
|
17
|
+
import threading
|
18
|
+
|
19
|
+
|
20
|
+
class UndoState:
|
21
|
+
def __init__(self, state, message=None, hold=False):
|
22
|
+
self.state = state
|
23
|
+
self.message = message
|
24
|
+
self.hold = hold
|
25
|
+
if self.message is None:
|
26
|
+
self.message = str(id(state))
|
27
|
+
|
28
|
+
@property
|
29
|
+
def tree_representation(self):
|
30
|
+
def node_representation(node):
|
31
|
+
t = node.type
|
32
|
+
if node.children:
|
33
|
+
t = f"{t}{'+' if node.expanded else ''}("
|
34
|
+
for n in node.children:
|
35
|
+
t = f"{t}{node_representation(n)},"
|
36
|
+
t += ")"
|
37
|
+
return t
|
38
|
+
|
39
|
+
s = ""
|
40
|
+
for node in self.state:
|
41
|
+
s += f"{node_representation(node)}, "
|
42
|
+
return s
|
43
|
+
|
44
|
+
def __str__(self):
|
45
|
+
return self.message # + ". " + self.tree_representation
|
46
|
+
|
47
|
+
|
48
|
+
class Undo:
|
49
|
+
LAST_STATE = "Last status"
|
50
|
+
|
51
|
+
def __init__(self, service, tree, active=True, levels=20):
|
52
|
+
self.debug_active = False
|
53
|
+
self.service = service
|
54
|
+
self.tree = tree
|
55
|
+
self.active = active
|
56
|
+
self.levels = max(3, levels) # at least three
|
57
|
+
self._lock = threading.Lock()
|
58
|
+
self._undo_stack = []
|
59
|
+
self._undo_index = -1
|
60
|
+
self.mark("init") # Set initial tree state.
|
61
|
+
self.message = None
|
62
|
+
|
63
|
+
def __str__(self):
|
64
|
+
return f"Undo(#{self._undo_index} in list of {len(self._undo_stack)} states)"
|
65
|
+
|
66
|
+
def mark(self, message=None, hold=False):
|
67
|
+
"""
|
68
|
+
Marks an undo state require a backup the tree information.
|
69
|
+
|
70
|
+
@param message: Optional message to be applied to the tree change.
|
71
|
+
|
72
|
+
@return:
|
73
|
+
"""
|
74
|
+
if not self.active:
|
75
|
+
return
|
76
|
+
with self._lock:
|
77
|
+
# print (f"** Mark {message} requested, current {self._undo_index} / {len(self._undo_stack)} **")
|
78
|
+
old_idx = self._undo_index
|
79
|
+
if self._undo_index < 0:
|
80
|
+
self._undo_index = 0
|
81
|
+
elif self._undo_index < len(self._undo_stack) and self._undo_stack[self._undo_index].hold:
|
82
|
+
# Just add another one on top of it
|
83
|
+
self._undo_index += 1
|
84
|
+
elif self._undo_stack[self._undo_index].message == self.LAST_STATE:
|
85
|
+
# Will be overwritten
|
86
|
+
pass
|
87
|
+
elif self._undo_index < len(self._undo_stack) - 1 and self._undo_stack[self._undo_index + 1].message != self.LAST_STATE:
|
88
|
+
# Will be overwritten
|
89
|
+
pass
|
90
|
+
else:
|
91
|
+
# Just add another one on top of it
|
92
|
+
self._undo_index += 1
|
93
|
+
|
94
|
+
if message is None:
|
95
|
+
message = self.message
|
96
|
+
try:
|
97
|
+
self._undo_stack.insert(
|
98
|
+
self._undo_index,
|
99
|
+
UndoState(self.tree.backup_tree(), message=message, hold=hold),
|
100
|
+
)
|
101
|
+
except KeyError as e:
|
102
|
+
# Hit a concurrent issue.
|
103
|
+
print(f"Could not save undo state: {e}")
|
104
|
+
self._undo_index = old_idx
|
105
|
+
return
|
106
|
+
# print (f"Deleting #{self._undo_index + 1} and above...")
|
107
|
+
del self._undo_stack[self._undo_index + 1 :]
|
108
|
+
while len(self._undo_stack) > self.levels:
|
109
|
+
self._undo_stack.pop(0)
|
110
|
+
self._undo_index -= 1
|
111
|
+
self.debug_me(f"Successfully inserted {message} at {self._undo_index} (old index was {old_idx})")
|
112
|
+
self.message = None
|
113
|
+
self.service.signal("undoredo")
|
114
|
+
|
115
|
+
def undo(self, index = None):
|
116
|
+
"""
|
117
|
+
Performs an undo operation restoring the tree state.
|
118
|
+
|
119
|
+
Note: because the undo.state is used directly, the UndoState's state must be
|
120
|
+
given a fresh copy.
|
121
|
+
@return:
|
122
|
+
"""
|
123
|
+
with self._lock:
|
124
|
+
to_be_restored = index if index is not None else self._undo_index - 1
|
125
|
+
if to_be_restored == 0:
|
126
|
+
# At bottom of stack.
|
127
|
+
return False
|
128
|
+
if len(self._undo_stack) == 0:
|
129
|
+
# Stack is entirely empty.
|
130
|
+
return False
|
131
|
+
self.debug_me(f"Undo requested: {to_be_restored}")
|
132
|
+
if to_be_restored == len(self._undo_stack) - 1 and self._undo_stack[to_be_restored].message != self.LAST_STATE:
|
133
|
+
# We store the current state, as none was stored so far
|
134
|
+
self._undo_stack.append(
|
135
|
+
UndoState(self.tree.backup_tree(), message=self.LAST_STATE),
|
136
|
+
)
|
137
|
+
# print ("**** Did add a last state to go back to if needed ****")
|
138
|
+
elif to_be_restored == len(self._undo_stack) - 2 and self._undo_stack[to_be_restored + 1].message == self.LAST_STATE:
|
139
|
+
# We are at the last actively monitored index but we already have a current state -> replace it
|
140
|
+
self._undo_stack.pop(-1)
|
141
|
+
self._undo_stack.append(
|
142
|
+
UndoState(self.tree.backup_tree(), message=self.LAST_STATE),
|
143
|
+
)
|
144
|
+
# print ("**** Did add a last state to go back to if needed, and overwrote the last state ****")
|
145
|
+
# print (f"Index: {self._undo_index} / {len(self._undo_stack)} - To be restored: {to_be_restored}, param: {index}")
|
146
|
+
self._undo_index = to_be_restored
|
147
|
+
try:
|
148
|
+
undo = self._undo_stack[to_be_restored]
|
149
|
+
except IndexError:
|
150
|
+
# Invalid? Reset to bottom of stack
|
151
|
+
self._undo_index = 0
|
152
|
+
return False
|
153
|
+
self.tree.restore_tree(undo.state)
|
154
|
+
# try:
|
155
|
+
# undo.state = self.tree.backup_tree() # Get unused copy
|
156
|
+
# except KeyError:
|
157
|
+
# pass
|
158
|
+
self.service.signal("undoredo")
|
159
|
+
self.debug_me("Undo done")
|
160
|
+
return True
|
161
|
+
|
162
|
+
def redo(self, index=None):
|
163
|
+
"""
|
164
|
+
Performs a redo operation restoring the tree state.
|
165
|
+
"""
|
166
|
+
with self._lock:
|
167
|
+
to_be_restored = index + 1 if index is not None else self._undo_index + 1
|
168
|
+
to_be_restored = min(len(self._undo_stack) - 1, to_be_restored)
|
169
|
+
self.debug_me(f"Redo requested: {index} -> will restore #{to_be_restored}")
|
170
|
+
self._undo_index = to_be_restored
|
171
|
+
try:
|
172
|
+
redo = self._undo_stack[to_be_restored]
|
173
|
+
except IndexError:
|
174
|
+
# Invalid? Reset to top of stack
|
175
|
+
self._undo_index = len(self._undo_stack)
|
176
|
+
return False
|
177
|
+
self.tree.restore_tree(redo.state)
|
178
|
+
# try:
|
179
|
+
# redo.state = self.tree.backup_tree() # Get unused copy
|
180
|
+
# except KeyError:
|
181
|
+
# pass
|
182
|
+
self.service.signal("undoredo")
|
183
|
+
self.debug_me("Redo done")
|
184
|
+
return True
|
185
|
+
|
186
|
+
def undolist(self):
|
187
|
+
covered = False
|
188
|
+
for i, v in enumerate(self._undo_stack):
|
189
|
+
q = "*" if i == self._undo_index else " "
|
190
|
+
covered = covered or (i == self._undo_index)
|
191
|
+
yield f"{q}{str(i).ljust(5)}: state {str(v)}"
|
192
|
+
if not covered:
|
193
|
+
yield f"Strange: {self._undo_index} out of bounds..."
|
194
|
+
|
195
|
+
def debug_me(self, request):
|
196
|
+
if not self.debug_active:
|
197
|
+
return
|
198
|
+
print (f"{request}, stack-index: {self._undo_index} - stack-size: {len(self._undo_stack)}")
|
199
|
+
for idx, s in enumerate(self._undo_stack):
|
200
|
+
print (f"[{idx}]{'*' if idx==self._undo_index else ' '} {'#' if idx==request else ' '} {str(s)}")
|
201
|
+
# self.debug_tree(s.state)
|
202
|
+
# for idx in range(len(self._undo_stack)):
|
203
|
+
# print (f"[{idx}]: undo-label: '{self.undo_string(idx=idx, debug=False)}', redo-label: '{self.redo_string(idx=idx, debug=False)}'")
|
204
|
+
|
205
|
+
|
206
|
+
def undo_string(self, idx = -1, **kwargs):
|
207
|
+
self.validate()
|
208
|
+
if idx < 0:
|
209
|
+
idx = self._undo_index - 1
|
210
|
+
return str(self._undo_stack[idx].message) if self.has_undo() else ""
|
211
|
+
|
212
|
+
def has_undo(self, *args):
|
213
|
+
self.validate()
|
214
|
+
return self.active and self._undo_index > 0
|
215
|
+
|
216
|
+
def redo_string(self, idx = -1, **kwargs):
|
217
|
+
self.validate()
|
218
|
+
if idx < 0:
|
219
|
+
idx = self._undo_index - 1
|
220
|
+
return str(self._undo_stack[idx + 1].message) if self.has_redo() else ""
|
221
|
+
|
222
|
+
def has_redo(self, *args):
|
223
|
+
self.validate()
|
224
|
+
return self.active and self._undo_index < len(self._undo_stack) - 1
|
225
|
+
|
226
|
+
def validate(self):
|
227
|
+
if self.active and self._undo_stack and self._undo_stack[-1].message != self.LAST_STATE:
|
228
|
+
# We store the current state, just to have something to fall back to if needed
|
229
|
+
if self._undo_index >= len(self._undo_stack) - 1:
|
230
|
+
self._undo_index += 1
|
231
|
+
# print ("** Validate called and appending last state **")
|
232
|
+
self._undo_stack.append(
|
233
|
+
UndoState(self.tree.backup_tree(), message=self.LAST_STATE),
|
234
|
+
)
|
235
|
+
|
236
|
+
def find(self, scope:str):
|
237
|
+
# self.debug_me(f"Looking for {scope}")
|
238
|
+
return next(
|
239
|
+
(
|
240
|
+
idx
|
241
|
+
for idx, state in enumerate(self._undo_stack)
|
242
|
+
if state.message == scope
|
243
|
+
),
|
244
|
+
-1,
|
245
|
+
)
|
246
|
+
|
247
|
+
def remove(self, index):
|
248
|
+
if 0 <= index < len(self._undo_stack):
|
249
|
+
# print (f"Removing index {index}")
|
250
|
+
# self.debug_me("before")
|
251
|
+
del self._undo_stack[index :]
|
252
|
+
self._undo_index = len(self._undo_stack) - 1
|
253
|
+
self.validate()
|
254
|
+
# self._undo_stack.pop(index)
|
255
|
+
# self.debug_me(f"after removing {index}")
|
256
|
+
|
257
|
+
def rename(self, index, message):
|
258
|
+
if 0 <= index < len(self._undo_stack):
|
259
|
+
self._undo_stack[index].message = message
|
260
|
+
|
261
|
+
def states(self, scope:str):
|
262
|
+
self.validate()
|
263
|
+
lower_end = 1 # Ignore First
|
264
|
+
upper_end = len(self._undo_stack) - 1 # Ignore last
|
265
|
+
if scope == "undo":
|
266
|
+
upper_end = self._undo_index
|
267
|
+
elif scope == "redo":
|
268
|
+
lower_end = self._undo_index
|
269
|
+
return ((idx, self._undo_stack[idx]) for idx in range(lower_end, upper_end))
|
270
|
+
|
271
|
+
def debug_tree(self, state):
|
272
|
+
def show_children(parent, header):
|
273
|
+
for e in parent._children:
|
274
|
+
print (f"{header} {e.type}")
|
275
|
+
show_children(e, header + "--")
|
276
|
+
for idx, n in enumerate(state):
|
277
|
+
print(f"[{idx}] {n.type}")
|
278
|
+
show_children(n, "--")
|