- cleaned up Measuring Tool

This commit is contained in:
Marius Stanciu 2019-04-14 16:59:20 +03:00
parent 1332601624
commit fc1dfb8550
4 changed files with 85 additions and 91 deletions

View File

@ -4472,7 +4472,6 @@ class App(QtCore.QObject):
self.report_usage("on_set_origin()") self.report_usage("on_set_origin()")
self.inform.emit(_('Click to set the origin ...')) self.inform.emit(_('Click to set the origin ...'))
self.plotcanvas.vis_connect('mouse_press', self.on_set_zero_click) self.plotcanvas.vis_connect('mouse_press', self.on_set_zero_click)
def on_jump_to(self, custom_location=None, fit_center=True): def on_jump_to(self, custom_location=None, fit_center=True):
@ -5117,9 +5116,7 @@ class App(QtCore.QObject):
def on_mouse_move_over_plot(self, event, origin_click=None): def on_mouse_move_over_plot(self, event, origin_click=None):
""" """
Callback for the mouse motion event over the plot. This event is generated Callback for the mouse motion event over the plot.
by the Matplotlib backend and has been registered in ``self.__init__()``.
For details, see: http://matplotlib.org/users/event_handling.html
:param event: Contains information about the event. :param event: Contains information about the event.
:param origin_click :param origin_click
@ -5314,7 +5311,6 @@ class App(QtCore.QObject):
def select_objects(self, key=None): def select_objects(self, key=None):
# list where we store the overlapped objects under our mouse left click position # list where we store the overlapped objects under our mouse left click position
objects_under_the_click_list = [] objects_under_the_click_list = []
# Populate the list with the overlapped objects on the click position # Populate the list with the overlapped objects on the click position
curr_x, curr_y = self.pos curr_x, curr_y = self.pos
for obj in self.all_objects_list: for obj in self.all_objects_list:

View File

@ -18,6 +18,7 @@ CAD program, and create G-Code for Isolation routing.
- In Geometry Editor I fixed bug in Arc modes. Arc mode shortcut key is now key 'M' and arc direction change shortcut key is 'D' - In Geometry Editor I fixed bug in Arc modes. Arc mode shortcut key is now key 'M' and arc direction change shortcut key is 'D'
- moved the key handler out of the Measurement tool to flatcamGUI.FlatCAMGui.keyPressEvent() - moved the key handler out of the Measurement tool to flatcamGUI.FlatCAMGui.keyPressEvent()
- Gerber Editor: started to add new function of poligonize which should make a filled polygon out of a shape - Gerber Editor: started to add new function of poligonize which should make a filled polygon out of a shape
- cleaned up Measuring Tool
13.04.2019 13.04.2019

View File

@ -2923,7 +2923,6 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
elif modifiers == QtCore.Qt.NoModifier: elif modifiers == QtCore.Qt.NoModifier:
if key == QtCore.Qt.Key_Escape or key == 'Escape': if key == QtCore.Qt.Key_Escape or key == 'Escape':
# abort the measurement action # abort the measurement action
self.app.measurement_tool.on_measure(activate=False)
self.app.measurement_tool.deactivate_measure_tool() self.app.measurement_tool.deactivate_measure_tool()
self.app.inform.emit(_("Measurement Tool exit...")) self.app.inform.emit(_("Measurement Tool exit..."))
return return

View File

