I'm writing a program that samples points from a VTKUnstructuredGrid
dataset by using calls to vtkDataSet::FindPoint(). Every call to
FindPoint results in a segmentation fault. Any help would be
appreciated.<br><br>John<br>
<br>[code]<br>#include <sstream><br>#include <iostream><br><br>#include <cstddef><br>#include "vtkDataSetReader.h"<br>#include "vtkSmartPointer.h"<br>#include "vtkDataSet.h"<br>
#include "vtkGenericCell.h"<br>#include "vtkPointData.h"<br><br>class vtkBlenderTexture<br>{<br> private:<br> vtkSmartPointer <vtkDataSet> dataset;<br> int dims[3];<br> <br>
void load_vtk(char* filename);<br> char vtkfilename[240];<br> vtkGenericCell *gencell;<br> <br> public:<br> <br> vtkBlenderTexture();<br> <br> double SamplePoint(double x, double y, double z, int array);<br>
<br> void SetInputFilename(char* filename);<br> <br> char* GetInputFilename();<br>};<br><br>void vtkBlenderTexture::load_vtk(char filename[240])<br> {<br> strcpy(vtkfilename,filename);<br>
vtkSmartPointer<vtkDataSetReader> reader = vtkSmartPointer<vtkDataSetReader>::New();<br> reader->SetFileName(filename);<br> if(reader->IsFileValid("unstructured_grid")||reader->IsFileValid("structured_grid"))<br>
{<br> reader->Update();<br> dataset=reader->GetOutput();<br> cout << "Done reading "<< filename <<endl;<br> }<br> else<br>
{<br> cout << "Invalid VTK file "<<filename<<endl;<br> dataset=NULL;<br> }<br> }<br> <br>vtkBlenderTexture::vtkBlenderTexture()<br>
{<br> gencell = vtkGenericCell::New();<br> }<br> <br>double vtkBlenderTexture::SamplePoint(double x, double y, double z, int array)<br> {<br> double value=0;<br> if(dataset!=NULL)<br>
{<br> double pos[3]={x,y,z};<br> double pcoords[3];<br> vtkIdType cellId=NULL;<br> int subId;<br> double * weights;<br> cellId = dataset->FindCell(pos,NULL,gencell,cellId,0.01,subId,pcoords,weights);<br>
if(cellId>=0)<br> {<br> vtkIdList*pointIds;<br> dataset->GetCellPoints(cellId,pointIds);<br> value = dataset->GetPointData()->GetScalars()->GetComponent(pointIds->GetId(0),array);<br>
}<br> }<br> <br> return value;<br> }<br> <br>void vtkBlenderTexture::SetInputFilename(char filename[240])<br> {<br> load_vtk(filename);<br>
}<br> <br>char* vtkBlenderTexture::GetInputFilename()<br> {<br> return vtkfilename;<br> }<br><br><br>int main( int argc, const char* argv[] )<br>{<br> vtkBlenderTexture * texobj = new vtkBlenderTexture();<br>
<br> char filename[240]="/home/haiduced/PumpStudy/pumpstudy.vtk";<br> texobj->SetInputFilename(filename);<br> double value = texobj->SamplePoint(0.01, 0, 0,0);<br> cout << value << endl;<br>
return 0;<br>}<br>[/code]