def __get_bezier_middle_angle(self, bezier: QPainterPath): """ Get the angle in the middle of a bezier curve. """ percent_middle = bezier.percentAtLength( bezier.length() / 2) return -math.radians( bezier.angleAtPercent(percent_middle))
def drawTextAlongCubic(self, lay, painter, filename, msg): fs = lay["defaultFontSize"] font = QFont('Right Chalk', fs) defaultMessage = msg if len(msg) == 0: return c1 = QPointF(lay["x1"], lay["y1"]) c2 = QPointF(lay["x2"], lay["y2"]) c3 = QPointF(lay["x3"], lay["y3"]) c4 = QPointF(lay["x4"], lay["y4"]) path = QPainterPath(c1) path.cubicTo(c2, c3, c4) # painter.drawPath(path) pathLength = path.length() textMetricLength = QFontMetrics(font).width(defaultMessage) fsn = int(fs * pathLength / (textMetricLength) * .95) if fsn > 70: fsn = 70 font = QFont('Right Chalk', fsn) textMetricLength = QFontMetrics(font).width(defaultMessage) messageSpacing = [] defaultMessageM = [] sumMessageSpacing = 0.0 for i in range(len(defaultMessage)): messageSpacing.append(QFontMetrics(font).width(defaultMessage[i])) sumMessageSpacing += messageSpacing[i] for i in range(len(defaultMessage)): messageSpacing[i] = messageSpacing[i] / sumMessageSpacing steps = 0 painter.setFont(font) for i in range(len(defaultMessage)): steps += messageSpacing[i] / 2 point = QPointF(path.pointAtPercent(steps)) angle = path.angleAtPercent(steps) painter.save() painter.translate(point) painter.rotate(-angle) x = -QFontMetrics(font).width(defaultMessage[i]) / 2 y = -QFontMetrics(font).height() / 2 w = QFontMetrics(font).width(defaultMessage[i]) h = QFontMetrics(font).height() r = QRectF(x, y, w, h) painter.setPen(QPen(Qt.white, 2)) painter.drawText(r, defaultMessage[i]) if i % 2 == 0: painter.setPen(QPen(Qt.red, 2)) else: painter.setPen(QPen(Qt.green, 2)) # painter.drawRect(r) painter.restore() steps += messageSpacing[i] / 2