diff --git a/FlatCAMApp.py b/FlatCAMApp.py
index e9da169f..05b923a2 100644
--- a/FlatCAMApp.py
+++ b/FlatCAMApp.py
@@ -2474,6 +2474,11 @@ class App(QtCore.QObject):
self.isHovering = False
self.notHovering = True
+ # Event signals disconnect id holders
+ self.mp = None
+ self.mm = None
+ self.mr = None
+
# when True, the app has to return from any thread
self.abort_flag = False
@@ -7688,16 +7693,14 @@ class App(QtCore.QObject):
# Update cursor
self.app_cursor.set_data(np.asarray([(pos[0], pos[1])]),
symbol='++', edge_color='black', size=20)
- else:
- self.app_cursor.set_data(event, (pos[0], pos[1]))
else:
pos = (pos_canvas[0], pos_canvas[1])
self.ui.position_label.setText(" X: %.4f "
"Y: %.4f" % (pos[0], pos[1]))
- dx = pos[0] - self.rel_point1[0]
- dy = pos[1] - self.rel_point1[1]
+ dx = pos[0] - float(self.rel_point1[0])
+ dy = pos[1] - float(self.rel_point1[1])
self.ui.rel_position_label.setText("Dx: %.4f Dy: "
"%.4f " % (dx, dy))
self.mouse = [pos[0], pos[1]]
@@ -7707,11 +7710,13 @@ class App(QtCore.QObject):
self.delete_selection_shape()
if dx < 0:
self.draw_moving_selection_shape(self.pos, pos, color=self.defaults['global_alt_sel_line'],
- face_color=self.defaults['global_alt_sel_fill'])
+ face_color=self.defaults['global_alt_sel_fill'])
self.selection_type = False
- else:
+ elif dx > 0:
self.draw_moving_selection_shape(self.pos, pos)
self.selection_type = True
+ else:
+ self.selection_type = None
# hover effect - enabled in Preferences -> General -> GUI Settings
if self.defaults['global_hover']:
@@ -7878,6 +7883,7 @@ class App(QtCore.QObject):
# add objects to the objects_under_the_click list only if the object is plotted
# (active and not disabled)
objects_under_the_click_list.append(obj.options['name'])
+
try:
# If there is no element in the overlapped objects list then make everyone inactive
# because we selected "nothing"
@@ -8041,17 +8047,27 @@ class App(QtCore.QObject):
hover_rect = hover_rect.buffer(-0.00393)
hover_rect = hover_rect.buffer(0.00787)
+ # if color:
+ # face = Color(color)
+ # face.alpha = 0.2
+ # outline = Color(color, alpha=0.8)
+ # else:
+ # face = Color(self.defaults['global_sel_fill'])
+ # face.alpha = 0.2
+ # outline = self.defaults['global_sel_line']
+
if color:
- face = Color(color)
- face.alpha = 0.2
- outline = Color(color, alpha=0.8)
+ face = color[:-2] + str(hex(int(0.2 * 255)))[2:]
+ outline = color[:-2] + str(hex(int(0.8 * 255)))[2:]
else:
- face = Color(self.defaults['global_sel_fill'])
- face.alpha = 0.2
+ face = self.defaults['global_sel_fill'][:-2] + str(hex(int(0.2 * 255)))[2:]
outline = self.defaults['global_sel_line']
self.hover_shapes.add(hover_rect, color=outline, face_color=face, update=True, layer=0, tolerance=None)
+ if self.is_legacy is True:
+ self.hover_shapes.redraw()
+
def delete_selection_shape(self):
self.move_tool.sel_shapes.clear()
self.move_tool.sel_shapes.redraw()
@@ -8076,12 +8092,19 @@ class App(QtCore.QObject):
sel_rect = sel_rect.buffer(-0.00393)
sel_rect = sel_rect.buffer(0.00787)
+ # if color:
+ # face = Color(color, alpha=0.2)
+ # outline = Color(color, alpha=0.8)
+ # else:
+ # face = Color(self.defaults['global_sel_fill'], alpha=0.2)
+ # outline = Color(self.defaults['global_sel_line'], alpha=0.8)
+
if color:
- face = Color(color, alpha=0.2)
- outline = Color(color, alpha=0.8)
+ face = color[:-2] + str(hex(int(0.2 * 255)))[2:]
+ outline = color[:-2] + str(hex(int(0.8 * 255)))[2:]
else:
- face = Color(self.defaults['global_sel_fill'], alpha=0.2)
- outline = Color(self.defaults['global_sel_line'], alpha=0.8)
+ face = self.defaults['global_sel_fill'][:-2] + str(hex(int(0.2 * 255)))[2:]
+ outline = self.defaults['global_sel_line'][:-2] + str(hex(int(0.8 * 255)))[2:]
self.sel_objects_list.append(self.move_tool.sel_shapes.add(sel_rect,
color=outline,
@@ -8089,6 +8112,8 @@ class App(QtCore.QObject):
update=True,
layer=0,
tolerance=None))
+ if self.is_legacy is True:
+ self.move_tool.sel_shapes.redraw()
def draw_moving_selection_shape(self, old_coords, coords, **kwargs):
"""
@@ -8121,10 +8146,15 @@ class App(QtCore.QObject):
pt4 = (x0, y1)
sel_rect = Polygon([pt1, pt2, pt3, pt4])
- color_t = Color(face_color)
- color_t.alpha = face_alpha
+ # color_t = Color(face_color)
+ # color_t.alpha = face_alpha
+
+ color_t = face_color[:-2] + str(hex(int(face_alpha * 255)))[2:]
+
self.move_tool.sel_shapes.add(sel_rect, color=color, face_color=color_t, update=True,
layer=0, tolerance=None)
+ if self.is_legacy is True:
+ self.move_tool.sel_shapes.redraw()
def on_file_new_click(self):
if self.collection.get_list() and self.should_we_save:
diff --git a/README.md b/README.md
index e597bf82..2d629539 100644
--- a/README.md
+++ b/README.md
@@ -18,6 +18,9 @@ CAD program, and create G-Code for Isolation routing.
- in legacy graphic engine fixed the travel vs cut lines in CNCJob objects
- final fix for key shortcuts with modifier in legacy graphic engine
- refactored some of the code in the legacy graphic engine
+- fixed drawing of selection box when dragging mouse on screen and the selection shape drawing on the selected objects
+- fixed the moving drawing shape in Tool Move in legacy graphic engine
+- fixed moving geometry in Tool Measurement in legacy graphic engine
20.09.2019
diff --git a/flatcamEditors/FlatCAMExcEditor.py b/flatcamEditors/FlatCAMExcEditor.py
index ac266502..eebffd5d 100644
--- a/flatcamEditors/FlatCAMExcEditor.py
+++ b/flatcamEditors/FlatCAMExcEditor.py
@@ -2088,6 +2088,11 @@ class FlatCAMExcEditor(QtCore.QObject):
def entry2option(option, entry):
self.options[option] = float(entry.text())
+ # Event signals disconnect id holders
+ self.mp = None
+ self.mm = None
+ self.mr = None
+
# store the status of the editor so the Delete at object level will not work until the edit is finished
self.editor_active = False
log.debug("Initialization of the FlatCAM Excellon Editor is finished ...")
@@ -3307,9 +3312,6 @@ class FlatCAMExcEditor(QtCore.QObject):
if self.app.grid_status() == True:
self.pos = self.app.geo_editor.snap(self.pos[0], self.pos[1])
- # Update cursor
- self.app.app_cursor.set_data(np.asarray([(self.pos[0], self.pos[1])]), symbol='++', edge_color='black',
- size=20)
else:
self.pos = (self.pos[0], self.pos[1])
diff --git a/flatcamEditors/FlatCAMGeoEditor.py b/flatcamEditors/FlatCAMGeoEditor.py
index 54e4be4b..3507091a 100644
--- a/flatcamEditors/FlatCAMGeoEditor.py
+++ b/flatcamEditors/FlatCAMGeoEditor.py
@@ -3169,6 +3169,11 @@ class FlatCAMGeoEditor(QtCore.QObject):
self.transform_complete.connect(self.on_transform_complete)
+ # Event signals disconnect id holders
+ self.mp = None
+ self.mm = None
+ self.mr = None
+
# store the status of the editor so the Delete at object level will not work until the edit is finished
self.editor_active = False
log.debug("Initialization of the FlatCAM Geometry Editor is finished ...")
@@ -3326,6 +3331,7 @@ class FlatCAMGeoEditor(QtCore.QObject):
self.app.plotcanvas.graph_event_disconnect('mouse_release', self.app.on_mouse_click_release_over_plot)
self.app.plotcanvas.graph_event_disconnect('mouse_double_click', self.app.on_double_click_over_plot)
else:
+
self.app.plotcanvas.graph_event_disconnect(self.app.mp)
self.app.plotcanvas.graph_event_disconnect(self.app.mm)
self.app.plotcanvas.graph_event_disconnect(self.app.mr)
@@ -3652,9 +3658,6 @@ class FlatCAMGeoEditor(QtCore.QObject):
if self.app.grid_status() == True:
self.pos = self.app.geo_editor.snap(self.pos[0], self.pos[1])
- # Update cursor
- self.app.app_cursor.set_data(np.asarray([(self.pos[0], self.pos[1])]), symbol='++', edge_color='black',
- size=20)
else:
self.pos = (self.pos[0], self.pos[1])
diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py
index 7c70e7a8..9ecb0d9d 100644
--- a/flatcamEditors/FlatCAMGrbEditor.py
+++ b/flatcamEditors/FlatCAMGrbEditor.py
@@ -2833,6 +2833,11 @@ class FlatCAMGrbEditor(QtCore.QObject):
self.app.pool_recreated.connect(self.pool_recreated)
+ # Event signals disconnect id holders
+ self.mp = None
+ self.mm = None
+ self.mr = None
+
# Remove from scene
self.shapes.enabled = False
self.tool_shape.enabled = False
@@ -4154,9 +4159,6 @@ class FlatCAMGrbEditor(QtCore.QObject):
if self.app.grid_status() == True:
self.pos = self.app.geo_editor.snap(self.pos[0], self.pos[1])
- # Update cursor
- self.app.app_cursor.set_data(np.asarray([(self.pos[0], self.pos[1])]), symbol='++', edge_color='black',
- size=20)
else:
self.pos = (self.pos[0], self.pos[1])
diff --git a/flatcamGUI/PlotCanvasLegacy.py b/flatcamGUI/PlotCanvasLegacy.py
index bf2bbe6f..480e9d04 100644
--- a/flatcamGUI/PlotCanvasLegacy.py
+++ b/flatcamGUI/PlotCanvasLegacy.py
@@ -715,8 +715,13 @@ class ShapeCollectionLegacy():
def add(self, shape=None, color=None, face_color=None, alpha=None, visible=True,
update=False, layer=1, tolerance=0.01, obj=None, gcode_parsed=None, tool_tolerance=None, tooldia=None):
+
self._color = color[:-2] if color is not None else None
self._face_color = face_color[:-2] if face_color is not None else None
+ self._alpha = int(face_color[-2:], 16) / 255 if face_color is not None else 0.75
+ if alpha is not None:
+ self._alpha = alpha
+
self._visible = visible
self._update = update
@@ -726,12 +731,16 @@ class ShapeCollectionLegacy():
self._tool_tolerance = tool_tolerance
self._tooldia = tooldia
+ # if self._update:
+ # self.clear()
+
try:
for sh in shape:
self.shape_id += 1
self.shape_dict.update({
'color': self._color,
'face_color': self._face_color,
+ 'alpha': self._alpha,
'shape': sh
})
@@ -743,6 +752,7 @@ class ShapeCollectionLegacy():
self.shape_dict.update({
'color': self._color,
'face_color': self._face_color,
+ 'alpha': self._alpha,
'shape': shape
})
@@ -764,15 +774,19 @@ class ShapeCollectionLegacy():
def redraw(self):
path_num = 0
+ try:
+ obj_type = self.obj.kind
+ except AttributeError:
+ obj_type = 'utility'
if self._visible:
for element in self._shapes:
- if self.obj.kind == 'excellon':
+ if obj_type == 'excellon':
# Plot excellon (All polygons?)
if self.obj.options["solid"]:
patch = PolygonPatch(self._shapes[element]['shape'],
facecolor="#C40000",
edgecolor="#750000",
- alpha=0.75,
+ alpha=self._shapes[element]['alpha'],
zorder=3)
self.axes.add_patch(patch)
else:
@@ -781,7 +795,7 @@ class ShapeCollectionLegacy():
for ints in self._shapes[element]['shape'].interiors:
x, y = ints.coords.xy
self.axes.plot(x, y, 'o-')
- elif self.obj.kind == 'geometry':
+ elif obj_type== 'geometry':
if type(self._shapes[element]['shape']) == Polygon:
x, y = self._shapes[element]['shape'].exterior.coords.xy
self.axes.plot(x, y, self._shapes[element]['color'], linestyle='-')
@@ -792,7 +806,7 @@ class ShapeCollectionLegacy():
x, y = element.coords.xy
self.axes.plot(x, y, self._shapes[element]['color'], marker='-')
return
- elif self.obj.kind == 'gerber':
+ elif obj_type == 'gerber':
if self.obj.options["multicolored"]:
linespec = '-'
else:
@@ -803,7 +817,7 @@ class ShapeCollectionLegacy():
patch = PolygonPatch(self._shapes[element]['shape'],
facecolor=self._shapes[element]['face_color'],
edgecolor=self._shapes[element]['color'],
- alpha=0.75,
+ alpha=self._shapes[element]['alpha'],
zorder=2)
self.axes.add_patch(patch)
except AssertionError:
@@ -815,7 +829,7 @@ class ShapeCollectionLegacy():
for ints in self._shapes[element]['shape'].interiors:
x, y = ints.coords.xy
self.axes.plot(x, y, linespec)
- elif self.obj.kind == 'cncjob':
+ elif obj_type == 'cncjob':
if self._shapes[element]['face_color'] is None:
linespec = '--'
@@ -828,16 +842,39 @@ class ShapeCollectionLegacy():
path_num += 1
if isinstance(self._shapes[element]['shape'], Polygon):
self.axes.annotate(str(path_num), xy=self._shapes[element]['shape'].exterior.coords[0],
- xycoords='data')
+ xycoords='data', fontsize=20)
else:
self.axes.annotate(str(path_num), xy=self._shapes[element]['shape'].coords[0],
- xycoords='data')
+ xycoords='data', fontsize=20)
patch = PolygonPatch(self._shapes[element]['shape'],
facecolor=self._shapes[element]['face_color'],
edgecolor=self._shapes[element]['color'],
- alpha=0.75, zorder=2)
+ alpha=self._shapes[element]['alpha'], zorder=2)
self.axes.add_patch(patch)
+ elif obj_type == 'utility':
+ # not a FlatCAM object, must be utility
+ if self._shapes[element]['face_color']:
+ try:
+ patch = PolygonPatch(self._shapes[element]['shape'],
+ facecolor=self._shapes[element]['face_color'],
+ edgecolor=self._shapes[element]['color'],
+ alpha=self._shapes[element]['alpha'],
+ zorder=2)
+ self.axes.add_patch(patch)
+ except AssertionError:
+ FlatCAMApp.App.log.warning("A geometry component was not a polygon:")
+ FlatCAMApp.App.log.warning(str(element))
+ else:
+ if isinstance(self._shapes[element]['shape'], Polygon):
+ x, y = self._shapes[element]['shape'].exterior.xy
+ self.axes.plot(x, y, self._shapes[element]['color'], linestyle='-')
+ for ints in self._shapes[element]['shape'].interiors:
+ x, y = ints.coords.xy
+ self.axes.plot(x, y, self._shapes[element]['color'], linestyle='-')
+ else:
+ x, y = self._shapes[element]['shape'].coords.xy
+ self.axes.plot(x, y, self._shapes[element]['color'], linestyle='-')
self.app.plotcanvas.auto_adjust_axes()
diff --git a/flatcamTools/ToolMeasurement.py b/flatcamTools/ToolMeasurement.py
index 28340261..64dbf286 100644
--- a/flatcamTools/ToolMeasurement.py
+++ b/flatcamTools/ToolMeasurement.py
@@ -310,8 +310,7 @@ class Measurement(FlatCAMTool):
if len(self.points) == 1:
self.start_entry.set_value("(%.4f, %.4f)" % pos)
self.app.inform.emit(_("MEASURING: Click on the Destination point ..."))
-
- if len(self.points) == 2:
+ elif len(self.points) == 2:
dx = self.points[1][0] - self.points[0][0]
dy = self.points[1][1] - self.points[0][1]
d = sqrt(dx ** 2 + dy ** 2)
@@ -323,8 +322,8 @@ class Measurement(FlatCAMTool):
self.distance_x_entry.set_value('%.4f' % abs(dx))
self.distance_y_entry.set_value('%.4f' % abs(dy))
self.total_distance_entry.set_value('%.4f' % abs(d))
- self.app.ui.rel_position_label.setText("Dx: %.4f Dy: "
- "%.4f " % (pos[0], pos[1]))
+ self.app.ui.rel_position_label.setText("Dx: {0:.4f} Dy: "
+ "{0:.4f} ".format(pos[0], pos[1]))
self.deactivate_measure_tool()
def on_mouse_move_meas(self, event):
@@ -334,39 +333,57 @@ class Measurement(FlatCAMTool):
else:
event_pos = (event.xdata, event.ydata)
- pos_canvas = self.app.plotcanvas.translate_coords(event_pos)
+ try:
+ x = float(event_pos[0])
+ y = float(event_pos[1])
+ except TypeError:
+ return
+
+ pos_canvas = self.app.plotcanvas.translate_coords((x, y))
+
if self.app.grid_status() == True:
pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1])
- # Update cursor
- self.app.app_cursor.set_data(np.asarray([(pos[0], pos[1])]),
- symbol='++', edge_color='black', size=20)
+ if self.app.is_legacy is False:
+ # Update cursor
+ self.app.app_cursor.set_data(np.asarray([(pos[0], pos[1])]),
+ symbol='++', edge_color='black', size=20)
else:
pos = (pos_canvas[0], pos_canvas[1])
+ self.app.ui.position_label.setText(" X: {0:.4f} "
+ "Y: {0:.4f}".format(pos[0], pos[1]))
+
if self.rel_point1 is not None:
- dx = pos[0] - self.rel_point1[0]
- dy = pos[1] - self.rel_point1[1]
+ dx = pos[0] - float(self.rel_point1[0])
+ dy = pos[1] - float(self.rel_point1[1])
else:
dx = pos[0]
dy = pos[1]
- self.app.ui.position_label.setText(" X: %.4f "
- "Y: %.4f" % (pos[0], pos[1]))
- self.app.ui.rel_position_label.setText("Dx: %.4f Dy: "
- "%.4f " % (dx, dy))
+ self.app.ui.rel_position_label.setText("Dx: {0:.4f} Dy: "
+ "{0:.4f} ".format(dx, dy))
+
# update utility geometry
+
if len(self.points) == 1:
self.utility_geometry(pos=pos)
except Exception as e:
+ log.debug("Measurement.on_mouse_move_meas() --> %s" % str(e))
self.app.ui.position_label.setText("")
self.app.ui.rel_position_label.setText("")
def utility_geometry(self, pos):
# first delete old shape
self.delete_shape()
+
# second draw the new shape of the utility geometry
- self.meas_line = LineString([pos, self.points[0]])
- self.sel_shapes.add(self.meas_line, color='black', update=True, layer=0, tolerance=None)
+ meas_line = LineString([pos, self.points[0]])
+
+ color = '#00000000'
+ self.sel_shapes.add(meas_line, color=color, update=True, layer=0, tolerance=None)
+
+ if self.app.is_legacy is True:
+ self.sel_shapes.redraw()
def delete_shape(self):
self.sel_shapes.clear()
diff --git a/flatcamTools/ToolMove.py b/flatcamTools/ToolMove.py
index a2ffcc4d..ee8f17da 100644
--- a/flatcamTools/ToolMove.py
+++ b/flatcamTools/ToolMove.py
@@ -212,7 +212,14 @@ class ToolMove(FlatCAMTool):
event_pos = event.pos
else:
event_pos = (event.xdata, event.ydata)
- pos_canvas = self.app.plotcanvas.translate_coords(event_pos)
+
+ try:
+ x = float(event_pos[0])
+ y = float(event_pos[1])
+ except TypeError:
+ return
+
+ pos_canvas = self.app.plotcanvas.translate_coords((x, y))
# if GRID is active we need to get the snapped positions
if self.app.grid_status() == True:
@@ -270,8 +277,12 @@ class ToolMove(FlatCAMTool):
p2 = (xmaximal, yminimal)
p3 = (xmaximal, ymaximal)
p4 = (xminimal, ymaximal)
+
self.old_coords = [p1, p2, p3, p4]
- self.draw_shape(self.old_coords)
+ self.draw_shape(Polygon(self.old_coords))
+
+ if self.app.is_legacy is True:
+ self.sel_shapes.redraw()
def update_sel_bbox(self, pos):
self.delete_shape()
@@ -280,24 +291,30 @@ class ToolMove(FlatCAMTool):
pt2 = (self.old_coords[1][0] + pos[0], self.old_coords[1][1] + pos[1])
pt3 = (self.old_coords[2][0] + pos[0], self.old_coords[2][1] + pos[1])
pt4 = (self.old_coords[3][0] + pos[0], self.old_coords[3][1] + pos[1])
+ self.draw_shape(Polygon([pt1, pt2, pt3, pt4]))
- self.draw_shape([pt1, pt2, pt3, pt4])
+ if self.app.is_legacy is True:
+ self.sel_shapes.redraw()
def delete_shape(self):
self.sel_shapes.clear()
self.sel_shapes.redraw()
- def draw_shape(self, coords):
- self.sel_rect = Polygon(coords)
- if self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == 'MM':
- self.sel_rect = self.sel_rect.buffer(-0.1)
- self.sel_rect = self.sel_rect.buffer(0.2)
- else:
- self.sel_rect = self.sel_rect.buffer(-0.00393)
- self.sel_rect = self.sel_rect.buffer(0.00787)
+ def draw_shape(self, shape):
- blue_t = Color('blue')
- blue_t.alpha = 0.2
- self.sel_shapes.add(self.sel_rect, color='blue', face_color=blue_t, update=True, layer=0, tolerance=None)
+ if self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().upper() == 'MM':
+ proc_shape = shape.buffer(-0.1)
+ proc_shape = proc_shape.buffer(0.2)
+ else:
+ proc_shape = shape.buffer(-0.00393)
+ proc_shape = proc_shape.buffer(0.00787)
+
+ # face = Color('blue')
+ # face.alpha = 0.2
+
+ face = '#0000FFAF' + str(hex(int(0.2 * 255)))[2:]
+ outline = '#0000FFAF'
+
+ self.sel_shapes.add(proc_shape, color=outline, face_color=face, update=True, layer=0, tolerance=None)
# end of file