mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-11-15 10:08:34 +05:00
/*!
+ * Returns nodes of given face (counted from zero) for given volumic element. + */ + long_array GetElemFaceNodes(in long elemId, in short faceIndex); + + /*! + * Returns an element based on all given nodes. + */ + long FindElementByNodes(in long_array nodes);
This commit is contained in:
parent
fa7f73d6bd
commit
8abf245a59
@ -774,6 +774,16 @@ module SMESH
|
|||||||
*/
|
*/
|
||||||
long ElemNbFaces(in long id);
|
long ElemNbFaces(in long id);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Returns nodes of given face (counted from zero) for given volumic element.
|
||||||
|
*/
|
||||||
|
long_array GetElemFaceNodes(in long elemId, in short faceIndex);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Returns an element based on all given nodes.
|
||||||
|
*/
|
||||||
|
long FindElementByNodes(in long_array nodes);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Returns true if given element is polygon
|
* Returns true if given element is polygon
|
||||||
*/
|
*/
|
||||||
|
@ -941,11 +941,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1,
|
|||||||
/// Add a polygon defined by its nodes IDs
|
/// Add a polygon defined by its nodes IDs
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID (std::vector<int> nodes_ids,
|
SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID (vector<int> nodes_ids,
|
||||||
const int ID)
|
const int ID)
|
||||||
{
|
{
|
||||||
int nbNodes = nodes_ids.size();
|
int nbNodes = nodes_ids.size();
|
||||||
std::vector<const SMDS_MeshNode*> nodes (nbNodes);
|
vector<const SMDS_MeshNode*> nodes (nbNodes);
|
||||||
for (int i = 0; i < nbNodes; i++) {
|
for (int i = 0; i < nbNodes; i++) {
|
||||||
nodes[i] = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nodes_ids[i]);
|
nodes[i] = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nodes_ids[i]);
|
||||||
if (!nodes[i]) return NULL;
|
if (!nodes[i]) return NULL;
|
||||||
@ -958,7 +958,7 @@ SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID (std::vector<int> nodes_ids,
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID
|
SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID
|
||||||
(std::vector<const SMDS_MeshNode*> nodes,
|
(vector<const SMDS_MeshNode*> nodes,
|
||||||
const int ID)
|
const int ID)
|
||||||
{
|
{
|
||||||
SMDS_MeshFace * face;
|
SMDS_MeshFace * face;
|
||||||
@ -990,7 +990,7 @@ SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID
|
|||||||
/// An ID is automatically affected to the created face.
|
/// An ID is automatically affected to the created face.
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
SMDS_MeshFace* SMDS_Mesh::AddPolygonalFace (std::vector<const SMDS_MeshNode*> nodes)
|
SMDS_MeshFace* SMDS_Mesh::AddPolygonalFace (vector<const SMDS_MeshNode*> nodes)
|
||||||
{
|
{
|
||||||
return SMDS_Mesh::AddPolygonalFaceWithID(nodes, myElementIDFactory->GetFreeID());
|
return SMDS_Mesh::AddPolygonalFaceWithID(nodes, myElementIDFactory->GetFreeID());
|
||||||
}
|
}
|
||||||
@ -1003,12 +1003,12 @@ SMDS_MeshFace* SMDS_Mesh::AddPolygonalFace (std::vector<const SMDS_MeshNode*> no
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
SMDS_MeshVolume * SMDS_Mesh::AddPolyhedralVolumeWithID
|
SMDS_MeshVolume * SMDS_Mesh::AddPolyhedralVolumeWithID
|
||||||
(std::vector<int> nodes_ids,
|
(vector<int> nodes_ids,
|
||||||
std::vector<int> quantities,
|
vector<int> quantities,
|
||||||
const int ID)
|
const int ID)
|
||||||
{
|
{
|
||||||
int nbNodes = nodes_ids.size();
|
int nbNodes = nodes_ids.size();
|
||||||
std::vector<const SMDS_MeshNode*> nodes (nbNodes);
|
vector<const SMDS_MeshNode*> nodes (nbNodes);
|
||||||
for (int i = 0; i < nbNodes; i++) {
|
for (int i = 0; i < nbNodes; i++) {
|
||||||
nodes[i] = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nodes_ids[i]);
|
nodes[i] = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nodes_ids[i]);
|
||||||
if (!nodes[i]) return NULL;
|
if (!nodes[i]) return NULL;
|
||||||
@ -1023,8 +1023,8 @@ SMDS_MeshVolume * SMDS_Mesh::AddPolyhedralVolumeWithID
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolumeWithID
|
SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolumeWithID
|
||||||
(std::vector<const SMDS_MeshNode*> nodes,
|
(vector<const SMDS_MeshNode*> nodes,
|
||||||
std::vector<int> quantities,
|
vector<int> quantities,
|
||||||
const int ID)
|
const int ID)
|
||||||
{
|
{
|
||||||
SMDS_MeshVolume* volume;
|
SMDS_MeshVolume* volume;
|
||||||
@ -1056,8 +1056,8 @@ SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolumeWithID
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolume
|
SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolume
|
||||||
(std::vector<const SMDS_MeshNode*> nodes,
|
(vector<const SMDS_MeshNode*> nodes,
|
||||||
std::vector<int> quantities)
|
vector<int> quantities)
|
||||||
{
|
{
|
||||||
int ID = myElementIDFactory->GetFreeID();
|
int ID = myElementIDFactory->GetFreeID();
|
||||||
SMDS_MeshVolume * v = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID);
|
SMDS_MeshVolume * v = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID);
|
||||||
@ -1763,10 +1763,10 @@ const SMDS_MeshElement* SMDS_Mesh::FindElement(int IDelem) const
|
|||||||
//purpose : find polygon
|
//purpose : find polygon
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
|
||||||
const SMDS_MeshFace* SMDS_Mesh::FindFace (const std::vector<int>& nodes_ids) const
|
const SMDS_MeshFace* SMDS_Mesh::FindFace (const vector<int>& nodes_ids) const
|
||||||
{
|
{
|
||||||
int nbnodes = nodes_ids.size();
|
int nbnodes = nodes_ids.size();
|
||||||
std::vector<const SMDS_MeshNode *> poly_nodes (nbnodes);
|
vector<const SMDS_MeshNode *> poly_nodes (nbnodes);
|
||||||
for (int inode = 0; inode < nbnodes; inode++) {
|
for (int inode = 0; inode < nbnodes; inode++) {
|
||||||
const SMDS_MeshNode * node = FindNode(nodes_ids[inode]);
|
const SMDS_MeshNode * node = FindNode(nodes_ids[inode]);
|
||||||
if (node == NULL) return NULL;
|
if (node == NULL) return NULL;
|
||||||
@ -1775,18 +1775,43 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace (const std::vector<int>& nodes_ids) con
|
|||||||
return FindFace(poly_nodes);
|
return FindFace(poly_nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
const SMDS_MeshFace* SMDS_Mesh::FindFace (const std::vector<const SMDS_MeshNode *>& nodes)
|
const SMDS_MeshFace* SMDS_Mesh::FindFace (const vector<const SMDS_MeshNode *>& nodes)
|
||||||
{
|
{
|
||||||
if ( nodes.size() > 2 && nodes[0] ) {
|
return (const SMDS_MeshFace*) FindElement( nodes, SMDSAbs_Face );
|
||||||
SMDS_ElemIteratorPtr itF = nodes[0]->GetInverseElementIterator(SMDSAbs_Face);
|
}
|
||||||
while (itF->more()) {
|
|
||||||
const SMDS_MeshElement* f = itF->next();
|
|
||||||
if ( f->NbNodes() == nodes.size() ) {
|
//================================================================================
|
||||||
for ( int i = 1; f && i < nodes.size(); ++ i )
|
/*!
|
||||||
if ( f->GetNodeIndex( nodes[ i ]) < 0 )
|
* \brief Return element based on all given nodes
|
||||||
f = 0;
|
* \param nodes - node of element
|
||||||
if ( f )
|
* \param type - type of element
|
||||||
return static_cast<const SMDS_MeshFace *> (f);
|
* \param noMedium - true if medium nodes of quadratic element are not included in <nodes>
|
||||||
|
* \retval const SMDS_MeshElement* - found element or NULL
|
||||||
|
*/
|
||||||
|
//================================================================================
|
||||||
|
|
||||||
|
const SMDS_MeshElement* SMDS_Mesh::FindElement (const vector<const SMDS_MeshNode *>& nodes,
|
||||||
|
const SMDSAbs_ElementType type,
|
||||||
|
const bool noMedium)
|
||||||
|
{
|
||||||
|
if ( nodes.size() > 0 && nodes[0] )
|
||||||
|
{
|
||||||
|
SMDS_ElemIteratorPtr itF = nodes[0]->GetInverseElementIterator(type);
|
||||||
|
while (itF->more())
|
||||||
|
{
|
||||||
|
const SMDS_MeshElement* e = itF->next();
|
||||||
|
int nbNodesToCheck = noMedium ? e->NbCornerNodes() : e->NbNodes();
|
||||||
|
if ( nbNodesToCheck == nodes.size() )
|
||||||
|
{
|
||||||
|
for ( int i = 1; e && i < nodes.size(); ++ i )
|
||||||
|
{
|
||||||
|
int nodeIndex = e->GetNodeIndex( nodes[ i ]);
|
||||||
|
if ( nodeIndex < 0 || nodeIndex >= nbNodesToCheck )
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
if ( e )
|
||||||
|
return static_cast<const SMDS_MeshFace *> (e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -492,6 +492,9 @@ public:
|
|||||||
|
|
||||||
const SMDS_MeshFace *FindFace(const std::vector<int>& nodes_ids) const;
|
const SMDS_MeshFace *FindFace(const std::vector<int>& nodes_ids) const;
|
||||||
static const SMDS_MeshFace* FindFace(const std::vector<const SMDS_MeshNode *>& nodes);
|
static const SMDS_MeshFace* FindFace(const std::vector<const SMDS_MeshNode *>& nodes);
|
||||||
|
static const SMDS_MeshElement* FindElement(const std::vector<const SMDS_MeshNode *>& nodes,
|
||||||
|
const SMDSAbs_ElementType type=SMDSAbs_All,
|
||||||
|
const bool noMedium=true);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Raise an exception if free memory (ram+swap) too low
|
* \brief Raise an exception if free memory (ram+swap) too low
|
||||||
|
@ -3195,6 +3195,57 @@ CORBA::Long SMESH_Mesh_i::ElemNbFaces(const CORBA::Long id)
|
|||||||
return elem->NbFaces();
|
return elem->NbFaces();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : GetElemFaceNodes
|
||||||
|
//purpose : Returns nodes of given face (counted from zero) for given element.
|
||||||
|
//=======================================================================
|
||||||
|
|
||||||
|
SMESH::long_array* SMESH_Mesh_i::GetElemFaceNodes(CORBA::Long elemId,
|
||||||
|
CORBA::Short faceIndex)
|
||||||
|
{
|
||||||
|
SMESH::long_array_var aResult = new SMESH::long_array();
|
||||||
|
if ( SMESHDS_Mesh* aSMESHDS_Mesh = _impl->GetMeshDS() )
|
||||||
|
{
|
||||||
|
if ( const SMDS_MeshElement* elem = aSMESHDS_Mesh->FindElement(elemId) )
|
||||||
|
{
|
||||||
|
SMDS_VolumeTool vtool( elem );
|
||||||
|
if ( faceIndex < vtool.NbFaces() )
|
||||||
|
{
|
||||||
|
aResult->length( vtool.NbFaceNodes( faceIndex ));
|
||||||
|
const SMDS_MeshNode** nn = vtool.GetFaceNodes( faceIndex );
|
||||||
|
for ( int i = 0; i < aResult->length(); ++i )
|
||||||
|
aResult[ i ] = nn[ i ]->GetID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return aResult._retn();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================
|
||||||
|
//function : FindElementByNodes
|
||||||
|
//purpose : Returns an element based on all given nodes.
|
||||||
|
//=======================================================================
|
||||||
|
|
||||||
|
CORBA::Long SMESH_Mesh_i::FindElementByNodes(const SMESH::long_array& nodes)
|
||||||
|
{
|
||||||
|
CORBA::Long elemID(0);
|
||||||
|
if ( SMESHDS_Mesh* mesh = _impl->GetMeshDS() )
|
||||||
|
{
|
||||||
|
vector< const SMDS_MeshNode * > nn( nodes.length() );
|
||||||
|
for ( int i = 0; i < nodes.length(); ++i )
|
||||||
|
if ( !( nn[i] = mesh->FindNode( nodes[i] )))
|
||||||
|
return elemID;
|
||||||
|
|
||||||
|
const SMDS_MeshElement* elem = mesh->FindElement( nn );
|
||||||
|
if ( !elem && ( _impl->NbEdges( ORDER_QUADRATIC ) ||
|
||||||
|
_impl->NbFaces( ORDER_QUADRATIC ) ||
|
||||||
|
_impl->NbVolumes( ORDER_QUADRATIC )))
|
||||||
|
elem = mesh->FindElement( nn, SMDSAbs_All, /*noMedium=*/true );
|
||||||
|
|
||||||
|
if ( elem ) elemID = CORBA::Long( elem->GetID() );
|
||||||
|
}
|
||||||
|
return elemID;
|
||||||
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
/*!
|
/*!
|
||||||
|
@ -455,6 +455,15 @@ public:
|
|||||||
* Returns number of faces for given element
|
* Returns number of faces for given element
|
||||||
*/
|
*/
|
||||||
CORBA::Long ElemNbFaces(CORBA::Long id);
|
CORBA::Long ElemNbFaces(CORBA::Long id);
|
||||||
|
/*!
|
||||||
|
* Returns nodes of given face (counted from zero) for given element.
|
||||||
|
*/
|
||||||
|
SMESH::long_array* GetElemFaceNodes(CORBA::Long elemId, CORBA::Short faceIndex);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Returns an element based on all given nodes.
|
||||||
|
*/
|
||||||
|
CORBA::Long FindElementByNodes(const SMESH::long_array& nodes);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Returns true if given element is polygon
|
* Returns true if given element is polygon
|
||||||
|
Loading…
Reference in New Issue
Block a user