如何使用Python在ArcMap中禁用和启用绘图?


13

我正在编写的脚本将重新放置两个数据框并设置其范围。

这样做时,它将重绘整个Active View 4次,从而大大降低了脚本速度。

在运行脚本之前按F9或单击“暂停绘图”按钮将禁用绘图并使脚本运行得更快,但是我希望脚本自动执行此操作。

我想在脚本开头禁用ArcMap 10绘图,并在结尾处启用它。

我该怎么做呢?

Answers:


13

我没有在ArcPy中看到任何原生内容。最简单的操作可能是使用SendKeys模块将F9击键发送到ArcMap窗口。

我使用此语法进行了测试,并且工作正常:

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

唯一需要注意的是,您可能需要在脚本属性的“常规”选项卡上取消选中“始终在前台运行”。否则,脚本进度窗口可能会捕获按键。


谢谢!我有一个问题。我们网络上的任何计算机都将需要能够使用此脚本。是否可以在我们的服务器上托管SendKeys模块,以便我们不必在每台计算机上都安装它?我不熟悉添加新模块
Tanner 2010年

1
您可以使用PYTHONPATH添加到导入模块时Python查找的默认目录。我从来没有使用过它,所以我无法提供任何指导。此处的更多信息:docs.python.org/tutorial/modules.html#the-module-search-path
Evan

谢谢。当我关闭“始终在前台运行”时,SendKeys可以工作,但是问题是,如果您使用的是arcpy.mapping.MapDocument('Current'),脚本工具必须在前台运行。我想知道是否有办法在ArcObjects中?再说一次,我从未使用过ArcObjects
Tanner,2010年

1
您可以从“脚本工具属性”对话框中将工具本身更改为始终在前台运行。
杰森·谢尼尔

指向SendKeys模块的链接对我不起作用。其他人对此有疑问吗?您是否还有另一个链接可以下载该模块?
user3697700 2014年

6

我意识到这个问题很早以前就已经结束,但是我有一些旧工具,这是新出现的问题,SendKeys解决方案似乎不再起作用,因此我在试验后推出了自己的解决方案。它不会禁用绘图,而是通过禁用图层并在完成后重新启用它们来创建与之等效的性能。在后台运行脚本无法解决问题(尽管我认为可以解决),所以我尝试关闭所有层-并且可以正常工作!完全加速到空文档中的等效代码。因此,这里有一些代码可以实现这一点。

将这两个功能结合使用时,将关闭文档中的所有图层,并返回图层的保存状态。然后,当您完成操作后,可以通过将已保存的状态提供给第二个功能来重新打开它们。推荐用法:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.