Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- """
- /***************************************************************************
- VectorWorker
- A QGIS plugin
- OOLinGIS Lab 1 Var 3
- Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/
- -------------------
- begin : 2019-09-16
- git sha : $Format:%H$
- copyright : (C) 2019 by Niyaz Lutfullin
- email : user@ugatu.su
- ***************************************************************************/
- /***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************/
- """
- from qgis.PyQt.QtCore import QSettings, QTranslator, QCoreApplication, Qt
- from qgis.PyQt.QtGui import QIcon, QTransform
- from qgis.PyQt.QtWidgets import QAction
- # Initialize Qt resources from file resources.py
- from .resources import *
- # Import the code for the DockWidget
- from .vector_worker_dockwidget import VectorWorkerDockWidget
- from qgis.core import QgsProject, QgsGeometry, QgsPointXY, QgsFeature, QgsCoordinateTransform
- import os.path
- import math
- class VectorWorker:
- """QGIS Plugin Implementation."""
- def __init__(self, iface):
- """Constructor.
- :param iface: An interface instance that will be passed to this class
- which provides the hook by which you can manipulate the QGIS
- application at run time.
- :type iface: QgsInterface
- """
- # Save reference to the QGIS interface
- self.iface = iface
- self.selected_feature = None
- self.active_layer = None
- # initialize plugin directory
- self.plugin_dir = os.path.dirname(__file__)
- # initialize locale
- locale = QSettings().value('locale/userLocale')[0:2]
- locale_path = os.path.join(
- self.plugin_dir,
- 'i18n',
- 'VectorWorker_{}.qm'.format(locale))
- if os.path.exists(locale_path):
- self.translator = QTranslator()
- self.translator.load(locale_path)
- QCoreApplication.installTranslator(self.translator)
- # Declare instance attributes
- self.actions = []
- self.menu = self.tr(u'&Vector Worker (Lab 1)')
- # TODO: We are going to let the user set this up in a future iteration
- self.toolbar = self.iface.addToolBar(u'VectorWorker')
- self.toolbar.setObjectName(u'VectorWorker')
- #print "** INITIALIZING VectorWorker"
- self.pluginIsActive = False
- self.dockwidget = None
- # noinspection PyMethodMayBeStatic
- def tr(self, message):
- """Get the translation for a string using Qt translation API.
- We implement this ourselves since we do not inherit QObject.
- :param message: String for translation.
- :type message: str, QString
- :returns: Translated version of message.
- :rtype: QString
- """
- # noinspection PyTypeChecker,PyArgumentList,PyCallByClass
- return QCoreApplication.translate('VectorWorker', message)
- def add_action(
- self,
- icon_path,
- text,
- callback,
- enabled_flag=True,
- add_to_menu=True,
- add_to_toolbar=True,
- status_tip=None,
- whats_this=None,
- parent=None):
- """Add a toolbar icon to the toolbar.
- :param icon_path: Path to the icon for this action. Can be a resource
- path (e.g. ':/plugins/foo/bar.png') or a normal file system path.
- :type icon_path: str
- :param text: Text that should be shown in menu items for this action.
- :type text: str
- :param callback: Function to be called when the action is triggered.
- :type callback: function
- :param enabled_flag: A flag indicating if the action should be enabled
- by default. Defaults to True.
- :type enabled_flag: bool
- :param add_to_menu: Flag indicating whether the action should also
- be added to the menu. Defaults to True.
- :type add_to_menu: bool
- :param add_to_toolbar: Flag indicating whether the action should also
- be added to the toolbar. Defaults to True.
- :type add_to_toolbar: bool
- :param status_tip: Optional text to show in a popup when mouse pointer
- hovers over the action.
- :type status_tip: str
- :param parent: Parent widget for the new action. Defaults None.
- :type parent: QWidget
- :param whats_this: Optional text to show in the status bar when the
- mouse pointer hovers over the action.
- :returns: The action that was created. Note that the action is also
- added to self.actions list.
- :rtype: QAction
- """
- icon = QIcon(icon_path)
- action = QAction(icon, text, parent)
- action.triggered.connect(callback)
- action.setEnabled(enabled_flag)
- if status_tip is not None:
- action.setStatusTip(status_tip)
- if whats_this is not None:
- action.setWhatsThis(whats_this)
- if add_to_toolbar:
- self.toolbar.addAction(action)
- if add_to_menu:
- self.iface.addPluginToMenu(
- self.menu,
- action)
- self.actions.append(action)
- return action
- def initGui(self):
- """Create the menu entries and toolbar icons inside the QGIS GUI."""
- icon_path = ':/plugins/vector_worker/icon.png'
- self.add_action(
- icon_path,
- text=self.tr(u''),
- callback=self.run,
- parent=self.iface.mainWindow())
- @staticmethod
- def load_opened_layers_names():
- opened_layers = QgsProject.instance().mapLayers().values()
- return [layer.name() for layer in opened_layers]
- def change_selected_feature(self):
- vectors = self.active_layer.selectedFeatures()
- if vectors:
- first_vector = vectors[0]
- self.selected_feature = first_vector
- self.dockwidget.startBtn.setEnabled(True)
- self.dockwidget.selectedVector.setText(str(first_vector.id()))
- else:
- self.selected_feature = None
- self.dockwidget.selectedVector.setText('None')
- self.dockwidget.startBtn.setEnabled(False)
- def get_increased_polygon(self):
- selected_polygon = self.selected_feature.geometry()
- increase_param = int(self.dockwidget.increaseByEdit.text())
- polygon = QgsFeature()
- selected_polygon.transform(QTransform().scale(increase_param, increase_param))
- polygon.setGeometry(selected_polygon)
- selected_layer = self.dockwidget.layerSelector.currentText()
- layer = QgsProject.instance().mapLayersByName(selected_layer)[0]
- layer.dataProvider().addFeatures([polygon])
- layer.commitChanges()
- #--------------------------------------------------------------------------
- def onClosePlugin(self):
- """Cleanup necessary items here when plugin dockwidget is closed"""
- print("** CLOSING VectorWorker")
- # disconnects
- self.dockwidget.closingPlugin.disconnect(self.onClosePlugin)
- # remove this statement if dockwidget is to remain
- # for reuse if plugin is reopened
- # Commented next statement since it causes QGIS crashe
- # when closing the docked window:
- # self.dockwidget = None
- self.pluginIsActive = False
- self.dockwidget.layerSelector.clear()
- def unload(self):
- """Removes the plugin menu item and icon from QGIS GUI."""
- print("** UNLOAD VectorWorker")
- for action in self.actions:
- self.iface.removePluginMenu(
- self.tr(u'&Vector Worker (Lab 1)'),
- action)
- self.iface.removeToolBarIcon(action)
- # remove the toolbar
- del self.toolbar
- #--------------------------------------------------------------------------
- def run(self):
- """Run method that loads and starts the plugin"""
- if not self.pluginIsActive:
- self.pluginIsActive = True
- print("** STARTING VectorWorker")
- # dockwidget may not exist if:
- # first run of plugin
- # removed on close (see self.onClosePlugin method)
- if self.dockwidget == None:
- # Create the dockwidget (after translation) and keep reference
- self.dockwidget = VectorWorkerDockWidget()
- # connect to provide cleanup on closing of dockwidget
- self.dockwidget.closingPlugin.connect(self.onClosePlugin)
- self.dockwidget.startBtn.clicked.connect(self.get_increased_polygon)
- # show the dockwidget
- # TODO: fix to allow choice of dock location
- self.iface.addDockWidget(Qt.TopDockWidgetArea, self.dockwidget)
- self.dockwidget.show()
- opened_layers = self.load_opened_layers_names()
- self.active_layer = self.iface.activeLayer()
- self.active_layer.selectionChanged.connect(self.change_selected_feature)
- self.active_layer.setAutoRefreshEnabled(True)
- self.dockwidget.layerSelector.addItems(opened_layers)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement