QGIS3 Plugin Builderでプラグイン作成

このページでは、QGISプラグイン「Plugin Builder」についてご紹介していきます。Plugin Builderは、QGISプラグインの雛形を作成してくれる補助ツールです。このプラグインを使えば、QGISプラグイン作成が大分楽になります。


Plugin Builderをインストールする

プラグイン管理のダイアログを表示する

f:id:Chiakikun:20180901143311p:plain

QGISを起動して、メニューの『プラグイン』→『プラグインの管理とインストール』を選択して下さい。

 

Plugin Builderを検索する

f:id:Chiakikun:20180901143419p:plain

Plugin Builderをインストールします。上の赤丸の検索窓で検索すると見つけやすいです。

 

f:id:Chiakikun:20180901143512p:plain

候補に出てきた『Plugin Builder 3』を選択してインストールして下さい。

 

メニューに表示される

f:id:Chiakikun:20180901143601p:plain

Plugin Builderがメニューから選択できるようになりました。


Plugin Builderを使ってみる

必要項目を入力する

f:id:Chiakikun:20180901143949p:plain

Plugin Builderが使えるようになったので、試しにPlugin Builderでプラグインのひな型を作成して実行してみます。メニューの『プラグイン』→『Plugin Builder』を実行し、上の画面のように必要事項を入力してNextボタンを押して下さい。

 

作成するプラグインの説明文を入力する

f:id:Chiakikun:20180901144110p:plain

f:id:Chiakikun:20180901144150p:plain

この辺りは適当に入力して下さい。

 

追加コンポーネントを選択

f:id:Chiakikun:20180901144232p:plain

今回はそのままにしました。本家サイトを確認しましたが、必須ではないようです。

チェックを全部外して実行してみましたが、問題も発生していません。

 

プラグインのレポジトリ等

f:id:Chiakikun:20180901144324p:plain

ここもそのままで、ただ一応お試しプラグインなので、赤丸部分のチェックボックスにチェックを入れておきました。

 

f:id:Chiakikun:20180901144444p:plain

作成するプラグインの保存先を指定します。私は『E:\QGIS Plugin』フォルダを指定しました。赤線部分がこのプラグインの保存先になります。画像では保存先がDドライブになっていますが、気にしないでください。

 

pyrcc5 was not found ?

f:id:Chiakikun:20190922130700p:plain

「The resource compiler pyrcc5 was not found in your path.」と警告ダイアログが表示されるので、PowerShellを起動して次のコードを入力します。

    cd "E:\QGIS Plugin\test_plugin"
    pyrcc5 -o resources.py resources.qrc

1行目で作成中のプラグインの保存先に移動して、2行目でpyrcc5コマンドを実行しています。

pyrcc5コマンドを実行するにはPathを設定しないといけません。こちらで紹介した設定を済ませていればパスは通っています。

環境変数QGIS_PLUGINPATHの設定

QGISが今作成したプラグインを探せるように、環境変数QGIS_PLUGINPATHを設定します。次のコードをPowerShellに張り付けて実行して下さい。

$old = [System.Environment]::GetEnvironmentVariable("QGIS_PLUGINPATH", "User")
$old += ";E:\QGIS Plugin"
[System.Environment]::SetEnvironmentVariable("QGIS_PLUGINPATH", $old, "User")

作成したプラグインを実行してみる

環境変数QGIS_PLUGINPATHの設定に問題無ければ、QGISを起動すれば先ほど作成したプラグインはメニューに表示されるはずですが、もし見当たらない場合は次の方法を試してください。

メニューに表示されていればこちらに進んでください。

プラグインを有効にする

f:id:Chiakikun:20180901145055p:plain

QGISに戻って、メニューの『プラグイン』→『プラグインの管理とインストール』を選択して下さい。

 

f:id:Chiakikun:20180901145401p:plain

f:id:Chiakikun:20180901145527p:plain

検索窓に先ほど作成したプラグインの名前を入力するとプラグインが見つかります。チェックして有効にして下さい。

 

