From 4156a32ad7fb9b7ec5daeac4636130faf02a6826 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 20 Jan 2019 17:58:30 +0100 Subject: [PATCH] add convenience functions to get element type to id and vice versa --- src/Mod/Fem/App/FemMeshPy.xml | 10 +++++ src/Mod/Fem/App/FemMeshPyImp.cpp | 75 ++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) 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