Quantcast

vtkContourFilter

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

vtkContourFilter

c674
Hi,

I've been posting this question in the developers list by accident, sorry for that - and thanks to David for his answer.
What I am trying to do is put a surface over data in an unstructured grid, containing cubes with cell data. My code looks like this:

        vtkUnstructuredGridReader* reader = vtkUnstructuredGridReader::New();
        reader->SetFileName("test_input.vtk");
        reader->Update();
        vtkCellDataToPointData* conv = vtkCellDataToPointData::New();
        conv->SetInput(reader->GetOutput());
        vtkContourFilter* contour = vtkContourFilter::New();
        contour->SetInput(conv->GetOutput());
        contour->SetValue(0,1);
  vtkPolyDataWriter* writer = vtkPolyDataWriter::New();
        writer->SetFileName("test_output.vtk");
        ostream *file= writer->OpenVTKFile();
        writer->WriteHeader(file);
        writer->SetInputConnection(contour->GetOutputPort());
        writer->Write();
        writer->CloseVTKFile(file);

Unfortunately my output file does not contain any data. The cell data is in the range from 0 to 40. Does this give a hint on how to chose my isovalue? I've played with that value a lot, without success.
When replacing the vtkCellDataToPointData with a vtkSurfaceReconstructionFilter I get output for isovalues between 1 and 3, I'm not satisfied with the look of the output though and I want it to work without that filter.
What is the role of the isovalue anyways? I thought it was no more than some kind of threshold, to decide which points are taken into account - but then isovalues between 0 and 40 should give output, shouldn't they?

I appreciate any help!
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: vtkContourFilter

c674
Found out about the vtkImplicitModeller, replaced the vtkCellDataToPontData with it and am satisfied with the result.
What I dislike though, is that the contoured polydata contains the isovalue as scalar value and not the isovalue the cells had before. I could change the isovalue of course, but the generated surface looks best with an isovalue of 1. Therefore I want to change the scalar values to a specified value, for example 16. Unfortunately GetNumberOfTuples() in the following code gives me a segmentation fault. What do I do wrong or is there another more efficient way to accomplish this?

  vtkContourFilter* contour = vtkContourFilter::New();
  contour->SetInputConnection(im->GetOutputPort());
  contour->SetValue(0,1);
 
  vtkPolyData* polyData = contour->GetOutput();
  vtkCellData* cellData = polyData->GetCellData();
  vtkDataArray* colors = cellData->GetScalars();
  for(int i=0; i<colors->GetNumberOfTuples(); i++)
     colors->SetComponent(i,0,16);

Thanks in advance

c674 wrote
What I am trying to do is put a surface over data in an unstructured grid, containing cubes with cell data. My code looks like this:

        vtkUnstructuredGridReader* reader = vtkUnstructuredGridReader::New();
        reader->SetFileName("test_input.vtk");
        reader->Update();
        vtkCellDataToPointData* conv = vtkCellDataToPointData::New();
        conv->SetInput(reader->GetOutput());
        vtkContourFilter* contour = vtkContourFilter::New();
        contour->SetInput(conv->GetOutput());
        contour->SetValue(0,1);
  vtkPolyDataWriter* writer = vtkPolyDataWriter::New();
        writer->SetFileName("test_output.vtk");
        ostream *file= writer->OpenVTKFile();
        writer->WriteHeader(file);
        writer->SetInputConnection(contour->GetOutputPort());
        writer->Write();
        writer->CloseVTKFile(file);

Unfortunately my output file does not contain any data. The cell data is in the range from 0 to 40. Does this give a hint on how to chose my isovalue? I've played with that value a lot, without success.
When replacing the vtkCellDataToPointData with a vtkSurfaceReconstructionFilter I get output for isovalues between 1 and 3, I'm not satisfied with the look of the output though and I want it to work without that filter.
What is the role of the isovalue anyways? I thought it was no more than some kind of threshold, to decide which points are taken into account - but then isovalues between 0 and 40 should give output, shouldn't they?
Loading...