Example #1
0
 def drawSolution(self, func: str, args: Tuple[str], target: str):
     """Draw the solution triangle."""
     params = [args[0], args[-1]]
     params.append(target)
     if func == 'PLLP':
         color = QColor(121, 171, 252)
     else:
         color = QColor(249, 84, 216)
     color.setAlpha(255)
     pen = QPen()
     pen.setColor(color)
     pen.setWidth(self.r)
     self.painter.setPen(pen)
     for n in (0, 1):
         x, y = self.pos[int(params[-1].replace('P', ''))]
         x2, y2 = self.pos[int(params[n].replace('P', ''))]
         self.drawArrow(
             x*self.zoom, y*-self.zoom, x2*self.zoom, y2*-self.zoom
         )
     color.setAlpha(30)
     self.painter.setBrush(QBrush(color))
     qpoints = []
     for name in params:
         x, y = self.pos[int(name.replace('P', ''))]
         qpoints.append(QPointF(x*self.zoom, y*-self.zoom))
     self.painter.drawPolygon(*qpoints)
Example #2
0
    def __drawSolution(self, func: str, args: Tuple[str], target: str,
                       pos: TypeVar('Coords', Tuple[VPoint],
                                    Dict[int, Tuple[float, float]])):
        """Draw the solution triangle."""
        if func == 'PLLP':
            color = QColor(121, 171, 252)
            params = [args[0], args[-1]]
        elif func == 'PLAP':
            color = QColor(249, 84, 216)
            params = [args[0]]
        elif func == 'PLPP':
            color = QColor(94, 255, 185)
            params = [args[0]]
        params.append(target)
        pen = QPen()
        pen.setColor(color)
        pen.setWidth(RADIUS)
        self.painter.setPen(pen)

        def drawArrow(n: int) -> bool:
            """Draw arrow and return True if done."""
            try:
                x, y = pos[int(params[-1].replace('P', ''))]
                x2, y2 = pos[int(params[n].replace('P', ''))]
            except ValueError:
                return False
            else:
                self.__drawArrow(x * self.zoom, y * -self.zoom, x2 * self.zoom,
                                 y2 * -self.zoom)
                return True

        if not drawArrow(0):
            return
        if func == 'PLLP':
            if not drawArrow(1):
                return
        color.setAlpha(30)
        self.painter.setBrush(QBrush(color))
        qpoints = []
        for name in params:
            x, y = pos[int(name.replace('P', ''))]
            qpoints.append(QPointF(x * self.zoom, y * -self.zoom))
        self.painter.drawPolygon(*qpoints)
        self.painter.setBrush(Qt.NoBrush)
Example #3
0
 def __drawSlvsRanges(self):
     """Draw solving range."""
     pen = QPen()
     self.painter.setFont(QFont("Arial", self.fontSize + 5))
     pen.setWidth(5)
     for i, (tag, rect) in enumerate(self.ranges.items()):
         range_color = QColor(colorNum(i + 1))
         range_color.setAlpha(30)
         self.painter.setBrush(range_color)
         range_color.setAlpha(255)
         pen.setColor(range_color)
         self.painter.setPen(pen)
         cx = rect.x() * self.zoom
         cy = rect.y() * -self.zoom
         if rect.width():
             self.painter.drawRect(
                 QRectF(cx, cy,
                        rect.width() * self.zoom,
                        rect.height() * self.zoom))
         else:
             self.painter.drawEllipse(QPointF(cx, cy), 3, 3)
         range_color.setAlpha(255)
         pen.setColor(range_color)
         self.painter.setPen(pen)
         self.painter.drawText(QPointF(cx + 6, cy - 6), tag)
         self.painter.setBrush(Qt.NoBrush)
Example #4
0
 def draw_slvs_ranges(self):
     """Draw solving range."""
     pen = QPen()
     pen.setWidth(5)
     for i, (tag, rect) in enumerate(self.ranges.items()):
         range_color = QColor(color_num(i + 1))
         range_color.setAlpha(30)
         self.painter.setBrush(range_color)
         range_color.setAlpha(255)
         pen.setColor(range_color)
         self.painter.setPen(pen)
         cx = rect.x() * self.zoom
         cy = rect.y() * -self.zoom
         if rect.width():
             self.painter.drawRect(
                 QRectF(QPointF(cx, cy),
                        QSizeF(rect.width(), rect.height()) * self.zoom))
         else:
             self.painter.drawEllipse(QPointF(cx, cy), 3, 3)
         range_color.setAlpha(255)
         pen.setColor(range_color)
         self.painter.setPen(pen)
         self.painter.drawText(QPointF(cx, cy) + QPointF(6, -6), tag)
         self.painter.setBrush(Qt.NoBrush)
