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

13

El script que estoy escribiendo reposiciona dos marcos de datos y establece sus extensiones.

Al hacer esto, vuelve a dibujar toda la Vista activa 4 veces, ralentizando sustancialmente el script.

Al presionar F9 o hacer clic en el botón 'Pausar dibujo' antes de ejecutar el script, se desactiva el dibujo y el script se ejecuta mucho más rápido, pero quiero que el script lo haga automáticamente.

Quiero deshabilitar el dibujo de ArcMap 10 al comienzo del script y habilitarlo al final.

¿Cómo hago esto?

Curtidor
fuente

Respuestas:

13

No vi nada nativo en ArcPy. Lo más fácil es enviar la combinación de teclas F9 a la ventana de ArcMap usando el módulo SendKeys .

Probé con esta sintaxis y funcionó bien:

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

La única advertencia es que es posible que deba desmarcar "Ejecutar siempre en primer plano" en la pestaña General de las propiedades del script. De lo contrario, la ventana de progreso del script puede atrapar la pulsación del teclado.

Evan
fuente
¡Gracias! Aunque tengo una pregunta. Cualquier computadora en nuestra red necesitará poder usar este script. ¿Es posible alojar el módulo SendKeys en nuestro servidor para que no tengamos que instalarlo en cada computadora? No estoy familiarizado con agregar nuevos módulos
Tanner
1
Puede usar PYTHONPATH para agregar a los directorios predeterminados que Python busca al importar módulos. Nunca he usado esto, así que no puedo ofrecer ninguna orientación. Más información aquí: docs.python.org/tutorial/modules.html#the-module-search-path
Evan
Gracias. SendKeys funciona cuando desactivo 'Ejecutar siempre en primer plano' pero el problema es que una herramienta de secuencia de comandos tiene que ejecutarse en primer plano si está usando arcpy.mapping.MapDocument ('Actual') Me pregunto si hay una manera de hacerlo en ArcObjects? Por otra parte, nunca he usado ArcObjects
Tanner
1
Puede cambiar la herramienta en sí para que siempre se ejecute en primer plano desde el cuadro de diálogo de propiedades de la Herramienta de script.
Jason Scheirer
Ese enlace al módulo SendKeys no funciona para mí. ¿Alguien más tiene problemas con él? ¿Tienes otro enlace para descargar ese módulo?
user3697700
6

Me di cuenta de que esta pregunta se cerró hace mucho tiempo, pero tengo algunas herramientas antiguas para las que esto era un problema nuevo y la solución SendKeys ya no parece funcionar, así que hice mi propia solución después de experimentar. No deshabilita el dibujo, pero crea el rendimiento equivalente al deshabilitar las capas y volver a habilitarlas cuando haya terminado. Hacer que el script se ejecute en segundo plano no resuelve el problema (aunque pensé que lo haría), así que intenté desactivar todas las capas, ¡y funcionó! Aceleración completa al código equivalente en un documento vacío. Así que aquí hay un código para lograr eso.

Estas dos funciones, cuando se combinan, desactivan todas las capas en un documento, devolviendo el estado guardado de las capas. Luego, cuando haya terminado sus operaciones, puede volver a activarlas proporcionando ese estado guardado a 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 están a continuación: correcciones, comentarios, etc. bienvenido: código bastante nuevo, por lo que puede tener 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
nicksan
fuente