vtk_viewer.cpp
Go to the documentation of this file.
00001 /*
00002  * Software License Agreement (BSD License)
00003  *
00004  *  Copyright (c) 2010, Willow Garage, Inc.
00005  *  All rights reserved.
00006  *
00007  *  Redistribution and use in source and binary forms, with or without
00008  *  modification, are permitted provided that the following conditions
00009  *  are met:
00010  *
00011  *   * Redistributions of source code must retain the above copyright
00012  *     notice, this list of conditions and the following disclaimer.
00013  *   * Redistributions in binary form must reproduce the above
00014  *     copyright notice, this list of conditions and the following
00015  *     disclaimer in the documentation and/or other materials provided
00016  *     with the distribution.
00017  *   * Neither the name of Willow Garage, Inc. nor the names of its
00018  *     contributors may be used to endorse or promote products derived
00019  *     from this software without specific prior written permission.
00020  *
00021  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00022  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00023  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00024  *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00025  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00026  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00027  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00028  *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00029  *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00030  *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00031  *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00032  *  POSSIBILITY OF SUCH DAMAGE.
00033  *
00034  */
00035 
00044 #include <iostream>
00045 #include <string>
00046 #include <vector>
00047 #include <math.h>
00048 #include <sstream>
00049 
00050 //terminal_tools includes  
00051 #include <terminal_tools/print.h>
00052 #include <terminal_tools/parse.h>
00053 #include <terminal_tools/time.h>
00054 
00055 #include <vtk3DSImporter.h>
00056 #include <vtkDataSet.h>
00057 #include <vtkRenderer.h>
00058 #include <vtkSmartPointer.h>
00059 #include <vtkPolyData.h>
00060 #include <vtkPolyDataReader.h>
00061 #include <vtkDataSetMapper.h>
00062 #include <vtkMaskPoints.h>
00063 #include <vtkLODActor.h> 
00064 #include <vtkFloatArray.h>
00065 #include <vtkPointData.h> 
00066 #include <vtkVectorText.h> 
00067 #include <vtkPolyDataMapper.h> 
00068 #include <vtkFollower.h> 
00069 #include <vtkLightKit.h> 
00070 
00071 #include <pcl_vtk_tools/misc.h>
00072 
00073 using namespace std;
00074 using terminal_tools::print_color;
00075 using terminal_tools::print_error;
00076 using terminal_tools::print_warn;
00077 using terminal_tools::print_info;
00078 using terminal_tools::print_debug;
00079 using terminal_tools::print_value;
00080 using terminal_tools::print_highlight;
00081 using terminal_tools::TT_BRIGHT;
00082 using terminal_tools::TT_RED;
00083 using terminal_tools::TT_GREEN;
00084 using terminal_tools::TT_BLUE;
00085 
00086 #define SQR(x) ((x)*(x))
00087 //  dataPruner->PointMergingOn ();
00088 
00090 void
00091 GetRandomColors (double &r, double &g, double &b)
00092 {
00093   r = (double)(rand () / (RAND_MAX + 1.0));
00094   g = (double)(rand () / (RAND_MAX + 1.0));
00095   b = (double)(rand () / (RAND_MAX + 1.0));
00096   print_warn (stderr, "Using the following random colors: [");
00097   print_value (stderr, "%g", r); print_warn (stderr, ",");
00098   print_value (stderr, "%g", g); print_warn (stderr, ",");
00099   print_value (stderr, "%g", b);
00100   print_warn (stderr, "] as foreground color.\n");
00101 }
00102 
00103 /* ---[ */
00104 int
00105 main (int argc, char** argv)
00106 {
00107   terminal_tools::TicToc tictoc;
00108   srand ((unsigned)time (0));
00109   vector<int> pFileIndices;
00110 
00111   vector<int> psize;
00112   double scale = 0.0;
00113   bool lut_enable = false;
00114   bool lod_enable = false;
00115   bool cell_scalar = false;
00116   bool no_shadows = false;
00117 
00118   if (argc < 2)
00119   {
00120     print_error (stderr, "Syntax is: %s [fileName1..N] <options>\n", argv[0]);
00121     fprintf (stderr, "  where options are: -fc r,g,b = foreground color\n");
00122     fprintf (stderr, "                     -ps X     = point size\n");
00123     fprintf (stderr, "                     -lw X     = line width\n");
00124     fprintf (stderr, "                     -sc X     = add X to scale the color (useful when using remission/distance)\n");
00125     fprintf (stderr, "                     -lod 0/1  = use a LOD (Level Of Detail) actor instead (enabled by default)\n");
00126     fprintf (stderr, "                     -text X   = add point indices as text labels with size as X * BB_DIAM (disabled by default)\n");
00127     fprintf (stderr, "                     -minmaxIdx N,M  = use a minimum/maximum threshold for indices to be shown. OPTIONAL\n");
00128     fprintf (stderr, "                     -lut_enable 0/1 = add a color rainbow legend (disabled by default)\n");
00129     fprintf (stderr, "                     -save_cam 0/1   = save the last camera position to file on exit (default "); print_value (stderr, "enabled"); fprintf (stderr, ")\n");
00130     fprintf (stderr, "                     -movie 0/1      = {dis/en}able movie mode (default "); print_value (stderr, "disabled"); fprintf (stderr, ")"); print_error (stderr, " NOTE: resolution set at 640x480!\n");
00131     fprintf (stderr, "                     -cell 0/1       = put colors as scalars for cell data (1) or point data (0) (default : "); print_value (stderr, "point"); fprintf (stderr, ")\n");
00132     fprintf (stderr, "                     -no_shadows 0/1 = turns shadows off (default : "); print_value (stderr, "disabled"); fprintf (stderr, ")\n");
00133     fprintf (stderr, "\n");
00134     fprintf (stderr, "                     -play   0/1    = replays the events and motions specified in the given <logdata.log> file\n");
00135     //  _print_default_CommonVTK_options_ ();
00136     return (-1);
00137   }
00138   int minIdx = 0, maxIdx = INT_MAX;
00139   terminal_tools::parse_2x_arguments (argc, argv, "-minmaxIdx", minIdx, maxIdx);
00140   
00141   bool play = false;
00142   terminal_tools::parse_argument (argc, argv, "-play", play);
00143   std::vector<int> pLogFileIndices;
00144   if (play)
00145   {
00146     pLogFileIndices = terminal_tools::parse_file_extension_argument (argc, argv, ".log");
00147     if (pLogFileIndices.size () != 1)
00148     {
00149       print_error (stderr, "Need exactly 1 logfile!\n"); 
00150       return (-1);
00151     }
00152   }
00153   bool save_camera_position = true;
00154   terminal_tools::parse_argument (argc, argv, "-save_cam", save_camera_position);
00155   terminal_tools::parse_argument (argc, argv, "-cell", cell_scalar);
00156   terminal_tools::parse_argument (argc, argv, "-no_shadows", no_shadows);
00157   
00158   double text = 0;
00159   terminal_tools::parse_argument (argc, argv, "-text", text);
00160   int movieMode = 0;
00161   terminal_tools::parse_argument (argc, argv, "-movie", movieMode);
00162   const char* movieFile = "output.avi";
00163 
00164   double fcolor[3] = {0.9, 0.9, 0.9};
00165   std::vector<double> fcolorR, fcolorB, fcolorG;
00166   bool fcolorparam = terminal_tools::parse_multiple_3x_arguments (argc, argv, "-fc", fcolorR, fcolorG, fcolorB);
00167    
00168   double line_width = -1;
00169   terminal_tools::parse_argument (argc, argv, "-lw", line_width);
00170   terminal_tools::parse_multiple_arguments (argc, argv, "-ps", psize);
00171   terminal_tools::parse_argument (argc, argv, "-sc", scale);
00172   terminal_tools::parse_argument (argc, argv, "-lut", lut_enable);
00173   terminal_tools::parse_argument (argc, argv, "-lod", lod_enable);
00174   if (lod_enable)
00175     print_info (stdout, "LOD enabled.\n");
00176 
00177   // Parse the command line arguments for .vtk or .ply files
00178   pFileIndices = terminal_tools::parse_file_extension_argument (argc, argv, ".vtk");;
00179   //TODO: implement parser for ply too
00180 
00181   vtkSmartPointer<vtkPolyData> data;
00182   
00183   // Create Renderer
00184   vtkRenderer* ren = vtkRenderer::New ();
00185   //ren->AutomaticLightCreationOff ();
00186   
00187   // Fix the PSize bug
00188   if (psize.size () != pFileIndices.size ())
00189     for (unsigned int i = psize.size (); i < pFileIndices.size (); i++)
00190       psize.push_back (1);
00191 
00192   // Create the dataset files
00193   for (unsigned int i = 0; i < pFileIndices.size (); i++)
00194   {
00195     vtkActor *dataActor;
00196     double minmax[2];
00197     print_info (stderr, "Loading ");
00198     print_value (stderr, "%s ... ", argv[pFileIndices.at(i)]);
00199     tictoc.tic ();
00200     if (pFileIndices.size() != 0)
00201     {
00202       data = load_poly_data_as_data_set(argv[pFileIndices.at (i)]);
00203       //stringstream filename_stream;
00204       //filename_stream << argv[pFileIndices.at (0)];
00205       //filename = filename_stream.str();
00206       print_info ("Loading vtk model with %d vertices/points.", (int)data->GetNumberOfPoints ());
00207     }
00208 
00209     data->GetScalarRange (minmax);
00210     //  data->GetPointData ()->GetScalars ()->SetLookupTable (lut);
00211     data->Update ();
00212     fprintf (stderr, "[done, "); print_value (stderr, "%g", tictoc.toc ()); fprintf (stderr, " seconds : "); print_value (stderr, "%d", data->GetNumberOfPoints ()); fprintf (stderr, " 3D points]\n");
00213 
00214     // If no scalars, select the colors ourselves
00215     if ((minmax[0] == 0) && (minmax[1] == 1))
00216     {
00217       if (!fcolorparam)
00218         GetRandomColors (fcolor[0], fcolor[1], fcolor[2]);
00219       // Color parameters given
00220       else
00221             {
00222               // Do we have enough parameters for every point cloud ?
00223               if (fcolorR.size () > i)
00224         {
00225           fcolor[0] = fcolorR[i];
00226           fcolor[1] = fcolorG[i];
00227           fcolor[2] = fcolorB[i];
00228         }
00229               // No, select a random color for this one
00230               else
00231           GetRandomColors (fcolor[0], fcolor[1], fcolor[2]);
00232             }
00233 
00234       //dataActor = createActorFromDataSet (data[i], fcolor[0], fcolor[1], fcolor[2], psize[i], lod_enable);
00235       dataActor = create_actor_from_data_set(data, fcolor[0], fcolor[1], fcolor[2], psize[i], lod_enable);
00236     }
00237     else
00238     {
00239       print_info (stderr, "Scalar values found for %s: ", argv[pFileIndices.at (i)]);
00240       print_value (stderr, "%g", minmax[0]); fprintf (stderr, " -> ");
00241       print_value (stderr, "%g\n", minmax[1]);
00242 
00243       // Still, if the foreground color is given, overwrite the scalar values
00244       //      if (fcolorparam)
00245       //        dataActor = createActorFromDataSet (data[i], fcolor, psize[i], false);
00246       // Display the colors using a Lookup table for the scalar values
00247       //      else
00248       {
00249         vtkSmartPointer<vtkLookupTable> lut = create_LUT (minmax, argc, argv);
00250 
00251         if (lut_enable)
00252           ren->AddActor (create_scalar_bar_actor (lut, argc, argv));
00253         
00254         //Create the data actor 
00255         if (scale > 0)
00256         {
00257           vtkFloatArray *distances = (vtkFloatArray*)data->GetPointData ()->GetScalars ();
00258           for (long int j = 0; j < distances->GetNumberOfTuples (); j++)
00259           {
00260             double c[1];
00261             distances->GetTuple (j, c);
00262             c[0] += scale;
00263             distances->SetTuple (j, c);
00264           }
00265           
00266           data->GetPointData ()->SetScalars (distances);
00267         }
00268         dataActor = create_actor_from_data_set (data, psize[i], lut, minmax, lod_enable);
00269         if (cell_scalar)
00270           dataActor->GetMapper ()->SetScalarModeToUseCellData ();
00271         //dataActor = create_actor_from_data_set (data, psize, lod_enable);
00272       }
00273     }
00274     dataActor->GetProperty ()->SetRepresentationToPoints ();
00275     
00276     // Disable shadows if necessary
00277     if (no_shadows)
00278     {
00279       dataActor->GetProperty ()->ShadingOff (); // is this needed?
00280       dataActor->GetProperty ()->SetAmbient (1);
00281       dataActor->GetProperty ()->SetDiffuse (0);
00282     }
00283 
00284     if (line_width != -1)
00285       dataActor->GetProperty ()->SetLineWidth (line_width);
00286     
00287     ren->AddActor (dataActor);
00288     
00289     if ((text > 0) && (i == 0))
00290     {
00291       char idx[10];
00292       //vtkPolyData* polydata=reinterpret_cast<vtkPolyData*>(data);
00293       double bounds[6];
00294       data->GetBounds (bounds);
00295       double text_scale = text * sqrt ( SQR(bounds[0]-bounds[1]) + SQR(bounds[2]-bounds[3]) +SQR(bounds[4]-bounds[5]) );
00296       double point[3];
00297       int start = max (minIdx, 0);
00298       int stop = min (maxIdx, int(data->GetNumberOfPoints ())-1);
00299       print_info (stderr, "Labeling points with their indices in ");
00300       print_value (stderr, "[%d,%d]\n", start, stop);
00301       for (int j = start; j <= stop; j++)
00302       {
00303         data->GetPoint (j, point);
00304         sprintf (idx, "%d", j);
00305         vtkVectorText *atext = vtkVectorText::New ();
00306         atext->SetText (idx);
00307         vtkPolyDataMapper *textMapper = vtkPolyDataMapper::New ();
00308         textMapper->SetInputConnection (atext->GetOutputPort ());
00309         vtkFollower *textActor = vtkFollower::New ();
00310         textActor->SetMapper (textMapper);
00311         textActor->SetScale (text_scale);
00312         textActor->SetPosition (point[0], point[1], point[2]);
00313         //textActor->AddPosition (0, -0.1, 0);
00314         textActor->SetCamera (ren->GetActiveCamera ());
00315         ren->AddActor (textActor);
00316       }
00317     }
00318   }
00319 
00320   vtkLightKit* lightKit = vtkLightKit::New ();
00321   lightKit->AddLightsToRenderer (ren);
00322 
00323   // Create the VTK window
00324   char title[256];
00325   if (pFileIndices.size () == 1)
00326     sprintf (title, "3D PointCloud viewer - %s", argv[pFileIndices.at (0)]);
00327   else
00328     sprintf (title, "3D PointCloud viewer");
00329   vtkRenderWindowInteractor* iren;
00330   //   if (movieMode)
00331   //   {
00332   //     print_info (stderr, "Movie file is being written to: ");
00333   //     print_value (stderr, "%s\n", movieFile);
00334   // //    iren = CreatePerspectiveRenderWindowAndInteractorMovie (ren, title, movieFile, 44.382, argc, argv, 2);
00335   //     iren = CreateRenderWindowAndInteractorMovie (ren, title, movieFile, argc, argv, 2);
00336   //   }
00337   //   elses
00338   iren = CreateRenderWindowAndInteractor (ren, title, argc, argv);
00339 
00340   vtkSmartPointer<vtkInteractorStyleTUM> style = (vtkSmartPointer<vtkInteractorStyleTUM>)reinterpret_cast<vtkInteractorStyleTUM*>(iren->GetInteractorStyle ());
00341   style->setAdvancedMode (true);
00342   
00343   if (play)
00344   {
00345     vtkSmartPointer<vtkInteractorEventRecorder> recorder = vtkSmartPointer<vtkInteractorEventRecorder>::New ();
00346     recorder->SetInteractor (iren);
00347     recorder->SetFileName (argv[pLogFileIndices.at (0)]);
00348     recorder->SetEnabled (1);
00349     recorder->Play ();
00350   }
00351   
00352   iren->Start ();
00353   //   if (save_camera_position)
00354   //     SaveCameraPosition (ren->GetActiveCamera (), false);
00355 }
00356 /* ]--- */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Properties Friends Defines


pcl_vtk_tools
Author(s): Nico Blodow, Zoltan-Csaba Marton, Dejan Pangercic
autogenerated on Sun Oct 6 2013 12:08:54