template <typename PointT> bool pcl::visualization::PCLHistogramVisualizer::addFeatureHistogram ( const pcl::PointCloud<PointT> &cloud, int hsize, const std::string &id, int win_width, int win_height) { RenWinInteractMap::iterator am_it = wins_.find (id); if (am_it != wins_.end ()) { PCL_WARN ("[addFeatureHistogram] A window with id <%s> already exists! Please choose a different id and retry.\n", id.c_str ()); return (false); } vtkSmartPointer<vtkDoubleArray> xy_array = vtkSmartPointer<vtkDoubleArray>::New (); xy_array->SetNumberOfComponents (2); xy_array->SetNumberOfTuples (hsize); // Parse the cloud data and store it in the array double xy[2]; for (int d = 0; d < hsize; ++d) { xy[0] = d; xy[1] = cloud.points[0].histogram[d]; xy_array->SetTuple (d, xy); } RenWinInteract renwinint; createActor (xy_array, renwinint, id, win_width, win_height); // Save the pointer/ID pair to the global window map wins_[id] = renwinint; #if ((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION <= 4)) resetStoppedFlag (); #endif return (true); }
/** \brief Spin once method. Calls the interactor and updates the screen once. */ void pcl::visualization::PCLHistogramVisualizer::spinOnce (int time, bool force_redraw) { resetStoppedFlag (); if (time <= 0) time = 1; if (force_redraw) { for (RenWinInteractMap::iterator am_it = wins_.begin (); am_it != wins_.end (); ++am_it) { (*am_it).second.interactor_->Render (); exit_main_loop_timer_callback_->right_timer_id = (*am_it).second.interactor_->CreateRepeatingTimer (time); exit_main_loop_timer_callback_->interact = (*am_it).second.interactor_; (*am_it).second.interactor_->Start (); (*am_it).second.interactor_->DestroyTimer (exit_main_loop_timer_callback_->right_timer_id); } return; } for (RenWinInteractMap::iterator am_it = wins_.begin (); am_it != wins_.end (); ++am_it) { DO_EVERY(1.0/(*am_it).second.interactor_->GetDesiredUpdateRate (), (*am_it).second.interactor_->Render (); exit_main_loop_timer_callback_->right_timer_id = (*am_it).second.interactor_->CreateRepeatingTimer (time); exit_main_loop_timer_callback_->interact = (*am_it).second.interactor_; (*am_it).second.interactor_->Start (); (*am_it).second.interactor_->DestroyTimer (exit_main_loop_timer_callback_->right_timer_id); ); }
pcl::visualization::PCLHistogramVisualizer::PCLHistogramVisualizer () : exit_main_loop_timer_callback_ (vtkSmartPointer<ExitMainLoopTimerCallback>::New ()), exit_callback_ (vtkSmartPointer<ExitCallback>::New ()) { #if ((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION <= 4)) resetStoppedFlag (); #endif }
template <typename PointT> bool pcl::visualization::PCLHistogramVisualizer::addFeatureHistogram ( const pcl::PointCloud<PointT> &cloud, const std::string &field_name, const int index, const std::string &id, int win_width, int win_height) { if (index < 0 || index >= cloud.points.size ()) { PCL_ERROR ("[addFeatureHistogram] Invalid point index (%d) given!\n", index); return (false); } // Get the fields present in this cloud std::vector<sensor_msgs::PointField> fields; // Check if our field exists int field_idx = pcl::getFieldIndex<PointT> (cloud, field_name, fields); if (field_idx == -1) { PCL_ERROR ("[addFeatureHistogram] The specified field <%s> does not exist!\n", field_name.c_str ()); return (false); } RenWinInteractMap::iterator am_it = wins_.find (id); if (am_it != wins_.end ()) { PCL_WARN ("[addFeatureHistogram] A window with id <%s> already exists! Please choose a different id and retry.\n", id.c_str ()); return (false); } vtkSmartPointer<vtkDoubleArray> xy_array = vtkSmartPointer<vtkDoubleArray>::New (); xy_array->SetNumberOfComponents (2); xy_array->SetNumberOfTuples (fields[field_idx].count); // Parse the cloud data and store it in the array double xy[2]; for (int d = 0; d < fields[field_idx].count; ++d) { xy[0] = d; //xy[1] = cloud.points[index].histogram[d]; float data; memcpy (&data, (const char*)&cloud.points[index] + fields[field_idx].offset + d * sizeof (float), sizeof (float)); xy[1] = data; xy_array->SetTuple (d, xy); } RenWinInteract renwinint; createActor (xy_array, renwinint, id, win_width, win_height); // Save the pointer/ID pair to the global window map wins_[id] = renwinint; #if ((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION <= 4)) resetStoppedFlag (); #endif return (true); }