meerk40t 0.9.2000__py2.py3-none-any.whl → 0.9.3001__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 (187) hide show
  1. meerk40t/balormk/balor_params.py +1 -43
  2. meerk40t/balormk/controller.py +1 -41
  3. meerk40t/balormk/device.py +16 -22
  4. meerk40t/balormk/driver.py +4 -4
  5. meerk40t/balormk/gui/balorconfig.py +2 -2
  6. meerk40t/balormk/gui/balorcontroller.py +13 -5
  7. meerk40t/balormk/gui/baloroperationproperties.py +0 -46
  8. meerk40t/balormk/gui/gui.py +17 -17
  9. meerk40t/camera/gui/camerapanel.py +18 -11
  10. meerk40t/core/cutcode/rastercut.py +3 -1
  11. meerk40t/core/cutplan.py +145 -14
  12. meerk40t/core/elements/clipboard.py +18 -9
  13. meerk40t/core/elements/element_treeops.py +320 -180
  14. meerk40t/core/elements/element_types.py +7 -2
  15. meerk40t/core/elements/elements.py +53 -27
  16. meerk40t/core/elements/geometry.py +8 -0
  17. meerk40t/core/elements/offset_clpr.py +129 -4
  18. meerk40t/core/elements/offset_mk.py +3 -1
  19. meerk40t/core/elements/shapes.py +28 -25
  20. meerk40t/core/laserjob.py +7 -0
  21. meerk40t/core/node/bootstrap.py +4 -0
  22. meerk40t/core/node/effect_hatch.py +85 -96
  23. meerk40t/core/node/effect_wobble.py +309 -0
  24. meerk40t/core/node/elem_image.py +49 -19
  25. meerk40t/core/node/elem_line.py +60 -0
  26. meerk40t/core/node/elem_rect.py +5 -3
  27. meerk40t/core/node/image_processed.py +766 -0
  28. meerk40t/core/node/image_raster.py +113 -0
  29. meerk40t/core/node/node.py +120 -1
  30. meerk40t/core/node/op_cut.py +2 -8
  31. meerk40t/core/node/op_dots.py +0 -8
  32. meerk40t/core/node/op_engrave.py +2 -18
  33. meerk40t/core/node/op_image.py +22 -35
  34. meerk40t/core/node/op_raster.py +0 -9
  35. meerk40t/core/planner.py +32 -2
  36. meerk40t/core/svg_io.py +699 -461
  37. meerk40t/core/treeop.py +191 -0
  38. meerk40t/core/undos.py +15 -1
  39. meerk40t/core/units.py +14 -4
  40. meerk40t/device/dummydevice.py +3 -2
  41. meerk40t/device/gui/defaultactions.py +43 -55
  42. meerk40t/device/gui/formatterpanel.py +58 -49
  43. meerk40t/device/gui/warningpanel.py +12 -12
  44. meerk40t/device/mixins.py +13 -0
  45. meerk40t/dxf/dxf_io.py +9 -5
  46. meerk40t/extra/ezd.py +28 -26
  47. meerk40t/extra/imageactions.py +300 -308
  48. meerk40t/extra/lbrn.py +19 -2
  49. meerk40t/fill/fills.py +6 -6
  50. meerk40t/fill/patternfill.py +1061 -1061
  51. meerk40t/fill/patterns.py +2 -6
  52. meerk40t/grbl/controller.py +168 -52
  53. meerk40t/grbl/device.py +23 -18
  54. meerk40t/grbl/driver.py +39 -0
  55. meerk40t/grbl/emulator.py +79 -19
  56. meerk40t/grbl/gcodejob.py +10 -0
  57. meerk40t/grbl/gui/grblconfiguration.py +2 -2
  58. meerk40t/grbl/gui/grblcontroller.py +24 -8
  59. meerk40t/grbl/gui/grblhardwareconfig.py +153 -0
  60. meerk40t/grbl/gui/gui.py +17 -14
  61. meerk40t/grbl/mock_connection.py +15 -34
  62. meerk40t/grbl/plugin.py +0 -4
  63. meerk40t/grbl/serial_connection.py +2 -1
  64. meerk40t/gui/about.py +8 -5
  65. meerk40t/gui/alignment.py +10 -6
  66. meerk40t/gui/basicops.py +27 -17
  67. meerk40t/gui/bufferview.py +2 -2
  68. meerk40t/gui/choicepropertypanel.py +101 -13
  69. meerk40t/gui/consolepanel.py +12 -9
  70. meerk40t/gui/devicepanel.py +38 -25
  71. meerk40t/gui/executejob.py +6 -4
  72. meerk40t/gui/help_assets/help_assets.py +13 -10
  73. meerk40t/gui/hersheymanager.py +8 -6
  74. meerk40t/gui/icons.py +1951 -3065
  75. meerk40t/gui/imagesplitter.py +14 -7
  76. meerk40t/gui/keymap.py +3 -3
  77. meerk40t/gui/laserpanel.py +151 -84
  78. meerk40t/gui/laserrender.py +61 -70
  79. meerk40t/gui/lasertoolpanel.py +8 -7
  80. meerk40t/gui/materialtest.py +3 -3
  81. meerk40t/gui/mkdebug.py +254 -1
  82. meerk40t/gui/navigationpanels.py +321 -180
  83. meerk40t/gui/notes.py +3 -3
  84. meerk40t/gui/opassignment.py +12 -12
  85. meerk40t/gui/operation_info.py +13 -13
  86. meerk40t/gui/plugin.py +5 -0
  87. meerk40t/gui/position.py +20 -18
  88. meerk40t/gui/preferences.py +21 -6
  89. meerk40t/gui/propertypanels/attributes.py +70 -22
  90. meerk40t/gui/propertypanels/blobproperty.py +2 -2
  91. meerk40t/gui/propertypanels/consoleproperty.py +2 -2
  92. meerk40t/gui/propertypanels/groupproperties.py +3 -3
  93. meerk40t/gui/propertypanels/hatchproperty.py +11 -18
  94. meerk40t/gui/propertypanels/imageproperty.py +4 -3
  95. meerk40t/gui/propertypanels/opbranchproperties.py +1 -1
  96. meerk40t/gui/propertypanels/pathproperty.py +2 -2
  97. meerk40t/gui/propertypanels/pointproperty.py +2 -2
  98. meerk40t/gui/propertypanels/propertywindow.py +4 -4
  99. meerk40t/gui/propertypanels/textproperty.py +3 -3
  100. meerk40t/gui/propertypanels/wobbleproperty.py +204 -0
  101. meerk40t/gui/ribbon.py +367 -259
  102. meerk40t/gui/scene/scene.py +31 -5
  103. meerk40t/gui/scenewidgets/elementswidget.py +12 -4
  104. meerk40t/gui/scenewidgets/gridwidget.py +2 -2
  105. meerk40t/gui/scenewidgets/laserpathwidget.py +7 -2
  106. meerk40t/gui/scenewidgets/machineoriginwidget.py +6 -2
  107. meerk40t/gui/scenewidgets/relocatewidget.py +1 -1
  108. meerk40t/gui/scenewidgets/reticlewidget.py +9 -0
  109. meerk40t/gui/scenewidgets/selectionwidget.py +12 -7
  110. meerk40t/gui/simpleui.py +95 -8
  111. meerk40t/gui/simulation.py +44 -36
  112. meerk40t/gui/spoolerpanel.py +124 -26
  113. meerk40t/gui/statusbarwidgets/defaultoperations.py +18 -6
  114. meerk40t/gui/statusbarwidgets/infowidget.py +2 -2
  115. meerk40t/gui/statusbarwidgets/opassignwidget.py +12 -12
  116. meerk40t/gui/statusbarwidgets/shapepropwidget.py +45 -18
  117. meerk40t/gui/statusbarwidgets/statusbar.py +11 -4
  118. meerk40t/gui/themes.py +78 -0
  119. meerk40t/gui/toolwidgets/toolcircle.py +2 -1
  120. meerk40t/gui/toolwidgets/toolellipse.py +2 -1
  121. meerk40t/gui/toolwidgets/toolimagecut.py +132 -0
  122. meerk40t/gui/toolwidgets/toolline.py +144 -0
  123. meerk40t/gui/toolwidgets/toolnodeedit.py +72 -145
  124. meerk40t/gui/toolwidgets/toolpoint.py +1 -1
  125. meerk40t/gui/toolwidgets/toolpolygon.py +8 -55
  126. meerk40t/gui/toolwidgets/toolrect.py +2 -1
  127. meerk40t/gui/usbconnect.py +2 -2
  128. meerk40t/gui/utilitywidgets/cyclocycloidwidget.py +2 -2
  129. meerk40t/gui/utilitywidgets/harmonograph.py +7 -7
  130. meerk40t/gui/utilitywidgets/scalewidget.py +1 -1
  131. meerk40t/gui/wordlisteditor.py +33 -18
  132. meerk40t/gui/wxmeerk40t.py +166 -66
  133. meerk40t/gui/wxmmain.py +236 -157
  134. meerk40t/gui/wxmribbon.py +49 -25
  135. meerk40t/gui/wxmscene.py +49 -38
  136. meerk40t/gui/wxmtree.py +216 -85
  137. meerk40t/gui/wxutils.py +62 -4
  138. meerk40t/image/imagetools.py +443 -15
  139. meerk40t/internal_plugins.py +2 -10
  140. meerk40t/kernel/kernel.py +12 -4
  141. meerk40t/lihuiyu/controller.py +7 -7
  142. meerk40t/lihuiyu/device.py +3 -1
  143. meerk40t/lihuiyu/driver.py +3 -0
  144. meerk40t/lihuiyu/gui/gui.py +8 -8
  145. meerk40t/lihuiyu/gui/lhyaccelgui.py +2 -2
  146. meerk40t/lihuiyu/gui/lhycontrollergui.py +73 -27
  147. meerk40t/lihuiyu/gui/lhydrivergui.py +2 -2
  148. meerk40t/lihuiyu/gui/tcpcontroller.py +22 -9
  149. meerk40t/main.py +6 -1
  150. meerk40t/moshi/controller.py +5 -5
  151. meerk40t/moshi/device.py +5 -2
  152. meerk40t/moshi/driver.py +4 -0
  153. meerk40t/moshi/gui/gui.py +8 -8
  154. meerk40t/moshi/gui/moshicontrollergui.py +24 -8
  155. meerk40t/moshi/gui/moshidrivergui.py +2 -2
  156. meerk40t/newly/controller.py +2 -0
  157. meerk40t/newly/device.py +9 -2
  158. meerk40t/newly/driver.py +4 -0
  159. meerk40t/newly/gui/gui.py +16 -17
  160. meerk40t/newly/gui/newlyconfig.py +2 -2
  161. meerk40t/newly/gui/newlycontroller.py +13 -5
  162. meerk40t/rotary/gui/gui.py +2 -2
  163. meerk40t/rotary/gui/rotarysettings.py +2 -2
  164. meerk40t/ruida/device.py +3 -0
  165. meerk40t/ruida/driver.py +4 -0
  166. meerk40t/ruida/gui/gui.py +6 -6
  167. meerk40t/ruida/gui/ruidaconfig.py +2 -2
  168. meerk40t/ruida/gui/ruidacontroller.py +13 -5
  169. meerk40t/svgelements.py +9 -9
  170. meerk40t/tools/geomstr.py +849 -153
  171. meerk40t/tools/kerftest.py +8 -4
  172. meerk40t/tools/livinghinges.py +15 -8
  173. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/METADATA +21 -16
  174. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/RECORD +185 -177
  175. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/entry_points.txt +0 -1
  176. test/test_core_elements.py +8 -24
  177. test/test_file_svg.py +88 -0
  178. test/test_fill.py +9 -9
  179. test/test_geomstr.py +258 -8
  180. test/test_kernel.py +4 -0
  181. test/test_tools_rasterplotter.py +29 -0
  182. meerk40t/extra/embroider.py +0 -56
  183. meerk40t/extra/pathoptimize.py +0 -249
  184. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/LICENSE +0 -0
  185. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/WHEEL +0 -0
  186. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/top_level.txt +0 -0
  187. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/zip-safe +0 -0
