+ FEM: add a couple of methods to Python interface

This commit is contained in:
wmayer 2015-05-09 00:15:05 +02:00
parent 9e89f2ff9a
commit 814c144ecb
4 changed files with 115 additions and 4 deletions

View File

@ -625,6 +625,17 @@ std::set<int> FemMesh::getNodesByVertex(const TopoDS_Vertex &vertex) const
return result;
}
std::set<int> FemMesh::getElementNodes(int id) const
{
std::set<int> result;
const SMDS_MeshElement* elem = myMesh->GetMeshDS()->FindElement(id);
if (elem) {
for (int i = 0; i < elem->NbNodes(); i++)
result.insert(elem->GetNode(i)->GetID());
}
return result;
}
void FemMesh::readNastran(const std::string &Filename)
{
Base::TimeInfo Start;

View File

@ -93,6 +93,8 @@ public:
std::set<int> getNodesByEdge(const TopoDS_Edge &edge) const;
/// retrieving by vertex
std::set<int> getNodesByVertex(const TopoDS_Vertex &vertex) const;
/// retrieving node IDs by element ID
std::set<int> getElementNodes(int id) const;
/// retrieving volume IDs and face IDs number by face
std::map<int, int> getVolumesByFace(const TopoDS_Face &face) const;
/// retrieving volume IDs and CalculiX face number by face

View File

@ -114,6 +114,11 @@
<UserDocu>Return a list of node IDs which belong to a TopoVertex</UserDocu>
</Documentation>
</Methode>
<Methode Name="getElementNodes" Const="true">
<Documentation>
<UserDocu>Return a tuple of node IDs to a given element ID</UserDocu>
</Documentation>
</Methode>
<Attribute Name="Nodes" ReadOnly="true">
<Documentation>
<UserDocu>Dictionary of Nodes by ID (int ID:Vector())</UserDocu>
@ -126,13 +131,25 @@
</Documentation>
<Parameter Name="NodeCount" Type="Int"/>
</Attribute>
<Attribute Name="Edges" ReadOnly="true">
<Documentation>
<UserDocu>Tuple of edge IDs</UserDocu>
</Documentation>
<Parameter Name="Edges" Type="Tuple"/>
</Attribute>
<Attribute Name="EdgeCount" ReadOnly="true">
<Documentation>
<UserDocu>Number of edges in the Mesh.</UserDocu>
</Documentation>
<Parameter Name="EdgeCount" Type="Int"/>
</Attribute>
<Attribute Name="FacesCount" ReadOnly="true">
<Attribute Name="Faces" ReadOnly="true">
<Documentation>
<UserDocu>Tuple of face IDs</UserDocu>
</Documentation>
<Parameter Name="Faces" Type="Tuple"/>
</Attribute>
<Attribute Name="FaceCount" ReadOnly="true">
<Documentation>
<UserDocu>Number of Faces in the Mesh.</UserDocu>
</Documentation>
@ -156,8 +173,13 @@
</Documentation>
<Parameter Name="PolygonCount" Type="Int"/>
</Attribute>
<Attribute Name="VolumeCount" ReadOnly="true">
<Attribute Name="Volumes" ReadOnly="true">
<Documentation>
<UserDocu>Tuple of volume IDs</UserDocu>
</Documentation>
<Parameter Name="Volumes" Type="Tuple"/>
</Attribute>
<Attribute Name="VolumeCount" ReadOnly="true">
<Documentation>
<UserDocu>Number of Volumes in the Mesh.</UserDocu>
</Documentation>

View File

@ -683,6 +683,28 @@ PyObject* FemMeshPy::getNodesByVertex(PyObject *args)
}
}
PyObject* FemMeshPy::getElementNodes(PyObject *args)
{
int id;
if (!PyArg_ParseTuple(args, "i", &id))
return 0;
try {
std::set<int> resultSet = getFemMeshPtr()->getElementNodes(id);
Py::Tuple ret(resultSet.size());
int index = 0;
for (std::set<int>::const_iterator it = resultSet.begin();it!=resultSet.end();++it)
ret.setItem(index++, Py::Int(*it));
return Py::new_reference_to(ret);
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
PyErr_SetString(Base::BaseExceptionFreeCADError, e->GetMessageString());
return 0;
}
}
// ===== Atributes ============================================================
@ -714,12 +736,48 @@ Py::Int FemMeshPy::getNodeCount(void) const
return Py::Int(getFemMeshPtr()->getSMesh()->NbNodes());
}
Py::Tuple FemMeshPy::getEdges(void) const
{
std::set<int> ids;
SMDS_EdgeIteratorPtr aEdgeIter = getFemMeshPtr()->getSMesh()->GetMeshDS()->edgesIterator();
while (aEdgeIter->more()) {
const SMDS_MeshEdge* aEdge = aEdgeIter->next();
ids.insert(aEdge->GetID());
}
Py::Tuple tuple(ids.size());
int index = 0;
for (std::set<int>::iterator it = ids.begin(); it != ids.end(); ++it) {
tuple.setItem(index++, Py::Int(*it));
}
return tuple;
}
Py::Int FemMeshPy::getEdgeCount(void) const
{
return Py::Int(getFemMeshPtr()->getSMesh()->NbEdges());
}
Py::Int FemMeshPy::getFacesCount(void) const
Py::Tuple FemMeshPy::getFaces(void) const
{
std::set<int> ids;
SMDS_FaceIteratorPtr aFaceIter = getFemMeshPtr()->getSMesh()->GetMeshDS()->facesIterator();
while (aFaceIter->more()) {
const SMDS_MeshFace* aFace = aFaceIter->next();
ids.insert(aFace->GetID());
}
Py::Tuple tuple(ids.size());
int index = 0;
for (std::set<int>::iterator it = ids.begin(); it != ids.end(); ++it) {
tuple.setItem(index++, Py::Int(*it));
}
return tuple;
}
Py::Int FemMeshPy::getFaceCount(void) const
{
return Py::Int(getFemMeshPtr()->getSMesh()->NbFaces());
}
@ -739,6 +797,24 @@ Py::Int FemMeshPy::getPolygonCount(void) const
return Py::Int(getFemMeshPtr()->getSMesh()->NbPolygons());
}
Py::Tuple FemMeshPy::getVolumes(void) const
{
std::set<int> ids;
SMDS_VolumeIteratorPtr aVolIter = getFemMeshPtr()->getSMesh()->GetMeshDS()->volumesIterator();
while (aVolIter->more()) {
const SMDS_MeshVolume* aVol = aVolIter->next();
ids.insert(aVol->GetID());
}
Py::Tuple tuple(ids.size());
int index = 0;
for (std::set<int>::iterator it = ids.begin(); it != ids.end(); ++it) {
tuple.setItem(index++, Py::Int(*it));
}
return tuple;
}
Py::Int FemMeshPy::getVolumeCount(void) const
{
return Py::Int(getFemMeshPtr()->getSMesh()->NbVolumes());