QGIS plugin med egen kod

I förra inlägget lovade jag en fortsättning på hur man gör sina egna insticksprogram i QGIS, och varför vänta… Här används ett exempel ursprungligen av Anita Graser, men lite modifierat.

Koden kommer att skrivas i Python och jag använder en vanligt texteditor med viss syntaxhjälp, men det går bra att använda exempelvis IDLE eller liknande också. Använder du Windows så kan jag rekommendera Notpad++.

Huvudfilen som skall redigeras är antingen ”MittTestPlugin.py”, som skapades av ”Plugin Builder” tidigare, eller pythonfilen från ett nytt projekt skapat med ”Plugin Builder”. Dessutom så kommer dialogfönstret att anpassas med Qt4 Designer.

Skärmbild från 2014-04-26 23:04:41

Börja i Qt4 Designer och öppna ui-filen som skapats tidigare. I exemplet här så har jag skapat ett nytt plugin som jag kallar RaknaObjekt, eller Räkna Objekt, för det är det tillägget kommer att göra. Det går dock lika bra att använda filerna från förra inlägget.

Lägg till en ”ComboBox” från listan till vänster (dra och släpp) och justera den tillsammans med knappar och fönsterstorlek så att den liknar bilden ovan. Markera även ”ComboBox” och byt ”objectName” till höger till ”lagerCombo”.

Spara dialogen över den gamla (ctrl + s) och kör ”make” kommandot från terminalen, som beskrevs i förra inlägget, för att kompilera dialogrutan.

Det går nu att aktivera tillägget i QGIS och köra det, men det händer nog inte så mycket mer än att dialogrutan visas. Passa förresten också på att installera tillägget ”Plugin Reloader” vilket gör det möjligt att starta om ett tillägg utan att behöva starta om QGIS, vilket är praktiskt när man håller på att utveckla tillägg och skriver mycket kod som skall testas.

Öppna pythonfilen (i mitt fall RaknaObjekt.py) och redigera den.

Filen innehåller en mängd delar för att exempelvis läsa in den nyss skapade dialogen med sina objektnamn. Om du bläddrar i filen så borde du förstå någorlunda vad som händer på olika platser.

Bläddra ner mot slutet där det står ”def run(self):”. Här redigerar du koden så att den ser ut som här nedanför.

 def run(self):
 # show the dialog
 self.dlg.show()

 # Här nedan är den tillförda koden
 self.dlg.lagerCombo.clear()
 layers = QgsMapLayerRegistry.instance().mapLayers().values()
 for layer in layers:
   if layer.type() == QgsMapLayer.VectorLayer:
     self.dlg.lagerCombo.addItem( layer.name(), layer )
 
 # Run the dialog event loop
 result = self.dlg.exec_()
 # See if OK was pressed
 if result == 1:
 
   # Här kommer mer tillförd kod, kommandot "pass" är borttaget.
   index = self.dlg.lagerCombo.currentIndex()
   layer = self.dlg.lagerCombo.itemData(index)
   QMessageBox.information(self.iface.mainWindow(),"Antal Objekt","%s har %d objekt." %(layer.name(),layer.featureCount()))

Det första som läggs till är att rensa comboboxen från tidigare lager och lägga till alla vektorlager som finns i projektet. Detta sker varje gång verktyget startas.

Längre ner så har kommandot ”pass” ersats med ytterligare kod som utför själva beräkningen av antal objekt. Detta sker för valt objekt när knappen ”OK” trycks ned.

Skärmbild från 2014-04-26 23:28:58Bilden är ett montage då dialogrutorna ovan inte visas samtidigt på skärmen.

Nu är det bara att låta den kreativa lusten flöda och skapa dialogrutor och pythonskript så mycket det går. Hjälp och tips när det gäller Python i QGIS kan man hitta på http://www.qgis.org/en/docs/pyqgis_developer_cookbook/.

I nästa inlägg om QGIS så bygger jag ännu ett tillägg, som många av er kanske kan ha glädje av…

Annonser

Taggar:, , ,

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s

%d bloggare gillar detta: