meerk40t 0.9.7030__py2.py3-none-any.whl → 0.9.7040__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 (79) hide show
  1. meerk40t/balormk/clone_loader.py +3 -2
  2. meerk40t/balormk/controller.py +28 -11
  3. meerk40t/balormk/cylindermod.py +1 -0
  4. meerk40t/balormk/device.py +13 -9
  5. meerk40t/balormk/driver.py +9 -2
  6. meerk40t/balormk/galvo_commands.py +3 -1
  7. meerk40t/balormk/gui/gui.py +6 -0
  8. meerk40t/balormk/livelightjob.py +338 -321
  9. meerk40t/balormk/mock_connection.py +4 -3
  10. meerk40t/balormk/usb_connection.py +11 -2
  11. meerk40t/camera/camera.py +19 -14
  12. meerk40t/camera/gui/camerapanel.py +6 -0
  13. meerk40t/core/cutplan.py +109 -51
  14. meerk40t/core/elements/element_treeops.py +435 -140
  15. meerk40t/core/elements/elements.py +100 -9
  16. meerk40t/core/elements/shapes.py +259 -39
  17. meerk40t/core/elements/tree_commands.py +10 -5
  18. meerk40t/core/node/elem_ellipse.py +18 -8
  19. meerk40t/core/node/elem_image.py +51 -19
  20. meerk40t/core/node/elem_line.py +18 -8
  21. meerk40t/core/node/elem_path.py +18 -8
  22. meerk40t/core/node/elem_point.py +10 -4
  23. meerk40t/core/node/elem_polyline.py +19 -11
  24. meerk40t/core/node/elem_rect.py +18 -8
  25. meerk40t/core/node/elem_text.py +11 -5
  26. meerk40t/core/node/filenode.py +2 -8
  27. meerk40t/core/node/groupnode.py +11 -11
  28. meerk40t/core/node/image_processed.py +11 -5
  29. meerk40t/core/node/image_raster.py +11 -5
  30. meerk40t/core/node/node.py +64 -16
  31. meerk40t/core/node/refnode.py +2 -1
  32. meerk40t/core/svg_io.py +91 -34
  33. meerk40t/device/dummydevice.py +7 -1
  34. meerk40t/extra/vtracer.py +222 -0
  35. meerk40t/grbl/device.py +81 -8
  36. meerk40t/gui/about.py +20 -0
  37. meerk40t/gui/devicepanel.py +20 -16
  38. meerk40t/gui/gui_mixins.py +4 -0
  39. meerk40t/gui/icons.py +330 -253
  40. meerk40t/gui/laserpanel.py +8 -3
  41. meerk40t/gui/laserrender.py +41 -21
  42. meerk40t/gui/magnetoptions.py +158 -65
  43. meerk40t/gui/materialtest.py +229 -39
  44. meerk40t/gui/navigationpanels.py +229 -24
  45. meerk40t/gui/propertypanels/hatchproperty.py +2 -0
  46. meerk40t/gui/propertypanels/imageproperty.py +160 -106
  47. meerk40t/gui/ribbon.py +6 -1
  48. meerk40t/gui/scenewidgets/gridwidget.py +29 -32
  49. meerk40t/gui/scenewidgets/rectselectwidget.py +190 -192
  50. meerk40t/gui/simulation.py +75 -77
  51. meerk40t/gui/statusbarwidgets/defaultoperations.py +84 -48
  52. meerk40t/gui/statusbarwidgets/infowidget.py +2 -2
  53. meerk40t/gui/tips.py +15 -1
  54. meerk40t/gui/toolwidgets/toolpointmove.py +3 -1
  55. meerk40t/gui/wxmmain.py +242 -114
  56. meerk40t/gui/wxmscene.py +107 -24
  57. meerk40t/gui/wxmtree.py +4 -2
  58. meerk40t/gui/wxutils.py +60 -15
  59. meerk40t/image/imagetools.py +129 -65
  60. meerk40t/internal_plugins.py +4 -0
  61. meerk40t/kernel/kernel.py +39 -18
  62. meerk40t/kernel/settings.py +28 -9
  63. meerk40t/lihuiyu/device.py +24 -12
  64. meerk40t/main.py +1 -1
  65. meerk40t/moshi/device.py +20 -6
  66. meerk40t/network/console_server.py +22 -6
  67. meerk40t/newly/device.py +10 -3
  68. meerk40t/newly/gui/gui.py +10 -0
  69. meerk40t/ruida/device.py +22 -2
  70. meerk40t/ruida/loader.py +6 -3
  71. meerk40t/tools/geomstr.py +193 -125
  72. meerk40t/tools/rasterplotter.py +179 -93
  73. {meerk40t-0.9.7030.dist-info → meerk40t-0.9.7040.dist-info}/METADATA +1 -1
  74. {meerk40t-0.9.7030.dist-info → meerk40t-0.9.7040.dist-info}/RECORD +79 -78
  75. {meerk40t-0.9.7030.dist-info → meerk40t-0.9.7040.dist-info}/LICENSE +0 -0
  76. {meerk40t-0.9.7030.dist-info → meerk40t-0.9.7040.dist-info}/WHEEL +0 -0
  77. {meerk40t-0.9.7030.dist-info → meerk40t-0.9.7040.dist-info}/entry_points.txt +0 -0
  78. {meerk40t-0.9.7030.dist-info → meerk40t-0.9.7040.dist-info}/top_level.txt +0 -0
  79. {meerk40t-0.9.7030.dist-info → meerk40t-0.9.7040.dist-info}/zip-safe +0 -0
