[vtk-developers] ExtractByLocation

Amine Aboufirass amine.aboufirass at gmail.com
Fri Dec 1 10:45:27 EST 2017


Hello,

I am trying to figure out how to select the closest neighboring points to a
list of coordinates using the vtk library. I have a simple point data set
in the Unstructured Grid Format. The dataset contains one attribute named
the 'point_id' which is just enumerating the points starting from 1 instead
of 0. The raw text from the ASCII file is attached in testScalar.vtk below.

I have also written a script in python which I thought would function as
follows:

INPUT:

   1. List of tuples containing world coordinates [(X1,Y1,Z1),(X2,Y2,Z2)]
   2. name of attribute to extract as a string. in this case "point_id"

OUTPUT:

   1. List of floating point values of the attribute for the selected points

This does work to a certain degree, for instance when I do :

ExtractByLocation('testScalar.vtk', [(5.999,0,0)], 'point_id')

I do indeed get back the following:

array([ 2.], dtype=float32)

So point_id 2 is the closest point to the coordinates I have specified.
However, as soon as I get a bit too far from one of the points, the
function starts returning an empty list. For instance:

ExtractByLocation('testScalar.vtk', [(5.888,0,0)], 'point_id')

Returns
array([], dtype=float32)

I found out that the cut off point is 5.89-5.90. If I plugin 5.9 I get the
point, if I plugin 5.89 I get back an empty list.

According to the object reference (
https://www.vtk.org/doc/nightly/html/classvtkSelectionNode.html#aa7b54148c40adf4f5019b8ad3e160535a97d8505c922b2a25c5d2755607d3cbb6
)
 LOCATIONS is supposed to select the points near the supplied world
coordinates. Is there an option or something that selects the nearest point
PERIOD? i.e using a simple distance formula? I would like to never get back
an empty list but always get back a list of the closest point to the
supplied coordinates.

Kind Regards,

Amine
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtk-developers/attachments/20171201/e157fa3e/attachment.html>
-------------- next part --------------
import vtk
from vtk.util.numpy_support import vtk_to_numpy
import os

def ExtractByLocation(FileName, Locations, DataType):
#where Locations MUST be a list of XYZ tuples, e.g [(0,0.2,0.0),(0,0.4,0.0),(0,0.5,0.0),(0,0.6,0.0)]
	reader = vtk.vtkUnstructuredGridReader() 
	reader.SetFileName(FileName)
	
	if 'Scalar' in FileName:
		reader.SetScalarsName(DataType) 
	elif 'Tensor' in FileName:
		reader.SetTensorsName(DataType)
	elif 'Vector' in FileName:
		reader.SetVectorsName(DataType)
		
	reader.Update()

	SelectionList = vtk.vtkDoubleArray()
	SelectionList.SetNumberOfComponents(3) #dimension of the components

	for Location in Locations:
		SelectionList.InsertNextTuple(Location)

	SelectionNode = vtk.vtkSelectionNode() 
	SelectionNode.SetFieldType(vtk.vtkSelectionNode.POINT)
	SelectionNode.SetContentType(vtk.vtkSelectionNode.LOCATIONS)
	SelectionNode.SetSelectionList(SelectionList) 
	Selection = vtk.vtkSelection() 
	Selection.AddNode(SelectionNode) 
	ExtractSelection = vtk.vtkExtractSelection() 
	ExtractSelection.SetInputConnection(0, reader.GetOutputPort()) 
	ExtractSelection.SetInputData(1,Selection)
	ExtractSelection.Update()
	Selected = vtk.vtkUnstructuredGrid()
	Selected.ShallowCopy(ExtractSelection.GetOutput())
	PointData = Selected.GetPointData()
	
	if 'Scalar' in FileName:
		Data = vtk_to_numpy(PointData.GetScalars())
	elif 'Tensor' in FileName:
		Data = vtk_to_numpy(PointData.GetTensors())
	elif 'Vector' in FileName:
		Data = vtk_to_numpy(PointData.GetVectors())
	
	return Data
		
-------------- next part --------------
A non-text attachment was scrubbed...
Name: testScalar.vtk
Type: application/octet-stream
Size: 231 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/vtk-developers/attachments/20171201/e157fa3e/attachment.obj>


More information about the vtk-developers mailing list