12. Python & Batch: ParaViewとPython

12.1. はじめに

ParaView は、豊富で強力なPythonインタフェースを提供します。これにより、ユーザーはデータの処理を自動化することができ、Visualization Tool Kit (VTK)の強力なツールにアクセスすることができるようになります。このチュートリアルでは、ParaView とPythonについて説明します。Pythonコマンドを使用して ParaView を駆動する方法、およびこれらのコマンドの作成と使用を自動化する方法を説明します。

12.2. 概要

ParaView は、クライアント/サーバー・アーキテクチャを採用しています。クライアントは、 ParaView のGUIとディスプレイを含んでいます。サーバーはユーザーのデータを読み取り、データを処理し、これらの画像をクライアントに渡します。Pythonを使用して、GUI、クライアントレベル、またはサーバー上で直接ParaViewを制御することができます。

12.3. ParaView内の簡単なPythonのサンプル教材

  • paraview を起動します。

  • Pythonインタプリタ Tools → Python Shell を起動します。

  • 注意:

    • 他の場所からコマンドをコピーして、Python Shellにペーストすることができます。

    • Pythonは大文字と小文字を区別します。以下のように、必ず正しい文字列を使用してください。

    • Pythonはインデント(字下げ)に敏感です。以下のように、必ずインデントしないようにしてください。

  • Python シェルに次のコマンドを入力して、球体を作成し表示しましょう。

    sphere=Sphere()
    Show()
    Render()
    

    パイプラインで球体を作成し、表示設定をオンにして、再レンダリングしました。

  • shrink フィルタを追加しましょう。球体を隠し、shrink フィルタを追加し、再レンダリングします。

    Hide()
    Render()
    shrink = Shrink()
    Show()
    Render()
    

    ParaViewでは、GUIコントロールとPythonのどちらかを使用することができるようになります。例えば:

    • Python Shellで以下のように入力し、パイプラインブラウザでSphereを選択します:

      clip = Clip()
      Show()
      Render()
      
    • あるいは、Pythonで次のように続けることもできます:

      clip = Clip()
      Hide(shrink)
      Show(clip)
      Render()
      

    Planeウィジェットを非表示にします:

    Hide3DWidgets(proxy=clip)
    

Did you know?

  • ParaViewで使用できるすべてのコマンドを確認します:

    dir()
    
  • Clip creatorの全オプションを表示します:

    dir(Clip)
    
  • 上で作成したクリップのインスタンスのすべてのオプションを表示します:

    dir(clip)
    
  • パイプラインのアイテムで利用可能なコマンドを見るには、次のようなListPropertiesがより良いツールになります。

    clip.ListProperties()
    
    • これは、カメラなどのインスタンス化されたコントロールでは動作しないことに注意してください。カメラのようなコントロールには、dir()を使用してください。

  • また、変数ClipTypeのさまざまなプロパティを見るには、次のようにします。

    clip.ClipType.ListProperties()
    
  • コマンドのインスタンスの詳細を見るには、インスタンスを作成し、そのインスタンスに関するヘルプを尋ねてください。

    help(clip)
    

何かを見たり、変えたりしてみましょう。

  • Theta Resolutionを表示する

    print(sphere.ThetaResolution)
    
  • 64に変更する

    sphere.ThetaResolution=64
    Show()
    Render()
    
  • パイプラインブラウザで選択されているフィルタを変更することができます:

    SetActiveSource(sphere)
    
  • クリップを削除します。

    Delete(clip)
    
  • 球体を選択せずに、その球体にフィルタを追加してみましょう。

    wireframe = ExtractEdges(Input=sphere)
    Show()
    Render()
    

12.4. データファイルを読み込んでスクリーンショットを書き出すPythonの簡単な例

  • ParaView GUI内で、Edit → Reset Session を実行します。

  • Pythonインタプリタ Tools → Python Shell を起動します。

