Python kullanarak ArcMap'ta çizim nasıl devre dışı bırakılır ve etkinleştirilir?


13

Yazdığım komut dosyası iki veri çerçevesini yeniden konumlandırır ve uzantılarını ayarlar.

Bunu yaparken, tüm Aktif Görünümü 4 kez yeniden çizerek betiği önemli ölçüde yavaşlatır.

Komut dosyasını çalıştırmadan önce F9 tuşuna basmak veya 'Çizimi Duraklat' düğmesine tıklamak çizimi devre dışı bırakır ve komut dosyasının daha hızlı çalışmasını sağlar, ancak komut dosyasının bunu otomatik olarak yapmasını istiyorum.

Komut dosyasının başında ArcMap 10 çizimini devre dışı bırakmak ve sonunda etkinleştirmek istiyorum.

Bunu nasıl yaparım?

Yanıtlar:


13

ArcPy'de yerli bir şey görmedim. Yapılacak en kolay şey, F9 tuş vuruşunu muhtemelen SendKeys modülünü kullanarak ArcMap penceresine göndermek .

Bu sözdizimi ile test ettim ve iyi çalıştı:

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

Tek uyarı, komut dosyası özelliklerinin Genel sekmesinde "Her zaman ön planda çalıştır" seçeneğinin işaretini kaldırmanız gerekebileceğidir. Aksi takdirde tuş vuruşu kod ilerleme penceresi tarafından yakalanabilir.


Teşekkürler! Yine de bir sorum var. Ağımızdaki herhangi bir bilgisayarın bu komut dosyasını kullanabilmesi gerekir. SendKeys modülünü sunucumuzda barındırmak mümkün mü, böylece her bilgisayara kurmamız gerekmiyor mu? Yeni modüller eklemeye aşina değilim
Tanner

1
Modülleri içe aktarırken Python'un baktığı varsayılan dizinlere eklemek için PYTHONPATH kullanabilirsiniz. Bunu hiç kullanmadım, bu yüzden rehberlik sunamıyorum. Daha fazla bilgi için burada: docs.python.org/tutorial/modules.html#the-module-search-path
Evan

Teşekkürler. SendKeys, 'Her zaman ön planda çalıştır' seçeneğini kapattığımda çalışıyor, ancak sorun şu ki, arcpy.mapping.MapDocument ('Current') kullanıyorsanız bir komut dosyası ön planda çalışmalıdır. ArcObjects'te Sonra tekrar ArcObjects
Tanner

1
Komut Dosyası Aracı özellikleri iletişim kutusundan her zaman ön planda çalışacak şekilde aracın kendisini değiştirebilirsiniz.
Jason Scheirer

SendKeys modülüne olan bağlantı benim için işe yaramıyor. Başkasının sorunu olan var mı? Bu modülü indirmek için başka bir bağlantınız var mı?
user3697700

6

Bu sorunun uzun zaman önce kapatıldığını fark ettim, ancak bunun yeni bir sorun olduğu bazı eski araçlara sahibim ve SendKeys çözümü artık çalışmıyor gibi görünüyor, bu yüzden denedikten sonra kendi çözümümü yuvarladım. Çizimi devre dışı bırakmaz, ancak katmanları devre dışı bırakarak ve tamamlandığında yeniden etkinleştirerek bunun performans eşdeğerini oluşturur. Komut dosyasının arka planda çalıştırılması sorunu çözmez (olsa da düşündüm), bu yüzden tüm katmanları kapatmayı denedim - ve çalıştı! Boş bir belgedeki eşdeğer koda tam hız. İşte bunu başarmak için bazı kodlar.

Bu iki işlev birleştirildiğinde, belgedeki tüm katmanları kapatır ve katmanların kaydedilmiş durumunu döndürür. Ardından, işlemleriniz tamamlandığında, kaydedilen durumu ikinci işleve sağlayarak bunları tekrar açabilirsiniz. Önerilen kullanım:

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)

Ve fonksiyonlar aşağıdadır - düzeltmeler, yorumlar, vb hoş geldiniz - oldukça yeni bir kod, bu yüzden bazı hatalar olabilir, ancak bazı test edildi.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.