Source code for plotpy.items.shape.svg

# -*- coding: utf-8 -*-
#
# For licensing and distribution details, please read carefully xgrid/__init__.py

# pylint: disable=invalid-name  # Allows short reference names like x, y, ...

from __future__ import annotations

from qtpy import QtCore as QC
from qtpy import QtGui as QG
from qtpy import QtSvg as QS
from qwt.scale_map import QwtScaleMap
from qwt.symbol import QwtSymbol

from plotpy.items import shape
from plotpy.styles import ShapeParam


[docs] class RectangleSVGShape(shape.RectangleShape): """Rectangle SVG shape Args: x1: X coordinate of the top-left corner y1: Y coordinate of the top-left corner x2: X coordinate of the bottom-right corner y2: Y coordinate of the bottom-right corner svg_data: SVG bytes shapeparam: Shape parameters """ def __init__( self, x1: float = 0.0, y1: float = 0.0, x2: float = 0.0, y2: float = 0.0, svg_data: bytes | None = None, shapeparam: ShapeParam = None, ) -> None: self.svg_data = svg_data shape.RectangleShape.__init__(self, x1, y1, x2, y2, shapeparam)
[docs] def set_data(self, svg_data: bytes) -> None: """Set SVG data""" self.svg_data = svg_data
[docs] def draw( self, painter: QG.QPainter, xMap: QwtScaleMap, yMap: QwtScaleMap, canvasRect: QC.QRectF, ) -> None: """Draw shape (reimplement shape.Shape.draw))""" points = self.transform_points(xMap, yMap) renderer = QS.QSvgRenderer(self.svg_data) renderer.render(painter, points.boundingRect())
[docs] class SquareSVGShape(RectangleSVGShape): """Square SVG shape Args: svg_data: SVG bytes x1: X coordinate of the top-left corner y1: Y coordinate of the top-left corner x2: X coordinate of the bottom-right corner y2: Y coordinate of the bottom-right corner shapeparam: Shape parameters """
[docs] def move_point_to(self, handle: int, pos: tuple[float], ctrl: bool = None): """Reimplement RectangleShape.move_point_to""" nx, ny = pos x1, y1, x2, y2 = self.get_rect() if handle == 0: self.set_rect(nx, y2 - (x2 - nx), x2, y2) elif handle == 1: self.set_rect(x1, y2 - (nx - x1), nx, y2) elif handle == 2: self.set_rect(x1, y1, nx, y1 + (nx - x1)) elif handle == 3: self.set_rect(nx, y1, x2, y1 + (x2 - nx)) elif handle == -1: delta = (nx, ny) - self.points.mean(axis=0) self.points += delta
[docs] class CircleSVGShape(shape.EllipseShape): """Circle SVG shape Args: x1: X coordinate of the top-left corner y1: Y coordinate of the top-left corner x2: X coordinate of the bottom-right corner y2: Y coordinate of the bottom-right corner svg_data: SVG bytes shapeparam: Shape parameters """ def __init__( self, x1: float = 0.0, y1: float = 0.0, x2: float = 0.0, y2: float = 0.0, svg_data: bytes | None = None, shapeparam: ShapeParam = None, ) -> None: self.svg_data = svg_data shape.EllipseShape.__init__(self, x1, y1, x2, y2, shapeparam)
[docs] def set_data(self, svg_data: bytes) -> None: """Set SVG data""" self.svg_data = svg_data
[docs] def draw( self, painter: QG.QPainter, xMap: QwtScaleMap, yMap: QwtScaleMap, canvasRect: QC.QRectF, ) -> None: """Draw shape (reimplement shape.Shape.draw))""" points, line0, line1, rect = self.compute_elements(xMap, yMap) if canvasRect.intersects(rect) and self.svg_data is not None: pen, brush, symbol = self.get_pen_brush(xMap, yMap) painter.setRenderHint(QG.QPainter.Antialiasing) painter.setPen(pen) painter.setBrush(brush) painter.drawLine(line0) painter.drawLine(line1) painter.save() painter.translate(rect.center()) painter.rotate(-line0.angle()) painter.translate(-rect.center()) renderer = QS.QSvgRenderer(self.svg_data) renderer.render(painter, rect) painter.restore() if symbol != QwtSymbol.NoSymbol: for i in range(points.size()): symbol.drawSymbol(painter, points[i].toPoint())