00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 #include <pcl/apps/modeler/main_window.h>
00038 
00039 #include <pcl/apps/modeler/scene_tree.h>
00040 #include <pcl/apps/modeler/dock_widget.h>
00041 #include <pcl/apps/modeler/render_window.h>
00042 #include <pcl/apps/modeler/render_window_item.h>
00043 
00044 #include <QFileInfo>
00045 #include <vtkActor.h>
00046 #include <vtkRenderer.h>
00047 
00048 
00050 pcl::modeler::MainWindow::MainWindow()
00051   : ui_(new Ui::MainWindow)
00052 {
00053   ui_->setupUi(this);
00054 
00055   RenderWindowItem* central_render_window_item = new RenderWindowItem(ui_->scene_tree_);
00056   central_render_window_item->getRenderWindow()->setParent(this);
00057   setCentralWidget(central_render_window_item->getRenderWindow());
00058   ui_->scene_tree_->addTopLevelItem(central_render_window_item);
00059 
00060   connectFileMenuActions();
00061   connectViewMenuActions();
00062   connectEditMenuActions();
00063 
00064   loadGlobalSettings();
00065 
00066   showMaximized();
00067 }
00068 
00070 pcl::modeler::MainWindow::~MainWindow()
00071 {
00072   saveGlobalSettings();
00073 }
00074 
00076 void 
00077 pcl::modeler::MainWindow::connectFileMenuActions()
00078 {
00079   connect(ui_->actionOpenPointCloud, SIGNAL(triggered()), ui_->scene_tree_, SLOT(slotOpenPointCloud()));
00080   connect(ui_->actionImportPointCloud, SIGNAL(triggered()), ui_->scene_tree_, SLOT(slotImportPointCloud()));
00081   connect(ui_->actionSavePointCloud, SIGNAL(triggered()), ui_->scene_tree_, SLOT(slotSavePointCloud()));
00082   connect(ui_->actionClosePointCloud, SIGNAL(triggered()), ui_->scene_tree_, SLOT(slotClosePointCloud()));
00083   connect(ui_->scene_tree_, SIGNAL(fileOpened(QString)), this, SLOT(slotUpdateRecentFile(QString)));
00084   createRecentPointCloudActions();
00085 
00086   connect(ui_->actionOpenProject, SIGNAL(triggered()), this, SLOT(slotOpenProject()));
00087   connect(ui_->actionSaveProject, SIGNAL(triggered()), this, SLOT(slotSaveProject()));
00088   connect(ui_->actionCloseProject, SIGNAL(triggered()), this, SLOT(slotCloseProject()));
00089   createRecentProjectActions();
00090 
00091   connect(ui_->actionExit, SIGNAL(triggered()), this, SLOT(slotExit()));
00092 }
00093 
00095 void 
00096 pcl::modeler::MainWindow::connectViewMenuActions()
00097 {
00098   connect(ui_->actionCreateRenderWindow, SIGNAL(triggered()), this, SLOT(slotCreateRenderWindow()));
00099   connect(ui_->actionCloseRenderWindow, SIGNAL(triggered()), ui_->scene_tree_, SLOT(slotCloseRenderWindow()));
00100 }
00101 
00103 void 
00104 pcl::modeler::MainWindow::connectEditMenuActions()
00105 {
00106   connect(ui_->actionICPRegistration, SIGNAL(triggered()), ui_->scene_tree_, SLOT(slotICPRegistration()));
00107   connect(ui_->actionVoxelGridDownsample, SIGNAL(triggered()), ui_->scene_tree_, SLOT(slotVoxelGridDownsampleFilter()));
00108   connect(ui_->actionStatisticalOutlierRemoval, SIGNAL(triggered()), ui_->scene_tree_, SLOT(slotStatisticalOutlierRemovalFilter()));
00109   connect(ui_->actionEstimateNormals, SIGNAL(triggered()), ui_->scene_tree_, SLOT(slotEstimateNormal()));
00110   connect(ui_->actionPoissonReconstruction, SIGNAL(triggered()), ui_->scene_tree_, SLOT(slotPoissonReconstruction()));
00111 }
00112 
00114 void 
00115 pcl::modeler::MainWindow::slotOpenProject()
00116 {
00117 
00118 }
00119 
00121 void 
00122 pcl::modeler::MainWindow::slotSaveProject()
00123 {
00124 
00125 }
00126 
00128 void 
00129 pcl::modeler::MainWindow::slotCloseProject()
00130 {
00131 
00132 }
00133 
00135 void
00136 pcl::modeler::MainWindow::slotExit() {
00137     saveGlobalSettings();
00138     qApp->exit();
00139 }
00140 
00142 void
00143 pcl::modeler::MainWindow::slotUpdateRecentFile(const QString& filename)
00144 {
00145   recent_files_.removeAll(filename);
00146   recent_files_.prepend(filename);
00147 }
00148 
00150 pcl::modeler::RenderWindowItem*
00151 pcl::modeler::MainWindow::createRenderWindow()
00152 {
00153   DockWidget* dock_widget = new DockWidget(this);
00154   addDockWidget(Qt::RightDockWidgetArea, dock_widget);
00155   dock_widget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
00156 
00157   RenderWindowItem* render_window_item = new RenderWindowItem(ui_->scene_tree_);
00158   render_window_item->getRenderWindow()->setParent(dock_widget);
00159   dock_widget->setWidget(render_window_item->getRenderWindow());
00160   ui_->scene_tree_->addTopLevelItem(render_window_item);
00161 
00162   
00163   QList<QAction *> actions = ui_->menuView->actions();
00164   ui_->menuView->insertAction(actions[actions.size()-2], dock_widget->toggleViewAction());
00165 
00166   return render_window_item;
00167 }
00168 
00170 void
00171 pcl::modeler::MainWindow::slotCreateRenderWindow()
00172 {
00173   createRenderWindow();
00174 
00175   return;
00176 }
00177 
00179 void 
00180 pcl::modeler::MainWindow::slotOpenRecentPointCloud()
00181 {
00182   QAction* action = qobject_cast<QAction*>(sender());
00183   if (action)
00184     ui_->scene_tree_->openPointCloud(action->data().toString());
00185 
00186   return;
00187 }
00188 
00190 void 
00191 pcl::modeler::MainWindow::slotOpenRecentProject()
00192 {
00193   QAction* action = qobject_cast<QAction*>(sender());
00194   if (action)
00195     openProjectImpl(action->data().toString());
00196 
00197   return;
00198 }
00199 
00201 void 
00202 pcl::modeler::MainWindow::createRecentPointCloudActions()
00203 {
00204   for (size_t i = 0; i < MAX_RECENT_NUMBER; ++ i)
00205   {
00206     recent_pointcloud_actions_.push_back(boost::shared_ptr<QAction>(new QAction(this)));
00207     ui_->menuRecentPointClouds->addAction(recent_pointcloud_actions_[i].get());
00208     recent_pointcloud_actions_[i]->setVisible(false);
00209     connect(recent_pointcloud_actions_[i].get(), SIGNAL(triggered()), this, SLOT(slotOpenRecentPointCloud()));
00210   }
00211 
00212   return;
00213 }
00214 
00216 void 
00217 pcl::modeler::MainWindow::updateRecentPointCloudActions()
00218 {
00219   updateRecentActions(recent_pointcloud_actions_, recent_files_);
00220 
00221   return;
00222 }
00223 
00225 void 
00226 pcl::modeler::MainWindow::createRecentProjectActions()
00227 {
00228   for (size_t i = 0; i < MAX_RECENT_NUMBER; ++ i)
00229   {
00230     recent_project_actions_.push_back(boost::shared_ptr<QAction>(new QAction(this)));
00231     ui_->menuRecentPointClouds->addAction(recent_project_actions_[i].get());
00232     recent_project_actions_[i]->setVisible(false);
00233     connect(recent_project_actions_[i].get(), SIGNAL(triggered()), this, SLOT(slotOpenRecentProject()));
00234   }
00235 
00236   return;
00237 }
00238 
00240 void 
00241 pcl::modeler::MainWindow::updateRecentProjectActions()
00242 {
00243   updateRecentActions(recent_project_actions_, recent_projects_);
00244 
00245   return;
00246 }
00247 
00249 bool 
00250 pcl::modeler::MainWindow::openProjectImpl (const QString&)
00251 {
00252   return (true);
00253 }
00254 
00256 void 
00257 pcl::modeler::MainWindow::updateRecentActions (std::vector<boost::shared_ptr<QAction> >& recent_actions, QStringList& recent_items)
00258 {
00259   QMutableStringListIterator recent_items_it (recent_items);
00260   while (recent_items_it.hasNext ())
00261   {
00262     if (!QFile::exists (recent_items_it.next ()))
00263       recent_items_it.remove ();
00264   }
00265 
00266   recent_items.removeDuplicates ();
00267   int recent_number = std::min (int (MAX_RECENT_NUMBER), recent_items.size ());
00268   for (int i = 0; i < recent_number; ++ i)
00269   {
00270     QString text = tr ("%1 %2").arg (i + 1).arg (recent_items[i]);
00271     recent_actions[i]->setText (text);
00272     recent_actions[i]->setData (recent_items[i]);
00273     recent_actions[i]->setVisible (true);
00274   }
00275 
00276   for (size_t i = recent_number, i_end = recent_actions.size (); i < i_end; ++ i)
00277     recent_actions[i]->setVisible (false);
00278 
00279   while (recent_items.size () > recent_number)
00280     recent_items.pop_back ();
00281 }
00282 
00284 QString 
00285 pcl::modeler::MainWindow::getRecentFolder()
00286 {
00287   QString recent_filename;
00288   if (!recent_projects_.empty())
00289     recent_filename = recent_projects_.front();
00290   else if (!recent_files_.empty())
00291     recent_filename = recent_files_.front();
00292 
00293   if (!recent_filename.isEmpty())
00294     return QFileInfo(recent_filename).path();
00295 
00296   return (QString("."));
00297 }
00298 
00300 void 
00301 pcl::modeler::MainWindow::loadGlobalSettings()
00302 {
00303   QSettings global_settings("PCL", "Modeler");
00304 
00305   recent_files_ = global_settings.value("recent_pointclouds").toStringList();
00306   updateRecentPointCloudActions();
00307 
00308   recent_projects_ = global_settings.value("recent_projects").toStringList();
00309   updateRecentProjectActions();
00310 
00311   return;
00312 }
00313 
00315 void 
00316 pcl::modeler::MainWindow::saveGlobalSettings()
00317 {
00318   QSettings global_settings("PCL", "Modeler");
00319 
00320   global_settings.setValue("recent_pointclouds", recent_files_);
00321 
00322   global_settings.setValue("recent_projects", recent_projects_);
00323 
00324   return;
00325 }
00326 
00328 void 
00329 pcl::modeler::MainWindow::slotOnWorkerStarted()
00330 {
00331   statusBar()->showMessage(QString("Working thread running..."));
00332 }
00333 
00335 void 
00336 pcl::modeler::MainWindow::slotOnWorkerFinished()
00337 {
00338   statusBar()->showMessage(QString("Working thread finished..."));
00339 }