GUI: camera_image.py added BEAMLINE BUSY message when beamline is in use. ALso change colour of the beam centre mark

This commit is contained in:
2025-09-19 16:12:20 +02:00
parent c5a11f049a
commit f857f8b8b7
+79
View File
@@ -65,6 +65,11 @@ class SampleCameraImageLabel(QGraphicsView):
self.__raster_mgr = raster
self.__state = SampleCameraImageState.IDLE
self.__sam_cam = SampleCameraSettings(exposure=0.1, gain=100.0)
self.__is_daq_busy = False
self.__busy_blink_timer = QTimer()
self.__busy_blink_timer.timeout.connect(self.__toggle_busy_blink)
self.__busy_blink_visible = True
self.__geom = geom
self.__bookmarks: SmargonBookmarkList = SmargonBookmarkList()
@@ -107,11 +112,71 @@ class SampleCameraImageLabel(QGraphicsView):
self.left_click_hold_threshold = 200
self.right_click_hold_threshold = 200
def __toggle_busy_blink(self):
"""Toggle visibility for blinking busy text."""
self.__busy_blink_visible = not self.__busy_blink_visible
self.update()
def __draw_busy_overlay(self, painter: QPainter, rect):
"""Draw 'BEAMLINE BUSY' text overlay when DAQ is in busy state."""
if not self.__is_daq_busy:
return
if not self.__busy_blink_visible:
return
# Save the current painter state
painter.save()
# Set up the text properties
font = painter.font()
font.setPointSize(24)
font.setBold(True)
painter.setFont(font)
# Create a semi-transparent background
painter.setPen(QPen(QColor(255, 255, 255, 200), 2, Qt.PenStyle.SolidLine))
painter.setBrush(QColor(255, 0, 0, 150)) # Semi-transparent red background
text = "BEAMLINE BUSY"
# Calculate text dimensions
font_metrics = painter.fontMetrics()
text_rect = font_metrics.boundingRect(text)
# Position the text in the center of the view
view_rect = self.viewport().rect()
scene_center = self.mapToScene(view_rect.center())
# Create a rectangle for the background
padding = 20
bg_rect = QRect(
int(scene_center.x() - text_rect.width() / 2 - padding),
int(scene_center.y() - text_rect.height() / 2 - padding),
text_rect.width() + 2 * padding,
text_rect.height() + 2 * padding
)
# Draw the background rectangle
painter.drawRoundedRect(bg_rect, 10, 10)
# Draw the text
painter.setPen(QPen(QColor(255, 255, 255), 2, Qt.PenStyle.SolidLine))
text_pos = QPoint(
int(scene_center.x() - text_rect.width() / 2),
int(scene_center.y() + text_rect.height() / 4)
)
painter.drawText(text_pos, text)
# Restore the painter state
painter.restore()
def drawForeground(self, painter, rect):
self.__draw_ml_bounding_box(painter)
self.__draw_beam_center(painter)
self.__raster_mgr.draw_grid(painter, self.__raster_alpha)
self.__draw_helical(painter)
self.__draw_busy_overlay(painter, rect)
def resizeEvent(self, event):
super().resizeEvent(event)
@@ -317,11 +382,22 @@ class SampleCameraImageLabel(QGraphicsView):
self.__sam_cam = s.bl.sample_camera
self.__bounding_box = s.box
self.__is_daq_busy = s.busy
if self.__is_daq_busy:
if not self.__busy_blink_timer.isActive():
self.__busy_blink_timer.start(500) # Blink every 500ms
else:
self.__busy_blink_timer.stop()
self.__busy_blink_visible = True
if s.state == BeamlineStateEnum.BeamLocation:
self.__state = SampleCameraImageState.BEAM_MARKING
elif self.__state == SampleCameraImageState.BEAM_MARKING:
self.__state = SampleCameraImageState.IDLE
self.update()
def __left_single_click(self, event):
match self.__state:
case SampleCameraImageState.BEAM_MARKING:
@@ -365,6 +441,9 @@ class SampleCameraImageLabel(QGraphicsView):
if self.__state == SampleCameraImageState.BEAM_MARKING:
painter.setPen(QPen(QColor(102, 51, 153), 3, Qt.PenStyle.SolidLine))
elif self.__is_daq_busy is True:
# Use red color to indicate busy state
painter.setPen(QPen(QColor(255, 0, 0), 3, Qt.PenStyle.SolidLine))
else:
painter.setPen(QPen(QColor(245, 121, 0), 3, Qt.PenStyle.SolidLine))