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.
Files changed (446) hide show
  1. meerk40t/__init__.py +1 -1
  2. meerk40t/balormk/balor_params.py +167 -167
  3. meerk40t/balormk/clone_loader.py +457 -457
  4. meerk40t/balormk/controller.py +1566 -1512
  5. meerk40t/balormk/cylindermod.py +64 -0
  6. meerk40t/balormk/device.py +966 -1959
  7. meerk40t/balormk/driver.py +778 -591
  8. meerk40t/balormk/galvo_commands.py +1194 -0
  9. meerk40t/balormk/gui/balorconfig.py +237 -111
  10. meerk40t/balormk/gui/balorcontroller.py +191 -184
  11. meerk40t/balormk/gui/baloroperationproperties.py +116 -115
  12. meerk40t/balormk/gui/corscene.py +845 -0
  13. meerk40t/balormk/gui/gui.py +179 -147
  14. meerk40t/balormk/livelightjob.py +466 -382
  15. meerk40t/balormk/mock_connection.py +131 -109
  16. meerk40t/balormk/plugin.py +133 -135
  17. meerk40t/balormk/usb_connection.py +306 -301
  18. meerk40t/camera/__init__.py +1 -1
  19. meerk40t/camera/camera.py +514 -397
  20. meerk40t/camera/gui/camerapanel.py +1241 -1095
  21. meerk40t/camera/gui/gui.py +58 -58
  22. meerk40t/camera/plugin.py +441 -399
  23. meerk40t/ch341/__init__.py +27 -27
  24. meerk40t/ch341/ch341device.py +628 -628
  25. meerk40t/ch341/libusb.py +595 -589
  26. meerk40t/ch341/mock.py +171 -171
  27. meerk40t/ch341/windriver.py +157 -157
  28. meerk40t/constants.py +13 -0
  29. meerk40t/core/__init__.py +1 -1
  30. meerk40t/core/bindalias.py +550 -539
  31. meerk40t/core/core.py +47 -47
  32. meerk40t/core/cutcode/cubiccut.py +73 -73
  33. meerk40t/core/cutcode/cutcode.py +315 -312
  34. meerk40t/core/cutcode/cutgroup.py +141 -137
  35. meerk40t/core/cutcode/cutobject.py +192 -185
  36. meerk40t/core/cutcode/dwellcut.py +37 -37
  37. meerk40t/core/cutcode/gotocut.py +29 -29
  38. meerk40t/core/cutcode/homecut.py +29 -29
  39. meerk40t/core/cutcode/inputcut.py +34 -34
  40. meerk40t/core/cutcode/linecut.py +33 -33
  41. meerk40t/core/cutcode/outputcut.py +34 -34
  42. meerk40t/core/cutcode/plotcut.py +335 -335
  43. meerk40t/core/cutcode/quadcut.py +61 -61
  44. meerk40t/core/cutcode/rastercut.py +168 -148
  45. meerk40t/core/cutcode/waitcut.py +34 -34
  46. meerk40t/core/cutplan.py +1843 -1316
  47. meerk40t/core/drivers.py +330 -329
  48. meerk40t/core/elements/align.py +801 -669
  49. meerk40t/core/elements/branches.py +1858 -1507
  50. meerk40t/core/elements/clipboard.py +229 -219
  51. meerk40t/core/elements/element_treeops.py +4595 -2837
  52. meerk40t/core/elements/element_types.py +125 -105
  53. meerk40t/core/elements/elements.py +4315 -3617
  54. meerk40t/core/elements/files.py +117 -64
  55. meerk40t/core/elements/geometry.py +473 -224
  56. meerk40t/core/elements/grid.py +467 -316
  57. meerk40t/core/elements/materials.py +158 -94
  58. meerk40t/core/elements/notes.py +50 -38
  59. meerk40t/core/elements/offset_clpr.py +934 -912
  60. meerk40t/core/elements/offset_mk.py +963 -955
  61. meerk40t/core/elements/penbox.py +339 -267
  62. meerk40t/core/elements/placements.py +300 -83
  63. meerk40t/core/elements/render.py +785 -687
  64. meerk40t/core/elements/shapes.py +2618 -2092
  65. meerk40t/core/elements/testcases.py +105 -0
  66. meerk40t/core/elements/trace.py +651 -563
  67. meerk40t/core/elements/tree_commands.py +415 -409
  68. meerk40t/core/elements/undo_redo.py +116 -58
  69. meerk40t/core/elements/wordlist.py +319 -200
  70. meerk40t/core/exceptions.py +9 -9
  71. meerk40t/core/laserjob.py +220 -220
  72. meerk40t/core/logging.py +63 -63
  73. meerk40t/core/node/blobnode.py +83 -86
  74. meerk40t/core/node/bootstrap.py +105 -103
  75. meerk40t/core/node/branch_elems.py +40 -31
  76. meerk40t/core/node/branch_ops.py +45 -38
  77. meerk40t/core/node/branch_regmark.py +48 -41
  78. meerk40t/core/node/cutnode.py +29 -32
  79. meerk40t/core/node/effect_hatch.py +375 -257
  80. meerk40t/core/node/effect_warp.py +398 -0
  81. meerk40t/core/node/effect_wobble.py +441 -309
  82. meerk40t/core/node/elem_ellipse.py +404 -309
  83. meerk40t/core/node/elem_image.py +1082 -801
  84. meerk40t/core/node/elem_line.py +358 -292
  85. meerk40t/core/node/elem_path.py +259 -201
  86. meerk40t/core/node/elem_point.py +129 -102
  87. meerk40t/core/node/elem_polyline.py +310 -246
  88. meerk40t/core/node/elem_rect.py +376 -286
  89. meerk40t/core/node/elem_text.py +445 -418
  90. meerk40t/core/node/filenode.py +59 -40
  91. meerk40t/core/node/groupnode.py +138 -74
  92. meerk40t/core/node/image_processed.py +777 -766
  93. meerk40t/core/node/image_raster.py +156 -113
  94. meerk40t/core/node/layernode.py +31 -31
  95. meerk40t/core/node/mixins.py +135 -107
  96. meerk40t/core/node/node.py +1427 -1304
  97. meerk40t/core/node/nutils.py +117 -114
  98. meerk40t/core/node/op_cut.py +463 -335
  99. meerk40t/core/node/op_dots.py +296 -251
  100. meerk40t/core/node/op_engrave.py +414 -311
  101. meerk40t/core/node/op_image.py +755 -369
  102. meerk40t/core/node/op_raster.py +787 -522
  103. meerk40t/core/node/place_current.py +37 -40
  104. meerk40t/core/node/place_point.py +329 -126
  105. meerk40t/core/node/refnode.py +58 -47
  106. meerk40t/core/node/rootnode.py +225 -219
  107. meerk40t/core/node/util_console.py +48 -48
  108. meerk40t/core/node/util_goto.py +84 -65
  109. meerk40t/core/node/util_home.py +61 -61
  110. meerk40t/core/node/util_input.py +102 -102
  111. meerk40t/core/node/util_output.py +102 -102
  112. meerk40t/core/node/util_wait.py +65 -65
  113. meerk40t/core/parameters.py +709 -707
  114. meerk40t/core/planner.py +875 -785
  115. meerk40t/core/plotplanner.py +656 -652
  116. meerk40t/core/space.py +120 -113
  117. meerk40t/core/spoolers.py +706 -705
  118. meerk40t/core/svg_io.py +1836 -1549
  119. meerk40t/core/treeop.py +534 -445
  120. meerk40t/core/undos.py +278 -124
  121. meerk40t/core/units.py +784 -680
  122. meerk40t/core/view.py +393 -322
  123. meerk40t/core/webhelp.py +62 -62
  124. meerk40t/core/wordlist.py +513 -504
  125. meerk40t/cylinder/cylinder.py +247 -0
  126. meerk40t/cylinder/gui/cylindersettings.py +41 -0
  127. meerk40t/cylinder/gui/gui.py +24 -0
  128. meerk40t/device/__init__.py +1 -1
  129. meerk40t/device/basedevice.py +322 -123
  130. meerk40t/device/devicechoices.py +50 -0
  131. meerk40t/device/dummydevice.py +163 -128
  132. meerk40t/device/gui/defaultactions.py +618 -602
  133. meerk40t/device/gui/effectspanel.py +114 -0
  134. meerk40t/device/gui/formatterpanel.py +253 -290
  135. meerk40t/device/gui/warningpanel.py +337 -260
  136. meerk40t/device/mixins.py +13 -13
  137. meerk40t/dxf/__init__.py +1 -1
  138. meerk40t/dxf/dxf_io.py +766 -554
  139. meerk40t/dxf/plugin.py +47 -35
  140. meerk40t/external_plugins.py +79 -79
  141. meerk40t/external_plugins_build.py +28 -28
  142. meerk40t/extra/cag.py +112 -116
  143. meerk40t/extra/coolant.py +403 -0
  144. meerk40t/extra/encode_detect.py +204 -0
  145. meerk40t/extra/ezd.py +1165 -1165
  146. meerk40t/extra/hershey.py +834 -340
  147. meerk40t/extra/imageactions.py +322 -316
  148. meerk40t/extra/inkscape.py +628 -622
  149. meerk40t/extra/lbrn.py +424 -424
  150. meerk40t/extra/outerworld.py +283 -0
  151. meerk40t/extra/param_functions.py +1542 -1556
  152. meerk40t/extra/potrace.py +257 -253
  153. meerk40t/extra/serial_exchange.py +118 -0
  154. meerk40t/extra/updater.py +602 -453
  155. meerk40t/extra/vectrace.py +147 -146
  156. meerk40t/extra/winsleep.py +83 -83
  157. meerk40t/extra/xcs_reader.py +597 -0
  158. meerk40t/fill/fills.py +781 -335
  159. meerk40t/fill/patternfill.py +1061 -1061
  160. meerk40t/fill/patterns.py +614 -567
  161. meerk40t/grbl/control.py +87 -87
  162. meerk40t/grbl/controller.py +990 -903
  163. meerk40t/grbl/device.py +1084 -768
  164. meerk40t/grbl/driver.py +989 -771
  165. meerk40t/grbl/emulator.py +532 -497
  166. meerk40t/grbl/gcodejob.py +783 -767
  167. meerk40t/grbl/gui/grblconfiguration.py +373 -298
  168. meerk40t/grbl/gui/grblcontroller.py +485 -271
  169. meerk40t/grbl/gui/grblhardwareconfig.py +269 -153
  170. meerk40t/grbl/gui/grbloperationconfig.py +105 -0
  171. meerk40t/grbl/gui/gui.py +147 -116
  172. meerk40t/grbl/interpreter.py +44 -44
  173. meerk40t/grbl/loader.py +22 -22
  174. meerk40t/grbl/mock_connection.py +56 -56
  175. meerk40t/grbl/plugin.py +294 -264
  176. meerk40t/grbl/serial_connection.py +93 -88
  177. meerk40t/grbl/tcp_connection.py +81 -79
  178. meerk40t/grbl/ws_connection.py +112 -0
  179. meerk40t/gui/__init__.py +1 -1
  180. meerk40t/gui/about.py +2042 -296
  181. meerk40t/gui/alignment.py +1644 -1608
  182. meerk40t/gui/autoexec.py +199 -0
  183. meerk40t/gui/basicops.py +791 -670
  184. meerk40t/gui/bufferview.py +77 -71
  185. meerk40t/gui/busy.py +232 -133
  186. meerk40t/gui/choicepropertypanel.py +1662 -1469
  187. meerk40t/gui/consolepanel.py +706 -542
  188. meerk40t/gui/devicepanel.py +687 -581
  189. meerk40t/gui/dialogoptions.py +110 -107
  190. meerk40t/gui/executejob.py +316 -306
  191. meerk40t/gui/fonts.py +90 -90
  192. meerk40t/gui/functionwrapper.py +252 -0
  193. meerk40t/gui/gui_mixins.py +729 -0
  194. meerk40t/gui/guicolors.py +205 -182
  195. meerk40t/gui/help_assets/help_assets.py +218 -201
  196. meerk40t/gui/helper.py +154 -0
  197. meerk40t/gui/hersheymanager.py +1440 -846
  198. meerk40t/gui/icons.py +3422 -2747
  199. meerk40t/gui/imagesplitter.py +555 -508
  200. meerk40t/gui/keymap.py +354 -344
  201. meerk40t/gui/laserpanel.py +897 -806
  202. meerk40t/gui/laserrender.py +1470 -1232
  203. meerk40t/gui/lasertoolpanel.py +805 -793
  204. meerk40t/gui/magnetoptions.py +436 -0
  205. meerk40t/gui/materialmanager.py +2944 -0
  206. meerk40t/gui/materialtest.py +1722 -1694
  207. meerk40t/gui/mkdebug.py +646 -359
  208. meerk40t/gui/mwindow.py +163 -140
  209. meerk40t/gui/navigationpanels.py +2605 -2467
  210. meerk40t/gui/notes.py +143 -142
  211. meerk40t/gui/opassignment.py +414 -410
  212. meerk40t/gui/operation_info.py +310 -299
  213. meerk40t/gui/plugin.py +500 -328
  214. meerk40t/gui/position.py +714 -669
  215. meerk40t/gui/preferences.py +901 -650
  216. meerk40t/gui/propertypanels/attributes.py +1461 -1131
  217. meerk40t/gui/propertypanels/blobproperty.py +117 -114
  218. meerk40t/gui/propertypanels/consoleproperty.py +83 -80
  219. meerk40t/gui/propertypanels/gotoproperty.py +77 -0
  220. meerk40t/gui/propertypanels/groupproperties.py +223 -217
  221. meerk40t/gui/propertypanels/hatchproperty.py +489 -469
  222. meerk40t/gui/propertypanels/imageproperty.py +2244 -1384
  223. meerk40t/gui/propertypanels/inputproperty.py +59 -58
  224. meerk40t/gui/propertypanels/opbranchproperties.py +82 -80
  225. meerk40t/gui/propertypanels/operationpropertymain.py +1890 -1638
  226. meerk40t/gui/propertypanels/outputproperty.py +59 -58
  227. meerk40t/gui/propertypanels/pathproperty.py +389 -380
  228. meerk40t/gui/propertypanels/placementproperty.py +1214 -383
  229. meerk40t/gui/propertypanels/pointproperty.py +140 -136
  230. meerk40t/gui/propertypanels/propertywindow.py +313 -181
  231. meerk40t/gui/propertypanels/rasterwizardpanels.py +996 -912
  232. meerk40t/gui/propertypanels/regbranchproperties.py +76 -0
  233. meerk40t/gui/propertypanels/textproperty.py +770 -755
  234. meerk40t/gui/propertypanels/waitproperty.py +56 -55
  235. meerk40t/gui/propertypanels/warpproperty.py +121 -0
  236. meerk40t/gui/propertypanels/wobbleproperty.py +255 -204
  237. meerk40t/gui/ribbon.py +2471 -2210
  238. meerk40t/gui/scene/scene.py +1100 -1051
  239. meerk40t/gui/scene/sceneconst.py +22 -22
  240. meerk40t/gui/scene/scenepanel.py +439 -349
  241. meerk40t/gui/scene/scenespacewidget.py +365 -365
  242. meerk40t/gui/scene/widget.py +518 -505
  243. meerk40t/gui/scenewidgets/affinemover.py +215 -215
  244. meerk40t/gui/scenewidgets/attractionwidget.py +315 -309
  245. meerk40t/gui/scenewidgets/bedwidget.py +120 -97
  246. meerk40t/gui/scenewidgets/elementswidget.py +137 -107
  247. meerk40t/gui/scenewidgets/gridwidget.py +785 -745
  248. meerk40t/gui/scenewidgets/guidewidget.py +765 -765
  249. meerk40t/gui/scenewidgets/laserpathwidget.py +66 -66
  250. meerk40t/gui/scenewidgets/machineoriginwidget.py +86 -86
  251. meerk40t/gui/scenewidgets/nodeselector.py +28 -28
  252. meerk40t/gui/scenewidgets/rectselectwidget.py +592 -346
  253. meerk40t/gui/scenewidgets/relocatewidget.py +33 -33
  254. meerk40t/gui/scenewidgets/reticlewidget.py +83 -83
  255. meerk40t/gui/scenewidgets/selectionwidget.py +2958 -2756
  256. meerk40t/gui/simpleui.py +362 -333
  257. meerk40t/gui/simulation.py +2451 -2094
  258. meerk40t/gui/snapoptions.py +208 -203
  259. meerk40t/gui/spoolerpanel.py +1227 -1180
  260. meerk40t/gui/statusbarwidgets/defaultoperations.py +480 -353
  261. meerk40t/gui/statusbarwidgets/infowidget.py +520 -483
  262. meerk40t/gui/statusbarwidgets/opassignwidget.py +356 -355
  263. meerk40t/gui/statusbarwidgets/selectionwidget.py +172 -171
  264. meerk40t/gui/statusbarwidgets/shapepropwidget.py +754 -236
  265. meerk40t/gui/statusbarwidgets/statusbar.py +272 -260
  266. meerk40t/gui/statusbarwidgets/statusbarwidget.py +268 -270
  267. meerk40t/gui/statusbarwidgets/strokewidget.py +267 -251
  268. meerk40t/gui/themes.py +200 -78
  269. meerk40t/gui/tips.py +590 -0
  270. meerk40t/gui/toolwidgets/circlebrush.py +35 -35
  271. meerk40t/gui/toolwidgets/toolcircle.py +248 -242
  272. meerk40t/gui/toolwidgets/toolcontainer.py +82 -77
  273. meerk40t/gui/toolwidgets/tooldraw.py +97 -90
  274. meerk40t/gui/toolwidgets/toolellipse.py +219 -212
  275. meerk40t/gui/toolwidgets/toolimagecut.py +25 -132
  276. meerk40t/gui/toolwidgets/toolline.py +39 -144
  277. meerk40t/gui/toolwidgets/toollinetext.py +79 -236
  278. meerk40t/gui/toolwidgets/toollinetext_inline.py +296 -0
  279. meerk40t/gui/toolwidgets/toolmeasure.py +163 -216
  280. meerk40t/gui/toolwidgets/toolnodeedit.py +2088 -2074
  281. meerk40t/gui/toolwidgets/toolnodemove.py +92 -94
  282. meerk40t/gui/toolwidgets/toolparameter.py +754 -668
  283. meerk40t/gui/toolwidgets/toolplacement.py +108 -108
  284. meerk40t/gui/toolwidgets/toolpoint.py +68 -59
  285. meerk40t/gui/toolwidgets/toolpointlistbuilder.py +294 -0
  286. meerk40t/gui/toolwidgets/toolpointmove.py +183 -0
  287. meerk40t/gui/toolwidgets/toolpolygon.py +288 -403
  288. meerk40t/gui/toolwidgets/toolpolyline.py +38 -196
  289. meerk40t/gui/toolwidgets/toolrect.py +211 -207
  290. meerk40t/gui/toolwidgets/toolrelocate.py +72 -72
  291. meerk40t/gui/toolwidgets/toolribbon.py +598 -113
  292. meerk40t/gui/toolwidgets/tooltabedit.py +546 -0
  293. meerk40t/gui/toolwidgets/tooltext.py +98 -89
  294. meerk40t/gui/toolwidgets/toolvector.py +213 -204
  295. meerk40t/gui/toolwidgets/toolwidget.py +39 -39
  296. meerk40t/gui/usbconnect.py +98 -91
  297. meerk40t/gui/utilitywidgets/buttonwidget.py +18 -18
  298. meerk40t/gui/utilitywidgets/checkboxwidget.py +90 -90
  299. meerk40t/gui/utilitywidgets/controlwidget.py +14 -14
  300. meerk40t/gui/utilitywidgets/cyclocycloidwidget.py +343 -340
  301. meerk40t/gui/utilitywidgets/debugwidgets.py +148 -0
  302. meerk40t/gui/utilitywidgets/handlewidget.py +27 -27
  303. meerk40t/gui/utilitywidgets/harmonograph.py +450 -447
  304. meerk40t/gui/utilitywidgets/openclosewidget.py +40 -40
  305. meerk40t/gui/utilitywidgets/rotationwidget.py +54 -54
  306. meerk40t/gui/utilitywidgets/scalewidget.py +75 -75
  307. meerk40t/gui/utilitywidgets/seekbarwidget.py +183 -183
  308. meerk40t/gui/utilitywidgets/togglewidget.py +142 -142
  309. meerk40t/gui/utilitywidgets/toolbarwidget.py +8 -8
  310. meerk40t/gui/wordlisteditor.py +985 -931
  311. meerk40t/gui/wxmeerk40t.py +1447 -1169
  312. meerk40t/gui/wxmmain.py +5644 -4112
  313. meerk40t/gui/wxmribbon.py +1591 -1076
  314. meerk40t/gui/wxmscene.py +1631 -1453
  315. meerk40t/gui/wxmtree.py +2416 -2089
  316. meerk40t/gui/wxutils.py +1769 -1099
  317. meerk40t/gui/zmatrix.py +102 -102
  318. meerk40t/image/__init__.py +1 -1
  319. meerk40t/image/dither.py +429 -0
  320. meerk40t/image/imagetools.py +2793 -2269
  321. meerk40t/internal_plugins.py +150 -130
  322. meerk40t/kernel/__init__.py +63 -12
  323. meerk40t/kernel/channel.py +259 -212
  324. meerk40t/kernel/context.py +538 -538
  325. meerk40t/kernel/exceptions.py +41 -41
  326. meerk40t/kernel/functions.py +463 -414
  327. meerk40t/kernel/jobs.py +100 -100
  328. meerk40t/kernel/kernel.py +3828 -3571
  329. meerk40t/kernel/lifecycles.py +71 -71
  330. meerk40t/kernel/module.py +49 -49
  331. meerk40t/kernel/service.py +147 -147
  332. meerk40t/kernel/settings.py +383 -343
  333. meerk40t/lihuiyu/controller.py +883 -876
  334. meerk40t/lihuiyu/device.py +1181 -1069
  335. meerk40t/lihuiyu/driver.py +1466 -1372
  336. meerk40t/lihuiyu/gui/gui.py +127 -106
  337. meerk40t/lihuiyu/gui/lhyaccelgui.py +377 -363
  338. meerk40t/lihuiyu/gui/lhycontrollergui.py +741 -651
  339. meerk40t/lihuiyu/gui/lhydrivergui.py +470 -446
  340. meerk40t/lihuiyu/gui/lhyoperationproperties.py +238 -237
  341. meerk40t/lihuiyu/gui/tcpcontroller.py +226 -190
  342. meerk40t/lihuiyu/interpreter.py +53 -53
  343. meerk40t/lihuiyu/laserspeed.py +450 -450
  344. meerk40t/lihuiyu/loader.py +90 -90
  345. meerk40t/lihuiyu/parser.py +404 -404
  346. meerk40t/lihuiyu/plugin.py +101 -102
  347. meerk40t/lihuiyu/tcp_connection.py +111 -109
  348. meerk40t/main.py +231 -165
  349. meerk40t/moshi/builder.py +788 -781
  350. meerk40t/moshi/controller.py +505 -499
  351. meerk40t/moshi/device.py +495 -442
  352. meerk40t/moshi/driver.py +862 -696
  353. meerk40t/moshi/gui/gui.py +78 -76
  354. meerk40t/moshi/gui/moshicontrollergui.py +538 -522
  355. meerk40t/moshi/gui/moshidrivergui.py +87 -75
  356. meerk40t/moshi/plugin.py +43 -43
  357. meerk40t/network/console_server.py +140 -57
  358. meerk40t/network/kernelserver.py +10 -9
  359. meerk40t/network/tcp_server.py +142 -140
  360. meerk40t/network/udp_server.py +103 -77
  361. meerk40t/network/web_server.py +404 -0
  362. meerk40t/newly/controller.py +1158 -1144
  363. meerk40t/newly/device.py +874 -732
  364. meerk40t/newly/driver.py +540 -412
  365. meerk40t/newly/gui/gui.py +219 -188
  366. meerk40t/newly/gui/newlyconfig.py +116 -101
  367. meerk40t/newly/gui/newlycontroller.py +193 -186
  368. meerk40t/newly/gui/operationproperties.py +51 -51
  369. meerk40t/newly/mock_connection.py +82 -82
  370. meerk40t/newly/newly_params.py +56 -56
  371. meerk40t/newly/plugin.py +1214 -1246
  372. meerk40t/newly/usb_connection.py +322 -322
  373. meerk40t/rotary/gui/gui.py +52 -46
  374. meerk40t/rotary/gui/rotarysettings.py +240 -232
  375. meerk40t/rotary/rotary.py +202 -98
  376. meerk40t/ruida/control.py +291 -91
  377. meerk40t/ruida/controller.py +138 -1088
  378. meerk40t/ruida/device.py +676 -231
  379. meerk40t/ruida/driver.py +534 -472
  380. meerk40t/ruida/emulator.py +1494 -1491
  381. meerk40t/ruida/exceptions.py +4 -4
  382. meerk40t/ruida/gui/gui.py +71 -76
  383. meerk40t/ruida/gui/ruidaconfig.py +239 -72
  384. meerk40t/ruida/gui/ruidacontroller.py +187 -184
  385. meerk40t/ruida/gui/ruidaoperationproperties.py +48 -47
  386. meerk40t/ruida/loader.py +54 -52
  387. meerk40t/ruida/mock_connection.py +57 -109
  388. meerk40t/ruida/plugin.py +124 -87
  389. meerk40t/ruida/rdjob.py +2084 -945
  390. meerk40t/ruida/serial_connection.py +116 -0
  391. meerk40t/ruida/tcp_connection.py +146 -0
  392. meerk40t/ruida/udp_connection.py +73 -0
  393. meerk40t/svgelements.py +9671 -9669
  394. meerk40t/tools/driver_to_path.py +584 -579
  395. meerk40t/tools/geomstr.py +5583 -4680
  396. meerk40t/tools/jhfparser.py +357 -292
  397. meerk40t/tools/kerftest.py +904 -890
  398. meerk40t/tools/livinghinges.py +1168 -1033
  399. meerk40t/tools/pathtools.py +987 -949
  400. meerk40t/tools/pmatrix.py +234 -0
  401. meerk40t/tools/pointfinder.py +942 -942
  402. meerk40t/tools/polybool.py +941 -940
  403. meerk40t/tools/rasterplotter.py +1660 -547
  404. meerk40t/tools/shxparser.py +1047 -901
  405. meerk40t/tools/ttfparser.py +726 -446
  406. meerk40t/tools/zinglplotter.py +595 -593
  407. {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/LICENSE +21 -21
  408. {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/METADATA +150 -139
  409. meerk40t-0.9.7020.dist-info/RECORD +446 -0
  410. {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/WHEEL +1 -1
  411. {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/top_level.txt +0 -1
  412. {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/zip-safe +1 -1
  413. meerk40t/balormk/elementlightjob.py +0 -159
  414. meerk40t-0.9.3001.dist-info/RECORD +0 -437
  415. test/bootstrap.py +0 -63
  416. test/test_cli.py +0 -12
  417. test/test_core_cutcode.py +0 -418
  418. test/test_core_elements.py +0 -144
  419. test/test_core_plotplanner.py +0 -397
  420. test/test_core_viewports.py +0 -312
  421. test/test_drivers_grbl.py +0 -108
  422. test/test_drivers_lihuiyu.py +0 -443
  423. test/test_drivers_newly.py +0 -113
  424. test/test_element_degenerate_points.py +0 -43
  425. test/test_elements_classify.py +0 -97
  426. test/test_elements_penbox.py +0 -22
  427. test/test_file_svg.py +0 -176
  428. test/test_fill.py +0 -155
  429. test/test_geomstr.py +0 -1523
  430. test/test_geomstr_nodes.py +0 -18
  431. test/test_imagetools_actualize.py +0 -306
  432. test/test_imagetools_wizard.py +0 -258
  433. test/test_kernel.py +0 -200
  434. test/test_laser_speeds.py +0 -3303
  435. test/test_length.py +0 -57
  436. test/test_lifecycle.py +0 -66
  437. test/test_operations.py +0 -251
  438. test/test_operations_hatch.py +0 -57
  439. test/test_ruida.py +0 -19
  440. test/test_spooler.py +0 -22
  441. test/test_tools_rasterplotter.py +0 -29
  442. test/test_wobble.py +0 -133
  443. test/test_zingl.py +0 -124
  444. {test → meerk40t/cylinder}/__init__.py +0 -0
  445. /meerk40t/{core/element_commands.py → cylinder/gui/__init__.py} +0 -0
  446. {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/entry_points.txt +0 -0
@@ -1,260 +1,272 @@
1
- import wx
2
-
3
- from meerk40t.gui.icons import icons8_circled_right
4
-
5
-
6
- class CustomStatusBar(wx.StatusBar):
7
- """
8
- Overloading of wx.Statusbar to allow some elements on it
9
- """
10
-
11
- def __init__(self, parent, panelct):
12
- # Where shall the different controls be placed?
13
- self.startup = True
14
- self.panelct = panelct
15
- self.context = parent.context
16
-
17
- wx.StatusBar.__init__(self, parent, -1)
18
- # Make sure that the statusbar elements are visible fully
19
- self.SetMinHeight(25)
20
- self.SetFieldsCount(self.panelct)
21
- self.SetStatusStyles([wx.SB_SUNKEN] * self.panelct)
22
- self.status_text = [""] * self.panelct
23
- self.sizeChanged = False
24
- self.widgets = {}
25
- self.activesizer = [None] * self.panelct
26
- self.nextbuttons = []
27
- for __ in range(self.panelct):
28
- # Linux wxPython has a fundamental flaw in the treatment of
29
- # small bitmap buttons. It reserves an extent around the
30
- # bitmap and tries to reduce the size, which leads to a lot of
31
- # unwanted messages plus some very unwanted X-Windows crash...
32
- btn = wx.StaticBitmap(
33
- self,
34
- id=wx.ID_ANY,
35
- bitmap=icons8_circled_right.GetBitmap(
36
- resize=max(20, self.available_height - 4), buffer=1
37
- ),
38
- size=wx.Size(self.available_height - 2, self.available_height - 2),
39
- # style=wx.BORDER_RAISED,
40
- )
41
- # btn.SetBackgroundColour(wx.RED)
42
- # btn.SetBitmap(icons8_circled_right.GetBitmap(noadjustment=True, color=Color("red")))
43
- btn.Show(False)
44
- btn.Bind(wx.EVT_LEFT_DOWN, self.on_button_next)
45
- btn.Bind(wx.EVT_RIGHT_DOWN, self.on_button_prev)
46
- self.nextbuttons.append(btn)
47
- self.Bind(wx.EVT_SIZE, self.OnSize)
48
- self.Bind(wx.EVT_IDLE, self.OnIdle)
49
-
50
- # set the initial position of the checkboxes
51
- self.Reposition()
52
- self.startup = False
53
-
54
- @property
55
- def available_height(self):
56
- sb_size = self.GetSize()
57
- return sb_size[1]
58
-
59
- def Clear(self):
60
- """
61
- Resets all panels
62
- """
63
- for key in self.widgets:
64
- widget = self.widgets[key]
65
- widget.Hide()
66
- del widget
67
- for btn in self.nextbuttons:
68
- btn.Show(False)
69
- self.widgets = {}
70
- self.activesizer = [None] * self.panelct
71
- for idx in range(self.panelct):
72
- super().SetStatusText(self.status_text[idx], idx)
73
-
74
- def SetStatusText(self, message="", panel=0):
75
- if 0 <= panel < self.panelct:
76
- self.status_text[panel] = message
77
- # Signal it onwards....
78
- self.Signal("statusmsg", message, panel)
79
- if len(self.widgets) == 0:
80
- super().SetStatusText(message, panel)
81
-
82
- def add_panel_widget(self, widget, panel_idx, identifier, visible=True):
83
- if panel_idx < 0 or panel_idx >= self.panelct:
84
- return
85
- # Make sure they belong to me, else the wx.Boxsizer
86
- # will have wrong information to work with
87
- widget.GenerateControls(self, panel_idx, identifier, self.context)
88
- widget.active = visible
89
- self.widgets[identifier] = widget
90
-
91
- def activate_panel(self, identifier, newflag, force=False):
92
- # Activate Panel will make the indicated panel become choosable
93
- # print ("Activate Panel: %s -> %s" % (identifier, newflag))
94
- try:
95
- oldflag = self.widgets[identifier].active
96
- except (IndexError, KeyError):
97
- return
98
- if oldflag != newflag:
99
- panelidx = self.widgets[identifier].panelidx
100
-
101
- # Choosable
102
- self.widgets[identifier].active = newflag
103
- if newflag and (self.activesizer[panelidx] is None or force):
104
- self.activesizer[panelidx] = identifier
105
- elif not newflag and self.activesizer[panelidx] == identifier:
106
- # Was the active one, so look for an alternative
107
- self.activesizer[panelidx] = None
108
- for key in self.widgets:
109
- entry = self.widgets[key]
110
- if entry.active and entry.panelidx == panelidx:
111
- self.activesizer[panelidx] = key
112
- break
113
- self.Reposition(panelidx=panelidx)
114
-
115
- def force_panel(self, identifier):
116
- # force_panel will make the indicated panel choosable and visible
117
- try:
118
- oldflag = self.widgets[identifier].active
119
- except (IndexError, KeyError):
120
- return
121
- if not oldflag:
122
- # Make it choosable
123
- self.widgets[identifier].active = True
124
- panelidx = self.widgets[identifier].panelidx
125
- self.activesizer[panelidx] = identifier
126
- self.Reposition(panelidx=panelidx)
127
-
128
- def next_entry_in_panel(self, panelidx):
129
- if panelidx < 0 or panelidx >= self.panelct:
130
- return
131
- first_entry = None
132
- next_entry = None
133
- visible_seen = False
134
- for key in self.widgets:
135
- entry = self.widgets[key]
136
- if entry.panelidx == panelidx and entry.active:
137
- if key == self.activesizer[panelidx]: # Visible
138
- visible_seen = True
139
- else:
140
- if visible_seen and next_entry is None:
141
- next_entry = key
142
- break
143
- else:
144
- if first_entry is None:
145
- first_entry = key
146
- if next_entry is None:
147
- next_entry = first_entry
148
- if next_entry is not None:
149
- self.force_panel(next_entry)
150
- else:
151
- self.activesizer[panelidx] = None
152
-
153
- def prev_entry_in_panel(self, panelidx):
154
- if panelidx < 0 or panelidx >= self.panelct:
155
- return
156
- last_entry = None
157
- prev_entry = None
158
- visible_seen = False
159
- for key in self.widgets:
160
- entry = self.widgets[key]
161
- if entry.panelidx == panelidx and entry.active:
162
- if key == self.activesizer[panelidx]: # Visible
163
- visible_seen = True
164
- elif visible_seen:
165
- last_entry = key
166
- else:
167
- prev_entry = key
168
- if prev_entry is None:
169
- prev_entry = last_entry
170
- if prev_entry is not None:
171
- self.force_panel(prev_entry)
172
- else:
173
- self.activesizer[panelidx] = None
174
-
175
- def on_button_next(self, event):
176
- button = event.GetEventObject()
177
- for idx in range(self.panelct):
178
- if self.nextbuttons[idx] == button:
179
- self.next_entry_in_panel(idx)
180
- break
181
- # self.Reposition()
182
- event.Skip()
183
-
184
- def on_button_prev(self, event):
185
- button = event.GetEventObject()
186
- for idx in range(self.panelct):
187
- if self.nextbuttons[idx] == button:
188
- self.prev_entry_in_panel(idx)
189
- break
190
- # self.Reposition()
191
- event.Skip()
192
-
193
- # def debug_me(self):
194
- # for key in self.widgets:
195
- # entry = self.widgets[key]
196
- # print ("%s - Panel=%s Vis=%s" % (key, entry.panelidx, entry.active))
197
-
198
- def Reposition(self, panelidx=None):
199
- """
200
- Draw the panels
201
- """
202
-
203
- # self.debug_me()
204
- if panelidx is None:
205
- targets = range(self.panelct)
206
- else:
207
- targets = (panelidx,)
208
- for pidx in targets:
209
- # print("panel # %d has default: %s" % (pidx, self.activesizer[pidx]))
210
- panelrect = self.GetFieldRect(pidx)
211
- # Establish the amount of 'choosable' sizers
212
- ct = 0
213
- sizer = None
214
- for key in self.widgets:
215
- entry = self.widgets[key]
216
- # print ("%s = %s" %(key, entry) )
217
- if entry.panelidx == pidx:
218
- if entry.active: # The right one and choosable...
219
- ct += 1
220
- if self.activesizer[pidx] is None:
221
- self.activesizer[pidx] = key
222
- if (
223
- self.activesizer[pidx] != key
224
- ): # it's not the default, so hide
225
- entry.Show(False)
226
- else: # not choosable --> hide:
227
- entry.Show(False)
228
- if ct > 1:
229
- # Show Button and reduce available width for sizer
230
- myrect = self.nextbuttons[pidx].GetRect()
231
- myrect.x = panelrect.x + panelrect.width - myrect.width
232
- myrect.y = panelrect.y
233
- self.nextbuttons[pidx].SetRect(myrect)
234
- panelrect.width -= myrect.width
235
- self.nextbuttons[pidx].Show(True)
236
- else:
237
- self.nextbuttons[pidx].Show(False)
238
- if self.activesizer[pidx] is not None:
239
- sizer = self.widgets[self.activesizer[pidx]]
240
- sizer.SetDimension(
241
- panelrect.x, panelrect.y, panelrect.width, panelrect.height
242
- )
243
- sizer.Show(True)
244
- sizer.Layout()
245
- # debug_me()
246
- self.sizeChanged = False
247
-
248
- def OnSize(self, evt):
249
- evt.Skip()
250
- self.Reposition() # for normal size events
251
- self.sizeChanged = True
252
-
253
- def OnIdle(self, evt):
254
- if self.sizeChanged:
255
- self.Reposition()
256
-
257
- def Signal(self, signal, *args):
258
- # Propagate to widgets
259
- for key in self.widgets:
260
- self.widgets[key].Signal(signal, *args)
1
+ import wx
2
+
3
+ from meerk40t.gui.icons import icons8_circled_right
4
+ from meerk40t.gui.wxutils import wxStaticBitmap, dip_size
5
+
6
+ _ = wx.GetTranslation
7
+
8
+
9
+ class CustomStatusBar(wx.StatusBar):
10
+ """
11
+ Overloading of wx.Statusbar to allow some elements on it
12
+ """
13
+
14
+ def __init__(self, parent, panelct):
15
+ # Where shall the different controls be placed?
16
+ self.startup = True
17
+ self.panelct = panelct
18
+ self.context = parent.context
19
+ wx.StatusBar.__init__(self, parent, -1)
20
+ self.context.themes.set_window_colors(self)
21
+ # Make sure that the statusbar elements are visible fully
22
+ size = dip_size(parent, 25, 25)
23
+ self.SetMinHeight(size[0])
24
+ self.SetFieldsCount(self.panelct)
25
+ self.SetStatusStyles([wx.SB_SUNKEN] * self.panelct)
26
+ self.status_text = [""] * self.panelct
27
+ self.sizeChanged = False
28
+ self.widgets = {}
29
+ self.activesizer = [None] * self.panelct
30
+ self.nextbuttons = []
31
+ btn_size = int((size[0] - 3) * self.context.root.bitmap_correction_scale)
32
+
33
+ for __ in range(self.panelct):
34
+ # Linux wxPython has a fundamental flaw in the treatment of
35
+ # small bitmap buttons. It reserves an extent around the
36
+ # bitmap and tries to reduce the size, which leads to a lot of
37
+ # unwanted messages plus some very unwanted X-Windows crash...
38
+ btn = wxStaticBitmap(
39
+ self,
40
+ id=wx.ID_ANY,
41
+ bitmap=icons8_circled_right.GetBitmap(resize=btn_size, buffer=1),
42
+ size=wx.Size(size[0], size[1]),
43
+ # style=wx.BORDER_RAISED,
44
+ )
45
+ # btn.SetBackgroundColour(wx.RED)
46
+ # btn.SetBitmap(icons8_circled_right.GetBitmap(noadjustment=True, color=Color("red")))
47
+ btn.SetToolTip(
48
+ _("Left Click: Move to next panel\nRight Click: Move to previous panel")
49
+ )
50
+ btn.Show(False)
51
+ btn.Bind(wx.EVT_LEFT_DOWN, self.on_button_next)
52
+ btn.Bind(wx.EVT_RIGHT_DOWN, self.on_button_prev)
53
+ self.nextbuttons.append(btn)
54
+ self.Bind(wx.EVT_SIZE, self.OnSize)
55
+ self.Bind(wx.EVT_IDLE, self.OnIdle)
56
+
57
+ # set the initial position of the checkboxes
58
+ self.Reposition()
59
+ self.startup = False
60
+
61
+ @property
62
+ def available_height(self):
63
+ sb_size = self.GetSize()
64
+ return sb_size[1]
65
+
66
+ def Clear(self):
67
+ """
68
+ Resets all panels
69
+ """
70
+ for key in self.widgets:
71
+ widget = self.widgets[key]
72
+ widget.Hide()
73
+ del widget
74
+ for btn in self.nextbuttons:
75
+ btn.Show(False)
76
+ self.widgets = {}
77
+ self.activesizer = [None] * self.panelct
78
+ for idx in range(self.panelct):
79
+ super().SetStatusText(self.status_text[idx], idx)
80
+
81
+ def SetStatusText(self, message="", panel=0):
82
+ if 0 <= panel < self.panelct:
83
+ self.status_text[panel] = message
84
+ # Signal it onwards....
85
+ self.Signal("statusmsg", message, panel)
86
+ if len(self.widgets) == 0:
87
+ super().SetStatusText(message, panel)
88
+ if panel == 0:
89
+ self.SetToolTip(message)
90
+
91
+ def add_panel_widget(self, widget, panel_idx, identifier, visible=True):
92
+ if panel_idx < 0 or panel_idx >= self.panelct:
93
+ return
94
+ # Make sure they belong to me, else the wx.Boxsizer
95
+ # will have wrong information to work with
96
+ widget.GenerateControls(self, panel_idx, identifier, self.context)
97
+ widget.active = visible
98
+ self.widgets[identifier] = widget
99
+
100
+ def activate_panel(self, identifier, newflag, force=False):
101
+ # Activate Panel will make the indicated panel become choosable
102
+ # print ("Activate Panel: %s -> %s" % (identifier, newflag))
103
+ try:
104
+ oldflag = self.widgets[identifier].active
105
+ except (IndexError, KeyError):
106
+ return
107
+ if oldflag != newflag:
108
+ panelidx = self.widgets[identifier].panelidx
109
+
110
+ # Choosable
111
+ self.widgets[identifier].active = newflag
112
+ if newflag and (self.activesizer[panelidx] is None or force):
113
+ self.activesizer[panelidx] = identifier
114
+ elif not newflag and self.activesizer[panelidx] == identifier:
115
+ # Was the active one, so look for an alternative
116
+ self.activesizer[panelidx] = None
117
+ for key in self.widgets:
118
+ entry = self.widgets[key]
119
+ if entry.active and entry.panelidx == panelidx:
120
+ self.activesizer[panelidx] = key
121
+ break
122
+ self.Reposition(panelidx=panelidx)
123
+
124
+ def force_panel(self, identifier):
125
+ # force_panel will make the indicated panel choosable and visible
126
+ try:
127
+ oldflag = self.widgets[identifier].active
128
+ except (IndexError, KeyError):
129
+ return
130
+ if not oldflag:
131
+ # Make it choosable
132
+ self.widgets[identifier].active = True
133
+ panelidx = self.widgets[identifier].panelidx
134
+ self.activesizer[panelidx] = identifier
135
+ self.Reposition(panelidx=panelidx)
136
+
137
+ def next_entry_in_panel(self, panelidx):
138
+ if panelidx < 0 or panelidx >= self.panelct:
139
+ return
140
+ first_entry = None
141
+ next_entry = None
142
+ visible_seen = False
143
+ for key in self.widgets:
144
+ entry = self.widgets[key]
145
+ if entry.panelidx == panelidx and entry.active:
146
+ if key == self.activesizer[panelidx]: # Visible
147
+ visible_seen = True
148
+ else:
149
+ if visible_seen and next_entry is None:
150
+ next_entry = key
151
+ break
152
+ else:
153
+ if first_entry is None:
154
+ first_entry = key
155
+ if next_entry is None:
156
+ next_entry = first_entry
157
+ if next_entry is not None:
158
+ self.force_panel(next_entry)
159
+ else:
160
+ self.activesizer[panelidx] = None
161
+
162
+ def prev_entry_in_panel(self, panelidx):
163
+ if panelidx < 0 or panelidx >= self.panelct:
164
+ return
165
+ last_entry = None
166
+ prev_entry = None
167
+ visible_seen = False
168
+ for key in self.widgets:
169
+ entry = self.widgets[key]
170
+ if entry.panelidx == panelidx and entry.active:
171
+ if key == self.activesizer[panelidx]: # Visible
172
+ visible_seen = True
173
+ elif visible_seen:
174
+ last_entry = key
175
+ else:
176
+ prev_entry = key
177
+ if prev_entry is None:
178
+ prev_entry = last_entry
179
+ if prev_entry is not None:
180
+ self.force_panel(prev_entry)
181
+ else:
182
+ self.activesizer[panelidx] = None
183
+
184
+ def on_button_next(self, event):
185
+ button = event.GetEventObject()
186
+ for idx in range(self.panelct):
187
+ if self.nextbuttons[idx] == button:
188
+ self.next_entry_in_panel(idx)
189
+ break
190
+ # self.Reposition()
191
+ event.Skip()
192
+
193
+ def on_button_prev(self, event):
194
+ button = event.GetEventObject()
195
+ for idx in range(self.panelct):
196
+ if self.nextbuttons[idx] == button:
197
+ self.prev_entry_in_panel(idx)
198
+ break
199
+ # self.Reposition()
200
+ event.Skip()
201
+
202
+ # def debug_me(self):
203
+ # for key in self.widgets:
204
+ # entry = self.widgets[key]
205
+ # print ("%s - Panel=%s Vis=%s" % (key, entry.panelidx, entry.active))
206
+
207
+ def Reposition(self, panelidx=None):
208
+ """
209
+ Draw the panels
210
+ """
211
+
212
+ # self.debug_me()
213
+ if panelidx is None:
214
+ targets = range(self.panelct)
215
+ else:
216
+ targets = (panelidx,)
217
+ for pidx in targets:
218
+ # print("panel # %d has default: %s" % (pidx, self.activesizer[pidx]))
219
+ panelrect = self.GetFieldRect(pidx)
220
+ # Establish the amount of 'choosable' sizers
221
+ ct = 0
222
+ for key in self.widgets:
223
+ entry = self.widgets[key]
224
+ # print ("%s = %s" %(key, entry) )
225
+ if entry.panelidx == pidx:
226
+ if entry.active: # The right one and choosable...
227
+ ct += 1
228
+ if self.activesizer[pidx] is None:
229
+ self.activesizer[pidx] = key
230
+ if (
231
+ self.activesizer[pidx] != key
232
+ ): # it's not the default, so hide
233
+ entry.Show(False)
234
+ else: # not choosable --> hide:
235
+ entry.Show(False)
236
+ if ct > 1:
237
+ # Show Button and reduce available width for sizer
238
+ myrect = self.nextbuttons[pidx].GetRect()
239
+ myrect.x = panelrect.x + panelrect.width - myrect.width
240
+ # Center the rect...
241
+ myrect.y = max(
242
+ panelrect.y,
243
+ int(panelrect.y + panelrect.height / 2 - myrect.height / 2),
244
+ )
245
+ self.nextbuttons[pidx].SetRect(myrect)
246
+ panelrect.width -= myrect.width
247
+ self.nextbuttons[pidx].Show(True)
248
+ else:
249
+ self.nextbuttons[pidx].Show(False)
250
+ if self.activesizer[pidx] is not None:
251
+ sizer = self.widgets[self.activesizer[pidx]]
252
+ sizer.SetDimension(
253
+ panelrect.x, panelrect.y, panelrect.width, panelrect.height
254
+ )
255
+ sizer.Show(True)
256
+ sizer.Layout()
257
+ # debug_me()
258
+ self.sizeChanged = False
259
+
260
+ def OnSize(self, evt):
261
+ evt.Skip()
262
+ self.Reposition() # for normal size events
263
+ self.sizeChanged = True
264
+
265
+ def OnIdle(self, evt):
266
+ if self.sizeChanged:
267
+ self.Reposition()
268
+
269
+ def Signal(self, signal, *args):
270
+ # Propagate to widgets
271
+ for key in self.widgets:
272
+ self.widgets[key].Signal(signal, *args)