私は、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番目の原因であるようです。
Programmable Filterで 'paraview.simple'を使用すると、未定義の動作が発生する可能性があります。プログラマブルフィルターに純粋なVTKとナンシーコードを貼り付ける必要があります。 Programmable Filterは、サーバー側で実行されているすべてのプロセスで実行されます。 –
混乱して申し訳ありません。私は実例を作ってみました。この例はプログラマブルなフィルタを作成するpythonスクリプトです。フィルタの中で、私はparaview.simpleを使用しません。ちょうどvtkとnumpyです。 progFilter.Script = .. –
の行を参照してください。ノイズは申し訳ありません。私は以下の答えを追加します。 –