Add methods to get complete information of nodes, elements, submeshes

This commit is contained in:
eap 2006-05-04 14:17:32 +00:00
parent 054a8f6dba
commit ef0d88b1bb
2 changed files with 508 additions and 0 deletions

View File

@ -46,6 +46,9 @@
#include "SMESH_MeshEditor_i.hxx"
#include "SMESH_Gen_i.hxx"
#include "DriverMED_R_SMESHDS_Mesh.h"
//#include "SMDS_ElemIterator.hxx"
#include "SMDS_VolumeTool.hxx"
#include "SMESH_MesherHelper.hxx"
// OCCT Includes
#include <OSD_Path.hxx>
@ -1631,6 +1634,106 @@ SMESH::ElementType SMESH_Mesh_i::GetElementType( const CORBA::Long id, const boo
return ( SMESH::ElementType )_impl->GetElementType( id, iselem );
}
//=============================================================================
/*!
* Returns ID of elements for given submesh
*/
//=============================================================================
SMESH::long_array* SMESH_Mesh_i::GetSubMeshElementsId(const CORBA::Long ShapeID)
throw (SALOME::SALOME_Exception)
{
SMESH::long_array_var aResult = new SMESH::long_array();
SMESH_subMesh* SM = _impl->GetSubMeshContaining(ShapeID);
if(!SM) return aResult._retn();
SMESHDS_SubMesh* SDSM = SM->GetSubMeshDS();
if(!SDSM) return aResult._retn();
aResult->length(SDSM->NbElements());
SMDS_ElemIteratorPtr eIt = SDSM->GetElements();
int i = 0;
while ( eIt->more() ) {
aResult[i++] = eIt->next()->GetID();
}
return aResult._retn();
}
//=============================================================================
/*!
* Returns ID of nodes for given submesh
* If param all==true - returns all nodes, else -
* returns only nodes on shapes.
*/
//=============================================================================
SMESH::long_array* SMESH_Mesh_i::GetSubMeshNodesId(const CORBA::Long ShapeID, CORBA::Boolean all)
throw (SALOME::SALOME_Exception)
{
SMESH::long_array_var aResult = new SMESH::long_array();
SMESH_subMesh* SM = _impl->GetSubMeshContaining(ShapeID);
if(!SM) return aResult._retn();
SMESHDS_SubMesh* SDSM = SM->GetSubMeshDS();
if(!SDSM) return aResult._retn();
map<int,const SMDS_MeshElement*> theElems;
if( !all || (SDSM->NbElements()==0 && SDSM->NbNodes()==1) ) {
SMDS_NodeIteratorPtr nIt = SDSM->GetNodes();
while ( nIt->more() ) {
const SMDS_MeshNode* elem = nIt->next();
theElems.insert( make_pair(elem->GetID(),elem) );
}
}
else { // all nodes of submesh elements
SMDS_ElemIteratorPtr eIt = SDSM->GetElements();
while ( eIt->more() ) {
const SMDS_MeshElement* anElem = eIt->next();
SMDS_ElemIteratorPtr nIt = anElem->nodesIterator();
while ( nIt->more() ) {
const SMDS_MeshElement* elem = nIt->next();
theElems.insert( make_pair(elem->GetID(),elem) );
}
}
}
aResult->length(theElems.size());
map<int, const SMDS_MeshElement * >::iterator itElem;
int i = 0;
for ( itElem = theElems.begin(); itElem != theElems.end(); itElem++ )
aResult[i++] = (*itElem).first;
return aResult._retn();
}
//=============================================================================
/*!
* Returns type of elements for given submesh
*/
//=============================================================================
SMESH::ElementType SMESH_Mesh_i::GetSubMeshElementType(const CORBA::Long ShapeID)
throw (SALOME::SALOME_Exception)
{
SMESH_subMesh* SM = _impl->GetSubMeshContaining(ShapeID);
if(!SM) return SMESH::ALL;
SMESHDS_SubMesh* SDSM = SM->GetSubMeshDS();
if(!SDSM) return SMESH::ALL;
if(SDSM->NbElements()==0)
return (SM->GetSubShape().ShapeType() == TopAbs_VERTEX) ? SMESH::NODE : SMESH::ALL;
SMDS_ElemIteratorPtr eIt = SDSM->GetElements();
const SMDS_MeshElement* anElem = eIt->next();
return ( SMESH::ElementType ) anElem->GetType();
}
//=============================================================================
/*!
*
@ -1643,6 +1746,318 @@ CORBA::Long SMESH_Mesh_i::GetMeshPtr()
}
//=============================================================================
/*!
* Get XYZ coordinates of node as list of double
* If there is not node for given ID - returns empty list
*/
//=============================================================================
SMESH::double_array* SMESH_Mesh_i::GetNodeXYZ(const CORBA::Long id)
{
SMESH::double_array_var aResult = new SMESH::double_array();
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL )
return aResult._retn();
// find node
const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(id);
if(!aNode)
return aResult._retn();
// add coordinates
aResult->length(3);
aResult[0] = aNode->X();
aResult[1] = aNode->Y();
aResult[2] = aNode->Z();
return aResult._retn();
}
//=============================================================================
/*!
* For given node returns list of IDs of inverse elements
* If there is not node for given ID - returns empty list
*/
//=============================================================================
SMESH::long_array* SMESH_Mesh_i::GetNodeInverseElements(const CORBA::Long id)
{
SMESH::long_array_var aResult = new SMESH::long_array();
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL )
return aResult._retn();
// find node
const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(id);
if(!aNode)
return aResult._retn();
// find inverse elements
SMDS_ElemIteratorPtr eIt = aNode->GetInverseElementIterator();
TColStd_SequenceOfInteger IDs;
while(eIt->more()) {
const SMDS_MeshElement* elem = eIt->next();
IDs.Append(elem->GetID());
}
if(IDs.Length()>0) {
aResult->length(IDs.Length());
int i = 1;
for(; i<=IDs.Length(); i++) {
aResult[i-1] = IDs.Value(i);
}
}
return aResult._retn();
}
//=============================================================================
/*!
* If given element is node returns IDs of shape from position
* else - return ID of result shape after ::FindShape()
* from SMESH_MeshEditor
* If there is not element for given ID - returns -1
*/
//=============================================================================
CORBA::Long SMESH_Mesh_i::GetShapeID(const CORBA::Long id)
{
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL )
return -1;
// try to find node
const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(id);
if(aNode) {
SMDS_PositionPtr pos = aNode->GetPosition();
if(!pos)
return -1;
else
return pos->GetShapeId();
}
// try to find element
const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id);
if(!elem)
return -1;
// need implementation???????????????????????????????????????????????
return -1;
}
//=============================================================================
/*!
* Returns number of nodes for given element
* If there is not element for given ID - returns -1
*/
//=============================================================================
CORBA::Long SMESH_Mesh_i::GetElemNbNodes(const CORBA::Long id)
{
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return -1;
// try to find element
const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id);
if(!elem) return -1;
return elem->NbNodes();
}
//=============================================================================
/*!
* Returns ID of node by given index for given element
* If there is not element for given ID - returns -1
* If there is not node for given index - returns -2
*/
//=============================================================================
CORBA::Long SMESH_Mesh_i::GetElemNode(const CORBA::Long id, const CORBA::Long index)
{
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return -1;
const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id);
if(!elem) return -1;
if( index>=elem->NbNodes() || index<0 ) return -1;
return elem->GetNode(index)->GetID();
}
//=============================================================================
/*!
* Returns true if given node is medium node
* in given quadratic element
*/
//=============================================================================
CORBA::Boolean SMESH_Mesh_i::IsMediumNode(const CORBA::Long ide, const CORBA::Long idn)
{
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return false;
// try to find node
const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(idn);
if(!aNode) return false;
// try to find element
const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(ide);
if(!elem) return false;
return elem->IsMediumNode(aNode);
}
//=============================================================================
/*!
* Returns true if given node is medium node
* in one of quadratic elements
*/
//=============================================================================
CORBA::Boolean SMESH_Mesh_i::IsMediumNodeOfAnyElem(const CORBA::Long idn,
SMESH::ElementType theElemType)
{
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return false;
// try to find node
const SMDS_MeshNode* aNode = aSMESHDS_Mesh->FindNode(idn);
if(!aNode) return false;
SMESH_MesherHelper aHelper( *(_impl) );
SMDSAbs_ElementType aType;
if(theElemType==SMESH::EDGE) aType = SMDSAbs_Edge;
else if(theElemType==SMESH::FACE) aType = SMDSAbs_Face;
else if(theElemType==SMESH::VOLUME) aType = SMDSAbs_Volume;
else aType = SMDSAbs_All;
return aHelper.IsMedium(aNode,aType);
}
//=============================================================================
/*!
* Returns number of edges for given element
*/
//=============================================================================
CORBA::Long SMESH_Mesh_i::ElemNbEdges(const CORBA::Long id)
{
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return -1;
const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id);
if(!elem) return -1;
return elem->NbEdges();
}
//=============================================================================
/*!
* Returns number of faces for given element
*/
//=============================================================================
CORBA::Long SMESH_Mesh_i::ElemNbFaces(const CORBA::Long id)
{
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return -1;
const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id);
if(!elem) return -1;
return elem->NbFaces();
}
//=============================================================================
/*!
* Returns true if given element is polygon
*/
//=============================================================================
CORBA::Boolean SMESH_Mesh_i::IsPoly(const CORBA::Long id)
{
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return false;
const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id);
if(!elem) return false;
return elem->IsPoly();
}
//=============================================================================
/*!
* Returns true if given element is quadratic
*/
//=============================================================================
CORBA::Boolean SMESH_Mesh_i::IsQuadratic(const CORBA::Long id)
{
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL ) return false;
const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id);
if(!elem) return false;
return elem->IsQuadratic();
}
//=============================================================================
/*!
* Returns bary center for given element
*/
//=============================================================================
SMESH::double_array* SMESH_Mesh_i::BaryCenter(const CORBA::Long id)
{
SMESH::double_array_var aResult = new SMESH::double_array();
SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS();
if ( aSMESHDS_Mesh == NULL )
return aResult._retn();
const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(id);
if(!elem)
return aResult._retn();
if(elem->GetType()==SMDSAbs_Volume) {
// use SMDS_VolumeTool
SMDS_VolumeTool aTool;
if(aTool.Set(elem)) {
double x=0., y=0., z=0.;
if(aTool.GetBaryCenter(x,y,z)) {
// add coordinates
aResult->length(3);
aResult[0] = x;
aResult[1] = y;
aResult[2] = z;
}
}
}
else {
SMDS_ElemIteratorPtr anIt = elem->nodesIterator();
int nbn = 0;
double x=0., y=0., z=0.;
for(; anIt->more(); ) {
nbn++;
const SMDS_MeshNode* aNode = static_cast<const SMDS_MeshNode*>(anIt->next());
x += aNode->X();
y += aNode->Y();
z += aNode->Z();
}
if(nbn>0) {
// add coordinates
aResult->length(3);
aResult[0] = x/nbn;
aResult[1] = y/nbn;
aResult[2] = z/nbn;
}
}
return aResult._retn();
}
//=============================================================================
/*!
*
*/
//=============================================================================
void SMESH_Mesh_i::CreateGroupServants()
{
// Create group servants, if any groups were imported

View File

@ -250,6 +250,26 @@ public:
SMESH::ElementType GetElementType( const CORBA::Long id, const bool iselem )
throw (SALOME::SALOME_Exception);
/*!
* Returns ID of elements for given submesh
*/
SMESH::long_array* GetSubMeshElementsId(const CORBA::Long ShapeID)
throw (SALOME::SALOME_Exception);
/*!
* Returns ID of nodes for given submesh
* If param all==true - returns all nodes, else -
* returns only nodes on shapes.
*/
SMESH::long_array* GetSubMeshNodesId(const CORBA::Long ShapeID, CORBA::Boolean all)
throw (SALOME::SALOME_Exception);
/*!
* Returns type of elements for given submesh
*/
SMESH::ElementType GetSubMeshElementType(const CORBA::Long ShapeID)
throw (SALOME::SALOME_Exception);
char* Dump();
// Internal methods not available through CORBA
@ -283,6 +303,79 @@ public:
CORBA::Long GetMeshPtr();
/*!
* Get XYZ coordinates of node as list of double
* If there is not node for given ID - returns empty list
*/
SMESH::double_array* GetNodeXYZ(const CORBA::Long id);
/*!
* For given node returns list of IDs of inverse elements
* If there is not node for given ID - returns empty list
*/
SMESH::long_array* GetNodeInverseElements(const CORBA::Long id);
/*!
* If given element is node returns IDs of shape from position
* else - return ID of result shape after ::FindShape()
* from SMESH_MeshEditor
* If there is not element for given ID - returns -1
*/
CORBA::Long GetShapeID(const CORBA::Long id);
/*!
* Returns number of nodes for given element
* If there is not element for given ID - returns -1
*/
CORBA::Long GetElemNbNodes(const CORBA::Long id);
/*!
* Returns ID of node by given index for given element
* If there is not element for given ID - returns -1
* If there is not node for given index - returns -2
*/
CORBA::Long GetElemNode(const CORBA::Long id, const CORBA::Long index);
/*!
* Returns true if given node is medium node
* in given quadratic element
*/
CORBA::Boolean IsMediumNode(const CORBA::Long ide, const CORBA::Long idn);
/*!
* Returns true if given node is medium node
* in one of quadratic elements
*/
CORBA::Boolean IsMediumNodeOfAnyElem(const CORBA::Long idn,
SMESH::ElementType theElemType);
/*!
* Returns number of edges for given element
*/
CORBA::Long ElemNbEdges(const CORBA::Long id);
/*!
* Returns number of faces for given element
*/
CORBA::Long ElemNbFaces(const CORBA::Long id);
/*!
* Returns true if given element is polygon
*/
CORBA::Boolean IsPoly(const CORBA::Long id);
/*!
* Returns true if given element is quadratic
*/
CORBA::Boolean IsQuadratic(const CORBA::Long id);
/*!
* Returns bary center for given element
*/
SMESH::double_array* BaryCenter(const CORBA::Long id);
map<int, SMESH_subMesh_i*> _mapSubMesh_i; //NRI
map<int, ::SMESH_subMesh*> _mapSubMesh; //NRI