Como desativar e ativar o desenho no ArcMap usando Python?

13

O script que estou escrevendo reposiciona dois quadros de dados e define suas extensões.

Ao fazer isso, ele redesenha todo o Active View 4 vezes, diminuindo substancialmente o script.

Pressionar F9 ou clicar no botão 'Pausar desenho' antes de executar o script desativa o desenho e faz com que o script seja executado muito mais rapidamente, mas quero que o script faça isso automaticamente.

Desejo desativar o desenho do ArcMap 10 no início do script e ativá-lo no final.

Como eu faço isso?

Curtidor
fonte

Respostas:

13

Não vi nada nativo no ArcPy. A coisa mais fácil a fazer é provavelmente enviar a tecla F9 para a janela do ArcMap usando o módulo SendKeys .

Eu testei com esta sintaxe e funcionou bem:

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

A única ressalva é que talvez seja necessário desmarcar a opção "Sempre executar em primeiro plano" na guia Geral das propriedades do script. Caso contrário, o pressionamento de tecla pode ser capturado pela janela de progresso do script.

Evan
fonte
Obrigado! Ainda tenho uma dúvida. Qualquer computador em nossa rede precisará ser capaz de usar esse script. É possível hospedar o módulo SendKeys em nosso servidor para que não seja necessário instalá-lo em todos os computadores? Eu não estou familiarizado com a adição de novos módulos
Tanner
1
Você pode usar PYTHONPATH para adicionar aos diretórios padrão que o Python procura ao importar módulos. Eu nunca usei isso, então não posso oferecer nenhuma orientação. Mais informações aqui: docs.python.org/tutorial/modules.html#the-module-search-path
Evan
Obrigado. SendKeys funciona quando eu desativo 'Sempre executar em primeiro plano', mas o problema é que uma ferramenta de script deve ser executada em primeiro plano se você estiver usando arcpy.mapping.MapDocument ('Current') Gostaria de saber se há uma maneira de fazer isso no ArcObjects? Então, novamente, eu tenho ArcObjects nunca usei
Tanner
1
Você pode alterar a própria ferramenta para sempre ser executada em primeiro plano no diálogo de propriedades da Ferramenta de Script.
Jason Scheirer
Esse link para o módulo SendKeys não funciona para mim. Alguém mais está tendo problemas com isso? Você tem outro link para baixar esse módulo?
precisa saber é o seguinte
6

Sei que essa pergunta foi encerrada há muito tempo, mas tenho algumas ferramentas antigas para resolver esse problema recentemente, e a solução SendKeys não parece mais funcionar, então rolei minha própria solução depois de experimentar. Ele não desativa o desenho, mas cria o desempenho equivalente ao desabilitar as camadas e reativá-las quando terminar. A execução do script em segundo plano não resolve o problema (embora eu pensasse que seria), então tentei desativar todas as camadas - e funcionou! Aceleração total para o código equivalente em um documento vazio. Então, aqui está um código para fazer isso.

Essas duas funções, quando combinadas, desativam todas as camadas em um documento, retornando o estado salvo das camadas. Então, quando suas operações estiverem concluídas, você poderá ativá-las novamente, fornecendo esse estado salvo para a segunda função. 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)

E as funções estão abaixo - correções, comentários, etc - bem-vindo - código bastante novo, para que possa ter alguns erros, mas já foi testado.

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
fonte