meerk40t 0.9.3001__py2.py3-none-any.whl → 0.9.7010__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- meerk40t/__init__.py +1 -1
- meerk40t/balormk/balor_params.py +167 -167
- meerk40t/balormk/clone_loader.py +457 -457
- meerk40t/balormk/controller.py +1566 -1512
- meerk40t/balormk/cylindermod.py +64 -0
- meerk40t/balormk/device.py +966 -1959
- meerk40t/balormk/driver.py +778 -591
- meerk40t/balormk/galvo_commands.py +1195 -0
- meerk40t/balormk/gui/balorconfig.py +237 -111
- meerk40t/balormk/gui/balorcontroller.py +191 -184
- meerk40t/balormk/gui/baloroperationproperties.py +116 -115
- meerk40t/balormk/gui/corscene.py +845 -0
- meerk40t/balormk/gui/gui.py +179 -147
- meerk40t/balormk/livelightjob.py +466 -382
- meerk40t/balormk/mock_connection.py +131 -109
- meerk40t/balormk/plugin.py +133 -135
- meerk40t/balormk/usb_connection.py +306 -301
- meerk40t/camera/__init__.py +1 -1
- meerk40t/camera/camera.py +514 -397
- meerk40t/camera/gui/camerapanel.py +1241 -1095
- meerk40t/camera/gui/gui.py +58 -58
- meerk40t/camera/plugin.py +441 -399
- meerk40t/ch341/__init__.py +27 -27
- meerk40t/ch341/ch341device.py +628 -628
- meerk40t/ch341/libusb.py +595 -589
- meerk40t/ch341/mock.py +171 -171
- meerk40t/ch341/windriver.py +157 -157
- meerk40t/constants.py +13 -0
- meerk40t/core/__init__.py +1 -1
- meerk40t/core/bindalias.py +550 -539
- meerk40t/core/core.py +47 -47
- meerk40t/core/cutcode/cubiccut.py +73 -73
- meerk40t/core/cutcode/cutcode.py +315 -312
- meerk40t/core/cutcode/cutgroup.py +141 -137
- meerk40t/core/cutcode/cutobject.py +192 -185
- meerk40t/core/cutcode/dwellcut.py +37 -37
- meerk40t/core/cutcode/gotocut.py +29 -29
- meerk40t/core/cutcode/homecut.py +29 -29
- meerk40t/core/cutcode/inputcut.py +34 -34
- meerk40t/core/cutcode/linecut.py +33 -33
- meerk40t/core/cutcode/outputcut.py +34 -34
- meerk40t/core/cutcode/plotcut.py +335 -335
- meerk40t/core/cutcode/quadcut.py +61 -61
- meerk40t/core/cutcode/rastercut.py +168 -148
- meerk40t/core/cutcode/waitcut.py +34 -34
- meerk40t/core/cutplan.py +1843 -1316
- meerk40t/core/drivers.py +330 -329
- meerk40t/core/elements/align.py +801 -669
- meerk40t/core/elements/branches.py +1844 -1507
- meerk40t/core/elements/clipboard.py +229 -219
- meerk40t/core/elements/element_treeops.py +4561 -2837
- meerk40t/core/elements/element_types.py +125 -105
- meerk40t/core/elements/elements.py +4329 -3617
- meerk40t/core/elements/files.py +117 -64
- meerk40t/core/elements/geometry.py +473 -224
- meerk40t/core/elements/grid.py +467 -316
- meerk40t/core/elements/materials.py +158 -94
- meerk40t/core/elements/notes.py +50 -38
- meerk40t/core/elements/offset_clpr.py +933 -912
- meerk40t/core/elements/offset_mk.py +963 -955
- meerk40t/core/elements/penbox.py +339 -267
- meerk40t/core/elements/placements.py +300 -83
- meerk40t/core/elements/render.py +785 -687
- meerk40t/core/elements/shapes.py +2618 -2092
- meerk40t/core/elements/trace.py +651 -563
- meerk40t/core/elements/tree_commands.py +415 -409
- meerk40t/core/elements/undo_redo.py +116 -58
- meerk40t/core/elements/wordlist.py +319 -200
- meerk40t/core/exceptions.py +9 -9
- meerk40t/core/laserjob.py +220 -220
- meerk40t/core/logging.py +63 -63
- meerk40t/core/node/blobnode.py +83 -86
- meerk40t/core/node/bootstrap.py +105 -103
- meerk40t/core/node/branch_elems.py +40 -31
- meerk40t/core/node/branch_ops.py +45 -38
- meerk40t/core/node/branch_regmark.py +48 -41
- meerk40t/core/node/cutnode.py +29 -32
- meerk40t/core/node/effect_hatch.py +375 -257
- meerk40t/core/node/effect_warp.py +398 -0
- meerk40t/core/node/effect_wobble.py +441 -309
- meerk40t/core/node/elem_ellipse.py +404 -309
- meerk40t/core/node/elem_image.py +1082 -801
- meerk40t/core/node/elem_line.py +358 -292
- meerk40t/core/node/elem_path.py +259 -201
- meerk40t/core/node/elem_point.py +129 -102
- meerk40t/core/node/elem_polyline.py +310 -246
- meerk40t/core/node/elem_rect.py +376 -286
- meerk40t/core/node/elem_text.py +445 -418
- meerk40t/core/node/filenode.py +59 -40
- meerk40t/core/node/groupnode.py +138 -74
- meerk40t/core/node/image_processed.py +777 -766
- meerk40t/core/node/image_raster.py +156 -113
- meerk40t/core/node/layernode.py +31 -31
- meerk40t/core/node/mixins.py +135 -107
- meerk40t/core/node/node.py +1427 -1304
- meerk40t/core/node/nutils.py +117 -114
- meerk40t/core/node/op_cut.py +462 -335
- meerk40t/core/node/op_dots.py +296 -251
- meerk40t/core/node/op_engrave.py +414 -311
- meerk40t/core/node/op_image.py +755 -369
- meerk40t/core/node/op_raster.py +787 -522
- meerk40t/core/node/place_current.py +37 -40
- meerk40t/core/node/place_point.py +329 -126
- meerk40t/core/node/refnode.py +58 -47
- meerk40t/core/node/rootnode.py +225 -219
- meerk40t/core/node/util_console.py +48 -48
- meerk40t/core/node/util_goto.py +84 -65
- meerk40t/core/node/util_home.py +61 -61
- meerk40t/core/node/util_input.py +102 -102
- meerk40t/core/node/util_output.py +102 -102
- meerk40t/core/node/util_wait.py +65 -65
- meerk40t/core/parameters.py +709 -707
- meerk40t/core/planner.py +875 -785
- meerk40t/core/plotplanner.py +656 -652
- meerk40t/core/space.py +120 -113
- meerk40t/core/spoolers.py +706 -705
- meerk40t/core/svg_io.py +1836 -1549
- meerk40t/core/treeop.py +534 -445
- meerk40t/core/undos.py +278 -124
- meerk40t/core/units.py +784 -680
- meerk40t/core/view.py +393 -322
- meerk40t/core/webhelp.py +62 -62
- meerk40t/core/wordlist.py +513 -504
- meerk40t/cylinder/cylinder.py +247 -0
- meerk40t/cylinder/gui/cylindersettings.py +41 -0
- meerk40t/cylinder/gui/gui.py +24 -0
- meerk40t/device/__init__.py +1 -1
- meerk40t/device/basedevice.py +322 -123
- meerk40t/device/devicechoices.py +50 -0
- meerk40t/device/dummydevice.py +163 -128
- meerk40t/device/gui/defaultactions.py +618 -602
- meerk40t/device/gui/effectspanel.py +114 -0
- meerk40t/device/gui/formatterpanel.py +253 -290
- meerk40t/device/gui/warningpanel.py +337 -260
- meerk40t/device/mixins.py +13 -13
- meerk40t/dxf/__init__.py +1 -1
- meerk40t/dxf/dxf_io.py +766 -554
- meerk40t/dxf/plugin.py +47 -35
- meerk40t/external_plugins.py +79 -79
- meerk40t/external_plugins_build.py +28 -28
- meerk40t/extra/cag.py +112 -116
- meerk40t/extra/coolant.py +403 -0
- meerk40t/extra/encode_detect.py +198 -0
- meerk40t/extra/ezd.py +1165 -1165
- meerk40t/extra/hershey.py +835 -340
- meerk40t/extra/imageactions.py +322 -316
- meerk40t/extra/inkscape.py +630 -622
- meerk40t/extra/lbrn.py +424 -424
- meerk40t/extra/outerworld.py +284 -0
- meerk40t/extra/param_functions.py +1542 -1556
- meerk40t/extra/potrace.py +257 -253
- meerk40t/extra/serial_exchange.py +118 -0
- meerk40t/extra/updater.py +602 -453
- meerk40t/extra/vectrace.py +147 -146
- meerk40t/extra/winsleep.py +83 -83
- meerk40t/extra/xcs_reader.py +597 -0
- meerk40t/fill/fills.py +781 -335
- meerk40t/fill/patternfill.py +1061 -1061
- meerk40t/fill/patterns.py +614 -567
- meerk40t/grbl/control.py +87 -87
- meerk40t/grbl/controller.py +990 -903
- meerk40t/grbl/device.py +1081 -768
- meerk40t/grbl/driver.py +989 -771
- meerk40t/grbl/emulator.py +532 -497
- meerk40t/grbl/gcodejob.py +783 -767
- meerk40t/grbl/gui/grblconfiguration.py +373 -298
- meerk40t/grbl/gui/grblcontroller.py +485 -271
- meerk40t/grbl/gui/grblhardwareconfig.py +269 -153
- meerk40t/grbl/gui/grbloperationconfig.py +105 -0
- meerk40t/grbl/gui/gui.py +147 -116
- meerk40t/grbl/interpreter.py +44 -44
- meerk40t/grbl/loader.py +22 -22
- meerk40t/grbl/mock_connection.py +56 -56
- meerk40t/grbl/plugin.py +294 -264
- meerk40t/grbl/serial_connection.py +93 -88
- meerk40t/grbl/tcp_connection.py +81 -79
- meerk40t/grbl/ws_connection.py +112 -0
- meerk40t/gui/__init__.py +1 -1
- meerk40t/gui/about.py +2042 -296
- meerk40t/gui/alignment.py +1644 -1608
- meerk40t/gui/autoexec.py +199 -0
- meerk40t/gui/basicops.py +791 -670
- meerk40t/gui/bufferview.py +77 -71
- meerk40t/gui/busy.py +170 -133
- meerk40t/gui/choicepropertypanel.py +1673 -1469
- meerk40t/gui/consolepanel.py +706 -542
- meerk40t/gui/devicepanel.py +687 -581
- meerk40t/gui/dialogoptions.py +110 -107
- meerk40t/gui/executejob.py +316 -306
- meerk40t/gui/fonts.py +90 -90
- meerk40t/gui/functionwrapper.py +252 -0
- meerk40t/gui/gui_mixins.py +729 -0
- meerk40t/gui/guicolors.py +205 -182
- meerk40t/gui/help_assets/help_assets.py +218 -201
- meerk40t/gui/helper.py +154 -0
- meerk40t/gui/hersheymanager.py +1430 -846
- meerk40t/gui/icons.py +3422 -2747
- meerk40t/gui/imagesplitter.py +555 -508
- meerk40t/gui/keymap.py +354 -344
- meerk40t/gui/laserpanel.py +892 -806
- meerk40t/gui/laserrender.py +1470 -1232
- meerk40t/gui/lasertoolpanel.py +805 -793
- meerk40t/gui/magnetoptions.py +436 -0
- meerk40t/gui/materialmanager.py +2917 -0
- meerk40t/gui/materialtest.py +1722 -1694
- meerk40t/gui/mkdebug.py +646 -359
- meerk40t/gui/mwindow.py +163 -140
- meerk40t/gui/navigationpanels.py +2605 -2467
- meerk40t/gui/notes.py +143 -142
- meerk40t/gui/opassignment.py +414 -410
- meerk40t/gui/operation_info.py +310 -299
- meerk40t/gui/plugin.py +494 -328
- meerk40t/gui/position.py +714 -669
- meerk40t/gui/preferences.py +901 -650
- meerk40t/gui/propertypanels/attributes.py +1461 -1131
- meerk40t/gui/propertypanels/blobproperty.py +117 -114
- meerk40t/gui/propertypanels/consoleproperty.py +83 -80
- meerk40t/gui/propertypanels/gotoproperty.py +77 -0
- meerk40t/gui/propertypanels/groupproperties.py +223 -217
- meerk40t/gui/propertypanels/hatchproperty.py +489 -469
- meerk40t/gui/propertypanels/imageproperty.py +2244 -1384
- meerk40t/gui/propertypanels/inputproperty.py +59 -58
- meerk40t/gui/propertypanels/opbranchproperties.py +82 -80
- meerk40t/gui/propertypanels/operationpropertymain.py +1890 -1638
- meerk40t/gui/propertypanels/outputproperty.py +59 -58
- meerk40t/gui/propertypanels/pathproperty.py +389 -380
- meerk40t/gui/propertypanels/placementproperty.py +1214 -383
- meerk40t/gui/propertypanels/pointproperty.py +140 -136
- meerk40t/gui/propertypanels/propertywindow.py +313 -181
- meerk40t/gui/propertypanels/rasterwizardpanels.py +996 -912
- meerk40t/gui/propertypanels/regbranchproperties.py +76 -0
- meerk40t/gui/propertypanels/textproperty.py +770 -755
- meerk40t/gui/propertypanels/waitproperty.py +56 -55
- meerk40t/gui/propertypanels/warpproperty.py +121 -0
- meerk40t/gui/propertypanels/wobbleproperty.py +255 -204
- meerk40t/gui/ribbon.py +2468 -2210
- meerk40t/gui/scene/scene.py +1100 -1051
- meerk40t/gui/scene/sceneconst.py +22 -22
- meerk40t/gui/scene/scenepanel.py +439 -349
- meerk40t/gui/scene/scenespacewidget.py +365 -365
- meerk40t/gui/scene/widget.py +518 -505
- meerk40t/gui/scenewidgets/affinemover.py +215 -215
- meerk40t/gui/scenewidgets/attractionwidget.py +315 -309
- meerk40t/gui/scenewidgets/bedwidget.py +120 -97
- meerk40t/gui/scenewidgets/elementswidget.py +137 -107
- meerk40t/gui/scenewidgets/gridwidget.py +785 -745
- meerk40t/gui/scenewidgets/guidewidget.py +765 -765
- meerk40t/gui/scenewidgets/laserpathwidget.py +66 -66
- meerk40t/gui/scenewidgets/machineoriginwidget.py +86 -86
- meerk40t/gui/scenewidgets/nodeselector.py +28 -28
- meerk40t/gui/scenewidgets/rectselectwidget.py +589 -346
- meerk40t/gui/scenewidgets/relocatewidget.py +33 -33
- meerk40t/gui/scenewidgets/reticlewidget.py +83 -83
- meerk40t/gui/scenewidgets/selectionwidget.py +2952 -2756
- meerk40t/gui/simpleui.py +357 -333
- meerk40t/gui/simulation.py +2431 -2094
- meerk40t/gui/snapoptions.py +208 -203
- meerk40t/gui/spoolerpanel.py +1227 -1180
- meerk40t/gui/statusbarwidgets/defaultoperations.py +480 -353
- meerk40t/gui/statusbarwidgets/infowidget.py +520 -483
- meerk40t/gui/statusbarwidgets/opassignwidget.py +356 -355
- meerk40t/gui/statusbarwidgets/selectionwidget.py +172 -171
- meerk40t/gui/statusbarwidgets/shapepropwidget.py +754 -236
- meerk40t/gui/statusbarwidgets/statusbar.py +272 -260
- meerk40t/gui/statusbarwidgets/statusbarwidget.py +268 -270
- meerk40t/gui/statusbarwidgets/strokewidget.py +267 -251
- meerk40t/gui/themes.py +200 -78
- meerk40t/gui/tips.py +591 -0
- meerk40t/gui/toolwidgets/circlebrush.py +35 -35
- meerk40t/gui/toolwidgets/toolcircle.py +248 -242
- meerk40t/gui/toolwidgets/toolcontainer.py +82 -77
- meerk40t/gui/toolwidgets/tooldraw.py +97 -90
- meerk40t/gui/toolwidgets/toolellipse.py +219 -212
- meerk40t/gui/toolwidgets/toolimagecut.py +25 -132
- meerk40t/gui/toolwidgets/toolline.py +39 -144
- meerk40t/gui/toolwidgets/toollinetext.py +79 -236
- meerk40t/gui/toolwidgets/toollinetext_inline.py +296 -0
- meerk40t/gui/toolwidgets/toolmeasure.py +160 -216
- meerk40t/gui/toolwidgets/toolnodeedit.py +2088 -2074
- meerk40t/gui/toolwidgets/toolnodemove.py +92 -94
- meerk40t/gui/toolwidgets/toolparameter.py +754 -668
- meerk40t/gui/toolwidgets/toolplacement.py +108 -108
- meerk40t/gui/toolwidgets/toolpoint.py +68 -59
- meerk40t/gui/toolwidgets/toolpointlistbuilder.py +294 -0
- meerk40t/gui/toolwidgets/toolpointmove.py +183 -0
- meerk40t/gui/toolwidgets/toolpolygon.py +288 -403
- meerk40t/gui/toolwidgets/toolpolyline.py +38 -196
- meerk40t/gui/toolwidgets/toolrect.py +211 -207
- meerk40t/gui/toolwidgets/toolrelocate.py +72 -72
- meerk40t/gui/toolwidgets/toolribbon.py +598 -113
- meerk40t/gui/toolwidgets/tooltabedit.py +546 -0
- meerk40t/gui/toolwidgets/tooltext.py +98 -89
- meerk40t/gui/toolwidgets/toolvector.py +213 -204
- meerk40t/gui/toolwidgets/toolwidget.py +39 -39
- meerk40t/gui/usbconnect.py +98 -91
- meerk40t/gui/utilitywidgets/buttonwidget.py +18 -18
- meerk40t/gui/utilitywidgets/checkboxwidget.py +90 -90
- meerk40t/gui/utilitywidgets/controlwidget.py +14 -14
- meerk40t/gui/utilitywidgets/cyclocycloidwidget.py +343 -340
- meerk40t/gui/utilitywidgets/debugwidgets.py +148 -0
- meerk40t/gui/utilitywidgets/handlewidget.py +27 -27
- meerk40t/gui/utilitywidgets/harmonograph.py +450 -447
- meerk40t/gui/utilitywidgets/openclosewidget.py +40 -40
- meerk40t/gui/utilitywidgets/rotationwidget.py +54 -54
- meerk40t/gui/utilitywidgets/scalewidget.py +75 -75
- meerk40t/gui/utilitywidgets/seekbarwidget.py +183 -183
- meerk40t/gui/utilitywidgets/togglewidget.py +142 -142
- meerk40t/gui/utilitywidgets/toolbarwidget.py +8 -8
- meerk40t/gui/wordlisteditor.py +985 -931
- meerk40t/gui/wxmeerk40t.py +1444 -1169
- meerk40t/gui/wxmmain.py +5578 -4112
- meerk40t/gui/wxmribbon.py +1591 -1076
- meerk40t/gui/wxmscene.py +1635 -1453
- meerk40t/gui/wxmtree.py +2410 -2089
- meerk40t/gui/wxutils.py +1769 -1099
- meerk40t/gui/zmatrix.py +102 -102
- meerk40t/image/__init__.py +1 -1
- meerk40t/image/dither.py +429 -0
- meerk40t/image/imagetools.py +2778 -2269
- meerk40t/internal_plugins.py +150 -130
- meerk40t/kernel/__init__.py +63 -12
- meerk40t/kernel/channel.py +259 -212
- meerk40t/kernel/context.py +538 -538
- meerk40t/kernel/exceptions.py +41 -41
- meerk40t/kernel/functions.py +463 -414
- meerk40t/kernel/jobs.py +100 -100
- meerk40t/kernel/kernel.py +3809 -3571
- meerk40t/kernel/lifecycles.py +71 -71
- meerk40t/kernel/module.py +49 -49
- meerk40t/kernel/service.py +147 -147
- meerk40t/kernel/settings.py +383 -343
- meerk40t/lihuiyu/controller.py +883 -876
- meerk40t/lihuiyu/device.py +1181 -1069
- meerk40t/lihuiyu/driver.py +1466 -1372
- meerk40t/lihuiyu/gui/gui.py +127 -106
- meerk40t/lihuiyu/gui/lhyaccelgui.py +377 -363
- meerk40t/lihuiyu/gui/lhycontrollergui.py +741 -651
- meerk40t/lihuiyu/gui/lhydrivergui.py +470 -446
- meerk40t/lihuiyu/gui/lhyoperationproperties.py +238 -237
- meerk40t/lihuiyu/gui/tcpcontroller.py +226 -190
- meerk40t/lihuiyu/interpreter.py +53 -53
- meerk40t/lihuiyu/laserspeed.py +450 -450
- meerk40t/lihuiyu/loader.py +90 -90
- meerk40t/lihuiyu/parser.py +404 -404
- meerk40t/lihuiyu/plugin.py +101 -102
- meerk40t/lihuiyu/tcp_connection.py +111 -109
- meerk40t/main.py +231 -165
- meerk40t/moshi/builder.py +788 -781
- meerk40t/moshi/controller.py +505 -499
- meerk40t/moshi/device.py +495 -442
- meerk40t/moshi/driver.py +862 -696
- meerk40t/moshi/gui/gui.py +78 -76
- meerk40t/moshi/gui/moshicontrollergui.py +538 -522
- meerk40t/moshi/gui/moshidrivergui.py +87 -75
- meerk40t/moshi/plugin.py +43 -43
- meerk40t/network/console_server.py +102 -57
- meerk40t/network/kernelserver.py +10 -9
- meerk40t/network/tcp_server.py +142 -140
- meerk40t/network/udp_server.py +103 -77
- meerk40t/network/web_server.py +390 -0
- meerk40t/newly/controller.py +1158 -1144
- meerk40t/newly/device.py +874 -732
- meerk40t/newly/driver.py +540 -412
- meerk40t/newly/gui/gui.py +219 -188
- meerk40t/newly/gui/newlyconfig.py +116 -101
- meerk40t/newly/gui/newlycontroller.py +193 -186
- meerk40t/newly/gui/operationproperties.py +51 -51
- meerk40t/newly/mock_connection.py +82 -82
- meerk40t/newly/newly_params.py +56 -56
- meerk40t/newly/plugin.py +1214 -1246
- meerk40t/newly/usb_connection.py +322 -322
- meerk40t/rotary/gui/gui.py +52 -46
- meerk40t/rotary/gui/rotarysettings.py +240 -232
- meerk40t/rotary/rotary.py +202 -98
- meerk40t/ruida/control.py +291 -91
- meerk40t/ruida/controller.py +138 -1088
- meerk40t/ruida/device.py +672 -231
- meerk40t/ruida/driver.py +534 -472
- meerk40t/ruida/emulator.py +1494 -1491
- meerk40t/ruida/exceptions.py +4 -4
- meerk40t/ruida/gui/gui.py +71 -76
- meerk40t/ruida/gui/ruidaconfig.py +239 -72
- meerk40t/ruida/gui/ruidacontroller.py +187 -184
- meerk40t/ruida/gui/ruidaoperationproperties.py +48 -47
- meerk40t/ruida/loader.py +54 -52
- meerk40t/ruida/mock_connection.py +57 -109
- meerk40t/ruida/plugin.py +124 -87
- meerk40t/ruida/rdjob.py +2084 -945
- meerk40t/ruida/serial_connection.py +116 -0
- meerk40t/ruida/tcp_connection.py +146 -0
- meerk40t/ruida/udp_connection.py +73 -0
- meerk40t/svgelements.py +9671 -9669
- meerk40t/tools/driver_to_path.py +584 -579
- meerk40t/tools/geomstr.py +5583 -4680
- meerk40t/tools/jhfparser.py +357 -292
- meerk40t/tools/kerftest.py +904 -890
- meerk40t/tools/livinghinges.py +1168 -1033
- meerk40t/tools/pathtools.py +987 -949
- meerk40t/tools/pmatrix.py +234 -0
- meerk40t/tools/pointfinder.py +942 -942
- meerk40t/tools/polybool.py +940 -940
- meerk40t/tools/rasterplotter.py +1660 -547
- meerk40t/tools/shxparser.py +989 -901
- meerk40t/tools/ttfparser.py +726 -446
- meerk40t/tools/zinglplotter.py +595 -593
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/LICENSE +21 -21
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/METADATA +150 -139
- meerk40t-0.9.7010.dist-info/RECORD +445 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/WHEEL +1 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/top_level.txt +0 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/zip-safe +1 -1
- meerk40t/balormk/elementlightjob.py +0 -159
- meerk40t-0.9.3001.dist-info/RECORD +0 -437
- test/bootstrap.py +0 -63
- test/test_cli.py +0 -12
- test/test_core_cutcode.py +0 -418
- test/test_core_elements.py +0 -144
- test/test_core_plotplanner.py +0 -397
- test/test_core_viewports.py +0 -312
- test/test_drivers_grbl.py +0 -108
- test/test_drivers_lihuiyu.py +0 -443
- test/test_drivers_newly.py +0 -113
- test/test_element_degenerate_points.py +0 -43
- test/test_elements_classify.py +0 -97
- test/test_elements_penbox.py +0 -22
- test/test_file_svg.py +0 -176
- test/test_fill.py +0 -155
- test/test_geomstr.py +0 -1523
- test/test_geomstr_nodes.py +0 -18
- test/test_imagetools_actualize.py +0 -306
- test/test_imagetools_wizard.py +0 -258
- test/test_kernel.py +0 -200
- test/test_laser_speeds.py +0 -3303
- test/test_length.py +0 -57
- test/test_lifecycle.py +0 -66
- test/test_operations.py +0 -251
- test/test_operations_hatch.py +0 -57
- test/test_ruida.py +0 -19
- test/test_spooler.py +0 -22
- test/test_tools_rasterplotter.py +0 -29
- test/test_wobble.py +0 -133
- test/test_zingl.py +0 -124
- {test → meerk40t/cylinder}/__init__.py +0 -0
- /meerk40t/{core/element_commands.py → cylinder/gui/__init__.py} +0 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/entry_points.txt +0 -0
meerk40t/balormk/livelightjob.py
CHANGED
@@ -1,382 +1,466 @@
|
|
1
|
-
"""
|
2
|
-
Live Full Light Job
|
3
|
-
|
4
|
-
This light job is full live because it syncs with the elements to run the current elements. The lighting can change
|
5
|
-
when the elements change. It will show the updated job.
|
6
|
-
|
7
|
-
This job works as a spoolerjob. Implementing all the regular calls for being a spooled job.
|
8
|
-
"""
|
9
|
-
|
10
|
-
import
|
11
|
-
|
12
|
-
import numpy as np
|
13
|
-
|
14
|
-
from meerk40t.core.
|
15
|
-
from meerk40t.
|
16
|
-
from meerk40t.
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
self.
|
33
|
-
self.
|
34
|
-
self.
|
35
|
-
self.
|
36
|
-
self.
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
self.label = "Live
|
48
|
-
self._mode_light = self.
|
49
|
-
elif self.mode == "
|
50
|
-
self.label = "Live
|
51
|
-
self._mode_light = self.
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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
|
-
self.
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
if self.
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
return
|
124
|
-
|
125
|
-
def
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
self.
|
134
|
-
|
135
|
-
def
|
136
|
-
"""
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
if
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
)
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
)
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
1
|
+
"""
|
2
|
+
Live Full Light Job
|
3
|
+
|
4
|
+
This light job is full live because it syncs with the elements to run the current elements. The lighting can change
|
5
|
+
when the elements change. It will show the updated job.
|
6
|
+
|
7
|
+
This job works as a spoolerjob. Implementing all the regular calls for being a spooled job.
|
8
|
+
"""
|
9
|
+
import time
|
10
|
+
from math import isinf
|
11
|
+
|
12
|
+
import numpy as np
|
13
|
+
|
14
|
+
from meerk40t.core.node.node import Node
|
15
|
+
from meerk40t.core.units import UNITS_PER_PIXEL, Length
|
16
|
+
from meerk40t.svgelements import Matrix
|
17
|
+
from meerk40t.tools.geomstr import Geomstr
|
18
|
+
|
19
|
+
|
20
|
+
class LiveLightJob:
|
21
|
+
def __init__(
|
22
|
+
self,
|
23
|
+
service,
|
24
|
+
mode="full",
|
25
|
+
geometry=None,
|
26
|
+
travel_speed=None,
|
27
|
+
jump_delay=None,
|
28
|
+
quantization=50,
|
29
|
+
listen=True,
|
30
|
+
raw=False,
|
31
|
+
):
|
32
|
+
self.service = service
|
33
|
+
self.stopped = False
|
34
|
+
self.started = False
|
35
|
+
self.changed = False
|
36
|
+
self._last_bounds = None
|
37
|
+
self.priority = -1
|
38
|
+
self.time_submitted = time.time()
|
39
|
+
self.time_started = time.time()
|
40
|
+
self.runtime = 0
|
41
|
+
|
42
|
+
self.quantization = quantization
|
43
|
+
self.mode = mode
|
44
|
+
self.points = None
|
45
|
+
self.source = "elements"
|
46
|
+
if self.mode == "full":
|
47
|
+
self.label = "Live Full Light Job"
|
48
|
+
self._mode_light = self._full
|
49
|
+
elif self.mode == "bounds":
|
50
|
+
self.label = "Live Selection Light Job"
|
51
|
+
self._mode_light = self._bounds
|
52
|
+
elif self.mode == "crosshair":
|
53
|
+
self.label = "Simple Crosshairs"
|
54
|
+
self._mode_light = self._crosshairs
|
55
|
+
# elif self.mode == "regmarks":
|
56
|
+
# self.label = "Live Regmark Light Job"
|
57
|
+
# self._mode_light = self._regmarks
|
58
|
+
elif self.mode == "hull":
|
59
|
+
self.label = "Live Hull Light Job"
|
60
|
+
self._mode_light = self._hull
|
61
|
+
elif self.mode == "geometry":
|
62
|
+
self.label = "Element Light Job"
|
63
|
+
self._mode_light = self._static
|
64
|
+
else:
|
65
|
+
raise ValueError("Invalid mode.")
|
66
|
+
|
67
|
+
self.listen = listen
|
68
|
+
self.raw = raw
|
69
|
+
self._geometry = geometry
|
70
|
+
self._travel_speed = travel_speed
|
71
|
+
self._jump_delay = jump_delay
|
72
|
+
|
73
|
+
@property
|
74
|
+
def status(self):
|
75
|
+
if self.is_running and self.time_started is not None:
|
76
|
+
return "Running"
|
77
|
+
elif not self.is_running:
|
78
|
+
return "Disabled"
|
79
|
+
else:
|
80
|
+
return "Queued"
|
81
|
+
|
82
|
+
def is_running(self):
|
83
|
+
return not self.stopped
|
84
|
+
|
85
|
+
def execute(self, driver):
|
86
|
+
"""
|
87
|
+
Spooler job execute.
|
88
|
+
|
89
|
+
@param driver: driver-like object
|
90
|
+
@return:
|
91
|
+
"""
|
92
|
+
if self.stopped:
|
93
|
+
return True
|
94
|
+
if self.listen:
|
95
|
+
self.service.listen("emphasized", self.on_emphasis_changed)
|
96
|
+
self.service.listen("modified_by_tool", self.on_emphasis_changed)
|
97
|
+
self.service.listen("updating", self.on_emphasis_changed)
|
98
|
+
self.service.listen("view;realized", self.on_emphasis_changed)
|
99
|
+
self.time_started = time.time()
|
100
|
+
self.started = True
|
101
|
+
connection = driver.connection
|
102
|
+
connection.rapid_mode()
|
103
|
+
connection.light_mode()
|
104
|
+
while self.process(connection):
|
105
|
+
# Calls process while execute() is running.
|
106
|
+
if self.stopped:
|
107
|
+
break
|
108
|
+
connection.abort()
|
109
|
+
self.stopped = True
|
110
|
+
self.runtime += time.time() - self.time_started
|
111
|
+
if self.listen:
|
112
|
+
self.service.unlisten("emphasized", self.on_emphasis_changed)
|
113
|
+
self.service.unlisten("modified_by_tool", self.on_emphasis_changed)
|
114
|
+
self.service.unlisten("updating", self.on_emphasis_changed)
|
115
|
+
self.service.unlisten("view;realized", self.on_emphasis_changed)
|
116
|
+
self.service.signal("light_simulate", False)
|
117
|
+
if self.service.redlight_preferred:
|
118
|
+
connection.light_on()
|
119
|
+
connection.write_port()
|
120
|
+
else:
|
121
|
+
connection.light_off()
|
122
|
+
connection.write_port()
|
123
|
+
return True
|
124
|
+
|
125
|
+
def set_travel_speed(self, update_speed):
|
126
|
+
self._travel_speed = update_speed
|
127
|
+
|
128
|
+
def stop(self):
|
129
|
+
"""
|
130
|
+
Called in order to kill the spooler-job.
|
131
|
+
@return:
|
132
|
+
"""
|
133
|
+
self.stopped = True
|
134
|
+
|
135
|
+
def elapsed_time(self):
|
136
|
+
"""
|
137
|
+
How long is this job already running...
|
138
|
+
"""
|
139
|
+
result = 0
|
140
|
+
if self.runtime != 0:
|
141
|
+
result = self.runtime
|
142
|
+
else:
|
143
|
+
if self.is_running():
|
144
|
+
result = time.time() - self.time_started
|
145
|
+
return result
|
146
|
+
|
147
|
+
def estimate_time(self):
|
148
|
+
"""
|
149
|
+
Estimate how long this spooler job will require to complete.
|
150
|
+
@return:
|
151
|
+
"""
|
152
|
+
return 0
|
153
|
+
|
154
|
+
def update(self):
|
155
|
+
self.changed = True
|
156
|
+
self.points = None
|
157
|
+
|
158
|
+
def on_emphasis_changed(self, *args):
|
159
|
+
"""
|
160
|
+
During execute the emphasis signal will call this function.
|
161
|
+
|
162
|
+
@param args:
|
163
|
+
@return:
|
164
|
+
"""
|
165
|
+
self.update()
|
166
|
+
|
167
|
+
def process(self, con):
|
168
|
+
"""
|
169
|
+
Called repeatedly by `execute()`
|
170
|
+
@param con:
|
171
|
+
@return:
|
172
|
+
"""
|
173
|
+
if self.stopped:
|
174
|
+
return False
|
175
|
+
if self.listen:
|
176
|
+
# Watch for changes.
|
177
|
+
bounds = self.service.elements.selected_area()
|
178
|
+
if bounds is None or isinf(bounds[0]):
|
179
|
+
bounds = Node.union_bounds(
|
180
|
+
list(self.service.elements.regmarks(emphasized=True))
|
181
|
+
)
|
182
|
+
if bounds is None or isinf(bounds[0]):
|
183
|
+
bounds = Node.union_bounds(list(self.service.elements.elems()))
|
184
|
+
if self._last_bounds is not None and bounds != self._last_bounds:
|
185
|
+
# Emphasis did not change but the bounds did. We dragged something.
|
186
|
+
self.changed = True
|
187
|
+
self.points = None
|
188
|
+
self._last_bounds = bounds
|
189
|
+
|
190
|
+
if self.changed:
|
191
|
+
# The emphasis selection has changed.
|
192
|
+
self.changed = False
|
193
|
+
con.abort()
|
194
|
+
first_x, first_y = con.get_last_xy()
|
195
|
+
con.light_off()
|
196
|
+
con.write_port()
|
197
|
+
con.goto_xy(first_x, first_y, distance=0xFFFF)
|
198
|
+
con.light_mode()
|
199
|
+
|
200
|
+
if self._travel_speed is not None:
|
201
|
+
con._light_speed = self._travel_speed
|
202
|
+
con._dark_speed = self._travel_speed
|
203
|
+
con._goto_speed = self._travel_speed
|
204
|
+
else:
|
205
|
+
con._light_speed = self.service.redlight_speed
|
206
|
+
con._dark_speed = self.service.redlight_speed
|
207
|
+
con._goto_speed = self.service.redlight_speed
|
208
|
+
con.light_mode()
|
209
|
+
# Calls light based on the set mode.
|
210
|
+
return self._mode_light(con)
|
211
|
+
|
212
|
+
# def _regmarks(self, con):
|
213
|
+
# """
|
214
|
+
# Mode light regmarks gets the elements for regmarks. Sends to light elements.
|
215
|
+
|
216
|
+
# @param con: connection
|
217
|
+
# @return:
|
218
|
+
# """
|
219
|
+
# elements = list(self.service.elements.regmarks(emphasized=True))
|
220
|
+
# if len(elements) == 0:
|
221
|
+
# elements = list(self.service.elements.regmarks())
|
222
|
+
# return self._light_elements(con, elements)
|
223
|
+
|
224
|
+
def _gather_source(self):
|
225
|
+
self.source = "elements"
|
226
|
+
elements = list(self.service.elements.elems(emphasized=True))
|
227
|
+
if len(elements) == 0:
|
228
|
+
elements = list(self.service.elements.regmarks(emphasized=True))
|
229
|
+
self.source = "regmarks"
|
230
|
+
if len(elements) == 0:
|
231
|
+
elements = list(self.service.elements.elems())
|
232
|
+
return elements
|
233
|
+
|
234
|
+
def _full(self, con):
|
235
|
+
"""
|
236
|
+
Mode light full gets the elements from the emphasized primary elements. Sends to light elements.
|
237
|
+
@param con: connection
|
238
|
+
@return:
|
239
|
+
"""
|
240
|
+
# Full was requested.
|
241
|
+
elements = self._gather_source()
|
242
|
+
return self._light_elements(con, elements)
|
243
|
+
|
244
|
+
def _hull(self, con):
|
245
|
+
"""
|
246
|
+
Mode light hull gets the convex hull. Sends to light hull.
|
247
|
+
|
248
|
+
@param con: connection
|
249
|
+
@return:
|
250
|
+
"""
|
251
|
+
elements = self._gather_source()
|
252
|
+
return self._light_hull(con, elements)
|
253
|
+
|
254
|
+
def _crosshairs(self, con, margin=5000):
|
255
|
+
"""
|
256
|
+
Mode light crosshairs draws crosshairs. Sends to light geometry.
|
257
|
+
|
258
|
+
@param con: connection
|
259
|
+
@return:
|
260
|
+
"""
|
261
|
+
geometry = Geomstr.lines(
|
262
|
+
(0x8000, 0x8000),
|
263
|
+
(0x8000 - margin, 0x8000),
|
264
|
+
(0x8000, 0x8000),
|
265
|
+
(0x8000, 0x8000 - margin),
|
266
|
+
(0x8000, 0x8000),
|
267
|
+
(0x8000 + margin, 0x8000),
|
268
|
+
(0x8000, 0x8000),
|
269
|
+
(0x8000, 0x8000 + margin),
|
270
|
+
(0x8000, 0x8000),
|
271
|
+
)
|
272
|
+
rotate = self._redlight_adjust_matrix()
|
273
|
+
geometry.transform(rotate)
|
274
|
+
|
275
|
+
return self._light_geometry(con, geometry)
|
276
|
+
|
277
|
+
def _static(self, con):
|
278
|
+
geometry = Geomstr(self._geometry)
|
279
|
+
rotate = self._redlight_adjust_matrix()
|
280
|
+
if not self.raw:
|
281
|
+
geometry.transform(self.service.view.matrix)
|
282
|
+
geometry.transform(rotate)
|
283
|
+
return self._light_geometry(con, geometry)
|
284
|
+
|
285
|
+
def _bounds(self, con):
|
286
|
+
"""
|
287
|
+
Light the bound's geometry. Sends to light geometry.
|
288
|
+
|
289
|
+
@param con:
|
290
|
+
@return:
|
291
|
+
"""
|
292
|
+
bounds = self._last_bounds
|
293
|
+
if not bounds:
|
294
|
+
# If no bounds give crosshairs.
|
295
|
+
return self._crosshairs(con)
|
296
|
+
xmin, ymin, xmax, ymax = bounds
|
297
|
+
geometry = Geomstr.lines(
|
298
|
+
(xmin, ymin),
|
299
|
+
(xmax, ymin),
|
300
|
+
(xmax, ymax),
|
301
|
+
(xmin, ymax),
|
302
|
+
(xmin, ymin),
|
303
|
+
)
|
304
|
+
rotate = self._redlight_adjust_matrix()
|
305
|
+
if not self.raw:
|
306
|
+
geometry.transform(self.service.view.matrix)
|
307
|
+
geometry.transform(rotate)
|
308
|
+
return self._light_geometry(con, geometry, bounded=True)
|
309
|
+
|
310
|
+
def _redlight_adjust_matrix(self):
|
311
|
+
"""
|
312
|
+
Calculate the redlight adjustment matrix which is the product of the redlight offset values and the
|
313
|
+
redlight rotation value.
|
314
|
+
|
315
|
+
@return:
|
316
|
+
"""
|
317
|
+
|
318
|
+
x_offset = float(
|
319
|
+
Length(
|
320
|
+
self.service.redlight_offset_x,
|
321
|
+
relative_length=self.service.view.width,
|
322
|
+
unitless=UNITS_PER_PIXEL,
|
323
|
+
)
|
324
|
+
)
|
325
|
+
y_offset = float(
|
326
|
+
Length(
|
327
|
+
self.service.redlight_offset_y,
|
328
|
+
relative_length=self.service.view.height,
|
329
|
+
unitless=UNITS_PER_PIXEL,
|
330
|
+
)
|
331
|
+
)
|
332
|
+
redlight_adjust_matrix = Matrix()
|
333
|
+
redlight_adjust_matrix.post_rotate(
|
334
|
+
self.service.redlight_angle.radians, 0x8000, 0x8000
|
335
|
+
)
|
336
|
+
redlight_adjust_matrix.post_translate(x_offset, y_offset)
|
337
|
+
return redlight_adjust_matrix
|
338
|
+
|
339
|
+
def _light_geometry(self, con, geometry, bounded=False):
|
340
|
+
"""
|
341
|
+
Light the current geometry.
|
342
|
+
|
343
|
+
We abort quickly if self.stopped or self.changed is set.
|
344
|
+
|
345
|
+
@param con: connection
|
346
|
+
@param geometry: geometry to light
|
347
|
+
@param bounded: Require the geometry to be properly bounded.
|
348
|
+
@return: True if we should continue, False if we should not.
|
349
|
+
"""
|
350
|
+
delay_dark = self.service.delay_jump_long
|
351
|
+
delay_between = self.service.delay_jump_short
|
352
|
+
|
353
|
+
points = list(geometry.as_equal_interpolated_points(distance=self.quantization))
|
354
|
+
move = True
|
355
|
+
for i, e in enumerate(points):
|
356
|
+
if self.stopped:
|
357
|
+
# Abort due to stoppage.
|
358
|
+
return False
|
359
|
+
if self.changed:
|
360
|
+
# Abort due to change.
|
361
|
+
return True
|
362
|
+
if e is None:
|
363
|
+
move = True
|
364
|
+
continue
|
365
|
+
x, y = e.real, e.imag
|
366
|
+
if np.isnan(x) or np.isnan(y):
|
367
|
+
move = True
|
368
|
+
continue
|
369
|
+
x = int(x)
|
370
|
+
y = int(y)
|
371
|
+
if (0 > x or x > 0xFFFF) or (0 > y or y > 0xFFFF):
|
372
|
+
# Our bounds are not in frame.
|
373
|
+
if bounded:
|
374
|
+
# We required them in frame.
|
375
|
+
return self._crosshairs(con)
|
376
|
+
else:
|
377
|
+
# Fix them.
|
378
|
+
x = x & 0xFFFF
|
379
|
+
y = y & 0xFFFF
|
380
|
+
if move:
|
381
|
+
con.dark(x, y, long=delay_dark, short=delay_dark)
|
382
|
+
move = False
|
383
|
+
continue
|
384
|
+
con.light(x, y, long=delay_between, short=delay_between)
|
385
|
+
if con.light_off():
|
386
|
+
con.list_write_port()
|
387
|
+
return True
|
388
|
+
|
389
|
+
def _light_elements(self, con, elements):
|
390
|
+
"""
|
391
|
+
Light the given elements. The elements should be a node list with `as_geometry()` objects
|
392
|
+
@param con:
|
393
|
+
@param elements:
|
394
|
+
@return:
|
395
|
+
"""
|
396
|
+
geometry = Geomstr()
|
397
|
+
for n in elements:
|
398
|
+
e = None
|
399
|
+
if hasattr(n, "convex_hull"):
|
400
|
+
e = n.convex_hull()
|
401
|
+
if e is None and hasattr(n, "as_geometry"):
|
402
|
+
e = n.as_geometry()
|
403
|
+
|
404
|
+
if e is not None:
|
405
|
+
geometry.append(e)
|
406
|
+
else:
|
407
|
+
if hasattr(n, "as_image"):
|
408
|
+
nx, ny, mx, my = n.bounds
|
409
|
+
geometry.append(Geomstr.rect(nx, ny, mx - nx, my - ny))
|
410
|
+
if not geometry:
|
411
|
+
# There are no elements, return a default crosshair.
|
412
|
+
return self._crosshairs(con)
|
413
|
+
|
414
|
+
redlight_matrix = self._redlight_adjust_matrix()
|
415
|
+
if self.stopped:
|
416
|
+
return False
|
417
|
+
|
418
|
+
if self.changed:
|
419
|
+
return True
|
420
|
+
|
421
|
+
# Move to device space.
|
422
|
+
if not self.raw:
|
423
|
+
geometry.transform(self.service.view.matrix)
|
424
|
+
|
425
|
+
# Add redlight adjustments within device space.
|
426
|
+
geometry.transform(redlight_matrix)
|
427
|
+
|
428
|
+
self._light_geometry(con, geometry)
|
429
|
+
if con.light_off():
|
430
|
+
con.list_write_port()
|
431
|
+
return True
|
432
|
+
|
433
|
+
def _light_hull(self, con, elements):
|
434
|
+
"""
|
435
|
+
Light the given elements convex hull.
|
436
|
+
|
437
|
+
@param con:
|
438
|
+
@param elements:
|
439
|
+
@return:
|
440
|
+
"""
|
441
|
+
if not elements:
|
442
|
+
# There are no elements, return a default crosshair.
|
443
|
+
return self._crosshairs(con)
|
444
|
+
if self.points is None:
|
445
|
+
# Convert elements to geomstr
|
446
|
+
geometry = Geomstr()
|
447
|
+
for node in elements:
|
448
|
+
try:
|
449
|
+
e = None
|
450
|
+
if hasattr(node, "convex_hull"):
|
451
|
+
e = node.convex_hull()
|
452
|
+
if e is None:
|
453
|
+
e = node.as_geometry()
|
454
|
+
except AttributeError:
|
455
|
+
continue
|
456
|
+
geometry.append(e)
|
457
|
+
|
458
|
+
# Convert to hull.
|
459
|
+
hull = Geomstr.hull(geometry, distance=500)
|
460
|
+
if not self.raw:
|
461
|
+
hull.transform(self.service.view.matrix)
|
462
|
+
hull.transform(self._redlight_adjust_matrix())
|
463
|
+
self.points = hull
|
464
|
+
|
465
|
+
# Light geometry.
|
466
|
+
return self._light_geometry(con, self.points)
|