Exemple #1
0
 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