X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_Group_i.cxx;h=1b99653c62b603bf02ac844ca10080faba71b668;hb=c84ff91c3981488e5a5ae5c6661899f48872290d;hp=20eb9798a9a4e397bc4d87faf7d19c4701d70b0b;hpb=fa0176f07261b9a4c7b4672287c7c229ac427111;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_Group_i.cxx b/src/SMESH_I/SMESH_Group_i.cxx index 20eb9798a..1b99653c6 100644 --- a/src/SMESH_I/SMESH_Group_i.cxx +++ b/src/SMESH_I/SMESH_Group_i.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -37,6 +37,7 @@ #include "SMESH_Group.hxx" #include "SMESH_Mesh_i.hxx" #include "SMESH_PythonDump.hxx" +#include "SMESH_PreMeshInfo.hxx" #include CORBA_SERVER_HEADER(SMESH_Filter) @@ -55,7 +56,10 @@ SMESH_GroupBase_i::SMESH_GroupBase_i( PortableServer::POA_ptr thePOA, const int theLocalID ) : SALOME::GenericObj_i( thePOA ), myMeshServant( theMeshServant ), - myLocalID( theLocalID ) + myLocalID( theLocalID ), + myNbNodes(-1), + myGroupDSTic(0), + myPreMeshInfo(NULL) { // PAL7962: san -- To ensure correct mapping of servant and correct reference counting in GenericObj_i, // servant activation is performed by SMESH_Mesh_i::createGroup() @@ -100,6 +104,8 @@ SMESH_GroupBase_i::~SMESH_GroupBase_i() MESSAGE("~SMESH_GroupBase_i; this = "<removeGroup(myLocalID); + + if ( myPreMeshInfo ) delete myPreMeshInfo; myPreMeshInfo = NULL; } //======================================================================= @@ -190,6 +196,7 @@ SMESH::ElementType SMESH_GroupBase_i::GetType() case SMDSAbs_Face: aType = SMESH::FACE; break; case SMDSAbs_Volume: aType = SMESH::VOLUME; break; case SMDSAbs_0DElement: aType = SMESH::ELEM0D; break; + case SMDSAbs_Ball: aType = SMESH::BALL; break; default: aType = SMESH::ALL; break; } return aType; @@ -207,6 +214,9 @@ SMESH::ElementType SMESH_GroupBase_i::GetType() CORBA::Long SMESH_GroupBase_i::Size() { + if ( myPreMeshInfo ) + return GetType() == SMESH::NODE ? myPreMeshInfo->NbNodes() : myPreMeshInfo->NbElements(); + SMESHDS_GroupBase* aGroupDS = GetGroupDS(); if (aGroupDS) return aGroupDS->Extent(); @@ -222,6 +232,9 @@ CORBA::Long SMESH_GroupBase_i::Size() CORBA::Boolean SMESH_GroupBase_i::IsEmpty() { + if ( myPreMeshInfo ) + return Size() == 0; + SMESHDS_GroupBase* aGroupDS = GetGroupDS(); if (aGroupDS) return aGroupDS->IsEmpty(); @@ -237,6 +250,9 @@ CORBA::Boolean SMESH_GroupBase_i::IsEmpty() void SMESH_Group_i::Clear() { + if ( myPreMeshInfo ) + myPreMeshInfo->FullLoadFromFile(); + // Update Python script TPythonDump() << _this() << ".Clear()"; @@ -257,6 +273,9 @@ void SMESH_Group_i::Clear() CORBA::Boolean SMESH_GroupBase_i::Contains( CORBA::Long theID ) { + if ( myPreMeshInfo ) + myPreMeshInfo->FullLoadFromFile(); + SMESHDS_GroupBase* aGroupDS = GetGroupDS(); if (aGroupDS) return aGroupDS->Contains(theID); @@ -272,6 +291,9 @@ CORBA::Boolean SMESH_GroupBase_i::Contains( CORBA::Long theID ) CORBA::Long SMESH_Group_i::Add( const SMESH::long_array& theIDs ) { + if ( myPreMeshInfo ) + myPreMeshInfo->FullLoadFromFile(); + // Update Python script TPythonDump() << "nbAdd = " << _this() << ".Add( " << theIDs << " )"; @@ -298,6 +320,9 @@ CORBA::Long SMESH_Group_i::Add( const SMESH::long_array& theIDs ) CORBA::Long SMESH_Group_i::Remove( const SMESH::long_array& theIDs ) { + if ( myPreMeshInfo ) + myPreMeshInfo->FullLoadFromFile(); + // Update Python script TPythonDump() << "nbDel = " << _this() << ".Remove( " << theIDs << " )"; @@ -326,8 +351,8 @@ typedef bool (SMESHDS_Group::*TFunChangeGroup)(const int); CORBA::Long ChangeByPredicate( SMESH::Predicate_i* thePredicate, - SMESHDS_GroupBase* theGroupBase, - TFunChangeGroup theFun) + SMESHDS_GroupBase* theGroupBase, + TFunChangeGroup theFun) { CORBA::Long aNb = 0; if(SMESHDS_Group* aGroupDS = dynamic_cast(theGroupBase)){ @@ -348,6 +373,9 @@ CORBA::Long SMESH_Group_i:: AddByPredicate( SMESH::Predicate_ptr thePredicate ) { + if ( myPreMeshInfo ) + myPreMeshInfo->FullLoadFromFile(); + if(SMESH::Predicate_i* aPredicate = SMESH::GetPredicate(thePredicate)){ TPythonDump()<<_this()<<".AddByPredicate("<FullLoadFromFile(); + if(SMESH::Predicate_i* aPredicate = SMESH::GetPredicate(thePredicate)){ TPythonDump()<<_this()<<".RemoveByPredicate("<FullLoadFromFile(); + TPythonDump pd; long nbAdd = 0; SMESHDS_Group* aGroupDS = dynamic_cast( GetGroupDS() ); @@ -408,6 +442,9 @@ CORBA::Long SMESH_Group_i::AddFrom( SMESH::SMESH_IDSource_ptr theSource ) CORBA::Long SMESH_GroupBase_i::GetID( CORBA::Long theIndex ) { + if ( myPreMeshInfo ) + myPreMeshInfo->FullLoadFromFile(); + SMESHDS_GroupBase* aGroupDS = GetGroupDS(); if (aGroupDS) return aGroupDS->GetID(theIndex); @@ -423,19 +460,115 @@ CORBA::Long SMESH_GroupBase_i::GetID( CORBA::Long theIndex ) SMESH::long_array* SMESH_GroupBase_i::GetListOfID() { + if ( myPreMeshInfo ) + myPreMeshInfo->FullLoadFromFile(); + SMESH::long_array_var aRes = new SMESH::long_array(); SMESHDS_GroupBase* aGroupDS = GetGroupDS(); - if (aGroupDS) { + if (aGroupDS) + { int aSize = aGroupDS->Extent(); aRes->length(aSize); for (int i = 0; i < aSize; i++) aRes[i] = aGroupDS->GetID(i+1); - return aRes._retn(); + + if ( 0 < aSize && aSize < 100 ) // for comfortable testing ;) + std::sort( &aRes[0], &aRes[0]+aSize ); } MESSAGE("get list of IDs of a vague group"); return aRes._retn(); } +namespace +{ + //================================================================================ + /*! + * \brief return nodes of elements pointered by iterator + */ + //================================================================================ + + void getNodesOfElements(SMDS_ElemIteratorPtr elemIt, + set& nodes) + { + while ( elemIt->more() ) + { + const SMDS_MeshElement* e = elemIt->next(); + nodes.insert( e->begin_nodes(), e->end_nodes() ); + } + } +} + +//================================================================================ +/*! + * \brief return the number of nodes of cells included to the group + */ +//================================================================================ + +CORBA::Long SMESH_GroupBase_i::GetNumberOfNodes() +{ + if ( GetType() == SMESH::NODE ) + return Size(); + + if ( myPreMeshInfo ) + myPreMeshInfo->FullLoadFromFile(); + + if ( SMESHDS_GroupBase* g = GetGroupDS()) + { + if ( myNbNodes < 0 || g->GetTic() != myGroupDSTic ) + { + set nodes; + getNodesOfElements( g->GetElements(), nodes ); + myNbNodes = nodes.size(); + myGroupDSTic = g->GetTic(); + } + } + return myNbNodes; +} + +//================================================================================ +/*! + * \brief Return true if GetNumberOfNodes() won't take a long time for computation + */ +//================================================================================ + +CORBA::Boolean SMESH_GroupBase_i::IsNodeInfoAvailable() +{ + if ( GetType() == SMESH::NODE/* || Size() < 100000 */) + return true; + if ( myPreMeshInfo ) + return false; + if ( SMESHDS_GroupBase* g = GetGroupDS()) + return ( myNbNodes > -1 && g->GetTic() == myGroupDSTic); + return false; +} + +//================================================================================ +/*! + * \brief Return IDs of nodes of cells included to the group + */ +//================================================================================ + +SMESH::long_array* SMESH_GroupBase_i::GetNodeIDs() +{ + if ( GetType() == SMESH::NODE ) + return GetListOfID(); + + if ( myPreMeshInfo ) + myPreMeshInfo->FullLoadFromFile(); + + SMESH::long_array_var aRes = new SMESH::long_array(); + if ( SMESHDS_GroupBase* g = GetGroupDS()) + { + set nodes; + getNodesOfElements( g->GetElements(), nodes ); + aRes->length( nodes.size() ); + set::iterator nIt = nodes.begin(), nEnd = nodes.end(); + for ( int i = 0; nIt != nEnd; ++nIt, ++i ) + aRes[i] = (*nIt)->GetID(); + } + return aRes._retn(); +} + //============================================================================= /*! * @@ -498,8 +631,12 @@ void SMESH_GroupBase_i::SetColor(const SALOMEDS::Color& color) if (aGroupDS) { Quantity_Color aQColor( color.R, color.G, color.B, Quantity_TOC_RGB ); - aGroupDS->SetColor(aQColor); - TPythonDump()<<_this()<<".SetColor( SALOMEDS.Color( "<GetColor(); + if ( oldColor != aQColor ) + { + aGroupDS->SetColor(aQColor); + TPythonDump()<<_this()<<".SetColor( SALOMEDS.Color( "<GetMeshInfo(); + SMESH::long_array_var aRes = new SMESH::long_array(); aRes->length(SMESH::Entity_Last); for (int i = SMESH::Entity_Node; i < SMESH::Entity_Last; i++) aRes[i] = 0; - SMESHDS_GroupBase* aGrpDS = GetGroupDS(); - if ( !aGrpDS ) - return aRes._retn(); - if ( GetType() == NODE ) - aRes[ SMESH::Entity_Node ] = aGrpDS->Extent(); - else - SMESH_Mesh_i::CollectMeshInfo( aGrpDS->GetElements(), aRes); - -// SMDS_ElemIteratorPtr it = aGrpDS->GetElements(); -// if ( it->more() ) -// { -// cout << "START" << endl; -// set< const SMDS_MeshElement* > nodes; -// const SMDS_MeshElement* e = it->next(); -// for ( int i = 0; i < 1000000; ++i) -// { -// SMDS_ElemIteratorPtr it = e->nodesIterator(); -// nodes.insert( e + i ); -// } -// cout << "END "<< nodes.size() << endl; -// } - + if ( SMESHDS_GroupBase* g = GetGroupDS()) + { + if ( g->GetType() == SMDSAbs_Node || ( myNbNodes > -1 && g->GetTic() == myGroupDSTic)) + aRes[ SMDSEntity_Node ] = GetNumberOfNodes(); + + if ( g->GetType() != SMDSAbs_Node ) + SMESH_Mesh_i::CollectMeshInfo( g->GetElements(), aRes); + } + return aRes._retn(); } @@ -580,8 +707,7 @@ SMESH::long_array* SMESH_GroupBase_i::GetMeshInfo() SMESH::long_array* SMESH_GroupBase_i::GetIDs() { - SMESH::long_array_var aResult = GetListOfID(); - return aResult._retn(); + return GetListOfID(); } //======================================================================= @@ -592,11 +718,25 @@ SMESH::long_array* SMESH_GroupBase_i::GetIDs() SMESH::array_of_ElementType* SMESH_GroupBase_i::GetTypes() { SMESH::array_of_ElementType_var types = new SMESH::array_of_ElementType; - types->length( 1 ); - types[0] = GetType(); + if ( !IsEmpty() ) + { + types->length( 1 ); + types[0] = GetType(); + } return types._retn(); } +//======================================================================= +//function : IsMeshInfoCorrect +//purpose : * Returns false if GetMeshInfo() returns incorrect information that may +// * happen if mesh data is not yet fully loaded from the file of study. +//======================================================================= + +bool SMESH_GroupBase_i::IsMeshInfoCorrect() +{ + return myPreMeshInfo ? myPreMeshInfo->IsMeshInfoCorrect() : true; +} + //================================================================================ /*! * \brief Retrieves the predicate from the filter @@ -622,6 +762,9 @@ SMESH_PredicatePtr SMESH_GroupOnFilter_i::GetPredicate( SMESH::Filter_ptr filter void SMESH_GroupOnFilter_i::SetFilter(SMESH::Filter_ptr theFilter) { + if ( myPreMeshInfo ) + myPreMeshInfo->FullLoadFromFile(); + if ( ! myFilter->_is_nil() ) myFilter->UnRegister(); @@ -746,6 +889,12 @@ SMESH::Filter_ptr SMESH_GroupOnFilter_i::StringToFilter(const std::string& thePe return filter._retn(); } +//================================================================================ +/*! + * \brief Destructor of SMESH_GroupOnFilter_i + */ +//================================================================================ + SMESH_GroupOnFilter_i::~SMESH_GroupOnFilter_i() { if ( ! myFilter->_is_nil() ) @@ -755,8 +904,17 @@ SMESH_GroupOnFilter_i::~SMESH_GroupOnFilter_i() } } +//================================================================================ +/*! + * \brief Method calleds when a predicate of myFilter changes + */ +//================================================================================ + void SMESH_GroupOnFilter_i::PredicateChanged() { + if ( myPreMeshInfo ) + myPreMeshInfo->FullLoadFromFile(); + if ( SMESHDS_GroupOnFilter* grDS = dynamic_cast< SMESHDS_GroupOnFilter*>( GetGroupDS() )) grDS->SetPredicate( GetPredicate( myFilter )); }