@@ -5,21 +5,21 @@ Registers the Device service for M2 Nano (and family), registering the relevant
5
5
  the given device type.
6
6
  """
7
7
 
8
- from hashlib import md5
9
8
  import platform
9
+ from hashlib import md5
10
10
 
11
11
  import meerk40t.constants as mkconst
12
12
  from meerk40t.core.laserjob import LaserJob
13
13
  from meerk40t.core.spoolers import Spooler
14
+ from meerk40t.core.units import UNITS_PER_MIL, Length
14
15
  from meerk40t.core.view import View
16
+ from meerk40t.device.devicechoices import get_effect_choices
17
+ from meerk40t.device.mixins import Status
15
18
  from meerk40t.kernel import CommandSyntaxError, Service, signal_listener
16
19
 
17
- from meerk40t.core.units import UNITS_PER_MIL, Length
18
- from meerk40t.device.mixins import Status
19
20
  from .controller import LihuiyuController
20
21
  from .driver import LihuiyuDriver
21
22
  from .tcp_connection import TCPOutput
22
- from meerk40t.device.devicechoices import get_effect_choices
23
23
 
24
24
 
25
25
  class LihuiyuDevice(Service, Status):
@@ -149,9 +149,7 @@ class LihuiyuDevice(Service, Status):
149
149
  "label": _("Board"),
150
150
  "style": "combosmall",
151
151
  "choices": ["M2", "M3", "B2", "M", "M1", "A", "B", "B1"],
152
- "tip": _(
153
- "Select the board to use. This affects the speedcodes used."
154
- ),
152
+ "tip": _("Select the board to use. This affects the speedcodes used."),
155
153
  "section": "_10_" + _("Configuration"),
156
154
  "subsection": _("Board Setup"),
157
155
  },
@@ -374,8 +372,13 @@ class LihuiyuDevice(Service, Status):
374
372
  "type": bool,
375
373
  "label": _("Use legacy raster method"),
376
374
  "tip": (
377
- _("Active: Use legacy method (seems to work better at higher speeds, but has some artifacts)") + "\n" +
378
- _("Inactive: Use regular method (no artifacts but apparently more prone to stuttering at high speeds)")
375
+ _(
376
+ "Active: Use legacy method (seems to work better at higher speeds, but has some artifacts)"
377
+ )
378
+ + "\n"
379
+ + _(
380
+ "Inactive: Use regular method (no artifacts but apparently more prone to stuttering at high speeds)"
381
+ )
379
382
  ),
380
383
  "section": "_00_" + _("General Options"),
381
384
  "subsection": "_20_",
@@ -1022,10 +1025,12 @@ class LihuiyuDevice(Service, Status):
1022
1025
  return {
1023
1026
  "split_crossover": True,
1024
1027
  "unsupported_opt": (
1025
- mkconst.RASTER_GREEDY_H, mkconst.RASTER_GREEDY_V, mkconst.RASTER_SPIRAL,
1028
+ mkconst.RASTER_GREEDY_H,
1029
+ mkconst.RASTER_GREEDY_V,
1030
+ mkconst.RASTER_SPIRAL,
1026
1031
  ), # Greedy loses registration way too often to be reliable
1027
- "gantry" : True,
1028
- "legacy" : self.legacy_raster,
1032
+ "gantry": True,
1033
+ "legacy": self.legacy_raster,
1029
1034
  }
1030
1035
 
1031
1036
  @property
@@ -1185,3 +1190,10 @@ class LihuiyuDevice(Service, Status):
1185
1190
 
1186
1191
  def cool_helper(self, choice_dict):
1187
1192
  self.kernel.root.coolant.coolant_choice_helper(self)(choice_dict)
1193
+
1194
+ def location(self):
1195
+ if self.mock:
1196
+ return "mock"
1197
+ if self.networked:
1198
+ return f"tcp {self.address}:{self.port}"
1199
+ return f"usb {'auto' if self.usb_index < 0 else self.usb_index}"
meerk40t/main.py CHANGED
@@ -11,7 +11,7 @@ import os.path
11
11
  import sys
12
12
 
13
13
  APPLICATION_NAME = "MeerK40t"
14
- APPLICATION_VERSION = "0.9.7030"
14
+ APPLICATION_VERSION = "0.9.7040"
15
15
 
16
16
  if not getattr(sys, "frozen", False):
17
17
  # If .git directory does not exist we are running from a package like pypi
meerk40t/moshi/device.py CHANGED
@@ -7,6 +7,7 @@ Registers relevant commands and options.
7
7
  """
