답변:
ArcPy에서 네이티브를 보지 못했습니다. 가장 쉬운 방법은 SendKeys 모듈을 사용하여 F9 키 입력을 ArcMap 창에 보내는 것입니다 .
이 구문으로 테스트했으며 정상적으로 작동했습니다.
import SendKeys
# Send the keystroke for F9
SendKeys.SendKeys("{F9}")
유일한 경고는 스크립트 속성의 일반 탭에서 "항상 포 그라운드에서 실행"을 선택 취소해야 할 수 있다는 것입니다. 그렇지 않으면 키 입력이 스크립트 진행률 창에 걸릴 수 있습니다.
나는이 질문이 오래 전에 닫힌 것을 알고 있지만 이것이 새롭게 문제가 된 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