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.
- meerk40t/balormk/clone_loader.py +3 -2
- meerk40t/balormk/controller.py +28 -11
- meerk40t/balormk/cylindermod.py +1 -0
- meerk40t/balormk/device.py +13 -9
- meerk40t/balormk/driver.py +9 -2
- meerk40t/balormk/galvo_commands.py +3 -1
- meerk40t/balormk/gui/gui.py +6 -0
- meerk40t/balormk/livelightjob.py +338 -321
- meerk40t/balormk/mock_connection.py +4 -3
- meerk40t/balormk/usb_connection.py +11 -2
- meerk40t/camera/camera.py +19 -14
- meerk40t/camera/gui/camerapanel.py +6 -0
- meerk40t/core/cutplan.py +109 -51
- meerk40t/core/elements/element_treeops.py +435 -140
- meerk40t/core/elements/elements.py +100 -9
- meerk40t/core/elements/shapes.py +259 -39
- meerk40t/core/elements/tree_commands.py +10 -5
- meerk40t/core/node/elem_ellipse.py +18 -8
- meerk40t/core/node/elem_image.py +51 -19
- meerk40t/core/node/elem_line.py +18 -8
- meerk40t/core/node/elem_path.py +18 -8
- meerk40t/core/node/elem_point.py +10 -4
- meerk40t/core/node/elem_polyline.py +19 -11
- meerk40t/core/node/elem_rect.py +18 -8
- meerk40t/core/node/elem_text.py +11 -5
- meerk40t/core/node/filenode.py +2 -8
- meerk40t/core/node/groupnode.py +11 -11
- meerk40t/core/node/image_processed.py +11 -5
- meerk40t/core/node/image_raster.py +11 -5
- meerk40t/core/node/node.py +64 -16
- meerk40t/core/node/refnode.py +2 -1
- meerk40t/core/svg_io.py +91 -34
- meerk40t/device/dummydevice.py +7 -1
- meerk40t/extra/vtracer.py +222 -0
- meerk40t/grbl/device.py +81 -8
- meerk40t/gui/about.py +20 -0
- meerk40t/gui/devicepanel.py +20 -16
- meerk40t/gui/gui_mixins.py +4 -0
- meerk40t/gui/icons.py +330 -253
- meerk40t/gui/laserpanel.py +8 -3
- meerk40t/gui/laserrender.py +41 -21
- meerk40t/gui/magnetoptions.py +158 -65
- meerk40t/gui/materialtest.py +229 -39
- meerk40t/gui/navigationpanels.py +229 -24
- meerk40t/gui/propertypanels/hatchproperty.py +2 -0
- meerk40t/gui/propertypanels/imageproperty.py +160 -106
- meerk40t/gui/ribbon.py +6 -1
- meerk40t/gui/scenewidgets/gridwidget.py +29 -32
- meerk40t/gui/scenewidgets/rectselectwidget.py +190 -192
- meerk40t/gui/simulation.py +75 -77
- meerk40t/gui/statusbarwidgets/defaultoperations.py +84 -48
- meerk40t/gui/statusbarwidgets/infowidget.py +2 -2
- meerk40t/gui/tips.py +15 -1
- meerk40t/gui/toolwidgets/toolpointmove.py +3 -1
- meerk40t/gui/wxmmain.py +242 -114
- meerk40t/gui/wxmscene.py +107 -24
- meerk40t/gui/wxmtree.py +4 -2
- meerk40t/gui/wxutils.py +60 -15
- meerk40t/image/imagetools.py +129 -65
- meerk40t/internal_plugins.py +4 -0
- meerk40t/kernel/kernel.py +39 -18
- meerk40t/kernel/settings.py +28 -9
- meerk40t/lihuiyu/device.py +24 -12
- meerk40t/main.py +1 -1
- meerk40t/moshi/device.py +20 -6
- meerk40t/network/console_server.py +22 -6
- meerk40t/newly/device.py +10 -3
- meerk40t/newly/gui/gui.py +10 -0
- meerk40t/ruida/device.py +22 -2
- meerk40t/ruida/loader.py +6 -3
- meerk40t/tools/geomstr.py +193 -125
- meerk40t/tools/rasterplotter.py +179 -93
- {meerk40t-0.9.7030.dist-info → meerk40t-0.9.7040.dist-info}/METADATA +1 -1
- {meerk40t-0.9.7030.dist-info → meerk40t-0.9.7040.dist-info}/RECORD +79 -78
- {meerk40t-0.9.7030.dist-info → meerk40t-0.9.7040.dist-info}/LICENSE +0 -0
- {meerk40t-0.9.7030.dist-info → meerk40t-0.9.7040.dist-info}/WHEEL +0 -0
- {meerk40t-0.9.7030.dist-info → meerk40t-0.9.7040.dist-info}/entry_points.txt +0 -0
- {meerk40t-0.9.7030.dist-info → meerk40t-0.9.7040.dist-info}/top_level.txt +0 -0
- {meerk40t-0.9.7030.dist-info → meerk40t-0.9.7040.dist-info}/zip-safe +0 -0
meerk40t/lihuiyu/device.py
CHANGED
@@ -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
|
-
_(
|
378
|
-
|
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,
|
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"
|
1028
|
-
"legacy"
|
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
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
|
-
_(
|
214
|
-
|
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,
|
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"
|
491
|
-
"legacy"
|
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,
|
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
|
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(
|
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(
|
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 =
|
29
|
+
commands = []
|
30
30
|
job.channel = commands.append
|
31
|
-
|
32
|
-
|
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
|
|