meerk40t 0.9.3001__py2.py3-none-any.whl → 0.9.7020__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- meerk40t/__init__.py +1 -1
- meerk40t/balormk/balor_params.py +167 -167
- meerk40t/balormk/clone_loader.py +457 -457
- meerk40t/balormk/controller.py +1566 -1512
- meerk40t/balormk/cylindermod.py +64 -0
- meerk40t/balormk/device.py +966 -1959
- meerk40t/balormk/driver.py +778 -591
- meerk40t/balormk/galvo_commands.py +1194 -0
- meerk40t/balormk/gui/balorconfig.py +237 -111
- meerk40t/balormk/gui/balorcontroller.py +191 -184
- meerk40t/balormk/gui/baloroperationproperties.py +116 -115
- meerk40t/balormk/gui/corscene.py +845 -0
- meerk40t/balormk/gui/gui.py +179 -147
- meerk40t/balormk/livelightjob.py +466 -382
- meerk40t/balormk/mock_connection.py +131 -109
- meerk40t/balormk/plugin.py +133 -135
- meerk40t/balormk/usb_connection.py +306 -301
- meerk40t/camera/__init__.py +1 -1
- meerk40t/camera/camera.py +514 -397
- meerk40t/camera/gui/camerapanel.py +1241 -1095
- meerk40t/camera/gui/gui.py +58 -58
- meerk40t/camera/plugin.py +441 -399
- meerk40t/ch341/__init__.py +27 -27
- meerk40t/ch341/ch341device.py +628 -628
- meerk40t/ch341/libusb.py +595 -589
- meerk40t/ch341/mock.py +171 -171
- meerk40t/ch341/windriver.py +157 -157
- meerk40t/constants.py +13 -0
- meerk40t/core/__init__.py +1 -1
- meerk40t/core/bindalias.py +550 -539
- meerk40t/core/core.py +47 -47
- meerk40t/core/cutcode/cubiccut.py +73 -73
- meerk40t/core/cutcode/cutcode.py +315 -312
- meerk40t/core/cutcode/cutgroup.py +141 -137
- meerk40t/core/cutcode/cutobject.py +192 -185
- meerk40t/core/cutcode/dwellcut.py +37 -37
- meerk40t/core/cutcode/gotocut.py +29 -29
- meerk40t/core/cutcode/homecut.py +29 -29
- meerk40t/core/cutcode/inputcut.py +34 -34
- meerk40t/core/cutcode/linecut.py +33 -33
- meerk40t/core/cutcode/outputcut.py +34 -34
- meerk40t/core/cutcode/plotcut.py +335 -335
- meerk40t/core/cutcode/quadcut.py +61 -61
- meerk40t/core/cutcode/rastercut.py +168 -148
- meerk40t/core/cutcode/waitcut.py +34 -34
- meerk40t/core/cutplan.py +1843 -1316
- meerk40t/core/drivers.py +330 -329
- meerk40t/core/elements/align.py +801 -669
- meerk40t/core/elements/branches.py +1858 -1507
- meerk40t/core/elements/clipboard.py +229 -219
- meerk40t/core/elements/element_treeops.py +4595 -2837
- meerk40t/core/elements/element_types.py +125 -105
- meerk40t/core/elements/elements.py +4315 -3617
- meerk40t/core/elements/files.py +117 -64
- meerk40t/core/elements/geometry.py +473 -224
- meerk40t/core/elements/grid.py +467 -316
- meerk40t/core/elements/materials.py +158 -94
- meerk40t/core/elements/notes.py +50 -38
- meerk40t/core/elements/offset_clpr.py +934 -912
- meerk40t/core/elements/offset_mk.py +963 -955
- meerk40t/core/elements/penbox.py +339 -267
- meerk40t/core/elements/placements.py +300 -83
- meerk40t/core/elements/render.py +785 -687
- meerk40t/core/elements/shapes.py +2618 -2092
- meerk40t/core/elements/testcases.py +105 -0
- meerk40t/core/elements/trace.py +651 -563
- meerk40t/core/elements/tree_commands.py +415 -409
- meerk40t/core/elements/undo_redo.py +116 -58
- meerk40t/core/elements/wordlist.py +319 -200
- meerk40t/core/exceptions.py +9 -9
- meerk40t/core/laserjob.py +220 -220
- meerk40t/core/logging.py +63 -63
- meerk40t/core/node/blobnode.py +83 -86
- meerk40t/core/node/bootstrap.py +105 -103
- meerk40t/core/node/branch_elems.py +40 -31
- meerk40t/core/node/branch_ops.py +45 -38
- meerk40t/core/node/branch_regmark.py +48 -41
- meerk40t/core/node/cutnode.py +29 -32
- meerk40t/core/node/effect_hatch.py +375 -257
- meerk40t/core/node/effect_warp.py +398 -0
- meerk40t/core/node/effect_wobble.py +441 -309
- meerk40t/core/node/elem_ellipse.py +404 -309
- meerk40t/core/node/elem_image.py +1082 -801
- meerk40t/core/node/elem_line.py +358 -292
- meerk40t/core/node/elem_path.py +259 -201
- meerk40t/core/node/elem_point.py +129 -102
- meerk40t/core/node/elem_polyline.py +310 -246
- meerk40t/core/node/elem_rect.py +376 -286
- meerk40t/core/node/elem_text.py +445 -418
- meerk40t/core/node/filenode.py +59 -40
- meerk40t/core/node/groupnode.py +138 -74
- meerk40t/core/node/image_processed.py +777 -766
- meerk40t/core/node/image_raster.py +156 -113
- meerk40t/core/node/layernode.py +31 -31
- meerk40t/core/node/mixins.py +135 -107
- meerk40t/core/node/node.py +1427 -1304
- meerk40t/core/node/nutils.py +117 -114
- meerk40t/core/node/op_cut.py +463 -335
- meerk40t/core/node/op_dots.py +296 -251
- meerk40t/core/node/op_engrave.py +414 -311
- meerk40t/core/node/op_image.py +755 -369
- meerk40t/core/node/op_raster.py +787 -522
- meerk40t/core/node/place_current.py +37 -40
- meerk40t/core/node/place_point.py +329 -126
- meerk40t/core/node/refnode.py +58 -47
- meerk40t/core/node/rootnode.py +225 -219
- meerk40t/core/node/util_console.py +48 -48
- meerk40t/core/node/util_goto.py +84 -65
- meerk40t/core/node/util_home.py +61 -61
- meerk40t/core/node/util_input.py +102 -102
- meerk40t/core/node/util_output.py +102 -102
- meerk40t/core/node/util_wait.py +65 -65
- meerk40t/core/parameters.py +709 -707
- meerk40t/core/planner.py +875 -785
- meerk40t/core/plotplanner.py +656 -652
- meerk40t/core/space.py +120 -113
- meerk40t/core/spoolers.py +706 -705
- meerk40t/core/svg_io.py +1836 -1549
- meerk40t/core/treeop.py +534 -445
- meerk40t/core/undos.py +278 -124
- meerk40t/core/units.py +784 -680
- meerk40t/core/view.py +393 -322
- meerk40t/core/webhelp.py +62 -62
- meerk40t/core/wordlist.py +513 -504
- meerk40t/cylinder/cylinder.py +247 -0
- meerk40t/cylinder/gui/cylindersettings.py +41 -0
- meerk40t/cylinder/gui/gui.py +24 -0
- meerk40t/device/__init__.py +1 -1
- meerk40t/device/basedevice.py +322 -123
- meerk40t/device/devicechoices.py +50 -0
- meerk40t/device/dummydevice.py +163 -128
- meerk40t/device/gui/defaultactions.py +618 -602
- meerk40t/device/gui/effectspanel.py +114 -0
- meerk40t/device/gui/formatterpanel.py +253 -290
- meerk40t/device/gui/warningpanel.py +337 -260
- meerk40t/device/mixins.py +13 -13
- meerk40t/dxf/__init__.py +1 -1
- meerk40t/dxf/dxf_io.py +766 -554
- meerk40t/dxf/plugin.py +47 -35
- meerk40t/external_plugins.py +79 -79
- meerk40t/external_plugins_build.py +28 -28
- meerk40t/extra/cag.py +112 -116
- meerk40t/extra/coolant.py +403 -0
- meerk40t/extra/encode_detect.py +204 -0
- meerk40t/extra/ezd.py +1165 -1165
- meerk40t/extra/hershey.py +834 -340
- meerk40t/extra/imageactions.py +322 -316
- meerk40t/extra/inkscape.py +628 -622
- meerk40t/extra/lbrn.py +424 -424
- meerk40t/extra/outerworld.py +283 -0
- meerk40t/extra/param_functions.py +1542 -1556
- meerk40t/extra/potrace.py +257 -253
- meerk40t/extra/serial_exchange.py +118 -0
- meerk40t/extra/updater.py +602 -453
- meerk40t/extra/vectrace.py +147 -146
- meerk40t/extra/winsleep.py +83 -83
- meerk40t/extra/xcs_reader.py +597 -0
- meerk40t/fill/fills.py +781 -335
- meerk40t/fill/patternfill.py +1061 -1061
- meerk40t/fill/patterns.py +614 -567
- meerk40t/grbl/control.py +87 -87
- meerk40t/grbl/controller.py +990 -903
- meerk40t/grbl/device.py +1084 -768
- meerk40t/grbl/driver.py +989 -771
- meerk40t/grbl/emulator.py +532 -497
- meerk40t/grbl/gcodejob.py +783 -767
- meerk40t/grbl/gui/grblconfiguration.py +373 -298
- meerk40t/grbl/gui/grblcontroller.py +485 -271
- meerk40t/grbl/gui/grblhardwareconfig.py +269 -153
- meerk40t/grbl/gui/grbloperationconfig.py +105 -0
- meerk40t/grbl/gui/gui.py +147 -116
- meerk40t/grbl/interpreter.py +44 -44
- meerk40t/grbl/loader.py +22 -22
- meerk40t/grbl/mock_connection.py +56 -56
- meerk40t/grbl/plugin.py +294 -264
- meerk40t/grbl/serial_connection.py +93 -88
- meerk40t/grbl/tcp_connection.py +81 -79
- meerk40t/grbl/ws_connection.py +112 -0
- meerk40t/gui/__init__.py +1 -1
- meerk40t/gui/about.py +2042 -296
- meerk40t/gui/alignment.py +1644 -1608
- meerk40t/gui/autoexec.py +199 -0
- meerk40t/gui/basicops.py +791 -670
- meerk40t/gui/bufferview.py +77 -71
- meerk40t/gui/busy.py +232 -133
- meerk40t/gui/choicepropertypanel.py +1662 -1469
- meerk40t/gui/consolepanel.py +706 -542
- meerk40t/gui/devicepanel.py +687 -581
- meerk40t/gui/dialogoptions.py +110 -107
- meerk40t/gui/executejob.py +316 -306
- meerk40t/gui/fonts.py +90 -90
- meerk40t/gui/functionwrapper.py +252 -0
- meerk40t/gui/gui_mixins.py +729 -0
- meerk40t/gui/guicolors.py +205 -182
- meerk40t/gui/help_assets/help_assets.py +218 -201
- meerk40t/gui/helper.py +154 -0
- meerk40t/gui/hersheymanager.py +1440 -846
- meerk40t/gui/icons.py +3422 -2747
- meerk40t/gui/imagesplitter.py +555 -508
- meerk40t/gui/keymap.py +354 -344
- meerk40t/gui/laserpanel.py +897 -806
- meerk40t/gui/laserrender.py +1470 -1232
- meerk40t/gui/lasertoolpanel.py +805 -793
- meerk40t/gui/magnetoptions.py +436 -0
- meerk40t/gui/materialmanager.py +2944 -0
- meerk40t/gui/materialtest.py +1722 -1694
- meerk40t/gui/mkdebug.py +646 -359
- meerk40t/gui/mwindow.py +163 -140
- meerk40t/gui/navigationpanels.py +2605 -2467
- meerk40t/gui/notes.py +143 -142
- meerk40t/gui/opassignment.py +414 -410
- meerk40t/gui/operation_info.py +310 -299
- meerk40t/gui/plugin.py +500 -328
- meerk40t/gui/position.py +714 -669
- meerk40t/gui/preferences.py +901 -650
- meerk40t/gui/propertypanels/attributes.py +1461 -1131
- meerk40t/gui/propertypanels/blobproperty.py +117 -114
- meerk40t/gui/propertypanels/consoleproperty.py +83 -80
- meerk40t/gui/propertypanels/gotoproperty.py +77 -0
- meerk40t/gui/propertypanels/groupproperties.py +223 -217
- meerk40t/gui/propertypanels/hatchproperty.py +489 -469
- meerk40t/gui/propertypanels/imageproperty.py +2244 -1384
- meerk40t/gui/propertypanels/inputproperty.py +59 -58
- meerk40t/gui/propertypanels/opbranchproperties.py +82 -80
- meerk40t/gui/propertypanels/operationpropertymain.py +1890 -1638
- meerk40t/gui/propertypanels/outputproperty.py +59 -58
- meerk40t/gui/propertypanels/pathproperty.py +389 -380
- meerk40t/gui/propertypanels/placementproperty.py +1214 -383
- meerk40t/gui/propertypanels/pointproperty.py +140 -136
- meerk40t/gui/propertypanels/propertywindow.py +313 -181
- meerk40t/gui/propertypanels/rasterwizardpanels.py +996 -912
- meerk40t/gui/propertypanels/regbranchproperties.py +76 -0
- meerk40t/gui/propertypanels/textproperty.py +770 -755
- meerk40t/gui/propertypanels/waitproperty.py +56 -55
- meerk40t/gui/propertypanels/warpproperty.py +121 -0
- meerk40t/gui/propertypanels/wobbleproperty.py +255 -204
- meerk40t/gui/ribbon.py +2471 -2210
- meerk40t/gui/scene/scene.py +1100 -1051
- meerk40t/gui/scene/sceneconst.py +22 -22
- meerk40t/gui/scene/scenepanel.py +439 -349
- meerk40t/gui/scene/scenespacewidget.py +365 -365
- meerk40t/gui/scene/widget.py +518 -505
- meerk40t/gui/scenewidgets/affinemover.py +215 -215
- meerk40t/gui/scenewidgets/attractionwidget.py +315 -309
- meerk40t/gui/scenewidgets/bedwidget.py +120 -97
- meerk40t/gui/scenewidgets/elementswidget.py +137 -107
- meerk40t/gui/scenewidgets/gridwidget.py +785 -745
- meerk40t/gui/scenewidgets/guidewidget.py +765 -765
- meerk40t/gui/scenewidgets/laserpathwidget.py +66 -66
- meerk40t/gui/scenewidgets/machineoriginwidget.py +86 -86
- meerk40t/gui/scenewidgets/nodeselector.py +28 -28
- meerk40t/gui/scenewidgets/rectselectwidget.py +592 -346
- meerk40t/gui/scenewidgets/relocatewidget.py +33 -33
- meerk40t/gui/scenewidgets/reticlewidget.py +83 -83
- meerk40t/gui/scenewidgets/selectionwidget.py +2958 -2756
- meerk40t/gui/simpleui.py +362 -333
- meerk40t/gui/simulation.py +2451 -2094
- meerk40t/gui/snapoptions.py +208 -203
- meerk40t/gui/spoolerpanel.py +1227 -1180
- meerk40t/gui/statusbarwidgets/defaultoperations.py +480 -353
- meerk40t/gui/statusbarwidgets/infowidget.py +520 -483
- meerk40t/gui/statusbarwidgets/opassignwidget.py +356 -355
- meerk40t/gui/statusbarwidgets/selectionwidget.py +172 -171
- meerk40t/gui/statusbarwidgets/shapepropwidget.py +754 -236
- meerk40t/gui/statusbarwidgets/statusbar.py +272 -260
- meerk40t/gui/statusbarwidgets/statusbarwidget.py +268 -270
- meerk40t/gui/statusbarwidgets/strokewidget.py +267 -251
- meerk40t/gui/themes.py +200 -78
- meerk40t/gui/tips.py +590 -0
- meerk40t/gui/toolwidgets/circlebrush.py +35 -35
- meerk40t/gui/toolwidgets/toolcircle.py +248 -242
- meerk40t/gui/toolwidgets/toolcontainer.py +82 -77
- meerk40t/gui/toolwidgets/tooldraw.py +97 -90
- meerk40t/gui/toolwidgets/toolellipse.py +219 -212
- meerk40t/gui/toolwidgets/toolimagecut.py +25 -132
- meerk40t/gui/toolwidgets/toolline.py +39 -144
- meerk40t/gui/toolwidgets/toollinetext.py +79 -236
- meerk40t/gui/toolwidgets/toollinetext_inline.py +296 -0
- meerk40t/gui/toolwidgets/toolmeasure.py +163 -216
- meerk40t/gui/toolwidgets/toolnodeedit.py +2088 -2074
- meerk40t/gui/toolwidgets/toolnodemove.py +92 -94
- meerk40t/gui/toolwidgets/toolparameter.py +754 -668
- meerk40t/gui/toolwidgets/toolplacement.py +108 -108
- meerk40t/gui/toolwidgets/toolpoint.py +68 -59
- meerk40t/gui/toolwidgets/toolpointlistbuilder.py +294 -0
- meerk40t/gui/toolwidgets/toolpointmove.py +183 -0
- meerk40t/gui/toolwidgets/toolpolygon.py +288 -403
- meerk40t/gui/toolwidgets/toolpolyline.py +38 -196
- meerk40t/gui/toolwidgets/toolrect.py +211 -207
- meerk40t/gui/toolwidgets/toolrelocate.py +72 -72
- meerk40t/gui/toolwidgets/toolribbon.py +598 -113
- meerk40t/gui/toolwidgets/tooltabedit.py +546 -0
- meerk40t/gui/toolwidgets/tooltext.py +98 -89
- meerk40t/gui/toolwidgets/toolvector.py +213 -204
- meerk40t/gui/toolwidgets/toolwidget.py +39 -39
- meerk40t/gui/usbconnect.py +98 -91
- meerk40t/gui/utilitywidgets/buttonwidget.py +18 -18
- meerk40t/gui/utilitywidgets/checkboxwidget.py +90 -90
- meerk40t/gui/utilitywidgets/controlwidget.py +14 -14
- meerk40t/gui/utilitywidgets/cyclocycloidwidget.py +343 -340
- meerk40t/gui/utilitywidgets/debugwidgets.py +148 -0
- meerk40t/gui/utilitywidgets/handlewidget.py +27 -27
- meerk40t/gui/utilitywidgets/harmonograph.py +450 -447
- meerk40t/gui/utilitywidgets/openclosewidget.py +40 -40
- meerk40t/gui/utilitywidgets/rotationwidget.py +54 -54
- meerk40t/gui/utilitywidgets/scalewidget.py +75 -75
- meerk40t/gui/utilitywidgets/seekbarwidget.py +183 -183
- meerk40t/gui/utilitywidgets/togglewidget.py +142 -142
- meerk40t/gui/utilitywidgets/toolbarwidget.py +8 -8
- meerk40t/gui/wordlisteditor.py +985 -931
- meerk40t/gui/wxmeerk40t.py +1447 -1169
- meerk40t/gui/wxmmain.py +5644 -4112
- meerk40t/gui/wxmribbon.py +1591 -1076
- meerk40t/gui/wxmscene.py +1631 -1453
- meerk40t/gui/wxmtree.py +2416 -2089
- meerk40t/gui/wxutils.py +1769 -1099
- meerk40t/gui/zmatrix.py +102 -102
- meerk40t/image/__init__.py +1 -1
- meerk40t/image/dither.py +429 -0
- meerk40t/image/imagetools.py +2793 -2269
- meerk40t/internal_plugins.py +150 -130
- meerk40t/kernel/__init__.py +63 -12
- meerk40t/kernel/channel.py +259 -212
- meerk40t/kernel/context.py +538 -538
- meerk40t/kernel/exceptions.py +41 -41
- meerk40t/kernel/functions.py +463 -414
- meerk40t/kernel/jobs.py +100 -100
- meerk40t/kernel/kernel.py +3828 -3571
- meerk40t/kernel/lifecycles.py +71 -71
- meerk40t/kernel/module.py +49 -49
- meerk40t/kernel/service.py +147 -147
- meerk40t/kernel/settings.py +383 -343
- meerk40t/lihuiyu/controller.py +883 -876
- meerk40t/lihuiyu/device.py +1181 -1069
- meerk40t/lihuiyu/driver.py +1466 -1372
- meerk40t/lihuiyu/gui/gui.py +127 -106
- meerk40t/lihuiyu/gui/lhyaccelgui.py +377 -363
- meerk40t/lihuiyu/gui/lhycontrollergui.py +741 -651
- meerk40t/lihuiyu/gui/lhydrivergui.py +470 -446
- meerk40t/lihuiyu/gui/lhyoperationproperties.py +238 -237
- meerk40t/lihuiyu/gui/tcpcontroller.py +226 -190
- meerk40t/lihuiyu/interpreter.py +53 -53
- meerk40t/lihuiyu/laserspeed.py +450 -450
- meerk40t/lihuiyu/loader.py +90 -90
- meerk40t/lihuiyu/parser.py +404 -404
- meerk40t/lihuiyu/plugin.py +101 -102
- meerk40t/lihuiyu/tcp_connection.py +111 -109
- meerk40t/main.py +231 -165
- meerk40t/moshi/builder.py +788 -781
- meerk40t/moshi/controller.py +505 -499
- meerk40t/moshi/device.py +495 -442
- meerk40t/moshi/driver.py +862 -696
- meerk40t/moshi/gui/gui.py +78 -76
- meerk40t/moshi/gui/moshicontrollergui.py +538 -522
- meerk40t/moshi/gui/moshidrivergui.py +87 -75
- meerk40t/moshi/plugin.py +43 -43
- meerk40t/network/console_server.py +140 -57
- meerk40t/network/kernelserver.py +10 -9
- meerk40t/network/tcp_server.py +142 -140
- meerk40t/network/udp_server.py +103 -77
- meerk40t/network/web_server.py +404 -0
- meerk40t/newly/controller.py +1158 -1144
- meerk40t/newly/device.py +874 -732
- meerk40t/newly/driver.py +540 -412
- meerk40t/newly/gui/gui.py +219 -188
- meerk40t/newly/gui/newlyconfig.py +116 -101
- meerk40t/newly/gui/newlycontroller.py +193 -186
- meerk40t/newly/gui/operationproperties.py +51 -51
- meerk40t/newly/mock_connection.py +82 -82
- meerk40t/newly/newly_params.py +56 -56
- meerk40t/newly/plugin.py +1214 -1246
- meerk40t/newly/usb_connection.py +322 -322
- meerk40t/rotary/gui/gui.py +52 -46
- meerk40t/rotary/gui/rotarysettings.py +240 -232
- meerk40t/rotary/rotary.py +202 -98
- meerk40t/ruida/control.py +291 -91
- meerk40t/ruida/controller.py +138 -1088
- meerk40t/ruida/device.py +676 -231
- meerk40t/ruida/driver.py +534 -472
- meerk40t/ruida/emulator.py +1494 -1491
- meerk40t/ruida/exceptions.py +4 -4
- meerk40t/ruida/gui/gui.py +71 -76
- meerk40t/ruida/gui/ruidaconfig.py +239 -72
- meerk40t/ruida/gui/ruidacontroller.py +187 -184
- meerk40t/ruida/gui/ruidaoperationproperties.py +48 -47
- meerk40t/ruida/loader.py +54 -52
- meerk40t/ruida/mock_connection.py +57 -109
- meerk40t/ruida/plugin.py +124 -87
- meerk40t/ruida/rdjob.py +2084 -945
- meerk40t/ruida/serial_connection.py +116 -0
- meerk40t/ruida/tcp_connection.py +146 -0
- meerk40t/ruida/udp_connection.py +73 -0
- meerk40t/svgelements.py +9671 -9669
- meerk40t/tools/driver_to_path.py +584 -579
- meerk40t/tools/geomstr.py +5583 -4680
- meerk40t/tools/jhfparser.py +357 -292
- meerk40t/tools/kerftest.py +904 -890
- meerk40t/tools/livinghinges.py +1168 -1033
- meerk40t/tools/pathtools.py +987 -949
- meerk40t/tools/pmatrix.py +234 -0
- meerk40t/tools/pointfinder.py +942 -942
- meerk40t/tools/polybool.py +941 -940
- meerk40t/tools/rasterplotter.py +1660 -547
- meerk40t/tools/shxparser.py +1047 -901
- meerk40t/tools/ttfparser.py +726 -446
- meerk40t/tools/zinglplotter.py +595 -593
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/LICENSE +21 -21
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/METADATA +150 -139
- meerk40t-0.9.7020.dist-info/RECORD +446 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/WHEEL +1 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/top_level.txt +0 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/zip-safe +1 -1
- meerk40t/balormk/elementlightjob.py +0 -159
- meerk40t-0.9.3001.dist-info/RECORD +0 -437
- test/bootstrap.py +0 -63
- test/test_cli.py +0 -12
- test/test_core_cutcode.py +0 -418
- test/test_core_elements.py +0 -144
- test/test_core_plotplanner.py +0 -397
- test/test_core_viewports.py +0 -312
- test/test_drivers_grbl.py +0 -108
- test/test_drivers_lihuiyu.py +0 -443
- test/test_drivers_newly.py +0 -113
- test/test_element_degenerate_points.py +0 -43
- test/test_elements_classify.py +0 -97
- test/test_elements_penbox.py +0 -22
- test/test_file_svg.py +0 -176
- test/test_fill.py +0 -155
- test/test_geomstr.py +0 -1523
- test/test_geomstr_nodes.py +0 -18
- test/test_imagetools_actualize.py +0 -306
- test/test_imagetools_wizard.py +0 -258
- test/test_kernel.py +0 -200
- test/test_laser_speeds.py +0 -3303
- test/test_length.py +0 -57
- test/test_lifecycle.py +0 -66
- test/test_operations.py +0 -251
- test/test_operations_hatch.py +0 -57
- test/test_ruida.py +0 -19
- test/test_spooler.py +0 -22
- test/test_tools_rasterplotter.py +0 -29
- test/test_wobble.py +0 -133
- test/test_zingl.py +0 -124
- {test → meerk40t/cylinder}/__init__.py +0 -0
- /meerk40t/{core/element_commands.py → cylinder/gui/__init__.py} +0 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/entry_points.txt +0 -0
meerk40t/extra/imageactions.py
CHANGED
@@ -1,316 +1,322 @@
|
|
1
|
-
from copy import copy
|
2
|
-
from math import isinf
|
3
|
-
|
4
|
-
from meerk40t.core.node.elem_image import ImageNode
|
5
|
-
from meerk40t.core.node.elem_rect import RectNode
|
6
|
-
from meerk40t.core.node.node import Node
|
7
|
-
from meerk40t.core.units import UNITS_PER_INCH
|
8
|
-
from meerk40t.svgelements import Color, Matrix
|
9
|
-
|
10
|
-
|
11
|
-
def prepare_data(data, dsort, pop):
|
12
|
-
"""
|
13
|
-
Prepares the elements data.
|
14
|
-
|
15
|
-
Sorts by the emphasized time, and optionally pops the first element from the remaining elements.
|
16
|
-
|
17
|
-
@param data:
|
18
|
-
@param dsort:
|
19
|
-
@param pop:
|
20
|
-
@return:
|
21
|
-
"""
|
22
|
-
if dsort == "first":
|
23
|
-
data.sort(key=lambda n: n.emphasized_time)
|
24
|
-
elif dsort == "last":
|
25
|
-
data.sort(reverse=True, key=lambda n: n.emphasized_time)
|
26
|
-
if pop:
|
27
|
-
mnode = data.pop(0)
|
28
|
-
return Node.union_bounds(data, attr="paint_bounds"), mnode
|
29
|
-
return Node.union_bounds(data, attr="paint_bounds")
|
30
|
-
|
31
|
-
|
32
|
-
def create_image(make_raster, data, data_bounds, dpi, keep_ratio=True):
|
33
|
-
"""
|
34
|
-
Creates the image with the make_raster command.
|
35
|
-
|
36
|
-
@param make_raster: function to perform raster operation
|
37
|
-
@param data: elements to render
|
38
|
-
@param data_bounds: bounds around the data.
|
39
|
-
@param dpi: dots per inch for the resulting image
|
40
|
-
@param keep_ratio: should this create command be forced to keep the ratio.
|
41
|
-
@return:
|
42
|
-
"""
|
43
|
-
if not make_raster:
|
44
|
-
return None, None
|
45
|
-
|
46
|
-
if data_bounds is None:
|
47
|
-
return None, None
|
48
|
-
xmin, ymin, xmax, ymax = data_bounds
|
49
|
-
if isinf(xmin):
|
50
|
-
# No bounds for selected elements.
|
51
|
-
return None
|
52
|
-
width = xmax - xmin
|
53
|
-
height = ymax - ymin
|
54
|
-
|
55
|
-
dots_per_units = dpi / UNITS_PER_INCH
|
56
|
-
new_width = width * dots_per_units
|
57
|
-
new_height = height * dots_per_units
|
58
|
-
new_height = max(new_height, 1)
|
59
|
-
new_width = max(new_width, 1)
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
@param
|
79
|
-
@param
|
80
|
-
@param
|
81
|
-
@param
|
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
|
-
@param
|
108
|
-
@param
|
109
|
-
@param
|
110
|
-
@param
|
111
|
-
@param
|
112
|
-
@
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
@kernel.console_argument("
|
166
|
-
@kernel.
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
if
|
195
|
-
|
196
|
-
if
|
197
|
-
|
198
|
-
if
|
199
|
-
|
200
|
-
if
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
if
|
255
|
-
|
256
|
-
if
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
outlinenode
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
if hasattr(masknode, "
|
289
|
-
masknode.
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
elements
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
1
|
+
from copy import copy
|
2
|
+
from math import isinf
|
3
|
+
|
4
|
+
from meerk40t.core.node.elem_image import ImageNode
|
5
|
+
from meerk40t.core.node.elem_rect import RectNode
|
6
|
+
from meerk40t.core.node.node import Node
|
7
|
+
from meerk40t.core.units import UNITS_PER_INCH
|
8
|
+
from meerk40t.svgelements import Color, Matrix
|
9
|
+
|
10
|
+
|
11
|
+
def prepare_data(data, dsort, pop):
|
12
|
+
"""
|
13
|
+
Prepares the elements data.
|
14
|
+
|
15
|
+
Sorts by the emphasized time, and optionally pops the first element from the remaining elements.
|
16
|
+
|
17
|
+
@param data:
|
18
|
+
@param dsort:
|
19
|
+
@param pop:
|
20
|
+
@return:
|
21
|
+
"""
|
22
|
+
if dsort == "first":
|
23
|
+
data.sort(key=lambda n: n.emphasized_time)
|
24
|
+
elif dsort == "last":
|
25
|
+
data.sort(reverse=True, key=lambda n: n.emphasized_time)
|
26
|
+
if pop:
|
27
|
+
mnode = data.pop(0)
|
28
|
+
return Node.union_bounds(data, attr="paint_bounds"), mnode
|
29
|
+
return Node.union_bounds(data, attr="paint_bounds")
|
30
|
+
|
31
|
+
|
32
|
+
def create_image(make_raster, data, data_bounds, dpi, keep_ratio=True):
|
33
|
+
"""
|
34
|
+
Creates the image with the make_raster command.
|
35
|
+
|
36
|
+
@param make_raster: function to perform raster operation
|
37
|
+
@param data: elements to render
|
38
|
+
@param data_bounds: bounds around the data.
|
39
|
+
@param dpi: dots per inch for the resulting image
|
40
|
+
@param keep_ratio: should this create command be forced to keep the ratio.
|
41
|
+
@return:
|
42
|
+
"""
|
43
|
+
if not make_raster:
|
44
|
+
return None, None
|
45
|
+
|
46
|
+
if data_bounds is None:
|
47
|
+
return None, None
|
48
|
+
xmin, ymin, xmax, ymax = data_bounds
|
49
|
+
if isinf(xmin):
|
50
|
+
# No bounds for selected elements.
|
51
|
+
return None
|
52
|
+
width = xmax - xmin
|
53
|
+
height = ymax - ymin
|
54
|
+
|
55
|
+
dots_per_units = dpi / UNITS_PER_INCH
|
56
|
+
new_width = width * dots_per_units
|
57
|
+
new_height = height * dots_per_units
|
58
|
+
new_height = max(new_height, 1)
|
59
|
+
new_width = max(new_width, 1)
|
60
|
+
try:
|
61
|
+
image = make_raster(
|
62
|
+
data,
|
63
|
+
bounds=data_bounds,
|
64
|
+
width=new_width,
|
65
|
+
height=new_height,
|
66
|
+
keep_ratio=keep_ratio,
|
67
|
+
)
|
68
|
+
except Exception:
|
69
|
+
return None, None
|
70
|
+
matrix = Matrix.scale(width / new_width, height / new_height)
|
71
|
+
return image, matrix
|
72
|
+
|
73
|
+
|
74
|
+
def mask_image(elem_image, mask, matrix, dpi, dx=0, dy=0):
|
75
|
+
"""
|
76
|
+
Masks the elem_image with the mask_image.
|
77
|
+
|
78
|
+
@param elem_image: image to be masked
|
79
|
+
@param mask: mask to use
|
80
|
+
@param matrix: Matrix of the current image
|
81
|
+
@param dpi: Requested dots per inch.
|
82
|
+
@param dx: adjustment to position
|
83
|
+
@param dy: adjustment to position
|
84
|
+
@return: Created ImageNode
|
85
|
+
"""
|
86
|
+
imagematrix = copy(matrix)
|
87
|
+
imagematrix.post_translate(dx, dy)
|
88
|
+
|
89
|
+
mask_pattern = mask.convert("1")
|
90
|
+
elem_image.putalpha(mask_pattern)
|
91
|
+
|
92
|
+
image_node1 = ImageNode(
|
93
|
+
image=elem_image,
|
94
|
+
matrix=imagematrix,
|
95
|
+
dpi=dpi,
|
96
|
+
label="Keyholed Elements",
|
97
|
+
)
|
98
|
+
image_node1.set_dirty_bounds()
|
99
|
+
return [image_node1]
|
100
|
+
|
101
|
+
|
102
|
+
def split_image(elements, image, matrix, bounds, dpi, cols, rows):
|
103
|
+
"""
|
104
|
+
Performs the split operation of render+split. Divides those elements into even sized chunks. These chunks are
|
105
|
+
positioned where the previous rendered elements were located.
|
106
|
+
|
107
|
+
@param elements: elements service
|
108
|
+
@param image: image to be split
|
109
|
+
@param matrix: matrix of the image being split
|
110
|
+
@param bounds: bounds of the image being split
|
111
|
+
@param dpi: dpi of the resulting images.
|
112
|
+
@param cols:
|
113
|
+
@param rows:
|
114
|
+
@return:
|
115
|
+
"""
|
116
|
+
data_out = []
|
117
|
+
context = elements.elem_branch
|
118
|
+
if cols != 1 or rows != 1:
|
119
|
+
context = elements.elem_branch.add(type="group", label="Splitted Images")
|
120
|
+
data_out.append(context)
|
121
|
+
|
122
|
+
imgwidth, imgheight = image.size
|
123
|
+
deltax_image = imgwidth // cols
|
124
|
+
deltay_image = imgheight // rows
|
125
|
+
|
126
|
+
starty = 0
|
127
|
+
offset_y = bounds[1]
|
128
|
+
deltax_bound = (bounds[2] - bounds[0]) / cols
|
129
|
+
deltay_bound = (bounds[3] - bounds[1]) / rows
|
130
|
+
for yidx in range(rows):
|
131
|
+
startx = 0
|
132
|
+
offset_x = bounds[0]
|
133
|
+
endy = starty + deltay_image - 1
|
134
|
+
if yidx == rows - 1:
|
135
|
+
# Just to make sure we get the residual pixels
|
136
|
+
endy = imgheight - 1
|
137
|
+
for xidx in range(cols):
|
138
|
+
endx = startx + deltax_image - 1
|
139
|
+
if xidx == cols - 1:
|
140
|
+
# Just to make sure we get the residual pixels
|
141
|
+
endx = imgwidth - 1
|
142
|
+
tile = image.crop((startx, starty, endx, endy))
|
143
|
+
tilematrix = copy(matrix)
|
144
|
+
tilematrix.post_translate(offset_x, offset_y)
|
145
|
+
|
146
|
+
image_node = context.add(
|
147
|
+
type="elem image", image=tile, matrix=tilematrix, dpi=dpi
|
148
|
+
)
|
149
|
+
data_out.append(image_node)
|
150
|
+
|
151
|
+
startx = endx + 1
|
152
|
+
offset_x += deltax_bound
|
153
|
+
starty = endy + 1
|
154
|
+
offset_y += deltay_bound
|
155
|
+
return data_out
|
156
|
+
|
157
|
+
|
158
|
+
def plugin(kernel, lifecycle):
|
159
|
+
if lifecycle != "register":
|
160
|
+
return
|
161
|
+
|
162
|
+
_ = kernel.translation
|
163
|
+
context = kernel.root
|
164
|
+
|
165
|
+
@kernel.console_argument("cols", type=int, help=_("Number of columns"))
|
166
|
+
@kernel.console_argument("rows", type=int, help=_("Number of rows"))
|
167
|
+
@kernel.console_argument("dpi", type=int, help=_("Resolution of created image"))
|
168
|
+
@kernel.console_option(
|
169
|
+
"order", "o", help=_("ordering selection: none, first, last"), type=str
|
170
|
+
)
|
171
|
+
@kernel.console_command(
|
172
|
+
"render_split",
|
173
|
+
help=_("render_split <columns> <rows> <dpi>")
|
174
|
+
+ "\n"
|
175
|
+
+ _("Render selected elements and split the image into multiple parts"),
|
176
|
+
input_type=(None, "elements"),
|
177
|
+
output_type="elements",
|
178
|
+
)
|
179
|
+
def render_split(
|
180
|
+
command,
|
181
|
+
channel,
|
182
|
+
_,
|
183
|
+
cols=None,
|
184
|
+
rows=None,
|
185
|
+
dpi=None,
|
186
|
+
order=None,
|
187
|
+
origin=None,
|
188
|
+
data=None,
|
189
|
+
post=None,
|
190
|
+
**kwargs,
|
191
|
+
):
|
192
|
+
elements = context.elements
|
193
|
+
classify_new = elements.post_classify
|
194
|
+
if data is None:
|
195
|
+
data = list(elements.elems(emphasized=True))
|
196
|
+
if cols is None:
|
197
|
+
cols = 1
|
198
|
+
if rows is None:
|
199
|
+
rows = cols
|
200
|
+
if order is None:
|
201
|
+
order = ""
|
202
|
+
if dpi is None or dpi <= 0:
|
203
|
+
dpi = 500
|
204
|
+
bb = prepare_data(data, order, pop=False)
|
205
|
+
make_raster = elements.lookup("render-op/make_raster")
|
206
|
+
image, matrix = create_image(make_raster, data, bb, dpi, keep_ratio=False)
|
207
|
+
if image is None:
|
208
|
+
return "elements", None
|
209
|
+
|
210
|
+
data_out = split_image(elements, image, matrix, bb, dpi, cols, rows)
|
211
|
+
# Newly created! Classification needed?
|
212
|
+
post.append(classify_new(data_out))
|
213
|
+
elements.signal("element_added", data_out)
|
214
|
+
elements.signal("refresh_scene", "Scene")
|
215
|
+
return "elements", data_out
|
216
|
+
|
217
|
+
@kernel.console_argument("dpi", type=int, help=_("Resolution of created image"))
|
218
|
+
@kernel.console_option(
|
219
|
+
"order", "o", help=_("ordering selection: none, first, last"), type=str
|
220
|
+
)
|
221
|
+
@kernel.console_option(
|
222
|
+
"invert", "i", help=_("invert masking of image"), type=bool, action="store_true"
|
223
|
+
)
|
224
|
+
@kernel.console_option(
|
225
|
+
"outline",
|
226
|
+
"b",
|
227
|
+
help=_("add outline of keyhole shape"),
|
228
|
+
type=bool,
|
229
|
+
action="store_true",
|
230
|
+
)
|
231
|
+
@kernel.console_command(
|
232
|
+
"render_keyhole",
|
233
|
+
help=_("render_keyhole <columns> <rows> <dpi>")
|
234
|
+
+ "\n"
|
235
|
+
+ _("Render selected elements and split the image into multiple parts"),
|
236
|
+
input_type=(None, "elements"),
|
237
|
+
output_type="elements",
|
238
|
+
)
|
239
|
+
def render_keyhole(
|
240
|
+
command,
|
241
|
+
channel,
|
242
|
+
_,
|
243
|
+
dpi=None,
|
244
|
+
order=None,
|
245
|
+
invert=False,
|
246
|
+
outline=False,
|
247
|
+
origin=None,
|
248
|
+
data=None,
|
249
|
+
post=None,
|
250
|
+
**kwargs,
|
251
|
+
):
|
252
|
+
elements = context.elements
|
253
|
+
classify_new = elements.post_classify
|
254
|
+
if data is None:
|
255
|
+
data = list(elements.elems(emphasized=True))
|
256
|
+
if order is None:
|
257
|
+
order = ""
|
258
|
+
if dpi is None or dpi <= 0:
|
259
|
+
dpi = 500
|
260
|
+
# channel(f"will sort by {order}")
|
261
|
+
total_bounds = Node.union_bounds(data, attr="paint_bounds")
|
262
|
+
rectnode = RectNode(
|
263
|
+
x=total_bounds[0],
|
264
|
+
y=total_bounds[1],
|
265
|
+
width=total_bounds[2] - total_bounds[0],
|
266
|
+
height=total_bounds[3] - total_bounds[1],
|
267
|
+
stroke=None,
|
268
|
+
fill=None,
|
269
|
+
)
|
270
|
+
bb, tempnode = prepare_data(data, order, pop=True)
|
271
|
+
masknode = copy(tempnode)
|
272
|
+
if (
|
273
|
+
outline
|
274
|
+
and tempnode.type not in ("elem text", "elem image")
|
275
|
+
and hasattr(tempnode, "stroke")
|
276
|
+
):
|
277
|
+
outlinenode = copy(tempnode)
|
278
|
+
if hasattr(outlinenode, "fill"):
|
279
|
+
outlinenode.fill = None
|
280
|
+
outlinenode.stroke = Color("black")
|
281
|
+
outlinenode.altered()
|
282
|
+
data.append(outlinenode)
|
283
|
+
|
284
|
+
# Make sure they have the right size by adding a dummy node to it...
|
285
|
+
maskdata = (masknode, rectnode)
|
286
|
+
data.append(rectnode)
|
287
|
+
|
288
|
+
if hasattr(masknode, "fill"):
|
289
|
+
masknode.fill = Color("black")
|
290
|
+
if hasattr(masknode, "stroke"):
|
291
|
+
masknode.stroke = Color("black")
|
292
|
+
masknode.altered()
|
293
|
+
make_raster = elements.lookup("render-op/make_raster")
|
294
|
+
elemimage, elemmatrix = create_image(
|
295
|
+
make_raster, data, total_bounds, dpi, keep_ratio=True
|
296
|
+
)
|
297
|
+
if elemimage is None:
|
298
|
+
return "elements", data
|
299
|
+
maskimage, maskmatrix = create_image(
|
300
|
+
make_raster, maskdata, total_bounds, dpi, keep_ratio=True
|
301
|
+
)
|
302
|
+
if maskimage is None:
|
303
|
+
return "elements", data
|
304
|
+
if not invert:
|
305
|
+
from PIL import ImageOps
|
306
|
+
|
307
|
+
maskimage = ImageOps.invert(maskimage)
|
308
|
+
|
309
|
+
if maskimage is None or elemimage is None:
|
310
|
+
channel(_("Intermediary images were none"))
|
311
|
+
return "elements", None
|
312
|
+
|
313
|
+
data_out = mask_image(
|
314
|
+
elemimage, maskimage, elemmatrix, dpi, total_bounds[0], total_bounds[1]
|
315
|
+
)
|
316
|
+
for imnode in data_out:
|
317
|
+
elements.elem_branch.add_node(imnode)
|
318
|
+
# Newly created! Classification needed?
|
319
|
+
post.append(classify_new(data_out))
|
320
|
+
elements.signal("element_added", data_out)
|
321
|
+
elements.signal("refresh_scene", "Scene")
|
322
|
+
return "elements", data_out
|