Då skall vi försöka avsluta koden för det plugin som skapats i de tre tidigare inläggen.
Nu blir det mer av samma, men även mycket nytt. Det skulle visa sig att det även blev en hel del problem som måste lösas i denna kod, men det slipper förhoppningsvis du som följer med och kodar själv (peppar peppar).
Det blev som sagt lite huvudbry innan det fungerade som jag ville, och jag har inte riktigt förstått precis allt när det gäller koden, men det fungerar, och det är det viktiga.
För det första behöver QgsMapLayerRegistry importeras tillsammans med QgsMapLayer sedan tidigare.
Den här gången så var det riktigt mycket som strulade, men det berodde framför allt på problem med teckenkodning. Å, ä, ö ville inte fungera samtidigt som text och heltal kunde konverteras, och blandas med utf8… Jag tror att jag hittade en lösning till slut och för detta så behöver ännu ett bibliotek laddas in och läsas om:
Jag börjar också bli rejält ”seg i kolan” efter många timmar framför datorn.
Läs in attribut från valt lager
Vi börjar med att skapa funktionen för att hämta attribut från valt lager. Här fick jag justera lite jämfört med tidigare kod, men det är inget som kommer påverka din tidigare kod, så länge du anger funktionen exakt som min text i bilden nedan.
Ja, och med exakt så menar jag inte mina klippta kommentarer i högerkanten. Det jag tagit bort är vector_layer som argument. Jag fick inte till det på ett bra sätt att skicka med detta, men det löser jag i stället genom att inleda funktionen med att tilldela variabeln vector_layer färdet från combo_layer.
Sedan är det en bortkommenterad rad som jag använt när jag felsökt, så den kan du hoppa över.
Mycket påminner sedan om den förra funktionen. Rensa comboboxen, hämta valt lager som ett objekt baserat på lagernamnet. Skapa en lista med alla attributfält i detta lager. Till skillnad från förra funktionen så lägger jag här till hela listan med värden på en gång.
För att funktionen skall köras så behöver den ”kopplas” till combo_layer. Detta görs med ännu en rad, som jag placerar i run funktionen.
Nu bör koden gå att prova (make deploy) i QGIS.
Som kommentaren i bilden ovan antyder så kan jag nu koppla andra element från dialogen till funktioner på liknande sätt.
Skapa listan
Först och främst, för att hantera teckenkodtabeller så sätter jag standardkodning till UTF-8. Sedan lägger jag till en koppling till combo_attribute som kör funktionen create_text_list() varje gång denna ändras.
Sedan återstår bara funktionen create_text_list().
Lite snabbt så. Valt vektorlager hämtas (igen) och valt attributnamn används för att ta reda på vilket ”index” detta fältet har. Därefter används en smart funktion för att leta reda på alla unika värden i den kolumn som har detta index. Beroende på om checkbox rutan är ikryssad eller ej så skapas olika textsträngar som skall separera de olika värdena. ”\n” är helt enkelt en textkod för ”ny rad”. Vilken sedan används tillsammans med listan med unika värden för att skapa en textvariabel, som sedan skrivs till textfältet i dialogrutan… pust.
Kör MyPlugin
När jag nu kör mitt plugin, så har den redan valt ett lager, men det hjälper inte. Jag måste välja aktivt själv för att koden skall starta, och jag måste välja något annat än vad som är förvalt. Men det går att välja ”tillbaka” sedan om man vill det.
Detta ändrar i attributväljaren, vilket automatiskt kör den koden, men det går att välja ett annat attribut än det första i listan själv i stället.
Nu går det att fixa dessa små egenheter, och det går även att lägga in en funktion som skriver om resultatet när man väljer att kryssa i rutan. Som det är nu så får man välja ett annat attribut och ”välja tillbaka” efter det att man markerat rutan för att resultatet skall komma i en kommaseparerad lista.
Avslutning
Är koden perfekt? Naturligtvis inte. Jag har hållit på länge för att komma i mål med dessa inlägg för att det skall bli ett avslut som är ok, så jag är absolut inte nöjd med allt. Det är dock ett ganska enkelt, men ändå inte för enkelt exempel på vad man kan göra med python och QGIS för att skapa egna plugin.
I morgon så avslutar jag serien den här veckan med att titta på hur man går vidare när man väl är klar med sitt plugin.