[vtkusers] using vtkSmoothPolyDataFilter with...errr... polydata?

Paul McIntosh paul.mcintosh at monash.edu
Fri Aug 30 20:48:21 EDT 2013


Hi All, 

I have a dumb question - how do I used vtkSmoothPolyDataFilter with...errr... polydata? 

I am trying to do the equivalent of : 
http://www.paraview.org/Wiki/VTK/Examples/Cxx/PolyData/ConvexHullShrinkWrap 

But instead of using a point source I want to load an STL and get points from that. Seems that vtkSmoothPolyDataFilter only likes vtkAlgorithmOutput and not actual concrete data. Is there an easy way to make this work? 

Here is my code as reference. 

Cheers, 

Paul 


#include <vtkSmartPointer.h> #include <vtkPolyData.h> #include <vtkSphereSource.h> #include <vtkPointSource.h> #include <vtkSmoothPolyDataFilter.h> #include <vtkXMLPolyDataWriter.h> #include <vtkSTLReader.h> #include <vtkActor.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> #include <vtkPolyDataMapper.h> #include <vtkCamera.h> #include <vtkWeightedTransformFilter.h> #include <vtkXMLUnstructuredGridReader.h> #include <vtkUnstructuredGrid.h> #include <vtkXMLPolyDataReader.h> #include <vtkDataSetMapper.h> #include <vtkDataSetSurfaceFilter.h> // C/C++ #include <iostream> #include <sstream> #include <stdio.h> using namespace std ; // just to make things nicer later and save some documentation reading ;) struct boundingBox { double xmin ; double xmax ; double ymin ; double ymax ; double zmin ; double zmax ; }; int main ( int argc , char * argv []) { // check and get options provided if ( argc != 2 ) { cout << "Required parameters:" << endl ; cout << " Filename (Full path to stl file e.g. something.stl)" << endl ; // cout << " Magnification (Image resolution size multipler e.g. 2)" << endl; // cout << " x (x camera offset position from centre)" << endl; // cout << " y (y camera offset position from centre)" << endl; // cout << " z (z camera offset position from centre)" << endl; return EXIT_FAILURE ; } std :: string inputfile = argv [ 1 ]; // Read STL std :: cout << "Reading: " << inputfile << std :: endl ; vtkSmartPointer < vtkSTLReader > stlReader = vtkSmartPointer < vtkSTLReader >:: New (); stlReader -> SetFileName ( inputfile . c_str ()); vtkSmartPointer < vtkPolyData > polydata = vtkSmartPointer < vtkPolyData >:: New (); polydata = stlReader -> GetOutput (); stlReader -> Update (); vtkSmartPointer < vtkDataSetMapper > mapper = vtkSmartPointer < vtkDataSetMapper >:: New (); mapper -> SetInputConnection ( stlReader -> GetOutputPort ()); // the bounding box will tell us where the object is and how big it is... double centre [ 3 ]; double bounds [ 6 ]; double results [ 3 ]; boundingBox boxBounds ; mapper -> GetBounds ( bounds ); mapper -> GetCenter ( centre ); boxBounds . xmin = bounds [ 0 ]; boxBounds . xmax = bounds [ 1 ]; boxBounds . ymin = bounds [ 2 ]; boxBounds . ymax = bounds [ 3 ]; boxBounds . zmin = bounds [ 4 ]; boxBounds . zmax = bounds [ 5 ]; // possibly remesh with finer detail with subdivide filter? // convert to pointset // create sphere around bounds (possibly transformed to a better shape?) // shrinkwrap // spit out the result as an stl std :: cout << "vtkSphereSource: " << std :: endl ; vtkSmartPointer < vtkSphereSource > sphereSource = vtkSmartPointer < vtkSphereSource >:: New (); sphereSource -> SetRadius ( 1000 ); // will calculate this later from bounding box sphereSource -> SetPhiResolution ( 50 ); sphereSource -> SetThetaResolution ( 50 ); sphereSource -> SetCenter ( centre ); sphereSource -> Update (); // vtkSmartPointer<vtkPointSource> pointSource = vtkSmartPointer<vtkPointSource>::New(); // pointSource->SetNumberOfPoints(40); // pointSource->SetRadius(2); // pointSource->Update(); { vtkSmartPointer < vtkXMLPolyDataWriter > writer = vtkSmartPointer < vtkXMLPolyDataWriter >:: New (); writer -> SetFileName ( "input.vtp" ); writer -> SetInputConnection ( sphereSource -> GetOutputPort ()); writer -> Write (); } { vtkSmartPointer < vtkXMLPolyDataWriter > writer = vtkSmartPointer < vtkXMLPolyDataWriter >:: New (); writer -> SetFileName ( "points.vtp" ); writer -> SetInputConnection ( pointSource -> GetOutputPort ()); writer -> Write (); } std :: cout << "ShrinkWrapping: " << inputfile << std :: endl ; vtkSmartPointer < vtkSmoothPolyDataFilter > smoothFilter = vtkSmartPointer < vtkSmoothPolyDataFilter >:: New (); smoothFilter -> SetInputConnection ( 0 , sphereSource -> GetOutputPort ()); //smoothFilter->SetInputConnection(1, pointSource->GetOutputPort()); smoothFilter -> SetInputConnection ( 1 , polydata ); smoothFilter -> Update (); vtkSmartPointer < vtkXMLPolyDataWriter > writer = vtkSmartPointer < vtkXMLPolyDataWriter >:: New (); writer -> SetFileName ( "output.vtp" ); writer -> SetInputConnection ( smoothFilter -> GetOutputPort ()); writer -> Write (); return EXIT_SUCCESS ; } 



-- 

Dr Paul McIntosh 
Senior HPC Consultant, Technical Lead, 
Multi-modal Australian ScienceS Imaging and Visualisation Environment (www.massive.org.au) 
Monash University, Ph: 9902 0439 Mob: 0434 524935 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20130831/c923a56e/attachment.htm>


More information about the vtkusers mailing list