8
8
  import meerk40t.constants as mkconst
9
9
  from meerk40t.core.view import View
10
+ from meerk40t.device.devicechoices import get_effect_choices
10
11
  from meerk40t.kernel import CommandSyntaxError, Service, signal_listener
11
12
 
12
13
  from ..core.laserjob import LaserJob
@@ -15,7 +16,6 @@ from ..core.units import Length
15
16
  from ..device.mixins import Status
16
17
  from .controller import MoshiController
17
18
  from .driver import MoshiDriver
18
- from meerk40t.device.devicechoices import get_effect_choices
19
19
 
20
20
 
21
21
  class MoshiDevice(Service, Status):
@@ -210,8 +210,13 @@ class MoshiDevice(Service, Status):
210
210
  "type": bool,
211
211
  "label": _("Use legacy raster method"),
212
212
  "tip": (
213
- _("Active: Use legacy method (seems to work better at higher speeds, but has some artifacts)") + "\n" +
214
- _("Inactive: Use regular method (no artifacts but apparently more prone to stuttering at high speeds)")
213
+ _(
214
+ "Active: Use legacy method (seems to work better at higher speeds, but has some artifacts)"
215
+ )
216
+ + "\n"
217
+ + _(
218
+ "Inactive: Use regular method (no artifacts but apparently more prone to stuttering at high speeds)"
219
+ )
215
220
  ),
216
221
  "section": "_20_Behaviour",
217
222
  },
@@ -485,11 +490,20 @@ class MoshiDevice(Service, Status):
485
490
  return {
486
491
  "split_crossover": True,
487
492
  "unsupported_opt": (
488
- mkconst.RASTER_GREEDY_H, mkconst.RASTER_GREEDY_V, mkconst.RASTER_SPIRAL,
493
+ mkconst.RASTER_GREEDY_H,
494
+ mkconst.RASTER_GREEDY_V,
495
+ mkconst.RASTER_SPIRAL,
489
496
  ), # Greedy loses registration way too often to be reliable
490
- "gantry" : True,
491
- "legacy" : self.legacy_raster,
497
+ "gantry": True,
498
+ "legacy": self.legacy_raster,
492
499
  }