12.4.1. データを読み込んで、フィルタを使い、スクリーンショットを保存します

  • can.ex2の読み込み、can.ex2の切り取り、can.ex2のペイント、スクリーンショットの保存ができます。このテンプレートを使用します。

    canex2 = OpenDataFile('D:/directoryName/can.ex2')
    

    現在のパスはこちらです。バージョン番号に合わせて必ず更新してください

    canex2 = OpenDataFile('C:/Program Files (x86)/ParaView x.x.x/data/can.ex2')
    clip = Clip()
    Hide(canex2)
    Show(clip)
    ResetCamera()
    Render()
    SaveScreenshot('D:/directoryName/picture.jpg')
    

ファイルリーダーについては、ユーザーズガイドの 2 章 に詳しく書かれています。

12.4.2. カメラの制御

  • カメラを移動させたいと考えます。まず、カメラを入手し、既知の良い位置にカメラをリセットします。

    camera=GetActiveCamera()
    camera.SetFocalPoint(0,0,0)
    camera.SetPosition(0,0,-10)
    camera.SetViewUp(0,1,0)
    
  • カメラを近づけたり遠ざけたりする方法

    camera.Dolly(10)
    Render()
    camera.Dolly(.1)
    Render()
    
  • データセットを中心にビュー方向45度周りにカメラを回転させる方法。上記のリセットの後、X軸を中心に回転させます。

    camera.Roll(45)
    Render()
    
  • Y軸を中心としたベクトルupを中心にカメラを回転させる方法。上記のリセットの後、Y軸を中心に回転させます。

    camera.Yaw(45)
    Render()
    
  • カメラポイントを中心にカメラを垂直方向に回転させる方法

    camera.Pitch(45)
    Render()
    
  • データセットを中心とした↑のベクトルを中心にカメラを回転させる方法。上記のリセットの後、Y軸を中心に回転させる。

    camera.Azimuth(45)
    Render()
    
  • データセットを中心に、X軸を中心にカメラを回転させる方法。上記のリセットの後、Y軸を中心に回転させます。

    camera.Elevation(45)
    Render()
    
  • カメラのリセット方法

    ResetCamera()
    
  • 利用可能なコマンドは、次の方法で確認できます。

    dir(camera) (after you have created the animationScene1
    variable)
    dir(GetActiveCamera())
    

12.4.3. 時間の制御

  • タイムステップを1つ進めたいので、minとmaxは変数に正しく設定されています

    animationScene1 = GetAnimationScene()
    animationScene1.GoToNext()
    
  • 全時間を通しての再生は、以下のコマンドで行います。

    animationScene1.Play()
    
  • 利用可能なタイムステップを取得する必要があります。

    tk = GetTimeKeeper()
    timesteps = tk.TimestepValues
    
  • 最初のタイムステップは、これらの方法のいずれかを使用して見つけます。

    animationScene1.GoToFirst()
    animationScene1.AnimationTime = timesteps[0]
    
  • 最後のタイムステップは、これらの方法のいずれかを使用して見つけます。

    animationScene1.GoToLast()
    animationScene1.AnimationTime = timesteps[-1]
    
  • 特定のタイムステップ(タイムステップ10など)への移動は、以下のように行います。

    # index starts with 0
    animationScene1.AnimationTime = timesteps[9]
    
  • タイムステップがいくつあるのかを知るには、lenコマンドを使います。上の続きです。

    numTimesteps = len(timesteps)
    
  • 利用可能なコマンドは、次の方法で確認できます。

    # after you have created the animationScene1 variable
    dir(animationScene1)
    dir(GetAnimationScene())
    

