mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-28 18:30:35 +05:00
PAL11200, 11544. optimize setting elements on submeshes
This commit is contained in:
parent
da0398f448
commit
d75a1bc257
@ -704,6 +704,72 @@ void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt)
|
|||||||
removeFromContainers( myShapeIndexToSubMesh, myGroups, removedElems, false );
|
removeFromContainers( myShapeIndexToSubMesh, myGroups, removedElems, false );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//================================================================================
|
||||||
|
/*!
|
||||||
|
* \brief return submesh by shape
|
||||||
|
* \param shape - the subshape
|
||||||
|
* \retval SMESHDS_SubMesh* - the found submesh
|
||||||
|
*
|
||||||
|
* search of submeshes is optimized
|
||||||
|
*/
|
||||||
|
//================================================================================
|
||||||
|
|
||||||
|
SMESHDS_SubMesh* SMESHDS_Mesh::getSubmesh( const TopoDS_Shape & shape )
|
||||||
|
{
|
||||||
|
if ( shape.IsNull() )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if ( !myCurSubShape.IsNull() && shape.IsSame( myCurSubShape ))
|
||||||
|
return myCurSubMesh;
|
||||||
|
|
||||||
|
getSubmesh( ShapeToIndex( shape ));
|
||||||
|
myCurSubShape = shape;
|
||||||
|
return myCurSubMesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
//================================================================================
|
||||||
|
/*!
|
||||||
|
* \brief return submesh by subshape index
|
||||||
|
* \param Index - the subshape index
|
||||||
|
* \retval SMESHDS_SubMesh* - the found submesh
|
||||||
|
* search of submeshes is optimized
|
||||||
|
*/
|
||||||
|
//================================================================================
|
||||||
|
|
||||||
|
SMESHDS_SubMesh* SMESHDS_Mesh::getSubmesh( const int Index )
|
||||||
|
{
|
||||||
|
//Update or build submesh
|
||||||
|
if ( Index != myCurSubID ) {
|
||||||
|
map<int,SMESHDS_SubMesh*>::iterator it = myShapeIndexToSubMesh.find( Index );
|
||||||
|
if ( it == myShapeIndexToSubMesh.end() )
|
||||||
|
it = myShapeIndexToSubMesh.insert( make_pair(Index, new SMESHDS_SubMesh() )).first;
|
||||||
|
myCurSubMesh = it->second;
|
||||||
|
myCurSubID = Index;
|
||||||
|
myCurSubShape.Nullify(); // myCurSubShape no more corresponds to submesh
|
||||||
|
}
|
||||||
|
return myCurSubMesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
//================================================================================
|
||||||
|
/*!
|
||||||
|
* \brief Add element or node to submesh
|
||||||
|
* \param elem - element to add
|
||||||
|
* \param subMesh - submesh to be filled in
|
||||||
|
*/
|
||||||
|
//================================================================================
|
||||||
|
|
||||||
|
bool SMESHDS_Mesh::add(const SMDS_MeshElement* elem, SMESHDS_SubMesh* subMesh )
|
||||||
|
{
|
||||||
|
if ( elem && subMesh ) {
|
||||||
|
if ( elem->GetType() == SMDSAbs_Node )
|
||||||
|
subMesh->AddNode( static_cast<const SMDS_MeshNode* >( elem ));
|
||||||
|
else
|
||||||
|
subMesh->AddElement( elem );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : SetNodeOnVolume
|
//function : SetNodeOnVolume
|
||||||
//purpose :
|
//purpose :
|
||||||
@ -711,7 +777,7 @@ void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt)
|
|||||||
void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode,
|
void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode,
|
||||||
const TopoDS_Shell & S)
|
const TopoDS_Shell & S)
|
||||||
{
|
{
|
||||||
SetNodeInVolume( aNode, myIndexToShape.FindIndex(S) );
|
add( aNode, getSubmesh(S) );
|
||||||
}
|
}
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : SetNodeOnVolume
|
//function : SetNodeOnVolume
|
||||||
@ -720,7 +786,7 @@ void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode,
|
|||||||
void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode,
|
void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode,
|
||||||
const TopoDS_Solid & S)
|
const TopoDS_Solid & S)
|
||||||
{
|
{
|
||||||
SetNodeInVolume( aNode, myIndexToShape.FindIndex(S) );
|
add( aNode, getSubmesh(S) );
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -732,7 +798,8 @@ void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode * aNode,
|
|||||||
double u,
|
double u,
|
||||||
double v)
|
double v)
|
||||||
{
|
{
|
||||||
SetNodeOnFace( aNode, myIndexToShape.FindIndex(S), u, v );
|
if ( add( aNode, getSubmesh(S) ))
|
||||||
|
aNode->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition(myCurSubID, u, v)));
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -743,7 +810,8 @@ void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode * aNode,
|
|||||||
const TopoDS_Edge & S,
|
const TopoDS_Edge & S,
|
||||||
double u)
|
double u)
|
||||||
{
|
{
|
||||||
SetNodeOnEdge( aNode, myIndexToShape.FindIndex(S), u );
|
if ( add( aNode, getSubmesh(S) ))
|
||||||
|
aNode->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(myCurSubID, u)));
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -753,7 +821,8 @@ void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode * aNode,
|
|||||||
void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode * aNode,
|
void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode * aNode,
|
||||||
const TopoDS_Vertex & S)
|
const TopoDS_Vertex & S)
|
||||||
{
|
{
|
||||||
SetNodeOnVertex( aNode, myIndexToShape.FindIndex(S));
|
if ( add( aNode, getSubmesh(S) ))
|
||||||
|
aNode->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition(myCurSubID)));
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -762,7 +831,12 @@ void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode * aNode,
|
|||||||
//=======================================================================
|
//=======================================================================
|
||||||
void SMESHDS_Mesh::UnSetNodeOnShape(const SMDS_MeshNode* aNode)
|
void SMESHDS_Mesh::UnSetNodeOnShape(const SMDS_MeshNode* aNode)
|
||||||
{
|
{
|
||||||
MESSAGE("not implemented");
|
if ( aNode && aNode->GetPosition() ) {
|
||||||
|
map<int,SMESHDS_SubMesh*>::iterator it =
|
||||||
|
myShapeIndexToSubMesh.find( aNode->GetPosition()->GetShapeId() );
|
||||||
|
if ( it != myShapeIndexToSubMesh.end() )
|
||||||
|
it->second->RemoveNode( aNode );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -770,32 +844,26 @@ void SMESHDS_Mesh::UnSetNodeOnShape(const SMDS_MeshNode* aNode)
|
|||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement * anElement,
|
void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement * anElement,
|
||||||
const TopoDS_Shape & S)
|
const TopoDS_Shape & S)
|
||||||
{
|
{
|
||||||
if (myShape.IsNull()) MESSAGE("myShape is NULL");
|
add( anElement, getSubmesh(S) );
|
||||||
|
|
||||||
int Index = myIndexToShape.FindIndex(S);
|
|
||||||
|
|
||||||
if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end())
|
|
||||||
myShapeIndexToSubMesh[Index]=new SMESHDS_SubMesh();
|
|
||||||
|
|
||||||
myShapeIndexToSubMesh[Index]->AddElement(anElement);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : UnSetMeshElementOnShape
|
//function : UnSetMeshElementOnShape
|
||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void SMESHDS_Mesh::
|
void SMESHDS_Mesh::UnSetMeshElementOnShape(const SMDS_MeshElement * elem,
|
||||||
UnSetMeshElementOnShape(const SMDS_MeshElement * anElement,
|
const TopoDS_Shape & S)
|
||||||
const TopoDS_Shape & S)
|
|
||||||
{
|
{
|
||||||
if (myShape.IsNull()) MESSAGE("myShape is NULL");
|
int Index = myIndexToShape.FindIndex(S);
|
||||||
|
|
||||||
int Index = myIndexToShape.FindIndex(S);
|
map<int,SMESHDS_SubMesh*>::iterator it = myShapeIndexToSubMesh.find( Index );
|
||||||
|
if ( it != myShapeIndexToSubMesh.end() )
|
||||||
if (myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end())
|
if ( elem->GetType() == SMDSAbs_Node )
|
||||||
myShapeIndexToSubMesh[Index]->RemoveElement(anElement);
|
it->second->RemoveNode( static_cast<const SMDS_MeshNode* >( elem ));
|
||||||
|
else
|
||||||
|
it->second->RemoveElement( elem );
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -833,8 +901,6 @@ bool SMESHDS_Mesh::IsGroupOfSubShapes (const TopoDS_Shape& theShape) const
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) const
|
SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) const
|
||||||
{
|
{
|
||||||
if (myShape.IsNull()) MESSAGE("myShape is NULL");
|
|
||||||
|
|
||||||
int Index = ShapeToIndex(S);
|
int Index = ShapeToIndex(S);
|
||||||
TShapeIndexToSubMesh::const_iterator anIter = myShapeIndexToSubMesh.find(Index);
|
TShapeIndexToSubMesh::const_iterator anIter = myShapeIndexToSubMesh.find(Index);
|
||||||
if (anIter != myShapeIndexToSubMesh.end())
|
if (anIter != myShapeIndexToSubMesh.end())
|
||||||
@ -848,10 +914,9 @@ SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) const
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const int Index)
|
SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const int Index)
|
||||||
{
|
{
|
||||||
if (myShape.IsNull()) MESSAGE("myShape is NULL");
|
TShapeIndexToSubMesh::const_iterator anIter = myShapeIndexToSubMesh.find(Index);
|
||||||
|
if (anIter != myShapeIndexToSubMesh.end())
|
||||||
if (myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end())
|
return anIter->second;
|
||||||
return myShapeIndexToSubMesh[Index];
|
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1006,7 +1071,7 @@ int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) const
|
|||||||
//=======================================================================
|
//=======================================================================
|
||||||
void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index)
|
void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index)
|
||||||
{
|
{
|
||||||
addNodeToSubmesh( aNode, Index );
|
add( aNode, getSubmesh( Index ));
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -1016,9 +1081,8 @@ void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index)
|
|||||||
void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode* aNode, int Index, double u, double v)
|
void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode* aNode, int Index, double u, double v)
|
||||||
{
|
{
|
||||||
//Set Position on Node
|
//Set Position on Node
|
||||||
aNode->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition(Index, u, v)));
|
if ( add( aNode, getSubmesh( Index )))
|
||||||
|
aNode->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition(Index, u, v)));
|
||||||
addNodeToSubmesh( aNode, Index );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -1030,9 +1094,8 @@ void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode* aNode,
|
|||||||
double u)
|
double u)
|
||||||
{
|
{
|
||||||
//Set Position on Node
|
//Set Position on Node
|
||||||
aNode->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(Index, u)));
|
if ( add( aNode, getSubmesh( Index )))
|
||||||
|
aNode->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(Index, u)));
|
||||||
addNodeToSubmesh( aNode, Index );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -1042,9 +1105,8 @@ void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode* aNode,
|
|||||||
void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode* aNode, int Index)
|
void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode* aNode, int Index)
|
||||||
{
|
{
|
||||||
//Set Position on Node
|
//Set Position on Node
|
||||||
aNode->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition(Index)));
|
if ( add( aNode, getSubmesh( Index )))
|
||||||
|
aNode->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition(Index)));
|
||||||
addNodeToSubmesh( aNode, Index );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
@ -1052,12 +1114,9 @@ void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode* aNode, int Index)
|
|||||||
//purpose :
|
//purpose :
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement* anElement,
|
void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement* anElement,
|
||||||
int Index)
|
int Index)
|
||||||
{
|
{
|
||||||
if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end())
|
add( anElement, getSubmesh( Index ));
|
||||||
myShapeIndexToSubMesh[Index]=new SMESHDS_SubMesh();
|
|
||||||
|
|
||||||
myShapeIndexToSubMesh[Index]->AddElement(anElement);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SMESHDS_Mesh::~SMESHDS_Mesh()
|
SMESHDS_Mesh::~SMESHDS_Mesh()
|
||||||
|
@ -274,15 +274,6 @@ private:
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void addNodeToSubmesh( const SMDS_MeshNode* aNode, int Index )
|
|
||||||
{
|
|
||||||
//Update or build submesh
|
|
||||||
map<int,SMESHDS_SubMesh*>::iterator it = myShapeIndexToSubMesh.find( Index );
|
|
||||||
if ( it == myShapeIndexToSubMesh.end() )
|
|
||||||
it = myShapeIndexToSubMesh.insert( make_pair(Index, new SMESHDS_SubMesh() )).first;
|
|
||||||
it->second->AddNode( aNode ); // add aNode to submesh
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef std::list<const SMESHDS_Hypothesis*> THypList;
|
typedef std::list<const SMESHDS_Hypothesis*> THypList;
|
||||||
|
|
||||||
#ifndef WNT
|
#ifndef WNT
|
||||||
@ -305,6 +296,15 @@ private:
|
|||||||
TGroups myGroups;
|
TGroups myGroups;
|
||||||
|
|
||||||
SMESHDS_Script* myScript;
|
SMESHDS_Script* myScript;
|
||||||
|
|
||||||
|
// optimize addition of nodes/elements to submeshes by, SetNodeInVolume() etc:
|
||||||
|
// avoid search of submeshes in maps
|
||||||
|
bool add( const SMDS_MeshElement* elem, SMESHDS_SubMesh* subMesh );
|
||||||
|
SMESHDS_SubMesh* getSubmesh( const TopoDS_Shape & shape);
|
||||||
|
SMESHDS_SubMesh* getSubmesh( const int Index );
|
||||||
|
int myCurSubID;
|
||||||
|
TopoDS_Shape myCurSubShape;
|
||||||
|
SMESHDS_SubMesh* myCurSubMesh;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user