@@ -1,6 +1,11 @@
1
1
  import wx
2
2
 
3
- from meerk40t.gui.icons import STD_ICON_SIZE, icons8_keyhole_50, icons8_split_table_50
3
+ from meerk40t.gui.icons import (
4
+ STD_ICON_SIZE,
5
+ get_default_icon_size,
6
+ icon_keyhole,
7
+ icon_split_image,
8
+ )
4
9
  from meerk40t.gui.mwindow import MWindow
5
10
  from meerk40t.gui.wxutils import StaticBoxSizer, TextCtrl, dip_size
6
11
  from meerk40t.kernel import signal_listener
@@ -163,7 +168,7 @@ class SplitterPanel(wx.Panel):
163
168
  self.lbl_info = wx.StaticText(self, wx.ID_ANY, "")
164
169
  self.btn_align = wx.Button(self, wx.ID_ANY, _("Create split images"))
165
170
  self.btn_align.SetBitmap(
166
- icons8_split_table_50.GetBitmap(resize=STD_ICON_SIZE / 2)
171
+ icon_split_image.GetBitmap(resize=0.5 * get_default_icon_size())
167
172
  )
168
173
 
169
174
  lbl_dpi = wx.StaticText(self, wx.ID_ANY, "DPI:")
@@ -303,7 +308,9 @@ class KeyholePanel(wx.Panel):
303
308
  self.info_panel = InfoPanel(self, wx.ID_ANY, context=self.context)
