43#include <ACG/GL/GLState.hh>
48#include <OpenMesh/Core/IO/IOManager.hh>
56#define TYPEAUTODETECT 0
63 loadOptions_(nullptr),
64 saveOptions_(nullptr),
66 saveVertexNormal_(nullptr),
67 saveVertexTexCoord_(nullptr),
68 saveVertexColor_(nullptr),
69 saveFaceColor_(nullptr),
70 saveFaceNormal_(nullptr),
71 saveFaceTexCoord_(nullptr),
72 saveCustomProperties_(nullptr),
74 saveDefaultButton_(nullptr),
75 triMeshHandling_(nullptr),
76 loadVertexNormal_(nullptr),
77 loadVertexTexCoord_(nullptr),
78 loadVertexColor_(nullptr),
79 loadFaceColor_(nullptr),
80 loadFaceNormal_(nullptr),
81 loadFaceTexCoord_(nullptr),
82 loadCustomProperties_(nullptr),
84 loadDefaultButton_(nullptr),
98 return QString( tr(
"OpenMesh Format files ( *.om )") );
104 return QString( tr(
"OpenMesh Format files ( *.om )") );
118 int triMeshControl = TYPEAUTODETECT;
120 if ( OpenFlipper::Options::gui() ){
121 if ( triMeshHandling_ != 0 ){
122 triMeshControl = triMeshHandling_->currentIndex();
124 triMeshControl = TYPEAUTODETECT;
130 if(triMeshControl == TYPEAUTODETECT) {
138 for (
auto f_it :
object->mesh()->faces()) {
142 for (
auto fv_it : f_it.vertices())
152 emit openedFile( objectId );
159 }
else if (triMeshControl == TYPEASK ) {
170 for (
auto f_it :
object->mesh()->faces()) {
174 for (
auto fv_it : f_it.vertices())
183 if(triMesh ==
false)
break;
188 QMetaObject::invokeMethod(
this,
"handleTrimeshDialog",Qt::BlockingQueuedConnection);
189 if ((trimeshOptions_ == TYPEPOLY) ||
190 (trimeshOptions_ == TYPEASK && !triMesh)) {
196 emit openedFile( objectId );
201 }
else if (triMeshControl == TYPEPOLY) {
210 emit openedFile( objectId );
222 emit openedFile( objectId );
229 if(objectId != -1) emit deleteObject(objectId);
237 emit openedFile( objectId );
246 QPushButton *detectButton = msgBox.addButton(tr(
"Auto-Detect"), QMessageBox::ActionRole);
247 QPushButton *triButton = msgBox.addButton(tr(
"Open as triangle mesh"), QMessageBox::ActionRole);
248 QPushButton *polyButton = msgBox.addButton(tr(
"Open as poly mesh"), QMessageBox::ActionRole);
249 msgBox.setWindowTitle( tr(
"Mesh types in file") );
250 msgBox.setText( tr(
"You are about to open a file containing one or more mesh types. \n\n Which mesh type should be used?") );
251 msgBox.setDefaultButton( detectButton );
255 if (msgBox.clickedButton() == triButton)
256 trimeshOptions_ = TYPETRIANGLE ;
257 else if (msgBox.clickedButton() == polyButton)
258 trimeshOptions_ = TYPEPOLY ;
260 trimeshOptions_ = TYPEASK;
275 object->target(
true);
277 object->setFromFileName(_filename);
278 object->setName(object->
filename());
280 std::string filename = std::string( _filename.toUtf8() );
285 if ( !OpenFlipper::Options::sceneGraphUpdatesBlocked() &&
286 !OpenFlipper::Options::loadingRecentFile() && loadOptions_ !=
nullptr){
288 if (loadVertexNormal_->isChecked())
291 if (loadVertexTexCoord_->isChecked())
294 if (loadVertexColor_->isChecked())
297 if (loadFaceColor_->isChecked())
300 if (loadFaceNormal_->isChecked())
303 if (loadFaceTexCoord_->isChecked())
306 if (loadCustomProperties_->isChecked())
309 if (loadStatus_->isChecked())
315 opt = getDefaultOptions();
319 object->mesh()->request_vertex_texcoords2D();
320 object->mesh()->request_halfedge_texcoords2D();
321 object->mesh()->request_face_texture_index();
327 std::cerr <<
"Plugin FileOM : Read error for Triangle Mesh\n";
328 emit deleteObject( object->
id() );
332 object->mesh()->update_normals();
339 emit log(
LOGERR,
"Error : Could not create new triangle mesh object.");
356 object->target(
true);
358 object->setFromFileName(_filename);
359 object->setName(object->
filename());
361 std::string filename = std::string( _filename.toUtf8() );
366 if ( !OpenFlipper::Options::sceneGraphUpdatesBlocked() &&
367 !OpenFlipper::Options::loadingRecentFile() && loadOptions_ != 0){
369 if (loadVertexNormal_->isChecked())
372 if (loadVertexTexCoord_->isChecked())
375 if (loadVertexColor_->isChecked())
378 if (loadFaceColor_->isChecked())
381 if (loadFaceNormal_->isChecked())
384 if (loadFaceTexCoord_->isChecked())
387 if (loadCustomProperties_->isChecked())
390 if (loadStatus_->isChecked())
396 opt = getDefaultOptions();
401 object->mesh()->request_vertex_texcoords2D();
402 object->mesh()->request_halfedge_texcoords2D();
403 object->mesh()->request_face_texture_index();
409 std::cerr <<
"Plugin FileOM : Read error for Poly Mesh\n";
410 emit deleteObject( object->
id() );
417 object->mesh()->release_vertex_texcoords2D();
422 object->mesh()->release_halfedge_texcoords2D();
426 object->mesh()->update_normals();
433 emit log(
LOGERR,
"Error : Could not create new poly mesh object.");
440template <
class MeshT>
444 if (_mesh.has_vertex_texcoords2D()) {
447 if (!_mesh.get_property_handle(oldVertexCoords,
"Original Per Vertex Texture Coords"))
448 _mesh.add_property(oldVertexCoords,
"Original Per Vertex Texture Coords");
450 for (
auto v_it : _mesh.vertices())
451 _mesh.property(oldVertexCoords, v_it) = _mesh.texcoord2D(v_it);
456 if (_mesh.has_halfedge_texcoords2D()) {
459 if (!_mesh.get_property_handle(oldHalfedgeCoords,
"Original Per Face Texture Coords"))
460 _mesh.add_property(oldHalfedgeCoords,
"Original Per Face Texture Coords");
462 for (
auto he_it : _mesh.halfedges())
463 _mesh.property(oldHalfedgeCoords, he_it) = _mesh.texcoord2D(he_it);
470bool FileOMPlugin::saveObject(
int _id, QString _filename)
474 emit log(
LOGERR, tr(
"saveObject : cannot get object id %1 for save name %2").arg(_id).arg(_filename) );
478 std::string filename = std::string( _filename.toUtf8() );
486 if ( !OpenFlipper::Options::savingSettings() && saveOptions_ != 0){
490 if (saveBinary_->isChecked())
493 if (saveVertexNormal_->isChecked() && mesh->has_vertex_normals())
496 if (saveVertexTexCoord_->isChecked() && (mesh->has_vertex_texcoords1D() || mesh->has_vertex_texcoords2D() || mesh->has_vertex_texcoords3D())) {
497 std::cerr <<
"File OM texture write" << std::endl;
501 if (saveVertexColor_->isChecked() && mesh->has_vertex_colors())
504 if (saveFaceColor_->isChecked() && mesh->has_face_colors())
507 if (saveFaceNormal_->isChecked() && mesh->has_face_normals())
510 if (saveFaceTexCoord_->isChecked() && (mesh->has_halfedge_texcoords1D() || mesh->has_halfedge_texcoords2D() || mesh->has_halfedge_texcoords3D())) {
511 std::cerr <<
"File OM texture write" << std::endl;
515 if (saveCustomProperties_->isChecked())
518 if (saveStatus_->isChecked() && (mesh->has_face_status() || mesh->has_edge_status() || mesh->has_halfedge_status() || mesh->has_vertex_status()))
523 object->setFromFileName(_filename);
524 object->setName(object->
filename());
529 emit log(
LOGINFO, tr(
"Saved object to ") + _filename );
532 emit log(
LOGERR, tr(
"Unable to save ") + _filename);
537 object->setFromFileName(_filename);
538 object->setName(object->
filename());
544 if ( !OpenFlipper::Options::savingSettings() && saveOptions_ != 0){
548 if (saveBinary_->isChecked())
551 if (saveVertexNormal_->isChecked() && mesh->has_vertex_normals())
554 if (saveVertexTexCoord_->isChecked() && (mesh->has_vertex_texcoords1D() || mesh->has_vertex_texcoords2D() || mesh->has_vertex_texcoords3D())) {
555 std::cerr <<
"File OM texture write" << std::endl;
559 if (saveVertexColor_->isChecked() && mesh->has_vertex_colors())
562 if (saveFaceColor_->isChecked() && mesh->has_face_colors())
565 if (saveFaceNormal_->isChecked() && mesh->has_face_normals())
568 if (saveFaceTexCoord_->isChecked() && (mesh->has_halfedge_texcoords1D() || mesh->has_halfedge_texcoords2D() || mesh->has_halfedge_texcoords3D())) {
569 std::cerr <<
"File OM texture write" << std::endl;
573 if (saveCustomProperties_->isChecked())
576 if (saveStatus_->isChecked() && (mesh->has_face_status() || mesh->has_edge_status() || mesh->has_halfedge_status() || mesh->has_vertex_status()))
582 emit log(
LOGINFO, tr(
"Saved object to ") + _filename );
585 emit log(
LOGERR, tr(
"Unable to save ") + _filename );
589 emit log(
LOGERR, tr(
"Unable to save (object is not a compatible mesh type)"));
598 if (saveOptions_ == 0){
600 saveOptions_ =
new QWidget();
601 QVBoxLayout* layout =
new QVBoxLayout();
602 layout->setAlignment(Qt::AlignTop);
604 saveBinary_ =
new QCheckBox(
"Save Binary");
605 layout->addWidget(saveBinary_);
607 saveVertexNormal_ =
new QCheckBox(
"Save Vertex Normals");
608 layout->addWidget(saveVertexNormal_);
610 saveVertexTexCoord_ =
new QCheckBox(
"Save Vertex TexCoords");
611 layout->addWidget(saveVertexTexCoord_);
613 saveVertexColor_ =
new QCheckBox(
"Save Vertex Colors");
614 layout->addWidget(saveVertexColor_);
616 saveFaceColor_ =
new QCheckBox(
"Save Face Colors");
617 layout->addWidget(saveFaceColor_);
619 saveFaceNormal_ =
new QCheckBox(
"Save Face Normals");
620 layout->addWidget(saveFaceNormal_);
622 saveFaceTexCoord_ =
new QCheckBox(
"Save Face TexCoords");
623 layout->addWidget(saveFaceTexCoord_);
625 saveCustomProperties_ =
new QCheckBox(
"Save Custom Properties");
626 layout->addWidget(saveCustomProperties_);
628 saveStatus_ =
new QCheckBox(
"Save Status");
629 layout->addWidget(saveStatus_);
631 saveDefaultButton_ =
new QPushButton(
"Make Default");
632 layout->addWidget(saveDefaultButton_);
634 saveOptions_->setLayout(layout);
636 connect(saveDefaultButton_, SIGNAL(clicked()),
this, SLOT(
slotSaveDefault()));
638 saveBinary_->setChecked( OpenFlipperSettings().value(
"FileOM/Save/Binary",
true).toBool() );
639 saveVertexNormal_->setChecked( OpenFlipperSettings().value(
"FileOM/Save/Normals",
true).toBool() );
640 saveVertexTexCoord_->setChecked( OpenFlipperSettings().value(
"FileOM/Save/TexCoords",
true).toBool() );
641 saveVertexColor_->setChecked( OpenFlipperSettings().value(
"FileOM/Save/VertexColor",
true).toBool() );
642 saveFaceColor_->setChecked( OpenFlipperSettings().value(
"FileOM/Save/FaceColor",
true).toBool() );
643 saveFaceNormal_->setChecked( OpenFlipperSettings().value(
"FileOM/Save/FaceNormal",
true).toBool() );
644 saveFaceTexCoord_->setChecked( OpenFlipperSettings().value(
"FileOM/Save/FaceTexCoords",
true).toBool() );
645 saveCustomProperties_->setChecked( OpenFlipperSettings().value(
"FileOM/Save/CustomProperties",
true).toBool() );
646 saveStatus_->setChecked( OpenFlipperSettings().value(
"FileOM/Save/Status",
true).toBool() );
657 if (loadOptions_ == 0){
659 loadOptions_ =
new QWidget();
660 QVBoxLayout* layout =
new QVBoxLayout();
661 layout->setAlignment(Qt::AlignTop);
663 QLabel* label =
new QLabel(tr(
"If PolyMesh is a Triangle Mesh:"));
665 layout->addWidget(label);
667 triMeshHandling_ =
new QComboBox();
668 triMeshHandling_->addItem( tr(
"Auto-Detect") );
669 triMeshHandling_->addItem( tr(
"Ask") );
670 triMeshHandling_->addItem( tr(
"Always open as PolyMesh") );
671 triMeshHandling_->addItem( tr(
"Always open as TriangleMesh") );
673 layout->addWidget(triMeshHandling_);
675 loadVertexNormal_ =
new QCheckBox(
"Load Vertex Normals");
676 layout->addWidget(loadVertexNormal_);
678 loadVertexTexCoord_ =
new QCheckBox(
"Load Vertex TexCoords");
679 layout->addWidget(loadVertexTexCoord_);
681 loadVertexColor_ =
new QCheckBox(
"Load Vertex Colors");
682 layout->addWidget(loadVertexColor_);
684 loadFaceColor_ =
new QCheckBox(
"Load Face Colors");
685 layout->addWidget(loadFaceColor_);
687 loadFaceNormal_ =
new QCheckBox(
"Load Face Normals");
688 layout->addWidget(loadFaceNormal_);
690 loadFaceTexCoord_ =
new QCheckBox(
"Load Face TexCoords");
691 layout->addWidget(loadFaceTexCoord_);
693 loadCustomProperties_ =
new QCheckBox(
"Load Custom Properties");
694 layout->addWidget(loadCustomProperties_);
696 loadStatus_ =
new QCheckBox(
"Load Status");
697 layout->addWidget(loadStatus_);
699 loadDefaultButton_ =
new QPushButton(
"Make Default");
700 layout->addWidget(loadDefaultButton_);
702 loadOptions_->setLayout(layout);
704 connect(loadDefaultButton_, SIGNAL(clicked()),
this, SLOT(
slotLoadDefault()));
707 triMeshHandling_->setCurrentIndex(OpenFlipperSettings().value(
"FileOM/Load/TriMeshHandling",TYPEAUTODETECT).toInt() );
709 loadVertexNormal_->setChecked( OpenFlipperSettings().value(
"FileOM/Load/Normals",
true).toBool() );
710 loadVertexTexCoord_->setChecked( OpenFlipperSettings().value(
"FileOM/Load/TexCoords",
true).toBool() );
711 loadVertexColor_->setChecked( OpenFlipperSettings().value(
"FileOM/Load/VertexColor",
true).toBool() );
712 loadFaceColor_->setChecked( OpenFlipperSettings().value(
"FileOM/Load/FaceColor",
true).toBool() );
713 loadFaceNormal_->setChecked( OpenFlipperSettings().value(
"FileOM/Load/FaceNormal",
true).toBool() );
714 loadFaceTexCoord_->setChecked( OpenFlipperSettings().value(
"FileOM/Load/FaceTexCoords",
true).toBool() );
715 loadCustomProperties_->setChecked( OpenFlipperSettings().value(
"FileOM/Load/CustomProperties",
true).toBool() );
716 loadStatus_->setChecked( OpenFlipperSettings().value(
"FileOM/Load/Status",
true).toBool() );
726 if (OpenFlipperSettings().value(
"FileOM/Load/Normals",
true).toBool())
728 if (OpenFlipperSettings().value(
"FileOM/Load/TexCoords",
true).toBool())
730 if (OpenFlipperSettings().value(
"FileOM/Load/VertexColor",
true).toBool())
732 if (OpenFlipperSettings().value(
"FileOM/Load/FaceColor",
true).toBool())
734 if (OpenFlipperSettings().value(
"FileOM/Load/FaceNormal",
true).toBool())
736 if (OpenFlipperSettings().value(
"FileOM/Load/FaceTexCoords",
true).toBool())
738 if (OpenFlipperSettings().value(
"FileOM/Load/CustomProperties",
true).toBool())
740 if (OpenFlipperSettings().value(
"FileOM/Load/Status",
true).toBool())
748 OpenFlipperSettings().
setValue(
"FileOM/Load/Normals", loadVertexNormal_->isChecked() );
749 OpenFlipperSettings().
setValue(
"FileOM/Load/TexCoords", loadVertexTexCoord_->isChecked() );
750 OpenFlipperSettings().
setValue(
"FileOM/Load/VertexColor", loadVertexColor_->isChecked() );
751 OpenFlipperSettings().
setValue(
"FileOM/Load/FaceColor", loadFaceColor_->isChecked() );
752 OpenFlipperSettings().
setValue(
"FileOM/Load/FaceNormal", loadFaceNormal_->isChecked() );
753 OpenFlipperSettings().
setValue(
"FileOM/Load/FaceTexCoords", loadFaceTexCoord_->isChecked() );
754 OpenFlipperSettings().
setValue(
"FileOM/Load/CustomProperties", loadCustomProperties_->isChecked() );
755 OpenFlipperSettings().
setValue(
"FileOM/Load/Status", loadStatus_->isChecked() );
757 OpenFlipperSettings().
setValue(
"FileOM/Load/TriMeshHandling", triMeshHandling_->currentIndex() );
759 OpenFlipperSettings().
setValue(
"Core/File/UseLoadDefaults",
true );
765 OpenFlipperSettings().
setValue(
"FileOM/Save/Binary", saveBinary_->isChecked() );
766 OpenFlipperSettings().
setValue(
"FileOM/Save/Normals", saveVertexNormal_->isChecked() );
767 OpenFlipperSettings().
setValue(
"FileOM/Save/TexCoords", saveVertexTexCoord_->isChecked() );
768 OpenFlipperSettings().
setValue(
"FileOM/Save/VertexColor", saveVertexColor_->isChecked() );
769 OpenFlipperSettings().
setValue(
"FileOM/Save/FaceColor", saveFaceColor_->isChecked() );
770 OpenFlipperSettings().
setValue(
"FileOM/Save/FaceNormal", saveFaceNormal_->isChecked() );
771 OpenFlipperSettings().
setValue(
"FileOM/Save/FaceTexCoords", saveFaceTexCoord_->isChecked() );
772 OpenFlipperSettings().
setValue(
"FileOM/Save/CustomProperties", saveCustomProperties_->isChecked() );
773 OpenFlipperSettings().
setValue(
"FileOM/Save/Status", saveStatus_->isChecked() );
#define DATA_TRIANGLE_MESH
QString filename() const
return the filename of the object
bool dataType(DataType _type) const
QWidget * saveOptionsWidget(QString)
FileOMPlugin()
Constructor.
int loadPolyMeshObject(QString _filename)
Always loads mesh as polymesh.
void slotSaveDefault()
Slot called when user wants to save the given Save options as default.
int loadObject(QString _filename)
Loads Object and converts it to a triangle mesh if possible.
int loadTriMeshObject(QString _filename)
Loads a triangle mesh.
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 initializePlugin()
Initialize Plugin.
void slotLoadDefault()
Slot called when user wants to save the given Load options as default.
DataType supportedType()
Return your supported object type( e.g. DATA_TRIANGLE_MESH )
QWidget * loadOptionsWidget(QString)
MeshT * mesh()
return a pointer to the mesh
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.
@ FaceTexCoord
Has (r) / store (w) face texture coordinates.
@ Binary
Set binary mode for r/w.
@ Default
By default write persistent custom properties.
@ Status
Has (r) / store (w) status properties.
@ 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...
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.
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.