He creado una herramienta de secuencia de comandos para ArcMap 10.3.1 que se mueven una leyenda en torno a un marco de datos de modo que no obstruya una determinada capa del mapa cuando el uso de las páginas controladas por datos. Sin embargo, me estoy encontrando con un problema interesante al intentar alinear la leyenda a la derecha del borde del marco de datos.
Aquí está el código que se usa para alinear la leyenda (the legend está anclado en la parte inferior izquierda):
inset.elementPositionX = (DataFrame.elementPositionX +
DataFrame.elementWidth) - inset.elementWidth
Ahora, este script funciona perfectamente hasta que he "mostrar Sólo las clases que son visibles en la extensión de mapa actual" casilla marcada con la leyenda de propiedades. Tener marcada esta opción hace que la leyenda de tamaño a medida que el programa se repite en cada página (en función de lo que es visible en el mapa), y cuando lo hace se deja un hueco o saturaciones de los datos borde del marco.
Lo interesante es que mientras el "mostrar Sólo las clases que son visibles en la extensión de mapa actual" está marcada en la leyenda de propiedades, si me iterar a través de cada página de forma manual, la ejecución de este pequeño alinear fragmento de código en la ventana de python después de cambiar de página, funciona perfectamente.
Entonces, mi pregunta es: ¿por qué esto no funciona mientras se está ejecutando en una herramienta de secuencia de comandos, pero cuando se ejecuta manualmente? Es casi como si de ArcMap no es capaz de seguir con el mismo (si es que tiene algún sentido...)
Nota* esta herramienta fue construida para que se ejecute en un abrir MXD, no fuera de uno.
Para probar probar esto:
Abrir un MXD, añadir dos capas: una capa de un índice de la capa de DDP, y una segunda capa que es simbolizado por categorías. Asegúrese de que no todas las categorías se muestran en cada DDP. A continuación, inserte una leyenda, ir a propiedades, seleccione la casilla "mostrar Sólo las clases que son visibles en la extensión de mapa actual". Entonces, como usted haga clic a través de su DDPs, su leyenda debe (a menos que todas las descripciones de elementos son de la misma anchura) cambiar de forma.
A continuación, agregue esto a la ventana de python:
mxd = arcpy.mapping.MapDocument("Current")
SecondaryObject = "Legend"
inset = arcpy.mapping.ListLayoutElements(mxd, "", SecondaryObject)[0]
PrimeObject = "Main View"
DataFrame = arcpy.mapping.ListDataFrames(mxd, PrimeObject)[0]
inset.elementPositionX = (DataFrame.elementPositionX + DataFrame.elementWidth) - inset.elementWidth
Siguiente, iterar a través de su DDP para observar el fragmento de la acción, de trabajo.
En la versión completa de la DDP con muebles leyenda de secuencia de comandos, el alinear tiene lugar después de la DDP se cambia a cada nueva página. Primero la leyenda se mueve hacia atrás a la posición inicial, y si el "intersect" función devuelve > 0 a partir de allí, se mueve a una nueva posición:
for pageNum in range(1, mxd.dataDrivenPages.pageCount + 1):
#setup naming and path for output maps
path = mxd.filePath
bn = os.path.basename(path)[:-4]
mxd.dataDrivenPages.currentPageID = pageNum
insetDefaultX = inset.elementPositionX
insetDefaultY = inset.elementPositionY
#check defualt position for intersect
intersect = checkIntersect(inset)
if intersect == 0: #if it doesn't intersect, print the map
arcpy.mapping.ExportToEPS(mxd, exportFolder + "\\" + bn + "_"+ str(pageNum) + ".eps", "Page_Layout",640,480,300,"BETTER","RGB",3,"ADAPTIVE","RASTERIZE_BITMAP",True,False)
else: #intersect != 0: #move inset to SE corner
inset.elementPositionX = (DataFrame.elementPositionX + DataFrame.elementWidth) - inset.elementWidth
inset.elementPositionY = DataFrame.elementPositionY