# MapView - Окно просмотра карты

class axipy.MapView

  Базовые классы: `DrawableView`

  Окно просмотра карты. Используется для проведения различных манипуляций с картой. Для создания экземпляра необходимо использовать `axipy.ViewManager.create_mapview()` через экземпляр view_manager (пример см. ниже).

  Примечание

  При создании „MapView“ посредством `axipy.ViewManager.create_mapview()` производится клонирование экземпляра карты `axipy.Map` и для последующей работы при доступе к данному объекту необходимо использовать свойство `map`.

  Свойство `device_rect` определяет размер самого окна карты, а свойство `scene_rect` - прямоугольную область, которая умещается в этом окне в СК карты.

  Преобразование между этими двумя прямоугольниками производится с помощью матриц трансформации `scene_to_device_transform` и `device_to_scene_transform`.

  К параметрам самой карты можно получить доступ через свойство `map`. Единицы измерения координат (`unit`) также берутся из наиболее подходящей СК, но при желании они могут быть изменены. К примеру, вместо метров могут быть установлены километры.

  Рассмотрим пример создания карты с последующим помещением ее в окно ее просмотра. Далее, попробуем преобразовать объект типа полигон из координат окна экрана в координаты СК слоя посредством `axipy.Geometry.affine_transform()`.

      # Откроем таблицу, создадим на ее базе слой и добавим в карту
      >>> import axipy
      >>> table_world = axipy.provider_manager.openfile('world.tab')
      >>> world = Layer.create(table_world)
      >>> map_ = Map([world])
      # Для полученной карты создадим окно просмотра
      >>> mapview = axipy.view_manager.create_mapview(map_)
      # Выведем полученные параметры отображения
      >>> print('Прямоугольник экрана:', mapview.device_rect)
      Прямоугольник экрана: (0.0 0.0) (300.0 200.0)
      >>> print('Прямоугольник карты:', mapview.scene_rect)
      Прямоугольник карты: (-16194966.287183324 -8621185.324024437) (16789976.633236416 8326222.646170927)
      # Установим ширину карты и ее центр
      >>> mapview.center = (1000000, 1000000)
      >>> mapview.set_zoom(10e6)

      # Создадим геометрический объект полигон в координатах экрана и преобразуем его в СК карты
      >>> poly_device = axipy.Polygon([(100,100), (100,150), (150, 150), (150,100)])
      # Используя матрицу трансформации, преобразуем его в координаты карты.
      >>> poly_scene = poly_device.affine_transform(mapview.device_to_scene_transform)
      # Для контроля выведем полученный полигон в виде WKT
      >>> print('WKT:', poly_scene.to_wkt())
      WKT: POLYGON ((-5199985.31371008 -147481.338926755, -5199985.31371008 -4384333.3314756, 297505.173026545 -4384333.3314756, 297505.173026545 -147481.338926755, -5199985.31371008 -147481.338926755))

  Свойства:

  `calc_mode` | Устанавливает или возвращает режим расчета для карты.
  `can_redo` | Возможен ли откат на один шаг вперед.
  `can_undo` | Возможен ли откат на один шаг назад.
  `center` | Центр окна карты.
  `clip` | Геометрия обрезки карты.
  `coordsystem` | Система координат карты.
  `coordsystem_visual` | Система координат карты с учетом поправки цены градуса по широте.
  `device_rect` | Видимая область в координатах окна (пиксели).
  `device_to_scene_transform` | Объект трансформации из координат окна в координаты карты.
  `editable_layer` | Редактируемый слой на карте.
  `is_modified` | Есть ли изменения в окне.
  `map` | Объект карты.
  `position` | Размер и положение окна.
  `scale` | Масштаб карты.
  `scene_rect` | Видимая область в координатах карты (в единицах измерения СК).
  `scene_to_device_transform` | Объект трансформации из координат карты в координаты окна.
  `selected_layer` | Выделенный слой на карте.
  `show_type` | Возвращает тип состояния окна.
  `snap_mode` | Включает режим привязки координат при редактировании геометрии в окне карты или отчета.
  `title` | Заголовок окна просмотра.
  `unit` | Единицы измерения координат карты.
  `widget` | Виджет, соответствующий содержимому окна.

  Методы:

  `close`() | Закрывает окно.
  `offset`(dx, dy) | Производит сдвиг окна карты или отчета.
  `redo`() | Производит откат на один шаг вперед.
  `reset_parent`(parent) | Сбрасывает окно контейнера для карты или таблицы просмотра, если он существует и закрывает его.
  `scale_with_center`(scale, center) | Установка нового центра с заданным масштабированием.
  `set_zoom`(zoom[, unit]) | Задание ширины окна карты.
  `set_zoom_and_center`(zoom, center[, unit]) | Задает новый центр и ширину окна карты.
  `show`([type]) | Показывает окно в соответствие с приведенным типом.
  `show_all`() | Полностью показывает все слои карты.
  `show_selection`() | Перемещает карту к группе выделенных объектов, максимально увеличивая масштаб, но так, чтобы все объекты попадали.
  `undo`() | Производит откат на один шаг назад.
  `zoom`([unit]) | Ширина окна карты.

  Сигналы:

  `coordsystem_changed` | Сигнал о том, что система координат изменилась.
  `editable_layer_changed` | Сигнал о том, что редактируемый слой сменился.
  `mouse_moved` | Сигнал при смещении курсора мыши.
  `scene_changed` | Сигнал об изменении контента окна.

  Специальные методы:

  `__eq__`(other) | Оператор равенства (==).
  `__repr__`() | Официальное строковое представление объекта при вызове `repr()`.
  `__str__`() | Неформальное строковое представление объекта при вызове `str` или `print()`.

  __eq__(other: object) → bool

    Оператор равенства (==).

  __repr__() → str

    Официальное строковое представление объекта при вызове `repr()`.

  __str__() → str

    Неформальное строковое представление объекта при вызове `str` или `print()`.

  property calc_mode: CalcMode

    Устанавливает или возвращает режим расчета для карты.

    Пример установки для активной карты:

        if isinstance(view_manager.active, MapView):
            view_manager.active.calc_mode = CalcMode.ELLIPSOID

  property can_redo: bool

    Возможен ли откат на один шаг вперед.

  property can_undo: bool

    Возможен ли откат на один шаг назад.

  property center: Pnt

    Центр окна карты.

  property clip: ClipGeometry

    Геометрия обрезки карты. Устанавливается геометрия, в рамках которой будет отрисована карта. За пределами отрисовка производиться не будет. Обрабатываются только площадные объекты. Так-же допустимо устанавливать коллекции.

    Пример установки обрезки по заданной геометрии:

        rectangle = axipy.Rectangle(axipy.Rect(-50, -50, 50, 50))
        axipy.view_manager.active.clip.geometry = rectangle

    Если установить None, то режим сбрасывается:

        axipy.view_manager.active.clip.geometry = None

    Если необходимо сохранить объект, то можно просто отключить режим:

        axipy.view_manager.active.clip.status = False

  close()

    Закрывает окно.

    Примечание

    Если при закрытии окна выдается запрос о сохранении данных перед закрытием и необходимо изменить поведение, то это можно сделать через соответствующие типу окна настройки или же через свойство `axipy.CurrentSettings.SilentCloseWidget`

  property coordsystem: CoordSystem

    Система координат карты.

  property coordsystem_changed: Signal

    Сигнал о том, что система координат изменилась.

    Пример::

          >>> import axipy
          >>> layer_world = axipy.Layer.create(table_world)
          >>> map_ = axipy.Map([layer_world])
          >>> mapview = axipy.view_manager.create_mapview(map_)
          >>> mapview.coordsystem_changed.connect(lambda: print('СК была изменена'))
          >>> csLL = axipy.CoordSystem.from_prj("1, 104")
          >>> mapview.coordsystem = csLL
          СК была изменена

  property coordsystem_visual: CoordSystem

    Система координат карты с учетом поправки цены градуса по широте.

    Отличается от `coordsystem` только лишь в случае, когда основная система координат - это широта/долгота и широта имеет ненулевое значение. При этом в диапазоне широты (-70…70) градусов вводится поправочный коэффициент, растягивающий изображение по широте и равный 1/cos(y).

  property device_rect: Rect

    Видимая область в координатах окна (пиксели).

    Результат:

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

  property device_to_scene_transform: QTransform

    Объект трансформации из координат окна в координаты карты.

    Результат:

      Объект трансформации.

  property editable_layer: Optional[VectorLayer]

    Редактируемый слой на карте.

    Результат:

      Редактируемый слой. Если не определен, возвращает None.

  property editable_layer_changed: Signal

    Сигнал о том, что редактируемый слой сменился.

  property is_modified: bool

    Есть ли изменения в окне.

  property map: Map

    Объект карты.

    Результат:

      Карта.

  property mouse_moved: Signal

    Сигнал при смещении курсора мыши. Возвращает значения в СК карты.

    Тип результата:

      Signal[float, float]

    Пример:

        mapview.mouse_moved.connect(lambda x,y: print('Coords: {} {}'.format(x, y)))

        >> Coords: -5732500.0 958500.0
        >> Coords: -5621900.0 847900.0

  offset(dx: float, dy: float)

    Производит сдвиг окна карты или отчета. Особенностью является то, что при этом сохраняется прежний центр (актуально для карты).

    Параметры:

      - dx – Смещение по горизонтали в координатах экрана (пикселях)

      - dy – Смещение по вертикали в координатах экрана (пикселях)

  property position: QRect

    Размер и положение окна.

  redo()

    Производит откат на один шаг вперед.

    При этом возвращается состояние до последней отмены.

  reset_parent(parent: QWidget)

    Сбрасывает окно контейнера для карты или таблицы просмотра, если он существует и закрывает его. Это требуется когда окно карты или таблица просмотра необходимо встроить в другое окно.

    Параметры:

      parent – Окно - новый родитель

    Пример встраивания окно карты в диалог:

        table = provider_manager.openfile('world.tab')
        layer = Layer.create(table)
        m = Map([layer])
        view = view_manager.create_mapview(m)

        # Диалог, в который будет встраиваться
        class MyDialog(QDialog):

            def __init__(self, parent ):
                super().__init__(parent)
                # Инициализируем менеджер компоновки
                self.layout = QGridLayout()
                self.setLayout(self.layout)

            def set_mapview(self, view):
                # Устанавливаем окно карты как контент данного диалога
                view.reset_parent(self)
                self.layout.addWidget(view.widget)
                view.show()

        dialog = MyDialog(view_manager.global_parent)
        dialog.resize(500,300)
        dialog.set_mapview(view)
        dialog.show()

  property scale: float

    Масштаб карты.

  scale_with_center(scale: float, center: Pnt)

    Установка нового центра с заданным масштабированием.

    Параметры:

      - scale – Коэффициент масштабирования по отношению к текущему.

      - center – Устанавливаемый центр.

  property scene_changed: Signal

    Сигнал об изменении контента окна.

    Тип результата:

      Signal[]

  property scene_rect: Rect

    Видимая область в координатах карты (в единицах измерения СК).

    Результат:

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

  property scene_to_device_transform: QTransform

    Объект трансформации из координат карты в координаты окна.

    Результат:

      Объект трансформации.

  property selected_layer: Optional[VectorLayer]

    Выделенный слой на карте.

    Результат:

      Выделенный слой. Если выделение отсутствует, возвращает None.

  set_zoom(zoom: float, unit: Optional[LinearUnit] = None)

    Задание ширины окна карты.

    Параметры:

      - zoom – Значение ширины карты.

      - unit – Единицы измерения. Если не заданы, берутся текущие для карты.

  set_zoom_and_center(zoom: float, center: Pnt, unit: Optional[LinearUnit] = None)

    Задает новый центр и ширину окна карты.

    Параметры:

      - zoom – Значение ширины карты.

      - center – Центр карты.

      - unit – Единицы измерения. Если не заданы, берутся текущие для карты.

  show(type: int = SHOW_NORMAL)

    Показывает окно в соответствие с приведенным типом.

    Допустимые значения:
    Константа | Значение | Описание
    --- | --- | ---
    SHOW_NORMAL | 1 | Обычный показ окна (по умолчанию).
    SHOW_MINIMIZED | 2 | Показ окна в режиме минимизации.
    SHOW_MAXIMIZED | 3 | Показ окна в режиме распахивания.

  show_all()

    Полностью показывает все слои карты.

  show_selection()

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

  property show_type: int

    Возвращает тип состояния окна.

    Подробнее см. `show()`

  property snap_mode: bool

    Включает режим привязки координат при редактировании геометрии в окне карты или отчета.

  property title: str

    Заголовок окна просмотра.

  undo()

    Производит откат на один шаг назад.

  property unit: LinearUnit

    Единицы измерения координат карты.

  property widget: QWidget

    Виджет, соответствующий содержимому окна.

    Результат:

      Qt5 виджет содержимого.

  zoom(unit: Optional[LinearUnit] = None) → float

    Ширина окна карты.

    Параметры:

      unit – Единицы измерения. Если не заданы, берутся текущие для карты.