@ -103,25 +103,23 @@ class Measurement(FlatCAMTool):
self.layout.addStretch() self.layout.addStretch()
self.clicked_meas = 0 # store here the first click and second click of the measurement process
self.points = []
self.point1 = None self.active = False
self.point2 = None
# the default state is disabled for the Move command
# self.setVisible(False)
self.active = 0
self.original_call_source = 'app' self.original_call_source = 'app'
# VisPy visuals # VisPy visuals
self.sel_shapes = ShapeCollection(parent=self.app.plotcanvas.vispy_canvas.view.scene, layers=1) self.sel_shapes = ShapeCollection(parent=self.app.plotcanvas.vispy_canvas.view.scene, layers=1)
self.measure_btn.clicked.connect(lambda: self.on_measure(activate=True)) self.measure_btn.clicked.connect(self.activate_measure_tool)
def run(self, toggle=False): def run(self, toggle=False):
self.app.report_usage("ToolMeasurement()") self.app.report_usage("ToolMeasurement()")
self.points[:] = []
if self.app.tool_tab_locked is True: if self.app.tool_tab_locked is True:
return return
@ -130,8 +128,13 @@ class Measurement(FlatCAMTool):
# if the splitter is hidden, display it # if the splitter is hidden, display it
if self.app.ui.splitter.sizes()[0] == 0: if self.app.ui.splitter.sizes()[0] == 0:
self.app.ui.splitter.setSizes([1, 1]) self.app.ui.splitter.setSizes([1, 1])
if toggle:
pass
self.on_measure(activate=True) if self.active is False:
self.activate_measure_tool()
else:
self.deactivate_measure_tool()
def install(self, icon=None, separator=None, **kwargs): def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='CTRL+M', **kwargs) FlatCAMTool.install(self, icon, separator, shortcut='CTRL+M', **kwargs)
@ -156,101 +159,104 @@ class Measurement(FlatCAMTool):
self.distance_x_entry.set_value('0') self.distance_x_entry.set_value('0')
self.distance_y_entry.set_value('0') self.distance_y_entry.set_value('0')
self.total_distance_entry.set_value('0') self.total_distance_entry.set_value('0')
log.debug("Measurement Tool --> tool initialized")
def activate_measure_tool(self): def activate_measure_tool(self):
# we disconnect the mouse/key handlers from wherever the measurement tool was called # ENABLE the Measuring TOOL
self.canvas.vis_disconnect('mouse_move') self.active = True
self.canvas.vis_disconnect('mouse_press')
self.canvas.vis_disconnect('mouse_release')
# we can safely connect the app mouse events to the measurement tool self.clicked_meas = 0
self.original_call_source = copy(self.app.call_source)
self.app.inform.emit(_("MEASURING: Click on the Start point ..."))
self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower()
# we can connect the app mouse events to the measurement tool
# NEVER DISCONNECT THOSE before connecting some other handlers; it breaks something in VisPy
self.canvas.vis_connect('mouse_move', self.on_mouse_move_meas) self.canvas.vis_connect('mouse_move', self.on_mouse_move_meas)
self.canvas.vis_connect('mouse_release', self.on_mouse_click_release) self.canvas.vis_connect('mouse_release', self.on_mouse_click_release)
# we disconnect the mouse/key handlers from wherever the measurement tool was called
if self.app.call_source == 'app':
self.canvas.vis_disconnect('mouse_move', self.app.on_mouse_move_over_plot)
self.canvas.vis_disconnect('mouse_press', self.app.on_mouse_click_over_plot)
self.canvas.vis_disconnect('mouse_release', self.app.on_mouse_click_release_over_plot)
elif self.app.call_source == 'geo_editor':
self.canvas.vis_disconnect('mouse_move', self.app.geo_editor.on_canvas_move)
self.canvas.vis_disconnect('mouse_press', self.app.geo_editor.on_canvas_click)
self.canvas.vis_disconnect('mouse_release', self.app.geo_editor.on_geo_click_release)
elif self.app.call_source == 'exc_editor':
self.canvas.vis_disconnect('mouse_move', self.app.exc_editor.on_canvas_move)
self.canvas.vis_disconnect('mouse_press', self.app.exc_editor.on_canvas_click)
self.canvas.vis_disconnect('mouse_release', self.app.exc_editor.on_exc_click_release)
elif self.app.call_source == 'grb_editor':
self.canvas.vis_disconnect('mouse_move', self.app.grb_editor.on_canvas_move)
self.canvas.vis_disconnect('mouse_press', self.app.grb_editor.on_canvas_click)
self.canvas.vis_disconnect('mouse_release', self.app.grb_editor.on_grb_click_release)
self.app.call_source = 'measurement'
self.set_tool_ui() self.set_tool_ui()
def deactivate_measure_tool(self): def deactivate_measure_tool(self):
# disconnect the mouse/key events from functions of measurement tool # DISABLE the Measuring TOOL
self.canvas.vis_disconnect('mouse_move', self.on_mouse_move_meas) self.active = False
self.canvas.vis_disconnect('mouse_release', self.on_mouse_click_release) self.points = []
if self.app.call_source == 'app': self.app.call_source = copy(self.original_call_source)
if self.original_call_source == 'app':
self.canvas.vis_connect('mouse_move', self.app.on_mouse_move_over_plot) self.canvas.vis_connect('mouse_move', self.app.on_mouse_move_over_plot)
self.canvas.vis_connect('mouse_press', self.app.on_mouse_click_over_plot) self.canvas.vis_connect('mouse_press', self.app.on_mouse_click_over_plot)
self.canvas.vis_connect('mouse_release', self.app.on_mouse_click_release_over_plot) self.canvas.vis_connect('mouse_release', self.app.on_mouse_click_release_over_plot)
elif self.app.call_source == 'geo_editor': elif self.original_call_source == 'geo_editor':
self.canvas.vis_connect('mouse_move', self.app.geo_editor.on_canvas_move) self.canvas.vis_connect('mouse_move', self.app.geo_editor.on_canvas_move)
self.canvas.vis_connect('mouse_press', self.app.geo_editor.on_canvas_click) self.canvas.vis_connect('mouse_press', self.app.geo_editor.on_canvas_click)
self.canvas.vis_connect('mouse_release', self.app.geo_editor.on_geo_click_release) self.canvas.vis_connect('mouse_release', self.app.geo_editor.on_geo_click_release)
elif self.app.call_source == 'exc_editor': elif self.original_call_source == 'exc_editor':
self.canvas.vis_connect('mouse_move', self.app.exc_editor.on_canvas_move) self.canvas.vis_connect('mouse_move', self.app.exc_editor.on_canvas_move)
self.canvas.vis_connect('mouse_press', self.app.exc_editor.on_canvas_click) self.canvas.vis_connect('mouse_press', self.app.exc_editor.on_canvas_click)
self.canvas.vis_connect('mouse_release', self.app.exc_editor.on_exc_click_release) self.canvas.vis_connect('mouse_release', self.app.exc_editor.on_exc_click_release)
elif self.app.call_source == 'grb_editor': elif self.original_call_source == 'grb_editor':
self.canvas.vis_connect('mouse_move', self.app.grb_editor.on_canvas_move) self.canvas.vis_connect('mouse_move', self.app.grb_editor.on_canvas_move)
self.canvas.vis_connect('mouse_press', self.app.grb_editor.on_canvas_click) self.canvas.vis_connect('mouse_press', self.app.grb_editor.on_canvas_click)
self.canvas.vis_connect('mouse_release', self.app.grb_editor.on_grb_click_release) self.canvas.vis_connect('mouse_release', self.app.grb_editor.on_grb_click_release)
self.app.ui.notebook.setTabText(2, _("Tools")) # disconnect the mouse/key events from functions of measurement tool
self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab) self.canvas.vis_disconnect('mouse_move', self.on_mouse_move_meas)
self.canvas.vis_disconnect('mouse_release', self.on_mouse_click_release)
def on_measure(self, signal=None, activate=None): # self.app.ui.notebook.setTabText(2, _("Tools"))
log.debug("Measurement.on_measure()") # self.app.ui.notebook.setCurrentWidget(self.app.ui.project_tab)
if activate is True:
# ENABLE the Measuring TOOL
self.clicked_meas = 0
self.original_call_source = copy(self.app.call_source)
self.app.call_source = 'measurement'
self.app.inform.emit(_("MEASURING: Click on the Start point ...")) self.app.command_active = None
self.units = self.app.ui.general_defaults_form.general_app_group.units_radio.get_value().lower()
self.activate_measure_tool() # delete the measuring line
log.debug("Measurement Tool --> tool initialized") self.delete_shape()
else:
# DISABLE the Measuring TOOL
self.deactivate_measure_tool()
self.app.call_source = copy(self.original_call_source)
self.app.command_active = None
# delete the measuring line log.debug("Measurement Tool --> exit tool")
self.delete_shape()
log.debug("Measurement Tool --> exit tool")
def on_mouse_click_release(self, event): def on_mouse_click_release(self, event):
# mouse click releases will be accepted only if the left button is clicked # mouse click releases will be accepted only if the left button is clicked
# this is necessary because right mouse click or middle mouse click # this is necessary because right mouse click or middle mouse click
# are used for panning on the canvas # are used for panning on the canvas
log.debug("Measuring Tool --> mouse click release")
if event.button == 1: if event.button == 1:
pos_canvas = self.canvas.vispy_canvas.translate_coords(event.pos) pos_canvas = self.canvas.vispy_canvas.translate_coords(event.pos)
# if GRID is active we need to get the snapped positions
if self.app.grid_status() == True:
pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1])
else:
pos = pos_canvas[0], pos_canvas[1]
self.points.append(pos)
if self.clicked_meas == 0: if len(self.points) == 1:
self.clicked_meas = 1
# if GRID is active we need to get the snapped positions
if self.app.grid_status() == True:
pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1])
else:
pos = pos_canvas[0], pos_canvas[1]
self.point1 = pos
self.start_entry.set_value("(%.4f, %.4f)" % pos) self.start_entry.set_value("(%.4f, %.4f)" % pos)
self.app.inform.emit(_("MEASURING: Click on the Destination point ...")) self.app.inform.emit(_("MEASURING: Click on the Destination point ..."))
else: if len(self.points) == 2:
# delete the selection bounding box dx = self.points[1][0] - self.points[0][0]
self.delete_shape() dy = self.points[1][1] - self.points[0][1]
# if GRID is active we need to get the snapped positions
if self.app.grid_status() is True:
pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1])
else:
pos = pos_canvas[0], pos_canvas[1]
dx = pos[0] - self.point1[0]
dy = pos[1] - self.point1[1]
d = sqrt(dx ** 2 + dy ** 2) d = sqrt(dx ** 2 + dy ** 2)
self.stop_entry.set_value("(%.4f, %.4f)" % pos) self.stop_entry.set_value("(%.4f, %.4f)" % pos)
@ -262,33 +268,25 @@ class Measurement(FlatCAMTool):
self.distance_y_entry.set_value('%.4f' % abs(dy)) self.distance_y_entry.set_value('%.4f' % abs(dy))
self.total_distance_entry.set_value('%.4f' % abs(d)) self.total_distance_entry.set_value('%.4f' % abs(d))
# TODO: I don't understand why I have to do it twice ... but without it the mouse handlers are self.deactivate_measure_tool()
# TODO: are left disconnected ...
self.on_measure(activate=False)
self.deactivate()
def on_mouse_move_meas(self, event): def on_mouse_move_meas(self, event):
pos_canvas = self.canvas.vispy_canvas.translate_coords(event.pos) pos_canvas = self.canvas.vispy_canvas.translate_coords(event.pos)
# Update cursor
# if GRID is active we need to get the snapped positions pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1])
if self.app.grid_status() == True: if self.app.grid_status() == True:
pos = self.app.geo_editor.snap(pos_canvas[0], pos_canvas[1])
self.app.app_cursor.enabled = True
# Update cursor
self.app.app_cursor.set_data(np.asarray([(pos[0], pos[1])]), symbol='++', edge_color='black', size=20) self.app.app_cursor.set_data(np.asarray([(pos[0], pos[1])]), symbol='++', edge_color='black', size=20)
else:
pos = pos_canvas
self.app.app_enabled = False
self.point2 = (pos[0], pos[1])
# update utility geometry # update utility geometry
if self.clicked_meas == 1: if len(self.points) == 1:
# first delete old shape self.utility_geometry(pos=pos)
self.delete_shape()
# second draw the new shape of the utility geometry def utility_geometry(self, pos):
self.meas_line = LineString([self.point2, self.point1]) # first delete old shape
self.sel_shapes.add(self.meas_line, color='black', update=True, layer=0, tolerance=None) 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)
def delete_shape(self): def delete_shape(self):
self.sel_shapes.clear() self.sel_shapes.clear()