Release GIL while meshing in MeshPart.meshFromShape

This commit releases the Global Interpreter Lock around mesher call and
should enable multithreading use when exporting large quantities of
objects (for instance for external rendering).
This commit is contained in:
howetuft
2024-02-13 04:38:30 +01:00
committed by wwmayer
parent adf69f23f6
commit b39d246c27

View File

@@ -474,6 +474,15 @@ private:
{
PyObject *shape;
auto runMesher = [](const MeshPart::Mesher& mesher) {
Mesh::MeshObject* mesh;
{
Base::PyGILStateRelease releaser{};
mesh = mesher.createMesh();
}
return Py::asObject(new Mesh::MeshPy(mesh));
};
static const std::array<const char *, 7> kwds_lindeflection{"Shape", "LinearDeflection", "AngularDeflection",
"Relative", "Segments", "GroupColors", nullptr};
PyErr_Clear();
@@ -509,7 +518,7 @@ private:
}
mesher.setColors(colors);
}
return Py::asObject(new Mesh::MeshPy(mesher.createMesh()));
return runMesher(mesher);
}
static const std::array<const char *, 3> kwds_maxLength{"Shape", "MaxLength", nullptr};
@@ -521,7 +530,7 @@ private:
mesher.setMethod(MeshPart::Mesher::Mefisto);
mesher.setMaxLength(maxLength);
mesher.setRegular(true);
return Py::asObject(new Mesh::MeshPy(mesher.createMesh()));
return runMesher(mesher);
}
static const std::array<const char *, 3> kwds_maxArea{"Shape", "MaxArea", nullptr};
@@ -533,7 +542,7 @@ private:
mesher.setMethod(MeshPart::Mesher::Mefisto);
mesher.setMaxArea(maxArea);
mesher.setRegular(true);
return Py::asObject(new Mesh::MeshPy(mesher.createMesh()));
return runMesher(mesher);
}
static const std::array<const char *, 3> kwds_localLen{"Shape", "LocalLength", nullptr};
@@ -545,7 +554,7 @@ private:
mesher.setMethod(MeshPart::Mesher::Mefisto);
mesher.setLocalLength(localLen);
mesher.setRegular(true);
return Py::asObject(new Mesh::MeshPy(mesher.createMesh()));
return runMesher(mesher);
}
static const std::array<const char *, 3> kwds_deflection{"Shape", "Deflection", nullptr};
@@ -557,7 +566,7 @@ private:
mesher.setMethod(MeshPart::Mesher::Mefisto);
mesher.setDeflection(deflection);
mesher.setRegular(true);
return Py::asObject(new Mesh::MeshPy(mesher.createMesh()));
return runMesher(mesher);
}
static const std::array<const char *, 4> kwds_minmaxLen{"Shape", "MinLength", "MaxLength", nullptr};
@@ -569,7 +578,7 @@ private:
mesher.setMethod(MeshPart::Mesher::Mefisto);
mesher.setMinMaxLengths(minLen, maxLen);
mesher.setRegular(true);
return Py::asObject(new Mesh::MeshPy(mesher.createMesh()));
return runMesher(mesher);
}
static const std::array<const char *, 8> kwds_fineness{"Shape", "Fineness", "SecondOrder", "Optimize",
@@ -587,7 +596,7 @@ private:
mesher.setOptimize(optimize != 0);
mesher.setQuadAllowed(allowquad != 0);
mesher.setMinMaxLengths(minLen, maxLen);
return Py::asObject(new Mesh::MeshPy(mesher.createMesh()));
return runMesher(mesher);
#else
throw Py::RuntimeError("SMESH was built without NETGEN support");
#endif
@@ -612,7 +621,7 @@ private:
mesher.setOptimize(optimize != 0);
mesher.setQuadAllowed(allowquad != 0);
mesher.setMinMaxLengths(minLen, maxLen);
return Py::asObject(new Mesh::MeshPy(mesher.createMesh()));
return runMesher(mesher);
#else
throw Py::RuntimeError("SMESH was built without NETGEN support");
#endif
@@ -627,7 +636,7 @@ private:
mesher.setMethod(MeshPart::Mesher::Mefisto);
mesher.setRegular(true);
#endif
return Py::asObject(new Mesh::MeshPy(mesher.createMesh()));
return runMesher(mesher);
}
throw Py::TypeError("Wrong arguments");