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)
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