Come disabilitare e abilitare il disegno in ArcMap usando Python?


13

Lo script che sto scrivendo riposiziona due frame di dati e ne imposta l'estensione.

In questo modo, ridisegna l'intera Visualizzazione attiva 4 volte, rallentando sostanzialmente lo script.

Premendo F9 o facendo clic sul pulsante "Pausa disegno" prima di eseguire lo script, il disegno viene disabilitato e lo script viene eseguito molto più velocemente, ma voglio che lo script lo faccia automaticamente.

Voglio disabilitare il disegno di ArcMap 10 all'inizio dello script e abilitarlo alla fine.

Come faccio a fare questo?

Risposte:


13

Non ho visto nulla di nativo in ArcPy. La cosa più semplice da fare è probabilmente inviare la sequenza di tasti F9 alla finestra ArcMap usando il modulo SendKeys .

Ho provato con questa sintassi e ha funzionato bene:

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

L'unica avvertenza è che potrebbe essere necessario deselezionare "Esegui sempre in primo piano" nella scheda Generale delle proprietà dello script. In caso contrario, la sequenza di tasti potrebbe essere catturata dalla finestra di avanzamento dello script.


Grazie! Ho una domanda però. Qualsiasi computer sulla nostra rete dovrà essere in grado di utilizzare questo script. È possibile ospitare il modulo SendKeys sul nostro server in modo da non doverlo installare su tutti i computer? Non ho familiarità con l'aggiunta di nuovi moduli
Tanner

1
È possibile utilizzare PYTHONPATH per aggiungere alle directory predefinite in cui Python cerca durante l'importazione dei moduli. Non l'ho mai usato, quindi non posso offrire alcuna guida. Maggiori informazioni qui: docs.python.org/tutorial/modules.html#the-module-search-path
Evan

Grazie. SendKeys funziona quando disattivo "Esegui sempre in primo piano" ma il problema è che uno strumento di script deve essere eseguito in primo piano se si utilizza arcpy.mapping.MapDocument ("Current") Mi chiedo se esiste un modo per farlo in ArcObjects? Inoltre, non ho mai usato ArcObjects
Tanner il

1
È possibile modificare lo strumento stesso per eseguirlo sempre in primo piano dalla finestra di dialogo delle proprietà dello strumento di script.
Jason Scheirer,

Quel link al modulo SendKeys non funziona per me. Qualcun altro ha problemi con esso? Hai un altro link per scaricare quel modulo?
user3697700,

6

Mi rendo conto che questa domanda è stata chiusa molto tempo fa, ma ho alcuni vecchi strumenti per cui questo è stato di recente un problema e la soluzione SendKeys sembra non funzionare più, quindi ho lanciato la mia soluzione dopo aver sperimentato. Non disabilita il disegno, ma crea l'equivalente delle prestazioni disabilitando i livelli e riattivandoli al termine. Avere lo script eseguito in background non risolve il problema (anche se pensavo che lo avrebbe fatto), quindi ho provato a disattivare tutti i livelli - e ha funzionato! Accelerazione completa al codice equivalente in un documento vuoto. Quindi ecco un po 'di codice per farlo.

Queste due funzioni, quando combinate, disattivano tutti i livelli in un documento, restituendo lo stato salvato dei livelli. Quindi, al termine delle operazioni, è possibile riattivarle fornendo lo stato salvato alla seconda funzione. Utilizzo raccomandato:

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)

E le funzioni sono di seguito - correzioni, commenti, ecc. Benvenuti - codice abbastanza nuovo quindi potrebbe avere alcuni bug, ma è stato testato alcuni.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.