meerk40t 0.9.2000__py2.py3-none-any.whl → 0.9.3001__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. meerk40t/balormk/balor_params.py +1 -43
  2. meerk40t/balormk/controller.py +1 -41
  3. meerk40t/balormk/device.py +16 -22
  4. meerk40t/balormk/driver.py +4 -4
  5. meerk40t/balormk/gui/balorconfig.py +2 -2
  6. meerk40t/balormk/gui/balorcontroller.py +13 -5
  7. meerk40t/balormk/gui/baloroperationproperties.py +0 -46
  8. meerk40t/balormk/gui/gui.py +17 -17
  9. meerk40t/camera/gui/camerapanel.py +18 -11
  10. meerk40t/core/cutcode/rastercut.py +3 -1
  11. meerk40t/core/cutplan.py +145 -14
  12. meerk40t/core/elements/clipboard.py +18 -9
  13. meerk40t/core/elements/element_treeops.py +320 -180
  14. meerk40t/core/elements/element_types.py +7 -2
  15. meerk40t/core/elements/elements.py +53 -27
  16. meerk40t/core/elements/geometry.py +8 -0
  17. meerk40t/core/elements/offset_clpr.py +129 -4
  18. meerk40t/core/elements/offset_mk.py +3 -1
  19. meerk40t/core/elements/shapes.py +28 -25
  20. meerk40t/core/laserjob.py +7 -0
  21. meerk40t/core/node/bootstrap.py +4 -0
  22. meerk40t/core/node/effect_hatch.py +85 -96
  23. meerk40t/core/node/effect_wobble.py +309 -0
  24. meerk40t/core/node/elem_image.py +49 -19
  25. meerk40t/core/node/elem_line.py +60 -0
  26. meerk40t/core/node/elem_rect.py +5 -3
  27. meerk40t/core/node/image_processed.py +766 -0
  28. meerk40t/core/node/image_raster.py +113 -0
  29. meerk40t/core/node/node.py +120 -1
  30. meerk40t/core/node/op_cut.py +2 -8
  31. meerk40t/core/node/op_dots.py +0 -8
  32. meerk40t/core/node/op_engrave.py +2 -18
  33. meerk40t/core/node/op_image.py +22 -35
  34. meerk40t/core/node/op_raster.py +0 -9
  35. meerk40t/core/planner.py +32 -2
  36. meerk40t/core/svg_io.py +699 -461
  37. meerk40t/core/treeop.py +191 -0
  38. meerk40t/core/undos.py +15 -1
  39. meerk40t/core/units.py +14 -4
  40. meerk40t/device/dummydevice.py +3 -2
  41. meerk40t/device/gui/defaultactions.py +43 -55
  42. meerk40t/device/gui/formatterpanel.py +58 -49
  43. meerk40t/device/gui/warningpanel.py +12 -12
  44. meerk40t/device/mixins.py +13 -0
  45. meerk40t/dxf/dxf_io.py +9 -5
  46. meerk40t/extra/ezd.py +28 -26
  47. meerk40t/extra/imageactions.py +300 -308
  48. meerk40t/extra/lbrn.py +19 -2
  49. meerk40t/fill/fills.py +6 -6
  50. meerk40t/fill/patternfill.py +1061 -1061
  51. meerk40t/fill/patterns.py +2 -6
  52. meerk40t/grbl/controller.py +168 -52
  53. meerk40t/grbl/device.py +23 -18
  54. meerk40t/grbl/driver.py +39 -0
  55. meerk40t/grbl/emulator.py +79 -19
  56. meerk40t/grbl/gcodejob.py +10 -0
  57. meerk40t/grbl/gui/grblconfiguration.py +2 -2
  58. meerk40t/grbl/gui/grblcontroller.py +24 -8
  59. meerk40t/grbl/gui/grblhardwareconfig.py +153 -0
  60. meerk40t/grbl/gui/gui.py +17 -14
  61. meerk40t/grbl/mock_connection.py +15 -34
  62. meerk40t/grbl/plugin.py +0 -4
  63. meerk40t/grbl/serial_connection.py +2 -1
  64. meerk40t/gui/about.py +8 -5
  65. meerk40t/gui/alignment.py +10 -6
  66. meerk40t/gui/basicops.py +27 -17
  67. meerk40t/gui/bufferview.py +2 -2
  68. meerk40t/gui/choicepropertypanel.py +101 -13
  69. meerk40t/gui/consolepanel.py +12 -9
  70. meerk40t/gui/devicepanel.py +38 -25
  71. meerk40t/gui/executejob.py +6 -4
  72. meerk40t/gui/help_assets/help_assets.py +13 -10
  73. meerk40t/gui/hersheymanager.py +8 -6
  74. meerk40t/gui/icons.py +1951 -3065
  75. meerk40t/gui/imagesplitter.py +14 -7
  76. meerk40t/gui/keymap.py +3 -3
  77. meerk40t/gui/laserpanel.py +151 -84
  78. meerk40t/gui/laserrender.py +61 -70
  79. meerk40t/gui/lasertoolpanel.py +8 -7
  80. meerk40t/gui/materialtest.py +3 -3
  81. meerk40t/gui/mkdebug.py +254 -1
  82. meerk40t/gui/navigationpanels.py +321 -180
  83. meerk40t/gui/notes.py +3 -3
  84. meerk40t/gui/opassignment.py +12 -12
  85. meerk40t/gui/operation_info.py +13 -13
  86. meerk40t/gui/plugin.py +5 -0
  87. meerk40t/gui/position.py +20 -18
  88. meerk40t/gui/preferences.py +21 -6
  89. meerk40t/gui/propertypanels/attributes.py +70 -22
  90. meerk40t/gui/propertypanels/blobproperty.py +2 -2
  91. meerk40t/gui/propertypanels/consoleproperty.py +2 -2
  92. meerk40t/gui/propertypanels/groupproperties.py +3 -3
  93. meerk40t/gui/propertypanels/hatchproperty.py +11 -18
  94. meerk40t/gui/propertypanels/imageproperty.py +4 -3
  95. meerk40t/gui/propertypanels/opbranchproperties.py +1 -1
  96. meerk40t/gui/propertypanels/pathproperty.py +2 -2
  97. meerk40t/gui/propertypanels/pointproperty.py +2 -2
  98. meerk40t/gui/propertypanels/propertywindow.py +4 -4
  99. meerk40t/gui/propertypanels/textproperty.py +3 -3
  100. meerk40t/gui/propertypanels/wobbleproperty.py +204 -0
  101. meerk40t/gui/ribbon.py +367 -259
  102. meerk40t/gui/scene/scene.py +31 -5
  103. meerk40t/gui/scenewidgets/elementswidget.py +12 -4
  104. meerk40t/gui/scenewidgets/gridwidget.py +2 -2
  105. meerk40t/gui/scenewidgets/laserpathwidget.py +7 -2
  106. meerk40t/gui/scenewidgets/machineoriginwidget.py +6 -2
  107. meerk40t/gui/scenewidgets/relocatewidget.py +1 -1
  108. meerk40t/gui/scenewidgets/reticlewidget.py +9 -0
  109. meerk40t/gui/scenewidgets/selectionwidget.py +12 -7
  110. meerk40t/gui/simpleui.py +95 -8
  111. meerk40t/gui/simulation.py +44 -36
  112. meerk40t/gui/spoolerpanel.py +124 -26
  113. meerk40t/gui/statusbarwidgets/defaultoperations.py +18 -6
  114. meerk40t/gui/statusbarwidgets/infowidget.py +2 -2
  115. meerk40t/gui/statusbarwidgets/opassignwidget.py +12 -12
  116. meerk40t/gui/statusbarwidgets/shapepropwidget.py +45 -18
  117. meerk40t/gui/statusbarwidgets/statusbar.py +11 -4
  118. meerk40t/gui/themes.py +78 -0
  119. meerk40t/gui/toolwidgets/toolcircle.py +2 -1
  120. meerk40t/gui/toolwidgets/toolellipse.py +2 -1
  121. meerk40t/gui/toolwidgets/toolimagecut.py +132 -0
  122. meerk40t/gui/toolwidgets/toolline.py +144 -0
  123. meerk40t/gui/toolwidgets/toolnodeedit.py +72 -145
  124. meerk40t/gui/toolwidgets/toolpoint.py +1 -1
  125. meerk40t/gui/toolwidgets/toolpolygon.py +8 -55
  126. meerk40t/gui/toolwidgets/toolrect.py +2 -1
  127. meerk40t/gui/usbconnect.py +2 -2
  128. meerk40t/gui/utilitywidgets/cyclocycloidwidget.py +2 -2
  129. meerk40t/gui/utilitywidgets/harmonograph.py +7 -7
  130. meerk40t/gui/utilitywidgets/scalewidget.py +1 -1
  131. meerk40t/gui/wordlisteditor.py +33 -18
  132. meerk40t/gui/wxmeerk40t.py +166 -66
  133. meerk40t/gui/wxmmain.py +236 -157
  134. meerk40t/gui/wxmribbon.py +49 -25
  135. meerk40t/gui/wxmscene.py +49 -38
  136. meerk40t/gui/wxmtree.py +216 -85
  137. meerk40t/gui/wxutils.py +62 -4
  138. meerk40t/image/imagetools.py +443 -15
  139. meerk40t/internal_plugins.py +2 -10
  140. meerk40t/kernel/kernel.py +12 -4
  141. meerk40t/lihuiyu/controller.py +7 -7
  142. meerk40t/lihuiyu/device.py +3 -1
  143. meerk40t/lihuiyu/driver.py +3 -0
  144. meerk40t/lihuiyu/gui/gui.py +8 -8
  145. meerk40t/lihuiyu/gui/lhyaccelgui.py +2 -2
  146. meerk40t/lihuiyu/gui/lhycontrollergui.py +73 -27
  147. meerk40t/lihuiyu/gui/lhydrivergui.py +2 -2
  148. meerk40t/lihuiyu/gui/tcpcontroller.py +22 -9
  149. meerk40t/main.py +6 -1
  150. meerk40t/moshi/controller.py +5 -5
  151. meerk40t/moshi/device.py +5 -2
  152. meerk40t/moshi/driver.py +4 -0
  153. meerk40t/moshi/gui/gui.py +8 -8
  154. meerk40t/moshi/gui/moshicontrollergui.py +24 -8
  155. meerk40t/moshi/gui/moshidrivergui.py +2 -2
  156. meerk40t/newly/controller.py +2 -0
  157. meerk40t/newly/device.py +9 -2
  158. meerk40t/newly/driver.py +4 -0
  159. meerk40t/newly/gui/gui.py +16 -17
  160. meerk40t/newly/gui/newlyconfig.py +2 -2
  161. meerk40t/newly/gui/newlycontroller.py +13 -5
  162. meerk40t/rotary/gui/gui.py +2 -2
  163. meerk40t/rotary/gui/rotarysettings.py +2 -2
  164. meerk40t/ruida/device.py +3 -0
  165. meerk40t/ruida/driver.py +4 -0
  166. meerk40t/ruida/gui/gui.py +6 -6
  167. meerk40t/ruida/gui/ruidaconfig.py +2 -2
  168. meerk40t/ruida/gui/ruidacontroller.py +13 -5
  169. meerk40t/svgelements.py +9 -9
  170. meerk40t/tools/geomstr.py +849 -153
  171. meerk40t/tools/kerftest.py +8 -4
  172. meerk40t/tools/livinghinges.py +15 -8
  173. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/METADATA +21 -16
  174. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/RECORD +185 -177
  175. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/entry_points.txt +0 -1
  176. test/test_core_elements.py +8 -24
  177. test/test_file_svg.py +88 -0
  178. test/test_fill.py +9 -9
  179. test/test_geomstr.py +258 -8
  180. test/test_kernel.py +4 -0
  181. test/test_tools_rasterplotter.py +29 -0
  182. meerk40t/extra/embroider.py +0 -56
  183. meerk40t/extra/pathoptimize.py +0 -249
  184. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/LICENSE +0 -0
  185. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/WHEEL +0 -0
  186. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/top_level.txt +0 -0
  187. {meerk40t-0.9.2000.dist-info → meerk40t-0.9.3001.dist-info}/zip-safe +0 -0