304
309
 
305
310
  self.btn_align = wx.Button(self, wx.ID_ANY, _("Create keyhole image"))
306
- self.btn_align.SetBitmap(icons8_keyhole_50.GetBitmap(resize=STD_ICON_SIZE / 2))
311
+ self.btn_align.SetBitmap(
312
+ icon_keyhole.GetBitmap(resize=0.5 * get_default_icon_size())
313
+ )
307
314
 
308
315
  lbl_dpi = wx.StaticText(self, wx.ID_ANY, "DPI:")
309
316
  sizer_dpi = StaticBoxSizer(
@@ -385,11 +392,11 @@ class KeyholePanel(wx.Panel):
385
392
  except ValueError:
386
393
  mydpi = 500
387
394
  if self.check_invert.GetValue():
388
- invert = " --invert 1"
395
+ invert = " --invert"
389
396
  else:
390
397
  invert = ""
391
398
  if self.check_outline.GetValue():
392
- outline = " --outline 1"
399
+ outline = " --outline"
393
400
  else:
394
401
  outline = ""
395
402
  cmdstr = f"render_keyhole {mydpi} --order {esort}{invert}{outline}\n"
@@ -455,7 +462,7 @@ class RenderSplit(MWindow):
455
462
  self.Layout()
456
463
 
457
464
  _icon = wx.NullIcon
458
- _icon.CopyFromBitmap(icons8_split_table_50.GetBitmap(resize=STD_ICON_SIZE / 2))
465
+ _icon.CopyFromBitmap(icon_split_image.GetBitmap())
459
466
  self.SetIcon(_icon)
460
467
  self.SetTitle(_("Create split images"))
461
468
 
@@ -479,7 +486,7 @@ class RenderSplit(MWindow):
479
486
  "button/align/SplitImage",
480
487
  {
481
488
  "label": _("Image ops"),
482
- "icon": icons8_split_table_50,
489
+ "icon": icon_split_image,
483
490
  "tip": _("Open create split image dialog / keyhole generation"),
484
491
  "action": lambda v: kernel.console("window toggle SplitImage\n"),
485
492
  "size": bsize_normal,
meerk40t/gui/keymap.py CHANGED
@@ -2,7 +2,7 @@ import platform
2
2
 
3
3
  import wx
4
4
 
5
- from .icons import icons8_keyboard_50
5
+ from .icons import icons8_keyboard
6
6
  from .mwindow import MWindow
7
7
  from .wxutils import get_key_name
8
8
 
@@ -315,7 +315,7 @@ class Keymap(MWindow):
315
315
  self.panel = KeymapPanel(self, wx.ID_ANY, context=self.context)
316
316
  self.add_module_delegate(self.panel)
317
317
  _icon = wx.NullIcon
318
- _icon.CopyFromBitmap(icons8_keyboard_50.GetBitmap())
318
+ _icon.CopyFromBitmap(icons8_keyboard.GetBitmap())
319
319
  self.SetIcon(_icon)
320
320
  # begin wxGlade: Keymap.__set_properties
321
321
  self.SetTitle(_("Keymap Settings"))
@@ -326,7 +326,7 @@ class Keymap(MWindow):
326
326
  "button/config/Keymap",
327
327
  {
328
328
  "label": _("Keymap"),
329
- "icon": icons8_keyboard_50,
329
+ "icon": icons8_keyboard,
330
330
  "tip": _("Opens Keymap Window"),
331
331
  "action": lambda v: kernel.console("window toggle Keymap\n"),
332
332
  },
@@ -3,15 +3,18 @@ from wx import aui
3
3
 
4
4
  from meerk40t.gui.choicepropertypanel import ChoicePropertyPanel
5
5
  from meerk40t.gui.icons import (
6
- STD_ICON_SIZE,
7
- icons8_delete_50,
8
- icons8_emergency_stop_button_50,
9
- icons8_gas_industry_50,
10
- icons8_goal_50,
11
- icons8_laser_beam_hazard2_50,
12
- icons8_pause_50,
13
- icons8_pentagon_50,
14
- icons8_save_50,
6
+ DARKMODE,
7
+ get_default_icon_size,
8
+ icon_closed_door,
9
+ icon_open_door,
10
+ icon_update_plan,
11
+ icons8_delete,
12
+ icons8_emergency_stop_button,
13
+ icons8_gas_industry,
14
+ icons8_laser_beam_hazard,
15
+ icons8_pause,
16
+ icons8_pentagon,
17
+ icons8_save,
15
18
  )
16
19
  from meerk40t.gui.navigationpanels import Drag, Jog, MovePanel
17
20
  from meerk40t.gui.wxutils import (
@@ -34,15 +37,13 @@ def register_panel_laser(window, context):
34
37
  # jog_drag = wx.Panel(window, wx.ID_ANY)
35
38
  jog_drag = ScrolledPanel(window, wx.ID_ANY)
36
39
  jog_drag.SetupScrolling()
37
- iconsize = 50
38
- jog_panel = Jog(jog_drag, wx.ID_ANY, context=context, icon_size=iconsize)
39
- drag_panel = Drag(jog_drag, wx.ID_ANY, context=context, icon_size=iconsize)
40
+ jog_panel = Jog(jog_drag, wx.ID_ANY, context=context)
41
+ drag_panel = Drag(jog_drag, wx.ID_ANY, context=context)
40
42
  main_sizer = wx.BoxSizer(wx.HORIZONTAL)
41
- main_sizer.AddStretchSpacer()
42
- main_sizer.Add(jog_panel, 0, wx.ALIGN_CENTER_VERTICAL, 0)
43
- main_sizer.AddSpacer(25)
44
- main_sizer.Add(drag_panel, 0, wx.ALIGN_CENTER_VERTICAL, 0)
45
- main_sizer.AddStretchSpacer()
43
+ # main_sizer.AddStretchSpacer()
44
+ main_sizer.Add(jog_panel, 1, wx.ALIGN_CENTER_VERTICAL, 0)
45
+ main_sizer.Add(drag_panel, 1, wx.ALIGN_CENTER_VERTICAL, 0)
46
+ # main_sizer.AddStretchSpacer()
46
47
  jog_drag.SetSizer(main_sizer)
47
48
  jog_drag.Layout()
48
49
  move_panel = MovePanel(window, wx.ID_ANY, context=context)
@@ -90,6 +91,15 @@ def register_panel_laser(window, context):
90
91
  ]
91
92
  context.kernel.register_choices("preferences", choices)
92
93
 
94
+ def on_resize(event):
95
+ wb_size = jog_drag.ClientSize
96
+ panel_size = (wb_size[0] / 2, wb_size[1])
97
+
98
+ jog_panel.set_icons(dimension=panel_size)
99
+ drag_panel.set_icons(dimension=panel_size)
100
+
101
+ jog_drag.Bind(wx.EVT_SIZE, on_resize)
102
+
93
103
 
94
104
  class LaserPanel(wx.Panel):
95
105
  """
@@ -103,36 +113,28 @@ class LaserPanel(wx.Panel):
103
113
  self.context = context
104
114
 
105
115
  sizer_main = wx.BoxSizer(wx.VERTICAL)
116
+ self.icon_size = 0.5 * get_default_icon_size()
106
117
 
107
- sizer_devices = StaticBoxSizer(self, wx.ID_ANY, _("Device"), wx.HORIZONTAL)
108
- sizer_main.Add(sizer_devices, 0, wx.EXPAND, 0)
118
+ self.sizer_devices = StaticBoxSizer(self, wx.ID_ANY, _("Device"), wx.HORIZONTAL)
119
+ sizer_main.Add(self.sizer_devices, 0, wx.EXPAND, 0)
109
120
 
110
121
  # Devices Initialize.
111
122
  self.available_devices = self.context.kernel.services("device")
112
123
 
113
- self.selected_device = self.context.device
114
- index = -1
115
- for i, s in enumerate(self.available_devices):
116
- if s is self.selected_device:
117
- index = i
118
- break
119
- spools = [s.label for s in self.available_devices]
120
-
121
124
  self.combo_devices = wx.ComboBox(
122
- self, wx.ID_ANY, choices=spools, style=wx.CB_DROPDOWN | wx.CB_READONLY
125
+ self, wx.ID_ANY, style=wx.CB_DROPDOWN | wx.CB_READONLY
123
126
  )
124
127
  self.combo_devices.SetToolTip(
125
128
  _("Select device from list of configured devices")
126
129
  )
127
- self.combo_devices.SetSelection(index)
128
130
  self.btn_config_laser = wx.Button(self, wx.ID_ANY, "*")
129
131
  self.btn_config_laser.SetToolTip(
130
132
  _("Opens device-specific configuration window")
131
133
  )
132
134
 
133
- sizer_devices.Add(self.combo_devices, 1, wx.EXPAND, 0)
135
+ self.sizer_devices.Add(self.combo_devices, 1, wx.EXPAND, 0)
134
136
  self.btn_config_laser.SetMinSize(dip_size(self, 20, -1))
135
- sizer_devices.Add(self.btn_config_laser, 0, wx.EXPAND, 0)
137
+ self.sizer_devices.Add(self.btn_config_laser, 0, wx.EXPAND, 0)
136
138
 
137
139
  sizer_control = wx.BoxSizer(wx.HORIZONTAL)
138
140
  sizer_main.Add(sizer_control, 0, wx.EXPAND, 0)
@@ -140,49 +142,73 @@ class LaserPanel(wx.Panel):
140
142
  self.button_start = HoverButton(self, wx.ID_ANY, _("Start"))
141
143
  self.button_start.SetToolTip(_("Execute the Job"))
142
144
  self.button_start.SetBitmap(
143
- icons8_gas_industry_50.GetBitmap(
144
- resize=STD_ICON_SIZE / 2, color=wx.WHITE, keepalpha=True
145
+ icons8_gas_industry.GetBitmap(
146
+ resize=self.icon_size,
147
+ color=wx.WHITE,
148
+ keepalpha=True,
149
+ force_darkmode=True,
145
150
  )
146
151
  )
147
152
  self.button_start.SetBitmapFocus(
148
- icons8_gas_industry_50.GetBitmap(resize=STD_ICON_SIZE / 2)
153
+ icons8_gas_industry.GetBitmap(
154
+ resize=self.icon_size,
155
+ )
149
156
  )
150
- self.button_start.SetBackgroundColour(wx.Colour(0, 127, 0))
151
- self.button_start.SetForegroundColour(wx.WHITE)
152
- self.button_start.SetFocusColour(wx.BLACK)
153
- self.button_start.SetDisabledBackgroundColour(wx.Colour(172, 192, 172))
157
+ self.button_start.SetBackgroundColour(self.context.themes.get("start_bg"))
158
+ self.button_start.SetForegroundColour(self.context.themes.get("start_fg"))
159
+ self.button_start.SetFocusColour(self.context.themes.get("start_fg_focus"))
160
+ # self.button_start.SetDisabledBackgroundColour(wx.Colour("FOREST GREEN"))
154
161
 
155
162
  sizer_control.Add(self.button_start, 1, wx.EXPAND, 0)
156
163
 
157
- self.button_pause = wx.Button(self, wx.ID_ANY, _("Pause"))
158
- self.button_pause.SetForegroundColour(wx.BLACK) # Dark Mode correction.
164
+ self.button_pause = HoverButton(self, wx.ID_ANY, _("Pause"))
159
165
  self.button_pause.SetToolTip(_("Pause/Resume the laser"))
160
166
  self.button_pause.SetBitmap(
161
- icons8_pause_50.GetBitmap(resize=STD_ICON_SIZE / 2, use_theme=False)
167
+ icons8_pause.GetBitmap(
168
+ resize=self.icon_size,
169
+ )
162
170
  )
163
- self.button_pause.SetBackgroundColour(wx.Colour(255, 255, 0))
164
171
  sizer_control.Add(self.button_pause, 1, wx.EXPAND, 0)
165
172
 
166
173
  self.button_stop = HoverButton(self, wx.ID_ANY, _("Stop"))
167
174
  self.button_stop.SetToolTip(_("Stop the laser"))
168
175
  self.button_stop.SetBitmap(
169
- icons8_emergency_stop_button_50.GetBitmap(
170
- resize=STD_ICON_SIZE / 2, color=wx.WHITE, keepalpha=True
176
+ icons8_emergency_stop_button.GetBitmap(
177
+ resize=self.icon_size,
178
+ color=self.context.themes.get("stop_fg"),
179
+ keepalpha=True,
180
+ force_darkmode=True,
171
181
  )
172
182
  )
173
183
  self.button_stop.SetBitmapFocus(
174
- icons8_emergency_stop_button_50.GetBitmap(resize=STD_ICON_SIZE / 2)
184
+ icons8_emergency_stop_button.GetBitmap(
185
+ resize=self.icon_size,
186
+ )
175
187
  )
176
- self.button_stop.SetBackgroundColour(wx.Colour(127, 0, 0))
177
- self.button_stop.SetForegroundColour(wx.WHITE)
178
- self.button_stop.SetFocusColour(wx.BLACK)
188
+ self.button_stop.SetBackgroundColour(self.context.themes.get("stop_bg"))
189
+ self.button_stop.SetForegroundColour(self.context.themes.get("stop_fg"))
190
+ self.button_stop.SetFocusColour(self.context.themes.get("stop_fg_focus"))
179
191
  sizer_control.Add(self.button_stop, 1, wx.EXPAND, 0)
180
192
 
181
193
  sizer_control_misc = wx.BoxSizer(wx.HORIZONTAL)
182
194
  sizer_main.Add(sizer_control_misc, 0, wx.EXPAND, 0)
183
195
 
184
- self.arm_toggle = wx.ToggleButton(self, wx.ID_ANY, _("Arm"))
196
+ self.arm_toggle = HoverButton(self, wx.ID_ANY, _("Arm"))
185
197
  self.arm_toggle.SetToolTip(_("Arm the job for execution"))
198
+ self.arm_toggle.SetBitmap(
199
+ icon_closed_door.GetBitmap(
200
+ resize=self.icon_size,
201
+ color=self.context.themes.get("arm_fg"),
202
+ )
203
+ )
204
+ self.arm_toggle.SetBitmapFocus(
205
+ icon_closed_door.GetBitmap(
206
+ resize=self.icon_size,
207
+ )
208
+ )
209
+ self.arm_toggle.SetForegroundColour(self.context.themes.get("arm_fg"))
210
+ self.arm_toggle.SetFocusColour(self.context.themes.get("stop_fg_focus"))
211
+ self.armed = False
186
212
  sizer_control_misc.Add(self.arm_toggle, 1, wx.EXPAND, 0)
187
213
 
188
214
  self.check_laser_arm()
@@ -190,14 +216,18 @@ class LaserPanel(wx.Panel):
190
216
  self.button_outline = wx.Button(self, wx.ID_ANY, _("Outline"))
191
217
  self.button_outline.SetToolTip(_("Trace the outline the job"))
192
218
  self.button_outline.SetBitmap(
193
- icons8_pentagon_50.GetBitmap(resize=STD_ICON_SIZE / 2)
219
+ icons8_pentagon.GetBitmap(
220
+ resize=self.icon_size,
221
+ )
194
222
  )
195
223
  sizer_control_misc.Add(self.button_outline, 1, wx.EXPAND, 0)
196
224
 
197
225
  self.button_simulate = wx.Button(self, wx.ID_ANY, _("Simulate"))
198
226
  self.button_simulate.SetToolTip(_("Simulate the Design"))
199
227
  self.button_simulate.SetBitmap(
200
- icons8_laser_beam_hazard2_50.GetBitmap(resize=STD_ICON_SIZE / 2)
228
+ icons8_laser_beam_hazard.GetBitmap(
229
+ resize=self.icon_size,
230
+ )
201
231
  )
202
232
  sizer_control_misc.Add(self.button_simulate, 1, wx.EXPAND, 0)
203
233
 
@@ -207,10 +237,9 @@ class LaserPanel(wx.Panel):
207
237
  sizer_source = wx.BoxSizer(wx.HORIZONTAL)
208
238
  sizer_main.Add(sizer_source, 0, wx.EXPAND, 0)
209
239
 
210
- self._optimize = True
211
240
  self.checkbox_optimize = wx.CheckBox(self, wx.ID_ANY, _("Optimize"))
212
241
  self.checkbox_optimize.SetToolTip(_("Enable/Disable Optimize"))
213
- self.checkbox_optimize.SetValue(self._optimize)
242
+ self.checkbox_optimize.SetValue(self.context.planner.do_optimization)
214
243
  self.checkbox_adjust = wx.CheckBox(self, wx.ID_ANY, _("Override"))
215
244
  self.checkbox_adjust.SetToolTip(
216
245
  _("Allow ad-hoc adjustment of speed and power.")
@@ -263,7 +292,7 @@ class LaserPanel(wx.Panel):
263
292
  self.button_start.Bind(wx.EVT_LEFT_DOWN, self.on_start_left)
264
293
  self.Bind(wx.EVT_BUTTON, self.on_button_pause, self.button_pause)
265
294
  self.Bind(wx.EVT_BUTTON, self.on_button_stop, self.button_stop)
266
- self.Bind(wx.EVT_TOGGLEBUTTON, self.on_check_arm, self.arm_toggle)
295
+ self.Bind(wx.EVT_BUTTON, self.on_check_arm, self.arm_toggle)
267
296
  self.Bind(wx.EVT_RIGHT_DOWN, self.on_menu_arm, self)
268
297
  self.Bind(wx.EVT_BUTTON, self.on_button_outline, self.button_outline)
269
298
  self.button_outline.Bind(wx.EVT_RIGHT_DOWN, self.on_button_outline_right)
@@ -275,11 +304,13 @@ class LaserPanel(wx.Panel):
275
304
  self.Bind(wx.EVT_CHECKBOX, self.on_optimize, self.checkbox_optimize)
276
305
  self.Bind(wx.EVT_BUTTON, self.on_config_button, self.btn_config_laser)
277
306
  # end wxGlade
278
- if index == -1:
279
- disable_window(self)
280
307
  self.checkbox_adjust.SetValue(False)
281
308
  self.on_check_adjust(None)
282
309
  self.update_override_controls()
310
+ self.on_device_changes()
311
+ index = self.combo_devices.GetSelection()
312
+ if index == -1:
313
+ disable_window(self)
283
314
  # Check for a real click of the execute button
284
315
  self.button_start_was_clicked = False
285
316
 
@@ -366,7 +397,8 @@ class LaserPanel(wx.Panel):
366
397
 
367
398
  def on_optimize(self, event):
368
399
  newval = bool(self.checkbox_optimize.GetValue())
369
- if newval != self._optimize:
400
+ if newval != self.context.planner.do_optimization:
401
+ self.context.planner.do_optimization = newval
370
402
  self.context.signal("optimize", newval)
371
403
 
372
404
  @signal_listener("optimize")
@@ -376,27 +408,32 @@ class LaserPanel(wx.Panel):
376
408
  except ValueError:
377
409
  # You never know
378
410
  return
379
- if self._optimize != newvalue:
380
- self._optimize = newvalue
411
+ if self.context.planner.do_optimization != newvalue:
412
+ self.context.planner.do_optimization = newvalue
381
413
  self.checkbox_optimize.SetValue(newvalue)
382
414
 
383
415
  @signal_listener("device;modified")
384
416
  @signal_listener("device;renamed")
385
417
  @lookup_listener("service/device/active")
386
418
  @lookup_listener("service/device/available")
387
- def spooler_lookup(self, *args):
419
+ def on_device_changes(self, *args):
388
420
  # Devices Initialize.
389
421
  self.available_devices = self.context.kernel.services("device")
390
422
  self.selected_device = self.context.device
391
423
  index = -1
424
+ count = 0
392
425
  self.combo_devices.Clear()
393
426
  for i, spool in enumerate(self.available_devices):
394
427
  if index < 0 and spool is self.selected_device:
395
428
  index = i
396
429
  self.combo_devices.Append(spool.label)
430
+ count += 1
397
431
  self.combo_devices.SetSelection(index)
398
432
  self.set_pause_color()
399
433
  self.update_override_controls()
434
+ showit = count > 1
435
+ self.sizer_devices.ShowItems(showit)
436
+ self.Layout()
400
437
 
401
438
  @signal_listener("device;connected")
402
439
  def on_connectivity(self, *args):
@@ -404,15 +441,18 @@ class LaserPanel(wx.Panel):
404
441
  self.update_override_controls()
405
442
 
406
443
  def set_pause_color(self):
407
- new_color = None
444
+ new_bg_color = None
445
+ new_fg_color = None
408
446
  new_caption = _("Pause")
409
447
  try:
410
448
  if self.context.device.driver.paused:
411
- new_color = wx.YELLOW
449
+ new_bg_color = self.context.themes.get("pause_bg")
450
+ new_fg_color = self.context.themes.get("pause_fg")
412
451
  new_caption = _("Resume")
413
452
  except AttributeError:
414
453
  pass
415
- self.button_pause.SetBackgroundColour(new_color)
454
+ self.button_pause.SetBackgroundColour(new_bg_color)
455
+ self.button_pause.SetForegroundColour(new_fg_color)
416
456
  self.button_pause.SetLabelText(new_caption)
417
457
 
418
458
  @signal_listener("pause")
@@ -426,19 +466,51 @@ class LaserPanel(wx.Panel):
426
466
  if not self.arm_toggle.Shown:
427
467
  self.arm_toggle.Show(True)
428
468
  self.Layout()
429
- if self.arm_toggle.GetValue():
430
- self.arm_toggle.SetBackgroundColour(wx.RED)
469
+ if self.armed:
470
+ self.arm_toggle.SetBackgroundColour(self.context.themes.get("arm_bg"))
471
+ self.button_start.SetBackgroundColour(
472
+ self.context.themes.get("start_bg")
473
+ )
474
+ self.arm_toggle.SetBitmap(
475
+ icon_open_door.GetBitmap(
476
+ resize=self.icon_size,
477
+ color=self.context.themes.get("arm_fg"),
478
+ )
479
+ )
480
+ self.arm_toggle.SetBitmapFocus(
481
+ icon_open_door.GetBitmap(
482
+ resize=self.icon_size,
483
+ )
484
+ )
431
485
  self.button_start.Enable(True)
432
486
  else:
433
- self.arm_toggle.SetBackgroundColour(wx.GREEN)
487
+ self.arm_toggle.SetBackgroundColour(
488
+ self.context.themes.get("arm_bg_inactive")
489
+ )
490
+ self.button_start.SetBackgroundColour(
491
+ self.context.themes.get("start_bg_inactive")
492
+ )
434
493
  self.button_start.Enable(False)
494
+ self.arm_toggle.SetBitmap(
495
+ icon_closed_door.GetBitmap(
496
+ resize=self.icon_size,
497
+ color=self.context.themes.get("arm_fg"),
498
+ )
499
+ )
500
+ self.arm_toggle.SetBitmapFocus(
501
+ icon_closed_door.GetBitmap(
502
+ resize=self.icon_size,
503
+ )
504
+ )
435
505
  else:
436
506
  if self.arm_toggle.Shown:
437
507
  self.arm_toggle.Show(False)
438
508
  self.Layout()
509
+ self.button_start.SetBackgroundColour(self.context.themes.get("start_bg"))
439
510
  self.button_start.Enable(True)
440
511
 
441
512
  def on_check_arm(self, event):
513
+ self.armed = not self.armed
442
514
  self.check_laser_arm()
443
515
 
444
516
  def on_menu_arm_enable(self, event):
@@ -497,7 +569,7 @@ class LaserPanel(wx.Panel):
497
569
  )
498
570
  else:
499
571
  self.context("planz clear copy preprocess validate blob spool\n")
500
- self.arm_toggle.SetValue(False)
572
+ self.armed = False
501
573
  self.check_laser_arm()
502
574
  if self.context.auto_spooler:
503
575
  self.context("window open JobSpooler\n")
@@ -563,27 +635,23 @@ class JobPanel(wx.Panel):
563
635
 
564
636
  sizer_main = wx.BoxSizer(wx.VERTICAL)
565
637
  self._optimize = True
566
-
638
+ self.icon_size = 0.5 * get_default_icon_size()
567
639
  sizer_control_update = wx.BoxSizer(wx.HORIZONTAL)
568
640
  sizer_main.Add(sizer_control_update, 0, wx.EXPAND, 0)
569
641
 
570
642
  self.button_clear = wx.Button(self, wx.ID_ANY, _("Clear"))
571
643
  self.button_clear.SetToolTip(_("Clear locally defined plan"))
572
- self.button_clear.SetBitmap(
573
- icons8_delete_50.GetBitmap(resize=STD_ICON_SIZE / 2)
574
- )
644
+ self.button_clear.SetBitmap(icons8_delete.GetBitmap(resize=self.icon_size))
575
645
  sizer_control_update.Add(self.button_clear, 1, 0, 0)
576
646
 
577
647
  self.button_update = wx.Button(self, wx.ID_ANY, _("Update"))
578
648
  self.button_update.SetToolTip(_("Update the Plan"))
579
- self.button_update.SetBitmap(icons8_goal_50.GetBitmap(resize=STD_ICON_SIZE / 2))
649
+ self.button_update.SetBitmap(icon_update_plan.GetBitmap(resize=self.icon_size))
580
650
  sizer_control_update.Add(self.button_update, 1, 0, 0)
581
651
 
582
652
  self.button_save_file = wx.Button(self, wx.ID_ANY, _("Save"))
583
653
  self.button_save_file.SetToolTip(_("Save the job"))
584
- self.button_save_file.SetBitmap(
585
- icons8_save_50.GetBitmap(resize=STD_ICON_SIZE / 2)
586
- )
654
+ self.button_save_file.SetBitmap(icons8_save.GetBitmap(resize=self.icon_size))
587
655
  sizer_control_update.Add(self.button_save_file, 1, 0, 0)
588
656
 
589
657
  sizer_source = wx.BoxSizer(wx.HORIZONTAL)
@@ -628,7 +696,8 @@ class JobPanel(wx.Panel):
628
696
  except ValueError:
629
697
  # You never know
630
698
  return
631
- self._optimize = newvalue
699
+ if newvalue != self.context.planner.do_optimization:
700
+ self.context.planner.do_optimization = newvalue
632
701
 
633
702
  def on_button_save(self, event): # wxGlade: LaserPanel.<event_handler>
634
703
  gui = self.context.gui
@@ -660,7 +729,7 @@ class JobPanel(wx.Panel):
660
729
 
661
730
  def on_button_update(self, event): # wxGlade: LaserPanel.<event_handler>
662
731
  self.context.kernel.busyinfo.start(msg=_("Updating Plan..."))
663
- if self._optimize:
732
+ if self.context.planner.do_optimization:
664
733
  self.context("planz clear copy preprocess validate blob preopt optimize\n")
665
734
  else:
666
735
  self.context("planz clear copy preprocess validate blob\n")
@@ -690,12 +759,10 @@ class OptimizePanel(wx.Panel):
690
759
  kwds["style"] = kwds.get("style", 0) | wx.TAB_TRAVERSAL
691
760
  wx.Panel.__init__(self, *args, **kwds)
692
761
  self.context = context
693
-
694
762
  sizer_main = wx.BoxSizer(wx.VERTICAL)
695
- self._optimize = True
696
763
  self.checkbox_optimize = wx.CheckBox(self, wx.ID_ANY, _("Optimize"))
697
764
  self.checkbox_optimize.SetToolTip(_("Enable/Disable Optimize"))
698
- self.checkbox_optimize.SetValue(self._optimize)
765
+ self.checkbox_optimize.SetValue(self.context.planner.do_optimization)
699
766
  prechoices = context.lookup("choices/optimize")
700
767
  choices = list(map(copy, prechoices))
701
768
  # Clear the page-entry
@@ -720,15 +787,15 @@ class OptimizePanel(wx.Panel):
720
787
  except ValueError:
721
788
  # You never know
722
789
  return
723
- if self._optimize != newvalue:
724
- self._optimize = newvalue
790
+ if self.context.planner.do_optimization != newvalue:
791
+ self.context.planner.do_optimization = newvalue
725
792
  self.checkbox_optimize.SetValue(newvalue)
726
793
  self.optimize_panel.Enable(newvalue)
727
794
 
728
795
  def on_optimize(self, event):
729
796
  newvalue = bool(self.checkbox_optimize.GetValue())
730
- if newvalue != self._optimize:
731
- self._optimize = newvalue
797
+ if newvalue != self.context.planner.do_optimization:
798
+ self.context.planner.do_optimization = newvalue
732
799
  self.context.signal("optimize", newvalue)
733
800
  self.optimize_panel.Enable(newvalue)
734
801