Як відключити та включити малювання в ArcMap за допомогою Python?


13

Сценарій, що я пишу репозиції, два кадри даних і встановлює їх розширення.

Роблячи це, він перемальовує весь Active View 4 рази, істотно сповільнюючи сценарій.

Натискання клавіші F9 або натискання кнопки "Призупинити малювання" перед запуском сценарію відключає малюнок і змушує сценарій працювати набагато швидше, але я хочу, щоб сценарій це робив автоматично.

Я хочу відключити малюнок ArcMap 10 на початку сценарію та включити його в кінці.

Як це зробити?

Відповіді:


13

У ArcPy я нічого рідного не бачив. Найпростіше зробити, мабуть, надіслати натискання клавіші F9 у вікно ArcMap за допомогою модуля SendKeys .

Я перевірив цей синтаксис, і він прекрасно працював:

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

Єдине застереження полягає в тому, що вам може знадобитися зняти прапорець "Завжди бігати на передньому плані" на вкладці Загальні властивості сценарію. Інакше натискання клавіші може потрапити у вікно виконання сценарію.


Спасибі! У мене є одне питання, хоча. Будь-який комп'ютер у нашій мережі повинен мати можливість використовувати цей сценарій. Чи можливо розмістити модуль SendKeys на нашому сервері, щоб нам не довелося встановлювати його на кожному комп’ютері? Я не знайомий із додаванням нових модулів
Tanner

1
Ви можете використовувати PYTHONPATH, щоб додати до каталогів за замовчуванням, у який шукає Python під час імпорту модулів. Я ніколи цього не використовував, тому не можу запропонувати жодних вказівок. Більше інформації тут: docs.python.org/tutorial/modules.html#the-module-search-path
Еван

Спасибі. SendKeys працює, коли я вимикаю "Завжди бігати на передньому плані", але проблема полягає в тому, що інструмент сценарію повинен працювати на передньому плані, якщо ви використовуєте arcpy.mapping.MapDocument ("Поточний"). Цікаво, чи є спосіб зробити це в ArcObjects? Потім знову я ніколи не використовував ArcObjects
Tanner

1
Ви можете змінити сам інструмент, щоб він завжди працював на передньому плані з діалогового вікна властивостей інструмента сценарію.
Jason Scheirer

Це посилання на модуль SendKeys не працює для мене. Хтось ще має проблеми з цим? У вас є інше посилання для завантаження цього модуля?
user3697700

6

Я усвідомлюю, що це питання було закрито давно, але в мене є старі інструменти, для яких це нещодавно було проблемою, і рішення SendKeys вже не працює, тому після експерименту я розробив власне рішення. Він не вимикає малювання, але створює еквівалент продуктивності, відключаючи шари та повторно вмикаючи їх після завершення. Запуск сценарію у фоновому режимі не вирішує проблему (хоча я думав, що це буде), тому я спробував вимкнути всі шари - і він працював! Повна швидкість до еквівалентного коду в порожньому документі. Ось ось якийсь код, щоб досягти цього.

Ці дві функції, поєднуючись, вимикають усі шари в документі, повертаючи збережений стан шарів. Потім, коли ваші операції завершені, ви можете їх увімкнути, надавши збережений стан другій функції. Рекомендоване використання:

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)

А нижче наведені функції - виправлення, коментарі тощо, ласкаво просимо - досить новий код, тому у нього можуть бути деякі помилки, але деякі перевірені.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.