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/core/cutcode/plotcut.py
CHANGED
@@ -1,335 +1,335 @@
|
|
1
|
-
from ...svgelements import Point
|
2
|
-
from ...tools.zinglplotter import ZinglPlotter
|
3
|
-
from .cutobject import CutObject
|
4
|
-
|
5
|
-
|
6
|
-
class PlotCut(CutObject):
|
7
|
-
"""
|
8
|
-
Plot cuts are a series of lineto values with laser on and off info. These positions are not necessarily next
|
9
|
-
to each other and can be any distance apart. This is a compact way of writing a large series of line positions.
|
10
|
-
|
11
|
-
There is a raster-create value.
|
12
|
-
"""
|
13
|
-
|
14
|
-
def __init__(self, settings=None, passes=1, color=None):
|
15
|
-
CutObject.__init__(self, settings=settings, passes=passes, color=color)
|
16
|
-
self._points = []
|
17
|
-
self._powers = []
|
18
|
-
self.max_dx = None
|
19
|
-
self.max_dy = None
|
20
|
-
self.minmax_dx = None
|
21
|
-
self.minmax_dy = None
|
22
|
-
self.min_x = None
|
23
|
-
self.min_y = None
|
24
|
-
self.max_x = None
|
25
|
-
self.max_y = None
|
26
|
-
self.v_raster = False
|
27
|
-
self.h_raster = False
|
28
|
-
self.travels_top = False
|
29
|
-
self.travels_bottom = False
|
30
|
-
self.travels_right = False
|
31
|
-
self.travels_left = False
|
32
|
-
self._calc_lengths = None
|
33
|
-
self._length = None
|
34
|
-
self.first = True # Plot cuts are standalone
|
35
|
-
self.last = True
|
36
|
-
|
37
|
-
def __len__(self):
|
38
|
-
return len(self._points)
|
39
|
-
|
40
|
-
def __str__(self):
|
41
|
-
parts = list()
|
42
|
-
parts.append(f"{len(self._points)} points")
|
43
|
-
parts.append(f"xmin: {self.min_x}")
|
44
|
-
parts.append(f"ymin: {self.min_y}")
|
45
|
-
parts.append(f"xmax: {self.max_x}")
|
46
|
-
parts.append(f"ymax: {self.max_y}")
|
47
|
-
return f"PlotCut({', '.join(parts)})"
|
48
|
-
|
49
|
-
def __bool__(self):
|
50
|
-
return bool(self._points)
|
51
|
-
|
52
|
-
def check_if_rasterable(self):
|
53
|
-
"""
|
54
|
-
Rasterable plotcuts are heuristically defined as having a max step of less than 15 and
|
55
|
-
must have an unused travel direction.
|
56
|
-
|
57
|
-
@return: whether the plot can travel
|
58
|
-
"""
|
59
|
-
# Default to vector settings.
|
60
|
-
self.settings["raster_step_x"] = 0
|
61
|
-
self.settings["raster_step_y"] = 0
|
62
|
-
self.settings["power"] = 1000.0
|
63
|
-
speed = self.settings.get("speed", 0)
|
64
|
-
if speed is None:
|
65
|
-
return False
|
66
|
-
if speed < 80:
|
67
|
-
# Twitchless gets sketchy at 80.
|
68
|
-
self.settings["_force_twitchless"] = True
|
69
|
-
return False
|
70
|
-
|
71
|
-
self.v_raster = False
|
72
|
-
self.h_raster = True
|
73
|
-
self.settings["raster_step_y"] = self.minmax_dy
|
74
|
-
return True
|
75
|
-
|
76
|
-
# if self.max_dx is None:
|
77
|
-
# return False
|
78
|
-
# if self.max_dy is None:
|
79
|
-
# return False
|
80
|
-
# # Above 80 we're likely dealing with a raster.
|
81
|
-
# if -15 < self.max_dx <= 15:
|
82
|
-
# self.v_raster = True
|
83
|
-
# self.settings["raster_step_x"] = self.minmax_dx
|
84
|
-
# if -15 < self.max_dy <= 15:
|
85
|
-
# self.h_raster = True
|
86
|
-
# self.settings["raster_step_y"] = self.minmax_dy
|
87
|
-
# return True
|
88
|
-
|
89
|
-
def transform(self, matrix):
|
90
|
-
for i in range(len(self._points)):
|
91
|
-
x, y = self._points[i]
|
92
|
-
x, y = matrix.transform_point([x, y])
|
93
|
-
self._points[i] = int(x), int(y)
|
94
|
-
|
95
|
-
def plot_init(self, x, y):
|
96
|
-
assert not self._points
|
97
|
-
self._points.append((x, y))
|
98
|
-
|
99
|
-
def plot_extend(self, plot):
|
100
|
-
for x, y, laser in plot:
|
101
|
-
self.plot_append(x, y, laser)
|
102
|
-
|
103
|
-
def plot_append(self, x, y, laser):
|
104
|
-
"""
|
105
|
-
Append plot values.
|
106
|
-
@param x: x value to append
|
107
|
-
@param y: y value to append
|
108
|
-
@param laser: laser value must be between 0 and 1.
|
109
|
-
@return:
|
110
|
-
"""
|
111
|
-
assert 0 <= laser <= 1
|
112
|
-
self._length = None
|
113
|
-
self._calc_lengths = None
|
114
|
-
if self._points:
|
115
|
-
last_x, last_y = self._points[-1]
|
116
|
-
dx = x - last_x
|
117
|
-
dy = y - last_y
|
118
|
-
if self.max_dx is None or abs(dx) > abs(self.max_dx):
|
119
|
-
self.max_dx = dx
|
120
|
-
if self.max_dy is None or abs(dy) > abs(self.max_dy):
|
121
|
-
self.max_dy = dy
|
122
|
-
if abs(dx) > 0 and (
|
123
|
-
self.minmax_dx is None or abs(dx) < abs(self.minmax_dx)
|
124
|
-
):
|
125
|
-
self.minmax_dx = dx
|
126
|
-
if abs(dy) > 0 and (
|
127
|
-
self.minmax_dy is None or abs(dy) < abs(self.minmax_dy)
|
128
|
-
):
|
129
|
-
self.minmax_dy = dy
|
130
|
-
if dy > 0:
|
131
|
-
self.travels_bottom = True
|
132
|
-
if dy < 0:
|
133
|
-
self.travels_top = True
|
134
|
-
if dx > 0:
|
135
|
-
self.travels_right = True
|
136
|
-
if dx < 0:
|
137
|
-
self.travels_left = True
|
138
|
-
self._points.append((x, y))
|
139
|
-
self._powers.append(laser)
|
140
|
-
if self.min_x is None or x < self.min_x:
|
141
|
-
self.min_x = x
|
142
|
-
if self.min_y is None or y < self.min_y:
|
143
|
-
self.min_y = y
|
144
|
-
if self.max_x is None or x > self.max_x:
|
145
|
-
self.max_x = x
|
146
|
-
if self.max_y is None or y > self.max_y:
|
147
|
-
self.max_y = y
|
148
|
-
|
149
|
-
def major_axis(self):
|
150
|
-
"""
|
151
|
-
If both vertical and horizontal are set we prefer vertical as major axis because vertical rastering is heavier
|
152
|
-
with the movement of the gantry bar.
|
153
|
-
@return:
|
154
|
-
"""
|
155
|
-
if self.v_raster:
|
156
|
-
return 1
|
157
|
-
if self.h_raster:
|
158
|
-
return 0
|
159
|
-
|
160
|
-
if len(self._points) < 2:
|
161
|
-
return 0
|
162
|
-
start = Point(self._points[0])
|
163
|
-
end = Point(self._points[1])
|
164
|
-
if abs(start.x - end.x) > abs(start.y - end.y):
|
165
|
-
return 0 # X-Axis
|
166
|
-
else:
|
167
|
-
return 1 # Y-Axis
|
168
|
-
|
169
|
-
def x_dir(self):
|
170
|
-
if self.travels_left and not self.travels_right:
|
171
|
-
return -1 # right
|
172
|
-
if self.travels_right and not self.travels_left:
|
173
|
-
return 1 # left
|
174
|
-
|
175
|
-
if len(self._points) < 2:
|
176
|
-
return 0
|
177
|
-
start = Point(self._points[0])
|
178
|
-
for i in range(1, len(self._points)):
|
179
|
-
end = Point(self._points[i])
|
180
|
-
if start.x < end.x:
|
181
|
-
return 1
|
182
|
-
elif start.x > end.x:
|
183
|
-
return -1
|
184
|
-
return 0
|
185
|
-
|
186
|
-
def y_dir(self):
|
187
|
-
if self.travels_top and not self.travels_bottom:
|
188
|
-
return -1 # top
|
189
|
-
if self.travels_bottom and not self.travels_top:
|
190
|
-
return 1 # bottom
|
191
|
-
|
192
|
-
if len(self._points) < 2:
|
193
|
-
return 0
|
194
|
-
start = Point(self._points[0])
|
195
|
-
for i in range(1, len(self._points)):
|
196
|
-
end = Point(self._points[i])
|
197
|
-
if start.y < end.y:
|
198
|
-
return 1
|
199
|
-
elif start.y > end.y:
|
200
|
-
return -1
|
201
|
-
return 0
|
202
|
-
|
203
|
-
def upper(self):
|
204
|
-
return self.min_x
|
205
|
-
|
206
|
-
def lower(self):
|
207
|
-
return self.max_x
|
208
|
-
|
209
|
-
def left(self):
|
210
|
-
return self.min_y
|
211
|
-
|
212
|
-
def right(self):
|
213
|
-
return self.max_y
|
214
|
-
|
215
|
-
def length(self):
|
216
|
-
length = 0
|
217
|
-
last_x = None
|
218
|
-
last_y = None
|
219
|
-
for x, y in self._points:
|
220
|
-
if last_x is not None:
|
221
|
-
length += Point.distance((x, y), (last_x, last_y))
|
222
|
-
last_x = 0
|
223
|
-
last_y = 0
|
224
|
-
return length
|
225
|
-
|
226
|
-
def reverse(self):
|
227
|
-
self._points = list(reversed(self._points))
|
228
|
-
self._powers = list(reversed(self._powers))
|
229
|
-
|
230
|
-
@property
|
231
|
-
def start(self):
|
232
|
-
try:
|
233
|
-
return Point(self._points[0])
|
234
|
-
except IndexError:
|
235
|
-
return None
|
236
|
-
|
237
|
-
@property
|
238
|
-
def end(self):
|
239
|
-
try:
|
240
|
-
return Point(self._points[-1])
|
241
|
-
except IndexError:
|
242
|
-
return None
|
243
|
-
|
244
|
-
def normal_plot(self):
|
245
|
-
x0 = None
|
246
|
-
y0 = None
|
247
|
-
for i in range(0, len(self._points)):
|
248
|
-
x1, y1 = self._points[i]
|
249
|
-
if x0 is not None:
|
250
|
-
power = self._powers[i - 1]
|
251
|
-
yield x0, y0, power, x1, y1
|
252
|
-
x0 = x1
|
253
|
-
y0 = y1
|
254
|
-
|
255
|
-
@property
|
256
|
-
def plot(self):
|
257
|
-
if not self.h_raster and not self.v_raster:
|
258
|
-
yield from self.normal_plot()
|
259
|
-
return
|
260
|
-
x0 = None
|
261
|
-
y0 = None
|
262
|
-
last_dx = 0
|
263
|
-
last_dy = 0
|
264
|
-
for i in range(0, len(self._points)):
|
265
|
-
x1, y1 = self._points[i]
|
266
|
-
if x0 is not None:
|
267
|
-
current_dx = x1 - x0
|
268
|
-
current_dy = y1 - y0
|
269
|
-
power = self._powers[i - 1]
|
270
|
-
if x1 != x0 and y1 != y0:
|
271
|
-
# Raster directional step.
|
272
|
-
if (
|
273
|
-
(last_dx > 0) != (current_dx > 0) # dx same direction
|
274
|
-
and self.h_raster
|
275
|
-
or (last_dy > 0) == (current_dy > 0) # dy different directions
|
276
|
-
and self.v_raster
|
277
|
-
):
|
278
|
-
# Y-Step then X-Step.
|
279
|
-
yield x0, y0, power, x0, y1
|
280
|
-
yield x0, y1, power, x1, y1
|
281
|
-
else:
|
282
|
-
# X-Step then Y-Step
|
283
|
-
yield x0, y0, power, x1, y0
|
284
|
-
yield x1, y0, power, x1, y1
|
285
|
-
else:
|
286
|
-
# Single step.
|
287
|
-
yield x0, y0, power, x1, y1
|
288
|
-
last_dx = current_dx
|
289
|
-
last_dy = current_dy
|
290
|
-
x0 = x1
|
291
|
-
y0 = y1
|
292
|
-
|
293
|
-
def generator(self):
|
294
|
-
for x0, y0, power, x1, y1 in self.plot:
|
295
|
-
if x0 != x1 and y0 != y1: # Non-orthogonal
|
296
|
-
for zx, zy in ZinglPlotter.plot_line(
|
297
|
-
int(round(x0)), int(round(y0)), int(round(x1)), int(round(y1))
|
298
|
-
):
|
299
|
-
yield zx, zy, power
|
300
|
-
else:
|
301
|
-
yield x1, y1, power
|
302
|
-
|
303
|
-
def point(self, t):
|
304
|
-
if len(self._points) == 0:
|
305
|
-
raise ValueError
|
306
|
-
if t == 0:
|
307
|
-
return self._points[0]
|
308
|
-
if t == 1:
|
309
|
-
return self._points[-1]
|
310
|
-
if self._calc_lengths is None:
|
311
|
-
# Need to calculate lengths
|
312
|
-
lengths = list()
|
313
|
-
total_length = 0
|
314
|
-
for i in range(len(self._points) - 1):
|
315
|
-
x0, y0 = self._points[i]
|
316
|
-
x1, y1 = self._points[i + 1]
|
317
|
-
length = abs(complex(x0, y0) - complex(x1, y1))
|
318
|
-
lengths.append(length)
|
319
|
-
total_length += length
|
320
|
-
self._calc_lengths = lengths
|
321
|
-
self._length = total_length
|
322
|
-
if self._length == 0:
|
323
|
-
# Degenerate fallback. (All points are coincident)
|
324
|
-
v = int((len(self._points) - 1) * t)
|
325
|
-
return self._points[v]
|
326
|
-
v = t * self._length
|
327
|
-
for length in self._calc_lengths:
|
328
|
-
if v < length:
|
329
|
-
x0, y0 = self.start
|
330
|
-
x1, y1 = self.end
|
331
|
-
x = x1 * v + x0
|
332
|
-
y = y1 * v + y0
|
333
|
-
return x, y
|
334
|
-
v -= length
|
335
|
-
raise ValueError
|
1
|
+
from ...svgelements import Point
|
2
|
+
from ...tools.zinglplotter import ZinglPlotter
|
3
|
+
from .cutobject import CutObject
|
4
|
+
|
5
|
+
|
6
|
+
class PlotCut(CutObject):
|
7
|
+
"""
|
8
|
+
Plot cuts are a series of lineto values with laser on and off info. These positions are not necessarily next
|
9
|
+
to each other and can be any distance apart. This is a compact way of writing a large series of line positions.
|
10
|
+
|
11
|
+
There is a raster-create value.
|
12
|
+
"""
|
13
|
+
|
14
|
+
def __init__(self, settings=None, passes=1, color=None):
|
15
|
+
CutObject.__init__(self, settings=settings, passes=passes, color=color)
|
16
|
+
self._points = []
|
17
|
+
self._powers = []
|
18
|
+
self.max_dx = None
|
19
|
+
self.max_dy = None
|
20
|
+
self.minmax_dx = None
|
21
|
+
self.minmax_dy = None
|
22
|
+
self.min_x = None
|
23
|
+
self.min_y = None
|
24
|
+
self.max_x = None
|
25
|
+
self.max_y = None
|
26
|
+
self.v_raster = False
|
27
|
+
self.h_raster = False
|
28
|
+
self.travels_top = False
|
29
|
+
self.travels_bottom = False
|
30
|
+
self.travels_right = False
|
31
|
+
self.travels_left = False
|
32
|
+
self._calc_lengths = None
|
33
|
+
self._length = None
|
34
|
+
self.first = True # Plot cuts are standalone
|
35
|
+
self.last = True
|
36
|
+
|
37
|
+
def __len__(self):
|
38
|
+
return len(self._points)
|
39
|
+
|
40
|
+
def __str__(self):
|
41
|
+
parts = list()
|
42
|
+
parts.append(f"{len(self._points)} points")
|
43
|
+
parts.append(f"xmin: {self.min_x}")
|
44
|
+
parts.append(f"ymin: {self.min_y}")
|
45
|
+
parts.append(f"xmax: {self.max_x}")
|
46
|
+
parts.append(f"ymax: {self.max_y}")
|
47
|
+
return f"PlotCut({', '.join(parts)})"
|
48
|
+
|
49
|
+
def __bool__(self):
|
50
|
+
return bool(self._points)
|
51
|
+
|
52
|
+
def check_if_rasterable(self):
|
53
|
+
"""
|
54
|
+
Rasterable plotcuts are heuristically defined as having a max step of less than 15 and
|
55
|
+
must have an unused travel direction.
|
56
|
+
|
57
|
+
@return: whether the plot can travel
|
58
|
+
"""
|
59
|
+
# Default to vector settings.
|
60
|
+
self.settings["raster_step_x"] = 0
|
61
|
+
self.settings["raster_step_y"] = 0
|
62
|
+
self.settings["power"] = 1000.0
|
63
|
+
speed = self.settings.get("speed", 0)
|
64
|
+
if speed is None:
|
65
|
+
return False
|
66
|
+
if speed < 80:
|
67
|
+
# Twitchless gets sketchy at 80.
|
68
|
+
self.settings["_force_twitchless"] = True
|
69
|
+
return False
|
70
|
+
|
71
|
+
self.v_raster = False
|
72
|
+
self.h_raster = True
|
73
|
+
self.settings["raster_step_y"] = self.minmax_dy
|
74
|
+
return True
|
75
|
+
|
76
|
+
# if self.max_dx is None:
|
77
|
+
# return False
|
78
|
+
# if self.max_dy is None:
|
79
|
+
# return False
|
80
|
+
# # Above 80 we're likely dealing with a raster.
|
81
|
+
# if -15 < self.max_dx <= 15:
|
82
|
+
# self.v_raster = True
|
83
|
+
# self.settings["raster_step_x"] = self.minmax_dx
|
84
|
+
# if -15 < self.max_dy <= 15:
|
85
|
+
# self.h_raster = True
|
86
|
+
# self.settings["raster_step_y"] = self.minmax_dy
|
87
|
+
# return True
|
88
|
+
|
89
|
+
def transform(self, matrix):
|
90
|
+
for i in range(len(self._points)):
|
91
|
+
x, y = self._points[i]
|
92
|
+
x, y = matrix.transform_point([x, y])
|
93
|
+
self._points[i] = int(x), int(y)
|
94
|
+
|
95
|
+
def plot_init(self, x, y):
|
96
|
+
assert not self._points
|
97
|
+
self._points.append((x, y))
|
98
|
+
|
99
|
+
def plot_extend(self, plot):
|
100
|
+
for x, y, laser in plot:
|
101
|
+
self.plot_append(x, y, laser)
|
102
|
+
|
103
|
+
def plot_append(self, x, y, laser):
|
104
|
+
"""
|
105
|
+
Append plot values.
|
106
|
+
@param x: x value to append
|
107
|
+
@param y: y value to append
|
108
|
+
@param laser: laser value must be between 0 and 1.
|
109
|
+
@return:
|
110
|
+
"""
|
111
|
+
assert 0 <= laser <= 1
|
112
|
+
self._length = None
|
113
|
+
self._calc_lengths = None
|
114
|
+
if self._points:
|
115
|
+
last_x, last_y = self._points[-1]
|
116
|
+
dx = x - last_x
|
117
|
+
dy = y - last_y
|
118
|
+
if self.max_dx is None or abs(dx) > abs(self.max_dx):
|
119
|
+
self.max_dx = dx
|
120
|
+
if self.max_dy is None or abs(dy) > abs(self.max_dy):
|
121
|
+
self.max_dy = dy
|
122
|
+
if abs(dx) > 0 and (
|
123
|
+
self.minmax_dx is None or abs(dx) < abs(self.minmax_dx)
|
124
|
+
):
|
125
|
+
self.minmax_dx = dx
|
126
|
+
if abs(dy) > 0 and (
|
127
|
+
self.minmax_dy is None or abs(dy) < abs(self.minmax_dy)
|
128
|
+
):
|
129
|
+
self.minmax_dy = dy
|
130
|
+
if dy > 0:
|
131
|
+
self.travels_bottom = True
|
132
|
+
if dy < 0:
|
133
|
+
self.travels_top = True
|
134
|
+
if dx > 0:
|
135
|
+
self.travels_right = True
|
136
|
+
if dx < 0:
|
137
|
+
self.travels_left = True
|
138
|
+
self._points.append((x, y))
|
139
|
+
self._powers.append(laser)
|
140
|
+
if self.min_x is None or x < self.min_x:
|
141
|
+
self.min_x = x
|
142
|
+
if self.min_y is None or y < self.min_y:
|
143
|
+
self.min_y = y
|
144
|
+
if self.max_x is None or x > self.max_x:
|
145
|
+
self.max_x = x
|
146
|
+
if self.max_y is None or y > self.max_y:
|
147
|
+
self.max_y = y
|
148
|
+
|
149
|
+
def major_axis(self):
|
150
|
+
"""
|
151
|
+
If both vertical and horizontal are set we prefer vertical as major axis because vertical rastering is heavier
|
152
|
+
with the movement of the gantry bar.
|
153
|
+
@return:
|
154
|
+
"""
|
155
|
+
if self.v_raster:
|
156
|
+
return 1
|
157
|
+
if self.h_raster:
|
158
|
+
return 0
|
159
|
+
|
160
|
+
if len(self._points) < 2:
|
161
|
+
return 0
|
162
|
+
start = Point(self._points[0])
|
163
|
+
end = Point(self._points[1])
|
164
|
+
if abs(start.x - end.x) > abs(start.y - end.y):
|
165
|
+
return 0 # X-Axis
|
166
|
+
else:
|
167
|
+
return 1 # Y-Axis
|
168
|
+
|
169
|
+
def x_dir(self):
|
170
|
+
if self.travels_left and not self.travels_right:
|
171
|
+
return -1 # right
|
172
|
+
if self.travels_right and not self.travels_left:
|
173
|
+
return 1 # left
|
174
|
+
|
175
|
+
if len(self._points) < 2:
|
176
|
+
return 0
|
177
|
+
start = Point(self._points[0])
|
178
|
+
for i in range(1, len(self._points)):
|
179
|
+
end = Point(self._points[i])
|
180
|
+
if start.x < end.x:
|
181
|
+
return 1
|
182
|
+
elif start.x > end.x:
|
183
|
+
return -1
|
184
|
+
return 0
|
185
|
+
|
186
|
+
def y_dir(self):
|
187
|
+
if self.travels_top and not self.travels_bottom:
|
188
|
+
return -1 # top
|
189
|
+
if self.travels_bottom and not self.travels_top:
|
190
|
+
return 1 # bottom
|
191
|
+
|
192
|
+
if len(self._points) < 2:
|
193
|
+
return 0
|
194
|
+
start = Point(self._points[0])
|
195
|
+
for i in range(1, len(self._points)):
|
196
|
+
end = Point(self._points[i])
|
197
|
+
if start.y < end.y:
|
198
|
+
return 1
|
199
|
+
elif start.y > end.y:
|
200
|
+
return -1
|
201
|
+
return 0
|
202
|
+
|
203
|
+
def upper(self):
|
204
|
+
return self.min_x
|
205
|
+
|
206
|
+
def lower(self):
|
207
|
+
return self.max_x
|
208
|
+
|
209
|
+
def left(self):
|
210
|
+
return self.min_y
|
211
|
+
|
212
|
+
def right(self):
|
213
|
+
return self.max_y
|
214
|
+
|
215
|
+
def length(self):
|
216
|
+
length = 0
|
217
|
+
last_x = None
|
218
|
+
last_y = None
|
219
|
+
for x, y in self._points:
|
220
|
+
if last_x is not None:
|
221
|
+
length += Point.distance((x, y), (last_x, last_y))
|
222
|
+
last_x = 0
|
223
|
+
last_y = 0
|
224
|
+
return length
|
225
|
+
|
226
|
+
def reverse(self):
|
227
|
+
self._points = list(reversed(self._points))
|
228
|
+
self._powers = list(reversed(self._powers))
|
229
|
+
|
230
|
+
@property
|
231
|
+
def start(self):
|
232
|
+
try:
|
233
|
+
return Point(self._points[0])
|
234
|
+
except IndexError:
|
235
|
+
return None
|
236
|
+
|
237
|
+
@property
|
238
|
+
def end(self):
|
239
|
+
try:
|
240
|
+
return Point(self._points[-1])
|
241
|
+
except IndexError:
|
242
|
+
return None
|
243
|
+
|
244
|
+
def normal_plot(self):
|
245
|
+
x0 = None
|
246
|
+
y0 = None
|
247
|
+
for i in range(0, len(self._points)):
|
248
|
+
x1, y1 = self._points[i]
|
249
|
+
if x0 is not None:
|
250
|
+
power = self._powers[i - 1]
|
251
|
+
yield x0, y0, power, x1, y1
|
252
|
+
x0 = x1
|
253
|
+
y0 = y1
|
254
|
+
|
255
|
+
@property
|
256
|
+
def plot(self):
|
257
|
+
if not self.h_raster and not self.v_raster:
|
258
|
+
yield from self.normal_plot()
|
259
|
+
return
|
260
|
+
x0 = None
|
261
|
+
y0 = None
|
262
|
+
last_dx = 0
|
263
|
+
last_dy = 0
|
264
|
+
for i in range(0, len(self._points)):
|
265
|
+
x1, y1 = self._points[i]
|
266
|
+
if x0 is not None:
|
267
|
+
current_dx = x1 - x0
|
268
|
+
current_dy = y1 - y0
|
269
|
+
power = self._powers[i - 1]
|
270
|
+
if x1 != x0 and y1 != y0:
|
271
|
+
# Raster directional step.
|
272
|
+
if (
|
273
|
+
(last_dx > 0) != (current_dx > 0) # dx same direction
|
274
|
+
and self.h_raster
|
275
|
+
or (last_dy > 0) == (current_dy > 0) # dy different directions
|
276
|
+
and self.v_raster
|
277
|
+
):
|
278
|
+
# Y-Step then X-Step.
|
279
|
+
yield x0, y0, power, x0, y1
|
280
|
+
yield x0, y1, power, x1, y1
|
281
|
+
else:
|
282
|
+
# X-Step then Y-Step
|
283
|
+
yield x0, y0, power, x1, y0
|
284
|
+
yield x1, y0, power, x1, y1
|
285
|
+
else:
|
286
|
+
# Single step.
|
287
|
+
yield x0, y0, power, x1, y1
|
288
|
+
last_dx = current_dx
|
289
|
+
last_dy = current_dy
|
290
|
+
x0 = x1
|
291
|
+
y0 = y1
|
292
|
+
|
293
|
+
def generator(self):
|
294
|
+
for x0, y0, power, x1, y1 in self.plot:
|
295
|
+
if x0 != x1 and y0 != y1: # Non-orthogonal
|
296
|
+
for zx, zy in ZinglPlotter.plot_line(
|
297
|
+
int(round(x0)), int(round(y0)), int(round(x1)), int(round(y1))
|
298
|
+
):
|
299
|
+
yield zx, zy, power
|
300
|
+
else:
|
301
|
+
yield x1, y1, power
|
302
|
+
|
303
|
+
def point(self, t):
|
304
|
+
if len(self._points) == 0:
|
305
|
+
raise ValueError
|
306
|
+
if t == 0:
|
307
|
+
return self._points[0]
|
308
|
+
if t == 1:
|
309
|
+
return self._points[-1]
|
310
|
+
if self._calc_lengths is None:
|
311
|
+
# Need to calculate lengths
|
312
|
+
lengths = list()
|
313
|
+
total_length = 0
|
314
|
+
for i in range(len(self._points) - 1):
|
315
|
+
x0, y0 = self._points[i]
|
316
|
+
x1, y1 = self._points[i + 1]
|
317
|
+
length = abs(complex(x0, y0) - complex(x1, y1))
|
318
|
+
lengths.append(length)
|
319
|
+
total_length += length
|
320
|
+
self._calc_lengths = lengths
|
321
|
+
self._length = total_length
|
322
|
+
if self._length == 0:
|
323
|
+
# Degenerate fallback. (All points are coincident)
|
324
|
+
v = int((len(self._points) - 1) * t)
|
325
|
+
return self._points[v]
|
326
|
+
v = t * self._length
|
327
|
+
for length in self._calc_lengths:
|
328
|
+
if v < length:
|
329
|
+
x0, y0 = self.start
|
330
|
+
x1, y1 = self.end
|
331
|
+
x = x1 * v + x0
|
332
|
+
y = y1 * v + y0
|
333
|
+
return x, y
|
334
|
+
v -= length
|
335
|
+
raise ValueError
|