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.
- meerk40t/balormk/balor_params.py +1 -43
- meerk40t/balormk/controller.py +1 -41
- meerk40t/balormk/device.py +16 -22
- meerk40t/balormk/driver.py +4 -4
- meerk40t/balormk/gui/balorconfig.py +2 -2
- meerk40t/balormk/gui/balorcontroller.py +13 -5
- meerk40t/balormk/gui/baloroperationproperties.py +0 -46
- meerk40t/balormk/gui/gui.py +17 -17
- meerk40t/camera/gui/camerapanel.py +18 -11
- meerk40t/core/cutcode/rastercut.py +3 -1
- meerk40t/core/cutplan.py +145 -14
- meerk40t/core/elements/clipboard.py +18 -9
- meerk40t/core/elements/element_treeops.py +320 -180
- meerk40t/core/elements/element_types.py +7 -2
- meerk40t/core/elements/elements.py +53 -27
- meerk40t/core/elements/geometry.py +8 -0
- meerk40t/core/elements/offset_clpr.py +129 -4
- meerk40t/core/elements/offset_mk.py +3 -1
- meerk40t/core/elements/shapes.py +28 -25
- meerk40t/core/laserjob.py +7 -0
- meerk40t/core/node/bootstrap.py +4 -0
- meerk40t/core/node/effect_hatch.py +85 -96
- meerk40t/core/node/effect_wobble.py +309 -0
- meerk40t/core/node/elem_image.py +49 -19
- meerk40t/core/node/elem_line.py +60 -0
- meerk40t/core/node/elem_rect.py +5 -3
- meerk40t/core/node/image_processed.py +766 -0
- meerk40t/core/node/image_raster.py +113 -0
- meerk40t/core/node/node.py +120 -1
- meerk40t/core/node/op_cut.py +2 -8
- meerk40t/core/node/op_dots.py +0 -8
- meerk40t/core/node/op_engrave.py +2 -18
- meerk40t/core/node/op_image.py +22 -35
- meerk40t/core/node/op_raster.py +0 -9
- meerk40t/core/planner.py +32 -2
- meerk40t/core/svg_io.py +699 -461
- meerk40t/core/treeop.py +191 -0
- meerk40t/core/undos.py +15 -1
- meerk40t/core/units.py +14 -4
- meerk40t/device/dummydevice.py +3 -2
- meerk40t/device/gui/defaultactions.py +43 -55
- meerk40t/device/gui/formatterpanel.py +58 -49
- meerk40t/device/gui/warningpanel.py +12 -12
- meerk40t/device/mixins.py +13 -0
- meerk40t/dxf/dxf_io.py +9 -5
- meerk40t/extra/ezd.py +28 -26
- meerk40t/extra/imageactions.py +300 -308
- meerk40t/extra/lbrn.py +19 -2
- meerk40t/fill/fills.py +6 -6
- meerk40t/fill/patternfill.py +1061 -1061
- meerk40t/fill/patterns.py +2 -6
- meerk40t/grbl/controller.py +168 -52
- meerk40t/grbl/device.py +23 -18
- meerk40t/grbl/driver.py +39 -0
- meerk40t/grbl/emulator.py +79 -19
- meerk40t/grbl/gcodejob.py +10 -0
- meerk40t/grbl/gui/grblconfiguration.py +2 -2
- meerk40t/grbl/gui/grblcontroller.py +24 -8
- meerk40t/grbl/gui/grblhardwareconfig.py +153 -0
- meerk40t/grbl/gui/gui.py +17 -14
- meerk40t/grbl/mock_connection.py +15 -34
- meerk40t/grbl/plugin.py +0 -4
- meerk40t/grbl/serial_connection.py +2 -1
- meerk40t/gui/about.py +8 -5
- meerk40t/gui/alignment.py +10 -6
- meerk40t/gui/basicops.py +27 -17
- meerk40t/gui/bufferview.py +2 -2
- meerk40t/gui/choicepropertypanel.py +101 -13
- meerk40t/gui/consolepanel.py +12 -9
- meerk40t/gui/devicepanel.py +38 -25
- meerk40t/gui/executejob.py +6 -4
- meerk40t/gui/help_assets/help_assets.py +13 -10
- meerk40t/gui/hersheymanager.py +8 -6
- meerk40t/gui/icons.py +1951 -3065
- meerk40t/gui/imagesplitter.py +14 -7
- meerk40t/gui/keymap.py +3 -3
- meerk40t/gui/laserpanel.py +151 -84
- meerk40t/gui/laserrender.py +61 -70
- meerk40t/gui/lasertoolpanel.py +8 -7
- meerk40t/gui/materialtest.py +3 -3
- meerk40t/gui/mkdebug.py +254 -1
- meerk40t/gui/navigationpanels.py +321 -180
- meerk40t/gui/notes.py +3 -3
- meerk40t/gui/opassignment.py +12 -12
- meerk40t/gui/operation_info.py +13 -13
- meerk40t/gui/plugin.py +5 -0
- meerk40t/gui/position.py +20 -18
- meerk40t/gui/preferences.py +21 -6
- meerk40t/gui/propertypanels/attributes.py +70 -22
- meerk40t/gui/propertypanels/blobproperty.py +2 -2
- meerk40t/gui/propertypanels/consoleproperty.py +2 -2
- meerk40t/gui/propertypanels/groupproperties.py +3 -3
- meerk40t/gui/propertypanels/hatchproperty.py +11 -18
- meerk40t/gui/propertypanels/imageproperty.py +4 -3
- meerk40t/gui/propertypanels/opbranchproperties.py +1 -1
- meerk40t/gui/propertypanels/pathproperty.py +2 -2
- meerk40t/gui/propertypanels/pointproperty.py +2 -2
- meerk40t/gui/propertypanels/propertywindow.py +4 -4
- meerk40t/gui/propertypanels/textproperty.py +3 -3
- meerk40t/gui/propertypanels/wobbleproperty.py +204 -0
- meerk40t/gui/ribbon.py +367 -259
- meerk40t/gui/scene/scene.py +31 -5
- meerk40t/gui/scenewidgets/elementswidget.py +12 -4
- meerk40t/gui/scenewidgets/gridwidget.py +2 -2
- meerk40t/gui/scenewidgets/laserpathwidget.py +7 -2
- meerk40t/gui/scenewidgets/machineoriginwidget.py +6 -2
- meerk40t/gui/scenewidgets/relocatewidget.py +1 -1
- meerk40t/gui/scenewidgets/reticlewidget.py +9 -0
- meerk40t/gui/scenewidgets/selectionwidget.py +12 -7
- meerk40t/gui/simpleui.py +95 -8
- meerk40t/gui/simulation.py +44 -36
- meerk40t/gui/spoolerpanel.py +124 -26
- meerk40t/gui/statusbarwidgets/defaultoperations.py +18 -6
- meerk40t/gui/statusbarwidgets/infowidget.py +2 -2
- meerk40t/gui/statusbarwidgets/opassignwidget.py +12 -12
- meerk40t/gui/statusbarwidgets/shapepropwidget.py +45 -18
- meerk40t/gui/statusbarwidgets/statusbar.py +11 -4
- meerk40t/gui/themes.py +78 -0
- meerk40t/gui/toolwidgets/toolcircle.py +2 -1
- meerk40t/gui/toolwidgets/toolellipse.py +2 -1
- meerk40t/gui/toolwidgets/toolimagecut.py +132 -0
- meerk40t/gui/toolwidgets/toolline.py +144 -0
- meerk40t/gui/toolwidgets/toolnodeedit.py +72 -145
- meerk40t/gui/toolwidgets/toolpoint.py +1 -1
- meerk40t/gui/toolwidgets/toolpolygon.py +8 -55
- meerk40t/gui/toolwidgets/toolrect.py +2 -1
- meerk40t/gui/usbconnect.py +2 -2
- meerk40t/gui/utilitywidgets/cyclocycloidwidget.py +2 -2
- meerk40t/gui/utilitywidgets/harmonograph.py +7 -7
- meerk40t/gui/utilitywidgets/scalewidget.py +1 -1
- meerk40t/gui/wordlisteditor.py +33 -18
- meerk40t/gui/wxmeerk40t.py +166 -66
- meerk40t/gui/wxmmain.py +236 -157
- meerk40t/gui/wxmribbon.py +49 -25
- meerk40t/gui/wxmscene.py +49 -38
- meerk40t/gui/wxmtree.py +216 -85
- meerk40t/gui/wxutils.py +62 -4
- meerk40t/image/imagetools.py +443 -15
- meerk40t/internal_plugins.py +2 -10
- meerk40t/kernel/kernel.py +12 -4
- meerk40t/lihuiyu/controller.py +7 -7
- meerk40t/lihuiyu/device.py +3 -1
- meerk40t/lihuiyu/driver.py +3 -0
- meerk40t/lihuiyu/gui/gui.py +8 -8
- meerk40t/lihuiyu/gui/lhyaccelgui.py +2 -2
- meerk40t/lihuiyu/gui/lhycontrollergui.py +73 -27
- meerk40t/lihuiyu/gui/lhydrivergui.py +2 -2
- meerk40t/lihuiyu/gui/tcpcontroller.py +22 -9
- meerk40t/main.py +6 -1
- meerk40t/moshi/controller.py +5 -5
- meerk40t/moshi/device.py +5 -2
- meerk40t/moshi/driver.py +4 -0
- meerk40t/moshi/gui/gui.py +8 -8
- meerk40t/moshi/gui/moshicontrollergui.py +24 -8
- meerk40t/moshi/gui/moshidrivergui.py +2 -2
- meerk40t/newly/controller.py +2 -0
- meerk40t/newly/device.py +9 -2
- meerk40t/newly/driver.py +4 -0
- meerk40t/newly/gui/gui.py +16 -17
- meerk40t/newly/gui/newlyconfig.py +2 -2
- meerk40t/newly/gui/newlycontroller.py +13 -5
- meerk40t/rotary/gui/gui.py +2 -2
- meerk40t/rotary/gui/rotarysettings.py +2 -2
- meerk40t/ruida/device.py +3 -0
- meerk40t/ruida/driver.py +4 -0
- meerk40t/ruida/gui/gui.py +6 -6
- meerk40t/ruida/gui/ruidaconfig.py +2 -2
- meerk40t/ruida/gui/ruidacontroller.py +13 -5
- meerk40t/svgelements.py +9 -9
- meerk40t/tools/geomstr.py +849 -153
- meerk40t/tools/kerftest.py +8 -4
- meerk40t/tools/livinghinges.py +15 -8
- {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/METADATA +21 -16
- {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/RECORD +185 -177
- {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/entry_points.txt +0 -1
- test/test_core_elements.py +8 -24
- test/test_file_svg.py +88 -0
- test/test_fill.py +9 -9
- test/test_geomstr.py +258 -8
- test/test_kernel.py +4 -0
- test/test_tools_rasterplotter.py +29 -0
- meerk40t/extra/embroider.py +0 -56
- meerk40t/extra/pathoptimize.py +0 -249
- {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/LICENSE +0 -0
- {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/WHEEL +0 -0
- {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/top_level.txt +0 -0
- {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/zip-safe +0 -0
meerk40t/gui/imagesplitter.py
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
import wx
|
2
2
|
|
3
|
-
from meerk40t.gui.icons import
|
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
|
-
|
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(
|
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
|
395
|
+
invert = " --invert"
|
389
396
|
else:
|
390
397
|
invert = ""
|
391
398
|
if self.check_outline.GetValue():
|
392
|
-
outline = " --outline
|
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(
|
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":
|
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
|
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(
|
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":
|
329
|
+
"icon": icons8_keyboard,
|
330
330
|
"tip": _("Opens Keymap Window"),
|
331
331
|
"action": lambda v: kernel.console("window toggle Keymap\n"),
|
332
332
|
},
|
meerk40t/gui/laserpanel.py
CHANGED
@@ -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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
38
|
-
|
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,
|
43
|
-
main_sizer.
|
44
|
-
main_sizer.
|
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,
|
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
|
-
|
144
|
-
resize=
|
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
|
-
|
153
|
+
icons8_gas_industry.GetBitmap(
|
154
|
+
resize=self.icon_size,
|
155
|
+
)
|
149
156
|
)
|
150
|
-
self.button_start.SetBackgroundColour(
|
151
|
-
self.button_start.SetForegroundColour(
|
152
|
-
self.button_start.SetFocusColour(
|
153
|
-
self.button_start.SetDisabledBackgroundColour(wx.Colour(
|
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 =
|
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
|
-
|
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
|
-
|
170
|
-
resize=
|
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
|
-
|
184
|
+
icons8_emergency_stop_button.GetBitmap(
|
185
|
+
resize=self.icon_size,
|
186
|
+
)
|
175
187
|
)
|
176
|
-
self.button_stop.SetBackgroundColour(
|
177
|
-
self.button_stop.SetForegroundColour(
|
178
|
-
self.button_stop.SetFocusColour(
|
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 =
|
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
|
-
|
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
|
-
|
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.
|
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.
|
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.
|
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.
|
380
|
-
self.
|
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
|
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
|
-
|
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
|
-
|
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(
|
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.
|
430
|
-
self.arm_toggle.SetBackgroundColour(
|
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(
|
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.
|
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(
|
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.
|
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.
|
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.
|
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.
|
724
|
-
self.
|
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.
|
731
|
-
self.
|
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
|
|