Example #5
0
    def paintEvent(self, event):
        """Draw the structure."""
        width = self.width()
        height = self.height()
        if self.pos:
            x_right, x_left, y_top, y_bottom = self.__zoom_to_fit_limit()
            x_diff = x_left - x_right
            y_diff = y_top - y_bottom
            x_diff = x_diff if x_diff else 1
            y_diff = y_diff if y_diff else 1
            if width / x_diff < height / y_diff:
                factor = width / x_diff
            else:
                factor = height / y_diff
            self.zoom = factor * 0.75
            self.ox = width / 2 - (x_left + x_right) / 2 * self.zoom
            self.oy = height / 2 + (y_top + y_bottom) / 2 * self.zoom
        else:
            if width <= height:
                self.zoom = width / PreviewCanvas.view_size
            else:
                self.zoom = height / PreviewCanvas.view_size
            self.ox = width / 2
            self.oy = height / 2

        super(PreviewCanvas, self).paintEvent(event)

        pen = QPen()
        pen.setWidth(self.joint_size)
        self.painter.setPen(pen)
        if self.monochrome:
            color = QColor(Qt.darkGray)
        else:
            color = QColor(226, 219, 190)
        color.setAlpha(150)
        self.painter.setBrush(QBrush(color))

        # Links
        for link in self.G.nodes:
            if link == self.grounded:
                continue
            points = []
            # Points that is belong with the link.
            for num, edge in edges_view(self.G):
                if link in edge:
                    if num in self.same:
                        num = self.same[num]
                    x, y = self.pos[num]
                    points.append((x * self.zoom, y * -self.zoom))
            # Customize points.
            for name, link_ in self.cus.items():
                if link == link_:
                    x, y = self.pos[name]
                    points.append((x * self.zoom, y * -self.zoom))
            self.painter.drawPolygon(*convex_hull(points, as_qpoint=True))

        # Nodes
        for node, (x, y) in self.pos.items():
            if node in self.same:
                continue
            x *= self.zoom
            y *= -self.zoom
            if self.monochrome:
                color = Qt.black
            elif node in self.driver:
                color = color_qt('Red')
            elif node in self.target:
                color = color_qt('Orange')
            elif self.get_status(node):
                color = color_qt('Green')
            else:
                color = color_qt('Blue')
            pen.setColor(color)
            self.painter.setPen(pen)
            self.painter.setBrush(QBrush(color))
            self.painter.drawEllipse(QPointF(x, y), self.joint_size,
                                     self.joint_size)
            pen.setColor(Qt.black)
            self.painter.setPen(pen)

        # Text of node.
        pen.setColor(Qt.black)
        self.painter.setPen(pen)
        for node, (x, y) in self.pos.items():
            if node in self.same:
                continue
            x *= self.zoom
            x += 2 * self.joint_size
            y *= -self.zoom
            y -= 2 * self.joint_size
            self.painter.drawText(QPointF(x, y), f'P{node}')

        self.painter.end()
Example #6
0
def to_graph(
    g: Graph,
    width: int,
    engine: Union[str, Pos],
    node_mode: bool,
    show_label: bool,
    monochrome: bool,
    *,
    except_node: Optional[int] = None
) -> QIcon:
    """Draw a generalized chain graph."""
    pos: Pos = engine_picker(g, engine, node_mode)
    if not pos:
        pixmap = QPixmap(width, width)
        pixmap.fill(Qt.transparent)
        return QIcon(pixmap)

    width_bound = -float('inf')
    for x, y in pos.values():
        if abs(x) > width_bound:
            width_bound = x
        if abs(y) > width_bound:
            width_bound = y
    width_bound *= 2.5
    image = QImage(
        QSize(int(width_bound), int(width_bound)),
        QImage.Format_ARGB32_Premultiplied
    )
    image.fill(Qt.transparent)
    painter = QPainter(image)
    painter.translate(image.width() / 2, image.height() / 2)
    pen = QPen()
    r = int(width_bound / 50)
    pen.setWidth(r)
    painter.setPen(pen)
    _font.setPixelSize(r * 6)
    painter.setFont(_font)

    # Draw edges.
    if node_mode:
        for l1, l2 in g.edges:
            if except_node in {l1, l2}:
                pen.setColor(Qt.gray)
            else:
                pen.setColor(Qt.black)
            painter.setPen(pen)

            painter.drawLine(
                QPointF(pos[l1][0], -pos[l1][1]),
                QPointF(pos[l2][0], -pos[l2][1])
            )
    else:
        if monochrome:
            color = QColor(Qt.darkGray)
        else:
            color = QColor(226, 219, 190)
        color.setAlpha(150)
        painter.setBrush(QBrush(color))
        for link in g.nodes:
            if link == except_node:
                pen.setColor(Qt.gray)
            else:
                pen.setColor(Qt.black)
            painter.setPen(pen)

            painter.drawPolygon(*convex_hull([
                (pos[n][0], -pos[n][1])
                for n, edge in edges_view(g) if link in edge
            ], as_qpoint=True))

    # Draw nodes.
    for k, (x, y) in pos.items():
        if node_mode:
            color = color_num(len(list(g.neighbors(k))) - 1)
            if k == except_node:
                color.setAlpha(150)
        else:
            if monochrome:
                color = Qt.black
            elif except_node in dict(edges_view(g))[k]:
                color = color_qt('Green')
            else:
                color = color_qt('Blue')
        pen.setColor(color)
        painter.setPen(pen)
        painter.setBrush(QBrush(color))
        point = QPointF(x, -y)
        painter.drawEllipse(point, r, r)
        if show_label:
            pen.setColor(Qt.darkMagenta)
            painter.setPen(pen)
            painter.drawText(point, str(k))
    painter.end()
    return QIcon(QPixmap.fromImage(image).scaledToWidth(width))