493
500
 
494
501
  def cool_helper(self, choice_dict):
495
502
  self.kernel.root.coolant.coolant_choice_helper(self)(choice_dict)
503
+
504
+ def location(self):
505
+ return (
506
+ "mock"
507
+ if self.mock
508
+ else f"usb {'auto' if self.usb_index < 0 else self.usb_index}"
509
+ )
@@ -12,6 +12,13 @@ def plugin(kernel, lifecycle=None):
12
12
  action="store_true",
13
13
  help=_("do not watch server channels"),
14
14
  )
15
+ @kernel.console_option(
16
+ "suppress",
17
+ "u",
18
+ type=bool,
19
+ action="store_true",
20
+ help=_("suppress input prompt '>>'"),
21
+ )
15
22
  @kernel.console_option(
16
23
  "quit",
17
24
  "q",
@@ -23,8 +30,18 @@ def plugin(kernel, lifecycle=None):
23
30
  "consoleserver", help=_("starts a console_server on port 23 (telnet)")
24
31
  )
25
32
  def server_console(
26
- command, channel, _, port=23, silent=False, quit=False, **kwargs
33
+ command,
34
+ channel,
35
+ _,
36
+ port=23,
37
+ silent=False,
38
+ quit=False,
39
+ suppress=False,
40
+ **kwargs,
27
41
  ):
42
+ if suppress is None:
43
+ suppress = False
44
+ kernel.show_aio_prompt = not suppress
28
45
  root = kernel.root
29
46
  # Variable to store input
30
47
  root.__console_buffer = ""
@@ -42,9 +59,9 @@ def plugin(kernel, lifecycle=None):
42
59
  except (OSError, ValueError):
43
60
  channel(_("Server failed on port: {port}").format(port=port))
44
61
  return
45
-
62
+
46
63
  def exec_command(data: str) -> None:
47
- # We are in a different thread, so let's hand over stuff to the gui
64
+ # We are in a different thread, so let's hand over stuff to the gui
48
65
  if isinstance(data, bytes):
49
66
  try:
50
67
  data = data.decode()
@@ -60,7 +77,7 @@ def plugin(kernel, lifecycle=None):
60
77
  # No: we can split the command
61
78
  quotations = data.count('"', 0, idx)
62
79
  if quotations % 2 == 0:
63
- data = data[:idx].rstrip() + "\n" + data[idx+1:].lstrip()
80
+ data = data[:idx].rstrip() + "\n" + data[idx + 1 :].lstrip()
64
81
  start = idx + 1
65
82
  root.__console_buffer += data
66
83
  while "\n" in root.__console_buffer:
@@ -76,7 +93,7 @@ def plugin(kernel, lifecycle=None):
76
93
  for result in root.find("gui/handover"):
77
94
  # Do we have a thread handover routine?
78
95
  if result is not None:
79
- handover, _path, suffix_path = result
96
+ handover, _path, suffix_path = result
80
97
  break
81
98
  recv.watch(exec_command)
82
99
 
@@ -93,7 +110,6 @@ def plugin(kernel, lifecycle=None):
93
110
  console.watch(send)
94
111
  server.events_channel.watch(console)
95
112
 
96
-
97
113
  @kernel.console_option(
98
114
  "port", "p", type=int, default=2080, help=_("port to listen on.")
99
115
  )
meerk40t/newly/device.py CHANGED
@@ -5,10 +5,10 @@ from meerk40t.core.laserjob import LaserJob
5
5
  from meerk40t.core.spoolers import Spooler
6
6
  from meerk40t.core.units import Length
7
7
  from meerk40t.core.view import View
8
+ from meerk40t.device.devicechoices import get_effect_choices
8
9
  from meerk40t.device.mixins import Status
