Script Runner
Nazwa: Script Runner
Autor: Gary Sherman
Wersja: 2.0.1
Repozytorium: QGIS Official Repository
Data aktualizacji: 14.03.2017

scriptrunner_iconWtyczka Script Runner umożliwia uruchamianie skryptów napisanych w języku Python bezpośrednio w QGIS. Pozwala to zautomatyzować wykonywane czynności, a przy okazji jest prostsze i szybsze niż tworzenia nowej wtyczki.

Główne okno wtyczki złożony jest z czterech obszarów:

  • górny pasek narzędzi,
  • lista wczytanych skryptów,
  • informacje o wybranym skrypcie,
  • konsola wyjściowa

Przyciski na pasku narzędzi to kolejno:

  • New Script – dodanie nowego skryptu do listy,
  • Add Existing Script – dodawanie istniejącego skryptu do listy,
  • Run Script – uruchomienie skryptu,
  • Script Info – przejście do zakładki Info,
  • Reload Script – przeładowanie skryptu (wymagane jeśli kod został zmodyfikowany w trakcie sesji QGIS),
  • Remove Script – usunięcie skryptu z listy,
  • Clear Console – usuwanie aktualnego wpisu w konsoli,
  • Preferences – zmiana właściwości wtyczki,
  • Help – pomoc dotycząca wtyczki,
  • Close – wyjście z wtyczki.

Aby skrypt mógł zostać wykonany przez Script Runner, w kodzie źródłowym musi być zdefiniowana funkcja run_script:

def run_script(iface):
    pass

Funkcja ta zostanie wywołana w pierwszej kolejności. Zawiera ona jeden parametr – iface. Przekazuje on instancję klasy QgisInterface dla uruchomionego środowiska QGIS – analogicznie jak w konsoli Pythona służy do tego qgis.utils.iface (lub w QGIS master iface). Dzięki tej zmiennej mamy dostęp do takich elementów jak paski narzędzi i menu, możemy wczytywać nowe warstwy i operować na załadowanych danych. Importując klasy qgis.core i qgis.gui można wykorzystać pełny zestaw funkcji i klas API programu QGIS udostępnianych dla Pythona.

Aby uruchomić skrypt należy wybrać go z listy i wcisnąć przycisk Run Script. Po zakończeniu wykonywania skryptu na pasku narzędzi wyświetli się informacja Completed script. Dwukrotne kliknięcie nazwy skryptu spowoduje wyświetlenie w centralnej części okna podstawowych informacji (zakładka Info) oraz kodu źródłowego (zakładka Source). Zakładka Info zawiera informacje odnośnie ścieżki do pliku .py, krótkiej pomocy (jeśli została zdefiniowana na początku modułu), oraz spis funkcji i klas zdefiniowanych w skrypcie. Wtyczka nie posiada możliwości edycji kodu źródłowego, należy to zrobić zewnętrznym edytorem tekstu. Jeśli wprowadzimy zmiany w kodzie skryptu przed ponownym jego uruchomieniem należy wcisnąć przycisk Reload Script w celu przeładowania kodu.

Poniższy przykład sortuje alfabetycznie wczytane do QGIS warstwy i przesuwa je do odpowiednich grup określających ich rodzaj. Na samym dole będą wyświetlane rastry, wyżej poligony, linie i na samej górze warstwy punktowe. Aby algorytm zadziałał należy w oknie legendy zaznaczyć ostatnią warstwę. Jeśli po zakończeniu działania algorytmu kolejność wyświetlanych warstw nie zmieni się należy zaznaczyć opcję Kolejność warstw pod legendą.

</pre>
<pre>"""Sortowanie warstw w QGIS
Piotr Pociask (2013)
"""</pre>
<pre>from qgis.core import QGis, QgsMapLayer, QgsMapLayerRegistry def run_script(iface): """Główna funkcja wywoływana przez Script Runner iface - instancja klasy QgisInterface""" #klasa obsługująca listę warstw (QgsLegendInterface) legend = iface.legendInterface() #spis warstw layermap = QgsMapLayerRegistry.instance().mapLayers() #słowniki do przechowywania warstw różnych typów points = {} lines = {} polygons = {} rasters = {} #iteracja po wczytanych warstwach for name, layer in layermap.iteritems(): #sprawdzenie rodzaju warstwy (czy jest wektorowa)... if layer.type() == QgsMapLayer.VectorLayer: if layer.geometryType() == QGis.Point: points[name] = layer elif layer.geometryType() == QGis.Line: lines[name] = layer else: polygons[name] = layer #... czy rastrowa elif layer.type() == QgsMapLayer.RasterLayer: rasters[name] = layer #dodanie grup do legendy legend.addGroup('Punkty') legend.addGroup('Linie') legend.addGroup('Poligony') legend.addGroup('Rastry') #sortowanie i przesuwanie warstw if rasters: sortLayers(legend, rasters, len(points)+len(lines)+len(polygons)+ len(rasters)+3) if polygons: sortLayers(legend, polygons, len(points)+len(lines)+len(polygons)+2) if lines: sortLayers(legend, lines, len(points)+len(lines)+1) if points: sortLayers(legend, points, len(points)) def sortLayers(legend, layers, index): """Funkcja pomocnicza do sortowania warstw legend - klasa obsługująca listę warstw (QgsLegendInterface) layers - słownik z warstwami index - indeks grupy, do której będą dodawane warstwy """ #sortowanie nazw warstw names = sorted(layers.keys(), reverse=True) for name in names: #przesunięcie warstwy do odpowiedniej grupy legend.moveLayer(layers[name], index) index -= 1
scriptrunner_legend

Lista warstw przed i po uruchomieniu skryptu.