Làm cách nào để tắt và bật bản vẽ trong ArcMap bằng Python?


13

Kịch bản mà tôi đang viết định vị lại hai khung dữ liệu và đặt phạm vi của chúng.

Khi thực hiện việc này, nó sẽ vẽ lại toàn bộ Active View 4 lần, làm chậm đáng kể kịch bản.

Nhấn F9 hoặc nhấp vào nút 'Tạm dừng vẽ' trước khi chạy tập lệnh sẽ vô hiệu hóa bản vẽ và làm cho tập lệnh chạy nhanh hơn nhiều, nhưng tôi muốn tập lệnh tự động thực hiện việc này.

Tôi muốn tắt bản vẽ ArcMap 10 ở đầu tập lệnh và bật nó ở cuối.

Làm thế nào để tôi làm điều này?

Câu trả lời:


13

Tôi đã không thấy bất cứ điều gì bản địa trong ArcPy. Cách dễ nhất có lẽ là gửi tổ hợp phím F9 đến cửa sổ ArcMap bằng mô-đun SendKeys .

Tôi đã thử nghiệm với cú pháp này và nó hoạt động tốt:

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

Nhắc nhở duy nhất là bạn có thể cần bỏ chọn "Luôn chạy ở nền trước" trên tab Chung của thuộc tính tập lệnh. Nếu không, tổ hợp phím có thể bị bắt bởi cửa sổ tiến trình tập lệnh.


Cảm ơn! Tôi có một câu hỏi mặc dù. Bất kỳ máy tính nào trên mạng của chúng tôi sẽ cần có thể sử dụng tập lệnh này. Có thể lưu trữ mô-đun SendKeys trên máy chủ của chúng tôi để chúng tôi không phải cài đặt nó trên mọi máy tính không? Tôi không quen với việc thêm các mô-đun mới
Tanner

1
Bạn có thể sử dụng PYTHONPATH để thêm vào các thư mục mặc định mà Python tìm kiếm khi nhập mô-đun. Tôi chưa bao giờ sử dụng điều này vì vậy tôi không thể cung cấp bất kỳ hướng dẫn. Thêm thông tin ở đây: docs.python.org/tutorial/modules.html#the-module-search-path
Evan

Cảm ơn. SendKeys hoạt động khi tôi tắt 'Luôn chạy ở nền trước' nhưng vấn đề là, một công cụ tập lệnh phải chạy ở nền trước nếu bạn đang sử dụng arcpy.micking.MapDocument ('Hiện tại') Tôi tự hỏi liệu có cách nào để làm điều đó không trong ArcObjects? Sau đó, một lần nữa, tôi chưa bao giờ sử dụng ArcObjects
Tanner

1
Bạn có thể thay đổi chính công cụ để luôn chạy ở nền trước từ hộp thoại thuộc tính Script Tool.
Jason Scheirer

Liên kết đến mô-đun SendKeys không hoạt động đối với tôi. Bất cứ ai khác có vấn đề với nó? Bạn có một liên kết khác để tải về mô-đun đó?
dùng3697700

6

Tôi nhận ra câu hỏi này đã bị đóng từ lâu, nhưng tôi có một số công cụ cũ mà đây mới là vấn đề và giải pháp SendKeys dường như không còn hoạt động nữa, vì vậy tôi đã tự mình đưa ra giải pháp sau khi thử nghiệm. Nó không vô hiệu hóa bản vẽ, nhưng tạo ra hiệu suất tương đương với việc đó bằng cách vô hiệu hóa các lớp và kích hoạt lại chúng khi hoàn thành. Có kịch bản chạy trong nền không giải quyết được vấn đề (mặc dù tôi nghĩ nó sẽ như vậy), vì vậy tôi đã thử tắt tất cả các lớp - và nó đã hoạt động! Tăng tốc đầy đủ đến mã tương đương trong một tài liệu trống. Vì vậy, đây là một số mã để thực hiện điều đó.

Hai hàm này khi kết hợp lại sẽ tắt tất cả các lớp trong tài liệu, trả về trạng thái đã lưu của các lớp. Sau đó, khi các hoạt động của bạn được thực hiện, bạn có thể bật lại chúng bằng cách cung cấp trạng thái đã lưu đó cho chức năng thứ hai. Khuyến nghị sử dụng:

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)

Và các chức năng ở bên dưới - sửa chữa, bình luận, v.v. hoan nghênh - mã khá mới để nó có thể có một số lỗi, nhưng nó đã được thử nghiệm một số.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.