プラグインを実行する

f:id:Chiakikun:20180901145600p:plain

作成したプラグインがメニューに登録されています。実行してみると...

 

f:id:Chiakikun:20180901145648p:plain

ウィンドウが表示されました。


Plugin Builderで作成した雛形に少し手を加える

Designerを実行する

f:id:Chiakikun:20180930154055p:plain

フォームに少し手を加えてみます。「Qt Designer」を起動します。スタートボタンを押して、検索窓に「designer」と入力すると、候補が出てきます。上の赤丸を選択してください。

 

UIファイルを開く

f:id:Chiakikun:20180930154233p:plain

先ほど作成したTest Pluginのフォームを選択します。メニューの「ファイル」→「開く」を選択すると、ファイル選択ダイアログが出るので、「E:\QGIS Plugin\testplugin\test_plugin_dialog_base.ui」を選択すると...

 

f:id:Chiakikun:20180930155003p:plain

Test Pluginのフォームが表示されました。

 

Line Editを貼り付けてみる

f:id:Chiakikun:20180930155429p:plain

Line Editを貼り付けます。貼り付けたらメニューの「ファイル」→「保存」を選択して、Designerを終了します。

 

プラグインに反映されているか確認する

f:id:Chiakikun:20180930162023p:plain

フォームの変更が反映されているか確認してみます。QGISを起動して、Test Pluginボタンをクリックします。Line Editが追加されたフォームが表示されましたでしょうか?

 

ソースコードを編集する

ソースに少し手を加えてみます。test_plugin.pyを編集します。33行目あたりに次のコードを追加します。

import qgis.core

さらに185行目あたりにあるrunメソッドの「if result:」と書かれたコードの下に次のコードを挿入します。lineEditに指定したシェープファイルを読み込むコードです。

            file = self.dlg.lineEdit.text()
            layer = qgis.core.QgsVectorLayer(file, u"サンプルレイヤ", "ogr")
            if layer.isValid():
                qgis.core.QgsProject.instance().addMapLayer(layer)

実行してみる

f:id:Chiakikun:20180930172524p:plain

QGISを起動して、Test Pluginを実行します。そしてLine Editに適当なシェープファイルのフルパスを指定してOKボタンをクリックします。指定したシェープファイルがQGISに読み込まれると思いますが、うまく表示されたでしょうか?

metadata.txtを編集後に「属性情報の読み取りエラー」でプラグインが使えなくなる場合

f:id:Chiakikun:20200211122252p:plain

f:id:Chiakikun:20200211122359p:plain

metadata.txtをメモ帳で編集して保存すると、そのプラグインが使えなくなってしまうことがあります。BOM付きUTF8で保存してしまっていることが原因なので、BOM無しで保存すればプラグインが使えるようになります。

 


2020/05/11追記

よく使う雛形

ダイアログ無し

nodialog_skelton.py

from qgis.PyQt.QtCore import QSettings
from qgis.PyQt.QtCore import QSettings
from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtWidgets import QAction

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

import os.path
import qgis
from qgis.core import *
from qgis.gui  import *


