meerk40t 0.9.3001__py2.py3-none-any.whl → 0.9.7020__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- meerk40t/__init__.py +1 -1
- meerk40t/balormk/balor_params.py +167 -167
- meerk40t/balormk/clone_loader.py +457 -457
- meerk40t/balormk/controller.py +1566 -1512
- meerk40t/balormk/cylindermod.py +64 -0
- meerk40t/balormk/device.py +966 -1959
- meerk40t/balormk/driver.py +778 -591
- meerk40t/balormk/galvo_commands.py +1194 -0
- meerk40t/balormk/gui/balorconfig.py +237 -111
- meerk40t/balormk/gui/balorcontroller.py +191 -184
- meerk40t/balormk/gui/baloroperationproperties.py +116 -115
- meerk40t/balormk/gui/corscene.py +845 -0
- meerk40t/balormk/gui/gui.py +179 -147
- meerk40t/balormk/livelightjob.py +466 -382
- meerk40t/balormk/mock_connection.py +131 -109
- meerk40t/balormk/plugin.py +133 -135
- meerk40t/balormk/usb_connection.py +306 -301
- meerk40t/camera/__init__.py +1 -1
- meerk40t/camera/camera.py +514 -397
- meerk40t/camera/gui/camerapanel.py +1241 -1095
- meerk40t/camera/gui/gui.py +58 -58
- meerk40t/camera/plugin.py +441 -399
- meerk40t/ch341/__init__.py +27 -27
- meerk40t/ch341/ch341device.py +628 -628
- meerk40t/ch341/libusb.py +595 -589
- meerk40t/ch341/mock.py +171 -171
- meerk40t/ch341/windriver.py +157 -157
- meerk40t/constants.py +13 -0
- meerk40t/core/__init__.py +1 -1
- meerk40t/core/bindalias.py +550 -539
- meerk40t/core/core.py +47 -47
- meerk40t/core/cutcode/cubiccut.py +73 -73
- meerk40t/core/cutcode/cutcode.py +315 -312
- meerk40t/core/cutcode/cutgroup.py +141 -137
- meerk40t/core/cutcode/cutobject.py +192 -185
- meerk40t/core/cutcode/dwellcut.py +37 -37
- meerk40t/core/cutcode/gotocut.py +29 -29
- meerk40t/core/cutcode/homecut.py +29 -29
- meerk40t/core/cutcode/inputcut.py +34 -34
- meerk40t/core/cutcode/linecut.py +33 -33
- meerk40t/core/cutcode/outputcut.py +34 -34
- meerk40t/core/cutcode/plotcut.py +335 -335
- meerk40t/core/cutcode/quadcut.py +61 -61
- meerk40t/core/cutcode/rastercut.py +168 -148
- meerk40t/core/cutcode/waitcut.py +34 -34
- meerk40t/core/cutplan.py +1843 -1316
- meerk40t/core/drivers.py +330 -329
- meerk40t/core/elements/align.py +801 -669
- meerk40t/core/elements/branches.py +1858 -1507
- meerk40t/core/elements/clipboard.py +229 -219
- meerk40t/core/elements/element_treeops.py +4595 -2837
- meerk40t/core/elements/element_types.py +125 -105
- meerk40t/core/elements/elements.py +4315 -3617
- meerk40t/core/elements/files.py +117 -64
- meerk40t/core/elements/geometry.py +473 -224
- meerk40t/core/elements/grid.py +467 -316
- meerk40t/core/elements/materials.py +158 -94
- meerk40t/core/elements/notes.py +50 -38
- meerk40t/core/elements/offset_clpr.py +934 -912
- meerk40t/core/elements/offset_mk.py +963 -955
- meerk40t/core/elements/penbox.py +339 -267
- meerk40t/core/elements/placements.py +300 -83
- meerk40t/core/elements/render.py +785 -687
- meerk40t/core/elements/shapes.py +2618 -2092
- meerk40t/core/elements/testcases.py +105 -0
- meerk40t/core/elements/trace.py +651 -563
- meerk40t/core/elements/tree_commands.py +415 -409
- meerk40t/core/elements/undo_redo.py +116 -58
- meerk40t/core/elements/wordlist.py +319 -200
- meerk40t/core/exceptions.py +9 -9
- meerk40t/core/laserjob.py +220 -220
- meerk40t/core/logging.py +63 -63
- meerk40t/core/node/blobnode.py +83 -86
- meerk40t/core/node/bootstrap.py +105 -103
- meerk40t/core/node/branch_elems.py +40 -31
- meerk40t/core/node/branch_ops.py +45 -38
- meerk40t/core/node/branch_regmark.py +48 -41
- meerk40t/core/node/cutnode.py +29 -32
- meerk40t/core/node/effect_hatch.py +375 -257
- meerk40t/core/node/effect_warp.py +398 -0
- meerk40t/core/node/effect_wobble.py +441 -309
- meerk40t/core/node/elem_ellipse.py +404 -309
- meerk40t/core/node/elem_image.py +1082 -801
- meerk40t/core/node/elem_line.py +358 -292
- meerk40t/core/node/elem_path.py +259 -201
- meerk40t/core/node/elem_point.py +129 -102
- meerk40t/core/node/elem_polyline.py +310 -246
- meerk40t/core/node/elem_rect.py +376 -286
- meerk40t/core/node/elem_text.py +445 -418
- meerk40t/core/node/filenode.py +59 -40
- meerk40t/core/node/groupnode.py +138 -74
- meerk40t/core/node/image_processed.py +777 -766
- meerk40t/core/node/image_raster.py +156 -113
- meerk40t/core/node/layernode.py +31 -31
- meerk40t/core/node/mixins.py +135 -107
- meerk40t/core/node/node.py +1427 -1304
- meerk40t/core/node/nutils.py +117 -114
- meerk40t/core/node/op_cut.py +463 -335
- meerk40t/core/node/op_dots.py +296 -251
- meerk40t/core/node/op_engrave.py +414 -311
- meerk40t/core/node/op_image.py +755 -369
- meerk40t/core/node/op_raster.py +787 -522
- meerk40t/core/node/place_current.py +37 -40
- meerk40t/core/node/place_point.py +329 -126
- meerk40t/core/node/refnode.py +58 -47
- meerk40t/core/node/rootnode.py +225 -219
- meerk40t/core/node/util_console.py +48 -48
- meerk40t/core/node/util_goto.py +84 -65
- meerk40t/core/node/util_home.py +61 -61
- meerk40t/core/node/util_input.py +102 -102
- meerk40t/core/node/util_output.py +102 -102
- meerk40t/core/node/util_wait.py +65 -65
- meerk40t/core/parameters.py +709 -707
- meerk40t/core/planner.py +875 -785
- meerk40t/core/plotplanner.py +656 -652
- meerk40t/core/space.py +120 -113
- meerk40t/core/spoolers.py +706 -705
- meerk40t/core/svg_io.py +1836 -1549
- meerk40t/core/treeop.py +534 -445
- meerk40t/core/undos.py +278 -124
- meerk40t/core/units.py +784 -680
- meerk40t/core/view.py +393 -322
- meerk40t/core/webhelp.py +62 -62
- meerk40t/core/wordlist.py +513 -504
- meerk40t/cylinder/cylinder.py +247 -0
- meerk40t/cylinder/gui/cylindersettings.py +41 -0
- meerk40t/cylinder/gui/gui.py +24 -0
- meerk40t/device/__init__.py +1 -1
- meerk40t/device/basedevice.py +322 -123
- meerk40t/device/devicechoices.py +50 -0
- meerk40t/device/dummydevice.py +163 -128
- meerk40t/device/gui/defaultactions.py +618 -602
- meerk40t/device/gui/effectspanel.py +114 -0
- meerk40t/device/gui/formatterpanel.py +253 -290
- meerk40t/device/gui/warningpanel.py +337 -260
- meerk40t/device/mixins.py +13 -13
- meerk40t/dxf/__init__.py +1 -1
- meerk40t/dxf/dxf_io.py +766 -554
- meerk40t/dxf/plugin.py +47 -35
- meerk40t/external_plugins.py +79 -79
- meerk40t/external_plugins_build.py +28 -28
- meerk40t/extra/cag.py +112 -116
- meerk40t/extra/coolant.py +403 -0
- meerk40t/extra/encode_detect.py +204 -0
- meerk40t/extra/ezd.py +1165 -1165
- meerk40t/extra/hershey.py +834 -340
- meerk40t/extra/imageactions.py +322 -316
- meerk40t/extra/inkscape.py +628 -622
- meerk40t/extra/lbrn.py +424 -424
- meerk40t/extra/outerworld.py +283 -0
- meerk40t/extra/param_functions.py +1542 -1556
- meerk40t/extra/potrace.py +257 -253
- meerk40t/extra/serial_exchange.py +118 -0
- meerk40t/extra/updater.py +602 -453
- meerk40t/extra/vectrace.py +147 -146
- meerk40t/extra/winsleep.py +83 -83
- meerk40t/extra/xcs_reader.py +597 -0
- meerk40t/fill/fills.py +781 -335
- meerk40t/fill/patternfill.py +1061 -1061
- meerk40t/fill/patterns.py +614 -567
- meerk40t/grbl/control.py +87 -87
- meerk40t/grbl/controller.py +990 -903
- meerk40t/grbl/device.py +1084 -768
- meerk40t/grbl/driver.py +989 -771
- meerk40t/grbl/emulator.py +532 -497
- meerk40t/grbl/gcodejob.py +783 -767
- meerk40t/grbl/gui/grblconfiguration.py +373 -298
- meerk40t/grbl/gui/grblcontroller.py +485 -271
- meerk40t/grbl/gui/grblhardwareconfig.py +269 -153
- meerk40t/grbl/gui/grbloperationconfig.py +105 -0
- meerk40t/grbl/gui/gui.py +147 -116
- meerk40t/grbl/interpreter.py +44 -44
- meerk40t/grbl/loader.py +22 -22
- meerk40t/grbl/mock_connection.py +56 -56
- meerk40t/grbl/plugin.py +294 -264
- meerk40t/grbl/serial_connection.py +93 -88
- meerk40t/grbl/tcp_connection.py +81 -79
- meerk40t/grbl/ws_connection.py +112 -0
- meerk40t/gui/__init__.py +1 -1
- meerk40t/gui/about.py +2042 -296
- meerk40t/gui/alignment.py +1644 -1608
- meerk40t/gui/autoexec.py +199 -0
- meerk40t/gui/basicops.py +791 -670
- meerk40t/gui/bufferview.py +77 -71
- meerk40t/gui/busy.py +232 -133
- meerk40t/gui/choicepropertypanel.py +1662 -1469
- meerk40t/gui/consolepanel.py +706 -542
- meerk40t/gui/devicepanel.py +687 -581
- meerk40t/gui/dialogoptions.py +110 -107
- meerk40t/gui/executejob.py +316 -306
- meerk40t/gui/fonts.py +90 -90
- meerk40t/gui/functionwrapper.py +252 -0
- meerk40t/gui/gui_mixins.py +729 -0
- meerk40t/gui/guicolors.py +205 -182
- meerk40t/gui/help_assets/help_assets.py +218 -201
- meerk40t/gui/helper.py +154 -0
- meerk40t/gui/hersheymanager.py +1440 -846
- meerk40t/gui/icons.py +3422 -2747
- meerk40t/gui/imagesplitter.py +555 -508
- meerk40t/gui/keymap.py +354 -344
- meerk40t/gui/laserpanel.py +897 -806
- meerk40t/gui/laserrender.py +1470 -1232
- meerk40t/gui/lasertoolpanel.py +805 -793
- meerk40t/gui/magnetoptions.py +436 -0
- meerk40t/gui/materialmanager.py +2944 -0
- meerk40t/gui/materialtest.py +1722 -1694
- meerk40t/gui/mkdebug.py +646 -359
- meerk40t/gui/mwindow.py +163 -140
- meerk40t/gui/navigationpanels.py +2605 -2467
- meerk40t/gui/notes.py +143 -142
- meerk40t/gui/opassignment.py +414 -410
- meerk40t/gui/operation_info.py +310 -299
- meerk40t/gui/plugin.py +500 -328
- meerk40t/gui/position.py +714 -669
- meerk40t/gui/preferences.py +901 -650
- meerk40t/gui/propertypanels/attributes.py +1461 -1131
- meerk40t/gui/propertypanels/blobproperty.py +117 -114
- meerk40t/gui/propertypanels/consoleproperty.py +83 -80
- meerk40t/gui/propertypanels/gotoproperty.py +77 -0
- meerk40t/gui/propertypanels/groupproperties.py +223 -217
- meerk40t/gui/propertypanels/hatchproperty.py +489 -469
- meerk40t/gui/propertypanels/imageproperty.py +2244 -1384
- meerk40t/gui/propertypanels/inputproperty.py +59 -58
- meerk40t/gui/propertypanels/opbranchproperties.py +82 -80
- meerk40t/gui/propertypanels/operationpropertymain.py +1890 -1638
- meerk40t/gui/propertypanels/outputproperty.py +59 -58
- meerk40t/gui/propertypanels/pathproperty.py +389 -380
- meerk40t/gui/propertypanels/placementproperty.py +1214 -383
- meerk40t/gui/propertypanels/pointproperty.py +140 -136
- meerk40t/gui/propertypanels/propertywindow.py +313 -181
- meerk40t/gui/propertypanels/rasterwizardpanels.py +996 -912
- meerk40t/gui/propertypanels/regbranchproperties.py +76 -0
- meerk40t/gui/propertypanels/textproperty.py +770 -755
- meerk40t/gui/propertypanels/waitproperty.py +56 -55
- meerk40t/gui/propertypanels/warpproperty.py +121 -0
- meerk40t/gui/propertypanels/wobbleproperty.py +255 -204
- meerk40t/gui/ribbon.py +2471 -2210
- meerk40t/gui/scene/scene.py +1100 -1051
- meerk40t/gui/scene/sceneconst.py +22 -22
- meerk40t/gui/scene/scenepanel.py +439 -349
- meerk40t/gui/scene/scenespacewidget.py +365 -365
- meerk40t/gui/scene/widget.py +518 -505
- meerk40t/gui/scenewidgets/affinemover.py +215 -215
- meerk40t/gui/scenewidgets/attractionwidget.py +315 -309
- meerk40t/gui/scenewidgets/bedwidget.py +120 -97
- meerk40t/gui/scenewidgets/elementswidget.py +137 -107
- meerk40t/gui/scenewidgets/gridwidget.py +785 -745
- meerk40t/gui/scenewidgets/guidewidget.py +765 -765
- meerk40t/gui/scenewidgets/laserpathwidget.py +66 -66
- meerk40t/gui/scenewidgets/machineoriginwidget.py +86 -86
- meerk40t/gui/scenewidgets/nodeselector.py +28 -28
- meerk40t/gui/scenewidgets/rectselectwidget.py +592 -346
- meerk40t/gui/scenewidgets/relocatewidget.py +33 -33
- meerk40t/gui/scenewidgets/reticlewidget.py +83 -83
- meerk40t/gui/scenewidgets/selectionwidget.py +2958 -2756
- meerk40t/gui/simpleui.py +362 -333
- meerk40t/gui/simulation.py +2451 -2094
- meerk40t/gui/snapoptions.py +208 -203
- meerk40t/gui/spoolerpanel.py +1227 -1180
- meerk40t/gui/statusbarwidgets/defaultoperations.py +480 -353
- meerk40t/gui/statusbarwidgets/infowidget.py +520 -483
- meerk40t/gui/statusbarwidgets/opassignwidget.py +356 -355
- meerk40t/gui/statusbarwidgets/selectionwidget.py +172 -171
- meerk40t/gui/statusbarwidgets/shapepropwidget.py +754 -236
- meerk40t/gui/statusbarwidgets/statusbar.py +272 -260
- meerk40t/gui/statusbarwidgets/statusbarwidget.py +268 -270
- meerk40t/gui/statusbarwidgets/strokewidget.py +267 -251
- meerk40t/gui/themes.py +200 -78
- meerk40t/gui/tips.py +590 -0
- meerk40t/gui/toolwidgets/circlebrush.py +35 -35
- meerk40t/gui/toolwidgets/toolcircle.py +248 -242
- meerk40t/gui/toolwidgets/toolcontainer.py +82 -77
- meerk40t/gui/toolwidgets/tooldraw.py +97 -90
- meerk40t/gui/toolwidgets/toolellipse.py +219 -212
- meerk40t/gui/toolwidgets/toolimagecut.py +25 -132
- meerk40t/gui/toolwidgets/toolline.py +39 -144
- meerk40t/gui/toolwidgets/toollinetext.py +79 -236
- meerk40t/gui/toolwidgets/toollinetext_inline.py +296 -0
- meerk40t/gui/toolwidgets/toolmeasure.py +163 -216
- meerk40t/gui/toolwidgets/toolnodeedit.py +2088 -2074
- meerk40t/gui/toolwidgets/toolnodemove.py +92 -94
- meerk40t/gui/toolwidgets/toolparameter.py +754 -668
- meerk40t/gui/toolwidgets/toolplacement.py +108 -108
- meerk40t/gui/toolwidgets/toolpoint.py +68 -59
- meerk40t/gui/toolwidgets/toolpointlistbuilder.py +294 -0
- meerk40t/gui/toolwidgets/toolpointmove.py +183 -0
- meerk40t/gui/toolwidgets/toolpolygon.py +288 -403
- meerk40t/gui/toolwidgets/toolpolyline.py +38 -196
- meerk40t/gui/toolwidgets/toolrect.py +211 -207
- meerk40t/gui/toolwidgets/toolrelocate.py +72 -72
- meerk40t/gui/toolwidgets/toolribbon.py +598 -113
- meerk40t/gui/toolwidgets/tooltabedit.py +546 -0
- meerk40t/gui/toolwidgets/tooltext.py +98 -89
- meerk40t/gui/toolwidgets/toolvector.py +213 -204
- meerk40t/gui/toolwidgets/toolwidget.py +39 -39
- meerk40t/gui/usbconnect.py +98 -91
- meerk40t/gui/utilitywidgets/buttonwidget.py +18 -18
- meerk40t/gui/utilitywidgets/checkboxwidget.py +90 -90
- meerk40t/gui/utilitywidgets/controlwidget.py +14 -14
- meerk40t/gui/utilitywidgets/cyclocycloidwidget.py +343 -340
- meerk40t/gui/utilitywidgets/debugwidgets.py +148 -0
- meerk40t/gui/utilitywidgets/handlewidget.py +27 -27
- meerk40t/gui/utilitywidgets/harmonograph.py +450 -447
- meerk40t/gui/utilitywidgets/openclosewidget.py +40 -40
- meerk40t/gui/utilitywidgets/rotationwidget.py +54 -54
- meerk40t/gui/utilitywidgets/scalewidget.py +75 -75
- meerk40t/gui/utilitywidgets/seekbarwidget.py +183 -183
- meerk40t/gui/utilitywidgets/togglewidget.py +142 -142
- meerk40t/gui/utilitywidgets/toolbarwidget.py +8 -8
- meerk40t/gui/wordlisteditor.py +985 -931
- meerk40t/gui/wxmeerk40t.py +1447 -1169
- meerk40t/gui/wxmmain.py +5644 -4112
- meerk40t/gui/wxmribbon.py +1591 -1076
- meerk40t/gui/wxmscene.py +1631 -1453
- meerk40t/gui/wxmtree.py +2416 -2089
- meerk40t/gui/wxutils.py +1769 -1099
- meerk40t/gui/zmatrix.py +102 -102
- meerk40t/image/__init__.py +1 -1
- meerk40t/image/dither.py +429 -0
- meerk40t/image/imagetools.py +2793 -2269
- meerk40t/internal_plugins.py +150 -130
- meerk40t/kernel/__init__.py +63 -12
- meerk40t/kernel/channel.py +259 -212
- meerk40t/kernel/context.py +538 -538
- meerk40t/kernel/exceptions.py +41 -41
- meerk40t/kernel/functions.py +463 -414
- meerk40t/kernel/jobs.py +100 -100
- meerk40t/kernel/kernel.py +3828 -3571
- meerk40t/kernel/lifecycles.py +71 -71
- meerk40t/kernel/module.py +49 -49
- meerk40t/kernel/service.py +147 -147
- meerk40t/kernel/settings.py +383 -343
- meerk40t/lihuiyu/controller.py +883 -876
- meerk40t/lihuiyu/device.py +1181 -1069
- meerk40t/lihuiyu/driver.py +1466 -1372
- meerk40t/lihuiyu/gui/gui.py +127 -106
- meerk40t/lihuiyu/gui/lhyaccelgui.py +377 -363
- meerk40t/lihuiyu/gui/lhycontrollergui.py +741 -651
- meerk40t/lihuiyu/gui/lhydrivergui.py +470 -446
- meerk40t/lihuiyu/gui/lhyoperationproperties.py +238 -237
- meerk40t/lihuiyu/gui/tcpcontroller.py +226 -190
- meerk40t/lihuiyu/interpreter.py +53 -53
- meerk40t/lihuiyu/laserspeed.py +450 -450
- meerk40t/lihuiyu/loader.py +90 -90
- meerk40t/lihuiyu/parser.py +404 -404
- meerk40t/lihuiyu/plugin.py +101 -102
- meerk40t/lihuiyu/tcp_connection.py +111 -109
- meerk40t/main.py +231 -165
- meerk40t/moshi/builder.py +788 -781
- meerk40t/moshi/controller.py +505 -499
- meerk40t/moshi/device.py +495 -442
- meerk40t/moshi/driver.py +862 -696
- meerk40t/moshi/gui/gui.py +78 -76
- meerk40t/moshi/gui/moshicontrollergui.py +538 -522
- meerk40t/moshi/gui/moshidrivergui.py +87 -75
- meerk40t/moshi/plugin.py +43 -43
- meerk40t/network/console_server.py +140 -57
- meerk40t/network/kernelserver.py +10 -9
- meerk40t/network/tcp_server.py +142 -140
- meerk40t/network/udp_server.py +103 -77
- meerk40t/network/web_server.py +404 -0
- meerk40t/newly/controller.py +1158 -1144
- meerk40t/newly/device.py +874 -732
- meerk40t/newly/driver.py +540 -412
- meerk40t/newly/gui/gui.py +219 -188
- meerk40t/newly/gui/newlyconfig.py +116 -101
- meerk40t/newly/gui/newlycontroller.py +193 -186
- meerk40t/newly/gui/operationproperties.py +51 -51
- meerk40t/newly/mock_connection.py +82 -82
- meerk40t/newly/newly_params.py +56 -56
- meerk40t/newly/plugin.py +1214 -1246
- meerk40t/newly/usb_connection.py +322 -322
- meerk40t/rotary/gui/gui.py +52 -46
- meerk40t/rotary/gui/rotarysettings.py +240 -232
- meerk40t/rotary/rotary.py +202 -98
- meerk40t/ruida/control.py +291 -91
- meerk40t/ruida/controller.py +138 -1088
- meerk40t/ruida/device.py +676 -231
- meerk40t/ruida/driver.py +534 -472
- meerk40t/ruida/emulator.py +1494 -1491
- meerk40t/ruida/exceptions.py +4 -4
- meerk40t/ruida/gui/gui.py +71 -76
- meerk40t/ruida/gui/ruidaconfig.py +239 -72
- meerk40t/ruida/gui/ruidacontroller.py +187 -184
- meerk40t/ruida/gui/ruidaoperationproperties.py +48 -47
- meerk40t/ruida/loader.py +54 -52
- meerk40t/ruida/mock_connection.py +57 -109
- meerk40t/ruida/plugin.py +124 -87
- meerk40t/ruida/rdjob.py +2084 -945
- meerk40t/ruida/serial_connection.py +116 -0
- meerk40t/ruida/tcp_connection.py +146 -0
- meerk40t/ruida/udp_connection.py +73 -0
- meerk40t/svgelements.py +9671 -9669
- meerk40t/tools/driver_to_path.py +584 -579
- meerk40t/tools/geomstr.py +5583 -4680
- meerk40t/tools/jhfparser.py +357 -292
- meerk40t/tools/kerftest.py +904 -890
- meerk40t/tools/livinghinges.py +1168 -1033
- meerk40t/tools/pathtools.py +987 -949
- meerk40t/tools/pmatrix.py +234 -0
- meerk40t/tools/pointfinder.py +942 -942
- meerk40t/tools/polybool.py +941 -940
- meerk40t/tools/rasterplotter.py +1660 -547
- meerk40t/tools/shxparser.py +1047 -901
- meerk40t/tools/ttfparser.py +726 -446
- meerk40t/tools/zinglplotter.py +595 -593
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/LICENSE +21 -21
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/METADATA +150 -139
- meerk40t-0.9.7020.dist-info/RECORD +446 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/WHEEL +1 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/top_level.txt +0 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/zip-safe +1 -1
- meerk40t/balormk/elementlightjob.py +0 -159
- meerk40t-0.9.3001.dist-info/RECORD +0 -437
- test/bootstrap.py +0 -63
- test/test_cli.py +0 -12
- test/test_core_cutcode.py +0 -418
- test/test_core_elements.py +0 -144
- test/test_core_plotplanner.py +0 -397
- test/test_core_viewports.py +0 -312
- test/test_drivers_grbl.py +0 -108
- test/test_drivers_lihuiyu.py +0 -443
- test/test_drivers_newly.py +0 -113
- test/test_element_degenerate_points.py +0 -43
- test/test_elements_classify.py +0 -97
- test/test_elements_penbox.py +0 -22
- test/test_file_svg.py +0 -176
- test/test_fill.py +0 -155
- test/test_geomstr.py +0 -1523
- test/test_geomstr_nodes.py +0 -18
- test/test_imagetools_actualize.py +0 -306
- test/test_imagetools_wizard.py +0 -258
- test/test_kernel.py +0 -200
- test/test_laser_speeds.py +0 -3303
- test/test_length.py +0 -57
- test/test_lifecycle.py +0 -66
- test/test_operations.py +0 -251
- test/test_operations_hatch.py +0 -57
- test/test_ruida.py +0 -19
- test/test_spooler.py +0 -22
- test/test_tools_rasterplotter.py +0 -29
- test/test_wobble.py +0 -133
- test/test_zingl.py +0 -124
- {test → meerk40t/cylinder}/__init__.py +0 -0
- /meerk40t/{core/element_commands.py → cylinder/gui/__init__.py} +0 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/entry_points.txt +0 -0
@@ -1,113 +1,598 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
self.
|
23
|
-
self.
|
24
|
-
self.
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
if self.
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
self.
|
54
|
-
self.
|
55
|
-
self.
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
self.
|
63
|
-
if self.
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
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
|
-
|
1
|
+
"""
|
2
|
+
The ribbon tool includes a series of different animated physics based drawing methods dealing with the relationships
|
3
|
+
between different nodes. Each tick of animation each node performs its generic actions to update its positions.
|
4
|
+
Special care is taken to indicate how the drawing between the several nodes should take place.
|
5
|
+
"""
|
6
|
+
|
7
|
+
import math
|
8
|
+
|
9
|
+
import wx
|
10
|
+
|
11
|
+
from meerk40t.gui.scene.sceneconst import RESPONSE_CHAIN, RESPONSE_CONSUME
|
12
|
+
from meerk40t.gui.toolwidgets.toolwidget import ToolWidget
|
13
|
+
from meerk40t.tools.geomstr import Geomstr
|
14
|
+
|
15
|
+
|
16
|
+
class RibbonNode:
|
17
|
+
"""
|
18
|
+
Base RibbonNode class.
|
19
|
+
"""
|
20
|
+
|
21
|
+
def __init__(self, ribbon):
|
22
|
+
self.brush = wx.Brush(wx.RED)
|
23
|
+
self.pen = wx.Pen(wx.BLUE)
|
24
|
+
self.diameter = 5000
|
25
|
+
self.ribbon = ribbon
|
26
|
+
self.position = None
|
27
|
+
|
28
|
+
def get(self, index):
|
29
|
+
return self.ribbon.nodes[index].position
|
30
|
+
|
31
|
+
def tick(self):
|
32
|
+
pass
|
33
|
+
|
34
|
+
def process_draw(self, gc: wx.GraphicsContext):
|
35
|
+
if not self.position:
|
36
|
+
return
|
37
|
+
gc.PushState()
|
38
|
+
gc.SetPen(self.pen)
|
39
|
+
gc.SetBrush(self.brush)
|
40
|
+
gc.DrawEllipse(self.position[0], self.position[1], self.diameter, self.diameter)
|
41
|
+
gc.PopState()
|
42
|
+
|
43
|
+
|
44
|
+
class RetroNode(RibbonNode):
|
45
|
+
"""
|
46
|
+
Position of node is the referenced nodes position <count> ticks ago. Or the average of the last <count> ticks.
|
47
|
+
"""
|
48
|
+
|
49
|
+
def __init__(self, ribbon, retro_node, count, average=False):
|
50
|
+
super().__init__(ribbon)
|
51
|
+
self.retro_node = retro_node
|
52
|
+
self.count = count
|
53
|
+
self.average = average
|
54
|
+
self._xs = []
|
55
|
+
self._ys = []
|
56
|
+
|
57
|
+
def tick(self):
|
58
|
+
tracking_pos = self.get(self.retro_node)
|
59
|
+
if tracking_pos is None:
|
60
|
+
return
|
61
|
+
self._xs.append(tracking_pos[0])
|
62
|
+
self._ys.append(tracking_pos[1])
|
63
|
+
if self.average:
|
64
|
+
xs = sum(self._xs) / len(self._xs)
|
65
|
+
ys = sum(self._ys) / len(self._ys)
|
66
|
+
self.position = [xs, ys]
|
67
|
+
if len(self._xs) >= self.count:
|
68
|
+
self._xs.pop(0)
|
69
|
+
self._ys.pop(0)
|
70
|
+
else:
|
71
|
+
self.position = None
|
72
|
+
if len(self._xs) >= self.count:
|
73
|
+
self.position = self._xs.pop(0), self._ys.pop(0)
|
74
|
+
|
75
|
+
|
76
|
+
class MidpointNode(RibbonNode):
|
77
|
+
"""
|
78
|
+
Node's position is the average of the provided nodes positions.
|
79
|
+
"""
|
80
|
+
|
81
|
+
def __init__(self, ribbon, nodes):
|
82
|
+
super().__init__(ribbon)
|
83
|
+
self.average_node = nodes
|
84
|
+
self.ribbon = ribbon
|
85
|
+
self.brush = wx.Brush(wx.RED)
|
86
|
+
self.pen = wx.Pen(wx.BLUE)
|
87
|
+
|
88
|
+
def tick(self):
|
89
|
+
count = len(self.average_node)
|
90
|
+
xs = 0
|
91
|
+
ys = 0
|
92
|
+
for node in self.average_node:
|
93
|
+
pos = self.get(node)
|
94
|
+
if pos is None:
|
95
|
+
count -= 1
|
96
|
+
continue
|
97
|
+
xs += pos[0]
|
98
|
+
ys += pos[1]
|
99
|
+
if count == 0:
|
100
|
+
self.position = None
|
101
|
+
return
|
102
|
+
self.position = xs / count, ys / count
|
103
|
+
|
104
|
+
|
105
|
+
class OffsetNode(RibbonNode):
|
106
|
+
"""
|
107
|
+
Position is the referenced node's position plus a static offset.
|
108
|
+
"""
|
109
|
+
|
110
|
+
def __init__(self, ribbon, offset_node, dx=0.0, dy=0.0):
|
111
|
+
super().__init__(ribbon)
|
112
|
+
self.offset_node = offset_node
|
113
|
+
self.ribbon = ribbon
|
114
|
+
self.brush = wx.Brush(wx.RED)
|
115
|
+
self.pen = wx.Pen(wx.BLUE)
|
116
|
+
self.dx = dx
|
117
|
+
self.dy = dy
|
118
|
+
|
119
|
+
def tick(self):
|
120
|
+
pos = self.get(self.offset_node)
|
121
|
+
if pos is None:
|
122
|
+
self.position = None
|
123
|
+
return
|
124
|
+
self.position = pos[0] + self.dx, pos[1] + self.dy
|
125
|
+
|
126
|
+
|
127
|
+
class OrientationNode(RibbonNode):
|
128
|
+
"""
|
129
|
+
Orientation node is a 5 node positional. It is located at the reference node. At some angle and some distance away.
|
130
|
+
If a0, a1 are not given the angle is static at offset_angle.
|
131
|
+
if d0, d1 are not given the radius is static at offset_radius.
|
132
|
+
dx, dy are static offsets.
|
133
|
+
"""
|
134
|
+
|
135
|
+
def __init__(
|
136
|
+
self,
|
137
|
+
ribbon,
|
138
|
+
ref_node=0,
|
139
|
+
a0=None,
|
140
|
+
a1=None,
|
141
|
+
d0=None,
|
142
|
+
d1=None,
|
143
|
+
dx=0.0,
|
144
|
+
dy=0.0,
|
145
|
+
offset_radius=0.0,
|
146
|
+
offset_angle=0.0,
|
147
|
+
):
|
148
|
+
super().__init__(ribbon)
|
149
|
+
self.ref_node = ref_node
|
150
|
+
self.a0 = a0
|
151
|
+
self.a1 = a1
|
152
|
+
self.d0 = d0
|
153
|
+
self.d1 = d1
|
154
|
+
self.dx = dx
|
155
|
+
self.dy = dy
|
156
|
+
self.offset_radius = offset_radius
|
157
|
+
self.offset_angle = offset_angle
|
158
|
+
|
159
|
+
def tick(self):
|
160
|
+
ref_pos = self.get(self.ref_node)
|
161
|
+
if ref_pos is None:
|
162
|
+
# ref position is required.
|
163
|
+
self.position = None
|
164
|
+
return
|
165
|
+
angle = self.offset_angle
|
166
|
+
if self.a0 is not None and self.a1 is not None:
|
167
|
+
a0 = self.get(self.a0)
|
168
|
+
a1 = self.get(self.a1)
|
169
|
+
if a0 is not None and a1 is not None:
|
170
|
+
angle += Geomstr.angle(None, complex(*a0), complex(*a1))
|
171
|
+
distance = self.offset_radius
|
172
|
+
if self.d0 is not None and self.d1 is not None:
|
173
|
+
d0 = self.get(self.d0)
|
174
|
+
d1 = self.get(self.d1)
|
175
|
+
if d0 is not None and d1 is not None:
|
176
|
+
distance += Geomstr.distance(None, complex(*d0), complex(*d1))
|
177
|
+
|
178
|
+
x = distance * math.cos(angle) + ref_pos[0] + self.dx
|
179
|
+
y = distance * math.sin(angle) + ref_pos[1] + self.dy
|
180
|
+
self.position = [x, y]
|
181
|
+
|
182
|
+
|
183
|
+
class GravityNode(RibbonNode):
|
184
|
+
"""
|
185
|
+
Gravity node moves towards the node index it is attracted to at the given friction and attraction amount
|
186
|
+
"""
|
187
|
+
|
188
|
+
def __init__(self, ribbon, attract_node=0):
|
189
|
+
super().__init__(ribbon)
|
190
|
+
self.friction = 0.05
|
191
|
+
self.distance = 50
|
192
|
+
self.attraction = 500
|
193
|
+
self.velocity = [0.0, 0.0]
|
194
|
+
self.attract_node = attract_node
|
195
|
+
|
196
|
+
def tick(self):
|
197
|
+
towards_pos = self.get(self.attract_node)
|
198
|
+
if self.position is None:
|
199
|
+
self.position = list(self.ribbon.position)
|
200
|
+
vx = self.velocity[0] * (1 - self.friction)
|
201
|
+
vy = self.velocity[1] * (1 - self.friction)
|
202
|
+
if towards_pos is not None:
|
203
|
+
angle = Geomstr.angle(None, complex(*towards_pos), complex(*self.position))
|
204
|
+
vx -= self.attraction * math.cos(angle)
|
205
|
+
vy -= self.attraction * math.sin(angle)
|
206
|
+
|
207
|
+
self.velocity[0] = vx
|
208
|
+
self.velocity[1] = vy
|
209
|
+
self.position[0] += vx
|
210
|
+
self.position[1] += vy
|
211
|
+
|
212
|
+
|
213
|
+
class PositionNode(RibbonNode):
|
214
|
+
"""
|
215
|
+
Position node is simply the ribbon's last identified position as a node.
|
216
|
+
"""
|
217
|
+
|
218
|
+
def __init__(self, ribbon):
|
219
|
+
super().__init__(ribbon)
|
220
|
+
self.ribbon = ribbon
|
221
|
+
self.brush = wx.Brush(wx.RED)
|
222
|
+
self.pen = wx.Pen(wx.BLUE)
|
223
|
+
self.position = self.ribbon.position
|
224
|
+
|
225
|
+
def tick(self):
|
226
|
+
self.position = self.ribbon.position
|
227
|
+
|
228
|
+
|
229
|
+
class DrawSequence:
|
230
|
+
"""
|
231
|
+
Draw sequence is what sort of drawn connections should occur between the different nodes and in what sequences.
|
232
|
+
|
233
|
+
There are three levels of steps.
|
234
|
+
1. The outermost is the series level and each series level step is drawn completely independent of any other series.
|
235
|
+
These are disjointed paths.
|
236
|
+
2. The step level is done in tick order.
|
237
|
+
3. The indexes are performed in order during a tick.
|
238
|
+
"""
|
239
|
+
|
240
|
+
def __init__(self, ribbon, sequences):
|
241
|
+
self.series = {}
|
242
|
+
self.tick_index = 0
|
243
|
+
self.ribbon = ribbon
|
244
|
+
self.pen = wx.Pen(wx.BLUE)
|
245
|
+
self.sequences = sequences
|
246
|
+
|
247
|
+
@classmethod
|
248
|
+
def zig(cls, ribbon, zig=0, zag=1):
|
249
|
+
"""
|
250
|
+
This is one path, [] and each is in a 4 tick sequence. The first sequence is 0 the second 0, third 1 and then 1
|
251
|
+
So this draws between element 0, then element 0, then element 1, then element 1. Performing a zigzag.
|
252
|
+
@param ribbon:
|
253
|
+
@param zig:
|
254
|
+
@param zag:
|
255
|
+
@return:
|
256
|
+
"""
|
257
|
+
return cls(ribbon, sequences=[[[zig], [zig], [zag], [zag]]])
|
258
|
+
|
259
|
+
@classmethod
|
260
|
+
def bounce(cls, ribbon, *args):
|
261
|
+
return cls(ribbon, sequences=[[list(args)]])
|
262
|
+
|
263
|
+
@classmethod
|
264
|
+
def bounce_back(cls, ribbon, *args):
|
265
|
+
return cls(ribbon, sequences=[[list(args), list(reversed(args))]])
|
266
|
+
|
267
|
+
@classmethod
|
268
|
+
def parallel(cls, ribbon, *args):
|
269
|
+
sequence = [[[arg]] for arg in args]
|
270
|
+
print(sequence)
|
271
|
+
return cls(ribbon, sequences=sequence)
|
272
|
+
|
273
|
+
def tick(self):
|
274
|
+
"""
|
275
|
+
Process draw sequencing for the given tick.
|
276
|
+
@return:
|
277
|
+
"""
|
278
|
+
self.tick_index += 1
|
279
|
+
for s, sequence in enumerate(self.sequences):
|
280
|
+
series = self.series.get(s)
|
281
|
+
if series is None:
|
282
|
+
# Add series if not init
|
283
|
+
series = []
|
284
|
+
self.series[s] = series
|
285
|
+
|
286
|
+
q = self.tick_index % len(sequence)
|
287
|
+
seq = sequence[q]
|
288
|
+
for i in seq:
|
289
|
+
pos = self.ribbon.nodes[i].position
|
290
|
+
if pos is None:
|
291
|
+
continue
|
292
|
+
x, y = pos
|
293
|
+
series.append((x, y))
|
294
|
+
|
295
|
+
def process_draw(self, gc: wx.GraphicsContext):
|
296
|
+
"""
|
297
|
+
Draws the current sequence.
|
298
|
+
@param gc:
|
299
|
+
@return:
|
300
|
+
"""
|
301
|
+
gc.SetPen(self.pen)
|
302
|
+
for q in self.series:
|
303
|
+
series = self.series[q]
|
304
|
+
gc.StrokeLines(series)
|
305
|
+
|
306
|
+
def get_path(self):
|
307
|
+
"""
|
308
|
+
Get the sequence as a geomstr path.
|
309
|
+
@return: geomstr return object
|
310
|
+
"""
|
311
|
+
|
312
|
+
g = Geomstr()
|
313
|
+
for q in self.series:
|
314
|
+
series = self.series[q]
|
315
|
+
g.polyline(points=[complex(x, y) for x, y in series])
|
316
|
+
return g
|
317
|
+
|
318
|
+
def clear(self):
|
319
|
+
self.series.clear()
|
320
|
+
|
321
|
+
|
322
|
+
class Ribbon:
|
323
|
+
def __init__(self):
|
324
|
+
self.nodes = []
|
325
|
+
self.sequence = DrawSequence.zig(self)
|
326
|
+
self.position = None
|
327
|
+
|
328
|
+
@classmethod
|
329
|
+
def gravity_tool(cls):
|
330
|
+
"""
|
331
|
+
Gravity tool is a position node and a single gravity node that moves towards it.
|
332
|
+
@return:
|
333
|
+
"""
|
334
|
+
obj = cls()
|
335
|
+
obj.nodes.append(PositionNode(obj))
|
336
|
+
obj.nodes.append(GravityNode(obj, 0))
|
337
|
+
obj.sequence = DrawSequence.zig(obj)
|
338
|
+
return obj
|
339
|
+
|
340
|
+
@classmethod
|
341
|
+
def smooth_gravity_tool(cls):
|
342
|
+
"""
|
343
|
+
Gravity tool is a position node and a single gravity node that moves towards it.
|
344
|
+
@return:
|
345
|
+
"""
|
346
|
+
obj = cls()
|
347
|
+
obj.nodes.append(PositionNode(obj))
|
348
|
+
obj.nodes.append(RetroNode(obj, 0, 25, average=True))
|
349
|
+
obj.nodes.append(GravityNode(obj, 1))
|
350
|
+
|
351
|
+
obj.sequence = DrawSequence.zig(obj, 1, 2)
|
352
|
+
return obj
|
353
|
+
|
354
|
+
@classmethod
|
355
|
+
def speed_zig_tool(cls):
|
356
|
+
"""
|
357
|
+
@return:
|
358
|
+
"""
|
359
|
+
obj = cls()
|
360
|
+
obj.nodes.append(OrientationNode(obj, 2, 2, 3, 2, 3, offset_angle=math.tau / 4))
|
361
|
+
obj.nodes.append(
|
362
|
+
OrientationNode(obj, 2, 2, 3, 2, 3, offset_angle=-math.tau / 4)
|
363
|
+
)
|
364
|
+
obj.nodes.append(PositionNode(obj))
|
365
|
+
obj.nodes.append(RetroNode(obj, 2, 5, average=True))
|
366
|
+
obj.sequence = DrawSequence.zig(obj, 0, 1)
|
367
|
+
return obj
|
368
|
+
|
369
|
+
@classmethod
|
370
|
+
def reverb_tool(cls):
|
371
|
+
"""
|
372
|
+
@return:
|
373
|
+
"""
|
374
|
+
obj = cls()
|
375
|
+
obj.nodes.append(PositionNode(obj))
|
376
|
+
obj.nodes.append(RetroNode(obj, 0, 20))
|
377
|
+
return obj
|
378
|
+
|
379
|
+
@classmethod
|
380
|
+
def line_gravity_tool(cls):
|
381
|
+
"""
|
382
|
+
Gravity line tool is a position node, being tracked by a gravity node, which in turn is tracked by another such
|
383
|
+
node. The draw sequence bounces between the two gravity nodes.
|
384
|
+
|
385
|
+
@return:
|
386
|
+
"""
|
387
|
+
obj = cls()
|
388
|
+
obj.nodes.append(PositionNode(obj))
|
389
|
+
obj.nodes.append(GravityNode(obj, 0))
|
390
|
+
obj.nodes.append(GravityNode(obj, 1))
|
391
|
+
obj.sequence = DrawSequence.bounce(obj, 1, 2)
|
392
|
+
return obj
|
393
|
+
|
394
|
+
@classmethod
|
395
|
+
def calligraphy_tool(cls):
|
396
|
+
obj = cls()
|
397
|
+
obj.nodes.append(PositionNode(obj))
|
398
|
+
obj.nodes.append(OffsetNode(obj, 0, 10000, 10000))
|
399
|
+
obj.sequence = DrawSequence.bounce_back(obj, 0, 1)
|
400
|
+
return obj
|
401
|
+
|
402
|
+
@classmethod
|
403
|
+
def bendy_calligraphy_tool(cls):
|
404
|
+
"""
|
405
|
+
B5,5B2,10kO5,3,4vvl100,100f0"
|
406
|
+
@return:
|
407
|
+
"""
|
408
|
+
obj = cls()
|
409
|
+
obj.nodes.append(PositionNode(obj))
|
410
|
+
obj.nodes.append(OffsetNode(obj, 0, 10000, 10000))
|
411
|
+
obj.nodes.append(RetroNode(obj, 0, 5, average=True))
|
412
|
+
obj.nodes.append(RetroNode(obj, 1, 10, average=True))
|
413
|
+
obj.sequence = DrawSequence.bounce_back(obj, 2, 3)
|
414
|
+
return obj
|
415
|
+
|
416
|
+
@classmethod
|
417
|
+
def crescent_tool(cls):
|
418
|
+
"""
|
419
|
+
o3,4,120,100o3,4,0,100o3,4,-120,100kB5, 10B5,5f0"
|
420
|
+
@return:
|
421
|
+
"""
|
422
|
+
obj = cls()
|
423
|
+
obj.nodes.append(
|
424
|
+
OrientationNode(
|
425
|
+
obj, 3, 3, 4, offset_angle=math.tau / 3, offset_radius=10000
|
426
|
+
)
|
427
|
+
)
|
428
|
+
obj.nodes.append(
|
429
|
+
OrientationNode(obj, 3, 3, 4, offset_angle=0, offset_radius=10000)
|
430
|
+
)
|
431
|
+
obj.nodes.append(
|
432
|
+
OrientationNode(
|
433
|
+
obj, 3, 3, 4, offset_angle=-math.tau / 3, offset_radius=10000
|
434
|
+
)
|
435
|
+
)
|
436
|
+
obj.nodes.append(RetroNode(obj, 5, 10, average=True))
|
437
|
+
obj.nodes.append(RetroNode(obj, 5, 5, average=True))
|
438
|
+
obj.nodes.append(PositionNode(obj))
|
439
|
+
|
440
|
+
obj.sequence = DrawSequence.bounce_back(obj, 0, 1, 2)
|
441
|
+
return obj
|
442
|
+
|
443
|
+
@classmethod
|
444
|
+
def rake_tool(cls):
|
445
|
+
"""
|
446
|
+
"f0B0,10o1,0,90,100s.3ns.6ns-.3ns-.6D2,3,1,4,5"
|
447
|
+
@return:
|
448
|
+
"""
|
449
|
+
obj = cls()
|
450
|
+
obj.nodes.append(PositionNode(obj))
|
451
|
+
obj.nodes.append(RetroNode(obj, 0, 10, average=True))
|
452
|
+
|
453
|
+
obj.nodes.append(
|
454
|
+
OrientationNode(
|
455
|
+
obj, 1, 0, 1, offset_angle=math.tau / 4, offset_radius=10000
|
456
|
+
)
|
457
|
+
)
|
458
|
+
obj.nodes.append(
|
459
|
+
OrientationNode(obj, 1, 0, 1, offset_angle=math.tau / 4, offset_radius=5000)
|
460
|
+
)
|
461
|
+
obj.nodes.append(
|
462
|
+
OrientationNode(
|
463
|
+
obj, 1, 0, 1, offset_angle=math.tau / 4, offset_radius=-5000
|
464
|
+
)
|
465
|
+
)
|
466
|
+
obj.nodes.append(
|
467
|
+
OrientationNode(
|
468
|
+
obj, 1, 0, 1, offset_angle=math.tau / 4, offset_radius=-10000
|
469
|
+
)
|
470
|
+
)
|
471
|
+
obj.sequence = DrawSequence.parallel(obj, 2, 3, 1, 4, 5)
|
472
|
+
|
473
|
+
return obj
|
474
|
+
|
475
|
+
@classmethod
|
476
|
+
def nudge_loop_tool(cls):
|
477
|
+
obj = cls()
|
478
|
+
obj.nodes.append(PositionNode(obj))
|
479
|
+
obj.nodes.append(GravityNode(obj, 2))
|
480
|
+
obj.nodes.append(GravityNode(obj, 3))
|
481
|
+
obj.nodes.append(GravityNode(obj, 4))
|
482
|
+
obj.nodes.append(MidpointNode(obj, [0, 1]))
|
483
|
+
obj.sequence = DrawSequence.bounce_back(obj, 1, 2, 3)
|
484
|
+
return obj
|
485
|
+
|
486
|
+
def tick(self):
|
487
|
+
"""
|
488
|
+
Delegate to nodes and sequence.
|
489
|
+
@return:
|
490
|
+
"""
|
491
|
+
for node in self.nodes:
|
492
|
+
node.tick()
|
493
|
+
self.sequence.tick()
|
494
|
+
|
495
|
+
def process_draw(self, gc: wx.GraphicsContext):
|
496
|
+
"""
|
497
|
+
Delegate to nodes and sequence.
|
498
|
+
@return:
|
499
|
+
"""
|
500
|
+
for node in self.nodes:
|
501
|
+
node.process_draw(gc)
|
502
|
+
self.sequence.process_draw(gc)
|
503
|
+
|
504
|
+
def get_path(self):
|
505
|
+
"""
|
506
|
+
Delegate to sequence.
|
507
|
+
@return:
|
508
|
+
"""
|
509
|
+
return self.sequence.get_path()
|
510
|
+
|
511
|
+
def clear(self):
|
512
|
+
self.sequence.clear()
|
513
|
+
|
514
|
+
|
515
|
+
class RibbonTool(ToolWidget):
|
516
|
+
"""
|
517
|
+
Ribbon Tool draws new segments by animating some click and press locations.
|
518
|
+
"""
|
519
|
+
|
520
|
+
def __init__(self, scene, mode="gravity"):
|
521
|
+
ToolWidget.__init__(self, scene)
|
522
|
+
self.stop = False
|
523
|
+
if mode == "gravity":
|
524
|
+
self.ribbon = Ribbon.gravity_tool()
|
525
|
+
elif mode == "line":
|
526
|
+
self.ribbon = Ribbon.line_gravity_tool()
|
527
|
+
elif mode == "smooth":
|
528
|
+
self.ribbon = Ribbon.smooth_gravity_tool()
|
529
|
+
elif mode == "speedzig":
|
530
|
+
self.ribbon = Ribbon.speed_zig_tool()
|
531
|
+
elif mode == "reverb":
|
532
|
+
self.ribbon = Ribbon.reverb_tool()
|
533
|
+
elif mode == "calligraphy":
|
534
|
+
self.ribbon = Ribbon.calligraphy_tool()
|
535
|
+
elif mode == "nudge":
|
536
|
+
self.ribbon = Ribbon.nudge_loop_tool()
|
537
|
+
elif mode == "bendy_calligraphy":
|
538
|
+
self.ribbon = Ribbon.bendy_calligraphy_tool()
|
539
|
+
elif mode == "rake":
|
540
|
+
self.ribbon = Ribbon.rake_tool()
|
541
|
+
elif mode == "crescent":
|
542
|
+
self.ribbon = Ribbon.crescent_tool()
|
543
|
+
else:
|
544
|
+
self.ribbon = Ribbon.gravity_tool()
|
545
|
+
|
546
|
+
def process_draw(self, gc: wx.GraphicsContext):
|
547
|
+
self.ribbon.process_draw(gc)
|
548
|
+
|
549
|
+
def tick(self):
|
550
|
+
self.ribbon.tick()
|
551
|
+
self.scene.request_refresh()
|
552
|
+
if self.stop:
|
553
|
+
return False
|
554
|
+
return True
|
555
|
+
|
556
|
+
def event(
|
557
|
+
self, window_pos=None, space_pos=None, event_type=None, modifiers=None, **kwargs
|
558
|
+
):
|
559
|
+
# We don't set tool_active here, as this can't be properly honored...
|
560
|
+
# And we don't care about nearest_snap either...
|
561
|
+
response = RESPONSE_CHAIN
|
562
|
+
if event_type == "leftdown":
|
563
|
+
self.stop = False
|
564
|
+
self.ribbon.position = space_pos[:2]
|
565
|
+
self.scene.animate(self)
|
566
|
+
response = RESPONSE_CONSUME
|
567
|
+
elif event_type == "move" or event_type == "hover":
|
568
|
+
self.ribbon.position = space_pos[:2]
|
569
|
+
response = RESPONSE_CONSUME
|
570
|
+
elif event_type == "lost" or (event_type == "key_up" and modifiers == "escape"):
|
571
|
+
self.stop = True
|
572
|
+
self.ribbon.clear()
|
573
|
+
if self.scene.pane.tool_active:
|
574
|
+
self.scene.pane.tool_active = False
|
575
|
+
self.scene.request_refresh()
|
576
|
+
return RESPONSE_CONSUME
|
577
|
+
else:
|
578
|
+
return RESPONSE_CHAIN
|
579
|
+
elif event_type == "leftup":
|
580
|
+
self.stop = True
|
581
|
+
t = self.ribbon.get_path()
|
582
|
+
if not t:
|
583
|
+
return RESPONSE_CONSUME
|
584
|
+
elements = self.scene.context.elements
|
585
|
+
# _("Create path")
|
586
|
+
with elements.undoscope("Create path"):
|
587
|
+
node = elements.elem_branch.add(
|
588
|
+
geometry=t,
|
589
|
+
type="elem path",
|
590
|
+
stroke_width=elements.default_strokewidth,
|
591
|
+
stroke=elements.default_stroke,
|
592
|
+
fill=elements.default_fill,
|
593
|
+
)
|
594
|
+
if elements.classify_new:
|
595
|
+
elements.classify([node])
|
596
|
+
self.ribbon.clear()
|
597
|
+
response = RESPONSE_CONSUME
|
598
|
+
return response
|