50#define TYPEAUTODETECT 0
62 saveVertexTexCoord_(0),
65 savePrecisionLabel_(0),
67 saveDefaultButton_(0),
71 loadVertexTexCoord_(0),
74 loadDefaultButton_(0),
86 return QString( tr(
"Polygon File Format files ( *.ply )") );
92 return QString( tr(
"Polygon File Format files ( *.ply )") );
107 bool gui = OpenFlipper::Options::gui() && (loadVertexNormal_ != 0) ;
109 bool vNormals = ((gui && loadVertexNormal_->isChecked()) ||
111 bool vColors = ((gui && loadVertexColor_->isChecked()) ||
113 bool vTexCoords = ((gui && loadVertexTexCoord_->isChecked()) ||
115 bool fNormals = ((gui && loadFaceNormal_->isChecked()) ||
117 bool fColors = ((gui && loadFaceColor_->isChecked()) ||
140 emit openedFile( objectId );
154 emit openedFile( objectId );
160 emit log(
LOGERR, tr(
"FilePLYPlugin::loadObject(): Tried loading with unknown forced data type"));
170 int triMeshControl = TYPEAUTODETECT;
172 bool gui = OpenFlipper::Options::gui() && (loadVertexNormal_ != 0) ;
174 bool vNormals = ((gui && loadVertexNormal_->isChecked()) ||
176 bool vColors = ((gui && loadVertexColor_->isChecked()) ||
178 bool vTexCoords = ((gui && loadVertexTexCoord_->isChecked()) ||
180 bool fNormals = ((gui && loadFaceNormal_->isChecked()) ||
182 bool fColors = ((gui && loadFaceColor_->isChecked()) ||
198 if ( OpenFlipper::Options::gui() ){
199 if ( triMeshHandling_ != 0 ){
200 triMeshControl = triMeshHandling_->currentIndex();
202 triMeshControl = TYPEAUTODETECT;
209 if(triMeshControl == TYPEAUTODETECT || triMeshControl == TYPEASK) {
217 bool isTriMesh =
true;
218 for (
auto f_it : object->
mesh()->faces()) {
223 for (
auto fv_it : f_it.vertices() )
227 isTriMesh = isTriMesh && (count == 3);
232 if (triMeshControl == TYPEAUTODETECT)
238 emit openedFile( objectId );
243 else if (triMeshControl == TYPEASK) {
246 QMetaObject::invokeMethod(
this,
"handleTrimeshDialog",Qt::BlockingQueuedConnection);
247 if ((trimeshOptions_ == TYPEPOLY) ||
248 (trimeshOptions_ == TYPEASK && !isTriMesh)) {
253 emit openedFile( objectId );
260 }
else if (triMeshControl == TYPEPOLY) {
268 emit openedFile( objectId );
280 emit openedFile( objectId );
289 if(objectId != -1) emit deleteObject(objectId);
295 emit openedFile( objectId );
304 QPushButton *detectButton = msgBox.addButton(tr(
"Auto-Detect"), QMessageBox::ActionRole);
305 QPushButton *triButton = msgBox.addButton(tr(
"Open as triangle mesh"), QMessageBox::ActionRole);
306 QPushButton *polyButton = msgBox.addButton(tr(
"Open as poly mesh"), QMessageBox::ActionRole);
307 msgBox.setWindowTitle( tr(
"Mesh types in file") );
308 msgBox.setText( tr(
"You are about to open a file containing one or more mesh types. \n\n Which mesh type should be used?") );
309 msgBox.setDefaultButton( detectButton );
313 if (msgBox.clickedButton() == triButton)
314 trimeshOptions_ = TYPETRIANGLE ;
315 else if (msgBox.clickedButton() == polyButton)
316 trimeshOptions_ = TYPEPOLY ;
318 trimeshOptions_ = TYPEASK;
333 object->target(
true);
335 object->setFromFileName(_filename);
336 object->setName(object->
filename());
339 TriMesh* mesh =
object->mesh();
341 bool hadVNormals = mesh->has_vertex_normals();
342 bool hadVColors = mesh->has_vertex_colors();
343 bool hadVTexCoords = mesh->has_vertex_texcoords2D();
344 bool hadFNormals = mesh->has_face_normals();
345 bool hadFColors = mesh->has_face_colors();
347 if(_opt.vertex_has_normal())
348 mesh->request_vertex_normals();
349 if(_opt.vertex_has_color())
350 mesh->request_vertex_colors();
351 if(_opt.vertex_has_texcoord())
352 mesh->request_vertex_texcoords2D();
353 if(_opt.face_has_normal())
354 mesh->request_face_normals();
355 if(_opt.face_has_color())
356 mesh->request_face_colors();
361 emit log(
LOGERR,
"Error while reading PLY file!");
362 emit deleteObject(
id);
367 if (!_opt.vertex_has_normal() || !_opt.face_has_normal()) {
370 if (_opt.vertex_has_normal() ) {
372 emit log(
LOGINFO,
"Vertex normals loaded from file. Computing Face normals.");
374 std::cerr <<
"Update face normals" << std::endl;
377 emit log(
LOGINFO,
"File did not contain normals. Computing automatically.");
385 if (!hadVColors && !_opt.vertex_has_color() && mesh->has_vertex_colors())
386 mesh->release_vertex_colors();
387 if (!hadVTexCoords && !_opt.vertex_has_texcoord() && mesh->has_vertex_texcoords2D())
388 mesh->release_vertex_texcoords2D();
389 if (!hadFColors && !_opt.face_has_color() && mesh->has_face_colors())
390 mesh->release_face_colors();
393 if(mesh->n_faces() == 0)
401 emit log(
LOGERR,
"Error : Could not create new triangle mesh object.");
418 object->target(
true);
420 object->setFromFileName(_filename);
421 object->setName(object->
filename());
426 bool hadVNormals = mesh->has_vertex_normals();
427 bool hadVColors = mesh->has_vertex_colors();
428 bool hadVTexCoords = mesh->has_vertex_texcoords2D();
429 bool hadFNormals = mesh->has_face_normals();
430 bool hadFColors = mesh->has_face_colors();
432 if(_opt.vertex_has_normal())
433 mesh->request_vertex_normals();
434 if(_opt.vertex_has_color())
435 mesh->request_vertex_colors();
436 if(_opt.vertex_has_texcoord())
437 mesh->request_vertex_texcoords2D();
438 if(_opt.face_has_normal())
439 mesh->request_face_normals();
440 if(_opt.face_has_color())
441 mesh->request_face_colors();
446 emit log(
LOGERR,
"Error while reading PLY file!");
447 emit deleteObject(
id);
453 if (!_opt.vertex_has_normal() || !_opt.face_has_normal()) {
456 if (_opt.vertex_has_normal() ) {
458 emit log(
LOGINFO,
"Vertex normals loaded from file. Computing Face normals.");
460 std::cerr <<
"Update face normals" << std::endl;
463 emit log(
LOGINFO,
"File did not contain normals. Computing automatically.");
471 if (!hadVColors && !_opt.vertex_has_color() && mesh->has_vertex_colors())
472 mesh->release_vertex_colors();
473 if (!hadVTexCoords && !_opt.vertex_has_texcoord() && mesh->has_vertex_texcoords2D())
474 mesh->release_vertex_texcoords2D();
475 if (!hadFColors && !_opt.face_has_color() && mesh->has_face_colors())
476 mesh->release_face_colors();
480 if(mesh->n_faces() == 0)
488 emit log(
LOGERR,
"Error : Could not create new poly mesh object.");
497bool FilePLYPlugin::saveObject(
int _id, QString _filename)
501 emit log(
LOGERR, tr(
"saveObject : cannot get object id %1 for save name %2").arg(_id).arg(_filename) );
505 object->setFromFileName(_filename);
506 object->setName(object->
filename());
510 bool gui = OpenFlipper::Options::gui() && (saveBinary_ != 0) ;
511 bool binary = ((gui && saveBinary_->isChecked()) ||
517 bool vNormals = ((gui && saveVertexNormal_->isChecked())) ||
519 bool vColors = ((gui && saveVertexColor_->isChecked())) ||
521 bool vTexCoords = ((gui && saveVertexTexCoord_->isChecked())) ||
523 bool fNormals = ((gui && saveFaceNormal_->isChecked())) ||
525 bool fColors = ((gui && saveFaceColor_->isChecked())) ||
534 PolyMesh* mesh = polyObj->
mesh();
536 if (vNormals && mesh->has_vertex_normals())
538 if (vColors && mesh->has_vertex_colors())
540 if (vTexCoords && mesh->has_vertex_texcoords2D())
542 if (fNormals && mesh->has_face_normals())
544 if (fColors && mesh->has_face_colors())
552 TriMesh* mesh = triObj->
mesh();
554 if (vNormals && mesh->has_vertex_normals())
556 if (vColors && mesh->has_vertex_colors())
558 if (vTexCoords && mesh->has_vertex_texcoords2D())
560 if (fNormals && mesh->has_face_normals())
562 if (fColors && mesh->has_face_colors())
569 emit log(
LOGERR, tr(
"Unable to save ") + _filename);
573 emit log(
LOGINFO, tr(
"Saved object to ") + _filename );
581 if (saveOptions_ == 0){
583 saveOptions_ =
new QWidget();
584 QVBoxLayout* layout =
new QVBoxLayout();
585 layout->setAlignment(Qt::AlignTop);
587 saveBinary_ =
new QCheckBox(
"Save Binary");
588 layout->addWidget(saveBinary_);
590 saveVertexNormal_ =
new QCheckBox(
"Save Vertex Normals");
591 layout->addWidget(saveVertexNormal_);
593 saveVertexColor_ =
new QCheckBox(
"Save Vertex Colors");
594 layout->addWidget(saveVertexColor_);
596 saveVertexTexCoord_ =
new QCheckBox(
"Save Vertex TexCoords");
597 layout->addWidget(saveVertexTexCoord_);
599 saveFaceNormal_ =
new QCheckBox(
"Save Face Normals");
600 layout->addWidget(saveFaceNormal_);
602 saveFaceColor_ =
new QCheckBox(
"Save Face Colors");
603 layout->addWidget(saveFaceColor_);
605 savePrecisionLabel_ =
new QLabel(
"Writer Precision");
606 layout->addWidget(savePrecisionLabel_);
608 savePrecision_ =
new QSpinBox();
609 savePrecision_->setMinimum(1);
610 savePrecision_->setMaximum(12);
611 savePrecision_->setValue(6);
612 layout->addWidget(savePrecision_);
614 saveDefaultButton_ =
new QPushButton(
"Make Default");
615 layout->addWidget(saveDefaultButton_);
617 saveOptions_->setLayout(layout);
619 connect(saveBinary_, SIGNAL(clicked(
bool)), savePrecision_, SLOT(setDisabled(
bool)));
620 connect(saveDefaultButton_, SIGNAL(clicked()),
this, SLOT(
slotSaveDefault()));
622 saveBinary_->setChecked(
OpenFlipperSettings().value(
"FilePLY/Save/Binary",
true).toBool() );
623 savePrecision_->setDisabled(
true);
624 saveVertexNormal_->setChecked(
OpenFlipperSettings().value(
"FilePLY/Save/Normals",
true).toBool() );
625 saveVertexColor_->setChecked(
OpenFlipperSettings().value(
"FilePLY/Save/VertexColor",
true).toBool() );
626 saveVertexTexCoord_->setChecked(
OpenFlipperSettings().value(
"FilePLY/Save/TexCoords",
true).toBool() );
627 saveFaceNormal_->setChecked(
OpenFlipperSettings().value(
"FilePLY/Save/FaceNormal",
true).toBool() );
628 saveFaceColor_->setChecked(
OpenFlipperSettings().value(
"FilePLY/Save/FaceColor",
true).toBool() );
638 if (loadOptions_ == 0){
640 loadOptions_ =
new QWidget();
641 QVBoxLayout* layout =
new QVBoxLayout();
642 layout->setAlignment(Qt::AlignTop);
644 QLabel* label =
new QLabel(tr(
"If PolyMesh is a Triangle Mesh:"));
646 layout->addWidget(label);
648 triMeshHandling_ =
new QComboBox();
649 triMeshHandling_->addItem( tr(
"Auto-Detect") );
650 triMeshHandling_->addItem( tr(
"Ask") );
651 triMeshHandling_->addItem( tr(
"Always open as PolyMesh") );
652 triMeshHandling_->addItem( tr(
"Always open as TriangleMesh") );
654 layout->addWidget(triMeshHandling_);
656 loadVertexNormal_ =
new QCheckBox(
"Load Vertex Normals");
657 layout->addWidget(loadVertexNormal_);
659 loadVertexColor_ =
new QCheckBox(
"Load Vertex Colors");
660 layout->addWidget(loadVertexColor_);
662 loadVertexTexCoord_ =
new QCheckBox(
"Load Vertex TexCoords");
663 layout->addWidget(loadVertexTexCoord_);
665 loadFaceNormal_ =
new QCheckBox(
"Load Face Normals");
666 layout->addWidget(loadFaceNormal_);
668 loadFaceColor_ =
new QCheckBox(
"Load Face Colors");
669 layout->addWidget(loadFaceColor_);
671 loadDefaultButton_ =
new QPushButton(
"Make Default");
672 layout->addWidget(loadDefaultButton_);
674 loadOptions_->setLayout(layout);
676 connect(loadDefaultButton_, SIGNAL(clicked()),
this, SLOT(
slotLoadDefault()));
679 triMeshHandling_->setCurrentIndex(
OpenFlipperSettings().value(
"FilePLY/Load/TriMeshHandling",TYPEAUTODETECT).toInt() );
681 loadVertexNormal_->setChecked(
OpenFlipperSettings().value(
"FilePLY/Load/Normals",
true).toBool() );
682 loadVertexColor_->setChecked(
OpenFlipperSettings().value(
"FilePLY/Load/VertexColor",
true).toBool() );
683 loadVertexTexCoord_->setChecked(
OpenFlipperSettings().value(
"FilePLY/Load/TexCoords",
true).toBool() );
684 loadFaceNormal_->setChecked(
OpenFlipperSettings().value(
"FilePLY/Load/FaceNormal",
true).toBool() );
685 loadFaceColor_->setChecked(
OpenFlipperSettings().value(
"FilePLY/Load/FaceColor",
true).toBool() );
DLLEXPORT OpenFlipperQSettings & OpenFlipperSettings()
QSettings object containing all program settings of OpenFlipper.
#define DATA_TRIANGLE_MESH
QString filename() const
return the filename of the object
bool dataType(DataType _type) const
QWidget * loadOptionsWidget(QString)
void handleTrimeshDialog()
Displays a dialog to ask how to load the mesh (triangle, polymesh , autodetect)
void backupTextureCoordinates(MeshT &_mesh)
creates a backup of the original per vertex/face texture coordinates
void slotLoadDefault()
Slot called when user wants to save the given Load options as default.
int loadPolyMeshObject(QString _filename, OpenMesh::IO::Options &_opt)
Always loads mesh as polymesh.
int loadObject(QString _filename)
Loads Object and converts it to a triangle mesh if possible.
FilePLYPlugin()
Constructor.
DataType supportedType()
Return your supported object type( e.g. DATA_TRIANGLE_MESH )
void initializePlugin()
Initialize Plugin.
QWidget * saveOptionsWidget(QString)
int loadTriMeshObject(QString _filename, OpenMesh::IO::Options &_opt)
Loads a triangle mesh.
void slotSaveDefault()
Slot called when user wants to save the given Save options as default.
MeshT * mesh()
return a pointer to the mesh
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
void setValue(const QString &key, const QVariant &value)
Wrapper function which makes it possible to enable Debugging output with -DOPENFLIPPER_SETTINGS_DEBUG...
Set options for reader/writer modules.
@ FaceNormal
Has (r) / store (w) face normals.
@ FaceColor
Has (r) / store (w) face colors.
@ Binary
Set binary mode for r/w.
@ VertexNormal
Has (r) / store (w) vertex normals.
@ VertexTexCoord
Has (r) / store (w) texture coordinates.
@ VertexColor
Has (r) / store (w) vertex colors.
@ Custom
Has (r) / store (w) custom properties marked persistent (currently PLY only supports reading and only...
void update_face_normals()
Update normal vectors for all faces.
void update_normals()
Compute normals for all primitives.
Type for a Meshobject containing a poly mesh.
Type for a MeshObject containing a triangle mesh.
const UpdateType UPDATE_ALL(UpdateTypeSet(1))
Identifier for all updates.
DrawMode POINTS
draw unlighted points using the default base color
bool write_mesh(const Mesh &_mesh, const std::string &_filename, Options _opt=Options::Default, std::streamsize _precision=6)
Write a mesh to the file _filename.
bool read_mesh(Mesh &_mesh, const std::string &_filename)
Read a mesh from file _filename.
bool getObject(const int _identifier, BaseObject *&_object)
Get the object which has the given identifier.
int objectCount()
Get the number of available objects.
void setDrawMode(const ACG::SceneGraph::DrawModes::DrawMode &_mode, int _viewer)
Set the draw Mode of a Viewer. .