class NodialogSkelton(QgsMapTool):

    def start(self):
        maptool = self # 場合によって書き換えて

        self.canvas.setMapTool(maptool)
        self.canvas.mapToolSet.connect(self.unsetTool) # このサンプル実行中に他のアイコンを押した場合


    def finish(self):
        self.canvas.mapToolSet.disconnect(self.unsetTool)


    def __init__(self, iface):
        self.plugin_name = 'ダイアログ無し雛形' # プラグイン名
        self.menu_pos    = '雛形'               # プラグインの登録場所(このサンプルの場合、メニューの「プラグイン/雛形/ダイアログ無し雛形」)
        self.toolbar     = True                 # Trueならツールバーにアイコンを表示する
        self.checkable   = True                 # Trueならプラグイン実行中はアイコンが凹んだままになる

        self.iface = iface
        self.canvas = self.iface.mapCanvas()

        QgsMapTool.__init__(self, self.canvas)


    # このプラグイン実行中に他のアイコンが押された場合、アイコンを元の状態に戻す
    def unsetTool(self, tool):
        if not isinstance(tool, NodialogSkelton):
            self.finish()
            self.action.setChecked(False)


    def initGui(self):
        icon = QIcon(os.path.dirname(__file__)+'/icon.png')
        self.action = QAction(icon, self.plugin_name, self.iface.mainWindow())
        self.action.triggered.connect(self.execSample) # アイコンを押下した時に実行されるメソッドを登録
        self.action.setCheckable(self.checkable)       # Trueだとアイコンを押下したら次に押下するまで凹んだままになる
        if self.toolbar:
            self.iface.addToolBarIcon(self.action)     # ツールバーにこのツールのアイコンを表示する
        self.iface.addPluginToMenu(self.menu_pos, self.action)
        

    # このプラグインを無効にしたときに呼ばれる
    def unload(self):
        self.iface.removePluginMenu(self.menu_pos, self.action)
        self.iface.removeToolBarIcon(self.action)


    # このツールのアイコンを押下したときに呼ばれる
    def execSample(self):
        if self.checkable:
            if self.action.isChecked(): # 凹状態になった
                self.previousMapTool = self.canvas.mapTool()  # 現在のマップツールを退避
                self.start()
            else:                       # 凸状態になった
                self.finish()
                self.canvas.setMapTool(self.previousMapTool)  # このツール実行前に戻す
        else:
            self.start()

ちょっとしたコードを書くときに使っている雛形です。Plugin Builderが出力するコードを参考にしました。別のページでこの雛形を使ったサンプルを作成しようと思います。インストール用zipはこちらに置いてあります。


最後までご覧頂き、ありがとうございました

QGIS3に付属のPython等を使えるようにするためのパス設定

このページでは、QGISに付属しているPythonやコマンドを使えるようにするための設定方法を紹介しています。コマンドが使えるようになると、ファイル形式の変換(例:shp→mif)や等高線作成等のちょっとした作業をバッチ処理できたり何かと便利なのでおすすめです。このページでは、QGIS3.6を使用しています。


環境変数Pathを設定する

PythonやGDALやOGR等のコマンドを使うために環境変数を設定します。環境変数の設定については、こちらのページがとても参考になりました。

【PowerShell】環境変数を設定する | ほそぼそプログラミング日記

PowerShellを起動する

f:id:Chiakikun:20180901140429p:plain

PowerShellを起動します。検索窓?(下の赤丸部分)に『powershell』と入力すると、いくつか候補が出てくるので上の赤丸部分のPowerShellを選択します。

設定のためのコード

下記のコードをコピーします。

    $oldSystemPath = [System.Environment]::GetEnvironmentVariable("Path", "User")
    $oldSystemPath += ";C:\Program Files\QGIS 3.6\apps\qgis\bin"
    $oldSystemPath += ";C:\Program Files\QGIS 3.6\apps\Python37"
    $oldSystemPath += ";C:\Program Files\QGIS 3.6\apps\Python37\Scripts"
    $oldSystemPath += ";C:\Program Files\QGIS 3.6\apps\Qt5\bin"
    $oldSystemPath += ";C:\Program Files\QGIS 3.6\bin"
    [System.Environment]::SetEnvironmentVariable("Path", $oldSystemPath, "User")
    [System.Environment]::SetEnvironmentVariable("QT_QPA_PLATFORM_PLUGIN_PATH", "C:\Program Files\QGIS 3.6\apps\qt5\plugins", "User")

 

PowerShellにコードを貼り付ける

f:id:Chiakikun:20190428234517p:plain

コピーしたコードを張り付けて、PowerShellを一度閉じて下さい。

 

Windows10の場合

f:id:Chiakikun:20200427013532p:plain

Windows 10の場合、赤丸部分のパスが一番上にあるとPowerShellやコマンドプロンプトでPythonと入力したときに、ストアが立ち上がってしまって実行できないので、一番下に移動しておいてください。

 


