PythonProgrammableFilter: Difference between revisions
DaveDemarle (talk | contribs) No edit summary |
DaveDemarle (talk | contribs) mNo edit summary |
||
Line 13: | Line 13: | ||
[[Image:PyScriptFig1.jpg]] | [[Image:PyScriptFig1.jpg]] | ||
#reads a poly data and modifies the geometry | |||
pdi = self.GetPolyDataInput() | |||
pdo = self.GetPolyDataOutput() | |||
newPts = paraview.vtkPoints() | |||
numPts = pdi.GetNumberOfPoints() | |||
for i in range(0, numPts): | |||
coord = pdi.GetPoint(i) | |||
x,y,z = coord[:3] | |||
x = x * 2 | |||
y = y * 0.5 | |||
z = 1 | |||
newPts.InsertPoint(i, x,y,z) | |||
pdo.SetPoints(newPts) | |||
The following figure shows a python script that produces an image data output with one cell per point in its input polygonal dataset. | The following figure shows a python script that produces an image data output with one cell per point in its input polygonal dataset. | ||
[[Image:PyScriptFig2.jpg]] | [[Image:PyScriptFig2.jpg]] | ||
#this example creates an Nx1x1 imagedata output | |||
#and populates its cells with the point centered | |||
#scalars of the input dataset | |||
#get a hold of the input | |||
pdi = self.GetInput() | |||
numPts = pdi.GetNumberOfPoints() | |||
#create the output dataset with one cell per point | |||
ido = self.GetOutput() | |||
ido.SetDimensions(numPts+1,2,2) | |||
ido.SetOrigin(-1,-1,-1) | |||
ido.SetSpacing(.1,.1,.1) | |||
ido.SetWholeExtent(0,numPts,0,1,0,1) | |||
ido.AllocateScalars() | |||
#choose an input point data array to copy | |||
ivals = pdi.GetPointData().GetScalars() | |||
ca = paraview.vtkFloatArray() | |||
ca.SetName(ivals.GetName()) | |||
ca.SetNumberOfComponents(1) | |||
ca.SetNumberOfTuples(numPts) | |||
#add the new array to the output | |||
ido.GetCellData().AddArray(ca) | |||
#copy the values over element by element | |||
for i in range(0, numPts): | |||
ca.SetValue(i, ivals.GetValue(i)) |
Revision as of 15:49, 1 January 2007
ParaView3's python programmable filter.
The python programmable filter is a general purpose filter that the end user can program within the paraview GUI to manipulate datasets as needed. To use the filter, turn the PARAVIEW_ENABLE_PYTHON_FILTER cmake option on. This causes the make process to wrap paraview's classes into python callable format. The wrapping process is identical to that for the PARAVIEW_EMBED_PYTHON option and the two share the same sets of libraries at run time.
The filter is a wrapper around VTK's vtkProgrammableFilter class and adds to it:
- a string containing the user's script for the filter to execute
- an instance of the python interpreter with the wrapped paraview libraries imported
- the ability to easily change the output dataset type.
When the user selects "PythonScript" from the Filters menu, an empty programmable filter is created. The default behavior of the empty script is create a dataset if the same type as its input and to copy through the input dataset's structure. The GUI provides a selection menu where the user can choose from the five primary vtk dataset types for the output. The GUI also provides a text entry area where the user can type, edit or paste in a python script.
The following figure shows a python script that modifies the geometry of its input dataset.
#reads a poly data and modifies the geometry pdi = self.GetPolyDataInput() pdo = self.GetPolyDataOutput() newPts = paraview.vtkPoints() numPts = pdi.GetNumberOfPoints() for i in range(0, numPts): coord = pdi.GetPoint(i) x,y,z = coord[:3] x = x * 2 y = y * 0.5 z = 1 newPts.InsertPoint(i, x,y,z) pdo.SetPoints(newPts)
The following figure shows a python script that produces an image data output with one cell per point in its input polygonal dataset.
#this example creates an Nx1x1 imagedata output #and populates its cells with the point centered #scalars of the input dataset #get a hold of the input pdi = self.GetInput() numPts = pdi.GetNumberOfPoints() #create the output dataset with one cell per point ido = self.GetOutput() ido.SetDimensions(numPts+1,2,2) ido.SetOrigin(-1,-1,-1) ido.SetSpacing(.1,.1,.1) ido.SetWholeExtent(0,numPts,0,1,0,1) ido.AllocateScalars() #choose an input point data array to copy ivals = pdi.GetPointData().GetScalars() ca = paraview.vtkFloatArray() ca.SetName(ivals.GetName()) ca.SetNumberOfComponents(1) ca.SetNumberOfTuples(numPts) #add the new array to the output ido.GetCellData().AddArray(ca) #copy the values over element by element for i in range(0, numPts): ca.SetValue(i, ivals.GetValue(i))