QGISでプラグインを作成する その6 rubberbandでの図形選択
真似します
また、山手様@月の杜工房にあったので真似させていただきました
QGIS API 要素を選択
ソース一式を貼っておきます
この記事で作成したソース一式です
sweepselect_test.zip
ソース一覧
必要なソースは
__init__.py sweeptest.py resources_rc.py
ですが、sweeptest.pyの部分がイベントを拾うところなので、そこだけ載せます
rubberbandの表示
QgsMapToolクラスを拡張して、rubberbandの表示を行います
rubberbandの表示には、QgsRubberBandクラスが用意されていますので使用します
マウスイベントの開始時、移動時、リリース時の動作を追加します
# -*- coding: utf-8 -*- from PyQt4.QtCore import * from PyQt4.QtGui import * from qgis.core import * from qgis.gui import * import resources_rc class sweepTest: def __init__(self, iface): self.iface = iface def initGui(self): self.action = QAction(QIcon(":icon/qgis-icon.png"), "SweepSelect Test", self.iface.mainWindow()) QObject.connect(self.action, SIGNAL("activated()"), self.run) self.iface.addToolBarIcon(self.action) self.iface.addPluginToMenu("&SeeepSelect Test", self.action) self.toolSweepSelect = QgsMapToolSweepSelect(self.iface.mapCanvas()) def unload(self): self.iface.removePluginMenu("&SweepSelect Test", self.action) self.iface.removeToolBarIcon(self.action) def run(self): canvas = self.iface.mapCanvas() canvas.setMapTool(self.toolSweepSelect) #QgsMapToolクラスを拡張 #canvasPressEventでrubberband開始 #canvasMoveEventでrubberbandの範囲変更 #canvasReleaseEventでrubberband範囲の図形選択 class QgsMapToolSweepSelect(QgsMapTool): def __init__(self, canvas): QgsMapTool.__init__(self, canvas) self.canvas = canvas self.rubberBand = QgsRubberBand(canvas, True) self.pressed = False def canvasPressEvent(self, event): ll = self.toMapCoordinates(QPoint(event.pos().x(), event.pos().y())) self.rubberBand.addPoint(ll, False) self.rubberBand.addPoint(ll, False) self.rubberBand.addPoint(ll, False) self.rubberBand.addPoint(ll, True) self.pressed = True def canvasMoveEvent(self, event): if self.pressed == True: ll = self.rubberBand.getPoint(0) ur = self.toMapCoordinates(QPoint(event.pos().x(), event.pos().y())) self.rubberBand.movePoint(1, QgsPoint(ll.x(), ur.y())) self.rubberBand.movePoint(2, ur) self.rubberBand.movePoint(3, QgsPoint(ur.x(), ll.y())) def canvasReleaseEvent(self, event): layer = self.canvas.currentLayer() if layer == None or layer.type() != QgsMapLayer.VectorLayer: self.rubberBand.reset() self.pressed = False return layer.select(self.rubberBand.asGeometry().boundingBox(), False) self.rubberBand.reset(True) self.pressed = False