12.4.4. 変数で描画

  • 変数で色を付けたいとします。必ず、Canではなく、Clipを表示してください。手順は、1タイムステップ進む、レンダービューを取得、ディスプレイを取得、変数を取得、ColorBy。

    animationScene1 = GetAnimationScene()
    animationScene1.GoToNext()
    renderView1 = GetActiveViewOrCreate('RenderView')
    canex2Display = Show(clip, renderView1)
    
  • ポイント変数名の取得

    canex2 = GetActiveSource()
    print(canex2.PointVariables.GetAvailable())
    
  • セル変数名の取得

    print(canex2.ElementPointVariables.GetAvailable())
    
  • ポイントバーの場合

    vars = canex2.PointVariables.GetAvailable()
    print(vars)
    ColorBy(canex2Display, ('POINTS', vars[0]))
    
  • セルバーの場合

    vars = canex2.ElementVariables.GetAvailable()
    print(vars)
    ColorBy(canex2Display, ('CELLS', vars[0]))
    # Actually not needed
    Render()
    

変数情報の読み方については、ユーザーズガイドの 3.3 章 に記載されています。

12.5. データセット中心周辺をスケールアップする - 使用例

  • データセットを中心に拡大縮小するスクリプトを作成したいと思います。この例では、アクティブソースを取得し、境界を取得し、カメラを変形させる方法を示します。

    scale_factor = 2
    indata = GetActiveSource()
    
    bounds = indata.GetDataInformation().GetBounds()
    center = ((bounds[0] + bounds[1])/2, (bounds[2] + bounds[3])/2,(bounds[4] + bounds[5])/2)
    
    transform_to_center = Transform()
    transform_to_center.Transform.Translate = [-center[0],
    -center[1], -center[2]]
    Hide()
    
    scale = Transform()
    scale.Transform.Scale = [scale_factor, scale_factor,
    scale_factor]
    Hide()
    
    transform_from_center = Transform()
    transform_from_center.Transform.Translate = [center[0],
    center[1], center[2]]
    Show()
    
    Render()
    

12.6. トレースレコーダー

paraview には、Pythonスクリプトを自動的に生成してくれるツールがあります。これは、Trace Recorderと呼ばれています。例を挙げると、以下のようになります。

  • can.ex2を読み込み、canをクリップ、EQPSでペイント、カメラを+Yに変更、スクリーンショットを書き出し、ムービーを書き出す。という手順です。

    • Tools → Start Trace Select Show Incremental Trace.

    • can.ex2を開きます。

    • OK を押します。

    • すべての変数をオンにします。

    • Apply を実行します。

    • +Y.

    • Clip を選択します。

    • Y Normal.

    • Show Plane の選択を解除します。

    • Apply を実行します。

    • ColoringEQPS に設定します。

    • 最後のタイムステップ。

    • データ範囲に再スケールします。

    • 最初のタイムステップを設定します。

    • File → Save Screenshot。 .pngで保存します。

    • File → Save Animation。 .aviで保存します。

    • Tools → Stop Trace

    • File → Save を既知の場所に保存します。

    paraview のPythonを見つけるもう一つの方法は、Save Stateを使うことです。これは最後の手段ですが、Trace Recorder が見落としたコマンドが含まれている可能性があります。File → Save State → Python State File

12.7. スクリプトの実行

ParaViewでは、ユーザーがスクリプトを実行することができます。これは以下のように行われます。

  • Tools → Python Shell

  • Run Script

ここで、スクリプトを参照し、OKを選択します。

12.8. マクロ

paraview は、既知の場所に配置されたPythonスクリプトを保存して使用することができます。トレースを作成するとき、File → Save As Macro というオプションがあります。また、Macrosメニューには、Add new macro というオプションがあります。マクロはParaView GUIの上部にあるマクロツールバーに追加されます。これらのマクロは Macro menu から編集や削除が可能です。

As an example, lets add the Python script that we created above.

  • Macros → Add new macro でマクロを検索し、OK をクリックします。

  • ツールバーの Macro をクリックします。

12.9. Pythonヘルプ

詳細については、ユーザーズガイドをご覧ください。

その他の情報は、自習チュートリアルの 3 章 に記載されています。