#include "vtkRenderer.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkDataSetReader.h" #include "vtkLookupTable.h" #include "vtkPolyDataMapper.h" #include "vtkActor.h" #include "vtkProperty.h" #include "vtkContourFilter.h" #include "vtkStructuredGridReader.h" #include "vtkDataSet.h" #include "vtkImageMapper.h" #include "vtkImageActor.h" #include "vtkPolyDataNormals.h" #include "vtkIVExporter.h" #include "vtkSAVGExporter.h" #include "vtkReverseSense.h" #include "vtkWindowedSincPolyDataFilter.h" #include "vtkDataSet.h" #include "vtkPolyData.h" #include "vtkGeometryFilter.h" #include "vtkCellArray.h" int main( int argc, char *argv[] ) { // first make sure there are enough parameters if (argc < 11) { // every parameter must be there std::cerr << "Usage: hev-vtkContour outFormat vtkFile outFile cValue r g b a revFlag fraction\n"<< std::endl; std::cerr << "outFormat is savg or iv to specify savg or Inventor output\n"<< std::endl; std::cerr << "vtkFile input VTK file\n"<< std::endl; std::cerr << "outFile output file\n"<< std::endl; std::cerr << "cValue is the contour value to use.\n"<< std::endl; std::cerr << "r g b a are optional color values for the output contours. If not specified, 1 1 1 1, is used.\n"<< std::endl; std::cerr << "revFlag is 0 or 1 to specify if the coordinates of the polygons produced by hev-vtkContour should be reversed.\n"<< std::endl; std::cerr << "fraction is a value in the range 0.0 to 1.0 to indicate a polygon reduction fraction. 0.0 indicates no reduction, 1.0 total reduction.\n" << std::endl; return 1; } // vtk file name char vfile[250]; strcpy(vfile, argv[2]); printf("vfile: %s\n",vfile); // output file name char ivfile[250]; strcpy(ivfile, argv[3]); printf("ivfile: %s\n",ivfile); // contour isovalue float cvalue = atof(argv[4]); printf("contour value: %f\n",cvalue); // the rgba is there if there are 4 more parameters (at least 9) float r,g,b,a; r = atof(argv[5]); g = atof(argv[6]); b = atof(argv[7]); a = atof(argv[8]); int doReverse = atoi(argv[9]); float fraction = atof(argv[10]); printf("do reverse is: %d\n",doReverse); int doReduction = 0; if (fraction > 0.01) doReduction = 1; vtkRenderer *ren1 = vtkRenderer::New(); vtkRenderWindow *renWin = vtkRenderWindow::New(); renWin->AddRenderer(ren1); vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New(); iren->SetRenderWindow(renWin); renWin->SetSize( 300, 300 ); vtkDataSetReader *reader = vtkDataSetReader::New(); reader->SetFileName(vfile); reader->Update(); vtkContourFilter *iso = vtkContourFilter::New(); iso->SetInput(reader->GetOutput()); iso->SetValue(0, cvalue); iso->ComputeScalarsOff(); iso->ComputeGradientsOff(); //vtkDecimate *decim = vtkDecimate::New(); vtkWindowedSincPolyDataFilter *wsp = vtkWindowedSincPolyDataFilter::New(); vtkPolyDataNormals *normals = vtkPolyDataNormals::New(); vtkPolyData *pd; vtkGeometryFilter *gf = NULL; vtkCellArray *verts; vtkCellArray *lines; vtkCellArray *polys; vtkCellArray *strips; // make sure there is geometry before decimate routine or normals gf = vtkGeometryFilter::New(); gf->SetInput(iso->GetOutput()); pd = gf->GetOutput(); verts = pd->GetVerts(); lines = pd->GetLines(); polys = pd->GetPolys(); strips = pd->GetStrips(); vtkIdType numCells = verts->GetNumberOfCells(); numCells += lines->GetNumberOfCells(); numCells += polys->GetNumberOfCells(); numCells += strips->GetNumberOfCells(); vtkReverseSense *reverse = vtkReverseSense::New(); vtkPolyDataMapper *planeMapper = vtkPolyDataMapper::New(); normals->SetInput(iso->GetOutput() ); if (doReverse > 0) { reverse->SetInput(normals->GetOutput()); reverse->ReverseCellsOn(); reverse->ReverseNormalsOn(); planeMapper->SetInput( reverse->GetOutput() ); } else { planeMapper->SetInput( normals->GetOutput() ); } planeMapper->SetScalarRange( 0.0, 1.0 ); planeMapper->ScalarVisibilityOn(); vtkActor *planeActor = vtkActor::New(); planeActor->SetMapper( planeMapper ); planeActor->GetProperty()->SetColor(r,g,b); planeActor->GetProperty()->SetOpacity(a); ren1->SetBackground(1,1,1); ren1->AddProp(planeActor); vtkIVExporter *ivexp = vtkIVExporter::New(); vtkSAVGExporter *savgexp = vtkSAVGExporter::New(); if (strcasecmp(argv[1],"iv")==0) { ivexp->SetRenderWindow(renWin); ivexp->SetFileName(ivfile); ivexp->Write(); } if (strcasecmp(argv[1],"savg")==0) { savgexp->SetRenderWindow(renWin); savgexp->SetFileName(ivfile); savgexp->Write(); } // Clean up ren1->Delete(); renWin->Delete(); iren->Delete(); planeMapper->Delete(); planeActor->Delete(); return 0; }