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
@@ -1,365 +1,365 @@
|
|
1
|
-
from meerk40t.gui.scene.sceneconst import (
|
2
|
-
HITCHAIN_DELEGATE_AND_HIT,
|
3
|
-
RESPONSE_CHAIN,
|
4
|
-
RESPONSE_CONSUME,
|
5
|
-
)
|
6
|
-
from meerk40t.gui.scene.widget import Widget
|
7
|
-
from meerk40t.svgelements import Matrix, Viewbox
|
8
|
-
|
9
|
-
|
10
|
-
class SceneSpaceWidget(Widget):
|
11
|
-
"""
|
12
|
-
SceneSpaceWidget contains two sections:
|
13
|
-
Interface: Drawn on top, uses no matrix.
|
14
|
-
Scene: Drawn at a particular scale relative to the zoom-pan scene.
|
15
|
-
"""
|
16
|
-
|
17
|
-
def __init__(self, scene):
|
18
|
-
Widget.__init__(self, scene, all=True)
|
19
|
-
self._view = None
|
20
|
-
self._frame = None
|
21
|
-
self.aspect = False
|
22
|
-
|
23
|
-
self.interface_widget = Widget(scene)
|
24
|
-
self.scene_widget = Widget(scene)
|
25
|
-
self.add_widget(-1, self.interface_widget)
|
26
|
-
self.add_widget(-1, self.scene_widget)
|
27
|
-
self.last_position = None
|
28
|
-
self._previous_zoom = None
|
29
|
-
self._placement_event = None
|
30
|
-
self._placement_event_type = None
|
31
|
-
self._scene_matrix_animator = SceneAnimateMatrix(self.scene_widget)
|
32
|
-
self.osv = -1
|
33
|
-
|
34
|
-
def hit(self):
|
35
|
-
"""
|
36
|
-
If any event captures the events they take priority. But, if nothing is hit, then the events
|
37
|
-
should be dealt with here. These are mostly zoom and pan events.
|
38
|
-
"""
|
39
|
-
return HITCHAIN_DELEGATE_AND_HIT
|
40
|
-
|
41
|
-
@property
|
42
|
-
def zoom_cutoff(self):
|
43
|
-
# Sets the maximum zoom_factor for the system
|
44
|
-
# establish os-system
|
45
|
-
if self.osv < 0:
|
46
|
-
from platform import system
|
47
|
-
|
48
|
-
sysname = system()
|
49
|
-
if sysname == "Windows":
|
50
|
-
# Windows
|
51
|
-
self.osv = 0
|
52
|
-
elif sysname == "Darwin":
|
53
|
-
# Mac
|
54
|
-
self.osv = 1
|
55
|
-
else:
|
56
|
-
# Linux
|
57
|
-
self.osv = 2
|
58
|
-
if self.osv == 0:
|
59
|
-
# Windows
|
60
|
-
cutoff = 22.0
|
61
|
-
elif self.osv == 1:
|
62
|
-
# Mac
|
63
|
-
cutoff = 0.99
|
64
|
-
else:
|
65
|
-
# Linux
|
66
|
-
cutoff = 3.0
|
67
|
-
return cutoff
|
68
|
-
|
69
|
-
@property
|
70
|
-
def pan_factor(self):
|
71
|
-
pf = self.scene.context.pan_factor
|
72
|
-
if self.scene.context.mouse_pan_invert:
|
73
|
-
pf = -pf
|
74
|
-
return pf
|
75
|
-
|
76
|
-
@property
|
77
|
-
def zoom_factor(self):
|
78
|
-
zf = self.scene.context.zoom_factor
|
79
|
-
if self.scene.context.mouse_zoom_invert:
|
80
|
-
zf = -zf
|
81
|
-
zf += 1.0
|
82
|
-
return zf
|
83
|
-
|
84
|
-
@property
|
85
|
-
def zoom_forward(self):
|
86
|
-
return self.zoom_factor
|
87
|
-
|
88
|
-
@property
|
89
|
-
def zoom_backwards(self):
|
90
|
-
zf = self.zoom_factor
|
91
|
-
if zf == 0:
|
92
|
-
return 1.0
|
93
|
-
return 1.0 / zf
|
94
|
-
|
95
|
-
def event(
|
96
|
-
self,
|
97
|
-
window_pos=None,
|
98
|
-
space_pos=None,
|
99
|
-
event_type=None,
|
100
|
-
nearest_snap=None,
|
101
|
-
modifiers=None,
|
102
|
-
**kwargs,
|
103
|
-
):
|
104
|
-
"""
|
105
|
-
Process the zooming and panning of otherwise unhit-widget events.
|
106
|
-
|
107
|
-
If nothing was otherwise hit by the event, we process the scene manipulation events
|
108
|
-
"""
|
109
|
-
|
110
|
-
if event_type == "hover":
|
111
|
-
return RESPONSE_CHAIN
|
112
|
-
if self.aspect:
|
113
|
-
return RESPONSE_CONSUME
|
114
|
-
|
115
|
-
if (event_type == "rightdown" and "alt" in modifiers) or (
|
116
|
-
event_type == "middledown" and "ctrl" in modifiers
|
117
|
-
):
|
118
|
-
self._previous_zoom = 1.0
|
119
|
-
self._placement_event = space_pos
|
120
|
-
self._placement_event_type = "zoom"
|
121
|
-
return RESPONSE_CONSUME
|
122
|
-
elif event_type == "rightdown" and "ctrl" in modifiers:
|
123
|
-
self._previous_zoom = 1.0
|
124
|
-
self._placement_event = space_pos
|
125
|
-
self._placement_event_type = "pan"
|
126
|
-
return RESPONSE_CONSUME
|
127
|
-
elif event_type == "rightup":
|
128
|
-
self._previous_zoom = None
|
129
|
-
self._placement_event = None
|
130
|
-
self._placement_event_type = None
|
131
|
-
elif event_type == "wheelup":
|
132
|
-
if bool(self.scene.context.mouse_wheel_pan) == bool(
|
133
|
-
"ctrl" not in modifiers
|
134
|
-
):
|
135
|
-
self.scene_widget.matrix.post_translate(0, -self.pan_factor)
|
136
|
-
else:
|
137
|
-
if (
|
138
|
-
self.scene_widget.matrix.value_scale_x() <= self.zoom_cutoff
|
139
|
-
and self.scene_widget.matrix.value_scale_y() <= self.zoom_cutoff
|
140
|
-
):
|
141
|
-
self.scene_widget.matrix.post_scale(
|
142
|
-
self.zoom_forward, self.zoom_forward, space_pos[0], space_pos[1]
|
143
|
-
)
|
144
|
-
self.scene.request_refresh()
|
145
|
-
return RESPONSE_CONSUME
|
146
|
-
elif event_type == "wheeldown":
|
147
|
-
if bool(self.scene.context.mouse_wheel_pan) == ("ctrl" not in modifiers):
|
148
|
-
self.scene_widget.matrix.post_translate(0, self.pan_factor)
|
149
|
-
else:
|
150
|
-
self.scene_widget.matrix.post_scale(
|
151
|
-
self.zoom_backwards, self.zoom_backwards, space_pos[0], space_pos[1]
|
152
|
-
)
|
153
|
-
self.scene.request_refresh()
|
154
|
-
return RESPONSE_CONSUME
|
155
|
-
elif event_type == "wheelleft":
|
156
|
-
self.scene_widget.matrix.post_translate(self.pan_factor, 0)
|
157
|
-
self.scene.request_refresh()
|
158
|
-
return RESPONSE_CONSUME
|
159
|
-
elif event_type == "wheelright":
|
160
|
-
self.scene_widget.matrix.post_translate(-self.pan_factor, 0)
|
161
|
-
self.scene.request_refresh()
|
162
|
-
return RESPONSE_CONSUME
|
163
|
-
elif event_type == "middledown":
|
164
|
-
return RESPONSE_CONSUME
|
165
|
-
elif event_type == "middleup":
|
166
|
-
self._placement_event_type = None
|
167
|
-
return RESPONSE_CONSUME
|
168
|
-
elif event_type == "gesture-start":
|
169
|
-
self._previous_zoom = 1.0
|
170
|
-
return RESPONSE_CONSUME
|
171
|
-
elif event_type == "gesture-end":
|
172
|
-
self._previous_zoom = None
|
173
|
-
return RESPONSE_CONSUME
|
174
|
-
elif event_type == "lost":
|
175
|
-
return RESPONSE_CONSUME
|
176
|
-
elif str(event_type).startswith("zoom "):
|
177
|
-
if self._previous_zoom is None:
|
178
|
-
return RESPONSE_CONSUME
|
179
|
-
try:
|
180
|
-
zoom = float(event_type.split(" ")[1])
|
181
|
-
except Exception:
|
182
|
-
return RESPONSE_CONSUME
|
183
|
-
|
184
|
-
zoom_change = zoom / self._previous_zoom
|
185
|
-
self.scene_widget.matrix.post_scale(
|
186
|
-
zoom_change, zoom_change, space_pos[0], space_pos[1]
|
187
|
-
)
|
188
|
-
self.scene_widget.matrix.post_translate(space_pos[4], space_pos[5])
|
189
|
-
self._previous_zoom = zoom
|
190
|
-
self.scene.request_refresh()
|
191
|
-
|
192
|
-
return RESPONSE_CONSUME
|
193
|
-
elif str(event_type).startswith("magnify "):
|
194
|
-
magnify = float(event_type.split(" ")[1])
|
195
|
-
self.scene_widget.matrix.post_scale(
|
196
|
-
magnify, magnify, space_pos[0], space_pos[1]
|
197
|
-
)
|
198
|
-
self.scene_widget.matrix.post_translate(space_pos[4], space_pos[5])
|
199
|
-
self.scene.context.signal("refresh_scene", 0)
|
200
|
-
|
201
|
-
return RESPONSE_CONSUME
|
202
|
-
|
203
|
-
# Movement
|
204
|
-
if self._placement_event_type is None:
|
205
|
-
self.scene_widget.matrix.post_translate(space_pos[4], space_pos[5])
|
206
|
-
self.scene.request_refresh()
|
207
|
-
elif self._placement_event_type == "zoom":
|
208
|
-
from math import e
|
209
|
-
|
210
|
-
p = (
|
211
|
-
space_pos[0]
|
212
|
-
- self._placement_event[0]
|
213
|
-
+ space_pos[1]
|
214
|
-
- self._placement_event[1]
|
215
|
-
)
|
216
|
-
p /= 250.0
|
217
|
-
if self._previous_zoom is not None:
|
218
|
-
zoom_factor = e**p
|
219
|
-
zoom_change = zoom_factor / self._previous_zoom
|
220
|
-
self._previous_zoom = zoom_factor
|
221
|
-
self.scene_widget.matrix.post_scale(
|
222
|
-
zoom_change,
|
223
|
-
zoom_change,
|
224
|
-
self._placement_event[0],
|
225
|
-
self._placement_event[1],
|
226
|
-
)
|
227
|
-
self.scene.request_refresh()
|
228
|
-
elif self._placement_event_type == "pan":
|
229
|
-
pan_factor_x = -(space_pos[0] - self._placement_event[0]) / 10
|
230
|
-
pan_factor_y = -(space_pos[1] - self._placement_event[1]) / 10
|
231
|
-
self.scene_widget.matrix.post_translate(pan_factor_x, pan_factor_y)
|
232
|
-
self.scene.request_refresh()
|
233
|
-
return
|
234
|
-
|
235
|
-
def set_view(self, x, y, w, h, preserve_aspect=None):
|
236
|
-
self._view = Viewbox(f"{x} {y} {w} {h}", preserve_aspect)
|
237
|
-
self.aspect_matrix()
|
238
|
-
|
239
|
-
def set_frame(self, x, y, w, h):
|
240
|
-
self._frame = Viewbox(f"{x} {y} {w} {h}")
|
241
|
-
self.aspect_matrix()
|
242
|
-
|
243
|
-
def set_aspect(self, aspect=True):
|
244
|
-
self.aspect = aspect
|
245
|
-
self.aspect_matrix()
|
246
|
-
|
247
|
-
def aspect_matrix(self):
|
248
|
-
"""
|
249
|
-
Specifically view the scene with the given Viewbox.
|
250
|
-
"""
|
251
|
-
if self._frame and self._view and self.aspect:
|
252
|
-
self.scene_widget.matrix = Matrix(self._view.transform(self._frame))
|
253
|
-
|
254
|
-
def focus_position_scene(self, scene_point, scene_size):
|
255
|
-
"""
|
256
|
-
Focus on the specific point within the scene.
|
257
|
-
"""
|
258
|
-
window_width, window_height = self.scene.ClientSize
|
259
|
-
scale_x = self.get_scale_x()
|
260
|
-
scale_y = self.get_scale_y()
|
261
|
-
self.scene_matrix_reset()
|
262
|
-
self.scene_post_pan(-scene_point[0], -scene_point[1])
|
263
|
-
self.scene_post_scale(scale_x, scale_y)
|
264
|
-
self.scene_post_pan(window_width / 2.0, window_height / 2.0)
|
265
|
-
|
266
|
-
def focus_viewport_scene(
|
267
|
-
self, new_scene_viewport, scene_size, buffer=0.0, lock=True, animate=False
|
268
|
-
):
|
269
|
-
"""
|
270
|
-
Focus on the given viewport in the scene.
|
271
|
-
|
272
|
-
@param new_scene_viewport: Viewport to have after this process within the scene.
|
273
|
-
@param scene_size: Size of the scene in which this viewport is active.
|
274
|
-
@param buffer: Amount of buffer around the edge of the new viewport.
|
275
|
-
@param lock: lock the scalex, scaley.
|
276
|
-
@param animate: perform focus with animated scene.
|
277
|
-
@return:
|
278
|
-
"""
|
279
|
-
window_width, window_height = scene_size
|
280
|
-
left = new_scene_viewport[0]
|
281
|
-
top = new_scene_viewport[1]
|
282
|
-
right = new_scene_viewport[2]
|
283
|
-
bottom = new_scene_viewport[3]
|
284
|
-
viewport_width = right - left
|
285
|
-
viewport_height = bottom - top
|
286
|
-
|
287
|
-
left -= viewport_width * buffer
|
288
|
-
right += viewport_width * buffer
|
289
|
-
top -= viewport_height * buffer
|
290
|
-
bottom += viewport_height * buffer
|
291
|
-
|
292
|
-
if right == left:
|
293
|
-
scale_x = 100
|
294
|
-
else:
|
295
|
-
scale_x = window_width / float(right - left)
|
296
|
-
if bottom == top:
|
297
|
-
scale_y = 100
|
298
|
-
else:
|
299
|
-
scale_y = window_height / float(bottom - top)
|
300
|
-
|
301
|
-
cx = (right + left) / 2
|
302
|
-
cy = (top + bottom) / 2
|
303
|
-
matrix = Matrix()
|
304
|
-
matrix.post_translate(-cx, -cy)
|
305
|
-
if lock:
|
306
|
-
scale = min(scale_x, scale_y)
|
307
|
-
if scale != 0:
|
308
|
-
matrix.post_scale(scale)
|
309
|
-
else:
|
310
|
-
if scale_x != 0 and scale_y != 0:
|
311
|
-
matrix.post_scale(scale_x, scale_y)
|
312
|
-
matrix.post_translate(window_width / 2.0, window_height / 2.0)
|
313
|
-
|
314
|
-
if animate:
|
315
|
-
self._scene_matrix_animator.set_animate_zoom(matrix)
|
316
|
-
self.scene.animate(self._scene_matrix_animator)
|
317
|
-
else:
|
318
|
-
self.scene_widget.matrix.reset()
|
319
|
-
self.scene_widget.matrix.post_cat(matrix)
|
320
|
-
|
321
|
-
|
322
|
-
class SceneAnimateMatrix:
|
323
|
-
def __init__(self, widget):
|
324
|
-
self.widget = widget
|
325
|
-
self.tick_max =
|
326
|
-
self.tick_index = 0
|
327
|
-
self._from_matrix = None
|
328
|
-
self._to_matrix = None
|
329
|
-
|
330
|
-
def set_animate_zoom(self, matrix):
|
331
|
-
self._from_matrix = Matrix(self.widget.matrix)
|
332
|
-
self._to_matrix = matrix
|
333
|
-
|
334
|
-
def start_threaded(self):
|
335
|
-
self.tick_index = 0
|
336
|
-
|
337
|
-
def tick(self):
|
338
|
-
if self._to_matrix is None or self._from_matrix is None:
|
339
|
-
return False # Nothing to animate.
|
340
|
-
if self.tick_max < self.tick_index:
|
341
|
-
self.widget.scene.request_refresh()
|
342
|
-
return False # Animation was complete.
|
343
|
-
amount = self.tick_index / self.tick_max
|
344
|
-
self.widget.matrix.a = (
|
345
|
-
amount * (self._to_matrix.a - self._from_matrix.a) + self._from_matrix.a
|
346
|
-
)
|
347
|
-
self.widget.matrix.b = (
|
348
|
-
amount * (self._to_matrix.b - self._from_matrix.b) + self._from_matrix.b
|
349
|
-
)
|
350
|
-
self.widget.matrix.c = (
|
351
|
-
amount * (self._to_matrix.c - self._from_matrix.c) + self._from_matrix.c
|
352
|
-
)
|
353
|
-
self.widget.matrix.d = (
|
354
|
-
amount * (self._to_matrix.d - self._from_matrix.d) + self._from_matrix.d
|
355
|
-
)
|
356
|
-
self.widget.matrix.e = (
|
357
|
-
amount * (self._to_matrix.e - self._from_matrix.e) + self._from_matrix.e
|
358
|
-
)
|
359
|
-
self.widget.matrix.f = (
|
360
|
-
amount * (self._to_matrix.f - self._from_matrix.f) + self._from_matrix.f
|
361
|
-
)
|
362
|
-
self.widget.scene.request_refresh_for_animation()
|
363
|
-
self.widget.on_matrix_change()
|
364
|
-
self.tick_index += 1
|
365
|
-
return True
|
1
|
+
from meerk40t.gui.scene.sceneconst import (
|
2
|
+
HITCHAIN_DELEGATE_AND_HIT,
|
3
|
+
RESPONSE_CHAIN,
|
4
|
+
RESPONSE_CONSUME,
|
5
|
+
)
|
6
|
+
from meerk40t.gui.scene.widget import Widget
|
7
|
+
from meerk40t.svgelements import Matrix, Viewbox
|
8
|
+
|
9
|
+
|
10
|
+
class SceneSpaceWidget(Widget):
|
11
|
+
"""
|
12
|
+
SceneSpaceWidget contains two sections:
|
13
|
+
Interface: Drawn on top, uses no matrix.
|
14
|
+
Scene: Drawn at a particular scale relative to the zoom-pan scene.
|
15
|
+
"""
|
16
|
+
|
17
|
+
def __init__(self, scene):
|
18
|
+
Widget.__init__(self, scene, all=True)
|
19
|
+
self._view = None
|
20
|
+
self._frame = None
|
21
|
+
self.aspect = False
|
22
|
+
|
23
|
+
self.interface_widget = Widget(scene)
|
24
|
+
self.scene_widget = Widget(scene)
|
25
|
+
self.add_widget(-1, self.interface_widget)
|
26
|
+
self.add_widget(-1, self.scene_widget)
|
27
|
+
self.last_position = None
|
28
|
+
self._previous_zoom = None
|
29
|
+
self._placement_event = None
|
30
|
+
self._placement_event_type = None
|
31
|
+
self._scene_matrix_animator = SceneAnimateMatrix(self.scene_widget)
|
32
|
+
self.osv = -1
|
33
|
+
|
34
|
+
def hit(self):
|
35
|
+
"""
|
36
|
+
If any event captures the events they take priority. But, if nothing is hit, then the events
|
37
|
+
should be dealt with here. These are mostly zoom and pan events.
|
38
|
+
"""
|
39
|
+
return HITCHAIN_DELEGATE_AND_HIT
|
40
|
+
|
41
|
+
@property
|
42
|
+
def zoom_cutoff(self):
|
43
|
+
# Sets the maximum zoom_factor for the system
|
44
|
+
# establish os-system
|
45
|
+
if self.osv < 0:
|
46
|
+
from platform import system
|
47
|
+
|
48
|
+
sysname = system()
|
49
|
+
if sysname == "Windows":
|
50
|
+
# Windows
|
51
|
+
self.osv = 0
|
52
|
+
elif sysname == "Darwin":
|
53
|
+
# Mac
|
54
|
+
self.osv = 1
|
55
|
+
else:
|
56
|
+
# Linux
|
57
|
+
self.osv = 2
|
58
|
+
if self.osv == 0:
|
59
|
+
# Windows
|
60
|
+
cutoff = 22.0
|
61
|
+
elif self.osv == 1:
|
62
|
+
# Mac
|
63
|
+
cutoff = 0.99
|
64
|
+
else:
|
65
|
+
# Linux
|
66
|
+
cutoff = 3.0
|
67
|
+
return cutoff
|
68
|
+
|
69
|
+
@property
|
70
|
+
def pan_factor(self):
|
71
|
+
pf = self.scene.context.pan_factor
|
72
|
+
if self.scene.context.mouse_pan_invert:
|
73
|
+
pf = -pf
|
74
|
+
return pf
|
75
|
+
|
76
|
+
@property
|
77
|
+
def zoom_factor(self):
|
78
|
+
zf = self.scene.context.zoom_factor
|
79
|
+
if self.scene.context.mouse_zoom_invert:
|
80
|
+
zf = -zf
|
81
|
+
zf += 1.0
|
82
|
+
return zf
|
83
|
+
|
84
|
+
@property
|
85
|
+
def zoom_forward(self):
|
86
|
+
return self.zoom_factor
|
87
|
+
|
88
|
+
@property
|
89
|
+
def zoom_backwards(self):
|
90
|
+
zf = self.zoom_factor
|
91
|
+
if zf == 0:
|
92
|
+
return 1.0
|
93
|
+
return 1.0 / zf
|
94
|
+
|
95
|
+
def event(
|
96
|
+
self,
|
97
|
+
window_pos=None,
|
98
|
+
space_pos=None,
|
99
|
+
event_type=None,
|
100
|
+
nearest_snap=None,
|
101
|
+
modifiers=None,
|
102
|
+
**kwargs,
|
103
|
+
):
|
104
|
+
"""
|
105
|
+
Process the zooming and panning of otherwise unhit-widget events.
|
106
|
+
|
107
|
+
If nothing was otherwise hit by the event, we process the scene manipulation events
|
108
|
+
"""
|
109
|
+
|
110
|
+
if event_type == "hover":
|
111
|
+
return RESPONSE_CHAIN
|
112
|
+
if self.aspect:
|
113
|
+
return RESPONSE_CONSUME
|
114
|
+
|
115
|
+
if (event_type == "rightdown" and "alt" in modifiers) or (
|
116
|
+
event_type == "middledown" and "ctrl" in modifiers
|
117
|
+
):
|
118
|
+
self._previous_zoom = 1.0
|
119
|
+
self._placement_event = space_pos
|
120
|
+
self._placement_event_type = "zoom"
|
121
|
+
return RESPONSE_CONSUME
|
122
|
+
elif event_type == "rightdown" and "ctrl" in modifiers:
|
123
|
+
self._previous_zoom = 1.0
|
124
|
+
self._placement_event = space_pos
|
125
|
+
self._placement_event_type = "pan"
|
126
|
+
return RESPONSE_CONSUME
|
127
|
+
elif event_type == "rightup":
|
128
|
+
self._previous_zoom = None
|
129
|
+
self._placement_event = None
|
130
|
+
self._placement_event_type = None
|
131
|
+
elif event_type == "wheelup":
|
132
|
+
if bool(self.scene.context.mouse_wheel_pan) == bool(
|
133
|
+
"ctrl" not in modifiers
|
134
|
+
):
|
135
|
+
self.scene_widget.matrix.post_translate(0, -self.pan_factor)
|
136
|
+
else:
|
137
|
+
if (
|
138
|
+
self.scene_widget.matrix.value_scale_x() <= self.zoom_cutoff
|
139
|
+
and self.scene_widget.matrix.value_scale_y() <= self.zoom_cutoff
|
140
|
+
):
|
141
|
+
self.scene_widget.matrix.post_scale(
|
142
|
+
self.zoom_forward, self.zoom_forward, space_pos[0], space_pos[1]
|
143
|
+
)
|
144
|
+
self.scene.request_refresh()
|
145
|
+
return RESPONSE_CONSUME
|
146
|
+
elif event_type == "wheeldown":
|
147
|
+
if bool(self.scene.context.mouse_wheel_pan) == ("ctrl" not in modifiers):
|
148
|
+
self.scene_widget.matrix.post_translate(0, self.pan_factor)
|
149
|
+
else:
|
150
|
+
self.scene_widget.matrix.post_scale(
|
151
|
+
self.zoom_backwards, self.zoom_backwards, space_pos[0], space_pos[1]
|
152
|
+
)
|
153
|
+
self.scene.request_refresh()
|
154
|
+
return RESPONSE_CONSUME
|
155
|
+
elif event_type == "wheelleft":
|
156
|
+
self.scene_widget.matrix.post_translate(self.pan_factor, 0)
|
157
|
+
self.scene.request_refresh()
|
158
|
+
return RESPONSE_CONSUME
|
159
|
+
elif event_type == "wheelright":
|
160
|
+
self.scene_widget.matrix.post_translate(-self.pan_factor, 0)
|
161
|
+
self.scene.request_refresh()
|
162
|
+
return RESPONSE_CONSUME
|
163
|
+
elif event_type == "middledown":
|
164
|
+
return RESPONSE_CONSUME
|
165
|
+
elif event_type == "middleup":
|
166
|
+
self._placement_event_type = None
|
167
|
+
return RESPONSE_CONSUME
|
168
|
+
elif event_type == "gesture-start":
|
169
|
+
self._previous_zoom = 1.0
|
170
|
+
return RESPONSE_CONSUME
|
171
|
+
elif event_type == "gesture-end":
|
172
|
+
self._previous_zoom = None
|
173
|
+
return RESPONSE_CONSUME
|
174
|
+
elif event_type == "lost":
|
175
|
+
return RESPONSE_CONSUME
|
176
|
+
elif str(event_type).startswith("zoom "):
|
177
|
+
if self._previous_zoom is None:
|
178
|
+
return RESPONSE_CONSUME
|
179
|
+
try:
|
180
|
+
zoom = float(event_type.split(" ")[1])
|
181
|
+
except Exception:
|
182
|
+
return RESPONSE_CONSUME
|
183
|
+
|
184
|
+
zoom_change = zoom / self._previous_zoom
|
185
|
+
self.scene_widget.matrix.post_scale(
|
186
|
+
zoom_change, zoom_change, space_pos[0], space_pos[1]
|
187
|
+
)
|
188
|
+
self.scene_widget.matrix.post_translate(space_pos[4], space_pos[5])
|
189
|
+
self._previous_zoom = zoom
|
190
|
+
self.scene.request_refresh()
|
191
|
+
|
192
|
+
return RESPONSE_CONSUME
|
193
|
+
elif str(event_type).startswith("magnify "):
|
194
|
+
magnify = float(event_type.split(" ")[1])
|
195
|
+
self.scene_widget.matrix.post_scale(
|
196
|
+
magnify, magnify, space_pos[0], space_pos[1]
|
197
|
+
)
|
198
|
+
self.scene_widget.matrix.post_translate(space_pos[4], space_pos[5])
|
199
|
+
self.scene.context.signal("refresh_scene", 0)
|
200
|
+
|
201
|
+
return RESPONSE_CONSUME
|
202
|
+
|
203
|
+
# Movement
|
204
|
+
if self._placement_event_type is None:
|
205
|
+
self.scene_widget.matrix.post_translate(space_pos[4], space_pos[5])
|
206
|
+
self.scene.request_refresh()
|
207
|
+
elif self._placement_event_type == "zoom":
|
208
|
+
from math import e
|
209
|
+
|
210
|
+
p = (
|
211
|
+
space_pos[0]
|
212
|
+
- self._placement_event[0]
|
213
|
+
+ space_pos[1]
|
214
|
+
- self._placement_event[1]
|
215
|
+
)
|
216
|
+
p /= 250.0
|
217
|
+
if self._previous_zoom is not None:
|
218
|
+
zoom_factor = e**p
|
219
|
+
zoom_change = zoom_factor / self._previous_zoom
|
220
|
+
self._previous_zoom = zoom_factor
|
221
|
+
self.scene_widget.matrix.post_scale(
|
222
|
+
zoom_change,
|
223
|
+
zoom_change,
|
224
|
+
self._placement_event[0],
|
225
|
+
self._placement_event[1],
|
226
|
+
)
|
227
|
+
self.scene.request_refresh()
|
228
|
+
elif self._placement_event_type == "pan":
|
229
|
+
pan_factor_x = -(space_pos[0] - self._placement_event[0]) / 10
|
230
|
+
pan_factor_y = -(space_pos[1] - self._placement_event[1]) / 10
|
231
|
+
self.scene_widget.matrix.post_translate(pan_factor_x, pan_factor_y)
|
232
|
+
self.scene.request_refresh()
|
233
|
+
return RESPONSE_CHAIN
|
234
|
+
|
235
|
+
def set_view(self, x, y, w, h, preserve_aspect=None):
|
236
|
+
self._view = Viewbox(f"{x} {y} {w} {h}", preserve_aspect)
|
237
|
+
self.aspect_matrix()
|
238
|
+
|
239
|
+
def set_frame(self, x, y, w, h):
|
240
|
+
self._frame = Viewbox(f"{x} {y} {w} {h}")
|
241
|
+
self.aspect_matrix()
|
242
|
+
|
243
|
+
def set_aspect(self, aspect=True):
|
244
|
+
self.aspect = aspect
|
245
|
+
self.aspect_matrix()
|
246
|
+
|
247
|
+
def aspect_matrix(self):
|
248
|
+
"""
|
249
|
+
Specifically view the scene with the given Viewbox.
|
250
|
+
"""
|
251
|
+
if self._frame and self._view and self.aspect:
|
252
|
+
self.scene_widget.matrix = Matrix(self._view.transform(self._frame))
|
253
|
+
|
254
|
+
def focus_position_scene(self, scene_point, scene_size):
|
255
|
+
"""
|
256
|
+
Focus on the specific point within the scene.
|
257
|
+
"""
|
258
|
+
window_width, window_height = self.scene.ClientSize
|
259
|
+
scale_x = self.get_scale_x()
|
260
|
+
scale_y = self.get_scale_y()
|
261
|
+
self.scene_matrix_reset()
|
262
|
+
self.scene_post_pan(-scene_point[0], -scene_point[1])
|
263
|
+
self.scene_post_scale(scale_x, scale_y)
|
264
|
+
self.scene_post_pan(window_width / 2.0, window_height / 2.0)
|
265
|
+
|
266
|
+
def focus_viewport_scene(
|
267
|
+
self, new_scene_viewport, scene_size, buffer=0.0, lock=True, animate=False
|
268
|
+
):
|
269
|
+
"""
|
270
|
+
Focus on the given viewport in the scene.
|
271
|
+
|
272
|
+
@param new_scene_viewport: Viewport to have after this process within the scene.
|
273
|
+
@param scene_size: Size of the scene in which this viewport is active.
|
274
|
+
@param buffer: Amount of buffer around the edge of the new viewport.
|
275
|
+
@param lock: lock the scalex, scaley.
|
276
|
+
@param animate: perform focus with animated scene.
|
277
|
+
@return:
|
278
|
+
"""
|
279
|
+
window_width, window_height = scene_size
|
280
|
+
left = new_scene_viewport[0]
|
281
|
+
top = new_scene_viewport[1]
|
282
|
+
right = new_scene_viewport[2]
|
283
|
+
bottom = new_scene_viewport[3]
|
284
|
+
viewport_width = right - left
|
285
|
+
viewport_height = bottom - top
|
286
|
+
|
287
|
+
left -= viewport_width * buffer
|
288
|
+
right += viewport_width * buffer
|
289
|
+
top -= viewport_height * buffer
|
290
|
+
bottom += viewport_height * buffer
|
291
|
+
|
292
|
+
if right == left:
|
293
|
+
scale_x = 100
|
294
|
+
else:
|
295
|
+
scale_x = window_width / float(right - left)
|
296
|
+
if bottom == top:
|
297
|
+
scale_y = 100
|
298
|
+
else:
|
299
|
+
scale_y = window_height / float(bottom - top)
|
300
|
+
|
301
|
+
cx = (right + left) / 2
|
302
|
+
cy = (top + bottom) / 2
|
303
|
+
matrix = Matrix()
|
304
|
+
matrix.post_translate(-cx, -cy)
|
305
|
+
if lock:
|
306
|
+
scale = min(scale_x, scale_y)
|
307
|
+
if scale != 0:
|
308
|
+
matrix.post_scale(scale)
|
309
|
+
else:
|
310
|
+
if scale_x != 0 and scale_y != 0:
|
311
|
+
matrix.post_scale(scale_x, scale_y)
|
312
|
+
matrix.post_translate(window_width / 2.0, window_height / 2.0)
|
313
|
+
|
314
|
+
if animate:
|
315
|
+
self._scene_matrix_animator.set_animate_zoom(matrix)
|
316
|
+
self.scene.animate(self._scene_matrix_animator)
|
317
|
+
else:
|
318
|
+
self.scene_widget.matrix.reset()
|
319
|
+
self.scene_widget.matrix.post_cat(matrix)
|
320
|
+
|
321
|
+
|
322
|
+
class SceneAnimateMatrix:
|
323
|
+
def __init__(self, widget):
|
324
|
+
self.widget = widget
|
325
|
+
self.tick_max = 5
|
326
|
+
self.tick_index = 0
|
327
|
+
self._from_matrix = None
|
328
|
+
self._to_matrix = None
|
329
|
+
|
330
|
+
def set_animate_zoom(self, matrix):
|
331
|
+
self._from_matrix = Matrix(self.widget.matrix)
|
332
|
+
self._to_matrix = matrix
|
333
|
+
|
334
|
+
def start_threaded(self):
|
335
|
+
self.tick_index = 0
|
336
|
+
|
337
|
+
def tick(self):
|
338
|
+
if self._to_matrix is None or self._from_matrix is None:
|
339
|
+
return False # Nothing to animate.
|
340
|
+
if self.tick_max < self.tick_index:
|
341
|
+
self.widget.scene.request_refresh()
|
342
|
+
return False # Animation was complete.
|
343
|
+
amount = self.tick_index / self.tick_max
|
344
|
+
self.widget.matrix.a = (
|
345
|
+
amount * (self._to_matrix.a - self._from_matrix.a) + self._from_matrix.a
|
346
|
+
)
|
347
|
+
self.widget.matrix.b = (
|
348
|
+
amount * (self._to_matrix.b - self._from_matrix.b) + self._from_matrix.b
|
349
|
+
)
|
350
|
+
self.widget.matrix.c = (
|
351
|
+
amount * (self._to_matrix.c - self._from_matrix.c) + self._from_matrix.c
|
352
|
+
)
|
353
|
+
self.widget.matrix.d = (
|
354
|
+
amount * (self._to_matrix.d - self._from_matrix.d) + self._from_matrix.d
|
355
|
+
)
|
356
|
+
self.widget.matrix.e = (
|
357
|
+
amount * (self._to_matrix.e - self._from_matrix.e) + self._from_matrix.e
|
358
|
+
)
|
359
|
+
self.widget.matrix.f = (
|
360
|
+
amount * (self._to_matrix.f - self._from_matrix.f) + self._from_matrix.f
|
361
|
+
)
|
362
|
+
self.widget.scene.request_refresh_for_animation()
|
363
|
+
self.widget.on_matrix_change()
|
364
|
+
self.tick_index += 1
|
365
|
+
return True
|