diff --git a/src/Mod/Mesh/App/AppMesh.cpp b/src/Mod/Mesh/App/AppMesh.cpp
index e73e111335..9e8b13932e 100644
--- a/src/Mod/Mesh/App/AppMesh.cpp
+++ b/src/Mod/Mesh/App/AppMesh.cpp
@@ -26,6 +26,7 @@
#include
#include
+#include "Exporter.h"
#include "Mesh.h"
#include "MeshPy.h"
#include "MeshPointPy.h"
@@ -68,6 +69,8 @@ PyMOD_INIT_FUNC(Mesh)
Base::Interpreter().addType(&Mesh::MeshPy ::Type,meshModule,"Mesh");
Base::Interpreter().addType(&Mesh::MeshFeaturePy::Type,meshModule,"Feature");
+ Mesh::Extension3MFFactory::addProducer(new Mesh::GuiExtension3MFProducer);
+
// init Type system
Mesh::PropertyNormalList ::init();
Mesh::PropertyCurvatureList ::init();
diff --git a/src/Mod/Mesh/App/Exporter.cpp b/src/Mod/Mesh/App/Exporter.cpp
index cf05682983..7140deac27 100644
--- a/src/Mod/Mesh/App/Exporter.cpp
+++ b/src/Mod/Mesh/App/Exporter.cpp
@@ -229,25 +229,52 @@ bool MergeExporter::addMesh(const char *name, const MeshObject & mesh)
// ----------------------------------------------------------------------------
-void Extension3MFFactory::addProducer(AbstractExtensionProducer* ext)
+AbstractFormatExtensionPtr GuiExtension3MFProducer::create() const
+{
+ return nullptr;
+}
+
+void GuiExtension3MFProducer::initialize()
+{
+ Base::PyGILStateLocker lock;
+ PyObject* module = PyImport_ImportModule("MeshGui");
+ if (module)
+ Py_DECREF(module);
+ else
+ PyErr_Clear();
+}
+
+void Extension3MFFactory::addProducer(Extension3MFProducer* ext)
{
producer.emplace_back(ext);
}
+void Extension3MFFactory::initialize()
+{
+ std::vector ext = producer;
+ for (const auto& it : ext) {
+ it->initialize();
+ }
+}
+
std::vector Extension3MFFactory::create()
{
std::vector ext;
- for (const auto& it : producer)
- ext.emplace_back(it->create());
+ for (const auto& it : producer) {
+ Extension3MFPtr ptr = std::dynamic_pointer_cast(it->create());
+ if (ptr)
+ ext.push_back(ptr);
+ }
return ext;
}
-std::vector Extension3MFFactory::producer;
+std::vector Extension3MFFactory::producer;
class Exporter3MF::Private {
public:
explicit Private(const std::string& filename)
: writer3mf(filename) {
+ Extension3MFFactory::initialize();
ext = Extension3MFFactory::create();
}
MeshCore::Writer3MF writer3mf;
diff --git a/src/Mod/Mesh/App/Exporter.h b/src/Mod/Mesh/App/Exporter.h
index bbdcac6cc4..7ca4804f48 100644
--- a/src/Mod/Mesh/App/Exporter.h
+++ b/src/Mod/Mesh/App/Exporter.h
@@ -92,17 +92,32 @@ protected:
std::string fName;
};
+// ------------------------------------------------------------------------------------------------
+
+/*!
+ * \brief The AbstractExtension class
+ * Abstract base class for file format extensions
+ */
+class MeshExport AbstractFormatExtension
+{
+protected:
+ AbstractFormatExtension() = default;
+
+public:
+ virtual ~AbstractFormatExtension() = default;
+};
+
+using AbstractFormatExtensionPtr = std::shared_ptr;
+
/*!
* \brief The Extension3MF class
* Abstract base class for 3MF extensions
*/
-class MeshExport Extension3MF
+class MeshExport Extension3MF : public AbstractFormatExtension
{
public:
using Resource = MeshCore::Resource3MF;
Extension3MF() = default;
- virtual ~Extension3MF() = default;
-
virtual Resource addMesh(const MeshObject & mesh) = 0;
};
@@ -110,18 +125,43 @@ using Extension3MFPtr = std::shared_ptr;
/*!
* \brief The AbstractExtensionProducer class
- * Abstract base class to create an instance of an Extension3MF.
+ * Abstract base class to create an instance of an AbstractFormatExtension.
*/
class MeshExport AbstractExtensionProducer
{
public:
AbstractExtensionProducer() = default;
virtual ~AbstractExtensionProducer() = default;
- virtual Extension3MFPtr create() const = 0;
+ virtual AbstractFormatExtensionPtr create() const = 0;
};
using AbstractExtensionProducerPtr = std::shared_ptr;
+/*!
+ * \brief The Extension3MFProducer class
+ * Abstract base class to create an instance of an Extension3MF.
+ */
+class MeshExport Extension3MFProducer : public AbstractExtensionProducer
+{
+public:
+ Extension3MFProducer() = default;
+ virtual void initialize() = 0;
+};
+
+using Extension3MFProducerPtr = std::shared_ptr;
+
+/*!
+ * \brief The GuiExtension3MFProducer class
+ * This class tries to load the MeshGui module to register further 3MF extensions.
+ */
+class MeshExport GuiExtension3MFProducer : public Extension3MFProducer
+{
+public:
+ GuiExtension3MFProducer() = default;
+ void initialize() override;
+ AbstractFormatExtensionPtr create() const override;
+};
+
/*!
* \brief The Extension3MFFactory class
* Factor class to manage the producers of Extension3MF
@@ -129,13 +169,16 @@ using AbstractExtensionProducerPtr = std::shared_ptr;
class MeshExport Extension3MFFactory
{
public:
- static void addProducer(AbstractExtensionProducer* ext);
+ static void addProducer(Extension3MFProducer* ext);
+ static void initialize();
static std::vector create();
private:
- static std::vector producer;
+ static std::vector producer;
};
+// ------------------------------------------------------------------------------------------------
+
/// Used for exporting to 3D Manufacturing Format (3MF)
/*!
* The constructor and destructor write the beginning and end of the 3MF,
diff --git a/src/Mod/Mesh/Gui/ThumbnailExtension.h b/src/Mod/Mesh/Gui/ThumbnailExtension.h
index ff76b53a2e..e773e40b86 100644
--- a/src/Mod/Mesh/Gui/ThumbnailExtension.h
+++ b/src/Mod/Mesh/Gui/ThumbnailExtension.h
@@ -39,11 +39,12 @@ private:
int index = 0;
};
-class ThumbnailExtensionProducer : public Mesh::AbstractExtensionProducer {
+class ThumbnailExtensionProducer : public Mesh::Extension3MFProducer {
public:
- Mesh::Extension3MFPtr create() const override {
+ Mesh::AbstractFormatExtensionPtr create() const override {
return std::make_shared();
}
+ void initialize() override {}
};
} // namespace MeshGui