Pythonを使用してArcMapで描画を無効および有効にする方法


13

私が書いているスクリプトは、2つのデータフレームの位置を変更し、その範囲を設定します。

これを行うと、アクティブビュー全体が4回再描画され、スクリプトが大幅に遅くなります。

スクリプトを実行する前にF9キーを押すか、[描画の一時停止]ボタンをクリックすると、描画が無効になり、スクリプトの実行速度が大幅に向上しますが、スクリプトでこれを自動的に実行する必要があります。

スクリプトの冒頭でArcMap 10の描画を無効にし、最後に有効にします。

どうすればいいですか?

回答:


13

ArcPyにはネイティブなものはありませんでした。最も簡単な方法は、おそらくSendKeysモジュールを使用してF9キーストロークをArcMapウィンドウに送信することです

私はこの構文でテストし、うまくいきました:

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

唯一の注意点は、スクリプトプロパティの[全般]タブで[常にフォアグラウンドで実行する]をオフにする必要がある場合があることです。そうしないと、キーストロークがスクリプトの進行状況ウィンドウに捕捉される可能性があります。


ありがとう!ただ一つ質問があります。ネットワーク上のどのコンピューターでも、このスクリプトを使用できる必要があります。サーバーでSendKeysモジュールをホストして、すべてのコンピューターにインストールする必要がないようにすることは可能ですか?私は、新しいモジュールを追加することに慣れていないよ
タナー

1
PYTHONPATHを使用して、モジュールをインポートするときにPythonが検索するデフォルトのディレクトリに追加できます。私はこれを使用したことがないため、ガイダンスを提供できません。詳細はこちら:docs.python.org/tutorial/modules.html#the-module-search-path
エヴァン

ありがとう。「常にフォアグラウンドで実行」をオフにするとSendKeysは機能しますが、問題は、arcpy.mapping.MapDocument( 'Current')を使用している場合はスクリプトツールをフォアグラウンドで実行する必要があることです。 ArcObjectsで?その後、再び、ArcObjectsを使用したことがない
タナー

1
スクリプトツールのプロパティダイアログから常にフォアグラウンドで実行するようにツール自体を変更できます。
ジェイソンシャイラー

SendKeysモジュールへのそのリンクは、私にとっては機能しません。他に問題がありますか?そのモジュールをダウンロードするための別のリンクがありますか?
user3697700 14

6

私はこの質問がずっと前に閉じられたことに気付きましたが、私はこれが新しく問題になった古いツールをいくつか持っており、SendKeysソリューションはもはや機能していないようです。描画を無効にするわけではありませんが、レイヤーを無効にし、完了したらそれらを再度有効にすることで、描画と同等のパフォーマンスを作成します。スクリプトをバックグラウンドで実行しても問題は解決しません(そうなるとは思いますが)ので、すべてのレイヤーをオフにしてみました-そしてそれは機能しました!空のドキュメント内の同等のコードへの完全な高速化。それを実現するためのコードを次に示します。

これらの2つの関数を組み合わせると、ドキュメント内のすべてのレイヤーがオフになり、保存されたレイヤーの状態が返されます。その後、操作が完了したら、その保存された状態を2番目の関数に提供することにより、操作を再び有効にできます。推奨される使用法:

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.