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