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,108 +1,108 @@
|
|
1
|
-
import wx
|
2
|
-
|
3
|
-
from meerk40t.gui.scene.sceneconst import RESPONSE_CHAIN, RESPONSE_CONSUME
|
4
|
-
from meerk40t.gui.toolwidgets.toolwidget import ToolWidget
|
5
|
-
from meerk40t.svgelements import Point
|
6
|
-
|
7
|
-
_ = wx.GetTranslation
|
8
|
-
|
9
|
-
|
10
|
-
class PlacementTool(ToolWidget):
|
11
|
-
"""
|
12
|
-
Placement Tool.
|
13
|
-
|
14
|
-
Adds a placement with clicks.
|
15
|
-
"""
|
16
|
-
|
17
|
-
def __init__(self, scene):
|
18
|
-
ToolWidget.__init__(self, scene)
|
19
|
-
self.has_ctrl = False
|
20
|
-
self.has_alt = False
|
21
|
-
self.has_shift = False
|
22
|
-
self.message_displayed = ""
|
23
|
-
self.scene.context.signal("statusmsg", self.message_displayed)
|
24
|
-
|
25
|
-
def process_draw(self, gc: wx.GraphicsContext):
|
26
|
-
pass
|
27
|
-
|
28
|
-
def done(self):
|
29
|
-
self.scene.pane.tool_active = False
|
30
|
-
self.scene.request_refresh()
|
31
|
-
self.message_displayed = ""
|
32
|
-
self.scene.context("tool none\n")
|
33
|
-
|
34
|
-
def event(
|
35
|
-
self,
|
36
|
-
window_pos=None,
|
37
|
-
space_pos=None,
|
38
|
-
event_type=None,
|
39
|
-
nearest_snap=None,
|
40
|
-
modifiers=None,
|
41
|
-
**kwargs,
|
42
|
-
):
|
43
|
-
response = RESPONSE_CHAIN
|
44
|
-
if (
|
45
|
-
modifiers is None
|
46
|
-
or (event_type == "key_up" and "alt" in modifiers)
|
47
|
-
or ("alt" not in modifiers)
|
48
|
-
):
|
49
|
-
self.has_alt = False
|
50
|
-
else:
|
51
|
-
self.has_alt = True
|
52
|
-
if (
|
53
|
-
modifiers is None
|
54
|
-
or (event_type == "key_up" and "ctrl" in modifiers)
|
55
|
-
or ("ctrl" not in modifiers)
|
56
|
-
):
|
57
|
-
self.has_ctrl = False
|
58
|
-
else:
|
59
|
-
self.has_ctrl = True
|
60
|
-
if (
|
61
|
-
modifiers is None
|
62
|
-
or (event_type == "key_up" and "shift" in modifiers)
|
63
|
-
or ("shift" not in modifiers)
|
64
|
-
):
|
65
|
-
self.has_shift = False
|
66
|
-
else:
|
67
|
-
self.has_shift = True
|
68
|
-
|
69
|
-
if event_type == "leftclick":
|
70
|
-
# print(
|
71
|
-
# f"Ctrl={self.has_ctrl}, alt={self.has_alt}, shift={self.has_shift}, point={space_pos}, snap={nearest_snap}"
|
72
|
-
# )
|
73
|
-
if nearest_snap is None:
|
74
|
-
sx, sy = self.scene.get_snap_point(
|
75
|
-
space_pos[0], space_pos[1], modifiers
|
76
|
-
)
|
77
|
-
point = Point(sx, sy)
|
78
|
-
else:
|
79
|
-
point = Point(nearest_snap[0], nearest_snap[1])
|
80
|
-
if self.has_ctrl:
|
81
|
-
corner = 2 # Bottom Right
|
82
|
-
elif self.has_shift:
|
83
|
-
corner = 4 # Center
|
84
|
-
else:
|
85
|
-
corner = 0 # Top Left
|
86
|
-
elements = self.scene.context.elements
|
87
|
-
node = elements.op_branch.add(
|
88
|
-
type="place point",
|
89
|
-
x=point.x,
|
90
|
-
y=point.y,
|
91
|
-
rotation=0,
|
92
|
-
corner=corner,
|
93
|
-
)
|
94
|
-
self.notify_created(node)
|
95
|
-
self.done()
|
96
|
-
response = RESPONSE_CONSUME
|
97
|
-
elif event_type in ("leftdown", "hover_start", "hover"):
|
98
|
-
if self.message_displayed == "":
|
99
|
-
self.message_displayed = _(
|
100
|
-
"Click to set the TL-corner of the job (Ctrl for BR, Shift for Center)"
|
101
|
-
)
|
102
|
-
self.scene.context.signal("statusmsg", self.message_displayed)
|
103
|
-
self.scene.pane.tool_active = True
|
104
|
-
elif event_type == "lost" or (event_type == "key_up" and modifiers == "escape"):
|
105
|
-
if self.scene.pane.tool_active:
|
106
|
-
self.done()
|
107
|
-
response = RESPONSE_CONSUME
|
108
|
-
return response
|
1
|
+
import wx
|
2
|
+
|
3
|
+
from meerk40t.gui.scene.sceneconst import RESPONSE_CHAIN, RESPONSE_CONSUME
|
4
|
+
from meerk40t.gui.toolwidgets.toolwidget import ToolWidget
|
5
|
+
from meerk40t.svgelements import Point
|
6
|
+
|
7
|
+
_ = wx.GetTranslation
|
8
|
+
|
9
|
+
|
10
|
+
class PlacementTool(ToolWidget):
|
11
|
+
"""
|
12
|
+
Placement Tool.
|
13
|
+
|
14
|
+
Adds a placement with clicks.
|
15
|
+
"""
|
16
|
+
|
17
|
+
def __init__(self, scene, mode=None):
|
18
|
+
ToolWidget.__init__(self, scene)
|
19
|
+
self.has_ctrl = False
|
20
|
+
self.has_alt = False
|
21
|
+
self.has_shift = False
|
22
|
+
self.message_displayed = ""
|
23
|
+
self.scene.context.signal("statusmsg", self.message_displayed)
|
24
|
+
|
25
|
+
def process_draw(self, gc: wx.GraphicsContext):
|
26
|
+
pass
|
27
|
+
|
28
|
+
def done(self):
|
29
|
+
self.scene.pane.tool_active = False
|
30
|
+
self.scene.request_refresh()
|
31
|
+
self.message_displayed = ""
|
32
|
+
self.scene.context("tool none\n")
|
33
|
+
|
34
|
+
def event(
|
35
|
+
self,
|
36
|
+
window_pos=None,
|
37
|
+
space_pos=None,
|
38
|
+
event_type=None,
|
39
|
+
nearest_snap=None,
|
40
|
+
modifiers=None,
|
41
|
+
**kwargs,
|
42
|
+
):
|
43
|
+
response = RESPONSE_CHAIN
|
44
|
+
if (
|
45
|
+
modifiers is None
|
46
|
+
or (event_type == "key_up" and "alt" in modifiers)
|
47
|
+
or ("alt" not in modifiers)
|
48
|
+
):
|
49
|
+
self.has_alt = False
|
50
|
+
else:
|
51
|
+
self.has_alt = True
|
52
|
+
if (
|
53
|
+
modifiers is None
|
54
|
+
or (event_type == "key_up" and "ctrl" in modifiers)
|
55
|
+
or ("ctrl" not in modifiers)
|
56
|
+
):
|
57
|
+
self.has_ctrl = False
|
58
|
+
else:
|
59
|
+
self.has_ctrl = True
|
60
|
+
if (
|
61
|
+
modifiers is None
|
62
|
+
or (event_type == "key_up" and "shift" in modifiers)
|
63
|
+
or ("shift" not in modifiers)
|
64
|
+
):
|
65
|
+
self.has_shift = False
|
66
|
+
else:
|
67
|
+
self.has_shift = True
|
68
|
+
|
69
|
+
if event_type == "leftclick":
|
70
|
+
# print(
|
71
|
+
# f"Ctrl={self.has_ctrl}, alt={self.has_alt}, shift={self.has_shift}, point={space_pos}, snap={nearest_snap}"
|
72
|
+
# )
|
73
|
+
if nearest_snap is None:
|
74
|
+
sx, sy = self.scene.get_snap_point(
|
75
|
+
space_pos[0], space_pos[1], modifiers
|
76
|
+
)
|
77
|
+
point = Point(sx, sy)
|
78
|
+
else:
|
79
|
+
point = Point(nearest_snap[0], nearest_snap[1])
|
80
|
+
if self.has_ctrl:
|
81
|
+
corner = 2 # Bottom Right
|
82
|
+
elif self.has_shift:
|
83
|
+
corner = 4 # Center
|
84
|
+
else:
|
85
|
+
corner = 0 # Top Left
|
86
|
+
elements = self.scene.context.elements
|
87
|
+
node = elements.op_branch.add(
|
88
|
+
type="place point",
|
89
|
+
x=point.x,
|
90
|
+
y=point.y,
|
91
|
+
rotation=0,
|
92
|
+
corner=corner,
|
93
|
+
)
|
94
|
+
self.notify_created(node)
|
95
|
+
self.done()
|
96
|
+
response = RESPONSE_CONSUME
|
97
|
+
elif event_type in ("leftdown", "hover_start", "hover"):
|
98
|
+
if self.message_displayed == "":
|
99
|
+
self.message_displayed = _(
|
100
|
+
"Click to set the TL-corner of the job (Ctrl for BR, Shift for Center)"
|
101
|
+
)
|
102
|
+
self.scene.context.signal("statusmsg", self.message_displayed)
|
103
|
+
self.scene.pane.tool_active = True
|
104
|
+
elif event_type == "lost" or (event_type == "key_up" and modifiers == "escape"):
|
105
|
+
if self.scene.pane.tool_active:
|
106
|
+
self.done()
|
107
|
+
response = RESPONSE_CONSUME
|
108
|
+
return response
|
@@ -1,59 +1,68 @@
|
|
1
|
-
import wx
|
2
|
-
|
3
|
-
from meerk40t.gui.scene.sceneconst import RESPONSE_CHAIN, RESPONSE_CONSUME
|
4
|
-
from meerk40t.gui.toolwidgets.toolwidget import ToolWidget
|
5
|
-
from meerk40t.svgelements import Matrix, Point
|
6
|
-
|
7
|
-
|
8
|
-
class PointTool(ToolWidget):
|
9
|
-
"""
|
10
|
-
Point Drawing Tool.
|
11
|
-
|
12
|
-
Adds points with clicks.
|
13
|
-
"""
|
14
|
-
|
15
|
-
def __init__(self, scene):
|
16
|
-
ToolWidget.__init__(self, scene)
|
17
|
-
|
18
|
-
def process_draw(self, gc: wx.GraphicsContext):
|
19
|
-
pass
|
20
|
-
|
21
|
-
def
|
22
|
-
self,
|
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
|
-
elements.
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
1
|
+
import wx
|
2
|
+
|
3
|
+
from meerk40t.gui.scene.sceneconst import RESPONSE_CHAIN, RESPONSE_CONSUME
|
4
|
+
from meerk40t.gui.toolwidgets.toolwidget import ToolWidget
|
5
|
+
from meerk40t.svgelements import Matrix, Point
|
6
|
+
|
7
|
+
|
8
|
+
class PointTool(ToolWidget):
|
9
|
+
"""
|
10
|
+
Point Drawing Tool.
|
11
|
+
|
12
|
+
Adds points with clicks.
|
13
|
+
"""
|
14
|
+
|
15
|
+
def __init__(self, scene, mode=None):
|
16
|
+
ToolWidget.__init__(self, scene)
|
17
|
+
|
18
|
+
def process_draw(self, gc: wx.GraphicsContext):
|
19
|
+
pass
|
20
|
+
|
21
|
+
def end_tool(self, force=False):
|
22
|
+
self.scene.context.signal("statusmsg", "")
|
23
|
+
self.scene.request_refresh()
|
24
|
+
if force or self.scene.context.just_a_single_element:
|
25
|
+
self.scene.pane.tool_active = False
|
26
|
+
self.scene.context("tool none\n")
|
27
|
+
|
28
|
+
def event(
|
29
|
+
self,
|
30
|
+
window_pos=None,
|
31
|
+
space_pos=None,
|
32
|
+
event_type=None,
|
33
|
+
nearest_snap=None,
|
34
|
+
modifiers=None,
|
35
|
+
**kwargs,
|
36
|
+
):
|
37
|
+
response = RESPONSE_CHAIN
|
38
|
+
if event_type == "leftclick":
|
39
|
+
if nearest_snap is None:
|
40
|
+
sx, sy = self.scene.get_snap_point(
|
41
|
+
space_pos[0], space_pos[1], modifiers
|
42
|
+
)
|
43
|
+
point = Point(sx, sy)
|
44
|
+
else:
|
45
|
+
point = Point(nearest_snap[0], nearest_snap[1])
|
46
|
+
elements = self.scene.context.elements
|
47
|
+
# _("Create point")
|
48
|
+
with elements.undoscope("Create point"):
|
49
|
+
node = elements.elem_branch.add(
|
50
|
+
point=point,
|
51
|
+
matrix=Matrix(),
|
52
|
+
type="elem point",
|
53
|
+
stroke_width=elements.default_strokewidth,
|
54
|
+
stroke=elements.default_stroke,
|
55
|
+
fill=elements.default_fill,
|
56
|
+
)
|
57
|
+
if elements.classify_new:
|
58
|
+
elements.classify([node])
|
59
|
+
self.notify_created(node)
|
60
|
+
self.end_tool()
|
61
|
+
response = RESPONSE_CONSUME
|
62
|
+
elif event_type == "lost" or (event_type == "key_up" and modifiers == "escape") or event_type == "rightdown":
|
63
|
+
if self.scene.pane.tool_active:
|
64
|
+
response = RESPONSE_CONSUME
|
65
|
+
else:
|
66
|
+
response = RESPONSE_CHAIN
|
67
|
+
self.end_tool(force=True)
|
68
|
+
return response
|
@@ -0,0 +1,294 @@
|
|
1
|
+
from math import sqrt, tau
|
2
|
+
|
3
|
+
import wx
|
4
|
+
|
5
|
+
from meerk40t.core.units import Length
|
6
|
+
from meerk40t.gui.laserrender import swizzlecolor
|
7
|
+
from meerk40t.gui.scene.sceneconst import (
|
8
|
+
RESPONSE_ABORT,
|
9
|
+
RESPONSE_CHAIN,
|
10
|
+
RESPONSE_CONSUME,
|
11
|
+
)
|
12
|
+
from meerk40t.gui.toolwidgets.toolwidget import ToolWidget
|
13
|
+
from meerk40t.svgelements import Point
|
14
|
+
|
15
|
+
|
16
|
+
class PointListTool(ToolWidget):
|
17
|
+
"""
|
18
|
+
This tool is a basic widget just compiling a list of points.
|
19
|
+
It aims to centralise the usual logic around adding points
|
20
|
+
It even has a minimal display logic that draws the polyline
|
21
|
+
of the given points. Any inherited class should just
|
22
|
+
overload the draw routine and fill the create_node routine.
|
23
|
+
The following caller routines are available:
|
24
|
+
point_added(self): just a note that another point was added (self.point_series)
|
25
|
+
create_node(self): a call that should pick up the points and create an element
|
26
|
+
aborted(self): a note that the creation was aborted, in case you need to tidy up something
|
27
|
+
status_message(points): this routine should give back a string that will be displayed in the status bar
|
28
|
+
|
29
|
+
"""
|
30
|
+
|
31
|
+
def __init__(self, scene, mode=None):
|
32
|
+
ToolWidget.__init__(self, scene)
|
33
|
+
self.start_position = None
|
34
|
+
self.point_series = []
|
35
|
+
self.mouse_position = None
|
36
|
+
# angle_snap indicates whether a line should be angle snapping
|
37
|
+
# False anything goes, True snaps to next 45° angle
|
38
|
+
self.angle_snap = False
|
39
|
+
|
40
|
+
def angled(self, pos):
|
41
|
+
points = list(self.point_series)
|
42
|
+
if self.angle_snap and len(points):
|
43
|
+
# What is the angle between mouse_pos and the last_position?
|
44
|
+
p1 = Point(points[-1][0], points[-1][1])
|
45
|
+
p2 = Point(pos[0], pos[1])
|
46
|
+
oldangle = p1.angle_to(p2)
|
47
|
+
dist = p1.distance_to(p2)
|
48
|
+
newangle = round(oldangle / tau * 8, 0) / 8 * tau
|
49
|
+
p3 = p1.polar(p1, newangle, dist)
|
50
|
+
pos = [p3.x, p3.y]
|
51
|
+
return pos
|
52
|
+
|
53
|
+
def process_draw(self, gc: wx.GraphicsContext):
|
54
|
+
if self.point_series:
|
55
|
+
elements = self.scene.context.elements
|
56
|
+
if elements.default_stroke is None:
|
57
|
+
self.pen.SetColour(wx.BLUE)
|
58
|
+
else:
|
59
|
+
self.pen.SetColour(wx.Colour(swizzlecolor(elements.default_stroke)))
|
60
|
+
gc.SetPen(self.pen)
|
61
|
+
if elements.default_fill is None:
|
62
|
+
gc.SetBrush(wx.TRANSPARENT_BRUSH)
|
63
|
+
else:
|
64
|
+
gc.SetBrush(
|
65
|
+
wx.Brush(
|
66
|
+
wx.Colour(swizzlecolor(elements.default_fill)),
|
67
|
+
wx.BRUSHSTYLE_SOLID,
|
68
|
+
)
|
69
|
+
)
|
70
|
+
points = list(self.point_series)
|
71
|
+
if self.mouse_position is not None:
|
72
|
+
pos = self.angled(self.mouse_position)
|
73
|
+
points.append(pos)
|
74
|
+
|
75
|
+
self.draw_points(gc, points)
|
76
|
+
msg = self.status_message(points)
|
77
|
+
if msg is not None:
|
78
|
+
self.scene.context.signal("statusmsg", msg)
|
79
|
+
|
80
|
+
def event(
|
81
|
+
self,
|
82
|
+
window_pos=None,
|
83
|
+
space_pos=None,
|
84
|
+
event_type=None,
|
85
|
+
nearest_snap=None,
|
86
|
+
modifiers=None,
|
87
|
+
keycode=None,
|
88
|
+
**kwargs,
|
89
|
+
):
|
90
|
+
response = RESPONSE_CHAIN
|
91
|
+
update_required = False
|
92
|
+
if (
|
93
|
+
modifiers is None
|
94
|
+
or (event_type == "key_up" and "alt" in modifiers)
|
95
|
+
or ("alt" not in modifiers)
|
96
|
+
):
|
97
|
+
if self.angle_snap:
|
98
|
+
self.angle_snap = False
|
99
|
+
update_required = True
|
100
|
+
else:
|
101
|
+
if not self.angle_snap:
|
102
|
+
self.angle_snap = True
|
103
|
+
update_required = True
|
104
|
+
|
105
|
+
if event_type == "leftclick":
|
106
|
+
self.scene.pane.tool_active = True
|
107
|
+
if nearest_snap is None:
|
108
|
+
sx, sy = self.scene.get_snap_point(
|
109
|
+
space_pos[0], space_pos[1], modifiers
|
110
|
+
)
|
111
|
+
pos = [sx, sy]
|
112
|
+
else:
|
113
|
+
pos = [nearest_snap[0], nearest_snap[1]]
|
114
|
+
pos = self.angled(pos)
|
115
|
+
self.point_series.append((pos[0], pos[1]))
|
116
|
+
self.scene.context.signal("statusmsg", "")
|
117
|
+
self.point_added()
|
118
|
+
response = RESPONSE_CONSUME
|
119
|
+
# Does this seem to close the path?
|
120
|
+
if (
|
121
|
+
len(self.point_series) > 2
|
122
|
+
and abs(
|
123
|
+
complex(*self.point_series[0]) - complex(*self.point_series[-1])
|
124
|
+
)
|
125
|
+
< 5000
|
126
|
+
):
|
127
|
+
self.end_tool()
|
128
|
+
response = RESPONSE_ABORT
|
129
|
+
# is the last point identical to the second-last?
|
130
|
+
# Then we stop (and we discard the last point)
|
131
|
+
if (
|
132
|
+
len(self.point_series) > 2
|
133
|
+
and abs(
|
134
|
+
complex(*self.point_series[-2]) - complex(*self.point_series[-1])
|
135
|
+
)
|
136
|
+
< 5000
|
137
|
+
):
|
138
|
+
self.point_series.pop(-1)
|
139
|
+
self.end_tool()
|
140
|
+
response = RESPONSE_ABORT
|
141
|
+
elif event_type == "rightdown":
|
142
|
+
was_already_empty = len(self.point_series) == 0
|
143
|
+
self.end_tool()
|
144
|
+
if was_already_empty:
|
145
|
+
self.scene.context("tool none\n")
|
146
|
+
response = RESPONSE_CONSUME
|
147
|
+
elif event_type == "leftdown":
|
148
|
+
self.scene.pane.tool_active = True
|
149
|
+
if nearest_snap is None:
|
150
|
+
self.mouse_position = space_pos[0], space_pos[1]
|
151
|
+
else:
|
152
|
+
self.mouse_position = nearest_snap[0], nearest_snap[1]
|
153
|
+
if self.point_series:
|
154
|
+
self.scene.request_refresh()
|
155
|
+
response = RESPONSE_CONSUME
|
156
|
+
elif event_type in ("leftup", "move", "hover"):
|
157
|
+
if nearest_snap is None:
|
158
|
+
self.mouse_position = space_pos[0], space_pos[1]
|
159
|
+
else:
|
160
|
+
self.mouse_position = nearest_snap[0], nearest_snap[1]
|
161
|
+
if self.point_series:
|
162
|
+
self.scene.request_refresh()
|
163
|
+
response = RESPONSE_CONSUME
|
164
|
+
elif event_type == "doubleclick":
|
165
|
+
self.end_tool()
|
166
|
+
response = RESPONSE_ABORT
|
167
|
+
elif event_type == "lost" or (event_type == "key_up" and modifiers == "escape"):
|
168
|
+
if self.scene.pane.tool_active:
|
169
|
+
self.scene.pane.tool_active = False
|
170
|
+
self.scene.request_refresh()
|
171
|
+
response = RESPONSE_CONSUME
|
172
|
+
else:
|
173
|
+
response = RESPONSE_CHAIN
|
174
|
+
self.point_series = []
|
175
|
+
self.mouse_position = None
|
176
|
+
self.scene.context.signal("statusmsg", "")
|
177
|
+
self.aborted()
|
178
|
+
elif event_type == "key_up":
|
179
|
+
if not self.scene.pane.tool_active:
|
180
|
+
return RESPONSE_CHAIN
|
181
|
+
if self.key_up(keycode, modifiers):
|
182
|
+
response = RESPONSE_CONSUME
|
183
|
+
elif update_required:
|
184
|
+
self.scene.request_refresh()
|
185
|
+
# Have we clicked already?
|
186
|
+
if len(self.point_series) > 0:
|
187
|
+
response = RESPONSE_CONSUME
|
188
|
+
return response
|
189
|
+
|
190
|
+
def end_tool(self):
|
191
|
+
followup = self.create_node()
|
192
|
+
self.scene.pane.tool_active = False
|
193
|
+
self.point_series = []
|
194
|
+
self.mouse_position = None
|
195
|
+
self.scene.request_refresh()
|
196
|
+
if followup:
|
197
|
+
self.scene.context(f"{followup}\n")
|
198
|
+
elif self.scene.context.just_a_single_element:
|
199
|
+
self.scene.pane.tool_active = False
|
200
|
+
self.scene.context.signal("statusmsg", "")
|
201
|
+
self.scene.context("tool none\n")
|
202
|
+
|
203
|
+
# Routines that can be overloaded -------------------
|
204
|
+
|
205
|
+
def draw_points(self, gc, points):
|
206
|
+
"""
|
207
|
+
Can be overloaded if needed.
|
208
|
+
Draws the shape on a given GraphicContexts,
|
209
|
+
points do contain the already gathered points,
|
210
|
+
including the mouse_position as last point
|
211
|
+
"""
|
212
|
+
gc.StrokeLines(points)
|
213
|
+
|
214
|
+
def status_message(self, points):
|
215
|
+
"""
|
216
|
+
Can be overloaded if needed.
|
217
|
+
Returns the to be displayed
|
218
|
+
string for the statusbar.
|
219
|
+
"""
|
220
|
+
x0 = points[-2][0]
|
221
|
+
y0 = points[-2][1]
|
222
|
+
x1 = points[-1][0]
|
223
|
+
y1 = points[-1][1]
|
224
|
+
units = self.scene.context.units_name
|
225
|
+
msg = "Pts: {pts}, to last point: O=({cx}, {cy}), d={a}".format(
|
226
|
+
pts=len(points),
|
227
|
+
cx=Length(amount=x0, digits=2, preferred_units=units),
|
228
|
+
cy=Length(amount=y0, digits=2, preferred_units=units),
|
229
|
+
a=Length(
|
230
|
+
amount=sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)),
|
231
|
+
digits=2,
|
232
|
+
preferred_units=units,
|
233
|
+
),
|
234
|
+
)
|
235
|
+
return msg
|
236
|
+
|
237
|
+
def aborted(self):
|
238
|
+
"""
|
239
|
+
Can be overloaded if needed.
|
240
|
+
Will be called if the user aborts the creation.
|
241
|
+
"""
|
242
|
+
return
|
243
|
+
|
244
|
+
def key_up(self, keycode, modifiers):
|
245
|
+
"""
|
246
|
+
Can be overloaded if needed.
|
247
|
+
Contains keycode and modifiers of the Widget event
|
248
|
+
in case you want to do something with that information.
|
249
|
+
Needs to return True if you consumed the keystroke
|
250
|
+
"""
|
251
|
+
return False
|
252
|
+
|
253
|
+
def point_added(self):
|
254
|
+
"""
|
255
|
+
Can be overloaded if needed.
|
256
|
+
Called whenever a new point was added:
|
257
|
+
self.point_series does contain the list of valid points.
|
258
|
+
If e.g. you just need two points then the code should look
|
259
|
+
like this:
|
260
|
+
def point_added(self):
|
261
|
+
if len(self.point_series) > 1: # two points (or more)
|
262
|
+
# That's enough for my purpose
|
263
|
+
self.end_tool()
|
264
|
+
"""
|
265
|
+
return
|
266
|
+
|
267
|
+
def create_node(self):
|
268
|
+
"""
|
269
|
+
This routine needs to be overloaded - this is the only
|
270
|
+
mandatory one. To make sure you really notice it we
|
271
|
+
will raise an error!
|
272
|
+
The routine should pick up the points in self.point_series
|
273
|
+
and create a new element. If you want a followup action
|
274
|
+
to be executed at the end (e.g. you immediately want to
|
275
|
+
fall back to the selection tool), then provide a command
|
276
|
+
string to be done as a function result.
|
277
|
+
Example code:
|
278
|
+
def create_node(self):
|
279
|
+
if len(self.point_series) > 1:
|
280
|
+
polyline = Polyline(*self.point_series)
|
281
|
+
elements = self.scene.context.elements
|
282
|
+
node = elements.elem_branch.add(
|
283
|
+
shape=polyline,
|
284
|
+
type="elem polyline",
|
285
|
+
stroke_width=elements.default_strokewidth,
|
286
|
+
stroke=elements.default_stroke,
|
287
|
+
fill=elements.default_fill,
|
288
|
+
)
|
289
|
+
if elements.classify_new:
|
290
|
+
elements.classify([node])
|
291
|
+
self.notify_created(node)
|
292
|
+
return "tool none"
|
293
|
+
"""
|
294
|
+
raise NotImplementedError
|