この記事は2018年3月くらいに一時公開していたものの再投稿です。
QGISでプラグイン連携をする
QGISのプラグインを作っているとプラグインから他のプラグインを呼び出したくなることがあります。
そんな時はどうすればいいのかを調べました。
(QGIS3.0で作業を行っていますので、それ以前のバージョンではやり方が異なるかもしれません)
プラグインのインスタンス取得
プラグインはインスタンスはqgis.utils.plugins
から取得できます。
ディクショナリ型{プラグイン名:インスタンス}
が返ってきますので読み込まれているプラグイン一覧を取得するには以下のようにします。
qgis.utils.plugins.keys()
pythonコンソールで実行してみると判りますがキーになるプラグイン名はプラグインの管理に出てくる名前ではなく、「プラグインのフォルダ名」で管理されているので注意してください。
(プラグインの管理に出てくる名前はmetadata.txtのnameに指定した値です)
プラグインのインスタンスを取得するには以下のようにすれば良いようです。
plugin = qgis.utils.plugins['プラグイン名']
ではpythonコンソールからテストしてみましょう。
# 標準プラグインのDBマネージャを取得して起動する
plugin = qgis.utils.plugins['db_manager']
plugin.run()
DBマネージャが起動したと思います。
プラグイン間の連携を行う
ここではテストプラグインとしてAAAとBBBを作成して、AAAからBBBのプロパティ変更とメソッド呼び出しを行ってみたいと思います。
ポイントはプラグインからqgis.utils.plugins
にアクセスするためimportを行うことくらいでしょうか。
from qgis.utils import plugins
...
def run(self):
# BBBプラグインのインスタンスを取得
bbb = plugins['BBB']
# プロパティ変更
bbb.msg = 'fromAAA'
# メソッド実行
bbb.otherPluginAction()
受け側は呼び出されるプロパティとメソッドを定義しておきます。
# メッセージ表示用にQMessageBoxを追加
from PyQt5.QtWidgets import QAction, QMessageBox
...
def __init__(self, iface):
# プロパティを定義
self.msg = 'dummy'
...
def otherPluginAction(self):
QMessageBox.information(self.iface.mainWindow(), 'BBB', "%s" % self.msg)
プラグインの管理からAAAとBBBのプラグインを有効にします。
ツールバーからAAAを起動すると、BBBのメッセージボックスにAAAで設定したメッセージが表示されたと思います。
今回はrunアクションで起動しましたが、もちろんemitとslotを使ったイベント駆動も可能です。
いずれにしても操作対象のプラグインがロードされていることが前提になりますので、実行前にプラグインの有無を確認してロードされていなかったら処理を回避したり自分でロードするような処理を入れておくと良いかもしれません。
最後に
意外と簡単にプラグイン間の連携がとれました。
プラグインの動的ロードと組み合わせたら面白いかもしれませんので今度試してみようと思います。
追記:2018/3/27に試してみた記事を書きました。
QGIS プラグインの動的ロードと実行
qgis.utils.pluginsでプラグインにアクセスできるというのが判ったのはplugin_reloaderのソースを読んで当たりを付けて色々触った結果なんですが、この辺りはQGIS APIにも出てこないので調べるのは少し大変です。(出てるならコメントで教えてもらえたら嬉しい)QGIS本体のソースを読むといろいろと見えてくるのですがそれはそれで大変なんですよね。
プラグイン間の連携を使えば自作プラグインに限らずロードされたプラグインのメソッド呼び出しやプロパティの上書きができますので、公開プラグインを使っていて毎回設定が面倒だったり繰り返し処理が必要な場合にも、自作の自動化プラグインを作ってマクロ的に処理を実行させることで作業の効率化もできるのではないでしょうか。
以上です。
本記事のライセンス
この記事は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。