使用ArcPy而不是ArcObjects刷新ArcMap中的开放属性表?


11

我正在从ArcMap中的arcpy运行“计算字段GP”工具。更新行值后,直到我使用“重新加载缓存”工具(“表选项”>“重新加载缓存”)后,它才会显示。如何在不使用ArcObjects的情况下自动刷新属性表?

我已尝试按照@ blah238建议使用python更新定义查询,您如何“重新加载”打开的属性表,但这无济于事。重置数据源不是一种选择,因为要素类可能正在编辑会话中,并且我不想失去与源数据的连接。


您正在使用ArcGIS 10.1吗?如果是这样,您是使用Python加载项还是Python脚本工具来运行“计算字段”?
PolyGeo

1
真的有关系吗?我正在从Python加载项调用Calculate Field GP工具,但是从Python窗口运行GP工具时会观察到相同的情况。
Alex Tereshenkov

1
我总是认为,如果我要尝试重现问题,那么最有可能看到的方法是,我是否按照相同的配置准确地(或尽可能接近地)执行了相同的步骤见过。
PolyGeo

Answers:


4

在没有ArcObjects的情况下,您似乎遇到了ArcPy的限制。

ArcPy.mapping的局限性在这里被广泛地描述为:

Arcpy.mapping不是ArcObjects的替代品,而是它支持的不同方案的替代品。对于更细粒度的开发和应用程序自定义,ArcObjects仍然是必需的,而arcpy.mapping则用于自动化现有地图文档和图层文件的内容。

如果@ blah238关于使用ArcPy中的ArcObjects的其他建议不是您的选择,那么您最好提交一个ArcGIS Idea以便将此功能公开给ArcPy。如果您在此处发布指向此类ArcGIS Idea的链接,那么我将很乐意为其投票。


多亏了PolyGeo,可惜我们无法在编辑会话之外计算字段值时找到刷新属性表的方法。
Alex Tereshenkov

1
您可以向ESRI技术支持提交增强请求。我要求仅使用按钮,菜单选项或F键即可刷新表格以显示更改,而无需手动关闭和打开。有人告诉我该表格应自行更新,此事已关闭,因为无法在本地复制。通常他们是有帮助的。我给他们的印象是他们甚至没有意识到局限性。
约翰斯,

我建议同时执行上述两项操作,但与此处的本地支持相比,ArcGIS Ideas使您可以更轻松地监控受欢迎程度和实施进度。
PolyGeo

1
@johns,您知道不必关闭并打开属性表来刷新它吗?当前的方法是单击“表选项”按钮>“重新加载缓存”。另一可行的方法是在编辑模式下运行“计算字段”操作,然后立即更新属性表中的值。
Alex Tereshenkov

1
@Alex,谢谢你的建议;这让我回头去进一步测试这个问题。我使用了重载缓存,但是当我在布局视图中使用插件通过布局获取布局范围时在编辑模式下添加了多边形时,它失败/失败。当在数据视图中并且我使用相同的插件时,重新加载缓存将起作用。因此它以某种方式涉及布局视图。
约翰斯,

3

这对于您的特定工作流程可能有用,也可能没有帮助。我发现,如果您更改图层上的选择,那么属性表也会更新。

所以我经常用

arcpy.SelectLayerByAttribute_management("MY-LAYER","CLEAR_SELECTION")

当然,如果您确实选择了不想松开的东西,那么这不好。在这种情况下,您可以从当前选定要素的OID列表中选择OID在其中的图层(基本上将选择更改为当前已选择的任何内容)。实际上这可能要花很长时间,我从未在现实生活中尝试过。


1

你有没有尝试过:

arcpy.RefreshCatalog(target) # Set the target to your layers data source

要么

arcpy.RefreshActiveView() # Refreshes the map

要么

arcpy.RefreshTOC() # I highly doubt this will do anything, but you never know

我认为其中之一会起作用,但是我知道有时候在ArcMap中,我必须手动关闭属性表,然后重新打开它才能看到一些编辑。我不确定用ArcPy是否可以关闭和打开表,但这也是一种选择。


不幸的是,坦斯克,科迪,这些都不起作用。手动关闭和打开属性表可以解决问题,但是我正在寻找可以通过编程实现的功能。打开和关闭属性表在Python中也不可用。
Alex Tereshenkov 2013年

所有这些都不旨在刷新属性表。
雷达

1

这有效:

    import arcpy

    definition_query = layer.definitionQuery
    # Change the Definition Query into something different
    if definition_query == '':
        oid = arcpy.ListFields(dataset = layer, field_type = 'OID')[0]
        layer.definitionQuery = '{} > 0'.format(oid.name)
    else:
        layer.definitionQuery = ''
    arcpy.RefreshActiveView()

    # Restore the Definition Query
    layer.definitionQuery = definition_query
    arcpy.RefreshActiveView()
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.