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/driver.py
CHANGED
@@ -1,591 +1,778 @@
|
|
1
|
-
"""
|
2
|
-
Galvo Driver
|
3
|
-
|
4
|
-
The Driver has a set of different commands which are standardly sent and utilizes those which can be performed by this
|
5
|
-
driver.
|
6
|
-
"""
|
7
|
-
import time
|
8
|
-
|
9
|
-
|
10
|
-
from meerk40t.
|
11
|
-
from meerk40t.core.cutcode.
|
12
|
-
from meerk40t.core.cutcode.
|
13
|
-
from meerk40t.core.cutcode.
|
14
|
-
from meerk40t.core.cutcode.
|
15
|
-
from meerk40t.core.cutcode.
|
16
|
-
from meerk40t.core.cutcode.
|
17
|
-
from meerk40t.core.cutcode.
|
18
|
-
from meerk40t.core.cutcode.
|
19
|
-
from meerk40t.core.cutcode.
|
20
|
-
from meerk40t.core.
|
21
|
-
from meerk40t.
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
self.
|
29
|
-
self.
|
30
|
-
|
31
|
-
self.
|
32
|
-
|
33
|
-
self.service
|
34
|
-
|
35
|
-
|
36
|
-
self.
|
37
|
-
|
38
|
-
|
39
|
-
self.
|
40
|
-
|
41
|
-
self.
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
self.
|
46
|
-
self.plot_planner
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
def
|
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
|
-
return
|
100
|
-
|
101
|
-
def
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
@param
|
110
|
-
@
|
111
|
-
|
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
|
-
|
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
|
-
p
|
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
|
-
|
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
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
self.service.
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
self.
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
self.
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
if self.
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
self.
|
1
|
+
"""
|
2
|
+
Galvo Driver
|
3
|
+
|
4
|
+
The Driver has a set of different commands which are standardly sent and utilizes those which can be performed by this
|
5
|
+
driver.
|
6
|
+
"""
|
7
|
+
import time
|
8
|
+
from usb.core import NoBackendError
|
9
|
+
|
10
|
+
from meerk40t.balormk.controller import GalvoController
|
11
|
+
from meerk40t.core.cutcode.cubiccut import CubicCut
|
12
|
+
from meerk40t.core.cutcode.dwellcut import DwellCut
|
13
|
+
from meerk40t.core.cutcode.gotocut import GotoCut
|
14
|
+
from meerk40t.core.cutcode.homecut import HomeCut
|
15
|
+
from meerk40t.core.cutcode.inputcut import InputCut
|
16
|
+
from meerk40t.core.cutcode.linecut import LineCut
|
17
|
+
from meerk40t.core.cutcode.outputcut import OutputCut
|
18
|
+
from meerk40t.core.cutcode.plotcut import PlotCut
|
19
|
+
from meerk40t.core.cutcode.quadcut import QuadCut
|
20
|
+
from meerk40t.core.cutcode.waitcut import WaitCut
|
21
|
+
from meerk40t.device.basedevice import PLOT_FINISH, PLOT_JOG, PLOT_RAPID, PLOT_SETTING
|
22
|
+
from meerk40t.core.plotplanner import PlotPlanner
|
23
|
+
from meerk40t.tools.geomstr import Geomstr
|
24
|
+
|
25
|
+
|
26
|
+
class BalorDriver:
|
27
|
+
def __init__(self, service, force_mock=False):
|
28
|
+
self.service = service
|
29
|
+
self.native_x = 0x8000
|
30
|
+
self.native_y = 0x8000
|
31
|
+
self.name = str(self.service)
|
32
|
+
|
33
|
+
self.connection = GalvoController(service, force_mock=force_mock)
|
34
|
+
|
35
|
+
self.service.add_service_delegate(self.connection)
|
36
|
+
self.paused = False
|
37
|
+
|
38
|
+
self.is_relative = False
|
39
|
+
self.laser = False
|
40
|
+
|
41
|
+
self._shutdown = False
|
42
|
+
|
43
|
+
self.queue = list()
|
44
|
+
self._queue_current = 0
|
45
|
+
self._queue_total = 0
|
46
|
+
self.plot_planner = PlotPlanner(
|
47
|
+
dict(), single=True, ppi=False, shift=False, group=True, require_uniform_movement = False,
|
48
|
+
)
|
49
|
+
self.value_penbox = None
|
50
|
+
self.plot_planner.settings_then_jog = True
|
51
|
+
self._aborting = False
|
52
|
+
self._list_bits = None
|
53
|
+
|
54
|
+
def __repr__(self):
|
55
|
+
return f"BalorDriver({self.name})"
|
56
|
+
|
57
|
+
@property
|
58
|
+
def connected(self):
|
59
|
+
if self.connection is None:
|
60
|
+
return False
|
61
|
+
return self.connection.connected
|
62
|
+
|
63
|
+
def service_attach(self):
|
64
|
+
self._shutdown = False
|
65
|
+
|
66
|
+
def service_detach(self):
|
67
|
+
self._shutdown = True
|
68
|
+
|
69
|
+
def connect(self):
|
70
|
+
try:
|
71
|
+
self.connection.connect_if_needed()
|
72
|
+
except (ConnectionRefusedError, NoBackendError):
|
73
|
+
return
|
74
|
+
|
75
|
+
def disconnect(self):
|
76
|
+
self.connection.disconnect()
|
77
|
+
|
78
|
+
def abort_retry(self):
|
79
|
+
self.connection.abort_connect()
|
80
|
+
|
81
|
+
#############
|
82
|
+
# DRIVER COMMANDS
|
83
|
+
#############
|
84
|
+
def job_start(self, job):
|
85
|
+
self._aborting = False
|
86
|
+
|
87
|
+
def hold_work(self, priority):
|
88
|
+
"""
|
89
|
+
This is checked by the spooler to see if we should hold any work from being processed from the work queue.
|
90
|
+
|
91
|
+
For example if we pause, we don't want it trying to call some functions. Only priority jobs will execute if
|
92
|
+
we hold the work queue. This is so that "resume" commands can be processed.
|
93
|
+
|
94
|
+
@return:
|
95
|
+
"""
|
96
|
+
return priority <= 0 and self.paused
|
97
|
+
|
98
|
+
def get_internal_queue_status(self):
|
99
|
+
return self._queue_current, self._queue_total
|
100
|
+
|
101
|
+
def _set_queue_status(self, current, total):
|
102
|
+
self._queue_current = current
|
103
|
+
self._queue_total = total
|
104
|
+
|
105
|
+
def get(self, key, default=None):
|
106
|
+
"""
|
107
|
+
Required.
|
108
|
+
|
109
|
+
@param key: Key to get.
|
110
|
+
@param default: Default value to use.
|
111
|
+
@return:
|
112
|
+
"""
|
113
|
+
return default
|
114
|
+
|
115
|
+
def set(self, key, value):
|
116
|
+
"""
|
117
|
+
Required.
|
118
|
+
|
119
|
+
Sets a laser parameter this could be speed, power, number_of_unicorns, or any unknown parameters for
|
120
|
+
yet to be written drivers.
|
121
|
+
|
122
|
+
@param key:
|
123
|
+
@param value:
|
124
|
+
@return:
|
125
|
+
"""
|
126
|
+
|
127
|
+
def status(self):
|
128
|
+
"""
|
129
|
+
Wants a status report of what the driver is doing.
|
130
|
+
@return:
|
131
|
+
"""
|
132
|
+
x, y = self.connection.get_last_xy()
|
133
|
+
state_major, state_minor = self.connection.state
|
134
|
+
return (x, y), state_major, state_minor
|
135
|
+
|
136
|
+
def laser_off(self, *values):
|
137
|
+
"""
|
138
|
+
This command expects to stop pulsing the laser in place.
|
139
|
+
|
140
|
+
@param values:
|
141
|
+
@return:
|
142
|
+
"""
|
143
|
+
self.laser = False
|
144
|
+
|
145
|
+
def laser_on(self, *values):
|
146
|
+
"""
|
147
|
+
This command expects to start pulsing the laser in place.
|
148
|
+
|
149
|
+
@param values:
|
150
|
+
@return:
|
151
|
+
"""
|
152
|
+
self.laser = True
|
153
|
+
|
154
|
+
def geometry(self, geom):
|
155
|
+
"""
|
156
|
+
Called at the end of plot commands to ensure the driver can deal with them all as a group.
|
157
|
+
|
158
|
+
@return:
|
159
|
+
"""
|
160
|
+
self.service.laser_status = "active"
|
161
|
+
con = self.connection
|
162
|
+
con._light_speed = None
|
163
|
+
con._dark_speed = None
|
164
|
+
con._goto_speed = None
|
165
|
+
con.program_mode()
|
166
|
+
self._list_bits = con._port_bits
|
167
|
+
g = Geomstr()
|
168
|
+
for segment_type, start, c1, c2, end, sets in geom.as_lines():
|
169
|
+
con.set_settings(sets)
|
170
|
+
# LOOP CHECKS
|
171
|
+
if self._abort_mission():
|
172
|
+
return
|
173
|
+
if segment_type == "line":
|
174
|
+
last_x, last_y = con.get_last_xy()
|
175
|
+
x, y = start.real, start.imag
|
176
|
+
if last_x != x or last_y != y:
|
177
|
+
con.goto(x, y)
|
178
|
+
con.mark(end.real, end.imag)
|
179
|
+
elif segment_type == "end":
|
180
|
+
pass
|
181
|
+
elif segment_type == "quad":
|
182
|
+
last_x, last_y = con.get_last_xy()
|
183
|
+
x, y = start.real, start.imag
|
184
|
+
if last_x != x or last_y != y:
|
185
|
+
con.goto(x, y)
|
186
|
+
interp = self.service.interp
|
187
|
+
|
188
|
+
g.clear()
|
189
|
+
g.quad(start, c1, end)
|
190
|
+
for p in list(g.as_equal_interpolated_points(distance=interp))[1:]:
|
191
|
+
# LOOP CHECKS
|
192
|
+
if self._abort_mission():
|
193
|
+
return
|
194
|
+
while self.paused:
|
195
|
+
time.sleep(0.05)
|
196
|
+
con.mark(p.real, p.imag)
|
197
|
+
elif segment_type == "cubic":
|
198
|
+
last_x, last_y = con.get_last_xy()
|
199
|
+
x, y = start.real, start.imag
|
200
|
+
if last_x != x or last_y != y:
|
201
|
+
con.goto(x, y)
|
202
|
+
interp = self.service.interp
|
203
|
+
|
204
|
+
g.clear()
|
205
|
+
g.cubic(start, c1, c2, end)
|
206
|
+
for p in list(g.as_equal_interpolated_points(distance=interp))[1:]:
|
207
|
+
# LOOP CHECKS
|
208
|
+
if self._abort_mission():
|
209
|
+
return
|
210
|
+
while self.paused:
|
211
|
+
time.sleep(0.05)
|
212
|
+
con.mark(p.real, p.imag)
|
213
|
+
elif segment_type == "arc":
|
214
|
+
last_x, last_y = con.get_last_xy()
|
215
|
+
x, y = start.real, start.imag
|
216
|
+
if last_x != x or last_y != y:
|
217
|
+
con.goto(x, y)
|
218
|
+
interp = self.service.interp
|
219
|
+
|
220
|
+
g.clear()
|
221
|
+
g.arc(start, c1, end)
|
222
|
+
for p in list(g.as_equal_interpolated_points(distance=interp))[1:]:
|
223
|
+
# LOOP CHECKS
|
224
|
+
if self._abort_mission():
|
225
|
+
return
|
226
|
+
while self.paused:
|
227
|
+
time.sleep(0.05)
|
228
|
+
con.mark(p.real, p.imag)
|
229
|
+
elif segment_type == "point":
|
230
|
+
function = sets.get("function")
|
231
|
+
if function == "dwell":
|
232
|
+
con.goto(start.real, start.imag)
|
233
|
+
dwell_time = (
|
234
|
+
sets.get("dwell_time") * 100
|
235
|
+
) # Dwell time in ms units in 10 us
|
236
|
+
while dwell_time > 0:
|
237
|
+
d = min(dwell_time, 60000)
|
238
|
+
con.list_laser_on_point(int(d))
|
239
|
+
dwell_time -= d
|
240
|
+
con.list_delay_time(int(self.service.delay_end / 10.0))
|
241
|
+
elif function == "wait":
|
242
|
+
dwell_time = (
|
243
|
+
sets.get("dwell_time") * 100
|
244
|
+
) # Dwell time in ms units in 10 us
|
245
|
+
while dwell_time > 0:
|
246
|
+
d = min(dwell_time, 60000)
|
247
|
+
con.list_delay_time(int(d))
|
248
|
+
dwell_time -= d
|
249
|
+
elif function == "home":
|
250
|
+
con.goto(0x8000, 0x8000)
|
251
|
+
elif function == "goto":
|
252
|
+
con.goto(start.real, start.imag)
|
253
|
+
elif function == "input":
|
254
|
+
if self.service.input_operation_hardware:
|
255
|
+
con.list_wait_for_input(sets.get("input_mask"), 0)
|
256
|
+
else:
|
257
|
+
con.rapid_mode()
|
258
|
+
self._wait_for_input_protocol(
|
259
|
+
sets.get("input_mask"), sets.get("input_value")
|
260
|
+
)
|
261
|
+
con.program_mode()
|
262
|
+
elif function == "output":
|
263
|
+
con.port_set(sets.get("output_mask"), sets.get("output_value"))
|
264
|
+
con.list_write_port()
|
265
|
+
con.list_delay_time(int(self.service.delay_end / 10.0))
|
266
|
+
self._list_bits = None
|
267
|
+
con.rapid_mode()
|
268
|
+
self.service.laser_status = "idle"
|
269
|
+
|
270
|
+
if self.service.redlight_preferred:
|
271
|
+
con.light_on()
|
272
|
+
con.write_port()
|
273
|
+
else:
|
274
|
+
con.light_off()
|
275
|
+
con.write_port()
|
276
|
+
|
277
|
+
def plot(self, plot):
|
278
|
+
"""
|
279
|
+
This command is called with bits of cutcode as they are processed through the spooler. This should be optimized
|
280
|
+
bits of cutcode data with settings on them from paths etc.
|
281
|
+
|
282
|
+
@param plot:
|
283
|
+
@return:
|
284
|
+
"""
|
285
|
+
self.queue.append(plot)
|
286
|
+
|
287
|
+
def _wait_for_input_protocol(self, input_mask, input_value):
|
288
|
+
required_passes = self.service.input_passes_required
|
289
|
+
passes = 0
|
290
|
+
while (
|
291
|
+
self.connection and not self.connection.is_shutdown and not self._aborting
|
292
|
+
):
|
293
|
+
read_port = self.connection.read_port()
|
294
|
+
b = read_port[1]
|
295
|
+
all_matched = True
|
296
|
+
for i in range(16):
|
297
|
+
if (input_mask >> i) & 1 == 0:
|
298
|
+
continue # We don't care about this mask.
|
299
|
+
if (input_value >> i) & 1 != (b >> i) & 1:
|
300
|
+
all_matched = False
|
301
|
+
time.sleep(0.05)
|
302
|
+
break
|
303
|
+
|
304
|
+
if all_matched:
|
305
|
+
passes += 1
|
306
|
+
if passes > required_passes:
|
307
|
+
# Success, we matched the wait for protocol.
|
308
|
+
return
|
309
|
+
else:
|
310
|
+
passes = 0
|
311
|
+
|
312
|
+
def plot_start(self):
|
313
|
+
"""
|
314
|
+
This is called after all the cutcode objects are sent. This says it shouldn't expect more cutcode for a bit.
|
315
|
+
|
316
|
+
@return:
|
317
|
+
"""
|
318
|
+
|
319
|
+
# preprocess queue to establish steps
|
320
|
+
self.service.laser_status = "active"
|
321
|
+
con = self.connection
|
322
|
+
con._light_speed = None
|
323
|
+
con._dark_speed = None
|
324
|
+
con._goto_speed = None
|
325
|
+
con.program_mode()
|
326
|
+
self._list_bits = con._port_bits
|
327
|
+
last_on = None
|
328
|
+
queue = self.queue
|
329
|
+
self.queue = list()
|
330
|
+
total = len(queue)
|
331
|
+
current = 0
|
332
|
+
for q in queue:
|
333
|
+
current += 1
|
334
|
+
self._set_queue_status(current, total)
|
335
|
+
settings = q.settings
|
336
|
+
penbox = settings.get("penbox_value")
|
337
|
+
if penbox is not None:
|
338
|
+
try:
|
339
|
+
self.value_penbox = self.service.penbox.pens[penbox]
|
340
|
+
except KeyError:
|
341
|
+
self.value_penbox = None
|
342
|
+
con.set_settings(settings)
|
343
|
+
# LOOP CHECKS
|
344
|
+
if self._abort_mission():
|
345
|
+
return
|
346
|
+
if isinstance(q, LineCut):
|
347
|
+
last_x, last_y = con.get_last_xy()
|
348
|
+
x, y = q.start
|
349
|
+
if last_x != x or last_y != y:
|
350
|
+
con.goto(x, y)
|
351
|
+
con.mark(*q.end)
|
352
|
+
elif isinstance(q, QuadCut):
|
353
|
+
last_x, last_y = con.get_last_xy()
|
354
|
+
x, y = q.start
|
355
|
+
if last_x != x or last_y != y:
|
356
|
+
con.goto(x, y)
|
357
|
+
interp = self.service.interp
|
358
|
+
|
359
|
+
g = Geomstr()
|
360
|
+
g.quad(complex(*q.start), complex(*q.c()), complex(*q.end))
|
361
|
+
for p in list(g.as_equal_interpolated_points(distance=interp))[1:]:
|
362
|
+
# LOOP CHECKS
|
363
|
+
if self._abort_mission():
|
364
|
+
return
|
365
|
+
while self.paused:
|
366
|
+
time.sleep(0.05)
|
367
|
+
con.mark(p.real, p.imag)
|
368
|
+
elif isinstance(q, CubicCut):
|
369
|
+
last_x, last_y = con.get_last_xy()
|
370
|
+
x, y = q.start
|
371
|
+
if last_x != x or last_y != y:
|
372
|
+
con.goto(x, y)
|
373
|
+
interp = self.service.interp
|
374
|
+
|
375
|
+
g = Geomstr()
|
376
|
+
g.cubic(
|
377
|
+
complex(*q.start),
|
378
|
+
complex(*q.c1()),
|
379
|
+
complex(*q.c2()),
|
380
|
+
complex(*q.end),
|
381
|
+
)
|
382
|
+
for p in list(g.as_equal_interpolated_points(distance=interp))[1:]:
|
383
|
+
# LOOP CHECKS
|
384
|
+
if self._abort_mission():
|
385
|
+
return
|
386
|
+
while self.paused:
|
387
|
+
time.sleep(0.05)
|
388
|
+
con.mark(p.real, p.imag)
|
389
|
+
elif isinstance(q, PlotCut):
|
390
|
+
last_x, last_y = con.get_last_xy()
|
391
|
+
x, y = q.start
|
392
|
+
if last_x != x or last_y != y:
|
393
|
+
con.goto(x, y)
|
394
|
+
for ox, oy, on, x, y in q.plot:
|
395
|
+
# LOOP CHECKS
|
396
|
+
if self._abort_mission():
|
397
|
+
return
|
398
|
+
while self.paused:
|
399
|
+
time.sleep(0.05)
|
400
|
+
|
401
|
+
# q.plot can have different on values, these are parsed
|
402
|
+
if last_on is None or on != last_on:
|
403
|
+
# No power change.
|
404
|
+
last_on = on
|
405
|
+
if self.value_penbox:
|
406
|
+
# There is an active value_penbox
|
407
|
+
settings = dict(q.settings)
|
408
|
+
limit = len(self.value_penbox) - 1
|
409
|
+
m = int(round(on * limit))
|
410
|
+
try:
|
411
|
+
pen = self.value_penbox[m]
|
412
|
+
settings.update(pen)
|
413
|
+
except IndexError:
|
414
|
+
pass
|
415
|
+
# Power scaling is exclusive to this penbox. on is used as a lookup and does not scale power.
|
416
|
+
con.set_settings(settings)
|
417
|
+
else:
|
418
|
+
# We are using traditional power-scaling
|
419
|
+
max_power = float(
|
420
|
+
q.settings.get("power", self.service.default_power)
|
421
|
+
)
|
422
|
+
percent_power = max_power / 10.0
|
423
|
+
# Max power is the percent max power, scaled by the pixel power.
|
424
|
+
con.power(percent_power * on)
|
425
|
+
con.mark(x, y)
|
426
|
+
elif isinstance(q, DwellCut):
|
427
|
+
start = q.start
|
428
|
+
con.goto(start[0], start[1])
|
429
|
+
dwell_time = q.dwell_time * 100 # Dwell time in ms units in 10 us
|
430
|
+
while dwell_time > 0:
|
431
|
+
d = min(dwell_time, 60000)
|
432
|
+
con.list_laser_on_point(int(d))
|
433
|
+
dwell_time -= d
|
434
|
+
con.list_delay_time(int(self.service.delay_end / 10.0))
|
435
|
+
elif isinstance(q, WaitCut):
|
436
|
+
dwell_time = q.dwell_time * 100 # Dwell time in ms units in 10 us
|
437
|
+
while dwell_time > 0:
|
438
|
+
d = min(dwell_time, 60000)
|
439
|
+
con.list_delay_time(int(d))
|
440
|
+
dwell_time -= d
|
441
|
+
elif isinstance(q, HomeCut):
|
442
|
+
con.goto(0x8000, 0x8000)
|
443
|
+
elif isinstance(q, GotoCut):
|
444
|
+
con.goto(0x8000, 0x8000)
|
445
|
+
elif isinstance(q, OutputCut):
|
446
|
+
con.port_set(q.output_mask, q.output_value)
|
447
|
+
con.list_write_port()
|
448
|
+
elif isinstance(q, InputCut):
|
449
|
+
if self.service.input_operation_hardware:
|
450
|
+
con.list_wait_for_input(q.input_mask, 0)
|
451
|
+
else:
|
452
|
+
con.rapid_mode()
|
453
|
+
self._wait_for_input_protocol(q.input_mask, q.input_value)
|
454
|
+
con.program_mode()
|
455
|
+
else:
|
456
|
+
# Rastercut
|
457
|
+
self.plot_planner.push(q)
|
458
|
+
for x, y, on in self.plot_planner.gen():
|
459
|
+
# LOOP CHECKS
|
460
|
+
if self._abort_mission():
|
461
|
+
return
|
462
|
+
while self.paused:
|
463
|
+
time.sleep(0.05)
|
464
|
+
|
465
|
+
if on > 1:
|
466
|
+
# Special Command.
|
467
|
+
if on & PLOT_FINISH: # Plot planner is ending.
|
468
|
+
break
|
469
|
+
elif on & PLOT_SETTING: # Plot planner settings have changed.
|
470
|
+
settings = self.plot_planner.settings
|
471
|
+
penbox = settings.get("penbox_value")
|
472
|
+
if penbox is not None:
|
473
|
+
try:
|
474
|
+
self.value_penbox = self.service.penbox.pens[penbox]
|
475
|
+
except KeyError:
|
476
|
+
self.value_penbox = None
|
477
|
+
con.set_settings(settings)
|
478
|
+
elif on & (
|
479
|
+
PLOT_RAPID | PLOT_JOG
|
480
|
+
): # Plot planner requests position change.
|
481
|
+
con.goto(x, y)
|
482
|
+
continue
|
483
|
+
if on == 0:
|
484
|
+
con.goto(x, y)
|
485
|
+
else:
|
486
|
+
# on is in range 0 exclusive and 1 inclusive.
|
487
|
+
# This is a regular cut position
|
488
|
+
if last_on is None or on != last_on:
|
489
|
+
last_on = on
|
490
|
+
if self.value_penbox:
|
491
|
+
# There is an active value_penbox
|
492
|
+
settings = dict(self.plot_planner.settings)
|
493
|
+
limit = len(self.value_penbox) - 1
|
494
|
+
m = int(round(on * limit))
|
495
|
+
try:
|
496
|
+
pen = self.value_penbox[m]
|
497
|
+
settings.update(pen)
|
498
|
+
except IndexError:
|
499
|
+
pass
|
500
|
+
# Power scaling is exclusive to this penbox. on is used as a lookup and does not scale power.
|
501
|
+
con.set_settings(settings)
|
502
|
+
else:
|
503
|
+
# We are using traditional power-scaling
|
504
|
+
settings = self.plot_planner.settings
|
505
|
+
percent_power = (
|
506
|
+
float(
|
507
|
+
settings.get(
|
508
|
+
"power", self.service.default_power
|
509
|
+
)
|
510
|
+
)
|
511
|
+
/ 10.0
|
512
|
+
)
|
513
|
+
con.power(percent_power * on)
|
514
|
+
con.mark(x, y)
|
515
|
+
con.list_delay_time(int(self.service.delay_end / 10.0))
|
516
|
+
self._list_bits = None
|
517
|
+
con.rapid_mode()
|
518
|
+
self.service.laser_status = "idle"
|
519
|
+
self._set_queue_status(0, 0)
|
520
|
+
|
521
|
+
if self.service.redlight_preferred:
|
522
|
+
con.light_on()
|
523
|
+
con.write_port()
|
524
|
+
else:
|
525
|
+
con.light_off()
|
526
|
+
con.write_port()
|
527
|
+
|
528
|
+
def move_abs(self, x, y):
|
529
|
+
"""
|
530
|
+
Requests laser move to absolute position x, y in physical units
|
531
|
+
|
532
|
+
@param x:
|
533
|
+
@param y:
|
534
|
+
@return:
|
535
|
+
"""
|
536
|
+
old_current = self.service.current
|
537
|
+
self.native_x, self.native_y = self.service.view.position(x, y)
|
538
|
+
if self.native_x > 0xFFFF:
|
539
|
+
self.native_x = 0xFFFF
|
540
|
+
if self.native_x < 0:
|
541
|
+
self.native_x = 0
|
542
|
+
|
543
|
+
if self.native_y > 0xFFFF:
|
544
|
+
self.native_y = 0xFFFF
|
545
|
+
if self.native_y < 0:
|
546
|
+
self.native_y = 0
|
547
|
+
self.connection.set_xy(self.native_x, self.native_y)
|
548
|
+
new_current = self.service.current
|
549
|
+
self.service.signal(
|
550
|
+
"driver;position",
|
551
|
+
(old_current[0], old_current[1], new_current[0], new_current[1]),
|
552
|
+
)
|
553
|
+
|
554
|
+
def move_rel(self, dx, dy):
|
555
|
+
"""
|
556
|
+
Requests laser move relative position dx, dy in physical units
|
557
|
+
|
558
|
+
@param dx:
|
559
|
+
@param dy:
|
560
|
+
@return:
|
561
|
+
"""
|
562
|
+
old_current = self.service.current
|
563
|
+
unit_dx, unit_dy = self.service.view.position(dx, dy, vector=True)
|
564
|
+
self.native_x += unit_dx
|
565
|
+
self.native_y += unit_dy
|
566
|
+
|
567
|
+
if self.native_x > 0xFFFF:
|
568
|
+
self.native_x = 0xFFFF
|
569
|
+
if self.native_x < 0:
|
570
|
+
self.native_x = 0
|
571
|
+
|
572
|
+
if self.native_y > 0xFFFF:
|
573
|
+
self.native_y = 0xFFFF
|
574
|
+
if self.native_y < 0:
|
575
|
+
self.native_y = 0
|
576
|
+
self.connection.set_xy(self.native_x, self.native_y)
|
577
|
+
new_current = self.service.current
|
578
|
+
self.service.signal(
|
579
|
+
"driver;position",
|
580
|
+
(old_current[0], old_current[1], new_current[0], new_current[1]),
|
581
|
+
)
|
582
|
+
|
583
|
+
def home(self):
|
584
|
+
"""
|
585
|
+
This is called home, returns to center.
|
586
|
+
|
587
|
+
@return:
|
588
|
+
"""
|
589
|
+
if self.service.rotary.active and self.service.rotary.suppress_home:
|
590
|
+
return
|
591
|
+
self.move_abs("50%", "50%")
|
592
|
+
|
593
|
+
def physical_home(self):
|
594
|
+
""" "
|
595
|
+
This would be the command to go to a real physical home position (i.e. hitting endstops)
|
596
|
+
"""
|
597
|
+
self.home()
|
598
|
+
|
599
|
+
def rapid_mode(self):
|
600
|
+
"""
|
601
|
+
Expects to be in rapid jogging mode.
|
602
|
+
@return:
|
603
|
+
"""
|
604
|
+
self.connection.rapid_mode()
|
605
|
+
|
606
|
+
def program_mode(self):
|
607
|
+
"""
|
608
|
+
Expects to run jobs at a speed in a programmed mode.
|
609
|
+
@return:
|
610
|
+
"""
|
611
|
+
self.connection.program_mode()
|
612
|
+
|
613
|
+
def raster_mode(self, *args):
|
614
|
+
"""
|
615
|
+
Expects to run a raster job. Raster information is set in special modes to stop the laser head from moving
|
616
|
+
too far.
|
617
|
+
|
618
|
+
@return:
|
619
|
+
"""
|
620
|
+
return
|
621
|
+
|
622
|
+
def wait_finished(self):
|
623
|
+
"""
|
624
|
+
Expects to be caught up such that the next command will happen immediately rather than get queued.
|
625
|
+
|
626
|
+
@return:
|
627
|
+
"""
|
628
|
+
self.connection.wait_finished()
|
629
|
+
|
630
|
+
def function(self, function):
|
631
|
+
"""
|
632
|
+
This command asks that this function be executed at the appropriate time within the spooling cycle.
|
633
|
+
|
634
|
+
@param function:
|
635
|
+
@return:
|
636
|
+
"""
|
637
|
+
function()
|
638
|
+
|
639
|
+
def wait(self, time_in_ms):
|
640
|
+
"""
|
641
|
+
Wait asks that the work be stalled or current process held for the time time_in_ms in ms. If wait_finished is
|
642
|
+
called first this will attempt to stall the machine while performing no work. If the driver in question permits
|
643
|
+
waits to be placed within code this should insert waits into the current job. Returning instantly rather than
|
644
|
+
holding the processes.
|
645
|
+
|
646
|
+
@param time_in_ms:
|
647
|
+
@return:
|
648
|
+
"""
|
649
|
+
time.sleep(time_in_ms / 1000.0)
|
650
|
+
|
651
|
+
def console(self, value):
|
652
|
+
"""
|
653
|
+
This asks that the console command be executed at the appropriate time within the spooled cycle.
|
654
|
+
|
655
|
+
@param value: console command
|
656
|
+
@return:
|
657
|
+
"""
|
658
|
+
self.service(value)
|
659
|
+
|
660
|
+
def beep(self):
|
661
|
+
"""
|
662
|
+
Wants a system beep to be issued.
|
663
|
+
This command asks that a beep be executed at the appropriate time within the spooled cycle.
|
664
|
+
|
665
|
+
@return:
|
666
|
+
"""
|
667
|
+
self.service("beep\n")
|
668
|
+
|
669
|
+
def signal(self, signal, *args):
|
670
|
+
"""
|
671
|
+
Wants a system signal to be sent.
|
672
|
+
|
673
|
+
@param signal:
|
674
|
+
@param args:
|
675
|
+
@return:
|
676
|
+
"""
|
677
|
+
self.service.signal(signal, *args)
|
678
|
+
|
679
|
+
def pause(self):
|
680
|
+
"""
|
681
|
+
Wants the driver to pause.
|
682
|
+
@return:
|
683
|
+
"""
|
684
|
+
if self.paused:
|
685
|
+
self.resume()
|
686
|
+
return
|
687
|
+
self.paused = True
|
688
|
+
self.connection.pause()
|
689
|
+
self.service.signal("pause")
|
690
|
+
|
691
|
+
def resume(self):
|
692
|
+
"""
|
693
|
+
Wants the driver to resume.
|
694
|
+
|
695
|
+
This typically issues from the realtime queue which means it will call even if we tell work_hold that we should
|
696
|
+
hold the work.
|
697
|
+
|
698
|
+
@return:
|
699
|
+
"""
|
700
|
+
self.paused = False
|
701
|
+
self.connection.resume()
|
702
|
+
self.service.signal("pause")
|
703
|
+
|
704
|
+
def reset(self):
|
705
|
+
"""
|
706
|
+
Wants the job to be aborted and action to be stopped.
|
707
|
+
|
708
|
+
@return:
|
709
|
+
"""
|
710
|
+
self.paused = False
|
711
|
+
self.connection.abort()
|
712
|
+
self.service.signal("pause")
|
713
|
+
|
714
|
+
def dwell(self, time_in_ms):
|
715
|
+
"""
|
716
|
+
Requests that the laser fire in place for the given time period. This could be done in a series of commands,
|
717
|
+
move to a location, turn laser on, wait, turn laser off. However, some drivers have specific laser-in-place
|
718
|
+
commands so calling dwell is preferred.
|
719
|
+
|
720
|
+
@param time_in_ms:
|
721
|
+
@return:
|
722
|
+
"""
|
723
|
+
self.pulse(time_in_ms)
|
724
|
+
|
725
|
+
def pulse(self, pulse_time):
|
726
|
+
self.service.laser_status = "active"
|
727
|
+
con = self.connection
|
728
|
+
con.program_mode()
|
729
|
+
con.frequency(self.service.default_frequency)
|
730
|
+
con.power(self.service.default_power)
|
731
|
+
if self.service.pulse_width_enabled:
|
732
|
+
con.list_fiber_ylpm_pulse_width(self.service.default_pulse_width)
|
733
|
+
dwell_time = pulse_time * 100 # Dwell time in ms units in 10 us
|
734
|
+
while dwell_time > 0:
|
735
|
+
d = min(dwell_time, 60000)
|
736
|
+
con.list_laser_on_point(int(d))
|
737
|
+
dwell_time -= d
|
738
|
+
con.list_delay_time(int(self.service.delay_end / 10.0))
|
739
|
+
con.rapid_mode()
|
740
|
+
self.service.laser_status = "idle"
|
741
|
+
if self.service.redlight_preferred:
|
742
|
+
con.light_on()
|
743
|
+
con.write_port()
|
744
|
+
else:
|
745
|
+
con.light_off()
|
746
|
+
con.write_port()
|
747
|
+
|
748
|
+
def set_abort(self):
|
749
|
+
self._aborting = True
|
750
|
+
|
751
|
+
def _abort_mission(self):
|
752
|
+
if self._aborting:
|
753
|
+
self.connection.abort()
|
754
|
+
self._aborting = False
|
755
|
+
self.service.laser_status = "idle"
|
756
|
+
return True
|
757
|
+
return False
|
758
|
+
|
759
|
+
def cylinder_validate(self):
|
760
|
+
if self.service.cylinder_active:
|
761
|
+
self._cylinder_wrap()
|
762
|
+
else:
|
763
|
+
self._cylinder_restore()
|
764
|
+
|
765
|
+
def _cylinder_restore(self):
|
766
|
+
if not hasattr(self, "_original_connection"):
|
767
|
+
return
|
768
|
+
oc = getattr(self, "_original_connection")
|
769
|
+
self.connection = oc
|
770
|
+
delattr(self, "_original_connection")
|
771
|
+
|
772
|
+
def _cylinder_wrap(self):
|
773
|
+
if hasattr(self, "_original_connection"):
|
774
|
+
return
|
775
|
+
from .cylindermod import CylinderModifier
|
776
|
+
|
777
|
+
setattr(self, "_original_connection", self.connection)
|
778
|
+
setattr(self, "connection", CylinderModifier(self.connection, self.service))
|