Pythonプログラミング

ソースコードを書てみる

ここまでの設定で、Pythonが使えるようになっているはずですので、簡単なプログラムを実行してみます。PowerShellを起動して、次のコマンドを入力してメモ帳を起動してください。

notepad test.py

メモ帳が起動したら、次のコードを張り付けて保存して下さい。

import numpy
x = 10
y = 10
z = 10
w = 1

mat_heikoido = numpy.matrix([[1, 0, 0, 10], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]])
vec = numpy.matrix([[x], [y], [z], [w]])

print(mat_heikoido*vec)

 

プログラムを実行してみる

f:id:Chiakikun:20180901141752p:plain

PowerShellに次のように入力して実行してみてください。上の画像のように出力されましたか?

python test.py

 

PyGTも使ってみる

PyQTのライブラリを使って、ウィンドウを表示できるかも試してみます。次のコマンドを入力してメモ帳を起動してください。

notepad qttest.py

次のコードをコピーして下さい。このコードは

PyQt5とpython3によるGUIプログラミング[1]のページで紹介されていたコードを使用させていただきました。コピーしたらメモ帳に貼り付けて保存して下さい。

import sys
from PyQt5.QtWidgets import *

def main():
app = QApplication(sys.argv)
w = QWidget()
w.resize(250, 150)
w.setWindowTitle('Window01')
w.show()
sys.exit(app.exec_())

if __name__ == '__main__':
main()

 

PyQTを使ったプログラムも実行してみる

f:id:Chiakikun:20180901142452p:plain

PowerShellで次のコマンドを入力して実行すると、ウィンドウが表示されるはずですが、表示されましたか?

python qttest.py

Plugin開発がしたい

QGISをインストールした環境でPythonプログラミングができるようになり、QGISプラグイン開発に手を出したくなる方もいらっしゃるかと思いますが、そのためにはもう少し設定が必要です。下のページではプラグイン開発が容易になるプラグイン「Plugin Builder」の紹介をしています。

chiakikun.hatenadiary.com

 

下のページでは、Visual Studioという開発環境を使って、プラグインデバッグができるようにする方法を紹介していますので、興味がある方はご覧ください。

chiakikun.hatenadiary.com


最後までご覧頂き、ありがとうございました

QGIS3のプラグインをVisualStudioでデバッグするための設定

このページでは、QGISプラグインをVisualStudioを使ってデバッグができるように設定していきます。デバッグに使ったプラグインは「QGIS3 Plugin Builderでプラグイン作成」で作成したものを使用しています。

QGISをインストールした環境でPythonプログラミングするための環境設定が未だ済んでいない場合は「QGIS3 Pythonプログラミングのための設定」のページで紹介している設定を行ってください。


Python開発環境をインストールする

インストーラーを起動する

f:id:Chiakikun:20190429142435p:plain

Visual Studio Installerが起動したら、『Python 開発』を選択します。今回はQGISのインストール時に付属しているPythonを使いたいので、オプションの赤丸部分の選択は全て解除します。解除したら、『変更』ボタンを押下します。

 

ダイアログが出てきたら

f:id:Chiakikun:20180825123315p:plain

途中、上のようなダイアログが出てくる場合があります。この場合、VisualStudioを閉じてから、ダイアログの『続行』ボタンを押下してください。

 

Pythonを選択する

f:id:Chiakikun:20190429142706p:plain

VisualStudioを起動してみて、『言語』→『Python』を選択すると、項目が増えています。これでVisualStudioにPython開発環境がインストールされました。


プラグインをVisualStudioに読み込ませる

プラグインのソリューションファイルを作成する

f:id:Chiakikun:20190429143013p:plain

QGIS3 Plugin Builderでプラグイン作成」で作成したプラグインのソリューションファイルを作成します。VisualStudioを起動して、メニューの『新しいプロジェクトの作成』を選択し、『言語』→『Python』を選択します。表示された項目の中から、『既存のPythonコードから』を選択します。

