meerk40t 0.9.3001__py2.py3-none-any.whl → 0.9.7010__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 +1195 -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 +1844 -1507
- meerk40t/core/elements/clipboard.py +229 -219
- meerk40t/core/elements/element_treeops.py +4561 -2837
- meerk40t/core/elements/element_types.py +125 -105
- meerk40t/core/elements/elements.py +4329 -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 +933 -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/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 +462 -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 +198 -0
- meerk40t/extra/ezd.py +1165 -1165
- meerk40t/extra/hershey.py +835 -340
- meerk40t/extra/imageactions.py +322 -316
- meerk40t/extra/inkscape.py +630 -622
- meerk40t/extra/lbrn.py +424 -424
- meerk40t/extra/outerworld.py +284 -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 +1081 -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 +170 -133
- meerk40t/gui/choicepropertypanel.py +1673 -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 +1430 -846
- meerk40t/gui/icons.py +3422 -2747
- meerk40t/gui/imagesplitter.py +555 -508
- meerk40t/gui/keymap.py +354 -344
- meerk40t/gui/laserpanel.py +892 -806
- meerk40t/gui/laserrender.py +1470 -1232
- meerk40t/gui/lasertoolpanel.py +805 -793
- meerk40t/gui/magnetoptions.py +436 -0
- meerk40t/gui/materialmanager.py +2917 -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 +494 -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 +2468 -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 +589 -346
- meerk40t/gui/scenewidgets/relocatewidget.py +33 -33
- meerk40t/gui/scenewidgets/reticlewidget.py +83 -83
- meerk40t/gui/scenewidgets/selectionwidget.py +2952 -2756
- meerk40t/gui/simpleui.py +357 -333
- meerk40t/gui/simulation.py +2431 -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 +591 -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 +160 -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 +1444 -1169
- meerk40t/gui/wxmmain.py +5578 -4112
- meerk40t/gui/wxmribbon.py +1591 -1076
- meerk40t/gui/wxmscene.py +1635 -1453
- meerk40t/gui/wxmtree.py +2410 -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 +2778 -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 +3809 -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 +102 -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 +390 -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 +672 -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 +940 -940
- meerk40t/tools/rasterplotter.py +1660 -547
- meerk40t/tools/shxparser.py +989 -901
- meerk40t/tools/ttfparser.py +726 -446
- meerk40t/tools/zinglplotter.py +595 -593
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/LICENSE +21 -21
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/METADATA +150 -139
- meerk40t-0.9.7010.dist-info/RECORD +445 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/WHEEL +1 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/top_level.txt +0 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.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.7010.dist-info}/entry_points.txt +0 -0
meerk40t/gui/plugin.py
CHANGED
@@ -1,328 +1,494 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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
|
-
|
58
|
-
|
59
|
-
return
|
60
|
-
if
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
kernel
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
from meerk40t.gui.themes import Themes
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
"
|
106
|
-
"
|
107
|
-
|
108
|
-
|
109
|
-
"
|
110
|
-
"
|
111
|
-
"
|
112
|
-
"
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
"
|
118
|
-
"
|
119
|
-
|
120
|
-
|
121
|
-
"
|
122
|
-
"
|
123
|
-
|
124
|
-
|
125
|
-
"
|
126
|
-
"
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
"
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
"
|
139
|
-
"
|
140
|
-
"
|
141
|
-
"
|
142
|
-
"
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
"
|
151
|
-
"
|
152
|
-
|
153
|
-
|
154
|
-
"
|
155
|
-
"
|
156
|
-
"
|
157
|
-
"
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
"
|
163
|
-
"
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
"
|
177
|
-
"
|
178
|
-
"
|
179
|
-
|
180
|
-
|
181
|
-
"
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
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
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
1
|
+
import platform
|
2
|
+
|
3
|
+
def plugin(kernel, lifecycle):
|
4
|
+
_ = kernel.translation
|
5
|
+
kernel_root = kernel.root
|
6
|
+
|
7
|
+
if lifecycle == "precli":
|
8
|
+
kernel._hard_gui = True
|
9
|
+
kernel._gui = True
|
10
|
+
|
11
|
+
elif lifecycle == "cli":
|
12
|
+
kernel._gui = not kernel.args.no_gui
|
13
|
+
kernel._hard_gui = not kernel.args.gui_suppress
|
14
|
+
try:
|
15
|
+
import wx
|
16
|
+
except ImportError:
|
17
|
+
kernel._gui = False
|
18
|
+
|
19
|
+
@kernel.console_command("gui", help=_("starts the gui"))
|
20
|
+
def gui_fail(channel=None, **kwargs):
|
21
|
+
channel(
|
22
|
+
"wxPython is not installed. No graphical user interface possible."
|
23
|
+
)
|
24
|
+
|
25
|
+
return
|
26
|
+
if kernel._hard_gui:
|
27
|
+
kernel.set_feature("wx")
|
28
|
+
|
29
|
+
@kernel.console_command("gui", help=_("starts the gui"))
|
30
|
+
def gui_start(**kwargs):
|
31
|
+
kernel._gui = True # Set gui to initialize.
|
32
|
+
|
33
|
+
else:
|
34
|
+
kernel._gui = False
|
35
|
+
if lifecycle == "invalidate":
|
36
|
+
if not kernel._hard_gui:
|
37
|
+
return True
|
38
|
+
try:
|
39
|
+
import wx
|
40
|
+
except ImportError:
|
41
|
+
print("wxMeerK40t plugin could not load because wxPython is not installed.")
|
42
|
+
return True
|
43
|
+
# Let's check whether we have an incompatible version of wxpython and python.
|
44
|
+
# Python 3.10 onwards no longer supports automatic casts of decimals to ints:
|
45
|
+
# Builtin and extension functions that take integer arguments no longer accept
|
46
|
+
# Decimals, Fractions and other objects that can be converted to integers only
|
47
|
+
# with a loss (e.g. that have the __int__() method but do not have the __index__() method).
|
48
|
+
# wxpython up to 4.1.1 exposes this issue
|
49
|
+
try:
|
50
|
+
if wx.VERSION[:2] <= (4, 1):
|
51
|
+
testcase = wx.Size(0.5, 1)
|
52
|
+
except TypeError:
|
53
|
+
print(
|
54
|
+
"""The version of wxPython you are running is incompatible with your current Python version.
|
55
|
+
At the time of writing this is especially true for any Python version >= 3.10
|
56
|
+
and a wxpython version <= 4.1.1."""
|
57
|
+
)
|
58
|
+
return True
|
59
|
+
return False
|
60
|
+
if not kernel.has_feature("wx"):
|
61
|
+
return
|
62
|
+
if lifecycle == "preregister":
|
63
|
+
# lc = kernel_root.setting(str, "i18n", "en")
|
64
|
+
# kernel.set_language(lc)
|
65
|
+
# from ..kernel import _
|
66
|
+
# import wx
|
67
|
+
# wx.GetTranslation = _
|
68
|
+
|
69
|
+
from meerk40t.gui.fonts import wxfont_to_svg
|
70
|
+
from meerk40t.gui.laserrender import LaserRender
|
71
|
+
from meerk40t.gui.wxmeerk40t import wxMeerK40t
|
72
|
+
|
73
|
+
kernel.register("module/wxMeerK40t", wxMeerK40t)
|
74
|
+
kernel_root.open("module/wxMeerK40t")
|
75
|
+
|
76
|
+
# Registers the render-op make_raster. This is used to do cut planning.
|
77
|
+
renderer = LaserRender(kernel_root)
|
78
|
+
kernel_root.register("render-op/make_raster", renderer.make_raster)
|
79
|
+
kernel_root.register("font/wx_to_svg", wxfont_to_svg)
|
80
|
+
if lifecycle == "register":
|
81
|
+
from meerk40t.gui.themes import Themes
|
82
|
+
kernel.add_service("themes", Themes(kernel))
|
83
|
+
|
84
|
+
from meerk40t.gui.guicolors import GuiColors
|
85
|
+
kernel.add_service("colors", GuiColors(kernel))
|
86
|
+
|
87
|
+
from meerk40t.gui.scene.scene import Scene
|
88
|
+
kernel.register("module/Scene", Scene)
|
89
|
+
|
90
|
+
|
91
|
+
elif lifecycle == "boot":
|
92
|
+
kernel_root = kernel.root
|
93
|
+
choices = [
|
94
|
+
{
|
95
|
+
"attr": "units_name",
|
96
|
+
"object": kernel_root,
|
97
|
+
"default": "mm",
|
98
|
+
"type": str,
|
99
|
+
},
|
100
|
+
]
|
101
|
+
kernel.register_choices("units", choices)
|
102
|
+
elif lifecycle == "postboot":
|
103
|
+
choices = [
|
104
|
+
{
|
105
|
+
"attr": "supress_non_visible",
|
106
|
+
"object": kernel.root,
|
107
|
+
"default": True,
|
108
|
+
"type": bool,
|
109
|
+
"label": _("Optimize element display"),
|
110
|
+
"tip": _("Suppresses the drawing of non-visible elements (disable only if you face display issues)"),
|
111
|
+
"page": "Gui",
|
112
|
+
"section": "General",
|
113
|
+
},
|
114
|
+
{
|
115
|
+
"attr": "windows_save",
|
116
|
+
"object": kernel.root,
|
117
|
+
"default": True,
|
118
|
+
"type": bool,
|
119
|
+
"label": _("Save Window Positions"),
|
120
|
+
"tip": _("Open Windows at the same place they were last closed"),
|
121
|
+
"page": "Gui",
|
122
|
+
"section": "General",
|
123
|
+
},
|
124
|
+
{
|
125
|
+
"attr": "auto_spooler",
|
126
|
+
"object": kernel.root,
|
127
|
+
"default": True,
|
128
|
+
"type": bool,
|
129
|
+
"label": _("Launch Spooler on Job Start"),
|
130
|
+
"tip": _(
|
131
|
+
"Open the Spooler window automatically when you Execute a Job"
|
132
|
+
),
|
133
|
+
"page": "Laser",
|
134
|
+
"section": "General",
|
135
|
+
},
|
136
|
+
{
|
137
|
+
"attr": "mouse_wheel_pan",
|
138
|
+
"object": kernel.root,
|
139
|
+
"default": False,
|
140
|
+
"type": bool,
|
141
|
+
"label": _("MouseWheel Pan"),
|
142
|
+
"tip": "\n".join(
|
143
|
+
(
|
144
|
+
_("Unset: MouseWheel=Zoom. Shift+MouseWheel=Horizontal pan."),
|
145
|
+
_(
|
146
|
+
"Set: MouseWheel=Vertical pan. Ctrl+MouseWheel=Zoom. Shift+MouseWheel=Horizontal pan."
|
147
|
+
),
|
148
|
+
)
|
149
|
+
),
|
150
|
+
"page": "Gui",
|
151
|
+
"section": "General",
|
152
|
+
},
|
153
|
+
{
|
154
|
+
"attr": "mouse_pan_invert",
|
155
|
+
"object": kernel.root,
|
156
|
+
"default": False,
|
157
|
+
"type": bool,
|
158
|
+
"label": _("Invert MouseWheel Pan"),
|
159
|
+
"tip": _(
|
160
|
+
"Reverses the direction of the MouseWheel for horizontal & vertical pan"
|
161
|
+
),
|
162
|
+
"page": "Gui",
|
163
|
+
"section": "General",
|
164
|
+
},
|
165
|
+
{
|
166
|
+
"attr": "mouse_zoom_invert",
|
167
|
+
"object": kernel.root,
|
168
|
+
"default": False,
|
169
|
+
"type": bool,
|
170
|
+
"label": _("Invert MouseWheel Zoom"),
|
171
|
+
"tip": _("Reverses the direction of the MouseWheel for zoom"),
|
172
|
+
"page": "Gui",
|
173
|
+
"section": "General",
|
174
|
+
},
|
175
|
+
{
|
176
|
+
"attr": "disable_tool_tips",
|
177
|
+
"object": kernel.root,
|
178
|
+
"default": False,
|
179
|
+
"type": bool,
|
180
|
+
"label": _("Disable ToolTips"),
|
181
|
+
"tip": "\n".join(
|
182
|
+
(
|
183
|
+
_(
|
184
|
+
"If you do not want to see tooltips like this one, check this box."
|
185
|
+
),
|
186
|
+
_("Particularly useful if you have a touch screen."),
|
187
|
+
_(
|
188
|
+
"Note: You will need to restart MeerK40t for any change to take effect."
|
189
|
+
),
|
190
|
+
)
|
191
|
+
),
|
192
|
+
"page": "Gui",
|
193
|
+
"section": "Tooltips",
|
194
|
+
"signals": "restart",
|
195
|
+
},
|
196
|
+
{
|
197
|
+
"attr": "disable_tree_tool_tips",
|
198
|
+
"object": kernel.root,
|
199
|
+
"default": False,
|
200
|
+
"type": bool,
|
201
|
+
"label": _("Disable tooltips over tree"),
|
202
|
+
"tip": _(
|
203
|
+
"You can suppress the tooltips over operations and elements in the tree"
|
204
|
+
),
|
205
|
+
"page": "Gui",
|
206
|
+
"section": "Tooltips",
|
207
|
+
},
|
208
|
+
{
|
209
|
+
"attr": "tooltip_delay",
|
210
|
+
"object": kernel.root,
|
211
|
+
"default": 100,
|
212
|
+
"type": int,
|
213
|
+
"style": "flat",
|
214
|
+
"label": _("ToolTip delay"),
|
215
|
+
"trailer": "ms",
|
216
|
+
"tip": _("How long do you need to hover over a control before the tooltip appears"),
|
217
|
+
"page": "Gui",
|
218
|
+
"section": "Tooltips",
|
219
|
+
"signals": "restart",
|
220
|
+
},
|
221
|
+
{
|
222
|
+
"attr": "tooltip_autopop",
|
223
|
+
"object": kernel.root,
|
224
|
+
"default": 10000,
|
225
|
+
"type": int,
|
226
|
+
"style": "flat",
|
227
|
+
"label": _("ToolTip duration"),
|
228
|
+
"trailer": "ms",
|
229
|
+
"tip": _("How long should the tooltip stay before it disappears"),
|
230
|
+
"page": "Gui",
|
231
|
+
"section": "Tooltips",
|
232
|
+
"signals": "restart",
|
233
|
+
},
|
234
|
+
{
|
235
|
+
"attr": "concern_level",
|
236
|
+
"object": kernel.root,
|
237
|
+
"default": 0,
|
238
|
+
"type": int,
|
239
|
+
"style": "option",
|
240
|
+
"display": (
|
241
|
+
_("Low + Normal + Critical"),
|
242
|
+
_("Normal + Critical"),
|
243
|
+
_("Critical"),
|
244
|
+
_("Ignore all"),
|
245
|
+
),
|
246
|
+
"choices": (1, 2, 3, 4),
|
247
|
+
"label": _("Level"),
|
248
|
+
"tip": (
|
249
|
+
_("Which warning severity level do you want to recognize") + "\n" +
|
250
|
+
_("Critical: might damage your laser (e.g. laserhead bumping into rail)") + "\n" +
|
251
|
+
_("Normal: might ruin your burn (e.g. unassigned=unburnt elements)") + "\n" +
|
252
|
+
_("Low: I hope you know what your doing (e.g. disabled operations)")
|
253
|
+
),
|
254
|
+
"page": "Gui",
|
255
|
+
"section": "Warning-Indicator",
|
256
|
+
"signals": ("icons", "warn_state_update"),
|
257
|
+
},
|
258
|
+
]
|
259
|
+
kernel.register_choices("preferences", choices)
|
260
|
+
|
261
|
+
elif lifecycle == "mainloop":
|
262
|
+
# Replace the default kernel data prompt for a wx Popup.
|
263
|
+
def prompt_popup(data_type, prompt):
|
264
|
+
import wx
|
265
|
+
|
266
|
+
with wx.TextEntryDialog(
|
267
|
+
None, prompt, _("Information Required:"), ""
|
268
|
+
) as dlg:
|
269
|
+
if dlg.ShowModal() == wx.ID_OK:
|
270
|
+
value = dlg.GetValue()
|
271
|
+
else:
|
272
|
+
return None
|
273
|
+
try:
|
274
|
+
return data_type(value)
|
275
|
+
except ValueError:
|
276
|
+
return None
|
277
|
+
|
278
|
+
kernel.prompt = prompt_popup
|
279
|
+
|
280
|
+
def yesno_popup(prompt, option_yes=None, option_no=None, caption=None):
|
281
|
+
"""
|
282
|
+
@param prompt: question asked of the user.
|
283
|
+
@param option_yes: input to be interpreted as yes (first letter is okay too).
|
284
|
+
@param option_no: input to be interpreted as no (first letter is okay too).
|
285
|
+
@param caption: caption for popup
|
286
|
+
"""
|
287
|
+
import wx
|
288
|
+
|
289
|
+
if option_yes is None:
|
290
|
+
option_yes = _("Yes")
|
291
|
+
if option_no is None:
|
292
|
+
option_no = _("No")
|
293
|
+
if caption is None:
|
294
|
+
caption = _("Question")
|
295
|
+
if option_yes == option_no:
|
296
|
+
dlg = wx.MessageDialog(
|
297
|
+
None,
|
298
|
+
message=prompt,
|
299
|
+
caption=caption,
|
300
|
+
style=wx.OK | wx.ICON_INFORMATION,
|
301
|
+
)
|
302
|
+
if dlg.SetOKLabel(option_yes):
|
303
|
+
dlg.SetMessage(prompt)
|
304
|
+
else:
|
305
|
+
dlg.SetMessage(
|
306
|
+
prompt + "\n" + _("(Yes={yes})").format(yes=option_yes)
|
307
|
+
)
|
308
|
+
else:
|
309
|
+
dlg = wx.MessageDialog(
|
310
|
+
None,
|
311
|
+
message=prompt,
|
312
|
+
caption=caption,
|
313
|
+
style=wx.YES_NO | wx.ICON_QUESTION,
|
314
|
+
)
|
315
|
+
if dlg.SetYesNoLabels(option_yes, option_no):
|
316
|
+
dlg.SetMessage(prompt)
|
317
|
+
else:
|
318
|
+
dlg.SetMessage(
|
319
|
+
prompt
|
320
|
+
+ "\n"
|
321
|
+
+ _("(Yes={yes}, No={no})").format(yes=option_yes, no=option_no)
|
322
|
+
)
|
323
|
+
|
324
|
+
response = dlg.ShowModal()
|
325
|
+
dlg.Destroy()
|
326
|
+
return bool(response in (wx.ID_YES, wx.ID_OK))
|
327
|
+
|
328
|
+
kernel.yesno = yesno_popup
|
329
|
+
|
330
|
+
from meerk40t.gui.busy import BusyInfo
|
331
|
+
|
332
|
+
kargs = {}
|
333
|
+
if kernel.themes.dark:
|
334
|
+
kargs["bgcolor"] = kernel.themes.get("win_bg")
|
335
|
+
kargs["fgcolor"] = kernel.themes.get("win_fg")
|
336
|
+
kernel.busyinfo = BusyInfo(**kargs)
|
337
|
+
|
338
|
+
@kernel.console_argument("message")
|
339
|
+
@kernel.console_command("notify", hidden=True)
|
340
|
+
def notification_message(message=None, **kwargs):
|
341
|
+
if message is None:
|
342
|
+
message = _("Something requires your attention")
|
343
|
+
from wx.adv import NotificationMessage
|
344
|
+
|
345
|
+
msg = NotificationMessage(title="MeerK40t", message=message)
|
346
|
+
msg.Show()
|
347
|
+
|
348
|
+
@kernel.console_argument(
|
349
|
+
"message", help=_("Message to display, optional"), default=""
|
350
|
+
)
|
351
|
+
@kernel.console_command("interrupt", hidden=True)
|
352
|
+
def interrupt(message="", **kwargs):
|
353
|
+
"""
|
354
|
+
Interrupt interrupts but does so in the gui thread. This is so that some
|
355
|
+
OSes like linux can be properly stopped in the gui. The gui-thread will
|
356
|
+
often be required. But, this will typically be called in the spooler thread.
|
357
|
+
|
358
|
+
If called in the main thread, we call the dialog ourselves to avoid livelock.
|
359
|
+
|
360
|
+
@param message:
|
361
|
+
@param kwargs:
|
362
|
+
@return:
|
363
|
+
"""
|
364
|
+
if not message:
|
365
|
+
message = _("Spooling Interrupted.")
|
366
|
+
|
367
|
+
import threading
|
368
|
+
|
369
|
+
import wx
|
370
|
+
|
371
|
+
lock = threading.Lock()
|
372
|
+
lock.acquire(True)
|
373
|
+
|
374
|
+
def message_dialog(*args):
|
375
|
+
dlg = wx.MessageDialog(
|
376
|
+
None,
|
377
|
+
message + "\n\n" + _("Press OK to Continue."),
|
378
|
+
_("Interrupt"),
|
379
|
+
wx.OK,
|
380
|
+
)
|
381
|
+
dlg.ShowModal()
|
382
|
+
dlg.Destroy()
|
383
|
+
lock.release()
|
384
|
+
|
385
|
+
if wx.IsMainThread():
|
386
|
+
# If we're in main thread we much call here or livelock.
|
387
|
+
message_dialog()
|
388
|
+
else:
|
389
|
+
wx.CallAfter(message_dialog, None)
|
390
|
+
lock.acquire(True)
|
391
|
+
|
392
|
+
if kernel._gui:
|
393
|
+
|
394
|
+
def detect_windows_dpi(context):
|
395
|
+
"""Get Windows DPI scaling factor and set DPI awareness."""
|
396
|
+
scale = 100
|
397
|
+
if not (platform.system() == "Windows" and context.setting(bool, "high_dpi", True)):
|
398
|
+
return scale
|
399
|
+
try:
|
400
|
+
# https://discuss.wxpython.org/t/support-for-high-dpi-on-windows-10/32925
|
401
|
+
from ctypes import OleDLL
|
402
|
+
shcore = OleDLL("shcore")
|
403
|
+
scale = shcore.GetScaleFactorForDevice(0)
|
404
|
+
shcore.SetProcessDpiAwareness(1)
|
405
|
+
except (AttributeError, ImportError, OSError):
|
406
|
+
# This is the wrong windows version, or we geta
|
407
|
+
pass
|
408
|
+
|
409
|
+
return scale
|
410
|
+
|
411
|
+
def detect_bitmap_scaling(icons):
|
412
|
+
import wx
|
413
|
+
"""
|
414
|
+
wxPython has unfortunately a bug of how it will deal with upscaling.
|
415
|
+
A user can set a scale in the windows display settings. The
|
416
|
+
moment that scale is set beyond 170% then out of a sudden wxpython will scale
|
417
|
+
up all images / bitmaps you hand it over. For 250% for instance
|
418
|
+
it will upscale all images by a factor of 3! If you need a specific bitmap
|
419
|
+
size then we have to artificially reduce the resolution by a third
|
420
|
+
to compensate this. This will make buttons - despite the high resolution -
|
421
|
+
look more pixely!
|
422
|
+
"""
|
423
|
+
bmap = icons.icons8_pause.GetBitmap(resize=50)
|
424
|
+
test_frame = wx.Frame(None, wx.ID_ANY)
|
425
|
+
test_control = wx.StaticBitmap(test_frame, wx.ID_ANY)
|
426
|
+
src_size = bmap.Size
|
427
|
+
test_control.SetBitmap(bmap)
|
428
|
+
actual_size = test_control.Size
|
429
|
+
test_frame.Destroy()
|
430
|
+
|
431
|
+
has_scaling_issue = abs(src_size[0] - actual_size[0]) > 2
|
432
|
+
correction = src_size[0] / actual_size[0] if has_scaling_issue else 1.0
|
433
|
+
return has_scaling_issue, correction
|
434
|
+
|
435
|
+
import meerk40t.gui.icons as icons
|
436
|
+
context = kernel.root
|
437
|
+
context.user_scale = detect_windows_dpi(context)
|
438
|
+
context.faulty_bitmap_scaling, context.bitmap_correction_scale = detect_bitmap_scaling(icons)
|
439
|
+
|
440
|
+
flag = kernel.themes.dark
|
441
|
+
icons.DARKMODE = flag
|
442
|
+
flag = context.faulty_bitmap_scaling
|
443
|
+
sizeme = 150 if flag else 400
|
444
|
+
image = icons.icon_meerk40t.GetBitmap(resize=sizeme)
|
445
|
+
from ..main import APPLICATION_VERSION
|
446
|
+
if platform.system() != "Linux":
|
447
|
+
kernel.busyinfo.start(msg=_("Start MeerK40t|V. {version}".format(version=APPLICATION_VERSION)), image=image)
|
448
|
+
kernel.busyinfo.change(msg=_("Loading main module"), keep=1)
|
449
|
+
meerk40tgui = kernel_root.open("module/wxMeerK40t")
|
450
|
+
|
451
|
+
@kernel.console_command(
|
452
|
+
("quit", "shutdown", "exit"), help=_("shuts down the gui and exits")
|
453
|
+
)
|
454
|
+
def shutdown(**kwargs):
|
455
|
+
try:
|
456
|
+
meerk40tgui.TopWindow.Close()
|
457
|
+
except AttributeError:
|
458
|
+
pass
|
459
|
+
|
460
|
+
if kernel.args.simpleui:
|
461
|
+
kernel.busyinfo.end()
|
462
|
+
kernel.console("window open SimpleUI\n")
|
463
|
+
meerk40tgui.MainLoop()
|
464
|
+
return
|
465
|
+
|
466
|
+
kernel.console("window open MeerK40t\n")
|
467
|
+
windows_to_ignore = ("HersheyFontSelector", "About", "Properties")
|
468
|
+
if kernel.busyinfo.shown:
|
469
|
+
kernel.busyinfo.change(msg=_("Loading windows"), keep=1)
|
470
|
+
for window in kernel.section_startswith("window/"):
|
471
|
+
wsplit = window.split(":")
|
472
|
+
window_name = wsplit[0]
|
473
|
+
window_index = wsplit[-1] if len(wsplit) > 1 else None
|
474
|
+
if kernel.read_persistent(bool, window, "open_on_start", False):
|
475
|
+
win_name = window_name[7:]
|
476
|
+
if win_name in windows_to_ignore:
|
477
|
+
continue
|
478
|
+
if window_index is not None:
|
479
|
+
kernel.console(
|
480
|
+
f"window open -m {window_index} {win_name} {window_index}\n"
|
481
|
+
)
|
482
|
+
else:
|
483
|
+
kernel.console(f"window open {win_name}\n")
|
484
|
+
|
485
|
+
if kernel.busyinfo.shown:
|
486
|
+
kernel.busyinfo.change(msg=_("Finishing GUI"), keep=1)
|
487
|
+
kernel.signal("started", "/", "")
|
488
|
+
try:
|
489
|
+
meerk40tgui.MainLoop()
|
490
|
+
except AssertionError as e:
|
491
|
+
# Under Darwin we have every now and then at program end a
|
492
|
+
# wx._core.wxAssertionError: ... in DoScreenToClient(): TopLevel Window missing
|
493
|
+
print (f"MeerK40t encountered an error at shutdown: {e}")
|
494
|
+
pass
|