13 votos

Cómo deshabilitar y habilitar dibujo en ArcMap usando Python?

El guión que estoy escribiendo reposiciona dos tramas de datos y conjuntos de sus extensiones.

Al hacer esto, se vuelve a dibujar la totalidad de la Vista Activa 4 veces, la desaceleración de la secuencia de comandos de forma sustancial.

Pulsando F9 o haga clic en "Pausa Dibujo' botón antes de ejecutar la secuencia de comandos desactiva el dibujo, y hace que el script se ejecutará mucho más rápido, pero quiero que el script para hacer esto de forma automática.

Quiero deshabilitar ArcMap 10 de dibujo en el comienzo de la secuencia de comandos, y habilitar al final.

¿Cómo puedo hacer esto?

13voto

Jeremy Privett Puntos 2678

Yo no veo nada de nativos en ArcPy. La cosa más fácil de hacer es, probablemente, enviar la pulsación de tecla F9 para el ArcMap ventana, con el SendKeys módulo.

He probado con esta sintaxis y funcionó bien:

import SendKeys
# Send the keystroke for F9
SendKeys.SendKeys("{F9}")

La única salvedad es que usted puede necesitar para desactivar la casilla "ejecutar Siempre en primer plano" en la ficha General de las propiedades del script. De lo contrario, la pulsación de tecla puede quedar atrapado por la secuencia de comandos de la ventana de progreso.

6voto

rAndy Puntos 327

Me doy cuenta de que esta pregunta fue cerrado hace mucho tiempo, pero tengo algunas viejas herramientas que este fue recién un problema y el SendKeys solución no parece funcionar, así que me di la vuelta mi propia solución, después de experimentar. No deshabilitar el dibujo, sino que crea el rendimiento equivalente de que mediante la desactivación de capas y reenabling ellos cuando haya terminado. Tener la secuencia de comandos se ejecutan en el fondo no se resuelve el problema (aunque pensé que lo haría), así que he probado a desactivar todas las capas - ¡y funcionó! Completa speedup para el código equivalente en un documento vacío. Así que aquí está el código para lograrlo.

Estas dos funciones, cuando se combinan, desactivar todas las capas en un documento, volviendo el estado de guardado de las capas. Entonces, cuando las operaciones se hacen, usted puede convertir de nuevo en disponiendo que estado guardado para la segunda función. Uso recomendado:

try:
    layer_state = turn_off_all_layers("CURRENT")
    # Do interesting things here
finally:  # put it in a finally block so that if your interesting code fails, your layers still get reenabled
    turn_on_layers("CURRENT", layer_state)

Y las funciones que están por debajo de los - las correcciones, comentarios, etc de bienvenida - bastante nuevo código, así que puede haber algunos errores, pero se ha probado algunos.

def turn_off_all_layers(document="CURRENT"):
    """
        A speedup function for map generation in ArcMap - turns off all layers so that it doesn't try to rerender them while we're using tools (since these tools need
        to run in the foreground and background processesing didn't seem to speed it up).

        Creates a dictionary keyed on the arcpy layer value longName which contains True or False values for whether or not the layers were enabled before running this.
        Allows us to then use turn_on_layers on the same document to reenable those layers

    :param document: a map document. defaults to "CURRENT"
    :return: dict: a dictionary keyed on layer longName values with True or False values for whether the layer was enabled.
    """
    visiblity = {}

    doc = arcpy.mapping.MapDocument(document)
    for lyr in arcpy.mapping.ListLayers(doc):
        if lyr.visible is True:
            try:
                visiblity[lyr.longName] = True
                lyr.visible = False
            except NameError:
                visiblity[lyr.longName] = False  # if we have trouble setting it, then let's not mess with it later
        else:
            visiblity[lyr.longName] = False

    return visiblity


def turn_on_layers(document="CURRENT", storage_dict=None, only_change_visible=True):

    if not storage_dict:
        raise ValueError("storage_dict must be defined and set to a list of layer names with values of False or True based on whether the layer should be on or off")

    doc = arcpy.mapping.MapDocument(document)
    for lyr in arcpy.mapping.ListLayers(doc):
        if lyr.longName in storage_dict:
            if not only_change_visible or (only_change_visible is True and storage_dict[lyr.longName] is True):  # if we're only supposed to set the ones we want to make visible and it is one, or if we want to set all
                try:
                    lyr.visible = storage_dict[lyr.longName]  # set the visibility back to what we cached
                except NameError:
                    arcpy.AddWarning("Couldn't turn layer %s back on - you may need to turn it on manually" % lyr.longName)  # we couldn't turn a layer back on... too bad

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X