Jag har slitit ett tag med Python för ArcMap 10. Det är ju nämligen så att stödet för VB, som jag använt tidigare, snart bara är ett minne blott i ESRI’s programvara. Därför så gäller det att börja fundera på vilka gamla skript som fortfarande skall användas när bytet till 10 sker.
Man måste även veta om man byter till 10.0 eller 10.1, eftersom det är ganska stor skillnad mellan dessa versioner till fördel för 10.1.
Skripten är vanliga textfiler med filändelsen *.py och går att skriva i vilken textredigerare som helst, men jag föredrar någon form av IDE (utvecklingsprogram) så att man får lite hjälp med syntaxen med mera.
Jag har använt flera olika IDE, men senaste tiden har jag använt Eclipse med PyDev för att skriva Python skript. Det går dock att testa mycket av Pythonskripten direkt i Python konsolen i ArcMap, om man inte vill eller kan använda en IDE.
För att använda ArcGis funktionalitet i sina skript så måste man importera ArcGis Python bibliotek vid namn arcpy.
import arcpy
Sedan går det att göra i stort sett allt som går att göra i ArcMap direkt via skript. Man behöver inte ens ha ArcMap öppet för många uppgifter.
Jag har mest intresserat mig för layoutläget och kör därför skripten via toolboxen inne i ArcMap.
Skapa klasser för dokumentet:
mxd = arcpy.mapping.MapDocument(”Current”) # Skapa klass för det öppna dokumentet
df = arcpy.mapping.ListDataFrames(mxd)[0] # Skapa klass för första dataramen
För att skicka värden till skriptet så används sys biblioteket, så detta måste också importeras:
import sys
Variabler hämtas med kommandot sys.argv[0] där nollan representerar det första argumentet, men det går att ha hur många argument som helst, genom att stega upp siffran.
skala = sys.argv[1] # Hämta första argumentet och spara i variabeln ”skala”
Argumenten skapas i ArcMap genom att man i ArcToolBox importerar skiptet och sätter de ”parametrar” som man vill kunna skicka till skriptet. I mitt fall så skapar jag en parameter kallad ”Skala” som är av typen Double, samt en parameter ”Rubrik” (String) som används senare.
För att sätta den angivna skalan i dataramen så skriver man följande.
df.scale = skala
Jag vill även ändra en rubriktext i layouten. Därför så sätter jag ”Element Name” till tRubrik under textens egenskaper.
Detta namn använder jag sedan för att hitta rätt textelement och ändra texten till värdet i det andra argumentet.
rubrik = sys.argv[2]
elements = arcpy.mapping.ListLayoutElements(mxd, ”TEXT_ELEMENT”) # Skapa lista med alla textelement
for element in elements: # Loopa igenom alla textelement
if element.name == ”tRubrik”: # Om Element Name är ”tRubrik” så…
element.text = rubrik # Byt ut texten till den inmatade.
Sådär. Då har jag ändrat skalan och rubriken till värden som jag matat in i ett formulär när jag kör skriptet i toolboxen. Det sista att tänka på i skriptet är att uppdatera layouten, så att man säkerställer att gjorda ändringar blir synliga.
arcpy.RefreshActiveView()
Nu har du vad du behöver för att starta med din egen layout. Det går enkelt att modifiera skriptet så att en massa texter i layouten ändras via formulär. Det går med lite mera arbete att skapa texter med dagens datum med flera bearbetade variabler, och med ytterligare arbete så är det inte så svårt att hantera panoreringar och zoom genom att mata in koordinater i formuläret, eller zooma till en utvald shapefil.
Vill du köra skriptet utan att ha ArcMap igång?
Byt ut ”Current” mot den kompletta sökvägen till mxd-projektet och lägg till mxd.save() sist i skriptet. Du måste dock ha ArcMap installerat på datorn.
Kör sedan skriptet med kommandot python skriptnamn.py argument0 argument1 argument2 i ett kommandofönster. Nästa gång du öppnar mxd-projektet så skall det vara uppdaterat. Eller varför inte lägga till export till PDF i skriptet?
Lycka till.
[EDIT]
Några fel smög in sig i skriptet, detta är nu rättat och det finns ett nytt att ladda hem nedan. När jag kopierade texten så fick jag dock byta ut ” tecknen för att det skulle fungera. Om det ändå strular så ersätt # tecknen också. Det blir något problem när pdf filen skapas med dessa tecken.