Класс Plugin
Модули рекомендуется писать в объектном стиле. Для этого точка входа
__init__.py
должна содержать класс Plugin
. Тогда ГИС «Аксиома» при загрузке
модуля создаст его экземпляр, а при выгрузке - уничтожит его.
Вспомогательный класс axipy.AxiomaPlugin
и его базовый класс axipy.AxiomaInterface
содержат свойства
и функции, необходимые почти для любого плагина. Например, загрузка/сохранение
настроек settings
,
получение файлов внутри папки с модулем local_file()
,
перевод строк tr()
,
добавление кнопок в интерфейс create_action
и другое.
Пример модуля __init__.py
"""Пример добавления кнопки и подключение действия по нажатию на нее
(показ сообщения). При выгрузке кнопка удаляется из интерфейса.
Также добавим существующую в аксиоме кнопку сдвига карты.
"""
from PySide2.QtWidgets import QMessageBox
from axipy import AxiomaPlugin
class Plugin(AxiomaPlugin):
def load(self):
self.__action = self.create_action('Пример действия',
icon='://icons/share/32px/run.png', on_click=self.show_message)
position = self.get_position('Основные', 'Команды')
position.add(self.__action)
self.__system_action_pan = self.create_system_action('Pan')
position.add(self.__system_action_pan)
def unload(self):
self.__action.remove()
self.__system_action_pan.remove()
def show_message(self):
QMessageBox.information(None, 'Сообщение',
'Пример выполнения действия по нажатию кнопки')
При загрузке Аксиома создаст экземпляр модуля и вызовет метод
load()
.unload()
- вызывается, когда модуль выгружается.
Важно
При наследовании от axipy.AxiomaPlugin
не используйте методы базового класса в конструкторе __init__
.
Помещайте логику инициализации в метод load()
. Это необходимо
для правильной работы базового класса.
Внимание
Не рекомендуется, начиная с версии 3.5.
Инициализация модуля через «внедрение зависимостей» продолжает работать, но не рекомендуется в пользу
наследования (описан выше). При внедрении зависимостей класс Plugin
не наследуется ни от чего,
а в конструктор принимается параметр iface
- экземпляр класса axipy.AxiomaInterface
.
class Plugin:
def __init__(self, iface):
self.__action = iface.menubar.create_button('Пример действия',
icon='://icons/share/32px/run.png', on_click=self.show_message)
...