プラグインを選択する

f:id:Chiakikun:20190429143320p:plain

場所には「QGIS3 Plugin Builderでプラグイン作成」で作成したプラグインの保存先を指定します。
 

 

f:id:Chiakikun:20190429143502p:plain

『完了』ボタンを押下します。


QGISPython環境を取り込む

Python環境を追加する

f:id:Chiakikun:20190429143545p:plain

f:id:Chiakikun:20190429143801p:plain

読み込みに成功すると、ソリューションエクスプローラーにプラグインのファイルが全部表示されます。次にQGISに付属のPython環境をVisualStudioで使うための設定をします。Python環境を右クリックして『環境を追加』を選択します。

 

QGISに付属のPythonのパスを設定する

f:id:Chiakikun:20190429144213p:plain

『既存の環境』を選択します。

 

f:id:Chiakikun:20190429144259p:plain

プレフィックスPython.exeが置かれているパスを指定します。QGIS3.6.1では「C:\Program Files\QGIS 3.6\apps\Python37」に置かれています。プレフィックスの設定に成功すると、他の項目が自動で設定されます。


QGISのモジュール設定

モジュールが見つからない

f:id:Chiakikun:20190429151505p:plain

test_plugin.pyのコードを開くと、qgiscoreライブラリが見つけられていないので、設定します。

 

検索パスを追加

f:id:Chiakikun:20190429155007p:plain

ソリューションエクスプローラーの『検索パス』を右クリックして、『フォルダーを検索パスに追加』を選択します。選択ダイアログが表示されたら、QGIS3.6の場合は「C:\Program Files\QGIS 3.6\apps\qgis\python」を選択します。成功すると、ソースコードqgis.coreの下のニョロニョロが消えます。


デバッグ

プロセスにアタッチ

f:id:Chiakikun:20190429155439p:plain

QGISを起動した状態で、VisualStudioの『デバッグ』→『プロセスにアタッチ』を選択します。

f:id:Chiakikun:20190429155610p:plain

qgis-bin.exeを選択してアタッチボタンを押下します。

 

ブレークポイントを設置する

f:id:Chiakikun:20190429155655p:plain

適当なところにブレークポイントを置きます。

 

ブレークポイントで止めてみる

f:id:Chiakikun:20190429155757p:plain

QGISに戻ってプラグインを実行してみます。すると...

 

f:id:Chiakikun:20190429155840p:plain

ブレークポイントのところで止まりました。


Visual Studio Codeデバッグする場合

Pythonのパス設定

まずはQGISと一緒にインストールされているPython環境変数PATHに追加します。方法はこちらを参考にしてください。

chiakikun.hatenadiary.com

VSCodeプラグインのフォルダを開く

次にデバッグしたいプラグインがインストールされているフォルダを調べて...

 

VSCodeでそのフォルダを開きます。左のウィンドウから拡張子が.pyのファイルを選択すると、Python拡張機能のインストールをお勧めされます。

VSCodePython拡張をインストールする

お勧めされた拡張機能をインストールします。

 

インストール後、PythonVSCodeに認識されていれば、右下にこのように表示がされます。

デバッグを実行する

QGISを起動した状態で、VSCodeでF5キーを押してデバッグしてみます。すると上のようなウィンドウが表示されるので「プロセスIDを使用して接続する」を選択します。

 

QGISのプロセスを選択します。検索窓で「q」と入力すると、QGISが一番上に表示されると思います。

 

こんな感じになっていればOKです。適当な場所にブレークポイントを置いて...

 

QGISに戻ってプラグインを実行します。

 

正常に設定されていれば、このようにブレークポイントプラグインが止まります。

launch.jsonを作成する

左のウィンドウに「launch.jsonファイルを作成します」と表示されているので、クリックすると...

 

デバッグ構成を選択するウィンドウが表示されるので、「プロセスIDを使用して接続する」を選択します。

 

すると上のようなlaunch.jsonが作成されます。


 

お疲れ様でした。