2017-09-09 51 views
0

私は、paraviewにProgrammableFilterがあり、これは2つの入力を取得すると仮定します。 さらに、私はmesh1からmesh2への点の順列を知っています。 フィルタ内部で、IはParaViewのプログラム可能フィルタでnumpyを使用する方法

data0=inputs[0].GetPointData().GetArray('data')` 

介してポイント値にアクセスし、例えば

subData=data0[0:6] 

使用して、配列の一部を取得することができます。しかし、どのように私はこのsubDataをpythonループなしで出力に追加できますか?それが右に見えるので、私は、答えを受け入れ

#!/usr/bin/python 
from paraview.simple import * 
import numpy as np 
import vtk 
from vtk.util.numpy_support import numpy_to_vtk 

#generate an arbitrary source with data 
mesh2=Sphere() 
mesh2.Center=[0.0, 0.0, 0.0] 
mesh2.EndPhi=360 
mesh2.EndTheta=360 
mesh2.PhiResolution=100 
mesh2.Radius=1.0 
mesh2.StartPhi=0.0 
mesh2.StartTheta=0.0 
mesh2.ThetaResolution=100 
mesh2.UpdatePipeline() 

#add the data 
mesh2Vtk=servermanager.Fetch(mesh2) 
nPointsSphere=mesh2Vtk.GetNumberOfPoints() 
mesh2Data=paraview.vtk.vtkFloatArray() 
mesh2Data.SetNumberOfValues(nPointsSphere) 
mesh2Data.SetName("mesh2Data") 
#TODO: use numpy here?? do this with a ProgrammableFilter ? 
data=np.random.rand(nPointsSphere,1) 
for k in range(nPointsSphere): 
    mesh2Data.SetValue(k, data[k]) 
mesh2Vtk.GetPointData().AddArray(mesh2Data) 

#send back to paraview server 
#from https://public.kitware.com/pipermail/paraview/2011-February/020120.html 
t=TrivialProducer() 
filter= t.GetClientSideObject() 
filter.SetOutput(mesh2Vtk) 
t.UpdatePipeline() 
w=CreateWriter('Sphere_withData.vtp') 
w.UpdatePipeline() 
Delete(w) 

#create mesh1 without data 
mesh1=Line() 
mesh1.Point1=[0,0,0] 
mesh1.Point2=[0,0,1] 
mesh1.Resolution=5 
mesh1.UpdatePipeline() 

progFilter=ProgrammableFilter(mesh1) 
progFilter.Input=[mesh1, t] 
progFilter.Script="curT=inputs[1].GetPointData().GetArray('mesh2Data')"\ 
    "\nglobIndices=range(0,6)"\ 
    "\nsubT=curT[globIndices]"\ 
    "\nswap=vtk.vtkFloatArray()"\ 
    "\nswap.SetNumberOfValues(len(globIndices))"\ 
    "\nswap.SetName('T')"\ 
    "\n#TODO: how can i avoid this loop, i.e. write output.GetPointData().AddArray(converToVTK(subT))"\ 
    "\nfor k in range(len(globIndices)):"\ 
    "\n swap.SetValue(k,subT[k])"\ 
    "\noutput.PointData.AddArray(swap)" 
progFilter.UpdatePipeline() 
w=CreateWriter('Line_withData.vtp') 
w.UpdatePipeline() 
Delete(w) 

:コードを試して

は、私は(それほど小さくない)作業例を作成しました。 ベーススクリプト「run.py」:

src1='file1.vtu' 
r1=XMLUnstructuredGridReader(FileName=src1) 

progFilter=ProgrammableFilter(r1) 
progFilter.Input=[r1] 
with open('script.py','r') as myFile: 
    progFilter.Script=myFile.read() 
progFilter.UpdatePipeline() 
progData=progFilter.GetPointDataInformation() 
print progData.GetArray('T2').GetRange() 

およびプログラマブルフィルタのためのスクリプト:次の2つのスクリプトでも問題を示し

import vtk 
import vtk.numpy_interface.dataset_adapter as dsa 
import numpy as np 
globIndices=inputs[0].GetPointData().GetArray('T') 
subT=np.ones((globIndices.shape[0],1)) 
subTVtk=dsa.VTKArray(subT) 
output.PointData.append(subTVtk, 'T2') 

この組み合わせでは、私は、エラーメッセージが出ます:追記 self.VTKObject.AddArrayでは、ライン652、

  • ファイル "/usr/lib/python2.7/dist-packages/vtk/numpy_interface/dataset_adapter.py" (ARR)

    はTypeError:ADDARRAY引数1: 'NoneType' オブジェクトが属性を持っていません:メソッドは

    print progData.GetArray('T2').GetRange() 
    

    はAttributeErrorに、ライン15、VTKオブジェクト

  • ファイル "run.py" が必要'GetRange'

最初のエラーメッセージの茎が2番目の原因であるようです。

+0

Programmable Filterで 'paraview.simple'を使用すると、未定義の動作が発生する可能性があります。プログラマブルフィルターに純粋なVTKとナンシーコードを貼り付ける必要があります。 Programmable Filterは、サーバー側で実行されているすべてのプロセスで実行されます。 –

+0

混乱して申し訳ありません。私は実例を作ってみました。この例はプログラマブルなフィルタを作成するpythonスクリプトです。フィルタの中で、私はparaview.simpleを使用しません。ちょうどvtkとnumpyです。 progFilter.Script = .. –

+0

の行を参照してください。ノイズは申し訳ありません。私は以下の答えを追加します。 –

答えて

0

ここでは、Numpy配列からVTKデータ配列を作成する最小限の例を示します。あなたはあなたの目的のためにそれを適応させることができるはずです。

import numpy as np 
import vtk 
from vtk.numpy_interface import dataset_adapter as da 

np_arr = np.ones(6) 
vtk_arr = da.VTKArray(np_arr) 
output.PointData.append(vtk_arr, "my data") 
+0

ヒントをありがとう。 __TypeError:AddArray引数1:メソッドは、ファイル/ **/usr/lib/python2.7/dist-packages/vtk/numpy_interface/dataset_adapter.py **内のVTKオブジェクト__を652行で必要とします。私は、私のパラビューのインストールに奇妙な何かがあり、私は他のルートに行くと思います。 –

+0

あなたのスクリプトを投稿すると、私は一見できます。 –

+0

'vtk_arr = da.VTKArray(np_arr)'行は必要ありません。あなたは単に 'output.PointData 'を実行できるはずです。append(np_arr、 "my data") ' – Utkarsh

関連する問題