QGISのプラグイン作成 LayerTreeViewのサンプル


はじめに

このサンプルは、ツリービューからレイヤを選択してアクティブにした時に、そのことをPythonコンソールに表示します。


使い方

ここからzipファイルをダウンロードしてインストールします。

 

f:id:Chiakikun:20200611220049p:plain

プラグイン実行中に、レイヤウィンドウでレイヤを選択すると...

 

f:id:Chiakikun:20200611220102p:plain

選択されていたレイヤ名と、現在選択されているレイヤ名がPythonコンソールに表示されます。


コード

class LayerTreeViewSample(QgsMapTool):

    def changeLayer(self, layer):

        if (layer == None): # レイヤウィンドウに何も無い状態
            self.currentlayer = None
            self.cleared.emit()
            return

        if self.currentlayer != None:
            print(self.currentlayer.name() + 'が非アクティブになりました。')

        print(layer.name()+'がアクティブになりました。')
        self.currentlayer = layer


    def start(self):
        self.currentlayer = self.iface.layerTreeView().currentLayer()
        self.iface.layerTreeView().currentLayerChanged.connect(self.changeLayer)

~略~

    def finish(self):
        self.iface.layerTreeView().currentLayerChanged.disconnect(self.changeLayer)

~略~

18行目 現在アクティブなレイヤ名を取得しておきます。
11行目 ツリービューのアクティブレイヤが変わったら、アクティブだったレイヤ名を表示して...
13行目 アクティブになったレイヤ名を表示させます。
コード全文


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

QGISのプラグイン作成 一時スクラッチレイヤ作成サンプル


はじめに

このサンプルは、一時スクラッチレイヤを作成し、そのレイヤにラバーバンドでオブジェクトを追加していくプラグインです。


使い方

ここからzipファイルをダウンロードしてインストールします。
インストールできたら、temporarylayer_sample.pyの以下の部分を適当に編集してから、プラグインを再読み込みして実行して下さい。

        # 一時レイヤ作成
        typestr  = 'Polygon?'
        fieldstr = '&field=〇〇:string&field=□□:double&field=××:date'
        crsstr   = '&crs=' + str(QgsProject.instance().crs().authid())
        layername= '一時レイヤ'
~略~
        # ラバーバンドのための設定
        self.objtype     = QgsWkbTypes.PolygonGeometry # QgsWkbTypes.PointGeometry, QgsWkbTypes.LineGeometry, QgsWkbTypes.PolygonGeometry

注 2行目と8行目のオブジェクトタイプは一致するように設定してください。


コード

class TemporaryLayerSample(QgsMapTool):

    def setGeometry(self, geom):
        qf = QgsFields()
        for field in self.tmplayer.fields():
            qf.append(QgsField(str(field.name()), typeName=field.typeName()))
        record = QgsFeature(qf) 
        # 地物をセットする
        record.setGeometry(geom) 
        # 属性をセットする
        record.setAttributes([])
        # 作成したレコードをレイヤに追加
        self.tmplayer.dataProvider().addFeatures([record])
        self.tmplayer.updateExtents()
        self.canvas.refreshAllLayers()


    def start(self):
        # 一時レイヤ作成
        typestr  = 'Polygon?'
        fieldstr = '&field=〇〇:string&field=□□:double&field=××:date'
        crsstr   = '&crs=EPSG:4612'
        layername= '一時レイヤ'
        self.tmplayer = QgsVectorLayer(typestr + crsstr + fieldstr, layername, "memory")
        QgsProject.instance().addMapLayer(self.tmplayer)

        maptool = RubberBandClass(self.iface, self.canvas, self.objtype)
        maptool.getObject.connect(self.setGeometry)
        
~略~

24行目 一時スクラッチレイヤを作成します。
27行目 ラバーバンドでオブジェクトが作成できるようになります。
28行目 一時スクラッチレイヤにオブジェクトを追加するためのメソッドを登録します。
3行目 描画したオブジェクトをレイヤに追加します。
コード全文


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

QGISのプラグイン作成 属性編集ダイアログのサンプル


はじめに

f:id:Chiakikun:20200531141501p:plain

このサンプルは、ベクタレイヤの地物を一つ選択した状態でプラグインを実行すると、上の画像のような属性編集ダイアログが表示されます。


使い方

ここからzipファイルをダウンロードしてインストールします。インストール後、属性編集したい地物を選択して、プラグインを実行してください。


コード

class AttributeEditorSample(QgsMapTool):

    def start(self):
        self.layer = self.iface.activeLayer()

        features = self.layer.selectedFeatures()

~略~

        self.layer.startEditing() # レイヤを編集状態にする

        # 選択しているフューチャーの属性フォーム表示
        self.attdlg = self.iface.getFeatureForm(self.layer, features[0])
        self.attdlg.setMode(QgsAttributeEditorContext.SingleEditMode)
        self.attdlg.finished.connect(self.commitEdit)
        self.attdlg.show()


    def commitEdit(self, result):
        if result == 1:
            self.layer.commitChanges()
        else:
            self.layer.rollBack()
        self.attdlg.finished.disconnect(self.commitEdit)

~略~

10行目 アクティブなレイヤを編集状態にします。
13行目~16行目 編集ダイアログのタイプを設定して表示します。また、編集が完了した時に呼び出すメソッドも登録します。
21行目 編集内容を反映します。
コード全文


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