Dennis,
The ParaView Guide chapter 14 and this blog post
(http://kitware.com/blog/home/post/723) talks about how arrays on
composite datasets are treated. Anycase, attached is a script that's
better at finding the closest point and then computing the distance.
It uses a PointLocator to find the closest point.
from vtk import vtkAppendFilter, vtkIdList, vtkNonMergingPointLocator
from vtk.numpy_interface import dataset_adapter as dsa
import numpy as np
# Merge blocks.
appender = vtkAppendFilter()
appender.MergePointsOn()
for block in output:
appender.AddInputDataObject(block.VTKObject)
appender.Update()
mergedData = appender.GetOutput()
locator = vtkNonMergingPointLocator()
locator.SetDataSet(mergedData)
locator.BuildLocator()
pts = output.GetPoints()
result = []
closestPoint = []
ids = vtkIdList()
for parray in pts.Arrays:
if parray is dsa.NoneArray:
result.append(dsa.NoneArray)
closestPoint.append(dsa.NoneArray)
continue
nclosets = np.zeros(parray.shape, dtype=np.float64)
nresult = np.zeros(len(parray), dtype=np.float64)
closestPoint.append(nclosets)
result.append(nresult)
for idx in xrange(len(parray)):
pt = parray[idx]
ids.Reset()
locator.FindClosestNPoints(2, pt, ids)
assert ids.GetNumberOfIds() == 2
pt2 = mergedData.GetPoints().GetPoint(ids.GetId(1))
nclosets[idx] = pt2
nresult[idx] = sqrt((pt[0] - pt2[0])**2 + (pt[1] - pt2[1])**2 + (pt[2] - pt2[2])**2)
output.PointData.append(dsa.VTKCompositeDataArray(result, output), "MinDistance")
output.PointData.append(dsa.VTKCompositeDataArray(closestPoint, output), "ClosestPoint")
_______________________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Please keep messages on-topic and check the ParaView Wiki at:
http://paraview.org/Wiki/ParaView
Search the list archives at: http://markmail.org/search/?q=ParaView
Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/paraview