#include "SMESH_Group.hxx"
#include "SMESH_Mesh_i.hxx"
#include "SMESH_PythonDump.hxx"
+#include "SMESH_PreMeshInfo.hxx"
#include CORBA_SERVER_HEADER(SMESH_Filter)
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()
MESSAGE("~SMESH_GroupBase_i; this = "<<this );
if ( myMeshServant )
myMeshServant->removeGroup(myLocalID);
+
+ if ( myPreMeshInfo ) delete myPreMeshInfo; myPreMeshInfo = NULL;
}
//=======================================================================
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();
CORBA::Boolean SMESH_GroupBase_i::IsEmpty()
{
+ if ( myPreMeshInfo )
+ return Size() == 0;
+
SMESHDS_GroupBase* aGroupDS = GetGroupDS();
if (aGroupDS)
return aGroupDS->IsEmpty();
void SMESH_Group_i::Clear()
{
+ if ( myPreMeshInfo )
+ myPreMeshInfo->FullLoadFromFile();
+
// Update Python script
TPythonDump() << _this() << ".Clear()";
CORBA::Boolean SMESH_GroupBase_i::Contains( CORBA::Long theID )
{
+ if ( myPreMeshInfo )
+ myPreMeshInfo->FullLoadFromFile();
+
SMESHDS_GroupBase* aGroupDS = GetGroupDS();
if (aGroupDS)
return aGroupDS->Contains(theID);
CORBA::Long SMESH_Group_i::Add( const SMESH::long_array& theIDs )
{
+ if ( myPreMeshInfo )
+ myPreMeshInfo->FullLoadFromFile();
+
// Update Python script
TPythonDump() << "nbAdd = " << _this() << ".Add( " << theIDs << " )";
CORBA::Long SMESH_Group_i::Remove( const SMESH::long_array& theIDs )
{
+ if ( myPreMeshInfo )
+ myPreMeshInfo->FullLoadFromFile();
+
// Update Python script
TPythonDump() << "nbDel = " << _this() << ".Remove( " << theIDs << " )";
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<SMESHDS_Group*>(theGroupBase)){
SMESH_Group_i::
AddByPredicate( SMESH::Predicate_ptr thePredicate )
{
+ if ( myPreMeshInfo )
+ myPreMeshInfo->FullLoadFromFile();
+
if(SMESH::Predicate_i* aPredicate = SMESH::GetPredicate(thePredicate)){
TPythonDump()<<_this()<<".AddByPredicate("<<aPredicate<<")";
return ChangeByPredicate(aPredicate,GetGroupDS(),&SMESHDS_Group::Add);
SMESH_Group_i::
RemoveByPredicate( SMESH::Predicate_ptr thePredicate )
{
+ if ( myPreMeshInfo )
+ myPreMeshInfo->FullLoadFromFile();
+
if(SMESH::Predicate_i* aPredicate = SMESH::GetPredicate(thePredicate)){
TPythonDump()<<_this()<<".RemoveByPredicate("<<aPredicate<<")";
return ChangeByPredicate(aPredicate,GetGroupDS(),&SMESHDS_Group::Remove);
CORBA::Long SMESH_Group_i::AddFrom( SMESH::SMESH_IDSource_ptr theSource )
{
+ if ( myPreMeshInfo )
+ myPreMeshInfo->FullLoadFromFile();
+
TPythonDump pd;
long nbAdd = 0;
SMESHDS_Group* aGroupDS = dynamic_cast<SMESHDS_Group*>( GetGroupDS() );
CORBA::Long SMESH_GroupBase_i::GetID( CORBA::Long theIndex )
{
+ if ( myPreMeshInfo )
+ myPreMeshInfo->FullLoadFromFile();
+
SMESHDS_GroupBase* aGroupDS = GetGroupDS();
if (aGroupDS)
return aGroupDS->GetID(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 ( GetType() == SMESH::NODE )
return Size();
+ if ( myPreMeshInfo )
+ myPreMeshInfo->FullLoadFromFile();
+
if ( SMESHDS_GroupBase* g = GetGroupDS())
{
if ( myNbNodes < 0 || g->GetTic() != myGroupDSTic )
{
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;
if ( GetType() == SMESH::NODE )
return GetListOfID();
+ if ( myPreMeshInfo )
+ myPreMeshInfo->FullLoadFromFile();
+
SMESH::long_array_var aRes = new SMESH::long_array();
if ( SMESHDS_GroupBase* g = GetGroupDS())
{
//=============================================================================
SMESH::long_array* SMESH_GroupBase_i::GetMeshInfo()
{
+ if ( myPreMeshInfo )
+ return myPreMeshInfo->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();
}
SMESH::long_array* SMESH_GroupBase_i::GetIDs()
{
- SMESH::long_array_var aResult = GetListOfID();
- return aResult._retn();
+ return GetListOfID();
}
//=======================================================================
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
void SMESH_GroupOnFilter_i::SetFilter(SMESH::Filter_ptr theFilter)
{
+ if ( myPreMeshInfo )
+ myPreMeshInfo->FullLoadFromFile();
+
if ( ! myFilter->_is_nil() )
myFilter->UnRegister();
return filter._retn();
}
+//================================================================================
+/*!
+ * \brief Destructor of SMESH_GroupOnFilter_i
+ */
+//================================================================================
+
SMESH_GroupOnFilter_i::~SMESH_GroupOnFilter_i()
{
if ( ! myFilter->_is_nil() )
}
}
+//================================================================================
+/*!
+ * \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 ));
}
class SMESH_Group;
class SMESHDS_GroupBase;
+class SMESH_PreMeshInfo;
// ===========
// Group Base
SMESH::long_array* GetNodeIDs();
CORBA::Long GetNumberOfNodes();
CORBA::Boolean IsNodeInfoAvailable(); // for gui
- SMESH::SMESH_Mesh_ptr GetMesh();
+
+ virtual SMESH::SMESH_Mesh_ptr GetMesh();
/*!
* Returns statistic of mesh elements
* Inherited from SMESH_IDSource interface
*/
virtual SMESH::array_of_ElementType* GetTypes();
+ /*!
+ * Returns false if GetMeshInfo() returns incorrect information that may
+ * happen if mesh data is not yet fully loaded from the file of study.
+ */
+ virtual bool IsMeshInfoCorrect();
// Internal C++ interface
int GetLocalID() const { return myLocalID; }
void SetColorNumber(CORBA::Long color);
CORBA::Long GetColorNumber();
+protected:
+
+ SMESH_PreMeshInfo* & changePreMeshInfo() { return myPreMeshInfo; }
+ SMESH_PreMeshInfo* myPreMeshInfo; // mesh info before full loading from study file
+ friend class SMESH_PreMeshInfo;
+
private:
SMESH_Mesh_i* myMeshServant;
int myLocalID;
// File : SMESH_subMesh_i.cxx
// Author : Paul RASCLE, EDF
// Module : SMESH
-// $Header$
//
#include "SMESH_subMesh_i.hxx"
#include "SMESH_Gen_i.hxx"
#include "SMESH_Mesh_i.hxx"
+#include "SMESH_PreMeshInfo.hxx"
#include "Utils_CorbaException.hxx"
#include "utilities.h"
: SALOME::GenericObj_i( PortableServer::POA::_nil() )
{
MESSAGE("SMESH_subMesh_i::SMESH_subMesh_i default, not for use");
- ASSERT(0);
+ ASSERT(0);
}
//=============================================================================
int localId )
: SALOME::GenericObj_i( thePOA )
{
- MESSAGE("SMESH_subMesh_i::SMESH_subMesh_i");
_gen_i = gen_i;
_mesh_i = mesh_i;
_localId = localId;
- // ****
+ _preMeshInfo = NULL;
}
//=============================================================================
/*!
SMESH_subMesh_i::~SMESH_subMesh_i()
{
MESSAGE("SMESH_subMesh_i::~SMESH_subMesh_i");
- // ****
+ if ( _preMeshInfo ) delete _preMeshInfo;
+ _preMeshInfo = NULL;
}
//=======================================================================
throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_subMesh_i::GetNumberOfElements");
+
+ if ( _preMeshInfo )
+ return _preMeshInfo->NbElements();
+
if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() )
return 0;
throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_subMesh_i::GetNumberOfNodes");
+
if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() )
return 0;
+ if ( _preMeshInfo )
+ {
+ if ( all ) return _preMeshInfo->NbNodes();
+ else _preMeshInfo->FullLoadFromFile();
+ }
::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_subMesh_i::GetElementsId");
+
SMESH::long_array_var aResult = new SMESH::long_array();
if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() )
return aResult._retn();
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_subMesh_i::GetElementsByType");
+
SMESH::long_array_var aResult = new SMESH::long_array();
if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() )
return aResult._retn();
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_subMesh_i::GetNodesId");
+
SMESH::long_array_var aResult = GetElementsByType( SMESH::NODE );
return aResult._retn();
}
throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_subMesh_i::GetFather");
return _mesh_i->_this();
}
CORBA::Long SMESH_subMesh_i::GetId()
{
- MESSAGE("SMESH_subMesh_i::GetId");
return _localId;
}
throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
SALOME_MED::MESH_var MEDMesh = GetFather()->GetMEDMesh();
SALOME_MED::Family_array_var families =
//=============================================================================
SMESH::long_array* SMESH_subMesh_i::GetIDs()
{
- SMESH::long_array_var aResult = GetElementsId();
- return aResult._retn();
+ return GetElementsId();
}
//=============================================================================
SMESH::ElementType SMESH_subMesh_i::GetElementType( const CORBA::Long id, const bool iselem )
throw (SALOME::SALOME_Exception)
{
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
return GetFather()->GetElementType( id, iselem );
}
//=============================================================================
SMESH::long_array* SMESH_subMesh_i::GetMeshInfo()
{
+ if ( _preMeshInfo )
+ return _preMeshInfo->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++)
SMESH::array_of_ElementType* SMESH_subMesh_i::GetTypes()
{
+ if ( _preMeshInfo )
+ return _preMeshInfo->GetTypes();
+
SMESH::array_of_ElementType_var types = new SMESH::array_of_ElementType;
::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
{
return GetFather();
}
+
+//=======================================================================
+//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_subMesh_i::IsMeshInfoCorrect()
+{
+ return _preMeshInfo ? _preMeshInfo->IsMeshInfoCorrect() : true;
+}
#include "SMESH_Mesh_i.hxx"
class SMESH_Gen_i;
+class SMESH_PreMeshInfo;
class SMESH_I_EXPORT SMESH_subMesh_i:
public virtual POA_SMESH::SMESH_subMesh,
SMESH::long_array* GetElementsByType( SMESH::ElementType theElemType )
throw (SALOME::SALOME_Exception);
- //for omniORB conflict compilation
- /*SMESH::ElementType GetElementType( const CORBA::Long id, const bool iselem )
- throw (SALOME::SALOME_Exception);*/
SMESH::ElementType GetElementType( CORBA::Long id, bool iselem )
throw (SALOME::SALOME_Exception);
GEOM::GEOM_Object_ptr GetSubShape()
throw (SALOME::SALOME_Exception);
- CORBA::Long GetId();
+ CORBA::Long GetId();
SALOME_MED::FAMILY_ptr GetFamily()
throw (SALOME::SALOME_Exception);
/*!
* Returns the mesh
*/
- SMESH::SMESH_Mesh_ptr GetMesh();
+ virtual SMESH::SMESH_Mesh_ptr GetMesh();
+ /*!
+ * Returns false if GetMeshInfo() returns incorrect information that may
+ * happen if mesh data is not yet fully loaded from the file of study.
+ */
+ virtual bool IsMeshInfoCorrect();
+protected:
+
+ SMESH_Gen_i* _gen_i;
+ int _localId;
SMESH_Mesh_i* _mesh_i; //NRI
-protected:
void changeLocalId(int localId) { _localId = localId; }
- SMESH_Gen_i* _gen_i;
- int _localId;
-
friend void SMESH_Mesh_i::CheckGeomGroupModif();
+
+ SMESH_PreMeshInfo* _preMeshInfo; // mesh info before full loading from study file
+
+ SMESH_PreMeshInfo* & changePreMeshInfo() { return _preMeshInfo; }
+ friend class SMESH_PreMeshInfo;
};
#endif