2017-09-09 1 views
0

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.

+0

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. –

+0

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 = .. –

+0

Sie haben Recht. Entschuldigung für den Lärm. Ich füge unten eine Antwort hinzu. –

Antwort

0

Hier ist ein minimales Beispiel, das ein VTK-Datenarray aus einem Numpy-Array erstellt. Sie sollten es für Ihre Zwecke anpassen können.

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

Danke für den Hinweis. Ich habe es angepasst, aber bekomme den Fehler __TypeError: AddArray Argument 1: Methode erfordert ein VTK Objekt__ in der Datei **/usr/lib/python2.7/dist-Pakete/vtk/numpy_interface/Dataset_adapter.py ** in Zeile 652. Ich denke, es ist etwas seltsam mit meiner Paraview Installation und ich werde andere Routen gehen. –

+0

Wenn Sie Ihr Skript veröffentlichen, kann ich einen Blick darauf werfen. –

+0

Die Zeile 'vtk_arr = da.VTKArray (np_arr)' wird nicht benötigt. Sie sollten einfach 'output.PointData 'ausführen können.append (np_arr, "meine Daten") ' – Utkarsh