9
10
  from meerk40t.kernel import CommandSyntaxError, Service, signal_listener
10
11
  from meerk40t.newly.driver import NewlyDriver
11
- from meerk40t.device.devicechoices import get_effect_choices
12
12
 
13
13
 
14
14
  class NewlyDevice(Service, Status):
@@ -757,12 +757,16 @@ class NewlyDevice(Service, Status):
757
757
  help=_("Sets the default file index to use"),
758
758
  all_arguments_required=True,
759
759
  )
760
- def set_file_index(command, channel, _, file_index=None, data=None, remainder=None, **kwgs):
760
+ def set_file_index(
761
+ command, channel, _, file_index=None, data=None, remainder=None, **kwgs
762
+ ):
761
763
  old_value = self.file_index
762
764
  if file_index is None or file_index < 0 or file_index >= 10:
763
765
  file_index = 0
764
766
  self.file_index = file_index
765
- channel(f"File index was set to #{file_index} (previous value: {old_value})")
767
+ channel(
768
+ f"File index was set to #{file_index} (previous value: {old_value})"
769
+ )
766
770
  # Let propertypanels know that this value was updated
767
771
  self.signal("file_index", file_index, self)
768
772
 
@@ -856,6 +860,9 @@ class NewlyDevice(Service, Status):
856
860
  )
857
861
  self.signal("view;realized")
858
862
 
863
+ def location(self):
864
+ return "mock" if self.mock else "usb"
865
+
859
866
  @property
860
867
  def current(self):
861
868
  """
meerk40t/newly/gui/gui.py CHANGED
@@ -78,6 +78,7 @@ def plugin(service, lifecycle):
78
78
  "tip": _("File {index}").format(index=0),
79
79
  "help": "devicenewly",
80
80
  "action": lambda v: service("select_file 0\n"),
81
+ "multi_autoexec": True,
81
82
  },
82
83
  {
83
84
  "identifier": 1,
@@ -85,6 +86,7 @@ def plugin(service, lifecycle):
85
86
  "tip": _("File {index}").format(index=1),
86
87
  "help": "devicenewly",
87
88
  "action": lambda v: service("select_file 1\n"),
89
+ "multi_autoexec": True,
88
90
  },
89
91
  {
90
92
  "identifier": 2,
@@ -92,6 +94,7 @@ def plugin(service, lifecycle):
92
94
  "tip": _("File {index}").format(index=2),
93
95
  "help": "devicenewly",
94
96
  "action": lambda v: service("select_file 2\n"),
97
+ "multi_autoexec": True,
95
98
  },
96
99
  {
97
100
  "identifier": 3,
@@ -99,6 +102,7 @@ def plugin(service, lifecycle):
99
102
  "tip": _("File {index}").format(index=3),
100
103
  "help": "devicenewly",
101
104
  "action": lambda v: service("select_file 3\n"),
105
+ "multi_autoexec": True,
102
106
  },
103
107
  {
104
108
  "identifier": 4,
@@ -106,6 +110,7 @@ def plugin(service, lifecycle):
106
110
  "tip": _("File {index}").format(index=4),
107
111
  "help": "devicenewly",
108
112
  "action": lambda v: service("select_file 4\n"),
113
+ "multi_autoexec": True,
109
114
  },
110
115
  {
111
116
  "identifier": 5,
@@ -113,6 +118,7 @@ def plugin(service, lifecycle):
113
118
  "tip": _("File {index}").format(index=5),
114
119
  "help": "devicenewly",
115
120
  "action": lambda v: service("select_file 5\n"),
121
+ "multi_autoexec": True,
116
122
  },
117
123
  {
118
124
  "identifier": 6,
@@ -120,6 +126,7 @@ def plugin(service, lifecycle):
120
126
  "tip": _("File {index}").format(index=6),
121
127
  "help": "devicenewly",
122
128
  "action": lambda v: service("select_file 6\n"),
129
+ "multi_autoexec": True,
123
130
  },
124
131
  {
125
132
  "identifier": 7,
@@ -127,6 +134,7 @@ def plugin(service, lifecycle):
127
134
  "tip": _("File {index}").format(index=7),
128
135
  "help": "devicenewly",
129
136
  "action": lambda v: service("select_file 7\n"),
137
+ "multi_autoexec": True,
130
138
  },
131
139
  {
132
140
  "identifier": 8,
@@ -134,6 +142,7 @@ def plugin(service, lifecycle):
134
142
  "tip": _("File {index}").format(index=8),
135
143
  "help": "devicenewly",
136
144
  "action": lambda v: service("select_file 8\n"),
145
+ "multi_autoexec": True,
137
146
  },
138
147
  {
139
148
  "identifier": 9,
@@ -141,6 +150,7 @@ def plugin(service, lifecycle):
141
150
  "tip": _("File {index}").format(index=9),
142
151
  "help": "devicenewly",
143
152
  "action": lambda v: service("select_file 9\n"),
153
+ "multi_autoexec": True,
144
154
  },
145
155
  ],
146
156
  },
meerk40t/ruida/device.py CHANGED
@@ -5,6 +5,7 @@ Ruida device interfacing. We do not send or interpret ruida code, but we can emu
5
5
  ruida files (*.rd) and turn them likewise into cutcode.
6
6
  """
