From 44530b23ca34fc1a1db5a4b19769ef649bf4ccb8 Mon Sep 17 00:00:00 2001 From: alemuntoni Date: Fri, 16 Apr 2021 12:48:59 +0200 Subject: [PATCH] new open for loading multiple layers --- src/common/CMakeLists.txt | 1 + src/common/common.pro | 1 + src/common/plugins/interfaces/io_plugin.cpp | 48 +++++++++ src/common/plugins/interfaces/io_plugin.h | 112 +++++++++++++------- 4 files changed, 124 insertions(+), 38 deletions(-) create mode 100644 src/common/plugins/interfaces/io_plugin.cpp diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 28e48f8e1..b8251cdb3 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -100,6 +100,7 @@ set(SOURCES plugins/interfaces/meshlab_plugin_logger.cpp plugins/interfaces/decorate_plugin.cpp plugins/interfaces/filter_plugin.cpp + plugins/interfaces/io_plugin.cpp plugins/meshlab_plugin_type.cpp plugins/plugin_manager.cpp ml_document/helpers/mesh_document_state_data.cpp diff --git a/src/common/common.pro b/src/common/common.pro index f61c3d070..5f57e013d 100644 --- a/src/common/common.pro +++ b/src/common/common.pro @@ -91,6 +91,7 @@ SOURCES += \ plugins/interfaces/meshlab_plugin_logger.cpp \ plugins/interfaces/decorate_plugin.cpp \ plugins/interfaces/filter_plugin.cpp \ + plugins/interfaces/io_plugin.cpp \ plugins/meshlab_plugin_type.cpp \ plugins/plugin_manager.cpp \ ml_document/helpers/mesh_document_state_data.cpp \ diff --git a/src/common/plugins/interfaces/io_plugin.cpp b/src/common/plugins/interfaces/io_plugin.cpp new file mode 100644 index 000000000..09cc6e19f --- /dev/null +++ b/src/common/plugins/interfaces/io_plugin.cpp @@ -0,0 +1,48 @@ +#include "io_plugin.h" +#include "../../ml_document/mesh_document.h" + +void IOPlugin::open( + const QString& format, + const QString& fileName, + MeshDocument& md, + std::list& meshModelList, + std::list& maskList, + const RichParameterList& par, + vcg::CallBackPos* cb) +{ + QFileInfo info(fileName); + MeshModel *mm = md.addNewMesh(fileName, info.fileName()); + meshModelList.push_back(mm); + int mask; + try { + open(format, fileName, *mm, mask, par, cb); + maskList.push_back(mask); + } + catch(const MLException& exc){ + md.delMesh(mm); + throw exc; + } +} + +void IOPlugin::reportWarning(const QString& warningMessage) const +{ + MeshLabPluginLogger::log(GLLogStream::WARNING, warningMessage.toStdString()); + warnString += "\n" + warningMessage; +} + +void IOPlugin::wrongOpenFormat(const QString& format) +{ + throw MLException("Internal error: unknown open format " + format + " to " + pluginName() + " plugin."); +} + +void IOPlugin::wrongSaveFormat(const QString& format) +{ + throw MLException("Internal error: unknown save format " + format + " to " + pluginName() + " plugin."); +} + +QString IOPlugin::warningMessageString() const +{ + QString tmp = warnString; + warnString.clear(); + return tmp; +} diff --git a/src/common/plugins/interfaces/io_plugin.h b/src/common/plugins/interfaces/io_plugin.h index eb52796ad..7f5361f54 100644 --- a/src/common/plugins/interfaces/io_plugin.h +++ b/src/common/plugins/interfaces/io_plugin.h @@ -37,8 +37,8 @@ class IOPlugin : virtual public MeshLabPlugin, virtual public MeshLabPluginLogger { public: - IOPlugin() : MeshLabPluginLogger() { } - virtual ~IOPlugin() {} + IOPlugin() : MeshLabPluginLogger() { } + virtual ~IOPlugin() { } /** * @brief The importFormats function returns a list of all the @@ -58,7 +58,15 @@ public: */ virtual std::list exportFormats() const = 0; - virtual std::list importRasterFormats() const {return std::list();} + /** + * @brief If yout plugin supports loading also raster formats, re-implement + * this function, returning the list of raster formats supported by + * your openRaster function. + */ + virtual std::list importRasterFormats() const + { + return std::list(); + } /** * @brief The initPreOpenParameter function is called to initialize the list @@ -66,9 +74,9 @@ public: * called by the framework BEFORE the actual mesh loading to determine how * to parse the input file. The instanced parameters are then passed to the * open at the loading time. - * Typical example of use to decide what subportion of a mesh you have to load. - * If you do not need any additional processing simply do not override this - * and ignore the parameterList in the open member function + * Typical example of use to decide what subportion of a mesh you have to + * load. If you do not need any additional processing simply do not override + * this and ignore the parameterList in the open member function */ virtual void initPreOpenParameter( const QString& /*format*/, @@ -133,12 +141,18 @@ public: int& defaultBits) const = 0; /** - * @brief The open function is called by the framework everytime a mesh is loaded. + * @brief The open function is called by the framework everytime a mesh is + * loaded. Re-implement this function if the format file you want to open + * can contain just one mesh. If your file can contain more than one mesh, + * re-implement the "open" function that takes as input the MeshDocument + * instead of the MeshModel (see below). * @param format: the extension of the format e.g. "PLY" * @param fileName: the name of the file to be opened (including its path) * @param m: the mesh that is filled with the file content - * @param mask: a bit mask that will be filled reporting what kind of data we have found in the file (per vertex color, texture coords etc) - * @param par: the parameters that have been set up in the initPreOpenParameter() + * @param mask: a bit mask that will be filled reporting what kind of data + * we have found in the file (per vertex color, texture coords etc) + * @param par: the parameters that have been set up in the + * initPreOpenParameter() * @param cb: standard callback for reporting progress in the loading */ virtual void open( @@ -150,11 +164,39 @@ public: vcg::CallBackPos *cb = nullptr) = 0; /** - * @brief The save function is called by the framework everytime a mesh is saved. + * @brief The open function is called by the framework everytime a mesh is + * loaded. Re-implement this function if your plugin supports loading format + * file that could load more than one mesh layer. For other formats, call + * the implementation of this interface class, that will take care of + * calling the open function for a single layer. * @param format: the extension of the format e.g. "PLY" - * @param fileName: the name of the file on which save the mesh m (including its path) + * @param fileName: the name of the file to be opened (including its path) + * @param m: the mesh that is filled with the file content + * @param mask: a bit mask that will be filled reporting what kind of data + * we have found in the file (per vertex color, texture coords etc) + * @param par: the parameters that have been set up in the + * initPreOpenParameter() + * @param cb: standard callback for reporting progress in the loading + */ + virtual void open( + const QString &format, + const QString &fileName, + MeshDocument &md, + std::list& meshModelList, + std::list& maskList, + const RichParameterList & par, + vcg::CallBackPos *cb = nullptr); + + /** + * @brief The save function is called by the framework everytime a mesh is + * saved. + * @param format: the extension of the format e.g. "PLY" + * @param fileName: the name of the file on which save the mesh m + * (including its path) * @param m: the mesh to be saved in the file - * @param mask: a bit mask indicating what kind of the data present in the mesh should be saved (e.g. you could not want to save normals in ply files) + * @param mask: a bit mask indicating what kind of the data present in the + * mesh should be saved (e.g. you could not want to save normals in + * ply files) * @param par: the parameters that have been set up in the initSaveParameter() * @param cb: standard callback for reporting progress in the saving */ @@ -166,6 +208,14 @@ public: const RichParameterList & par, vcg::CallBackPos *cb) = 0; + /** + * @brief If your plugin supports raster formats, re-implement this + * function. + * @param format: the extension of the format e.g. "JPG" + * @param filename: the name of the file to be opened (including its path) + * @param rm: the raster model on which save the loaded raster + * @param cb: standard callback for reporting progress while opening + */ virtual void openRaster( const QString& /*format*/, const QString& /*fileName*/, @@ -174,49 +224,35 @@ public: {}; /** - * @brief The reportWarning function should be used everytime that a non-critical - * error while loading or saving a file happens. This function appends the - * warning message passed as parameter to a string that will be shown - * by the framework at the end of the execution of the load/save function + * @brief The reportWarning function should be used everytime that a + * non-critical error while loading or saving a file happens. This function + * appends the warning message passed as parameter to a string that will be + * shown by the framework at the end of the execution of the load/save + * function * @param warningMessage */ - void reportWarning(const QString& warningMessage) const - { - MeshLabPluginLogger::log(GLLogStream::WARNING, warningMessage.toStdString()); - warnString += "\n" + warningMessage; - } + void reportWarning(const QString& warningMessage) const; /** * @brief call this function in any of the import functions * (initPreOpenParameters, load...) whenever you receive as parameter a * format that is not supported by your plugin */ - void wrongOpenFormat(const QString& format) - { - throw MLException("Internal error: unknown open format " + format + " to " + pluginName() + " plugin."); - }; + void wrongOpenFormat(const QString& format); /** * @brief call this function in any of the export functions * (exportMaskCapability, save...) whenever you receive as parameter a * format that is not supported by your plugin */ - void wrongSaveFormat(const QString& format) - { - throw MLException("Internal error: unknown save format " + format + " to " + pluginName() + " plugin."); - }; + void wrongSaveFormat(const QString& format); /** - * @brief The warningMessageString is invoked by the framework after the execution - * of load/save function. It returns the warning string containing all the - * warinings produced by the function, and it clears the string. + * @brief The warningMessageString is invoked by the framework after the + * execution of load/save function. It returns the warning string containing + * all the warinings produced by the function, and it clears the string. */ - QString warningMessageString() const - { - QString tmp = warnString; - warnString.clear(); - return tmp; - }; + QString warningMessageString() const; private: mutable QString warnString;