Madz
Madz

Reputation: 1279

Read/Write vtk file not displaying properly

I Have an unstructured grid that which I need to write into a file and open elsewhere. The original file looks like this;

Original file

When I write the file and read it again, it displays as following,

File read from the written one The code for writing the file is;

    std::string filename = "ouputTest.vtu";

    //pre-constructed grid
    (vtkSmartPointer<vtkUnstructuredGrid>) grid;

    vtkSmartPointer<vtkGeometryFilter> geometryFilter = vtkSmartPointer<vtkGeometryFilter>::New();
    vtkSmartPointer<vtkPolyData> polydata;
    geometryFilter->SetInput(grid);
    geometryFilter->Update();
    polydata = geometryFilter->GetOutput();


    vtkSmartPointer<vtkDoubleArray> tempArray = vtkSmartPointer<vtkDoubleArray>::New();

    for(int i=0;i<4;i++)
    {
            tempArray->InsertNextValue(i/2.5);
    }
    polydata->GetPointData()->SetScalars(tempArray);
    grid->GetPointData()->SetScalars(tempArray);


    vtkSmartPointer<vtkLookupTable> colorLookupTable = vtkSmartPointer<vtkLookupTable>::New();

    colorLookupTable->SetTableRange(-100,500);
    double vmin,vmax;
    colorLookupTable->GetHueRange(vmin,vmax);
    if(vmin!=vmax)
    {
            colorLookupTable->SetHueRange(0.6667,0.0);
    }
    colorLookupTable->Build();

    vtkSmartPointer<vtkContourFilter> contourFilter = vtkSmartPointer<vtkContourFilter>::New();
    contourFilter->SetInputConnection(polydata->GetProducerPort());
    contourFilter->ComputeScalarsOn();
    contourFilter->GenerateValues(10,-100,500);

    vtkSmartPointer<vtkPolyDataMapper> mapper1 = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper1->SetInputConnection(contourFilter->GetOutputPort());
    mapper1->SetScalarRange(-100,500);
    mapper1->SetLookupTable(colorLookupTable);
    mapper1->ScalarVisibilityOn();

    vtkSmartPointer<vtkActor> actor1 = vtkSmartPointer<vtkActor>::New();
    actor1->SetMapper(mapper1);

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInput(polydata);
    mapper->ScalarVisibilityOn();
    mapper->InterpolateScalarsBeforeMappingOn();
    mapper->SetLookupTable(colorLookupTable);
    mapper->SetScalarRange(-100,500);

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    // Visualize
    vtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderer->AddActor(actor1);
    renderer->AddActor(actor);
    renderer->SetBackground(.3, .6, .3); // Background color green

    // Write file
    vtkSmartPointer<vtkXMLUnstructuredGridWriter> writer =
            vtkSmartPointer<vtkXMLUnstructuredGridWriter>::New();
    writer->SetFileName(filename.c_str());
 #if VTK_MAJOR_VERSION <= 5
    writer->SetInput(grid);
 #else
    writer->SetInputData(grid);
 #endif
    writer->SetDataModeToAscii();
    writer->Write();
    renderWindow->Render();
    renderWindowInteractor->Start(); 

The code for reading the file is;

std::string filename = "ouputTest.vtu";
vtkSmartPointer reader = vtkSmartPointer::New();

    reader->SetFileName(filename.c_str());
    reader->Update();

    vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New();
    mapper->SetInputConnection(reader->GetOutputPort());

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderer->AddActor(actor);
    renderer->SetBackground(1, 1, 1);
    renderWindow->Render();
    renderWindowInteractor->Start(); 

What should I do to make it appear as the original. I don't know if the problem is with the file writing or reading. Any help would be appreciated. Thanks.

Upvotes: 0

Views: 890

Answers (1)

El Marce
El Marce

Reputation: 3344

When you load, make sure of the following:

  1. You have a visualization pipeline similar than the one you initially created. (Contour filter and similar Look Up Table)
  2. The scalars are loaded (you may know this using the PrintSelf Method of the reader's output: reader->GetDataObject(0)->PrintSelf()). Check out the scalars have same elements as before saving.

Upvotes: 1

Related Questions