- removed the labels in status bar that display X,Y positions and replaced it with a HUD display on canvas (combo key SHIFT+H) will toggle the display of the HUD
- made the HUD work in Legacy2D mode - fixed situation when the mouse cursor is outside of the canvas and no therefore returning None values
This commit is contained in:
@@ -2306,17 +2306,17 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
|
||||
self.snap_infobar_label.setPixmap(QtGui.QPixmap(self.app.resource_location + '/snap_16.png'))
|
||||
self.infobar.addWidget(self.snap_infobar_label)
|
||||
|
||||
self.rel_position_label = QtWidgets.QLabel(
|
||||
"<b>Dx</b>: 0.0000 <b>Dy</b>: 0.0000 ")
|
||||
self.rel_position_label.setMinimumWidth(110)
|
||||
self.rel_position_label.setToolTip(_("Relative measurement.\nReference is last click position"))
|
||||
self.infobar.addWidget(self.rel_position_label)
|
||||
|
||||
self.position_label = QtWidgets.QLabel(
|
||||
" <b>X</b>: 0.0000 <b>Y</b>: 0.0000")
|
||||
self.position_label.setMinimumWidth(110)
|
||||
self.position_label.setToolTip(_("Absolute measurement.\nReference is (X=0, Y= 0) position"))
|
||||
self.infobar.addWidget(self.position_label)
|
||||
# self.rel_position_label = QtWidgets.QLabel(
|
||||
# "<b>Dx</b>: 0.0000 <b>Dy</b>: 0.0000 ")
|
||||
# self.rel_position_label.setMinimumWidth(110)
|
||||
# self.rel_position_label.setToolTip(_("Relative measurement.\nReference is last click position"))
|
||||
# self.infobar.addWidget(self.rel_position_label)
|
||||
#
|
||||
# self.position_label = QtWidgets.QLabel(
|
||||
# " <b>X</b>: 0.0000 <b>Y</b>: 0.0000")
|
||||
# self.position_label.setMinimumWidth(110)
|
||||
# self.position_label.setToolTip(_("Absolute measurement.\nReference is (X=0, Y= 0) position"))
|
||||
# self.infobar.addWidget(self.position_label)
|
||||
|
||||
self.units_label = QtWidgets.QLabel("[in]")
|
||||
self.units_label.setMargin(2)
|
||||
@@ -2993,6 +2993,11 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
|
||||
if key == QtCore.Qt.Key_G:
|
||||
self.app.on_toggle_axis()
|
||||
|
||||
# Toggle HUD (Heads-Up Display)
|
||||
if key == QtCore.Qt.Key_H:
|
||||
state = False if self.app.plotcanvas.hud_enabled else True
|
||||
self.app.plotcanvas.on_toggle_hud(state=state)
|
||||
|
||||
# Locate in Object
|
||||
if key == QtCore.Qt.Key_J:
|
||||
self.app.on_locate(obj=self.app.collection.get_active())
|
||||
|
||||
@@ -10,7 +10,7 @@ from PyQt5 import QtCore
|
||||
import logging
|
||||
from flatcamGUI.VisPyCanvas import VisPyCanvas, Color
|
||||
from flatcamGUI.VisPyVisuals import ShapeGroup, ShapeCollection, TextCollection, TextGroup, Cursor
|
||||
from vispy.scene.visuals import InfiniteLine, Line
|
||||
from vispy.scene.visuals import InfiniteLine, Line, Rectangle, Text
|
||||
|
||||
import numpy as np
|
||||
from vispy.geometry import Rect
|
||||
@@ -54,8 +54,12 @@ class PlotCanvas(QtCore.QObject, VisPyCanvas):
|
||||
|
||||
if theme == 'white':
|
||||
self.line_color = (0.3, 0.0, 0.0, 1.0)
|
||||
self.rect_hud_color = Color('#0000FF10')
|
||||
self.text_hud_color = 'black'
|
||||
else:
|
||||
self.line_color = (0.4, 0.4, 0.4, 1.0)
|
||||
self.rect_hud_color = Color('#0000FF10')
|
||||
self.text_hud_color = 'white'
|
||||
|
||||
# workspace lines; I didn't use the rectangle because I didn't want to add another VisPy Node,
|
||||
# which might decrease performance
|
||||
@@ -146,13 +150,28 @@ class PlotCanvas(QtCore.QObject, VisPyCanvas):
|
||||
self.cursor_h_line = InfiniteLine(pos=None, color=c_color, vertical=False,
|
||||
parent=self.line_parent)
|
||||
|
||||
self.rect_hud = Rectangle(center=(90,45), color=self.rect_hud_color, border_color=self.rect_hud_color,
|
||||
width=170, height=80, radius=[5, 5, 5, 5], parent=None)
|
||||
self.rect_hud.set_gl_state(depth_test=False)
|
||||
|
||||
# HUD Display
|
||||
self.hud_enabled = False
|
||||
|
||||
self.text_hud = Text('', color=self.text_hud_color, pos=(8, 45), method='gpu', anchor_x='left', parent=None)
|
||||
self.text_hud.font_size = 8
|
||||
units = self.fcapp.defaults["units"].lower()
|
||||
self.text_hud.text = 'Dx:\t%s [%s]\nDy:\t%s [%s]\nX: \t%s [%s]\nY: \t%s [%s]' % \
|
||||
('0.0000', units, '0.0000', units, '0.0000', units, '0.0000', units)
|
||||
|
||||
if self.fcapp.defaults['global_hud'] is True:
|
||||
self.on_toggle_hud(state=True)
|
||||
|
||||
self.shape_collections = []
|
||||
|
||||
self.shape_collection = self.new_shape_collection()
|
||||
self.fcapp.pool_recreated.connect(self.on_pool_recreated)
|
||||
self.text_collection = self.new_text_collection()
|
||||
|
||||
# TODO: Should be setting to show/hide CNC job annotations (global or per object)
|
||||
self.text_collection.enabled = True
|
||||
|
||||
self.c = None
|
||||
@@ -163,6 +182,16 @@ class PlotCanvas(QtCore.QObject, VisPyCanvas):
|
||||
|
||||
self.graph_event_connect('mouse_wheel', self.on_mouse_scroll)
|
||||
|
||||
def on_toggle_hud(self, state):
|
||||
if state:
|
||||
self.hud_enabled = True
|
||||
self.rect_hud.parent = self.view
|
||||
self.text_hud.parent = self.view
|
||||
else:
|
||||
self.hud_enabled = False
|
||||
self.rect_hud.parent = None
|
||||
self.text_hud.parent = None
|
||||
|
||||
def draw_workspace(self, workspace_size):
|
||||
"""
|
||||
Draw a rectangular shape on canvas to specify our valid workspace.
|
||||
|
||||
@@ -29,6 +29,7 @@ mpl_use("Qt5Agg")
|
||||
from matplotlib.figure import Figure
|
||||
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
|
||||
from matplotlib.lines import Line2D
|
||||
from matplotlib.offsetbox import AnchoredText
|
||||
# from matplotlib.widgets import Cursor
|
||||
|
||||
fcTranslate.apply_language('strings')
|
||||
@@ -147,9 +148,13 @@ class PlotCanvasLegacy(QtCore.QObject):
|
||||
if self.app.defaults['global_theme'] == 'white':
|
||||
theme_color = '#FFFFFF'
|
||||
tick_color = '#000000'
|
||||
self.rect_hud_color = '#0000FF10'
|
||||
self.text_hud_color = '#000000'
|
||||
else:
|
||||
theme_color = '#000000'
|
||||
tick_color = '#FFFFFF'
|
||||
self.rect_hud_color = '#0000FF10'
|
||||
self.text_hud_color = '#000000'
|
||||
|
||||
# workspace lines; I didn't use the rectangle because I didn't want to add another VisPy Node,
|
||||
# which might decrease performance
|
||||
@@ -298,11 +303,79 @@ class PlotCanvasLegacy(QtCore.QObject):
|
||||
# signal if there is a doubleclick
|
||||
self.is_dblclk = False
|
||||
|
||||
self.hud_enabled = False
|
||||
self.text_hud = self.Thud(plotcanvas=self)
|
||||
|
||||
# bbox_props = dict(boxstyle="round,pad=0.3", fc="blue", ec="b", lw=0)
|
||||
# self.text_hud = self.figure.text(0, 0, "Direction", ha="left", va="center", rotation=0,
|
||||
# size=15,
|
||||
# bbox=bbox_props)
|
||||
|
||||
# draw a rectangle made out of 4 lines on the canvas to serve as a hint for the work area
|
||||
# all CNC have a limited workspace
|
||||
if self.app.defaults['global_workspace'] is True:
|
||||
self.draw_workspace(workspace_size=self.app.defaults["global_workspaceT"])
|
||||
|
||||
if self.app.defaults['global_hud'] is True:
|
||||
self.on_toggle_hud(state=True)
|
||||
|
||||
def on_toggle_hud(self, state):
|
||||
if state:
|
||||
self.hud_enabled = True
|
||||
self.text_hud.add_artist()
|
||||
else:
|
||||
self.hud_enabled = False
|
||||
self.text_hud.remove_artist()
|
||||
self.canvas.draw()
|
||||
|
||||
class Thud(QtCore.QObject):
|
||||
text_changed = QtCore.pyqtSignal(str)
|
||||
|
||||
def __init__(self, plotcanvas):
|
||||
super().__init__()
|
||||
|
||||
self.p = plotcanvas
|
||||
units = self.p.app.defaults['units']
|
||||
self._text = 'Dx: %s [%s]\nDy: %s [%s]\nX: %s [%s]\nY: %s [%s]' % \
|
||||
('0.0000', units, '0.0000', units, '0.0000', units, '0.0000', units)
|
||||
|
||||
self.hud_holder = AnchoredText(self._text,
|
||||
prop=dict(size=20), frameon=True,
|
||||
loc='upper left',
|
||||
)
|
||||
self.hud_holder.patch.set_boxstyle("round,pad=0.,rounding_size=0.2")
|
||||
|
||||
self.hud_holder.patch.set_facecolor('blue')
|
||||
self.hud_holder.patch.set_alpha(0.3)
|
||||
self.hud_holder.patch.set_edgecolor((0, 0, 0, 0))
|
||||
|
||||
self.text_changed.connect(self.on_text_changed)
|
||||
|
||||
@property
|
||||
def text(self):
|
||||
return self._text
|
||||
|
||||
@text.setter
|
||||
def text(self, val):
|
||||
self.text_changed.emit(val)
|
||||
self._text = val
|
||||
|
||||
def on_text_changed(self, txt):
|
||||
try:
|
||||
txt = txt.replace('\t', ' ')
|
||||
self.hud_holder.txt.set_text(txt)
|
||||
self.p.canvas.draw()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def add_artist(self):
|
||||
if self.hud_holder not in self.p.axes.artists:
|
||||
self.p.axes.add_artist(self.hud_holder)
|
||||
|
||||
def remove_artist(self):
|
||||
if self.hud_holder in self.p.axes.artists:
|
||||
self.p.axes.artists.remove(self.hud_holder)
|
||||
|
||||
def draw_workspace(self, workspace_size):
|
||||
"""
|
||||
Draw a rectangular shape on canvas to specify our valid workspace.
|
||||
|
||||
@@ -13,6 +13,7 @@ import numpy as np
|
||||
|
||||
import vispy.scene as scene
|
||||
from vispy.scene.cameras.base_camera import BaseCamera
|
||||
# from vispy.scene.widgets import Widget as VisPyWidget
|
||||
from vispy.color import Color
|
||||
|
||||
import time
|
||||
|
||||
Reference in New Issue
Block a user