# ViewTool - Инструмент окна карты или отчета

class axipy.ViewTool

  Инструмент работы с окном карты или отчета.

  Классовые методы:

  `reset`() | Переключает текущий инструмент на инструмент по умолчанию.

  Свойства:

  `cursor` | Устанавливает или возвращает курсор инструмента.
  `is_active` | Возвращает признак активности окна, с которым работает инструмент.
  `view` | Возвращает окно карты или отчета, с которым работает инструмент.

  Атрибуты:

  `ACCEPT` | При возвращении этого атрибута в обработчике событий, событие будет принято обработчиком и не пойдет дальше.
  `IGNORE` | При возвращении этого атрибута в обработчике событий, событие будет проигнорировано обработчиком и пойдет дальше.

  Методы:

  `can_unload`(reason) | Переопределите, чтобы обрабатывать причину выключения инструмента.
  `get_select_rect`(device[, size]) | Возвращает прямоугольник в координатах карты для точки на экране.
  `handleEvent`(event) | Переопределите, чтобы использовать первичный обработчик всех событий инструмента.
  `is_snapped`() | Проверяет, сработала ли привязка к элементам карты или отчета для текущего положения указателя мыши.
  `keyPressEvent`(event) | Переопределите, чтобы обрабатывать событие нажатия клавиши клавиатуры.
  `keyReleaseEvent`(event) | Переопределите, чтобы обрабатывать событие отпускания клавиши клавиатуры.
  `load`() | Переопределите, чтобы задать действия при включении инструмента.
  `mouseDoubleClickEvent`(event) | Переопределите, чтобы обрабатывать событие двойного клика мыши.
  `mouseMoveEvent`(event) | Переопределите, чтобы обрабатывать событие перемещения мыши.
  `mousePressEvent`(event) | Переопределите, чтобы обрабатывать событие нажатия клавиши мыши.
  `mouseReleaseEvent`(event) | Переопределите, чтобы обрабатывать событие отпускания клавиши мыши.
  `on_active_changed`() | Переопределите, чтобы обрабатывать смену активности окна, с которым работает инструмент.
  `paintEvent`(event, painter) | Переопределите, чтобы обрабатывать событие отрисовки.
  `redraw`() | Перерисовывает окно карты.
  `snap`() | Возвращает исправленные координаты, если сработала привязка к элементам в единицах измерения карты или отчета.
  `snap_device`() | Возвращает исправленные координаты, если сработала привязка к элементам в единицах измерения окна карты (виджета).
  `to_device`() | Переводит точки из координат на карте в координаты окна(пиксели).
  `to_scene`() | Переводит точки из координат окна(пикселей) в координаты на карте.
  `unload`() | Переопределите, чтобы задать действия при выключении инструмента.
  `wheelEvent`(event) | Переопределите, чтобы обрабатывать событие колеса мыши.

  Классы:

  `ViewType` | Тип окна просмотра

  ACCEPT: Literal[True]

    При возвращении этого атрибута в обработчике событий, событие будет принято обработчиком и не пойдет дальше.

  IGNORE: Literal[False]

    При возвращении этого атрибута в обработчике событий, событие будет проигнорировано обработчиком и пойдет дальше.

  class ViewType

    Тип окна просмотра

    Атрибуты:

    `MAP_VIEW` | Окно карты
    `REPORT_VIEW` | Окно отчета

  can_unload(reason: DeactivationReason) → bool

    Переопределите, чтобы обрабатывать причину выключения инструмента.

    Параметры:

      reason – причина выключения.

    Результат:

      False, чтобы прервать выключение, иначе True.

  property cursor: QCursor

    Устанавливает или возвращает курсор инструмента.

    Первоначально курсор для инструмента можно установить, переопределив метод `load()`:

        class MyTool(ViewTool):
            def load(self):
                self.cursor = QCursor(Qt.SizeAllCursor)

    Если же требуется устанавливать различные типы курсора в зависимости от статуса нажатия ПКМ, следует переопределить методы `mousePressEvent()` и `mouseReleaseEvent()` и установить нужное значение там:

        class MyTool(ViewTool):
            def mousePressEvent(self, event) -> bool:
                if event.button() == Qt.LeftButton:
                    self.cursor = QCursor(Qt.SizeAllCursor)

  get_select_rect(device: QPoint, size: Optional[int] = None) → Rect

    Возвращает прямоугольник в координатах карты для точки на экране. Удобно для использования при поиске объектов в месте нажатия мыши.

    Параметры:

      - device – Точка в координатах окна.

      - size – Размер квадрата в пикселях. При `None`, берется из настроек Аксиомы (`axipy.CurrentSettings.SensitiveMouse`)

    Результат:

      Прямоугольник в координатах карты.

    Пример:

        device_point = event.pos()
        bbox = self.get_select_rect(device_point, 30)
        features = table.items(bbox=bbox)

  handleEvent(event: QEvent) → bool

    Переопределите, чтобы использовать первичный обработчик всех событий инструмента.

    Если событие не блокируется этим обработчиком, то оно будет передано дальше в соответствующий специализированный обработчик `mousePressEvent()`, `keyReleaseEvent()` и прочие в зависимости от типа.

    Параметры:

      event – Событие.

    Результат:

      `BlockEvent`, чтобы блокировать дальнейшую обработку события.

  property is_active: bool

    Возвращает признак активности окна, с которым работает инструмент.

  is_snapped() → bool

    Проверяет, сработала ли привязка к элементам карты или отчета для текущего положения указателя мыши.

    См.также

    `snap()`, `snap_device()`.

  keyPressEvent(event: QKeyEvent) → bool

    Переопределите, чтобы обрабатывать событие нажатия клавиши клавиатуры.

    Параметры:

      event – Событие нажатия клавиши клавиатуры.

    Результат:

      `PassEvent`, чтобы пропустить событие дальше по цепочке обработчиков. `None` или `BlockEvent`, чтобы блокировать дальнейшую обработку события.

  keyReleaseEvent(event: QKeyEvent) → bool

    Переопределите, чтобы обрабатывать событие отпускания клавиши клавиатуры.

    Параметры:

      event – Событие отпускания клавиши клавиатуры.

    Результат:

      `PassEvent`, чтобы пропустить событие дальше по цепочке обработчиков. `None` или `BlockEvent`, чтобы блокировать дальнейшую обработку события.

  load()

    Переопределите, чтобы задать действия при включении инструмента.

    См.также

    `unload()`.

  mouseDoubleClickEvent(event: QMouseEvent) → bool

    Переопределите, чтобы обрабатывать событие двойного клика мыши.

    Параметры:

      event – Событие двойного клика мыши.

    Результат:

      `PassEvent`, чтобы пропустить событие дальше по цепочке обработчиков. `None` или `BlockEvent`, чтобы блокировать дальнейшую обработку события.

  mouseMoveEvent(event: QMouseEvent) → bool

    Переопределите, чтобы обрабатывать событие перемещения мыши.

    Параметры:

      event – Событие перемещения мыши.

    Результат:

      `PassEvent` или `None`, чтобы пропустить событие дальше по цепочке обработчиков. `BlockEvent`, чтобы блокировать дальнейшую обработку события.

  mousePressEvent(event: QMouseEvent) → bool

    Переопределите, чтобы обрабатывать событие нажатия клавиши мыши.

    Параметры:

      event – Событие нажатия клавиши мыши.

    Результат:

      `PassEvent`, чтобы пропустить событие дальше по цепочке обработчиков. `None` или `BlockEvent`, чтобы блокировать дальнейшую обработку события.

  mouseReleaseEvent(event: QMouseEvent) → bool

    Переопределите, чтобы обрабатывать событие отпускания клавиши мыши.

    Параметры:

      event – Событие отпускания клавиши мыши.

    Результат:

      `PassEvent`, чтобы пропустить событие дальше по цепочке обработчиков. `None` или `BlockEvent`, чтобы блокировать дальнейшую обработку события.

  on_active_changed()

    Переопределите, чтобы обрабатывать смену активности окна, с которым работает инструмент.

    См.также

    `is_active`.

  paintEvent(event: QPaintEvent, painter: QPainter)

    Переопределите, чтобы обрабатывать событие отрисовки.

    Параметры:

      - event – Событие отрисовки.

      - painter – QPainter для рисования поверх виджета

  redraw()

    Перерисовывает окно карты.

    Создает событие `PySide2.QtGui.QPaintEvent` и помещает его в очередь обработки событий. Аналогично `PySide2.QtWidgets.QWidget.update()`.

  static reset()

    Переключает текущий инструмент на инструмент по умолчанию. Инструментом по умолчанию является Выбор. В результате будет вызван `unload()` текущего инструмента. Делает то же самое что `axipy.ActionManager.activate_selection_tool()`.

  snap() → Optional[Pnt]
  snap(default_value: None) → Optional[Pnt]
  snap(default_value: Pnt) → Pnt

    Возвращает исправленные координаты, если сработала привязка к элементам в единицах измерения карты или отчета.

    Параметры:

      default_value – Значение по умолчанию.

    Возвращает значение по умолчанию, если не сработала привязка к элементам карты или отчета.

    Пример:

        point = self.to_scene(event.pos())
        current_point = self.snap(point)

    См.также

    `is_snapped()`, `snap_device()`, `to_scene()`.

  snap_device() → Optional[QPoint]
  snap_device(default_value: None) → Optional[QPoint]
  snap_device(default_value: QPoint) → QPoint

    Возвращает исправленные координаты, если сработала привязка к элементам в единицах измерения окна карты (виджета).

    Параметры:

      default_value – Значение по умолчанию.

    Возвращает значение по умолчанию, если не сработала привязка к элементам карты или отчета.

    Пример:

        device_point = event.pos()
        current_device_point = self.snap_device(device_point)

    См.также

    `is_snapped()`, `snap()`.

  to_device(scene: Pnt) → QPoint
  to_device(scene: Rect) → QRect

    Переводит точки из координат на карте в координаты окна(пиксели).

    Параметры:

      scene – Точки в координатах карты.

    Результат:

      Точки в координатах окна.

  to_scene(device: QPoint) → Pnt
  to_scene(device: QRect) → Rect

    Переводит точки из координат окна(пикселей) в координаты на карте.

    Параметры:

      device – Точки в координатах окна.

    Результат:

      Точки в координатах карты.

  unload()

    Переопределите, чтобы задать действия при выключении инструмента.

    См.также

    `load()`.

  property view: Union[MapView, ReportView]

    Возвращает окно карты или отчета, с которым работает инструмент.

  wheelEvent(event: QWheelEvent) → bool

    Переопределите, чтобы обрабатывать событие колеса мыши.

    Параметры:

      event – Событие колеса мыши.

    Результат:

      `PassEvent`, чтобы пропустить событие дальше по цепочке обработчиков. `None` или `BlockEvent`, чтобы блокировать дальнейшую обработку события.