Bagaimana cara menonaktifkan dan mengaktifkan gambar di ArcMap menggunakan Python?

13

Script yang saya tulis mereposisi dua frame data dan menetapkan luasannya.

Saat melakukan ini, ia menggambar ulang seluruh Tampilan Aktif 4 kali, memperlambat script secara substansial.

Menekan F9 atau mengklik tombol 'Jeda Gambar' sebelum menjalankan skrip menonaktifkan gambar dan membuat skrip berjalan lebih cepat, tetapi saya ingin skrip melakukan ini secara otomatis.

Saya ingin menonaktifkan gambar ArcMap 10 di awal skrip, dan mengaktifkannya di akhir.

Bagaimana saya melakukan ini?

Penyamak
sumber

Jawaban:

13

Saya tidak melihat sesuatu yang asli di ArcPy. Hal termudah untuk dilakukan mungkin mengirim keystroke F9 ke jendela ArcMap menggunakan modul SendKeys .

Saya diuji dengan sintaks ini dan itu bekerja dengan baik:

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

Satu-satunya peringatan adalah bahwa Anda mungkin perlu menghapus centang "Selalu jalankan di latar depan" pada tab Umum dari properti skrip. Kalau tidak, penekanan tombol mungkin tertangkap oleh jendela kemajuan skrip.

Evan
sumber
Terima kasih! Saya punya satu pertanyaan. Komputer apa pun di jaringan kami harus dapat menggunakan skrip ini. Apakah mungkin meng-host modul SendKeys di server kami sehingga kami tidak harus menginstalnya di setiap komputer? Saya tidak terbiasa dengan menambahkan modul baru
Tanner
1
Anda dapat menggunakan PYTHONPATH untuk menambah direktori default yang terlihat Python ketika mengimpor modul. Saya tidak pernah menggunakan ini jadi saya tidak bisa menawarkan bimbingan apa pun. Info lebih lanjut di sini: docs.python.org/tutorial/modules.html#the-module-search-path
Evan
Terima kasih. SendKeys berfungsi ketika saya mematikan 'Selalu berjalan di latar' tetapi masalahnya adalah, alat skrip harus berjalan di latar depan jika Anda menggunakan arcpy.mapping.MapDocument ('Lancar') Saya ingin tahu apakah ada cara untuk melakukannya di ArcObjects? Kemudian lagi, saya tidak pernah menggunakan ArcObjects
Tanner
1
Anda bisa mengubah alat itu sendiri untuk selalu berjalan di latar depan dari dialog properti Script Tool.
Jason Scheirer
Tautan ke modul SendKeys tidak berfungsi untuk saya. Adakah yang mengalami masalah dengannya? Apakah Anda memiliki tautan lain untuk mengunduh modul itu?
user3697700
6

Saya menyadari pertanyaan ini sudah ditutup sejak lama, tetapi saya memiliki beberapa alat lama yang ini merupakan masalah baru dan solusi SendKeys tampaknya tidak lagi berfungsi, jadi saya memutar solusi saya sendiri setelah bereksperimen. Itu tidak menonaktifkan gambar, tetapi menciptakan kinerja yang setara dengan itu dengan menonaktifkan lapisan dan mengaktifkannya kembali setelah selesai. Menjalankan skrip di latar belakang tidak menyelesaikan masalah (meskipun saya pikir akan melakukannya), jadi saya mencoba mematikan semua layer - dan berhasil! Speedup penuh ke kode yang setara dalam dokumen kosong. Jadi, inilah beberapa kode untuk melakukannya.

Kedua fungsi ini, ketika digabungkan, mematikan semua lapisan dalam dokumen, mengembalikan status lapisan yang disimpan. Kemudian, ketika operasi Anda selesai, Anda dapat menyalakannya kembali dengan memberikan status tersimpan itu ke fungsi kedua. Penggunaan yang disarankan:

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)

Dan fungsinya di bawah ini - koreksi, komentar, dll selamat datang - kode yang cukup baru sehingga mungkin memiliki beberapa bug, tetapi sudah diuji beberapa.

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
sumber