meerk40t 0.9.7020__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/cutcode/cutcode.py +1 -1
- meerk40t/core/cutplan.py +169 -43
- meerk40t/core/elements/element_treeops.py +444 -147
- meerk40t/core/elements/elements.py +100 -9
- meerk40t/core/elements/grid.py +8 -1
- meerk40t/core/elements/offset_mk.py +2 -1
- meerk40t/core/elements/shapes.py +618 -279
- 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 +70 -19
- meerk40t/core/node/refnode.py +2 -1
- meerk40t/core/planner.py +23 -0
- meerk40t/core/svg_io.py +91 -34
- meerk40t/core/undos.py +1 -1
- meerk40t/core/wordlist.py +1 -0
- meerk40t/device/dummydevice.py +7 -1
- meerk40t/dxf/dxf_io.py +6 -0
- meerk40t/extra/mk_potrace.py +1959 -0
- meerk40t/extra/param_functions.py +1 -1
- meerk40t/extra/potrace.py +14 -10
- meerk40t/extra/vtracer.py +222 -0
- meerk40t/grbl/device.py +81 -8
- meerk40t/grbl/interpreter.py +1 -1
- meerk40t/gui/about.py +21 -3
- meerk40t/gui/basicops.py +3 -3
- meerk40t/gui/choicepropertypanel.py +1 -4
- meerk40t/gui/devicepanel.py +20 -16
- meerk40t/gui/gui_mixins.py +8 -1
- 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/spoolerpanel.py +6 -9
- meerk40t/gui/statusbarwidgets/defaultoperations.py +84 -48
- meerk40t/gui/statusbarwidgets/infowidget.py +2 -2
- meerk40t/gui/themes.py +7 -1
- meerk40t/gui/tips.py +15 -1
- meerk40t/gui/toolwidgets/toolpointmove.py +3 -1
- meerk40t/gui/wxmeerk40t.py +26 -0
- meerk40t/gui/wxmmain.py +242 -114
- meerk40t/gui/wxmscene.py +180 -4
- meerk40t/gui/wxmtree.py +4 -2
- meerk40t/gui/wxutils.py +60 -15
- meerk40t/image/imagetools.py +130 -66
- meerk40t/internal_plugins.py +4 -0
- meerk40t/kernel/kernel.py +49 -22
- meerk40t/kernel/settings.py +29 -8
- meerk40t/lihuiyu/device.py +30 -12
- meerk40t/main.py +22 -5
- 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/gui/gui.py +6 -6
- meerk40t/ruida/gui/ruidaoperationproperties.py +1 -10
- meerk40t/ruida/loader.py +6 -3
- meerk40t/ruida/rdjob.py +3 -3
- meerk40t/tools/geomstr.py +195 -39
- meerk40t/tools/rasterplotter.py +179 -93
- {meerk40t-0.9.7020.dist-info → meerk40t-0.9.7040.dist-info}/METADATA +1 -1
- {meerk40t-0.9.7020.dist-info → meerk40t-0.9.7040.dist-info}/RECORD +98 -96
- {meerk40t-0.9.7020.dist-info → meerk40t-0.9.7040.dist-info}/WHEEL +1 -1
- {meerk40t-0.9.7020.dist-info → meerk40t-0.9.7040.dist-info}/LICENSE +0 -0
- {meerk40t-0.9.7020.dist-info → meerk40t-0.9.7040.dist-info}/entry_points.txt +0 -0
- {meerk40t-0.9.7020.dist-info → meerk40t-0.9.7040.dist-info}/top_level.txt +0 -0
- {meerk40t-0.9.7020.dist-info → meerk40t-0.9.7040.dist-info}/zip-safe +0 -0
@@ -112,7 +112,18 @@ from meerk40t.kernel import CommandSyntaxError
|
|
112
112
|
from meerk40t.svgelements import Matrix, Point
|
113
113
|
from meerk40t.tools.geomstr import Geomstr
|
114
114
|
|
115
|
-
from .element_types import
|
115
|
+
from .element_types import (
|
116
|
+
effect_nodes,
|
117
|
+
elem_group_nodes,
|
118
|
+
elem_nodes,
|
119
|
+
elem_ref_nodes,
|
120
|
+
non_structural_nodes,
|
121
|
+
op_burnable_nodes,
|
122
|
+
op_image_nodes,
|
123
|
+
op_nodes,
|
124
|
+
op_parent_nodes,
|
125
|
+
op_vector_nodes,
|
126
|
+
)
|
116
127
|
|
117
128
|
|
118
129
|
def plugin(kernel, lifecycle=None):
|
@@ -158,7 +169,10 @@ def init_tree(kernel):
|
|
158
169
|
## @tree_separator_after()
|
159
170
|
@tree_conditional(lambda node: len(list(self.ops(selected=True))) == 1)
|
160
171
|
@tree_operation(
|
161
|
-
_("Operation properties"),
|
172
|
+
_("Operation properties"),
|
173
|
+
node_type=op_nodes,
|
174
|
+
help=_("Open property window for operation"),
|
175
|
+
grouping="00PROPS",
|
162
176
|
)
|
163
177
|
def operation_property(node, **kwargs):
|
164
178
|
activate = self.kernel.lookup("function/open_property_window_for_node")
|
@@ -166,7 +180,12 @@ def init_tree(kernel):
|
|
166
180
|
activate(node)
|
167
181
|
|
168
182
|
## @tree_separator_after()
|
169
|
-
@tree_operation(
|
183
|
+
@tree_operation(
|
184
|
+
_("Edit"),
|
185
|
+
node_type="util console",
|
186
|
+
help=_("Modify console command"),
|
187
|
+
grouping="00PROPS",
|
188
|
+
)
|
170
189
|
def edit_console_command(node, **kwargs):
|
171
190
|
activate = self.kernel.lookup("function/open_property_window_for_node")
|
172
191
|
if activate is not None:
|
@@ -286,7 +305,10 @@ def init_tree(kernel):
|
|
286
305
|
"""
|
287
306
|
|
288
307
|
@tree_operation(
|
289
|
-
_("Remove effect"),
|
308
|
+
_("Remove effect"),
|
309
|
+
node_type=effect_nodes,
|
310
|
+
help=_("Remove hatch/wobble"),
|
311
|
+
grouping="10_ELEM_DELETION",
|
290
312
|
)
|
291
313
|
def remove_effect(node, **kwargs):
|
292
314
|
with self.undoscope("Remove effect"):
|
@@ -300,7 +322,10 @@ def init_tree(kernel):
|
|
300
322
|
|
301
323
|
@tree_conditional(lambda node: is_hatched(node))
|
302
324
|
@tree_operation(
|
303
|
-
_("Remove effect"),
|
325
|
+
_("Remove effect"),
|
326
|
+
node_type=elem_nodes,
|
327
|
+
help=_("Remove surrounding hatch/wobble"),
|
328
|
+
grouping="10_ELEM_DELETION",
|
304
329
|
)
|
305
330
|
def unhatch_elements(node, **kwargs):
|
306
331
|
# Language hint: _("Remove effect")
|
@@ -367,7 +392,9 @@ def init_tree(kernel):
|
|
367
392
|
def ungroup_elements(node, **kwargs):
|
368
393
|
with self.undoscope("Ungroup elements"):
|
369
394
|
to_treat = []
|
370
|
-
for gnode in self.flat(
|
395
|
+
for gnode in self.flat(
|
396
|
+
selected=True, cascade=False, types=("group", "file")
|
397
|
+
):
|
371
398
|
enode = gnode
|
372
399
|
while True:
|
373
400
|
if enode.parent is None or enode.parent is self.elem_branch:
|
@@ -449,9 +476,9 @@ def init_tree(kernel):
|
|
449
476
|
for e in dataset:
|
450
477
|
if not hasattr(e, "hidden"):
|
451
478
|
continue
|
452
|
-
if mode==0:
|
479
|
+
if mode == 0:
|
453
480
|
e.hidden = True
|
454
|
-
elif mode==1:
|
481
|
+
elif mode == 1:
|
455
482
|
e.hidden = False
|
456
483
|
else:
|
457
484
|
e.hidden = not e.hidden
|
@@ -706,7 +733,10 @@ def init_tree(kernel):
|
|
706
733
|
|
707
734
|
@tree_submenu(_("Burning sequence"))
|
708
735
|
@tree_operation(
|
709
|
-
_("Burn first"),
|
736
|
+
_("Burn first"),
|
737
|
+
node_type=op_parent_nodes,
|
738
|
+
help=_("Establish the sequence of operations during burntime"),
|
739
|
+
grouping="OPS_40_SEQUENCE",
|
710
740
|
)
|
711
741
|
def burn_first(node, **kwargs):
|
712
742
|
move_op(node, "top")
|
@@ -723,14 +753,20 @@ def init_tree(kernel):
|
|
723
753
|
|
724
754
|
@tree_submenu(_("Burning sequence"))
|
725
755
|
@tree_operation(
|
726
|
-
_("Burn later"),
|
756
|
+
_("Burn later"),
|
757
|
+
node_type=op_parent_nodes,
|
758
|
+
help=_("Establish the sequence of operations during burntime"),
|
759
|
+
grouping="OPS_40_SEQUENCE",
|
727
760
|
)
|
728
761
|
def burn_later(node, **kwargs):
|
729
762
|
move_op(node, "down")
|
730
763
|
|
731
764
|
@tree_submenu(_("Burning sequence"))
|
732
765
|
@tree_operation(
|
733
|
-
_("Burn last"),
|
766
|
+
_("Burn last"),
|
767
|
+
node_type=op_parent_nodes,
|
768
|
+
help=_("Establish the sequence of operations during burntime"),
|
769
|
+
grouping="OPS_40_SEQUENCE",
|
734
770
|
)
|
735
771
|
def burn_last(node, **kwargs):
|
736
772
|
move_op(node, "bottom")
|
@@ -739,7 +775,9 @@ def init_tree(kernel):
|
|
739
775
|
@tree_operation(
|
740
776
|
_("Convert to Image"),
|
741
777
|
node_type=op_parent_nodes,
|
742
|
-
help=_(
|
778
|
+
help=_(
|
779
|
+
"Convert an operation to a different type maintaining properties and assigned elements"
|
780
|
+
),
|
743
781
|
grouping="OPS_60_CONVERSION",
|
744
782
|
)
|
745
783
|
def convert_operation_image(node, **kwargs):
|
@@ -748,6 +786,8 @@ def init_tree(kernel):
|
|
748
786
|
return
|
749
787
|
with self.undoscope("Convert to Image"):
|
750
788
|
for n in data:
|
789
|
+
if n.type not in op_parent_nodes:
|
790
|
+
continue
|
751
791
|
new_settings = dict(n.settings)
|
752
792
|
new_settings["type"] = "op image"
|
753
793
|
n.replace_node(keep_children=True, **new_settings)
|
@@ -757,7 +797,9 @@ def init_tree(kernel):
|
|
757
797
|
@tree_operation(
|
758
798
|
_("Convert to Raster"),
|
759
799
|
node_type=op_parent_nodes,
|
760
|
-
help=_(
|
800
|
+
help=_(
|
801
|
+
"Convert an operation to a different type maintaining properties and assigned elements"
|
802
|
+
),
|
761
803
|
grouping="OPS_60_CONVERSION",
|
762
804
|
)
|
763
805
|
def convert_operation_raster(node, **kwargs):
|
@@ -766,6 +808,8 @@ def init_tree(kernel):
|
|
766
808
|
return
|
767
809
|
with self.undoscope("Convert to Raster"):
|
768
810
|
for n in data:
|
811
|
+
if n.type not in op_parent_nodes:
|
812
|
+
continue
|
769
813
|
new_settings = dict(n.settings)
|
770
814
|
new_settings["type"] = "op raster"
|
771
815
|
n.replace_node(keep_children=True, **new_settings)
|
@@ -775,7 +819,9 @@ def init_tree(kernel):
|
|
775
819
|
@tree_operation(
|
776
820
|
_("Convert to Engrave"),
|
777
821
|
node_type=op_parent_nodes,
|
778
|
-
help=_(
|
822
|
+
help=_(
|
823
|
+
"Convert an operation to a different type maintaining properties and assigned elements"
|
824
|
+
),
|
779
825
|
grouping="OPS_60_CONVERSION",
|
780
826
|
)
|
781
827
|
def convert_operation_engrave(node, **kwargs):
|
@@ -784,6 +830,8 @@ def init_tree(kernel):
|
|
784
830
|
return
|
785
831
|
with self.undoscope("Convert to Engrave"):
|
786
832
|
for n in data:
|
833
|
+
if n.type not in op_parent_nodes:
|
834
|
+
continue
|
787
835
|
new_settings = dict(n.settings)
|
788
836
|
new_settings["type"] = "op engrave"
|
789
837
|
n.replace_node(keep_children=True, **new_settings)
|
@@ -793,7 +841,9 @@ def init_tree(kernel):
|
|
793
841
|
@tree_operation(
|
794
842
|
_("Convert to Cut"),
|
795
843
|
node_type=op_parent_nodes,
|
796
|
-
help=_(
|
844
|
+
help=_(
|
845
|
+
"Convert an operation to a different type maintaining properties and assigned elements"
|
846
|
+
),
|
797
847
|
grouping="OPS_60_CONVERSION",
|
798
848
|
)
|
799
849
|
def convert_operation_cut(node, **kwargs):
|
@@ -802,6 +852,8 @@ def init_tree(kernel):
|
|
802
852
|
return
|
803
853
|
with self.undoscope("Convert to Cut"):
|
804
854
|
for n in data:
|
855
|
+
if n.type not in op_parent_nodes:
|
856
|
+
continue
|
805
857
|
new_settings = dict(n.settings)
|
806
858
|
new_settings["type"] = "op cut"
|
807
859
|
n.replace_node(keep_children=True, **new_settings)
|
@@ -811,7 +863,9 @@ def init_tree(kernel):
|
|
811
863
|
@tree_operation(
|
812
864
|
_("Convert to Dots"),
|
813
865
|
node_type=op_parent_nodes,
|
814
|
-
help=_(
|
866
|
+
help=_(
|
867
|
+
"Convert an operation to a different type maintaining properties and assigned elements"
|
868
|
+
),
|
815
869
|
grouping="OPS_60_CONVERSION",
|
816
870
|
)
|
817
871
|
def convert_operation_dots(node, **kwargs):
|
@@ -820,6 +874,8 @@ def init_tree(kernel):
|
|
820
874
|
return
|
821
875
|
with self.undoscope("Convert to Dots"):
|
822
876
|
for n in data:
|
877
|
+
if n.type not in op_parent_nodes:
|
878
|
+
continue
|
823
879
|
new_settings = dict(n.settings)
|
824
880
|
new_settings["type"] = "op dots"
|
825
881
|
n.replace_node(keep_children=True, **new_settings)
|
@@ -827,7 +883,10 @@ def init_tree(kernel):
|
|
827
883
|
|
828
884
|
@tree_submenu(_("Raster-Wizard"))
|
829
885
|
@tree_operation(
|
830
|
-
_("Set to None"),
|
886
|
+
_("Set to None"),
|
887
|
+
node_type="elem image",
|
888
|
+
help=_("Remove stored image operations"),
|
889
|
+
grouping="70_ELEM_IMAGES",
|
831
890
|
)
|
832
891
|
def image_rasterwizard_apply_none(node, **kwargs):
|
833
892
|
data = []
|
@@ -851,7 +910,10 @@ def init_tree(kernel):
|
|
851
910
|
@tree_submenu(_("Raster-Wizard"))
|
852
911
|
@tree_values("script", values=list(self.match("raster_script", suffix=True)))
|
853
912
|
@tree_operation(
|
854
|
-
_("Apply: {script}"),
|
913
|
+
_("Apply: {script}"),
|
914
|
+
node_type="elem image",
|
915
|
+
help=_("Apply a predefined script to an image"),
|
916
|
+
grouping="70_ELEM_IMAGES",
|
855
917
|
)
|
856
918
|
def image_rasterwizard_apply(node, script=None, **kwargs):
|
857
919
|
raster_script = self.lookup(f"raster_script/{script}")
|
@@ -888,11 +950,12 @@ def init_tree(kernel):
|
|
888
950
|
image, box = node.as_image()
|
889
951
|
vertical = mode.lower() != "horizontal"
|
890
952
|
bidirectional = self._image_2_path_bidirectional
|
891
|
-
threshold = 0.5 if self._image_2_path_optimize else None
|
953
|
+
threshold = 0.5 if self._image_2_path_optimize else None # Half a percent
|
892
954
|
geom = Geomstr.image(
|
893
|
-
|
894
|
-
|
895
|
-
|
955
|
+
image,
|
956
|
+
vertical=vertical,
|
957
|
+
bidirectional=bidirectional,
|
958
|
+
)
|
896
959
|
if threshold:
|
897
960
|
geom.two_opt_distance(auto_stop_threshold=threshold, feedback=feedback)
|
898
961
|
# self.context
|
@@ -915,7 +978,10 @@ def init_tree(kernel):
|
|
915
978
|
|
916
979
|
@tree_submenu(_("Convert to Path"))
|
917
980
|
@tree_operation(
|
918
|
-
_("Horizontal"),
|
981
|
+
_("Horizontal"),
|
982
|
+
node_type="elem image",
|
983
|
+
help=_("Create a horizontal linepattern from the image"),
|
984
|
+
grouping="70_ELEM_IMAGES_Y",
|
919
985
|
)
|
920
986
|
def image_convert_to_path_horizontal(node, **kwargs):
|
921
987
|
# Language hint _("To path: Horizontal")
|
@@ -923,7 +989,10 @@ def init_tree(kernel):
|
|
923
989
|
|
924
990
|
@tree_submenu(_("Convert to Path"))
|
925
991
|
@tree_operation(
|
926
|
-
_("Vertical"),
|
992
|
+
_("Vertical"),
|
993
|
+
node_type="elem image",
|
994
|
+
help=_("Create a vertical linepattern from the image"),
|
995
|
+
grouping="70_ELEM_IMAGES_Y",
|
927
996
|
)
|
928
997
|
def image_convert_to_path_vertical(node, **kwargs):
|
929
998
|
convert_image_to_path(node, "Vertical")
|
@@ -940,7 +1009,9 @@ def init_tree(kernel):
|
|
940
1009
|
@tree_operation(
|
941
1010
|
_("Bidirectional"),
|
942
1011
|
node_type="elem image",
|
943
|
-
help=_(
|
1012
|
+
help=_(
|
1013
|
+
"Shall the line pattern be able to travel back and forth or will it always start at the same side"
|
1014
|
+
),
|
944
1015
|
grouping="70_ELEM_IMAGES_Y",
|
945
1016
|
)
|
946
1017
|
def set_img_2_path_option_1(node, **kwargs):
|
@@ -951,13 +1022,14 @@ def init_tree(kernel):
|
|
951
1022
|
@tree_operation(
|
952
1023
|
_("Optimize travel"),
|
953
1024
|
node_type="elem image",
|
954
|
-
help=_(
|
1025
|
+
help=_(
|
1026
|
+
"Shall the line pattern be able to travel back and forth or will it always start at the same side"
|
1027
|
+
),
|
955
1028
|
grouping="70_ELEM_IMAGES_Y",
|
956
1029
|
)
|
957
1030
|
def set_img_2_path_option_2(node, **kwargs):
|
958
1031
|
self._image_2_path_optimize = not self._image_2_path_optimize
|
959
1032
|
|
960
|
-
|
961
1033
|
def radio_match_speed(node, speed=0, **kwargs):
|
962
1034
|
return node.speed == float(speed)
|
963
1035
|
|
@@ -965,7 +1037,10 @@ def init_tree(kernel):
|
|
965
1037
|
@tree_radio(radio_match_speed)
|
966
1038
|
@tree_values("speed", (5, 10, 50, 75, 100, 150, 200, 250, 300, 350, 400, 450, 500))
|
967
1039
|
@tree_operation(
|
968
|
-
_("{speed}mm/s"),
|
1040
|
+
_("{speed}mm/s"),
|
1041
|
+
node_type=op_image_nodes,
|
1042
|
+
help=_("Set speed for the operation"),
|
1043
|
+
grouping="OPS_70_MODIFY",
|
969
1044
|
)
|
970
1045
|
def set_speed_raster(node, speed=150, **kwargs):
|
971
1046
|
data = list()
|
@@ -984,7 +1059,10 @@ def init_tree(kernel):
|
|
984
1059
|
@tree_radio(radio_match_speed)
|
985
1060
|
@tree_values("speed", (2, 3, 4, 5, 6, 7, 10, 15, 20, 25, 30, 35, 40, 50))
|
986
1061
|
@tree_operation(
|
987
|
-
_("{speed}mm/s"),
|
1062
|
+
_("{speed}mm/s"),
|
1063
|
+
node_type=op_vector_nodes,
|
1064
|
+
help=_("Set speed for the operation"),
|
1065
|
+
grouping="OPS_70_MODIFY",
|
988
1066
|
)
|
989
1067
|
def set_speed_vector_cut(node, speed=20, **kwargs):
|
990
1068
|
data = list()
|
@@ -1302,7 +1380,10 @@ def init_tree(kernel):
|
|
1302
1380
|
activate(node)
|
1303
1381
|
|
1304
1382
|
@tree_operation(
|
1305
|
-
_("Clear all"),
|
1383
|
+
_("Clear all"),
|
1384
|
+
node_type="branch ops",
|
1385
|
+
help=_("Delete all operations"),
|
1386
|
+
grouping="10_OPS_DELETION",
|
1306
1387
|
)
|
1307
1388
|
def clear_all(node, **kwargs):
|
1308
1389
|
if self.kernel.yesno(
|
@@ -1461,7 +1542,10 @@ def init_tree(kernel):
|
|
1461
1542
|
# ==========
|
1462
1543
|
|
1463
1544
|
@tree_operation(
|
1464
|
-
_("Clear all"),
|
1545
|
+
_("Clear all"),
|
1546
|
+
node_type="branch elems",
|
1547
|
+
help=_("Delete all elements"),
|
1548
|
+
grouping="10_ELEM_DELETION",
|
1465
1549
|
)
|
1466
1550
|
def clear_all_elems(node, **kwargs):
|
1467
1551
|
# self("element* delete\n")
|
@@ -1477,7 +1561,10 @@ def init_tree(kernel):
|
|
1477
1561
|
# ==========
|
1478
1562
|
|
1479
1563
|
@tree_operation(
|
1480
|
-
_("Clear all"),
|
1564
|
+
_("Clear all"),
|
1565
|
+
node_type="branch reg",
|
1566
|
+
help=_("Delete all registration marks"),
|
1567
|
+
grouping="REG_05_DELETION",
|
1481
1568
|
)
|
1482
1569
|
def clear_all_regmarks(node, **kwargs):
|
1483
1570
|
if self.kernel.yesno(
|
@@ -1624,10 +1711,18 @@ def init_tree(kernel):
|
|
1624
1711
|
def remove_type_file(node, **kwargs):
|
1625
1712
|
to_be_removed = [node]
|
1626
1713
|
for e in self.elem_branch.children:
|
1627
|
-
if
|
1714
|
+
if (
|
1715
|
+
e.type == "file"
|
1716
|
+
and e.filepath == node.filepath
|
1717
|
+
and e not in to_be_removed
|
1718
|
+
):
|
1628
1719
|
to_be_removed.append(e)
|
1629
1720
|
for e in self.reg_branch.children:
|
1630
|
-
if
|
1721
|
+
if (
|
1722
|
+
e.type == "file"
|
1723
|
+
and e.filepath == node.filepath
|
1724
|
+
and e not in to_be_removed
|
1725
|
+
):
|
1631
1726
|
to_be_removed.append(e)
|
1632
1727
|
if len(to_be_removed) == 0:
|
1633
1728
|
return
|
@@ -1864,9 +1959,7 @@ def init_tree(kernel):
|
|
1864
1959
|
node.remove_node()
|
1865
1960
|
return True
|
1866
1961
|
|
1867
|
-
@tree_conditional_try(
|
1868
|
-
lambda node: node.data_type == "egv"
|
1869
|
-
)
|
1962
|
+
@tree_conditional_try(lambda node: node.data_type == "egv")
|
1870
1963
|
@tree_operation(
|
1871
1964
|
_("Convert to Elements"),
|
1872
1965
|
node_type="blob",
|
@@ -1875,6 +1968,7 @@ def init_tree(kernel):
|
|
1875
1968
|
)
|
1876
1969
|
def egv2path(node, **kwargs):
|
1877
1970
|
from meerk40t.lihuiyu.parser import LihuiyuParser
|
1971
|
+
|
1878
1972
|
parser = LihuiyuParser()
|
1879
1973
|
parser.fix_speeds = True
|
1880
1974
|
parser.parse(node.data, self)
|
@@ -1928,7 +2022,10 @@ def init_tree(kernel):
|
|
1928
2022
|
|
1929
2023
|
@tree_submenu(_("Clone reference"))
|
1930
2024
|
@tree_operation(
|
1931
|
-
_("Make 1 copy"),
|
2025
|
+
_("Make 1 copy"),
|
2026
|
+
node_type=("reference",),
|
2027
|
+
help=_("Add an additional reference of the master element"),
|
2028
|
+
grouping="20_OPS_DUPLICATION",
|
1932
2029
|
)
|
1933
2030
|
def clone_single_element_op(node, **kwargs):
|
1934
2031
|
clone_element_op(node, copies=1, **kwargs)
|
@@ -2220,7 +2317,12 @@ def init_tree(kernel):
|
|
2220
2317
|
@tree_values("opname", values=material_ids)
|
2221
2318
|
@tree_submenu_list(material_menus)
|
2222
2319
|
@tree_calc("material", lambda opname: material_name(opname))
|
2223
|
-
@tree_operation(
|
2320
|
+
@tree_operation(
|
2321
|
+
"{material}",
|
2322
|
+
node_type="branch ops",
|
2323
|
+
help=_("Populate the operation template list at the bottom"),
|
2324
|
+
grouping="OPS_60_MATMAN",
|
2325
|
+
)
|
2224
2326
|
def load_ops(node, opname, **kwargs):
|
2225
2327
|
self(f"material load {opname}\n")
|
2226
2328
|
if self.update_statusbar_on_material_load:
|
@@ -2290,7 +2392,10 @@ def init_tree(kernel):
|
|
2290
2392
|
## @tree_separator_before()
|
2291
2393
|
@tree_submenu(_("Append operation"))
|
2292
2394
|
@tree_operation(
|
2293
|
-
_("Append Image"),
|
2395
|
+
_("Append Image"),
|
2396
|
+
node_type="branch ops",
|
2397
|
+
help=_("Add an operation to the tree"),
|
2398
|
+
grouping="OPS_40_ADDITION",
|
2294
2399
|
)
|
2295
2400
|
def append_operation_image(node, pos=None, **kwargs):
|
2296
2401
|
with self.undoscope("Append operation"):
|
@@ -2299,7 +2404,10 @@ def init_tree(kernel):
|
|
2299
2404
|
|
2300
2405
|
@tree_submenu(_("Append operation"))
|
2301
2406
|
@tree_operation(
|
2302
|
-
_("Append Raster"),
|
2407
|
+
_("Append Raster"),
|
2408
|
+
node_type="branch ops",
|
2409
|
+
help=_("Add an operation to the tree"),
|
2410
|
+
grouping="OPS_40_ADDITION",
|
2303
2411
|
)
|
2304
2412
|
def append_operation_raster(node, pos=None, **kwargs):
|
2305
2413
|
with self.undoscope("Append operation"):
|
@@ -2308,7 +2416,10 @@ def init_tree(kernel):
|
|
2308
2416
|
|
2309
2417
|
@tree_submenu(_("Append operation"))
|
2310
2418
|
@tree_operation(
|
2311
|
-
_("Append Engrave"),
|
2419
|
+
_("Append Engrave"),
|
2420
|
+
node_type="branch ops",
|
2421
|
+
help=_("Add an operation to the tree"),
|
2422
|
+
grouping="OPS_40_ADDITION",
|
2312
2423
|
)
|
2313
2424
|
def append_operation_engrave(node, pos=None, **kwargs):
|
2314
2425
|
with self.undoscope("Append operation"):
|
@@ -2317,7 +2428,10 @@ def init_tree(kernel):
|
|
2317
2428
|
|
2318
2429
|
@tree_submenu(_("Append operation"))
|
2319
2430
|
@tree_operation(
|
2320
|
-
_("Append Cut"),
|
2431
|
+
_("Append Cut"),
|
2432
|
+
node_type="branch ops",
|
2433
|
+
help=_("Add an operation to the tree"),
|
2434
|
+
grouping="OPS_40_ADDITION",
|
2321
2435
|
)
|
2322
2436
|
def append_operation_cut(node, pos=None, **kwargs):
|
2323
2437
|
with self.undoscope("Append operation"):
|
@@ -2326,7 +2440,10 @@ def init_tree(kernel):
|
|
2326
2440
|
|
2327
2441
|
@tree_submenu(_("Append operation"))
|
2328
2442
|
@tree_operation(
|
2329
|
-
_("Append new Hatch"),
|
2443
|
+
_("Append new Hatch"),
|
2444
|
+
node_type="branch ops",
|
2445
|
+
help=_("Add an operation to the tree"),
|
2446
|
+
grouping="OPS_40_ADDITION",
|
2330
2447
|
)
|
2331
2448
|
def append_operation_hatch(node, pos=None, **kwargs):
|
2332
2449
|
with self.undoscope("Append operation"):
|
@@ -2336,7 +2453,10 @@ def init_tree(kernel):
|
|
2336
2453
|
|
2337
2454
|
@tree_submenu(_("Append operation"))
|
2338
2455
|
@tree_operation(
|
2339
|
-
_("Append Dots"),
|
2456
|
+
_("Append Dots"),
|
2457
|
+
node_type="branch ops",
|
2458
|
+
help=_("Add an operation to the tree"),
|
2459
|
+
grouping="OPS_40_ADDITION",
|
2340
2460
|
)
|
2341
2461
|
def append_operation_dots(node, pos=None, **kwargs):
|
2342
2462
|
self.op_branch.add("op dots", pos=pos)
|
@@ -2344,7 +2464,10 @@ def init_tree(kernel):
|
|
2344
2464
|
|
2345
2465
|
@tree_submenu(_("Append special operation(s)"))
|
2346
2466
|
@tree_operation(
|
2347
|
-
_("Append Home"),
|
2467
|
+
_("Append Home"),
|
2468
|
+
node_type="branch ops",
|
2469
|
+
help=_("Add an operation to the tree"),
|
2470
|
+
grouping="OPS_40_ADDITION",
|
2348
2471
|
)
|
2349
2472
|
def append_operation_home(node, pos=None, **kwargs):
|
2350
2473
|
with self.undoscope("Append operation"):
|
@@ -2383,7 +2506,10 @@ def init_tree(kernel):
|
|
2383
2506
|
|
2384
2507
|
@tree_submenu(_("Append special operation(s)"))
|
2385
2508
|
@tree_operation(
|
2386
|
-
_("Append Beep"),
|
2509
|
+
_("Append Beep"),
|
2510
|
+
node_type="branch ops",
|
2511
|
+
help=_("Add an operation to the tree"),
|
2512
|
+
grouping="OPS_40_ADDITION",
|
2387
2513
|
)
|
2388
2514
|
def append_operation_beep(node, pos=None, **kwargs):
|
2389
2515
|
with self.undoscope("Append operation"):
|
@@ -2413,7 +2539,10 @@ def init_tree(kernel):
|
|
2413
2539
|
@tree_submenu(_("Append special operation(s)"))
|
2414
2540
|
@tree_prompt("wait_time", _("Wait for how long (in seconds)?"), data_type=float)
|
2415
2541
|
@tree_operation(
|
2416
|
-
_("Append Wait"),
|
2542
|
+
_("Append Wait"),
|
2543
|
+
node_type="branch ops",
|
2544
|
+
help=_("Add an operation to the tree"),
|
2545
|
+
grouping="OPS_40_ADDITION",
|
2417
2546
|
)
|
2418
2547
|
def append_operation_wait(node, wait_time, pos=None, **kwargs):
|
2419
2548
|
with self.undoscope("Append operation"):
|
@@ -2426,7 +2555,10 @@ def init_tree(kernel):
|
|
2426
2555
|
|
2427
2556
|
@tree_submenu(_("Append special operation(s)"))
|
2428
2557
|
@tree_operation(
|
2429
|
-
_("Append Output"),
|
2558
|
+
_("Append Output"),
|
2559
|
+
node_type="branch ops",
|
2560
|
+
help=_("Add an operation to the tree"),
|
2561
|
+
grouping="OPS_40_ADDITION",
|
2430
2562
|
)
|
2431
2563
|
def append_operation_output(node, pos=None, **kwargs):
|
2432
2564
|
with self.undoscope("Append operation"):
|
@@ -2441,7 +2573,10 @@ def init_tree(kernel):
|
|
2441
2573
|
|
2442
2574
|
@tree_submenu(_("Append special operation(s)"))
|
2443
2575
|
@tree_operation(
|
2444
|
-
_("Append Input"),
|
2576
|
+
_("Append Input"),
|
2577
|
+
node_type="branch ops",
|
2578
|
+
help=_("Add an operation to the tree"),
|
2579
|
+
grouping="OPS_40_ADDITION",
|
2445
2580
|
)
|
2446
2581
|
def append_operation_input(node, pos=None, **kwargs):
|
2447
2582
|
with self.undoscope("Append operation"):
|
@@ -2532,7 +2667,10 @@ def init_tree(kernel):
|
|
2532
2667
|
@tree_submenu(_("Append special operation(s)"))
|
2533
2668
|
@tree_prompt("opname", _("Console command to append to operations?"))
|
2534
2669
|
@tree_operation(
|
2535
|
-
_("Append Console"),
|
2670
|
+
_("Append Console"),
|
2671
|
+
node_type="branch ops",
|
2672
|
+
help=_("Add an operation to the tree"),
|
2673
|
+
grouping="OPS_40_ADDITION",
|
2536
2674
|
)
|
2537
2675
|
def append_operation_custom(node, opname, pos=None, **kwargs):
|
2538
2676
|
with self.undoscope("Append operation"):
|
@@ -2627,7 +2765,12 @@ def init_tree(kernel):
|
|
2627
2765
|
self.signal("updateelem_tree")
|
2628
2766
|
|
2629
2767
|
@tree_submenu(_("Apply special effect"))
|
2630
|
-
@tree_operation(
|
2768
|
+
@tree_operation(
|
2769
|
+
_("Append Line-fill 0.1mm"),
|
2770
|
+
node_type=hatchable_elems,
|
2771
|
+
help=_("Apply hatch"),
|
2772
|
+
grouping="50_ELEM_MODIFY_ZMISC",
|
2773
|
+
)
|
2631
2774
|
def append_element_effect_eulerian(node, pos=None, **kwargs):
|
2632
2775
|
hatch_me(
|
2633
2776
|
node,
|
@@ -2639,7 +2782,10 @@ def init_tree(kernel):
|
|
2639
2782
|
|
2640
2783
|
@tree_submenu(_("Apply special effect"))
|
2641
2784
|
@tree_operation(
|
2642
|
-
_("Append diagonal Line-fill 0.1mm"),
|
2785
|
+
_("Append diagonal Line-fill 0.1mm"),
|
2786
|
+
node_type=hatchable_elems,
|
2787
|
+
help=_("Apply hatch"),
|
2788
|
+
grouping="50_ELEM_MODIFY_ZMISC",
|
2643
2789
|
)
|
2644
2790
|
def append_element_effect_eulerian_45(node, pos=None, **kwargs):
|
2645
2791
|
hatch_me(
|
@@ -2651,7 +2797,12 @@ def init_tree(kernel):
|
|
2651
2797
|
)
|
2652
2798
|
|
2653
2799
|
@tree_submenu(_("Apply special effect"))
|
2654
|
-
@tree_operation(
|
2800
|
+
@tree_operation(
|
2801
|
+
_("Append Line-Fill 1mm"),
|
2802
|
+
node_type=hatchable_elems,
|
2803
|
+
help=_("Apply hatch"),
|
2804
|
+
grouping="50_ELEM_MODIFY_ZMISC",
|
2805
|
+
)
|
2655
2806
|
def append_element_effect_line(node, pos=None, **kwargs):
|
2656
2807
|
hatch_me(
|
2657
2808
|
node,
|
@@ -2663,7 +2814,10 @@ def init_tree(kernel):
|
|
2663
2814
|
|
2664
2815
|
@tree_submenu(_("Apply special effect"))
|
2665
2816
|
@tree_operation(
|
2666
|
-
_("Append diagonal Line-Fill 1mm"),
|
2817
|
+
_("Append diagonal Line-Fill 1mm"),
|
2818
|
+
node_type=hatchable_elems,
|
2819
|
+
help=_("Apply hatch"),
|
2820
|
+
grouping="50_ELEM_MODIFY_ZMISC",
|
2667
2821
|
)
|
2668
2822
|
def append_element_effect_line_45(node, pos=None, **kwargs):
|
2669
2823
|
hatch_me(
|
@@ -2809,7 +2963,6 @@ def init_tree(kernel):
|
|
2809
2963
|
except AttributeError:
|
2810
2964
|
pass
|
2811
2965
|
|
2812
|
-
|
2813
2966
|
@tree_conditional(lambda node: node.count_children() > 1)
|
2814
2967
|
@tree_submenu(_("Duplicate element(s)"))
|
2815
2968
|
@tree_operation(
|
@@ -2866,13 +3019,15 @@ def init_tree(kernel):
|
|
2866
3019
|
dots_per_units = node.dpi / UNITS_PER_INCH
|
2867
3020
|
new_width = width * dots_per_units
|
2868
3021
|
new_height = height * dots_per_units
|
2869
|
-
|
2870
|
-
|
2871
|
-
|
2872
|
-
|
2873
|
-
|
2874
|
-
|
2875
|
-
|
3022
|
+
try:
|
3023
|
+
image = make_raster(
|
3024
|
+
data,
|
3025
|
+
bounds=bounds,
|
3026
|
+
width=new_width,
|
3027
|
+
height=new_height,
|
3028
|
+
)
|
3029
|
+
except Exception:
|
3030
|
+
return None, None
|
2876
3031
|
matrix = Matrix.scale(width / new_width, height / new_height)
|
2877
3032
|
matrix.post_translate(bounds[0], bounds[1])
|
2878
3033
|
return image, matrix
|
@@ -2882,7 +3037,7 @@ def init_tree(kernel):
|
|
2882
3037
|
_("Make raster image"),
|
2883
3038
|
node_type=op_burnable_nodes,
|
2884
3039
|
help=_("Create an image from the assigned elements."),
|
2885
|
-
grouping="OPS_75_CONVERTIMAGE"
|
3040
|
+
grouping="OPS_75_CONVERTIMAGE",
|
2886
3041
|
)
|
2887
3042
|
def make_raster_image(node, **kwargs):
|
2888
3043
|
image, matrix = create_image_from_operation(node)
|
@@ -2911,11 +3066,12 @@ def init_tree(kernel):
|
|
2911
3066
|
return
|
2912
3067
|
vertical = mode.lower() != "horizontal"
|
2913
3068
|
bidirectional = self._image_2_path_bidirectional
|
2914
|
-
threshold = 0.5 if self._image_2_path_optimize else None
|
3069
|
+
threshold = 0.5 if self._image_2_path_optimize else None # Half a percent
|
2915
3070
|
geom = Geomstr.image(
|
2916
|
-
|
2917
|
-
|
2918
|
-
|
3071
|
+
image,
|
3072
|
+
vertical=vertical,
|
3073
|
+
bidirectional=bidirectional,
|
3074
|
+
)
|
2919
3075
|
if threshold:
|
2920
3076
|
geom.two_opt_distance(auto_stop_threshold=threshold, feedback=feedback)
|
2921
3077
|
# self.context
|
@@ -2938,7 +3094,10 @@ def init_tree(kernel):
|
|
2938
3094
|
@tree_submenu(_("Create image/path"))
|
2939
3095
|
@tree_separator_before()
|
2940
3096
|
@tree_operation(
|
2941
|
-
_("Horizontal"),
|
3097
|
+
_("Horizontal"),
|
3098
|
+
node_type="op raster",
|
3099
|
+
help=_("Create a horizontal linepattern from the raster"),
|
3100
|
+
grouping="OPS_75_CONVERTIMAGE",
|
2942
3101
|
)
|
2943
3102
|
def raster_convert_to_path_horizontal(node, **kwargs):
|
2944
3103
|
# Language hint _("To path: Horizontal")
|
@@ -2946,7 +3105,10 @@ def init_tree(kernel):
|
|
2946
3105
|
|
2947
3106
|
@tree_submenu(_("Create image/path"))
|
2948
3107
|
@tree_operation(
|
2949
|
-
_("Vertical"),
|
3108
|
+
_("Vertical"),
|
3109
|
+
node_type="op raster",
|
3110
|
+
help=_("Create a vertical linepattern from the raster"),
|
3111
|
+
grouping="OPS_75_CONVERTIMAGE",
|
2950
3112
|
)
|
2951
3113
|
def raster_convert_to_path_vertical(node, **kwargs):
|
2952
3114
|
convert_raster_to_path(node, "Vertical")
|
@@ -2957,7 +3119,9 @@ def init_tree(kernel):
|
|
2957
3119
|
@tree_operation(
|
2958
3120
|
_("Bidirectional"),
|
2959
3121
|
node_type="op raster",
|
2960
|
-
help=_(
|
3122
|
+
help=_(
|
3123
|
+
"Shall the line pattern be able to travel back and forth or will it always start at the same side"
|
3124
|
+
),
|
2961
3125
|
grouping="OPS_75_CONVERTIMAGE",
|
2962
3126
|
)
|
2963
3127
|
def set_raster_2_path_option_1(node, **kwargs):
|
@@ -2968,13 +3132,14 @@ def init_tree(kernel):
|
|
2968
3132
|
@tree_operation(
|
2969
3133
|
_("Optimize travel"),
|
2970
3134
|
node_type="op raster",
|
2971
|
-
help=_(
|
3135
|
+
help=_(
|
3136
|
+
"Shall the line pattern be able to travel back and forth or will it always start at the same side"
|
3137
|
+
),
|
2972
3138
|
grouping="OPS_75_CONVERTIMAGE",
|
2973
3139
|
)
|
2974
3140
|
def set_raster_2_path_option_2(node, **kwargs):
|
2975
3141
|
self._image_2_path_optimize = not self._image_2_path_optimize
|
2976
3142
|
|
2977
|
-
|
2978
3143
|
def add_after_index(node=None):
|
2979
3144
|
try:
|
2980
3145
|
if node is None:
|
@@ -2987,49 +3152,70 @@ def init_tree(kernel):
|
|
2987
3152
|
## @tree_separator_before()
|
2988
3153
|
@tree_submenu(_("Insert operation"))
|
2989
3154
|
@tree_operation(
|
2990
|
-
_("Add Image"),
|
3155
|
+
_("Add Image"),
|
3156
|
+
node_type=op_nodes,
|
3157
|
+
help=_("Add an operation to the tree"),
|
3158
|
+
grouping="OPS_40_ADDITION",
|
2991
3159
|
)
|
2992
3160
|
def add_operation_image(node, **kwargs):
|
2993
3161
|
append_operation_image(node, pos=add_after_index(node), **kwargs)
|
2994
3162
|
|
2995
3163
|
@tree_submenu(_("Insert operation"))
|
2996
3164
|
@tree_operation(
|
2997
|
-
_("Add Raster"),
|
3165
|
+
_("Add Raster"),
|
3166
|
+
node_type=op_nodes,
|
3167
|
+
help=_("Add an operation to the tree"),
|
3168
|
+
grouping="OPS_40_ADDITION",
|
2998
3169
|
)
|
2999
3170
|
def add_operation_raster(node, **kwargs):
|
3000
3171
|
append_operation_raster(node, pos=add_after_index(node), **kwargs)
|
3001
3172
|
|
3002
3173
|
@tree_submenu(_("Insert operation"))
|
3003
3174
|
@tree_operation(
|
3004
|
-
_("Add Engrave"),
|
3175
|
+
_("Add Engrave"),
|
3176
|
+
node_type=op_nodes,
|
3177
|
+
help=_("Add an operation to the tree"),
|
3178
|
+
grouping="OPS_40_ADDITION",
|
3005
3179
|
)
|
3006
3180
|
def add_operation_engrave(node, **kwargs):
|
3007
3181
|
append_operation_engrave(node, pos=add_after_index(node), **kwargs)
|
3008
3182
|
|
3009
3183
|
@tree_submenu(_("Insert operation"))
|
3010
3184
|
@tree_operation(
|
3011
|
-
_("Add Cut"),
|
3185
|
+
_("Add Cut"),
|
3186
|
+
node_type=op_nodes,
|
3187
|
+
help=_("Add an operation to the tree"),
|
3188
|
+
grouping="OPS_40_ADDITION",
|
3012
3189
|
)
|
3013
3190
|
def add_operation_cut(node, **kwargs):
|
3014
3191
|
append_operation_cut(node, pos=add_after_index(node), **kwargs)
|
3015
3192
|
|
3016
3193
|
@tree_submenu(_("Insert operation"))
|
3017
3194
|
@tree_operation(
|
3018
|
-
_("Add Hatch"),
|
3195
|
+
_("Add Hatch"),
|
3196
|
+
node_type=op_nodes,
|
3197
|
+
help=_("Add an operation to the tree"),
|
3198
|
+
grouping="OPS_40_ADDITION",
|
3019
3199
|
)
|
3020
3200
|
def add_operation_hatch(node, **kwargs):
|
3021
3201
|
append_operation_hatch(node, pos=add_after_index(node), **kwargs)
|
3022
3202
|
|
3023
3203
|
@tree_submenu(_("Insert operation"))
|
3024
3204
|
@tree_operation(
|
3025
|
-
_("Add Dots"),
|
3205
|
+
_("Add Dots"),
|
3206
|
+
node_type=op_nodes,
|
3207
|
+
help=_("Add an operation to the tree"),
|
3208
|
+
grouping="OPS_40_ADDITION",
|
3026
3209
|
)
|
3027
3210
|
def add_operation_dots(node, **kwargs):
|
3028
3211
|
append_operation_dots(node, pos=add_after_index(node), **kwargs)
|
3029
3212
|
|
3030
3213
|
@tree_submenu(_("Insert special operation(s)"))
|
3031
3214
|
@tree_operation(
|
3032
|
-
_("Add Home"),
|
3215
|
+
_("Add Home"),
|
3216
|
+
node_type=op_nodes,
|
3217
|
+
help=_("Add an operation to the tree"),
|
3218
|
+
grouping="OPS_40_ADDITION",
|
3033
3219
|
)
|
3034
3220
|
def add_operation_home(node, **kwargs):
|
3035
3221
|
append_operation_home(node, pos=add_after_index(node), **kwargs)
|
@@ -3046,14 +3232,20 @@ def init_tree(kernel):
|
|
3046
3232
|
|
3047
3233
|
@tree_submenu(_("Insert special operation(s)"))
|
3048
3234
|
@tree_operation(
|
3049
|
-
_("Add Beep"),
|
3235
|
+
_("Add Beep"),
|
3236
|
+
node_type=op_nodes,
|
3237
|
+
help=_("Add an operation to the tree"),
|
3238
|
+
grouping="OPS_40_ADDITION",
|
3050
3239
|
)
|
3051
3240
|
def add_operation_beep(node, **kwargs):
|
3052
3241
|
append_operation_beep(node, pos=add_after_index(node), **kwargs)
|
3053
3242
|
|
3054
3243
|
@tree_submenu(_("Insert special operation(s)"))
|
3055
3244
|
@tree_operation(
|
3056
|
-
_("Add Interrupt"),
|
3245
|
+
_("Add Interrupt"),
|
3246
|
+
node_type=op_nodes,
|
3247
|
+
help=_("Add an operation to the tree"),
|
3248
|
+
grouping="OPS_40_ADDITION",
|
3057
3249
|
)
|
3058
3250
|
def add_operation_interrupt(node, **kwargs):
|
3059
3251
|
append_operation_interrupt(node, pos=add_after_index(node), **kwargs)
|
@@ -3061,7 +3253,10 @@ def init_tree(kernel):
|
|
3061
3253
|
@tree_submenu(_("Insert special operation(s)"))
|
3062
3254
|
@tree_prompt("wait_time", _("Wait for how long (in seconds)?"), data_type=float)
|
3063
3255
|
@tree_operation(
|
3064
|
-
_("Add Wait"),
|
3256
|
+
_("Add Wait"),
|
3257
|
+
node_type=op_nodes,
|
3258
|
+
help=_("Add an operation to the tree"),
|
3259
|
+
grouping="OPS_40_ADDITION",
|
3065
3260
|
)
|
3066
3261
|
def add_operation_wait(node, wait_time, **kwargs):
|
3067
3262
|
append_operation_wait(
|
@@ -3070,28 +3265,40 @@ def init_tree(kernel):
|
|
3070
3265
|
|
3071
3266
|
@tree_submenu(_("Insert special operation(s)"))
|
3072
3267
|
@tree_operation(
|
3073
|
-
_("Add Output"),
|
3268
|
+
_("Add Output"),
|
3269
|
+
node_type=op_nodes,
|
3270
|
+
help=_("Add an operation to the tree"),
|
3271
|
+
grouping="OPS_40_ADDITION",
|
3074
3272
|
)
|
3075
3273
|
def add_operation_output(node, **kwargs):
|
3076
3274
|
append_operation_output(node, pos=add_after_index(node), **kwargs)
|
3077
3275
|
|
3078
3276
|
@tree_submenu(_("Insert special operation(s)"))
|
3079
3277
|
@tree_operation(
|
3080
|
-
_("Add Input"),
|
3278
|
+
_("Add Input"),
|
3279
|
+
node_type=op_nodes,
|
3280
|
+
help=_("Add an operation to the tree"),
|
3281
|
+
grouping="OPS_40_ADDITION",
|
3081
3282
|
)
|
3082
3283
|
def add_operation_input(node, **kwargs):
|
3083
3284
|
append_operation_input(node, pos=add_after_index(node), **kwargs)
|
3084
3285
|
|
3085
3286
|
@tree_submenu(_("Insert special operation(s)"))
|
3086
3287
|
@tree_operation(
|
3087
|
-
_("Add Coolant on"),
|
3288
|
+
_("Add Coolant on"),
|
3289
|
+
node_type=op_nodes,
|
3290
|
+
help=_("Add an operation to the tree"),
|
3291
|
+
grouping="OPS_40_ADDITION",
|
3088
3292
|
)
|
3089
3293
|
def add_operation_cool_on(node, pos=None, **kwargs):
|
3090
3294
|
append_operation_cool_on(node, pos=add_after_index(node), **kwargs)
|
3091
3295
|
|
3092
3296
|
@tree_submenu(_("Insert special operation(s)"))
|
3093
3297
|
@tree_operation(
|
3094
|
-
_("Add Coolant Off"),
|
3298
|
+
_("Add Coolant Off"),
|
3299
|
+
node_type=op_nodes,
|
3300
|
+
help=_("Add an operation to the tree"),
|
3301
|
+
grouping="OPS_40_ADDITION",
|
3095
3302
|
)
|
3096
3303
|
def add_operation_cool_off(node, pos=None, **kwargs):
|
3097
3304
|
append_operation_cool_off(node, pos=add_after_index(node), **kwargs)
|
@@ -3130,7 +3337,12 @@ def init_tree(kernel):
|
|
3130
3337
|
pos += 1
|
3131
3338
|
append_operation_interrupt(node, pos=pos, **kwargs)
|
3132
3339
|
|
3133
|
-
@tree_operation(
|
3340
|
+
@tree_operation(
|
3341
|
+
_("Reload '{name}'"),
|
3342
|
+
node_type="file",
|
3343
|
+
help=_("Reload the content of the file"),
|
3344
|
+
grouping="40_ELEM_FILE",
|
3345
|
+
)
|
3134
3346
|
def reload_file(node, **kwargs):
|
3135
3347
|
filepath = node.filepath
|
3136
3348
|
if not os.path.exists(filepath):
|
@@ -3142,10 +3354,18 @@ def init_tree(kernel):
|
|
3142
3354
|
return
|
3143
3355
|
to_be_removed = [node]
|
3144
3356
|
for e in self.elem_branch.children:
|
3145
|
-
if
|
3357
|
+
if (
|
3358
|
+
e.type == "file"
|
3359
|
+
and e.filepath == node.filepath
|
3360
|
+
and e not in to_be_removed
|
3361
|
+
):
|
3146
3362
|
to_be_removed.append(e)
|
3147
3363
|
for e in self.reg_branch.children:
|
3148
|
-
if
|
3364
|
+
if (
|
3365
|
+
e.type == "file"
|
3366
|
+
and e.filepath == node.filepath
|
3367
|
+
and e not in to_be_removed
|
3368
|
+
):
|
3149
3369
|
to_be_removed.append(e)
|
3150
3370
|
for e in to_be_removed:
|
3151
3371
|
e.remove_node()
|
@@ -3223,7 +3443,10 @@ def init_tree(kernel):
|
|
3223
3443
|
@tree_submenu(_("Assign Operation"))
|
3224
3444
|
@tree_values("op_assign", values=get_values)
|
3225
3445
|
@tree_operation(
|
3226
|
-
"{op_assign}",
|
3446
|
+
"{op_assign}",
|
3447
|
+
node_type=elem_nodes,
|
3448
|
+
help=_("Assign an operation to the selected elements"),
|
3449
|
+
grouping="40_ELEM_CLASSIFY",
|
3227
3450
|
)
|
3228
3451
|
def menu_assign_operations(node, op_assign, **kwargs):
|
3229
3452
|
if self.classify_inherit_stroke:
|
@@ -3272,6 +3495,7 @@ def init_tree(kernel):
|
|
3272
3495
|
else:
|
3273
3496
|
for ref in list(rnode.references):
|
3274
3497
|
ref.remove_node()
|
3498
|
+
|
3275
3499
|
# _("Remove assignments")
|
3276
3500
|
with self.undoscope("Remove assignments"):
|
3277
3501
|
for node in list(self.elems(emphasized=True)):
|
@@ -3330,7 +3554,10 @@ def init_tree(kernel):
|
|
3330
3554
|
@tree_conditional(lambda node: not is_regmark(node))
|
3331
3555
|
@tree_submenu(_("Duplicate group"))
|
3332
3556
|
@tree_operation(
|
3333
|
-
_("Make 1 copy"),
|
3557
|
+
_("Make 1 copy"),
|
3558
|
+
node_type="group",
|
3559
|
+
help=_("Create one copy of the selected group"),
|
3560
|
+
grouping="20_ELEM_DUPLICATION",
|
3334
3561
|
)
|
3335
3562
|
def duplicate_groups_1(node, **kwargs):
|
3336
3563
|
duplicate_groups_n(node, copies=1, **kwargs)
|
@@ -3345,7 +3572,6 @@ def init_tree(kernel):
|
|
3345
3572
|
grouping="20_ELEM_DUPLICATION",
|
3346
3573
|
)
|
3347
3574
|
def duplicate_groups_n(node, copies, **kwargs):
|
3348
|
-
|
3349
3575
|
def copy_a_group(groupnode, parent, dx, dy):
|
3350
3576
|
new_group = copy(groupnode)
|
3351
3577
|
for orgnode in groupnode.children:
|
@@ -3373,8 +3599,12 @@ def init_tree(kernel):
|
|
3373
3599
|
|
3374
3600
|
if self.copy_increases_wordlist_references and hasattr(orgnode, "text"):
|
3375
3601
|
copy_node.text = self.wordlist_delta(orgnode.text, delta_wordlist)
|
3376
|
-
elif self.copy_increases_wordlist_references and hasattr(
|
3377
|
-
|
3602
|
+
elif self.copy_increases_wordlist_references and hasattr(
|
3603
|
+
orgnode, "mktext"
|
3604
|
+
):
|
3605
|
+
copy_node.mktext = self.wordlist_delta(
|
3606
|
+
orgnode.mktext, delta_wordlist
|
3607
|
+
)
|
3378
3608
|
new_group.add_node(copy_node)
|
3379
3609
|
if had_optional:
|
3380
3610
|
for property_op in self.kernel.lookup_all("path_updater/.*"):
|
@@ -3390,7 +3620,7 @@ def init_tree(kernel):
|
|
3390
3620
|
delta_wordlist = 0
|
3391
3621
|
for n in range(copies):
|
3392
3622
|
delta_wordlist += 1
|
3393
|
-
copy_a_group(node, node.parent, (n + 1
|
3623
|
+
copy_a_group(node, node.parent, (n + 1) * _dx, (n + 1) * _dy)
|
3394
3624
|
if copy_nodes:
|
3395
3625
|
if self.classify_new:
|
3396
3626
|
self.classify(copy_nodes)
|
@@ -3400,7 +3630,10 @@ def init_tree(kernel):
|
|
3400
3630
|
@tree_conditional(lambda node: not is_regmark(node))
|
3401
3631
|
@tree_submenu(_("Duplicate element(s)"))
|
3402
3632
|
@tree_operation(
|
3403
|
-
_("Make 1 copy"),
|
3633
|
+
_("Make 1 copy"),
|
3634
|
+
node_type=elem_nodes,
|
3635
|
+
help=_("Create one copy of the selected elements"),
|
3636
|
+
grouping="20_ELEM_DUPLICATION",
|
3404
3637
|
)
|
3405
3638
|
def duplicate_element_1(node, **kwargs):
|
3406
3639
|
duplicate_element_n(node, copies=1, **kwargs)
|
@@ -3441,8 +3674,12 @@ def init_tree(kernel):
|
|
3441
3674
|
|
3442
3675
|
if self.copy_increases_wordlist_references and hasattr(orgnode, "text"):
|
3443
3676
|
copy_node.text = self.wordlist_delta(orgnode.text, delta_wordlist)
|
3444
|
-
elif self.copy_increases_wordlist_references and hasattr(
|
3445
|
-
|
3677
|
+
elif self.copy_increases_wordlist_references and hasattr(
|
3678
|
+
orgnode, "mktext"
|
3679
|
+
):
|
3680
|
+
copy_node.mktext = self.wordlist_delta(
|
3681
|
+
orgnode.mktext, delta_wordlist
|
3682
|
+
)
|
3446
3683
|
orgparent.add_node(copy_node)
|
3447
3684
|
if had_optional:
|
3448
3685
|
for property_op in self.kernel.lookup_all("path_updater/.*"):
|
@@ -3503,7 +3740,7 @@ def init_tree(kernel):
|
|
3503
3740
|
"elem path",
|
3504
3741
|
),
|
3505
3742
|
help=_("Adjusts the reference value for a wordlist, i.e. {name} to {name#+1}"),
|
3506
|
-
grouping="50_ELEM_MODIFY_ZMISC"
|
3743
|
+
grouping="50_ELEM_MODIFY_ZMISC",
|
3507
3744
|
)
|
3508
3745
|
def wlist_plus(singlenode, **kwargs):
|
3509
3746
|
data = list()
|
@@ -3535,7 +3772,7 @@ def init_tree(kernel):
|
|
3535
3772
|
help=_(
|
3536
3773
|
"Adjusts the reference value for a wordlist, i.e. {name#+3} to {name#+2}"
|
3537
3774
|
),
|
3538
|
-
grouping="50_ELEM_MODIFY_ZMISC"
|
3775
|
+
grouping="50_ELEM_MODIFY_ZMISC",
|
3539
3776
|
)
|
3540
3777
|
def wlist_minus(singlenode, **kwargs):
|
3541
3778
|
data = list()
|
@@ -3564,16 +3801,15 @@ def init_tree(kernel):
|
|
3564
3801
|
_("...with {offset}mm distance"),
|
3565
3802
|
node_type=elem_nodes,
|
3566
3803
|
help=_("Create an outline around the selected elements"),
|
3567
|
-
grouping="50_ELEM_MODIFY_ZMISC"
|
3804
|
+
grouping="50_ELEM_MODIFY_ZMISC",
|
3568
3805
|
)
|
3569
3806
|
def make_outlines(node, offset=1, **kwargs):
|
3570
3807
|
with self.undoscope("Outline"):
|
3571
3808
|
self(f"outline {offset}mm\n")
|
3572
3809
|
self.signal("refresh_tree")
|
3573
|
-
|
3810
|
+
|
3574
3811
|
@tree_conditional(
|
3575
|
-
lambda node: not is_regmark(node)
|
3576
|
-
and hasattr(node, "as_geometry")
|
3812
|
+
lambda node: not is_regmark(node) and hasattr(node, "as_geometry")
|
3577
3813
|
)
|
3578
3814
|
@tree_submenu(_("Offset shapes..."))
|
3579
3815
|
@tree_iterate("offset", 1, 5)
|
@@ -3581,7 +3817,7 @@ def init_tree(kernel):
|
|
3581
3817
|
_("...to outside with {offset}mm distance"),
|
3582
3818
|
node_type=elem_nodes,
|
3583
3819
|
help=_("Create an outer offset around the selected elements"),
|
3584
|
-
grouping="50_ELEM_MODIFY_ZMISC"
|
3820
|
+
grouping="50_ELEM_MODIFY_ZMISC",
|
3585
3821
|
)
|
3586
3822
|
def make_positive_offsets(node, offset=1, **kwargs):
|
3587
3823
|
with self.undoscope("Offset"):
|
@@ -3589,8 +3825,7 @@ def init_tree(kernel):
|
|
3589
3825
|
self.signal("refresh_tree")
|
3590
3826
|
|
3591
3827
|
@tree_conditional(
|
3592
|
-
lambda node: not is_regmark(node)
|
3593
|
-
and hasattr(node, "as_geometry")
|
3828
|
+
lambda node: not is_regmark(node) and hasattr(node, "as_geometry")
|
3594
3829
|
)
|
3595
3830
|
@tree_submenu(_("Offset shapes..."))
|
3596
3831
|
@tree_iterate("offset", 1, 5)
|
@@ -3598,7 +3833,7 @@ def init_tree(kernel):
|
|
3598
3833
|
_("...to inside with {offset}mm distance"),
|
3599
3834
|
node_type=elem_nodes,
|
3600
3835
|
help=_("Create an inner offset around the selected elements"),
|
3601
|
-
grouping="50_ELEM_MODIFY_ZMISC"
|
3836
|
+
grouping="50_ELEM_MODIFY_ZMISC",
|
3602
3837
|
)
|
3603
3838
|
def make_negative_offsets(node, offset=1, **kwargs):
|
3604
3839
|
with self.undoscope("Offset"):
|
@@ -3710,6 +3945,9 @@ def init_tree(kernel):
|
|
3710
3945
|
result = True
|
3711
3946
|
return result
|
3712
3947
|
|
3948
|
+
def has_vtrace_vectorize(node):
|
3949
|
+
return self.kernel.has_command("vtracer")
|
3950
|
+
|
3713
3951
|
@tree_submenu(_("Vectorization..."))
|
3714
3952
|
@tree_separator_after()
|
3715
3953
|
@tree_conditional(lambda node: has_vectorize(node))
|
@@ -3720,20 +3958,29 @@ def init_tree(kernel):
|
|
3720
3958
|
"elem image",
|
3721
3959
|
),
|
3722
3960
|
help=_("Vectorize the given element"),
|
3723
|
-
grouping="70_ELEM_IMAGES_Z",
|
3961
|
+
grouping="70_ELEM_IMAGES_Z", # test
|
3724
3962
|
)
|
3725
3963
|
def trace_bitmap(node, **kwargs):
|
3726
3964
|
with self.undoscope("Trace bitmap"):
|
3727
3965
|
self("vectorize\n")
|
3728
3966
|
|
3967
|
+
@tree_submenu(_("Vectorization..."))
|
3968
|
+
@tree_conditional(lambda node: has_vtrace_vectorize(node))
|
3969
|
+
@tree_operation(
|
3970
|
+
_("Trace bitmap via vtracer"),
|
3971
|
+
node_type=("elem image",),
|
3972
|
+
help=_("Vectorize the given element"),
|
3973
|
+
grouping="70_ELEM_IMAGES_Z", # test
|
3974
|
+
)
|
3975
|
+
def trace_bitmap_vtrace(node, **kwargs):
|
3976
|
+
self("vtracer\n")
|
3977
|
+
|
3729
3978
|
@tree_submenu(_("Vectorization..."))
|
3730
3979
|
@tree_operation(
|
3731
3980
|
_("Contour detection - shapes"),
|
3732
|
-
node_type=(
|
3733
|
-
"elem image",
|
3734
|
-
),
|
3981
|
+
node_type=("elem image",),
|
3735
3982
|
help=_("Recognize contours=shapes on the given element"),
|
3736
|
-
grouping="70_ELEM_IMAGES_Z",
|
3983
|
+
grouping="70_ELEM_IMAGES_Z", # test
|
3737
3984
|
)
|
3738
3985
|
def contour_bitmap_polyline(node, **kwargs):
|
3739
3986
|
current = self.setting(str, "contour_size", "big")
|
@@ -3752,11 +3999,9 @@ def init_tree(kernel):
|
|
3752
3999
|
@tree_separator_after()
|
3753
4000
|
@tree_operation(
|
3754
4001
|
_("Contour detection - bounding"),
|
3755
|
-
node_type=(
|
3756
|
-
"elem image",
|
3757
|
-
),
|
4002
|
+
node_type=("elem image",),
|
3758
4003
|
help=_("Recognize contours=shapes on the given element"),
|
3759
|
-
grouping="70_ELEM_IMAGES_Z",
|
4004
|
+
grouping="70_ELEM_IMAGES_Z", # test
|
3760
4005
|
)
|
3761
4006
|
def contour_bitmap_rectangles(node, **kwargs):
|
3762
4007
|
current = self.setting(str, "contour_size", "big")
|
@@ -3787,7 +4032,7 @@ def init_tree(kernel):
|
|
3787
4032
|
@tree_check(inner_check)
|
3788
4033
|
@tree_operation(
|
3789
4034
|
_("Ignore inner areas"),
|
3790
|
-
node_type=("elem image",
|
4035
|
+
node_type=("elem image",),
|
3791
4036
|
help=_("Inner areas will be ignored"),
|
3792
4037
|
grouping="70_ELEM_IMAGES_Z",
|
3793
4038
|
)
|
@@ -3800,10 +4045,8 @@ def init_tree(kernel):
|
|
3800
4045
|
@tree_check(sizecheck("big"))
|
3801
4046
|
@tree_operation(
|
3802
4047
|
_("Big objects"),
|
3803
|
-
node_type=("elem image",
|
3804
|
-
help=_(
|
3805
|
-
"Only large object will be recognized if checked"
|
3806
|
-
),
|
4048
|
+
node_type=("elem image",),
|
4049
|
+
help=_("Only large object will be recognized if checked"),
|
3807
4050
|
grouping="70_ELEM_IMAGES_Z",
|
3808
4051
|
)
|
3809
4052
|
def set_contour_size_big(node, **kwargs):
|
@@ -3814,10 +4057,8 @@ def init_tree(kernel):
|
|
3814
4057
|
@tree_check(sizecheck("normal"))
|
3815
4058
|
@tree_operation(
|
3816
4059
|
_("Normal objects"),
|
3817
|
-
node_type=("elem image",
|
3818
|
-
help=_(
|
3819
|
-
"Also medium sized objects will be recognized if checked"
|
3820
|
-
),
|
4060
|
+
node_type=("elem image",),
|
4061
|
+
help=_("Also medium sized objects will be recognized if checked"),
|
3821
4062
|
grouping="70_ELEM_IMAGES_Z",
|
3822
4063
|
)
|
3823
4064
|
def set_contour_size_normal(node, **kwargs):
|
@@ -3828,10 +4069,8 @@ def init_tree(kernel):
|
|
3828
4069
|
@tree_check(sizecheck("small"))
|
3829
4070
|
@tree_operation(
|
3830
4071
|
_("Small objects"),
|
3831
|
-
node_type=("elem image",
|
3832
|
-
help=_(
|
3833
|
-
"Also small objects will be recognized if checked"
|
3834
|
-
),
|
4072
|
+
node_type=("elem image",),
|
4073
|
+
help=_("Also small objects will be recognized if checked"),
|
3835
4074
|
grouping="70_ELEM_IMAGES_Z",
|
3836
4075
|
)
|
3837
4076
|
def set_contour_size_small(node, **kwargs):
|
@@ -3931,7 +4170,9 @@ def init_tree(kernel):
|
|
3931
4170
|
grouping="50_ELEM_MODIFY_ZMISC",
|
3932
4171
|
)
|
3933
4172
|
def convert_to_path(singlenode, **kwargs):
|
3934
|
-
nodes = (
|
4173
|
+
nodes = (
|
4174
|
+
node for node in self.elems(emphasized=True) if hasattr(node, "as_geometry")
|
4175
|
+
)
|
3935
4176
|
if not nodes:
|
3936
4177
|
return
|
3937
4178
|
with self.undoscope("Convert to path"):
|
@@ -3960,7 +4201,11 @@ def init_tree(kernel):
|
|
3960
4201
|
grouping="50_ELEM_MODIFY_ZMISC",
|
3961
4202
|
)
|
3962
4203
|
def convert_to_path_effect(singlenode, **kwargs):
|
3963
|
-
nodes = (
|
4204
|
+
nodes = (
|
4205
|
+
node
|
4206
|
+
for node in self.flat(types=effect_nodes, emphasized=True)
|
4207
|
+
if hasattr(node, "as_geometry")
|
4208
|
+
)
|
3964
4209
|
if not nodes:
|
3965
4210
|
return
|
3966
4211
|
with self.undoscope("Convert to path"):
|
@@ -4191,7 +4436,9 @@ def init_tree(kernel):
|
|
4191
4436
|
@tree_conditional(lambda node: node.lock)
|
4192
4437
|
## @tree_separator_before()
|
4193
4438
|
@tree_operation(
|
4194
|
-
_("Unlock element, allows manipulation"),
|
4439
|
+
_("Unlock element, allows manipulation"),
|
4440
|
+
node_type=elem_nodes,
|
4441
|
+
help=_("Remove manipulation protection flag"),
|
4195
4442
|
)
|
4196
4443
|
def element_unlock_manipulations(node, **kwargs):
|
4197
4444
|
self("element unlock\n")
|
@@ -4295,7 +4542,10 @@ def init_tree(kernel):
|
|
4295
4542
|
@tree_conditional(lambda node: is_regmark(node))
|
4296
4543
|
@tree_submenu(_("Toggle magnet-lines"))
|
4297
4544
|
@tree_operation(
|
4298
|
-
_("Around border"),
|
4545
|
+
_("Around border"),
|
4546
|
+
node_type=elem_group_nodes,
|
4547
|
+
help=_("Set/remove magnet lines around the regmark element"),
|
4548
|
+
grouping="SCENE",
|
4299
4549
|
)
|
4300
4550
|
def regmark_to_magnet_1(node, **kwargs):
|
4301
4551
|
if not hasattr(node, "bounds"):
|
@@ -4305,7 +4555,12 @@ def init_tree(kernel):
|
|
4305
4555
|
@tree_conditional(lambda node: is_regmark(node))
|
4306
4556
|
@tree_submenu(_("Toggle magnet-lines"))
|
4307
4557
|
@tree_operation(
|
4308
|
-
_("At center"),
|
4558
|
+
_("At center"),
|
4559
|
+
node_type=elem_group_nodes,
|
4560
|
+
help=_(
|
4561
|
+
"Set/remove magnet lines right through the middle of the regmark element"
|
4562
|
+
),
|
4563
|
+
grouping="SCENE",
|
4309
4564
|
)
|
4310
4565
|
def regmark_to_magnet_2(node, **kwargs):
|
4311
4566
|
if not hasattr(node, "bounds"):
|
@@ -4368,7 +4623,10 @@ def init_tree(kernel):
|
|
4368
4623
|
@tree_conditional(lambda node: not node.lock)
|
4369
4624
|
@tree_submenu(_("Image"))
|
4370
4625
|
@tree_operation(
|
4371
|
-
_("Invert image"),
|
4626
|
+
_("Invert image"),
|
4627
|
+
node_type="elem image",
|
4628
|
+
help=_("Invert the image"),
|
4629
|
+
grouping="70_ELEM_IMAGES",
|
4372
4630
|
)
|
4373
4631
|
def image_invert(node, **kwargs):
|
4374
4632
|
with self.undoscope("Invert image"):
|
@@ -4389,7 +4647,10 @@ def init_tree(kernel):
|
|
4389
4647
|
@tree_conditional(lambda node: not node.lock)
|
4390
4648
|
@tree_submenu(_("Image"))
|
4391
4649
|
@tree_operation(
|
4392
|
-
_("Flip vertical"),
|
4650
|
+
_("Flip vertical"),
|
4651
|
+
node_type="elem image",
|
4652
|
+
help=_("Mirror the image along the X-Axis"),
|
4653
|
+
grouping="70_ELEM_IMAGES",
|
4393
4654
|
)
|
4394
4655
|
def image_flip(node, **kwargs):
|
4395
4656
|
with self.undoscope("Flip vertical"):
|
@@ -4398,7 +4659,10 @@ def init_tree(kernel):
|
|
4398
4659
|
@tree_conditional(lambda node: not node.lock)
|
4399
4660
|
@tree_submenu(_("Image"))
|
4400
4661
|
@tree_operation(
|
4401
|
-
_("Rotate 90° CW"),
|
4662
|
+
_("Rotate 90° CW"),
|
4663
|
+
node_type="elem image",
|
4664
|
+
help=_("Rotate the image by 90° clockwise"),
|
4665
|
+
grouping="70_ELEM_IMAGES",
|
4402
4666
|
)
|
4403
4667
|
def image_cw(node, **kwargs):
|
4404
4668
|
with self.undoscope("Rotate 90° CW"):
|
@@ -4407,7 +4671,10 @@ def init_tree(kernel):
|
|
4407
4671
|
@tree_conditional(lambda node: not node.lock)
|
4408
4672
|
@tree_submenu(_("Image"))
|
4409
4673
|
@tree_operation(
|
4410
|
-
_("Rotate 90° CCW"),
|
4674
|
+
_("Rotate 90° CCW"),
|
4675
|
+
node_type="elem image",
|
4676
|
+
help=_("Rotate the image by 90° counterclockwise"),
|
4677
|
+
grouping="70_ELEM_IMAGES",
|
4411
4678
|
)
|
4412
4679
|
def image_ccw(node, **kwargs):
|
4413
4680
|
with self.undoscope("Rotate 90° CCW"):
|
@@ -4524,7 +4791,12 @@ def init_tree(kernel):
|
|
4524
4791
|
node.notify_collapse()
|
4525
4792
|
|
4526
4793
|
@tree_submenu(_("Magnets"))
|
4527
|
-
@tree_operation(
|
4794
|
+
@tree_operation(
|
4795
|
+
_("...around horizontal edges"),
|
4796
|
+
node_type=elem_group_nodes,
|
4797
|
+
help=_("Create magnets around horizontal edges"),
|
4798
|
+
grouping="Magnet",
|
4799
|
+
)
|
4528
4800
|
def create_horiz_edges(node, **kwargs):
|
4529
4801
|
if not hasattr(node, "bounds") or node.bounds is None:
|
4530
4802
|
return
|
@@ -4533,7 +4805,12 @@ def init_tree(kernel):
|
|
4533
4805
|
self.signal("create_magnets", to_create)
|
4534
4806
|
|
4535
4807
|
@tree_submenu(_("Magnets"))
|
4536
|
-
@tree_operation(
|
4808
|
+
@tree_operation(
|
4809
|
+
_("...including center"),
|
4810
|
+
node_type=elem_group_nodes,
|
4811
|
+
help=_("Create magnets around horizontal edges + center"),
|
4812
|
+
grouping="Magnet",
|
4813
|
+
)
|
4537
4814
|
def create_horiz_edges_plus_center(node, **kwargs):
|
4538
4815
|
if not hasattr(node, "bounds") or node.bounds is None:
|
4539
4816
|
return
|
@@ -4543,7 +4820,12 @@ def init_tree(kernel):
|
|
4543
4820
|
|
4544
4821
|
@tree_submenu(_("Magnets"))
|
4545
4822
|
@tree_iterate("steps", 3, 6)
|
4546
|
-
@tree_operation(
|
4823
|
+
@tree_operation(
|
4824
|
+
_("...create edges plus every 1/{steps}"),
|
4825
|
+
node_type=elem_group_nodes,
|
4826
|
+
help=_("Create magnets equally spaced along horizontal extension"),
|
4827
|
+
grouping="Magnet",
|
4828
|
+
)
|
4547
4829
|
def create_x_horiz_edges(node, steps=3, **kwargs):
|
4548
4830
|
if not hasattr(node, "bounds") or node.bounds is None:
|
4549
4831
|
return
|
@@ -4560,7 +4842,12 @@ def init_tree(kernel):
|
|
4560
4842
|
|
4561
4843
|
@tree_submenu(_("Magnets"))
|
4562
4844
|
@tree_separator_before()
|
4563
|
-
@tree_operation(
|
4845
|
+
@tree_operation(
|
4846
|
+
_("...around vertical edges"),
|
4847
|
+
node_type=elem_group_nodes,
|
4848
|
+
help=_("Create magnets around vertical edges"),
|
4849
|
+
grouping="Magnet",
|
4850
|
+
)
|
4564
4851
|
def create_vert_edges(node, **kwargs):
|
4565
4852
|
if not hasattr(node, "bounds") or node.bounds is None:
|
4566
4853
|
return
|
@@ -4569,17 +4856,27 @@ def init_tree(kernel):
|
|
4569
4856
|
self.signal("create_magnets", to_create)
|
4570
4857
|
|
4571
4858
|
@tree_submenu(_("Magnets"))
|
4572
|
-
@tree_operation(
|
4859
|
+
@tree_operation(
|
4860
|
+
_("...including center"),
|
4861
|
+
node_type=elem_group_nodes,
|
4862
|
+
help=_("Create magnets around vertical edges + center"),
|
4863
|
+
grouping="Magnet",
|
4864
|
+
)
|
4573
4865
|
def create_vert_edges_plus_center(node, **kwargs):
|
4574
4866
|
if not hasattr(node, "bounds") or node.bounds is None:
|
4575
4867
|
return
|
4576
4868
|
bb = node.bounds
|
4577
4869
|
to_create = (("y", bb[1]), ("y", bb[3]), ("y", (bb[1] + bb[3]) / 2))
|
4578
4870
|
self.signal("create_magnets", to_create)
|
4579
|
-
@tree_submenu(_("Magnets"))
|
4580
4871
|
|
4872
|
+
@tree_submenu(_("Magnets"))
|
4581
4873
|
@tree_iterate("steps", 3, 6)
|
4582
|
-
@tree_operation(
|
4874
|
+
@tree_operation(
|
4875
|
+
_("...create edges plus every 1/{steps}"),
|
4876
|
+
node_type=elem_group_nodes,
|
4877
|
+
help=_("Create magnets equally spaced along vertical extension"),
|
4878
|
+
grouping="Magnet",
|
4879
|
+
)
|
4583
4880
|
def create_x_vert_edges(node, steps=3, **kwargs):
|
4584
4881
|
if not hasattr(node, "bounds") or node.bounds is None:
|
4585
4882
|
return
|