X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FOBJECT%2FSMESH_Object.cxx;h=3b9cd0b8ce28e9ad97222dccbb9caa0b1c4de46f;hb=eef0bf5cc772a6bdacf6ae2a4d81fdcb9d3a7fdb;hp=e137a1c6d202d47ec858db715030421bd8653246;hpb=bd4e115a78b52e3fbc016e5e30bb0e19b2a9e7d6;p=modules%2Fsmesh.git diff --git a/src/OBJECT/SMESH_Object.cxx b/src/OBJECT/SMESH_Object.cxx index e137a1c6d..3b9cd0b8c 100644 --- a/src/OBJECT/SMESH_Object.cxx +++ b/src/OBJECT/SMESH_Object.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -28,13 +28,16 @@ #include "SMESH_ObjectDef.h" #include "SMESH_ActorUtils.h" +#include "SMDS_BallElement.hxx" #include "SMDS_Mesh.hxx" +#include "SMDS_MeshCell.hxx" #include "SMDS_PolyhedralVolumeOfNodes.hxx" #include "SMESH_Actor.h" #include "SMESH_ControlsDef.hxx" -#include "SalomeApp_Application.h" -#include "VTKViewer_ExtractUnstructuredGrid.h" -#include "VTKViewer_CellLocationsArray.h" + +#include +#include +#include #include CORBA_SERVER_HEADER(SMESH_Gen) #include CORBA_SERVER_HEADER(SALOME_Exception) @@ -43,7 +46,7 @@ #include #include #include - +#include #include #include @@ -64,7 +67,7 @@ using namespace std; #endif #ifdef _DEBUG_ -static int MYDEBUG = 1; +static int MYDEBUG = 0; static int MYDEBUGWITHFILES = 0;//1; #else static int MYDEBUG = 0; @@ -81,47 +84,48 @@ static int MYDEBUGWITHFILES = 0; // function : getCellType // purpose : Get type of VTK cell //================================================================================= -static inline vtkIdType getCellType( const SMDSAbs_ElementType theType, - const bool thePoly, - const int theNbNodes ) -{ - switch( theType ) - { - case SMDSAbs_0DElement: return VTK_VERTEX; - - case SMDSAbs_Ball: return VTK_POLY_VERTEX; - - case SMDSAbs_Edge: - if( theNbNodes == 2 ) return VTK_LINE; - else if ( theNbNodes == 3 ) return VTK_QUADRATIC_EDGE; - else return VTK_EMPTY_CELL; - - case SMDSAbs_Face : - if (thePoly && theNbNodes>2 ) return VTK_POLYGON; - else if ( theNbNodes == 3 ) return VTK_TRIANGLE; - else if ( theNbNodes == 4 ) return VTK_QUAD; - else if ( theNbNodes == 6 ) return VTK_QUADRATIC_TRIANGLE; - else if ( theNbNodes == 8 ) return VTK_QUADRATIC_QUAD; - else if ( theNbNodes == 9 ) return VTK_BIQUADRATIC_QUAD; - else return VTK_EMPTY_CELL; +// static inline vtkIdType getCellType( const SMDSAbs_ElementType theType, +// const bool thePoly, +// const int theNbNodes ) +// { +// switch( theType ) +// { +// case SMDSAbs_0DElement: return VTK_VERTEX; + +// case SMDSAbs_Ball: return VTK_POLY_VERTEX; + +// case SMDSAbs_Edge: +// if( theNbNodes == 2 ) return VTK_LINE; +// else if ( theNbNodes == 3 ) return VTK_QUADRATIC_EDGE; +// else return VTK_EMPTY_CELL; + +// case SMDSAbs_Face : +// if (thePoly && theNbNodes>2 ) return VTK_POLYGON; +// else if ( theNbNodes == 3 ) return VTK_TRIANGLE; +// else if ( theNbNodes == 4 ) return VTK_QUAD; +// else if ( theNbNodes == 6 ) return VTK_QUADRATIC_TRIANGLE; +// else if ( theNbNodes == 8 ) return VTK_QUADRATIC_QUAD; +// else if ( theNbNodes == 9 ) return VTK_BIQUADRATIC_QUAD; +// else if ( theNbNodes == 7 ) return VTK_BIQUADRATIC_TRIANGLE; +// else return VTK_EMPTY_CELL; - case SMDSAbs_Volume: - if (thePoly && theNbNodes>3 ) return VTK_POLYHEDRON; //VTK_CONVEX_POINT_SET; - else if ( theNbNodes == 4 ) return VTK_TETRA; - else if ( theNbNodes == 5 ) return VTK_PYRAMID; - else if ( theNbNodes == 6 ) return VTK_WEDGE; - else if ( theNbNodes == 8 ) return VTK_HEXAHEDRON; - else if ( theNbNodes == 12 ) return VTK_HEXAGONAL_PRISM; - else if ( theNbNodes == 10 ) return VTK_QUADRATIC_TETRA; - else if ( theNbNodes == 20 ) return VTK_QUADRATIC_HEXAHEDRON; - else if ( theNbNodes == 27 ) return VTK_TRIQUADRATIC_HEXAHEDRON; - else if ( theNbNodes == 15 ) return VTK_QUADRATIC_WEDGE; - else if ( theNbNodes == 13 ) return VTK_QUADRATIC_PYRAMID; //VTK_CONVEX_POINT_SET; - else return VTK_EMPTY_CELL; - - default: return VTK_EMPTY_CELL; - } -} +// case SMDSAbs_Volume: +// if (thePoly && theNbNodes>3 ) return VTK_POLYHEDRON; //VTK_CONVEX_POINT_SET; +// else if ( theNbNodes == 4 ) return VTK_TETRA; +// else if ( theNbNodes == 5 ) return VTK_PYRAMID; +// else if ( theNbNodes == 6 ) return VTK_WEDGE; +// else if ( theNbNodes == 8 ) return VTK_HEXAHEDRON; +// else if ( theNbNodes == 12 ) return VTK_HEXAGONAL_PRISM; +// else if ( theNbNodes == 10 ) return VTK_QUADRATIC_TETRA; +// else if ( theNbNodes == 20 ) return VTK_QUADRATIC_HEXAHEDRON; +// else if ( theNbNodes == 27 ) return VTK_TRIQUADRATIC_HEXAHEDRON; +// else if ( theNbNodes == 15 ) return VTK_QUADRATIC_WEDGE; +// else if ( theNbNodes == 13 ) return VTK_QUADRATIC_PYRAMID; //VTK_CONVEX_POINT_SET; +// else return VTK_EMPTY_CELL; + +// default: return VTK_EMPTY_CELL; +// } +// } //================================================================================= // functions : SMESH_VisualObjDef @@ -129,7 +133,7 @@ static inline vtkIdType getCellType( const SMDSAbs_ElementType theType, //================================================================================= SMESH_VisualObjDef::SMESH_VisualObjDef() { - MESSAGE("---------------------------------------------SMESH_VisualObjDef::SMESH_VisualObjDef"); + if ( MYDEBUG ) MESSAGE("-------------------------------SMESH_VisualObjDef::SMESH_VisualObjDef"); myGrid = vtkUnstructuredGrid::New(); myLocalGrid = false; ClearEntitiesFlags(); @@ -137,9 +141,8 @@ SMESH_VisualObjDef::SMESH_VisualObjDef() } SMESH_VisualObjDef::~SMESH_VisualObjDef() { - MESSAGE("---------------------------------------------SMESH_VisualObjDef::~SMESH_VisualObjDef"); - //if ( MYDEBUG ) - MESSAGE( "~SMESH_MeshObj - myGrid->GetReferenceCount() = " << myGrid->GetReferenceCount() ); + if ( MYDEBUG ) MESSAGE("--------------------------------SMESH_VisualObjDef::~SMESH_VisualObjDef"); + if ( MYDEBUG ) MESSAGE( "myGrid->GetReferenceCount() = " << myGrid->GetReferenceCount() ); myGrid->Delete(); } @@ -149,48 +152,56 @@ SMESH_VisualObjDef::~SMESH_VisualObjDef() //================================================================================= vtkIdType SMESH_VisualObjDef::GetNodeObjId( int theVTKID ) { - if (myLocalGrid) - { - TMapOfIds::const_iterator i = myVTK2SMDSNodes.find(theVTKID); - return i == myVTK2SMDSNodes.end() ? -1 : i->second; - } - return this->GetMesh()->FindNodeVtk(theVTKID)->GetID(); + if (myLocalGrid) + { + TMapOfIds::const_iterator i = myVTK2SMDSNodes.find(theVTKID); + return i == myVTK2SMDSNodes.end() ? -1 : i->second; + } + const SMDS_MeshNode* aNode = 0; + if( this->GetMesh() ) + aNode = this->GetMesh()->FindNodeVtk( theVTKID ); + + return aNode ? aNode->GetID() : -1; } vtkIdType SMESH_VisualObjDef::GetNodeVTKId( int theObjID ) { - if (myLocalGrid) - { - TMapOfIds::const_iterator i = mySMDS2VTKNodes.find(theObjID); + if (myLocalGrid) + { + TMapOfIds::const_iterator i = mySMDS2VTKNodes.find(theObjID); return i == mySMDS2VTKNodes.end() ? -1 : i->second; - } + } - const SMDS_MeshNode* aNode = 0; - if( this->GetMesh() ) { - aNode = this->GetMesh()->FindNode(theObjID); - } - return aNode ? aNode->getVtkId() : -1; + const SMDS_MeshNode* aNode = 0; + if( this->GetMesh() ) { + aNode = this->GetMesh()->FindNode(theObjID); + } + return aNode ? aNode->getVtkId() : -1; } vtkIdType SMESH_VisualObjDef::GetElemObjId( int theVTKID ) { - if (myLocalGrid) - { - TMapOfIds::const_iterator i = myVTK2SMDSElems.find(theVTKID); - return i == myVTK2SMDSElems.end() ? -1 : i->second; - } + if (myLocalGrid) + { + TMapOfIds::const_iterator i = myVTK2SMDSElems.find(theVTKID); + return i == myVTK2SMDSElems.end() ? -1 : i->second; + } return this->GetMesh()->fromVtkToSmds(theVTKID); } vtkIdType SMESH_VisualObjDef::GetElemVTKId( int theObjID ) { - if (myLocalGrid) - { - TMapOfIds::const_iterator i = mySMDS2VTKElems.find(theObjID); - return i == mySMDS2VTKElems.end() ? -1 : i->second; - } - return this->GetMesh()->FindElement(theObjID)->getVtkId(); - //return this->GetMesh()->fromSmdsToVtk(theObjID); + if (myLocalGrid) + { + TMapOfIds::const_iterator i = mySMDS2VTKElems.find(theObjID); + return i == mySMDS2VTKElems.end() ? -1 : i->second; + } + + const SMDS_MeshElement* e = 0; + if ( this->GetMesh() ) + e = this->GetMesh()->FindElement(theObjID); + + return e ? e->getVtkId() : -1; } //================================================================================= @@ -220,8 +231,8 @@ void SMESH_VisualObjDef::createPoints( vtkPoints* thePoints ) { thePoints->SetPoint( nbPoints, aNode->X(), aNode->Y(), aNode->Z() ); int anId = aNode->GetID(); - mySMDS2VTKNodes.insert( TMapOfIds::value_type( anId, nbPoints ) ); - myVTK2SMDSNodes.insert( TMapOfIds::value_type( nbPoints, anId ) ); + mySMDS2VTKNodes.insert( mySMDS2VTKNodes.end(), std::make_pair( anId, nbPoints )); + myVTK2SMDSNodes.insert( myVTK2SMDSNodes.end(), std::make_pair( nbPoints, anId )); nbPoints++; } } @@ -236,49 +247,52 @@ void SMESH_VisualObjDef::createPoints( vtkPoints* thePoints ) //================================================================================= void SMESH_VisualObjDef::buildPrs(bool buildGrid) { - MESSAGE("----------------------------------------------------------SMESH_VisualObjDef::buildPrs " << buildGrid); + if ( MYDEBUG ) MESSAGE("---------------------------SMESH_VisualObjDef::buildPrs " << buildGrid); if (buildGrid) { - myLocalGrid = true; - try - { - mySMDS2VTKNodes.clear(); - myVTK2SMDSNodes.clear(); - mySMDS2VTKElems.clear(); - myVTK2SMDSElems.clear(); - - if ( IsNodePrs() ) - buildNodePrs(); - else - buildElemPrs(); - } - catch(...) - { - mySMDS2VTKNodes.clear(); - myVTK2SMDSNodes.clear(); - mySMDS2VTKElems.clear(); - myVTK2SMDSElems.clear(); - - myGrid->SetPoints( 0 ); - myGrid->SetCells( 0, 0, 0, 0, 0 ); - throw; - } + myLocalGrid = true; + try + { + mySMDS2VTKNodes.clear(); + myVTK2SMDSNodes.clear(); + mySMDS2VTKElems.clear(); + myVTK2SMDSElems.clear(); + + if ( IsNodePrs() ) + buildNodePrs(); + else + buildElemPrs(); + } + catch(...) + { + mySMDS2VTKNodes.clear(); + myVTK2SMDSNodes.clear(); + mySMDS2VTKElems.clear(); + myVTK2SMDSElems.clear(); + + myGrid->SetPoints( 0 ); + myGrid->SetCells( 0, 0, 0, 0, 0 ); + throw; + } } else { - myLocalGrid = false; - if (!GetMesh()->isCompacted()) - { - MESSAGE("*** buildPrs ==> compactMesh!"); - GetMesh()->compactMesh(); - } - vtkUnstructuredGrid *theGrid = GetMesh()->getGrid(); - updateEntitiesFlags(); - myGrid->ShallowCopy(theGrid); - //MESSAGE(myGrid->GetReferenceCount()); - //MESSAGE( "Update - myGrid->GetNumberOfCells() = "<GetNumberOfCells() ); - //MESSAGE( "Update - myGrid->GetNumberOfPoints() = "<GetNumberOfPoints() ); - if( MYDEBUGWITHFILES ) SMESH::WriteUnstructuredGrid( myGrid,"buildPrs.vtu" ); + myLocalGrid = false; + if (!GetMesh()->isCompacted()) + { + NulData(); // detach from the SMDS grid to allow immediate memory de-allocation in compactMesh() + if ( MYDEBUG ) MESSAGE("*** buildPrs ==> compactMesh!"); + GetMesh()->compactMesh(); + } + vtkUnstructuredGrid *theGrid = GetMesh()->getGrid(); + updateEntitiesFlags(); + myGrid->ShallowCopy(theGrid); + //MESSAGE(myGrid->GetReferenceCount()); + //MESSAGE( "Update - myGrid->GetNumberOfCells() = "<GetNumberOfCells() ); + //MESSAGE( "Update - myGrid->GetNumberOfPoints() = "<GetNumberOfPoints() ); + if( MYDEBUGWITHFILES ) { + SMESH::WriteUnstructuredGrid( myGrid,"myPrs.vtu" ); + } } } @@ -345,16 +359,21 @@ void SMESH_VisualObjDef::buildElemPrs() // Calculate cells size - static SMDSAbs_ElementType aTypes[ 5 ] = - { SMDSAbs_Ball, SMDSAbs_0DElement, SMDSAbs_Edge, SMDSAbs_Face, SMDSAbs_Volume }; + const int nbTypes = 5; + static SMDSAbs_ElementType aTypes[ nbTypes ] = + { SMDSAbs_Edge, SMDSAbs_Face, SMDSAbs_Volume, SMDSAbs_Ball, SMDSAbs_0DElement }; // get entity data map nbEnts; map anEnts; - for ( int i = 0; i <= 3; i++ ) - nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] ); + vtkIdType aNbCells = 0; + for ( int i = 0; i < nbTypes; i++ ) + { + nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] ); + aNbCells += nbEnts[ aTypes [ i ]]; + } // PAL16631: without swap, bad_alloc is not thrown but hung up and crash instead, // so check remaining memory size for safety SMDS_Mesh::CheckMemory(); // PAL16631 @@ -362,7 +381,7 @@ void SMESH_VisualObjDef::buildElemPrs() vtkIdType aCellsSize = 2 * nbEnts[ SMDSAbs_0DElement ] + 3 * nbEnts[ SMDSAbs_Edge ]; aCellsSize += 2 * nbEnts[ SMDSAbs_Ball ]; - for ( int i = 2; i <= 3; i++ ) // iterate through faces and volumes + for ( int i = 1; i <= 2; i++ ) // iterate through faces and volumes { if ( nbEnts[ aTypes[ i ] ] ) { @@ -388,11 +407,6 @@ void SMESH_VisualObjDef::buildElemPrs() } } } - - vtkIdType aNbCells = - nbEnts[ SMDSAbs_0DElement ] + nbEnts[ SMDSAbs_Ball ] + nbEnts[ SMDSAbs_Edge ] + - nbEnts[ SMDSAbs_Face ] + nbEnts[ SMDSAbs_Volume ]; - if ( MYDEBUG ) MESSAGE( "Update - aNbCells = "< 0 || - GetNbEntities(SMDSAbs_0DElement) > 0 || - GetNbEntities(SMDSAbs_Ball) > 0 || - GetNbEntities(SMDSAbs_Edge) > 0 || - GetNbEntities(SMDSAbs_Face) > 0 || - GetNbEntities(SMDSAbs_Volume) > 0 ; + return ( GetNbEntities(SMDSAbs_0DElement) > 0 || + GetNbEntities(SMDSAbs_Ball ) > 0 || + GetNbEntities(SMDSAbs_Edge ) > 0 || + GetNbEntities(SMDSAbs_Face ) > 0 || + GetNbEntities(SMDSAbs_Volume ) > 0 || + GetNbEntities(SMDSAbs_Node ) > 0 ); } //================================================================================= // function : updateEntitiesFlags // purpose : Update entities flags //================================================================================= -void SMESH_VisualObjDef::updateEntitiesFlags() { +void SMESH_VisualObjDef::updateEntitiesFlags() +{ + unsigned int tmp = myEntitiesState; + ClearEntitiesFlags(); - unsigned int tmp = myEntitiesState; - ClearEntitiesFlags(); + map entities = SMESH::GetEntitiesFromObject(this); - map entities = SMESH::GetEntitiesFromObject(this); - - if( myEntitiesCache[SMDSAbs_0DElement] != 0 || myEntitiesCache[SMDSAbs_0DElement] >= entities[SMDSAbs_0DElement] ) - myEntitiesState &= ~SMESH_Actor::e0DElements; + if( myEntitiesCache[SMDSAbs_0DElement] != 0 || + myEntitiesCache[SMDSAbs_0DElement] >= entities[SMDSAbs_0DElement] ) + myEntitiesState &= ~SMESH_Actor::e0DElements; - if( myEntitiesCache[SMDSAbs_Ball] != 0 || myEntitiesCache[SMDSAbs_Ball] >= entities[SMDSAbs_Ball] ) - myEntitiesState &= ~SMESH_Actor::eBallElem; + if( myEntitiesCache[SMDSAbs_Ball] != 0 || + myEntitiesCache[SMDSAbs_Ball] >= entities[SMDSAbs_Ball] ) + myEntitiesState &= ~SMESH_Actor::eBallElem; - if( myEntitiesCache[SMDSAbs_Edge] != 0 || myEntitiesCache[SMDSAbs_Edge] >= entities[SMDSAbs_Edge] ) - myEntitiesState &= ~SMESH_Actor::eEdges; + if( myEntitiesCache[SMDSAbs_Edge] != 0 || + myEntitiesCache[SMDSAbs_Edge] >= entities[SMDSAbs_Edge] ) + myEntitiesState &= ~SMESH_Actor::eEdges; - if( myEntitiesCache[SMDSAbs_Face] != 0 || myEntitiesCache[SMDSAbs_Face] >= entities[SMDSAbs_Face] ) - myEntitiesState &= ~SMESH_Actor::eFaces; + if( myEntitiesCache[SMDSAbs_Face] != 0 || + myEntitiesCache[SMDSAbs_Face] >= entities[SMDSAbs_Face] ) + myEntitiesState &= ~SMESH_Actor::eFaces; - if( myEntitiesCache[SMDSAbs_Volume] != 0 || myEntitiesCache[SMDSAbs_Volume] >= entities[SMDSAbs_Volume] ) - myEntitiesState &= ~SMESH_Actor::eVolumes; + if( myEntitiesCache[SMDSAbs_Volume] != 0 || + myEntitiesCache[SMDSAbs_Volume] >= entities[SMDSAbs_Volume] ) + myEntitiesState &= ~SMESH_Actor::eVolumes; - if( tmp != myEntitiesState ) { - myEntitiesFlag = true; - } - - myEntitiesCache = entities; + if( tmp != myEntitiesState ) { + myEntitiesFlag = true; + } + + myEntitiesCache = entities; } //================================================================================= // function : ClearEntitiesFlags // purpose : Clear the entities flags //================================================================================= -void SMESH_VisualObjDef::ClearEntitiesFlags() { - myEntitiesState = SMESH_Actor::eAllEntity; - myEntitiesFlag = false; +void SMESH_VisualObjDef::ClearEntitiesFlags() +{ + myEntitiesState = SMESH_Actor::eAllEntity; + myEntitiesFlag = false; } //================================================================================= // function : GetEntitiesFlag // purpose : Return the entities flag //================================================================================= -bool SMESH_VisualObjDef::GetEntitiesFlag() { - return myEntitiesFlag; +bool SMESH_VisualObjDef::GetEntitiesFlag() +{ + return myEntitiesFlag; } //================================================================================= // function : GetEntitiesState // purpose : Return the entities state //================================================================================= -unsigned int SMESH_VisualObjDef::GetEntitiesState() { - return myEntitiesState; +unsigned int SMESH_VisualObjDef::GetEntitiesState() +{ + return myEntitiesState; } /* @@ -659,6 +687,8 @@ SMESH_MeshObj::~SMESH_MeshObj() { if ( MYDEBUG ) MESSAGE("SMESH_MeshObj - this = "<Delete(); } //================================================================================= @@ -668,9 +698,9 @@ SMESH_MeshObj::~SMESH_MeshObj() bool SMESH_MeshObj::Update( int theIsClear ) { // Update SMDS_Mesh on client part - MESSAGE("SMESH_MeshObj::Update " << this); + if ( MYDEBUG ) MESSAGE("SMESH_MeshObj::Update " << this); if ( myClient.Update(theIsClear) || GetUnstructuredGrid()->GetNumberOfPoints()==0) { - MESSAGE("buildPrs"); + if ( MYDEBUG ) MESSAGE("buildPrs"); buildPrs(); // Fill unstructured grid return true; } @@ -679,20 +709,20 @@ bool SMESH_MeshObj::Update( int theIsClear ) bool SMESH_MeshObj::NulData() { - MESSAGE ("SMESH_MeshObj::NulData() =================================================================================="); - if (!myEmptyGrid) - { - myEmptyGrid = SMDS_UnstructuredGrid::New(); - myEmptyGrid->Initialize(); - myEmptyGrid->Allocate(); - vtkPoints* points = vtkPoints::New(); - points->SetNumberOfPoints(0); - myEmptyGrid->SetPoints( points ); - points->Delete(); - myEmptyGrid->BuildLinks(); - } - myGrid->ShallowCopy(myEmptyGrid); - return true; + if ( MYDEBUG ) MESSAGE ("SMESH_MeshObj::NulData() ============================================="); + if (!myEmptyGrid) + { + myEmptyGrid = SMDS_UnstructuredGrid::New(); + myEmptyGrid->Initialize(); + myEmptyGrid->Allocate(); + vtkPoints* points = vtkPoints::New(); + points->SetNumberOfPoints(0); + myEmptyGrid->SetPoints( points ); + points->Delete(); + //myEmptyGrid->BuildLinks(); + } + myGrid->ShallowCopy(myEmptyGrid); + return true; } //================================================================================= // function : GetElemDimension @@ -872,7 +902,7 @@ void SMESH_SubMeshObj::UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunc //================================================================================= bool SMESH_SubMeshObj::Update( int theIsClear ) { - MESSAGE("SMESH_SubMeshObj::Update " << this) + if ( MYDEBUG ) MESSAGE("SMESH_SubMeshObj::Update " << this) bool changed = myMeshObj->Update( theIsClear ); buildPrs(true); return changed; @@ -957,7 +987,7 @@ static int getNodesFromElems( SMESH::long_array_var& theElemIds, // function : getPointers // purpose : Get std::list from list of IDs //================================================================================= -static int getPointers( const SMDSAbs_ElementType theRequestType, +static int getPointers( const SMDSAbs_ElementType theRequestType, SMESH::long_array_var& theElemIds, const SMDS_Mesh* theMesh, std::list& theResList ) @@ -995,11 +1025,16 @@ int SMESH_GroupObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& theResList.clear(); SMDS_Mesh* aMesh = myMeshObj->GetMesh(); - if ( myGroupServer->Size() == 0 || aMesh == 0 ) + if ( aMesh == 0 ) return 0; SMDSAbs_ElementType aGrpType = SMDSAbs_ElementType(myGroupServer->GetType()); + if ( aGrpType != theType && theType != SMDSAbs_Node ) + return 0; + SMESH::long_array_var anIds = myGroupServer->GetListOfID(); + if ( anIds->length() == 0 ) + return 0; if ( aGrpType == theType ) return getPointers( theType, anIds, aMesh, theResList ); @@ -1007,7 +1042,7 @@ int SMESH_GroupObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& return getNodesFromElems( anIds, aMesh, theResList ); else return 0; -} +}