Pythonプログラミング言語でプラグインを作成することが可能です。C++で書かれた古典的なプラグインと比較して、これらはPython言語の動的な性質により、記述や理解、維持、配布が簡単です。
QGISにPythonプラグインが導入されてから、いくつものプラグインが Plugin Repositories wiki page に登場しています。あなたはそれらのいくつかを見つけることができますし、PyQGISのプログラミングを学ぶためにソースを利用できます。また、開発の努力が重複していないか調べることができます。QGISチームは 公式のpythonプラグインリポジトリ を保持しています。プラグインを作成する準備はできたけれど何をすべきかについてのアイデアがありませんか? Python Plugin Ideas wiki page にはコミュニティからの願いが並べられています!
これらはサンプルプラグインのディレクトリ構造です
PYTHON_PLUGINS_PATH/
MyPlugin/
__init__.py --> *required*
mainPlugin.py --> *required*
metadata.txt --> *required*
resources.qrc --> *likely useful*
resources.py --> *compiled version, likely useful*
form.ui --> *likely useful*
form.py --> *compiled version, likely useful*
ファイルが意味すること:
__init__.py = プラグインの開始点。 classFactory() メソッドを持つ必要があります。その他の初期化コードを持つこともできます。
mainPlugin.py = プラグインの主なワーキングコード。このプラグインの動作に関するすべての情報と主要なコードを含みます。
resources.qrc = Qtデザイナによって作成された.xmlドキュメント。フォームのリソースへの相対パスが含まれています。
resources.py = 上記の.qrcファイルがPythonに変換されたもの。
form.ui = Qtデザイナで作成されたGUI
form.py = 上記のform.uiがPythonに変換されたもの。
metadata.txt = QGIS >= 1.8.0 で必要です。全般情報やバージョン、名前、そしてプラグインのウェブサイトやインフラストラクチャによって使用されるいくつかのメタデータが含まれます。QGIS 2.0 以降では __init__.py からのメタデータは受け付けられず、 metadata.txt が必要です。
ここ では典型的なQGISのPythonプラグインの基本的なファイル(スケルトン)をオンラインで自動的に作成することができます。
また、 Plugin Builder と呼ばれるQGISプラグインがあります。QGISからプラグインテンプレートを作成しますがインターネット接続を必要としません。2.0に互換性のあるソースを生成しますので推奨される選択肢です。
上述のファイル構造の中のそれぞれのファイルに何を追加するべきかについての情報および例を示します。
このファイルはPythonのインポートシステムに必要とされます。QGISにプラグインが読み込まれる時に呼ばれる classFactory() 関数がこのファイルに含まれている必要があります。それは QgisInterface のインスタンスへの参照を受け取って、 mainplugin.py のプラグインクラスのインスタンスを返す必要があります — 私たちの場合はそれは TestPlugin という名前のクラスです(下記参照)。 __init__.py はこんな感じに見えるべきです:
def classFactory(iface):
from mainPlugin import TestPlugin
return TestPlugin(iface)
## any other initialisation needed
これが魔法が起きるところで、魔法はこのように見えます: (例えば mainPlugin.py)
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
# initialize Qt resources from file resources.py
import resources
class TestPlugin:
def __init__(self, iface):
# save reference to the QGIS interface
self.iface = iface
def initGui(self):
# create action that will start plugin configuration
self.action = QAction(QIcon(":/plugins/testplug/icon.png"), "Test plugin", self.iface.mainWindow())
self.action.setObjectName("testAction")
self.action.setWhatsThis("Configuration for test plugin")
self.action.setStatusTip("This is status tip")
QObject.connect(self.action, SIGNAL("triggered()"), self.run)
# add toolbar button and menu item
self.iface.addToolBarIcon(self.action)
self.iface.addPluginToMenu("&Test plugins", self.action)
# connect to signal renderComplete which is emitted when canvas
# rendering is done
QObject.connect(self.iface.mapCanvas(), SIGNAL("renderComplete(QPainter *)"), self.renderTest)
def unload(self):
# remove the plugin menu item and icon
self.iface.removePluginMenu("&Test plugins", self.action)
self.iface.removeToolBarIcon(self.action)
# disconnect form signal of the canvas
QObject.disconnect(self.iface.mapCanvas(), SIGNAL("renderComplete(QPainter *)"), self.renderTest)
def run(self):
# create and show a configuration dialog or something similar
print "TestPlugin: run called!"
def renderTest(self, painter):
# use painter for drawing to map canvas
print "TestPlugin: renderTest called!"
メインのプラグインのソースファイル(例. mainPlugin.py) に含まれる必要があるプラグイン用の関数は:
__init__ –> QGIS のインターフェイスとのアクセスを与えます
initGui() –> プラグインがロードされたときに呼び出されます
unload() –> プラグインがアンロードされたときに呼び出されます
上記の例では addPluginToMenu() が使用されています。これは対応するメニューアクションを メニューに追加します。別のメニューにアクションを追加する他の方法も存在します。それらのメソッドの一覧です:
- addPluginToRasterMenu()
- addPluginToVectorMenu()
- addPluginToDatabaseMenu()
- addPluginToWebMenu()
それらはすべて addPluginToMenu() メソッドと同じ構文です。
プラグインエントリの編成の一貫性を保つために、これらの定義済みのメソッドのいずれかでプラグインメニューを追加することが推奨されます。ただし、次の例に示すようにメニューバーに直接カスタムメニューグループを追加することができます:
def initGui(self):
self.menu = QMenu(self.iface.mainWindow())
self.menu.setObjectName("testMenu")
self.menu.setTitle("MyMenu")
self.action = QAction(QIcon(":/plugins/testplug/icon.png"), "Test plugin", self.iface.mainWindow())
self.action.setObjectName("testAction")
self.action.setWhatsThis("Configuration for test plugin")
self.action.setStatusTip("This is status tip")
QObject.connect(self.action, SIGNAL("triggered()"), self.run)
self.menu.addAction(self.action)
menuBar = self.iface.mainWindow().menuBar()
menuBar.insertMenu(self.iface.firstRightStandardMenu().menuAction(), self.menu)
def unload(self):
self.menu.deleteLater()
カスタマイズを可能にするために QAction と QMenu の``objectName`` をプラグイン固有の名前に設定することを忘れないで下さい。
You can see that in initGui() we’ve used an icon from the resource file
(called resources.qrc in our case)
<RCC>
<qresource prefix="/plugins/testplug" >
<file>icon.png</file>
</qresource>
</RCC>
他のプラグインやQGISのいずれかの部分と衝突しない接頭辞を使用するのが良いです。そうでなければあなたが望んでいないリソースを得るかもしれません。そして、リソースを格納するPythonファイルを生成する必要があります。 pyrcc4 コマンドで行います:
pyrcc4 -o resources.py resources.qrc
ノート
Windows 環境では、 pyrcc4 をコマンドプロンプトまたは Powershell から実行しようとするとたぶん “Windows cannot access the specified device, path, or file [...]” というエラーを受け取るでしょう。簡単な解決法はたぶん OSGeo4W Shell を使うことですが、あなたがもし PATH 環境変数を書き換えたり実行ファイルのパスをはっきりと指定するのが苦でなければ <Your QGIS Install Directory>\bin\pyrcc4.exe で見つける事ができます。
これで以上です... なにも複雑なものはありません :)
すべてうまくいったらプラグインマネージャであなたのプラグインを見つけてロードすることができるはずです。そしてツールバーアイコンや適切なメニューアイテムが選択された時にコンソールにメッセージが表示されるはずです。
本物のプラグインに取り組んでいる時は別の(作業)ディレクトリでプラグインを書いて、UIとリソースファイルを生成してプラグインをQGISにインストールするmakefileを作成するのが賢明です。
プラグインのドキュメントはHTMLヘルプファイルとして記述できます。 qgis.utils モジュールは他のQGISのヘルプと同じ方法でヘルプファイルブラウザを開く showPluginHelp() 関数を提供しています。
showPluginHelp() 関数は呼び出し元のモジュールと同じディレクトリでヘルプファイルを探します。 index-ll_cc.html, index-ll.html, index-en.html, index-en_us.html, index.html の順に探し、はじめに見つけたものを表示します。ここで ll_cc はQGISのロケールです。ドキュメントの複数の翻訳をプラグインに含めることができます。
showPluginHelp() 関数は引数をとることができます。packageName引数はヘルプが表示されるプラグインを識別します。filename引数は検索しているファイル名の”index”を置き換えます。そしてsection引数はブラウザが表示位置を合わせるドキュメント内のHTMLアンカータグの名前です。
いくつかのステップでプラグインの翻訳をするための環境がセットアップでき、あなたのコンピュータの言語設定に依存していたプラグインが他の言語環境でも読むことができるでしょう。
翻訳ファイルを作成及び管理するもっとも簡単な方法は Qt Linguist をインストールすることです。Linux のような環境では次をタイプすることでインストールできます:
sudo apt-get install qt4-dev-tools
プラグインを作成したときにプラグインのメインのディレクトリに i18n フォルダがあるのを見つけることができます。
全ての翻訳ファイルはこのディレクトリにあります。
まず、 `` .pro``ファイルを作成する必要があり、それはQtLinguistによって管理できる*プロジェクト*ファイルです。
この .pro はあなたが翻訳したい全てのファイルとフォームを含めなければいけません。このファイルは翻訳ファイルや変数をセットアップするのに使われます。 pro ファイルの例です:
FORMS = ../ui/*
SOURCES = ../your_plugin.py
TRANSLATIONS = your_plugin_it.ts
今回のケースでは全ての UI は ../ui に配置され、あなたはこれらの全てを翻訳しようとしています。
さらに、 your_plugin.py ファイルは QGIS ツールバーにあるあなたのプラグインの全てのメニューとサブメニューから 呼び出され 、これらも全て翻訳しようとしています。
最後に TRANSLATIONS 変数で翻訳したい言語を特定します。
警告
ts ファイルの名前は your_plugin_ + 言語 + .ts となるように命名するよう気をつけてください、そうでなければ言語の読み込みに失敗するでしょう!2文字の短縮形の言語を使います(it はイタリア語、 de はドイツ語、などなど...)
一度 .pro を作ったら、あなたのプラグインの言語(ごと)の .ts ファイル(たち)を生成する準備ができました。
ターミナルを開いて、 your_plugin/i18n に移動して次のように入力します:
your_plugin_language.ts ファイル(ら)がみつかるはずです。
.ts を Qt Linguist で開いて翻訳を開始します。
あなたのプラグインの翻訳が終わったら (もしいくつかの文字列が終わっていなかったらソースの言語の文字列が使われるでしょう) .qm ファイルを作る必要があります (.ts ファイルをコンパイルしたもので、 QGIS で使われます)。
ターミナルを開いて your_plugin/i18n ディレクトリに cd して、次のように入力します:
これで、 i18n ディレクトリに your_plugin.qm ファイル(たち)が見つかるでしょう。
QGISを開いてあなたのプラグインの翻訳を確認するには、言語を変更して () QGIS を再起動します。
これで的確な言語であなたのプラグインを見ることができます。
警告
プラグインで何かを変更した場合(新しいUIに、新しいメニュー、など。)** `` .ts``と `` .qm``ファイルの両方の**更新バージョンを再度生成する必要がありますので、上記のコマンド再度実行します。