diff --git a/src/Mod/Fem/App/FemMeshPy.xml b/src/Mod/Fem/App/FemMeshPy.xml
index a834a10fef..30858b72a7 100755
--- a/src/Mod/Fem/App/FemMeshPy.xml
+++ b/src/Mod/Fem/App/FemMeshPy.xml
@@ -158,6 +158,16 @@
Return a tuple of ElementIDs to a given group ID
+
+
+ Return the element type of a given ID
+
+
+
+
+ Return a tuple of IDs to a given element type
+
+
Dictionary of Nodes by ID (int ID:Vector())
diff --git a/src/Mod/Fem/App/FemMeshPyImp.cpp b/src/Mod/Fem/App/FemMeshPyImp.cpp
index 798c66bcf0..7f7e2bb85e 100644
--- a/src/Mod/Fem/App/FemMeshPyImp.cpp
+++ b/src/Mod/Fem/App/FemMeshPyImp.cpp
@@ -1031,6 +1031,81 @@ PyObject* FemMeshPy::getGroupElements(PyObject *args)
return Py::new_reference_to(tuple);
}
+PyObject* FemMeshPy::getElementType(PyObject *args)
+{
+ int id;
+ if (!PyArg_ParseTuple(args, "i", &id))
+ return 0;
+
+ // An element ...
+ SMDSAbs_ElementType aElementType = getFemMeshPtr()->getSMesh()->GetElementType(id, true);
+ // ... or a node
+ if (aElementType == SMDSAbs_All)
+ aElementType = getFemMeshPtr()->getSMesh()->GetElementType(id, false);
+
+ const char* typeString = "";
+ switch(aElementType) {
+ case SMDSAbs_Node : typeString = "Node"; break;
+ case SMDSAbs_Edge : typeString = "Edge"; break;
+ case SMDSAbs_Face : typeString = "Face"; break;
+ case SMDSAbs_Volume : typeString = "Volume"; break;
+ case SMDSAbs_0DElement : typeString = "0DElement"; break;
+ case SMDSAbs_Ball : typeString = "Ball"; break;
+ default: {
+ PyErr_SetString(PyExc_ValueError, "No node or element for given id");
+ return 0;
+ }
+ }
+
+#if PY_MAJOR_VERSION >= 3
+ return PyUnicode_FromString(typeString);
+#else
+ return PyString_FromString(typeString);
+#endif
+}
+
+PyObject* FemMeshPy::getIdByElementType(PyObject *args)
+{
+ char* str;
+ if (!PyArg_ParseTuple(args, "s", &str))
+ return 0;
+
+ SMDSAbs_ElementType aElementType = SMDSAbs_All;
+ if (strcmp(str, "Node") == 0) {
+ aElementType = SMDSAbs_Node;
+ }
+ else if (strcmp(str, "Edge") == 0) {
+ aElementType = SMDSAbs_Edge;
+ }
+ else if (strcmp(str, "Face") == 0) {
+ aElementType = SMDSAbs_Face;
+ }
+ else if (strcmp(str, "Volume") == 0) {
+ aElementType = SMDSAbs_Volume;
+ }
+ else if (strcmp(str, "0DElement") == 0) {
+ aElementType = SMDSAbs_0DElement;
+ }
+ else if (strcmp(str, "Ball") == 0) {
+ aElementType = SMDSAbs_Ball;
+ }
+
+ std::set ids;
+ SMDS_ElemIteratorPtr aElemIter = getFemMeshPtr()->getSMesh()->GetMeshDS()->elementsIterator(aElementType);
+ while (aElemIter->more()) {
+ const SMDS_MeshElement* aElem = aElemIter->next();
+ ids.insert(aElem->GetID());
+ }
+
+ Py::Tuple tuple(ids.size());
+ int index = 0;
+ for (std::set::iterator it = ids.begin(); it != ids.end(); ++it) {
+ tuple.setItem(index++, Py::Long(*it));
+ }
+
+ return Py::new_reference_to(tuple);
+}
+
// ===== Attributes ============================================================
Py::Dict FemMeshPy::getNodes(void) const