コード例 #1
0
    def paint(self, painter, option, widget):

        bm = self.bloqueDatos

        xk = float(bm.width_square / 32.0)

        physical_pos = bm.physical_pos
        dx = physical_pos.x
        dy = physical_pos.y
        ancho = physical_pos.ancho
        alto = physical_pos.alto

        self.rect = QtCore.QRectF(dx, dy, ancho, alto)

        color = QtGui.QColor(bm.color)
        pen = QtGui.QPen()
        pen.setWidth(int(bm.grosor * xk))
        pen.setColor(color)
        pen.setStyle(bm.tipoqt())
        pen.setCapStyle(QtCore.Qt.RoundCap)
        pen.setJoinStyle(QtCore.Qt.RoundJoin)
        painter.setPen(pen)

        pen = QtGui.QPen()
        pen.setColor(QtGui.QColor(bm.color))
        pen.setWidth(int(bm.grosor * xk))
        pen.setStyle(bm.tipoqt())
        painter.setPen(pen)
        if bm.colorinterior >= 0:
            color = QtGui.QColor(bm.colorinterior)
            if bm.colorinterior2 >= 0:
                color2 = QtGui.QColor(bm.colorinterior2)
                gradient = QtWidgets.QLinearGradient(0, 0, bm.physical_pos.ancho, bm.physical_pos.alto)
                gradient.setColorAt(0.0, color)
                gradient.setColorAt(1.0, color2)
                painter.setBrush(QtGui.QBrush(gradient))
            else:
                painter.setBrush(color)

        if bm.redEsquina:
            red = int(bm.redEsquina * xk)
            painter.drawRoundedRect(self.rect, red, red)
        else:
            painter.drawRect(self.rect)
