SnapTool
=================

.. currentmodule:: axioma.gui

.. class:: SnapTool

	Класс инструмента с поддержкой привязки к существующим координатам в окне карты или отчета

	Унаследован от:

	* :class:`ChainTool`
	
	Методы:

		.. py:method:: SnapTool(view)

			Конструктор

			:param view: Окно, с которым будет работать данный инструмент
			:type view: :class:`~axioma.gui.ItemView`

		.. py:method:: scenePoint()

			Возвращает текущие координаты указателя мыши в единицах измерения карты или отчета

			:rtype: :class:`~PyQt5.QtCore.QPointF`
			
		.. py:method:: isSnapped()
		
			Признак того, что для текущего положения указателя мыши сработала привязка к элементам карты или отчета.

			:rtype: :class:`bool`

		.. py:method:: snapPoint()

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

			:rtype: :class:`~PyQt5.QtCore.QPointF`
 

Пример использования в виде расширения:

  .. code-block:: python
  
    ''' Пример инструмента с поддержкой возможности привязки к координатам '''

    class MySnapTool(axioma.gui.SnapTool):
        def __init__(self, view):
            super().__init__(view)

    # Переопределяем нажатие на клавишу мыши
        def mousePressEvent(self, event):
            try:
    # Если нажали левую клавишу мыши
                if (event.button() == Qt.LeftButton):
    # Координаты сцены по нажатию
                    currentPoint = self.scenePoint()
    # Исправленные координаты
                    snapped = self.snapPoint()
                    sourcePointMess = 'Исходная точка {} {}'.format(currentPoint.x(), currentPoint.y())
                    snapPointMess = 'Исправленная точка {} {}'.format(snapped.x(), snapped.y())
                    QMessageBox.information(axioma.app.mainWindow, "Результат", sourcePointMess + '\n' + snapPointMess)
                except Exception as ex:
                    print(ex)
                finally:
                    return super().mousePressEvent(event)

    # Определяем контроллер для создания нашего инструмента
    class MySnapToolController(axioma.gui.extension.DrawingToolController):
        def __init__(self, parent=None):
            super().__init__( parent)

    # Переопределяем метод создания инструмента
        def createTool(self, widget):
            return MySnapTool(widget, self.guiSettingsManager())

    def createMyExtensions():
    # Создаем новую группу в панели карты
        ribbonExt = axioma.gui.extension.RibbonExtension()
        ribbonExt.addGroup("map","SnapGroupId", "Узлы")
        ribbonExt.addAction("MySnapTool", "map", "SnapGroupId")
    # Добавляем определенный ранее контроллер
    toolExt = axioma.gui.extension.ToolControllerExtension(MySnapToolController, "MySnapTool", icon=QIcon.fromTheme("snap_geometries"), text="Пример инструмента со SNAP")
    return [ribbonExt, toolExt]
