[vtkusers] 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/vtkusers/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/vtkusers/attachments/20171201/e157fa3e/attachment.obj>
    
    
More information about the vtkusers
mailing list