コード例 #2
0
def paintArrow(painter, bf):
    physical_pos = bf.physical_pos
    dx = physical_pos.x
    dy = physical_pos.y
    hx = physical_pos.ancho
    hy = physical_pos.alto

    p_ini = QtCore.QPointF(dx, dy)
    p_fin = QtCore.QPointF(hx, hy)
    linea = QtCore.QLineF(p_ini, p_fin)
    tamLinea = linea.length()
    if linea.isNull():
        return None

    color = QtGui.QColor(bf.color)
    pen = QtGui.QPen()
    pen.setWidth(bf.grosor)
    pen.setColor(color)
    pen.setStyle(bf.tipoqt())
    if bf.redondeos:
        pen.setCapStyle(QtCore.Qt.RoundCap)
        pen.setJoinStyle(QtCore.Qt.RoundJoin)
    painter.setPen(pen)

    xk = bf.width_square / 32.0

    ancho = float(bf.ancho) * xk
    vuelo = float(bf.vuelo) * xk

    altoCab = float(bf.altocabeza) * xk
    if tamLinea * 0.65 < altoCab:
        nv = tamLinea * 0.65
        prc = nv / altoCab
        altoCab = nv
        ancho *= prc
        vuelo *= prc

    xp = 1.0 - float(altoCab) / tamLinea
    pbc = linea.pointAt(xp)  # base de la cabeza

    # Usamos una linea a 90 grados para calcular los puntos del final de la cabeza de arrow
    l90 = linea.normalVector()
    l90.setLength(ancho + vuelo * 2)
    l90.translate(pbc - p_ini)  # la llevamos a la base de la cabeza
    p_ala1 = l90.pointAt(0.5)  # final del ala de un lado
    l90.translate(p_ala1 - l90.p2())  # La colocamos que empiece en ala1
    p_ala2 = l90.p1()  # final del ala de un lado

    xp = 1.0 - float(altoCab - bf.descuelgue) / tamLinea
    p_basecab = linea.pointAt(
        xp
    )  # Punto teniendo en cuenta el angulo en la base de la cabeza, valido para tipo c y p

    # Puntos de la base, se calculan aunque no se dibujen para determinar el poligono de control
    l90 = linea.normalVector()
    l90.setLength(ancho)
    p_base1 = l90.pointAt(0.5)  # final de la base de un lado
    l90.translate(p_base1 - l90.p2())
    p_base2 = l90.p1()  # final de la base de un lado

    lf = QtCore.QLineF(p_ini, p_basecab)
    lf.translate(p_base1 - p_ini)
    p_cab1 = lf.p2()
    lf.translate(p_base2 - p_base1)
    p_cab2 = lf.p2()

    # Poligonos para determinar si se ha pulsado sobre la arrow
    xancho = max(ancho + vuelo * 2.0, 16.0)
    xl90 = linea.normalVector()
    xl90.setLength(xancho)
    xp_base2 = xl90.pointAt(0.5)
    xl90.translate(xp_base2 - xl90.p2())  # La colocamos que empiece en base1
    xp_base1 = xl90.p1()
    xpbb = linea.pointAt(
        0.15)  # Siempre un 15% para cambiar de tama_o por el pie
    xl90.translate(xpbb - p_ini)  # la llevamos a la base de la cabeza
    xp_medio1b = xl90.p1()
    xp_medio2b = xl90.p2()
    xl90.translate(p_ini -
                   xpbb)  # la llevamos a la base para poderla trasladar
    xpbc = linea.pointAt(
        0.85)  # Siempre un 15% para cambiar de tama_o por la cabeza
    xl90.translate(xpbc - p_ini)  # la llevamos a la base de la cabeza
    xp_medio1t = xl90.p1()
    xp_medio2t = xl90.p2()
    xl90.translate(p_fin - xpbc)  # la llevamos al final
    xp_final1 = xl90.p1()
    xp_final2 = xl90.p2()

    poligonoSizeBottom = QtGui.QPolygonF(
        [xp_base1, xp_medio1b, xp_medio2b, xp_base2, xp_base1])
    poligonoMove = QtGui.QPolygonF(
        [xp_medio1b, xp_medio1t, xp_medio2t, xp_medio2b, xp_medio1b])
    poligonoSizeTop = QtGui.QPolygonF(
        [xp_medio1t, xp_final1, xp_final2, xp_medio2t, xp_medio1t])

    forma = bf.forma
    # Abierta, forma normal
    if forma == "a":
        painter.drawLine(linea)

        if altoCab:
            lf = QtCore.QLineF(p_fin, p_ala1)
            painter.drawLine(lf)

            lf = QtCore.QLineF(p_fin, p_ala2)
            painter.drawLine(lf)

    else:
        if bf.colorinterior >= 0:
            color = QtGui.QColor(bf.colorinterior)
            if bf.colorinterior2 >= 0:
                color2 = QtGui.QColor(bf.colorinterior2)
                x, y = p_ini.x(), p_ini.y()
                gradient = QtWidgets.QLinearGradient(x, y, x,
                                                     y - tamLinea - altoCab)
                gradient.setColorAt(0.0, color)
                gradient.setColorAt(1.0, color2)
                painter.setBrush(QtGui.QBrush(gradient))
            else:
                painter.setBrush(color)

        # Cabeza cerrada
        if forma == "c":
            lf = QtCore.QLineF(p_ini, p_basecab)
            painter.drawLine(lf)
            painter.drawPolygon(
                QtGui.QPolygonF([p_fin, p_ala1, p_basecab, p_ala2, p_fin]))

        # Poligonal
        elif forma in "123":

            # tipo 1
            if forma == "1":
                painter.drawPolygon(
                    QtGui.QPolygonF([
                        p_base1, p_cab1, p_ala1, p_fin, p_ala2, p_cab2,
                        p_base2, p_base1
                    ]))
            # tipo 2 base = un punto
            elif forma == "2":
                painter.drawPolygon(
                    QtGui.QPolygonF(
                        [p_ini, p_cab1, p_ala1, p_fin, p_ala2, p_cab2, p_ini]))
            # tipo 3 base cabeza = un punto
            elif forma == "3":
                painter.drawPolygon(
                    QtGui.QPolygonF([
                        p_base1, p_basecab, p_ala1, p_fin, p_ala2, p_basecab,
                        p_base2, p_base1
                    ]))

    return poligonoSizeBottom, poligonoMove, poligonoSizeTop