Python을 사용하여 ArcMap에서 그리기를 비활성화하고 활성화하는 방법은 무엇입니까?


13

내가 쓰는 스크립트는 두 개의 데이터 프레임을 재배치하고 그 범위를 설정합니다.

이렇게하면 전체 Active View가 4 번 다시 그려 져서 스크립트 속도가 크게 느려집니다.

스크립트를 실행하기 전에 F9 키를 누르거나 'Pause Drawing'버튼을 클릭하면 그리기가 비활성화되고 스크립트가 훨씬 빠르게 실행되지만 스크립트가 자동으로 수행되기를 원합니다.

스크립트 시작 부분에서 ArcMap 10 그리기를 비활성화하고 끝에서 활성화하고 싶습니다.

어떻게해야합니까?

답변:


13

ArcPy에서 네이티브를 보지 못했습니다. 가장 쉬운 방법은 SendKeys 모듈을 사용하여 F9 키 입력을 ArcMap 창에 보내는 것입니다 .

이 구문으로 테스트했으며 정상적으로 작동했습니다.

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
Evan

감사. SendKeys는 '항상 포 그라운드에서 실행'을 끄면 작동하지만 문제는 arcpy.mapping.MapDocument ( 'Current')를 사용하는 경우 스크립트 도구가 포 그라운드에서 실행되어야한다는 것입니다. ArcObjects에서? 다시 한번, 나는 ArcObjects를 사용하지 않았습니다
Tanner

1
스크립트 도구 속성 대화 상자에서 항상 전경에서 실행되도록 도구 자체를 변경할 수 있습니다.
Jason Scheirer

SendKeys 모듈에 대한 링크가 작동하지 않습니다. 다른 사람이 문제가 있습니까? 해당 모듈을 다운로드 할 수있는 다른 링크가 있습니까?
user3697700

6

나는이 질문이 오래 전에 닫힌 것을 알고 있지만 이것이 새롭게 문제가 된 SendTools 솔루션이 더 이상 작동하지 않는 오래된 도구를 가지고 있으므로 실험 후 내 솔루션을 롤백했습니다. 그리기를 비활성화하지는 않지만 레이어를 비활성화하고 완료되면 다시 활성화하여 성능을 동일하게 만듭니다. 스크립트를 백그라운드에서 실행해도 문제가 해결되지는 않지만 (필자는 생각했지만) 모든 레이어를 해제하려고 시도했습니다. 빈 문서에서 동등한 코드로 최대 속도 향상. 이를 달성하기위한 코드가 있습니다.

이 두 기능을 결합하면 문서의 모든 레이어를 끄고 저장된 레이어 상태를 반환합니다. 그런 다음 작업이 완료되면 저장된 상태를 두 번째 기능에 제공하여 작업을 다시 켤 수 있습니다. 권장 사용법 :

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.