@@ -160,7 +160,8 @@ class CircleTool(ToolWidget):
160
160
  self.p2 = None
161
161
  self.scene.pane.tool_active = False
162
162
  self.scene.request_refresh()
163
- response = RESPONSE_ABORT
163
+ # Allow other widgets (like the selection widget to take over)
164
+ response = RESPONSE_CHAIN
164
165
  elif event_type == "leftup":
165
166
  self.scene.pane.tool_active = False
166
167
  try:
@@ -138,7 +138,8 @@ class EllipseTool(ToolWidget):
138
138
  self.p2 = None
139
139
  self.scene.pane.tool_active = False
140
140
  self.scene.request_refresh()
141
- response = RESPONSE_ABORT
141
+ # Allow other widgets (like the selection widget to take over)
142
+ response = RESPONSE_CHAIN
142
143
  elif event_type == "leftup":
143
144
  self.scene.pane.tool_active = False
144
145
  try:
@@ -0,0 +1,132 @@
1
+ import math
2
+
3
+ import wx
4
+
5
+ from meerk40t.gui.laserrender import swizzlecolor
6
+ from meerk40t.gui.scene.sceneconst import (
7
+ RESPONSE_ABORT,
8
+ RESPONSE_CHAIN,
9
+ RESPONSE_CONSUME,
10
+ )
11
+ from meerk40t.gui.toolwidgets.toolwidget import ToolWidget
12
+ from meerk40t.tools.geomstr import Geomstr
13
+
14
+ _ = wx.GetTranslation
15
+
16
+
17
+ class ImageCutTool(ToolWidget):
18
+ """
19
+ ImageCut Tool.
20
+
21
+ Draws a line with click and drag, uses that line to slice an image.
22
+ """
23
+
24
+ def __init__(self, scene):
25
+ ToolWidget.__init__(self, scene)
26
+ self.start_position = None
27
+ self.p1 = None
28
+ self.p2 = None
29
+
30
+ def process_draw(self, gc: wx.GraphicsContext):
31
+ if self.p1 is not None and self.p2 is not None:
32
+ matrix = gc.GetTransform().Get()
33
+ # pixel = 1.0 / matrix[0]
34
+ x0 = self.p1.real
35
+ y0 = self.p1.imag
36
+ x1 = self.p2.real
37
+ y1 = self.p2.imag
38
+ elements = self.scene.context.elements
39
+ if elements.default_stroke is None:
40
+ self.pen.SetColour(wx.BLUE)
41
+ else:
42
+ self.pen.SetColour(wx.Colour(swizzlecolor(elements.default_stroke)))
43
+ gc.SetPen(self.pen)
44
+ gc.StrokeLine(
45
+ x0,
46
+ y0,
47
+ x1,
48
+ y1,
49
+ )
50
+ s = f"Draw line from {x0}, {y0} to {x0}, {y0}"
51
+ self.scene.context.signal("statusmsg", s)
52
+
53
+ def event(
54
+ self,
55
+ window_pos=None,
56
+ space_pos=None,
57
+ event_type=None,
58
+ nearest_snap=None,
59
+ modifiers=None,
60
+ keycode=None,
61
+ **kwargs,
62
+ ):
63
+ response = RESPONSE_CHAIN
64
+ update_required = False
65
+ if event_type == "leftdown":
66
+ self.scene.pane.tool_active = True
67
+ if nearest_snap is None:
68
+ sx, sy = self.scene.get_snap_point(
69
+ space_pos[0], space_pos[1], modifiers
70
+ )
71
+ self.p1 = complex(sx, sy)
72
+ else:
73
+ self.p1 = complex(nearest_snap[0], nearest_snap[1])
74
+ response = RESPONSE_CONSUME
75
+ elif event_type == "move":
76
+ if self.p1 is not None:
77
+ self.p2 = complex(space_pos[0], space_pos[1])
78
+ if "shift" in modifiers:
79
+ r = abs(self.p1 - self.p2)
80
+ a = Geomstr.angle(None, self.p1, self.p2)
81
+ delta = math.tau / 32
82
+
83
+ for i in range(-4, 4):
84
+ s = i * math.tau / 8 - delta
85
+ e = i * math.tau / 8 + delta
86
+ if s <= a <= e:
87
+ self.p2 = Geomstr.polar(None, self.p1, i * math.tau / 8, r)
88
+ else:
89
+ if nearest_snap is not None:
90
+ self.p2 = complex(nearest_snap[0], nearest_snap[1])
91
+ self.scene.request_refresh()
92
+ response = RESPONSE_CONSUME
93
+ elif event_type == "leftclick":
94
+ # Dear user: that's too quick for my taste - take your time...
95
+ self.p1 = None
96
+ self.p2 = None
97
+ self.scene.pane.tool_active = False
98
+ self.scene.request_refresh()
99
+ # Allow other widgets (like the selection widget to take over)
100
+ response = RESPONSE_CHAIN
101
+ elif event_type == "leftup":
102
+ self.scene.pane.tool_active = False
103
+ try:
104
+ if self.p1 is None or self.p2 is None:
105
+ return RESPONSE_ABORT
106
+ x1 = self.p1.real
107
+ y1 = self.p1.imag
108
+ x2 = self.p2.real
109
+ y2 = self.p2.imag
110
+ elements = self.scene.context.elements
111
+ elements(f"image linecut {x1} {y1} {x2} {y2}")
112
+ self.p1 = None
113
+ self.p2 = None
114
+ except IndexError:
115
+ pass
116
+ self.scene.request_refresh()
117
+ self.scene.context.signal("statusmsg", "")
118
+ response = RESPONSE_ABORT
119
+ elif event_type == "lost" or (event_type == "key_up" and modifiers == "escape"):
120
+ if self.scene.pane.tool_active:
121
+ self.scene.pane.tool_active = False
122
+ self.scene.request_refresh()
123
+ response = RESPONSE_CONSUME
124
+ else:
125
+ response = RESPONSE_CHAIN
126
+ self.p1 = None
127
+ self.p2 = None
128
+ self.scene.context.signal("statusmsg", "")
129
+ elif update_required:
130
+ self.scene.request_refresh()
131
+ response = RESPONSE_CONSUME
132
+ return response
@@ -0,0 +1,144 @@
1
+ import math
2
+
3
+ import wx
4
+
5
+ from meerk40t.gui.laserrender import swizzlecolor
6
+ from meerk40t.gui.scene.sceneconst import (
7
+ RESPONSE_ABORT,
8
+ RESPONSE_CHAIN,
9
+ RESPONSE_CONSUME,
10
+ )
11
+ from meerk40t.gui.toolwidgets.toolwidget import ToolWidget
12
+ from meerk40t.tools.geomstr import Geomstr
13
+
14
+ _ = wx.GetTranslation
15
+
16
+
17
+ class LineTool(ToolWidget):
18
+ """
19
+ Line Drawing Tool.
20
+
21
+ Adds Line with click and drag.
22
+ """
23
+
24
+ def __init__(self, scene):
25
+ ToolWidget.__init__(self, scene)
26
+ self.start_position = None
27
+ self.p1 = None
28
+ self.p2 = None
29
+
30
+ def process_draw(self, gc: wx.GraphicsContext):
31
+ if self.p1 is not None and self.p2 is not None:
32
+ matrix = gc.GetTransform().Get()
33
+ # pixel = 1.0 / matrix[0]
34
+ x0 = self.p1.real
35
+ y0 = self.p1.imag
36
+ x1 = self.p2.real
37
+ y1 = self.p2.imag
38
+ elements = self.scene.context.elements
39
+ if elements.default_stroke is None:
40
+ self.pen.SetColour(wx.BLUE)
41
+ else:
42
+ self.pen.SetColour(wx.Colour(swizzlecolor(elements.default_stroke)))
43
+ gc.SetPen(self.pen)
44
+ gc.StrokeLine(
45
+ x0,
46
+ y0,
47
+ x1,
48
+ y1,
49
+ )
50
+ s = f"Draw line from {x0}, {y0} to {x0}, {y0}"
51
+ self.scene.context.signal("statusmsg", s)
52
+
53
+ def event(
54
+ self,
55
+ window_pos=None,
56
+ space_pos=None,
57
+ event_type=None,
58
+ nearest_snap=None,
59
+ modifiers=None,
60
+ keycode=None,
61
+ **kwargs,
62
+ ):
63
+ response = RESPONSE_CHAIN
64
+ update_required = False
65
+ if event_type == "leftdown":
66
+ self.scene.pane.tool_active = True
67
+ if nearest_snap is None:
68
+ sx, sy = self.scene.get_snap_point(
69
+ space_pos[0], space_pos[1], modifiers
70
+ )
71
+ self.p1 = complex(sx, sy)
72
+ else:
73
+ self.p1 = complex(nearest_snap[0], nearest_snap[1])
74
+ response = RESPONSE_CONSUME
75
+ elif event_type == "move":
76
+ if self.p1 is not None:
77
+ self.p2 = complex(space_pos[0], space_pos[1])
78
+ if "shift" in modifiers:
79
+ r = abs(self.p1 - self.p2)
80
+ a = Geomstr.angle(None, self.p1, self.p2)
81
+ delta = math.tau / 32
82
+
83
+ for i in range(-4, 4):
84
+ s = i * math.tau / 8 - delta
85
+ e = i * math.tau / 8 + delta
86
+ if s <= a <= e:
87
+ self.p2 = Geomstr.polar(None, self.p1, i * math.tau / 8, r)
88
+ else:
89
+ if nearest_snap is not None:
90
+ self.p2 = complex(nearest_snap[0], nearest_snap[1])
91
+ self.scene.request_refresh()
92
+ response = RESPONSE_CONSUME
93
+ elif event_type == "leftclick":
94
+ # Dear user: that's too quick for my taste - take your time...
95
+ self.p1 = None
96
+ self.p2 = None
97
+ self.scene.pane.tool_active = False
98
+ self.scene.request_refresh()
99
+ # Allow other widgets (like the selection widget to take over)
100
+ response = RESPONSE_CHAIN
101
+ elif event_type == "leftup":
102
+ self.scene.pane.tool_active = False
103
+ try:
104
+ if self.p1 is None or self.p2 is None:
105
+ return RESPONSE_ABORT
106
+ x1 = self.p1.real
107
+ y1 = self.p1.imag
108
+ x2 = self.p2.real
109
+ y2 = self.p2.imag
110
+ elements = self.scene.context.elements
111
+ node = elements.elem_branch.add(
112
+ x1=x1,
113
+ y1=y1,
114
+ x2=x2,
115
+ y2=y2,
116
+ stroke_width=elements.default_strokewidth,
117
+ stroke=elements.default_stroke,
118
+ fill=elements.default_fill,
119
+ type="elem line",
120
+ )
121
+ if elements.classify_new:
122
+ elements.classify([node])
123
+ self.notify_created(node)
124
+ self.p1 = None
125
+ self.p2 = None
126
+ except IndexError:
127
+ pass
128
+ self.scene.request_refresh()
129
+ self.scene.context.signal("statusmsg", "")
130
+ response = RESPONSE_ABORT
131
+ elif event_type == "lost" or (event_type == "key_up" and modifiers == "escape"):
132
+ if self.scene.pane.tool_active:
133
+ self.scene.pane.tool_active = False
134
+ self.scene.request_refresh()
135
+ response = RESPONSE_CONSUME
136
+ else:
137
+ response = RESPONSE_CHAIN
138
+ self.p1 = None
139
+ self.p2 = None
140
+ self.scene.context.signal("statusmsg", "")
141
+ elif update_required:
142
+ self.scene.request_refresh()
143
+ response = RESPONSE_CONSUME
144
+ return response