Angenommen, ich habe einen ProgrammableFilter in paraview, der zwei Eingaben erhält: mesh1 mit Daten und mesh2 ohne. Außerdem kenne ich die Permutation der Punkte von Mesh1 zu Mesh2. Inneren des Filters kann ich die Punktwerte zugreifen durchWie man numpy im programmierbaren Filter in ParaView verwendet
data0=inputs[0].GetPointData().GetArray('data')`
und einen Teil des Arrays erhalten
subData=data0[0:6]
zum Beispiel. Aber wie könnte ich diese subData
ohne eine Pythonschleife zur Ausgabe hinzufügen?
mit dem Code zu experimentieren, habe ich ein (nicht so klein) Arbeitsbeispiel:
#!/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)
ich die Antwort akzeptiert, weil es richtig aussieht. Die folgenden zwei Skripte zeigen auch das Problem: Basis script '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()
und das Skript für den programmierbaren Filter:
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')
Mit dieser Kombination, erhalte ich die Fehlermeldung:
File "/usr/lib/python2.7/dist-packages/vtk/numpy_interface/dataset_adapter.py", Zeile 652, in append self.VTKObject.AddArray (FER)
Typeerror: AddArray Argument 1: Verfahren erfordert eine VTK Objekt
File "run.py", Zeile 15, in
print progData.GetArray('T2').GetRange()
Attribute: 'NoneType' Objekt kein Attribut 'GetRange'
Die erste Fehlermeldung scheint der Grund für die zweite zu sein.
Sie haben ein größeres Problem: die Verwendung von 'paraview.simple' in einem programmierbaren Filter führt zu undefiniertem Verhalten und ist nicht erlaubt. Sie müssen mit reinem VTK- und Numpy-Code in einem programmierbaren Filter bleiben. Der programmierbare Filter wird auf allen Prozessen ausgeführt, die auf der Serverseite ausgeführt werden. –
Entschuldigung für die Verwirrung. Ich habe versucht, ein funktionierendes Beispiel zu konstruieren. Dieses Beispiel ist ein Python-Skript, das den programmierbaren Filter erstellt. Innerhalb des Filters verwende ich nicht paraview.simple, nur vtk und numpy. Siehe die Zeile progFilter.Script = .. –
Sie haben Recht. Entschuldigung für den Lärm. Ich füge unten eine Antwort hinzu. –