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

Reply via email to