def paintEvent(self, event): painter = QPainter(self) painter.setBrush(QBrush(self.color)) painter.setRenderHint(QPainter.Antialiasing) fontscale = float(self._scale) h = self.props['height'] * fontscale w = self.props['width'] * fontscale posscale = (w - 100) / self.props['posscale'] # Draw name above tube if self.props['name']: painter.setFont(self.font()) painter.drawText(5, 0, w, fontscale * 2.5, Qt.AlignCenter, self.props['name']) yoff = fontscale * 2.5 elif self.props['smalldet']: yoff = 50 else: yoff = 0 # Draw tube painter.setPen(self.color) painter.drawEllipse(5, 5 + yoff, 50, h) painter.drawRect(30, 5 + yoff, w - 50, h) painter.setPen(QColor('black')) painter.drawArc(5, 5 + yoff, 50, h, 1440, 2880) painter.drawLine(30, 5 + yoff, w - 25, 5 + yoff) painter.drawLine(30, 5 + yoff + h, w - 25, 5 + yoff + h) painter.drawEllipse(w - 45, 5 + yoff, 50, h) if self.props['smalldet']: sw = 20 sx = 30 + self.props['smalldet'] * posscale painter.setPen(self.color) painter.drawRect(sx - sw, 2, 2 * sw, yoff + 10) painter.setPen(QColor('black')) painter.drawLine(sx - sw, 5 + yoff, sx - sw, 2) painter.drawLine(sx - sw, 2, sx + sw, 2) painter.drawLine(sx + sw, 2, sx + sw, 5 + yoff) # draw detector pos_val = self._curval[0] if pos_val is not None: pos_status = self._curstatus[0] pos_str = self._curstr[0] x_val = self._curval[1] x_status = self._curstatus[1] x_str = '%.1f x' % x_val y_val = self._curval[2] y_status = self._curstatus[2] y_str = '%.1f y' % y_val stat = max(pos_status, x_status, y_status) painter.setBrush(statusbrush[stat]) painter.setFont(self.valueFont) painter.resetTransform() # Translate to detector position xp = 30 + pos_val * posscale painter.translate(xp + fontscale / 2., 15 + yoff + (h - 20) / 2.) painter.drawRect(-fontscale / 2., -(h - 20) / 2., fontscale, h - 20) painter.resetTransform() # Put X/Y values left or right of detector depending on position if pos_val < 14: xoff = 2 * fontscale else: xoff = -8.5 * fontscale # X translation painter.drawText(xp + xoff, yoff + 2 * fontscale, 7 * fontscale, 2 * fontscale, Qt.AlignRight, x_str) # Y translation painter.drawText(xp + xoff, yoff + 3.5 * fontscale, 7 * fontscale, 2 * fontscale, Qt.AlignRight, y_str) # Z position minx = max(0, xp + 5 - 4 * fontscale) painter.drawText(minx, h + 10 + yoff, 8 * fontscale, 30, Qt.AlignCenter, pos_str) # draw beamstop if self.props['beamstop']: painter.setPen(QPen(_blue.color())) painter.drawRect(xp - 8, yoff + 15 + posscale / 350 * (1100 - y_val), 2, 10) # draw small detector if self.props['smalldet'] and self._curval[4] is not None: x_status = self._curstatus[3] x_str = '%4.1f x' % self._curval[3] y_status = self._curstatus[4] y_val = self._curval[4] y_str = '%4.0f y' % y_val stat = max(x_status, y_status) painter.setBrush(statusbrush[stat]) painter.setPen(QPen(_black.color())) painter.setFont(self.valueFont) sy = 10 + y_val * posscale / 250 painter.drawRect(sx - fontscale / 2., sy, fontscale, 30) painter.drawText(sx - 10.5 * fontscale, sy, 8 * fontscale, 2 * fontscale, Qt.AlignRight, x_str) painter.drawText(sx - 10.5 * fontscale, sy + 1.5 * fontscale, 8 * fontscale, 2 * fontscale, Qt.AlignRight, y_str)
def paintEvent(self, event): painter = QPainter(self) painter.setBrush(QBrush(self.color)) painter.setRenderHint(QPainter.Antialiasing) fontscale = float(self._scale) h = self.props['height'] * fontscale w = self.props['width'] * fontscale posscale = (w - 120) / self.props['posscale'] if self.props['name']: painter.setFont(self.font()) painter.drawText(5, 0, w, fontscale * 2.5, Qt.AlignCenter, self.props['name']) yoff = fontscale * 2.5 else: yoff = 0 painter.setPen(self.color) painter.drawEllipse(5, 5 + yoff, 50, h) painter.drawRect(30, 5 + yoff, w - 50, h) painter.setPen(QColor('black')) painter.drawArc(5, 5 + yoff, 50, h, 1440, 2880) painter.drawLine(30, 5 + yoff, w - 25, 5 + yoff) painter.drawLine(30, 5 + yoff + h, w - 25, 5 + yoff + h) painter.drawEllipse(w - 45, 5 + yoff, 50, h) # draw Detector 1 minx = 0 pos_val = self._curval[0] if pos_val is not None: pos_status = self._curstatus[0] pos_str = self._curstr[0] shift_val = self._curval[1] shift_status = self._curstatus[1] shift_str = self._curstr[1] if shift_val > 0: shift_str += ' ↓' elif shift_val < 0: shift_str += ' ↑' # Not used at the moment, prepared for later use tilt_val = self._curval[2] tilt_status = self._curstatus[2] tilt_str = self._curstr[2] if tilt_str.endswith('deg'): tilt_str = tilt_str[:-3] + '°' stat = max(pos_status, shift_status, tilt_status) painter.setBrush(statusbrush[stat]) # tf = QTransform() # tf.rotate(tilt_val) painter.resetTransform() painter.translate(60 + pos_val * posscale + fontscale / 2., 15 + yoff + shift_val * posscale + (h - 20) / 2.) painter.rotate(-tilt_val) painter.drawRect(-fontscale / 2., -(h - 20) / 2., fontscale, h - 20) # XXX tilt ??? painter.resetTransform() painter.setFont(self.valueFont) painter.drawText( 60 + pos_val * posscale - 10.5 * fontscale, -5 + yoff + h - fontscale, # + (shift_val - 4) * posscale, 9.5 * fontscale, 2 * fontscale, Qt.AlignRight, tilt_str) painter.drawText( 60 + pos_val * posscale - 6.5 * fontscale, yoff + fontscale, # + (shift_val - 4) * posscale, 9.5 * fontscale, 2 * fontscale, Qt.AlignLeft, shift_str) minx = max(minx, 60 + pos_val * posscale + 5 - 4 * fontscale) painter.drawText(minx, h + 10 + yoff, 8 * fontscale, 30, Qt.AlignCenter, pos_str) minx = minx + 8 * fontscale