Код, демонстрирующий создание своего инструмента. См. 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()