7
7
  from meerk40t.core.view import View
8
+ from meerk40t.device.devicechoices import get_effect_choices
8
9
  from meerk40t.kernel import CommandSyntaxError, Service, signal_listener
9
10
 
10
11
  from ..core.laserjob import LaserJob
@@ -16,7 +17,6 @@ from .mock_connection import MockConnection
16
17
  from .serial_connection import SerialConnection
17
18
  from .tcp_connection import TCPConnection
18
19
  from .udp_connection import UDPConnection
19
- from meerk40t.device.devicechoices import get_effect_choices
20
20
 
21
21
 
22
22
  class RuidaDevice(Service):
@@ -264,6 +264,7 @@ class RuidaDevice(Service):
264
264
  choice_dict["display"] = ["pyserial-not-installed"]
265
265
 
266
266
  from platform import system
267
+
267
268
  is_linux = system() == "Linux"
268
269
 
269
270
  choices = [
@@ -278,7 +279,7 @@ class RuidaDevice(Service):
278
279
  "section": "_10_Serial Interface",
279
280
  "subsection": "_00_",
280
281
  "dynamic": update,
281
- "exclusive": not is_linux,
282
+ "exclusive": not is_linux,
282
283
  },
283
284
  {
284
285
  "attr": "baud_rate",
@@ -581,6 +582,25 @@ class RuidaDevice(Service):
581
582
  name = self.label.replace(" ", "-")
582
583
  return name.replace("/", "-")
583
584
 
585
+ @property
586
+ def tcp_address(self):
587
+ return self.address
588
+
589
+ @property
590
+ def tcp_port(self):
591
+ return 5005
592
+
593
+ def location(self):
594
+ if self.interface == "mock":
595
+ return "mock"
596
+ elif self.interface == "udp":
597
+ return "udp, port 40200"
598
+ elif self.interface == "tcp":
599
+ return f"tcp {self.tcp_address}:{self.tcp_port}"
600
+ elif self.interface == "usb":
601
+ return f"usb: {self.serial_port}"
602
+ return f"undefined {self.interface}"
603
+
584
604
  @property
585
605
  def has_endstops(self):
586
606
  return True
meerk40t/ruida/loader.py CHANGED
@@ -26,10 +26,13 @@ def command_viewer(data, data_type):
26
26
 
27
27
  job = RDJob()
28
28
  job.write_blob(data)
29
- commands = list()
29
+ commands = []
30
30
  job.channel = commands.append
31
- while not job.execute(None):
32
- pass
31
+ try:
32
+ while not job.execute(None):
33
+ pass
34
+ except Exception as e:
35
+ commands.append(f"!! Error !!: {e}")
33
36
  return "\n".join(commands)
34
37
 
35
38