QGIS 플러그인 동적 로드 및 실행

10682 단어 QGISPython
이 기사는 2018년 3월께 임시로 공개된 내용의 재기고다.

목표


"QGIS 플러그인에서 다른 플러그인을 호출해 보십시오"이라고 적으면 "플러그인의 동적 로드와 조합하면 많은 일을 할 수 있지 않나요?"
신호로 동적 불러오는 플러그인을 연결해서 작동해 보세요.

미리 준비하다


Giithub을 위한 테스트용 가상 플러그인을 준비했습니다.다운로드는 여기.입니다.
QGIS3의 플러그인 폴더에 폴더aaa_plugin, 폴더bbb_plugin를 만들고 다운로드한 원본 파일을 복사합니다.

Python 콘솔에서 동적으로 로드


QGIS의 [플러그인] 메뉴에서 [Python 콘솔]을 시작합니다.
우선 현재 불러오는 플러그인 목록을 확인하십시오.
>>> qgis.utils.plugins.keys()
dict_keys(['pluginbuilder3', 'plugin_reloader', 'db_manager', 'processing'])
aaa_pluginbbb_plugin 모두 읽지 않았습니다.
그럼 제가 탑재aaa_plugin해 볼게요.
>>> plugin_name = 'aaa_plugin'
>>> qgis.utils.loadPlugin(plugin_name)
True
>>> qgis.utils.startPlugin(plugin_name)
True
>>> qgis.utils.plugins.keys()
dict_keys(['pluginbuilder3', 'plugin_reloader', 'db_manager', 'processing', 'aaa_plugin'])
확인됨aaa_plugin 로드됨plugins.
그럼 aaa_plugin 방법을 시험해 봅시다.
>>> plugin = qgis.utils.plugins[plugin_name]
>>> plugin.handle_trigger('dynamic_load')
메시지 대화상자에 매개 변수의 문자열을 표시합니다.
플러그인을 잘 불러온 것 같습니다.

플러그인 내의 동적 불러오기와 신호


이번에는 플러그인(aaa pluggin)에 다른 플러그인(bbb pluggin)을 불러오기 목적지에서 불러오기 신호로 연결하고 불러오기 신호를 받아 목적지에서 메시지를 표시합니다.
언어로 쓰면 불분명하게 백역하기 때문에 먼저 서열도를 붙였다.

동적 로드 플러그인loadAndExec을 추가하고 사용자 정의 신호를 사용하여 신호를 수신emitMessage합니다.
Git에서 소스 파일을 다운로드한 사람은 적절한 의견을 삭제합니다.
맞춤형 신호의 사용 방법은 다음과 같은 보도를 참고하였다.
PyQt5와pythhon3을 통한 GUI 프로그래밍[1]
소스는 이렇게.
aaa.py
import os
from PyQt5.QtCore import QSettings, QTranslator, qVersion, QCoreApplication, pyqtSignal, QObject
from PyQt5.QtGui import QIcon
from qgis.utils import plugins, loadPlugin, startPlugin
from PyQt5.QtWidgets import QAction, QMessageBox

# Initialize Qt resources from file resources.py
from .resources import *

class CustomSignal(QObject):
    mySignal = pyqtSignal(str)

class AAA:
    myObject = CustomSignal()
    """QGIS Plugin Implementation."""
    def __init__(self, iface):
        self.iface = iface
        self.plugin_instance = None

    def initGui(self):
        pass

    def unload(self):
        pass

    def run(self):
        pass

    def loadAndExec(self, plugin_name, function_name, function_param):
        plugin_list = plugins.keys()
        if not plugin_name in plugin_list:
            # ロード実行
            try:
              loadPlugin(plugin_name)
              startPlugin(plugin_name)
              self.plugin_instance = plugins[plugin_name]
              # メソッド実行
              eval("self.plugin_instance." + function_name + "('" + function_param + "')")
            except:
                QMessageBox.critical(self.iface.mainWindow(), 'error', "%s error" % plugin_name)

    def connectTrigger(self, plugin_name):
        self.parent_plugin_instance = plugins[plugin_name]
        self.parent_plugin_instance.myObject.mySignal.connect(self.handle_trigger)

    def handle_trigger(self, message):
        QMessageBox.information(self.iface.mainWindow(), 'info', "%s" % message)

    def emitMessage(self, message):
        self.myObject.mySignal.emit(message)
그러면 플러그인 상태를 재설정하고 QGIS를 다시 시작한 다음 파이썬 컨트롤러를 열고 싶습니다.
마운트connectTrigger는 실례를 얻을 때까지 똑같습니다. 이번 실행aaa_plugin은 마운트loadAndExec와 실행bbb_plugin 방법입니다.
>>> plugin_name = 'aaa_plugin'
>>> qgis.utils.loadPlugin(plugin_name)
True
>>> qgis.utils.startPlugin(plugin_name)
True
>>> plugin = qgis.utils.plugins[plugin_name]
>>> plugin.loadAndExec('bbb_plugin', 'connectTrigger', plugin_name)
이렇게plugen에서aaa까지plugen에 연결할 수 있습니다.
aaa_plugen 신호를 보내보세요.
>>> plugin.emitMessage('test')
메시지 대화상자에 매개 변수의 문자열을 표시합니다.
목적을 달성하다.

최후


좋은 느낌과 작업할 수 있다는 걸 확인했어요.
QGIS를 활용한 중소규모 업무시스템이라면 이 구조를 활용하면 유연하게 설계할 수 있다.
그게 다야.
본 보도의 허가증

이 글은 창의 공통 모델 4.0 국제 허가증 표시의 아래에서 제공한 것이다.

좋은 웹페이지 즐겨찾기