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/cloud_mesh_item.h>
00038 #include <pcl/apps/modeler/render_window.h>
00039 #include <pcl/apps/modeler/render_window_item.h>
00040 #include <pcl/apps/modeler/points_actor_item.h>
00041 #include <pcl/apps/modeler/normals_actor_item.h>
00042 #include <pcl/apps/modeler/surface_actor_item.h>
00043 #include <pcl/apps/modeler/cloud_mesh.h>
00044 #include <pcl/apps/modeler/main_window.h>
00045 #include <pcl/apps/modeler/parameter.h>
00046 #include <pcl/apps/modeler/parameter_dialog.h>
00047 #include <pcl/common/common.h>
00048 #include <vtkRenderWindow.h>
00049
00050
00052 pcl::modeler::CloudMeshItem::CloudMeshItem (QTreeWidgetItem* parent, const std::string& filename)
00053 :QTreeWidgetItem(parent),
00054 AbstractItem(),
00055 filename_(filename),
00056 cloud_mesh_(boost::shared_ptr<CloudMesh>(new CloudMesh())),
00057 translation_x_(new DoubleParameter("Translation X", "Translation X", 0.0, -1.0, 1.0)),
00058 translation_y_(new DoubleParameter("Translation Y", "Translation Y", 0.0, -1.0, 1.0)),
00059 translation_z_(new DoubleParameter("Translation Z", "Translation Z", 0.0, -1.0, 1.0)),
00060 rotation_x_(new DoubleParameter("Rotation X", "Rotation X", 0.0, -180.0, 180.0)),
00061 rotation_y_(new DoubleParameter("Rotation Y", "Rotation Y", 0.0, -180.0, 180.0)),
00062 rotation_z_(new DoubleParameter("Rotation Z", "Rotation Z", 0.0, -180.0, 180.0))
00063 {
00064 setFlags(flags()&(~Qt::ItemIsDropEnabled));
00065 setText(0, QString(filename.c_str()));
00066 }
00067
00069 pcl::modeler::CloudMeshItem::CloudMeshItem (QTreeWidgetItem* parent, CloudMesh::PointCloudPtr cloud)
00070 :QTreeWidgetItem(parent),
00071 AbstractItem(),
00072 filename_("unnamed point cloud"),
00073 cloud_mesh_(boost::shared_ptr<CloudMesh>(new CloudMesh(cloud))),
00074 translation_x_(new DoubleParameter("Translation X", "Translation X", 0.0, -1.0, 1.0)),
00075 translation_y_(new DoubleParameter("Translation Y", "Translation Y", 0.0, -1.0, 1.0)),
00076 translation_z_(new DoubleParameter("Translation Z", "Translation Z", 0.0, -1.0, 1.0)),
00077 rotation_x_(new DoubleParameter("Rotation X", "Rotation X", 0.0, -180.0, 180.0)),
00078 rotation_y_(new DoubleParameter("Rotation Y", "Rotation Y", 0.0, -180.0, 180.0)),
00079 rotation_z_(new DoubleParameter("Rotation Z", "Rotation Z", 0.0, -180.0, 180.0))
00080 {
00081 setFlags(flags()&(~Qt::ItemIsDropEnabled));
00082 setText(0, QString(filename_.c_str()));
00083
00084 createChannels();
00085
00086 treeWidget()->expandItem(this);
00087 }
00088
00090 pcl::modeler::CloudMeshItem::CloudMeshItem(QTreeWidgetItem* parent, const CloudMeshItem& cloud_mesh_item)
00091 :QTreeWidgetItem(parent),
00092 AbstractItem(),
00093 filename_(cloud_mesh_item.filename_),
00094 cloud_mesh_(cloud_mesh_item.cloud_mesh_),
00095 translation_x_(new DoubleParameter("Translation X", "Translation X", 0.0, -1.0, 1.0)),
00096 translation_y_(new DoubleParameter("Translation Y", "Translation Y", 0.0, -1.0, 1.0)),
00097 translation_z_(new DoubleParameter("Translation Z", "Translation Z", 0.0, -1.0, 1.0)),
00098 rotation_x_(new DoubleParameter("Rotation X", "Rotation X", 0.0, -180.0, 180.0)),
00099 rotation_y_(new DoubleParameter("Rotation Y", "Rotation Y", 0.0, -180.0, 180.0)),
00100 rotation_z_(new DoubleParameter("Rotation Z", "Rotation Z", 0.0, -180.0, 180.0))
00101 {
00102 setFlags(flags()&(~Qt::ItemIsDropEnabled));
00103 setText(0, QString(filename_.c_str()));
00104
00105 createChannels();
00106
00107 treeWidget()->expandItem(this);
00108 }
00109
00111 pcl::modeler::CloudMeshItem::~CloudMeshItem ()
00112 {
00113 }
00114
00116 bool
00117 pcl::modeler::CloudMeshItem::savePointCloud(const QList<CloudMeshItem*>& items, const QString& filename)
00118 {
00119 if (items.size() == 1)
00120 return (items.first()->getCloudMesh()->save(filename.toStdString()));
00121
00122 std::vector<const CloudMesh*> cloud_meshes;
00123 for (QList<CloudMeshItem*>::const_iterator items_it = items.begin();
00124 items_it != items.end();
00125 ++ items_it)
00126 {
00127 cloud_meshes.push_back((*items_it)->getCloudMesh().get());
00128 }
00129
00130 return (CloudMesh::save(cloud_meshes, filename.toStdString()));
00131 }
00132
00134 bool
00135 pcl::modeler::CloudMeshItem::open()
00136 {
00137 if(!cloud_mesh_->open(filename_))
00138 return (false);
00139
00140 createChannels();
00141
00142 treeWidget()->expandItem(this);
00143
00144 return (true);
00145 }
00146
00148 void
00149 pcl::modeler::CloudMeshItem::prepareContextMenu(QMenu* menu) const
00150 {
00151 menu->addMenu(ui()->menuFilters);
00152 menu->addMenu(ui()->menuRegistration);
00153 menu->addMenu(ui()->menuSurfaceReconstruction);
00154 menu->addAction(ui()->actionSavePointCloud);
00155 menu->addAction(ui()->actionClosePointCloud);
00156 }
00157
00159 void
00160 pcl::modeler::CloudMeshItem::createChannels()
00161 {
00162 RenderWindowItem* render_window_item = dynamic_cast<RenderWindowItem*>(parent());
00163 addChild(new PointsActorItem(this, cloud_mesh_, render_window_item->getRenderWindow()->GetRenderWindow()));
00164 addChild(new NormalsActorItem(this, cloud_mesh_, render_window_item->getRenderWindow()->GetRenderWindow()));
00165 addChild(new SurfaceActorItem(this, cloud_mesh_, render_window_item->getRenderWindow()->GetRenderWindow()));
00166 for (int i = 0, i_end = childCount(); i < i_end; ++ i)
00167 {
00168 ChannelActorItem* child_item = dynamic_cast<ChannelActorItem*>(child(i));
00169 child_item->init();
00170 }
00171
00172 render_window_item->getRenderWindow()->updateAxes();
00173 render_window_item->getRenderWindow()->resetCamera();
00174
00175 return;
00176 }
00177
00178
00180 void
00181 pcl::modeler::CloudMeshItem::updateChannels()
00182 {
00183 cloud_mesh_->updateVtkPoints();
00184 cloud_mesh_->updateVtkPolygons();
00185
00186 for (int i = 0, i_end = childCount(); i < i_end; ++ i)
00187 {
00188 ChannelActorItem* child_item = dynamic_cast<ChannelActorItem*>(child(i));
00189 child_item->update();
00190 }
00191
00192 RenderWindowItem* render_window_item = dynamic_cast<RenderWindowItem*>(parent());
00193 render_window_item->getRenderWindow()->updateAxes();
00194
00195 return;
00196 }
00197
00199 void
00200 pcl::modeler::CloudMeshItem::prepareProperties(ParameterDialog* parameter_dialog)
00201 {
00202 translation_x_->reset();
00203 translation_y_->reset();
00204 translation_z_->reset();
00205 rotation_x_->reset();
00206 rotation_y_->reset();
00207 rotation_z_->reset();
00208 parameter_dialog->addParameter(translation_x_);
00209 parameter_dialog->addParameter(translation_y_);
00210 parameter_dialog->addParameter(translation_z_);
00211 parameter_dialog->addParameter(rotation_x_);
00212 parameter_dialog->addParameter(rotation_y_);
00213 parameter_dialog->addParameter(rotation_z_);
00214
00215 Eigen::Vector4f min_pt, max_pt;
00216 pcl::getMinMax3D(*(cloud_mesh_->getCloud()), min_pt, max_pt);
00217 double x_range = max_pt.x() - min_pt.x();
00218 double y_range = max_pt.y() - min_pt.y();
00219 double z_range = max_pt.z() - min_pt.z();
00220 translation_x_->setLow(-x_range/2);
00221 translation_x_->setHigh(x_range/2);
00222 translation_x_->setStep(x_range/1000);
00223 translation_y_->setLow(-y_range/2);
00224 translation_y_->setHigh(y_range/2);
00225 translation_y_->setStep(y_range/1000);
00226 translation_z_->setLow(-z_range/2);
00227 translation_z_->setHigh(z_range/2);
00228 translation_z_->setStep(z_range/1000);
00229 }
00230
00232 void
00233 pcl::modeler::CloudMeshItem::setProperties()
00234 {
00235 cloud_mesh_->transform(*translation_x_, *translation_y_, *translation_z_,
00236 *rotation_x_, *rotation_y_, *rotation_z_);
00237
00238 updateChannels();
00239 }
00240
00242 void
00243 pcl::modeler::CloudMeshItem::updateRenderWindow()
00244 {
00245 RenderWindowItem* render_window_item = dynamic_cast<RenderWindowItem*>(parent());
00246 for (int i = 0, i_end = childCount(); i < i_end; ++ i)
00247 {
00248 ChannelActorItem* child_item = dynamic_cast<ChannelActorItem*>(child(i));
00249 child_item->switchRenderWindow(render_window_item->getRenderWindow()->GetRenderWindow());
00250 }
00251
00252 render_window_item->getRenderWindow()->updateAxes();
00253 render_window_item->getRenderWindow()->resetCamera();
00254
00255 return;
00256 }