Создание своего инструмента

Код, демонстрирующий создание своего инструмента. См. ItemViewTool

Полный код инструмента
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
from PyQt5.QtGui import QMouseEvent, QPainter, QPen
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt, QObject
from axioma.app import mainWindow
from axioma.gui import *
from axioma.cs import CoordTransform

class MyRedPointsTool(ItemViewTool):
    """Инструмент, позволяющий указывать точки на карте"""

    def __init__(self, parent=None):
        # инициализация
        super().__init__(parent)
        self.setObjectName("MyRedPointsTool")
        self.setEnabled(True)
        self.__points = []
        print("Tool '%s' is constructed" % self.objectName())
    
    def __del__(self):
        print("Tool '%s' is destroyed" % self.objectName())
    
    def paintEvent(self, event):
        """Собыите рисования"""
        # отрисовать карту
        super(QWidget, self.widget()).event(event)
        if event.isAccepted():
            return
        # нарисовать точки
        painter = QPainter(self.widget())
        painter.setPen(QPen(Qt.red, 5, Qt.SolidLine))
        for point in self.getDevicePoints():
            painter.drawPoint(point)
        event.accept()
    
    def mouseDoubleClickEvent(self, event):
        # очистим список точек на двойной клик
        self.__points.clear()
        self.widget().update()
    
    def mousePressEvent(self, event):
        if event.button() != Qt.LeftButton:
            return
        self.addPoint(event.pos())
        
    def addPoint(self, point):
        # добавить новую точку
        # преобразовать координату точки области рисования в координату на карте
        scene_point = self.widget().viewport().mapToScene(point)
        self.__points.append(scene_point)
        print(scene_point)
        
    def getDevicePoints(self):
        """Получить координаты точек области рисования"""
        return [self.widget().viewport().mapToDevice(point) for point in self.__points]
        
    def coordSysAboutToChange(self, cs):
        """Действия перед сменой проекции"""
        # сконвертируем точки в новую проекцию
        if not len(self.__points):
            return
        transform = CoordTransform(self.coordSystem(), cs)
        self.__points = transform.forward(self.__points)


man = mainWindow.toolManager()
# проверить, существует ли уже инструмент с заданным именем
tool = man.toolByActionName("MyRedPointsTool")
if not tool:
    # если нет - создать его и добавить
    tool = MyRedPointsTool()
    man.addTool(tool)
# активировать
tool.activate()