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=2399b77fe9f96b81563d62aee204b9fdf4d53eca;hpb=fe3063e74b8d8e7091401919c9c899f988949fcb;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_Group_i.cxx b/src/SMESH_I/SMESH_Group_i.cxx index 2399b77fe..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) @@ -57,7 +58,8 @@ SMESH_GroupBase_i::SMESH_GroupBase_i( PortableServer::POA_ptr thePOA, myMeshServant( theMeshServant ), myLocalID( theLocalID ), myNbNodes(-1), - myGroupDSTic(0) + 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() @@ -102,6 +104,8 @@ SMESH_GroupBase_i::~SMESH_GroupBase_i() MESSAGE("~SMESH_GroupBase_i; this = "<removeGroup(myLocalID); + + if ( myPreMeshInfo ) delete myPreMeshInfo; myPreMeshInfo = NULL; } //======================================================================= @@ -192,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; @@ -209,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(); @@ -224,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(); @@ -239,6 +250,9 @@ CORBA::Boolean SMESH_GroupBase_i::IsEmpty() void SMESH_Group_i::Clear() { + if ( myPreMeshInfo ) + myPreMeshInfo->FullLoadFromFile(); + // Update Python script TPythonDump() << _this() << ".Clear()"; @@ -259,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); @@ -274,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 << " )"; @@ -300,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 << " )"; @@ -328,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)){ @@ -350,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() ); @@ -410,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); @@ -425,14 +460,20 @@ 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(); @@ -468,6 +509,9 @@ 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 ) @@ -491,6 +535,8 @@ 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; @@ -507,6 +553,9 @@ 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()) { @@ -582,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(); } @@ -664,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(); } //======================================================================= @@ -676,15 +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; - if ( SMESHDS_GroupBase* ds = GetGroupDS() ) - if ( !ds->IsEmpty() ) - { - 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 @@ -710,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(); @@ -834,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() ) @@ -843,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 )); }