X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FOBJECT%2FSMESH_Object.cxx;h=1566d3506345202bbbdd1c8d772f2caccd0cd32b;hp=e7ef139a4a2d3b88b12c5fe1b78ade97652bfab8;hb=8c1dfe2d90664a70f4451f77af48c1cde5638b60;hpb=8bc3c946fbe59d2d3920e0b677e4270bcdc375cc diff --git a/src/OBJECT/SMESH_Object.cxx b/src/OBJECT/SMESH_Object.cxx index e7ef139a4..1566d3506 100644 --- a/src/OBJECT/SMESH_Object.cxx +++ b/src/OBJECT/SMESH_Object.cxx @@ -63,7 +63,7 @@ using namespace std; #endif #ifdef _DEBUG_ -static int MYDEBUG = 0; +static int MYDEBUG = 1; static int MYDEBUGWITHFILES = 0; #else static int MYDEBUG = 0; @@ -132,11 +132,14 @@ static inline vtkIdType getCellType( const SMDSAbs_ElementType theType, //================================================================================= SMESH_VisualObjDef::SMESH_VisualObjDef() { + MESSAGE("---------------------------------------------SMESH_VisualObjDef::SMESH_VisualObjDef"); myGrid = vtkUnstructuredGrid::New(); + myLocalGrid = false; } SMESH_VisualObjDef::~SMESH_VisualObjDef() { - if ( MYDEBUG ) + MESSAGE("---------------------------------------------SMESH_VisualObjDef::~SMESH_VisualObjDef"); + //if ( MYDEBUG ) MESSAGE( "~SMESH_MeshObj - myGrid->GetReferenceCount() = " << myGrid->GetReferenceCount() ); myGrid->Delete(); } @@ -147,32 +150,52 @@ SMESH_VisualObjDef::~SMESH_VisualObjDef() //================================================================================= vtkIdType SMESH_VisualObjDef::GetNodeObjId( int theVTKID ) { - TMapOfIds::const_iterator i = myVTK2SMDSNodes.find(theVTKID); - return i == myVTK2SMDSNodes.end() ? -1 : i->second; + if (myLocalGrid) + { + TMapOfIds::const_iterator i = myVTK2SMDSNodes.find(theVTKID); + return i == myVTK2SMDSNodes.end() ? -1 : i->second; + } + return theVTKID; } vtkIdType SMESH_VisualObjDef::GetNodeVTKId( int theObjID ) { - TMapOfIds::const_iterator i = mySMDS2VTKNodes.find(theObjID); - return i == mySMDS2VTKNodes.end() ? -1 : i->second; + if (myLocalGrid) + { + TMapOfIds::const_iterator i = mySMDS2VTKNodes.find(theObjID); + return i == mySMDS2VTKNodes.end() ? -1 : i->second; + } + return theObjID; } vtkIdType SMESH_VisualObjDef::GetElemObjId( int theVTKID ) { - 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 ) { - TMapOfIds::const_iterator i = mySMDS2VTKElems.find(theObjID); - return i == mySMDS2VTKElems.end() ? -1 : i->second; + if (myLocalGrid) + { + TMapOfIds::const_iterator i = mySMDS2VTKElems.find(theObjID); + return i == mySMDS2VTKElems.end() ? -1 : i->second; + } + return this->GetMesh()->fromSmdsToVtk(theObjID); } //================================================================================= // function : SMESH_VisualObjDef::createPoints // purpose : Create points from nodes //================================================================================= +/*! fills a vtkPoints structure for a submesh. + * fills a std::list of SMDS_MeshElements*, then extract the points. + * fills also conversion id maps between SMDS and VTK. + */ void SMESH_VisualObjDef::createPoints( vtkPoints* thePoints ) { if ( thePoints == 0 ) @@ -181,7 +204,7 @@ void SMESH_VisualObjDef::createPoints( vtkPoints* thePoints ) TEntityList aNodes; vtkIdType nbNodes = GetEntities( SMDSAbs_Node, aNodes ); thePoints->SetNumberOfPoints( nbNodes ); - + int nbPoints = 0; TEntityList::const_iterator anIter; @@ -206,48 +229,61 @@ void SMESH_VisualObjDef::createPoints( vtkPoints* thePoints ) // function : buildPrs // purpose : create VTK cells( fill unstructured grid ) //================================================================================= -void SMESH_VisualObjDef::buildPrs() +void SMESH_VisualObjDef::buildPrs(bool buildGrid) { - try + MESSAGE("----------------------------------------------------------SMESH_VisualObjDef::buildPrs " << buildGrid); + if (buildGrid) { - mySMDS2VTKNodes.clear(); - myVTK2SMDSNodes.clear(); - mySMDS2VTKElems.clear(); - myVTK2SMDSElems.clear(); - - if ( IsNodePrs() ) - buildNodePrs(); - else - buildElemPrs(); + 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 ); + throw; + } } - catch(...) + else { - mySMDS2VTKNodes.clear(); - myVTK2SMDSNodes.clear(); - mySMDS2VTKElems.clear(); - myVTK2SMDSElems.clear(); - - myGrid->SetPoints( 0 ); - myGrid->SetCells( 0, 0, 0 ); - throw; + myLocalGrid = false; + vtkUnstructuredGrid *theGrid = GetMesh()->getGrid(); + myGrid->ShallowCopy(theGrid); + MESSAGE(myGrid->GetReferenceCount()); + MESSAGE( "Update - myGrid->GetNumberOfCells() = "<GetNumberOfCells() ); + MESSAGE( "Update - myGrid->GetNumberOfPoints() = "<GetNumberOfPoints() ); + if( MYDEBUGWITHFILES ) SMESH::WriteUnstructuredGrid( myGrid,"/tmp/buildPrs" ); } - - if( MYDEBUG ) MESSAGE( "Update - myGrid->GetNumberOfCells() = "<GetNumberOfCells() ); - if( MYDEBUGWITHFILES ) SMESH::WriteUnstructuredGrid( myGrid,"/tmp/buildPrs" ); } //================================================================================= // function : buildNodePrs // purpose : create VTK cells for nodes //================================================================================= + void SMESH_VisualObjDef::buildNodePrs() { // 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 + // SMDS_Mesh::CheckMemory(); // PAL16631 vtkPoints* aPoints = vtkPoints::New(); createPoints( aPoints ); - SMDS_Mesh::CheckMemory(); + // SMDS_Mesh::CheckMemory(); myGrid->SetPoints( aPoints ); aPoints->Delete(); @@ -287,12 +323,12 @@ namespace{ void SMESH_VisualObjDef::buildElemPrs() { // Create points - + vtkPoints* aPoints = vtkPoints::New(); createPoints( aPoints ); myGrid->SetPoints( aPoints ); aPoints->Delete(); - + if ( MYDEBUG ) MESSAGE("Update - myGrid->GetNumberOfPoints() = "<GetNumberOfPoints()); @@ -310,7 +346,7 @@ void SMESH_VisualObjDef::buildElemPrs() // 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 + // SMDS_Mesh::CheckMemory(); // PAL16631 vtkIdType aCellsSize = 2 * nbEnts[ SMDSAbs_0DElement ] + 3 * nbEnts[ SMDSAbs_Edge ]; @@ -327,7 +363,7 @@ void SMESH_VisualObjDef::buildElemPrs() vtkIdType aNbCells = nbEnts[ SMDSAbs_0DElement ] + nbEnts[ SMDSAbs_Edge ] + nbEnts[ SMDSAbs_Face ] + nbEnts[ SMDSAbs_Volume ]; - + if ( MYDEBUG ) MESSAGE( "Update - aNbCells = "< 0 || GetNbEntities(SMDSAbs_0DElement) > 0 || GetNbEntities(SMDSAbs_Edge) > 0 || @@ -545,6 +589,7 @@ bool SMESH_VisualObjDef::IsValid() const SMESH_MeshObj::SMESH_MeshObj(SMESH::SMESH_Mesh_ptr theMesh): myClient(SalomeApp_Application::orb(),theMesh) { + myEmptyGrid = 0; if ( MYDEBUG ) MESSAGE("SMESH_MeshObj - this = "<_is_nil() = "<_is_nil()); } @@ -566,6 +611,7 @@ SMESH_MeshObj::~SMESH_MeshObj() bool SMESH_MeshObj::Update( int theIsClear ) { // Update SMDS_Mesh on client part + MESSAGE("SMESH_MeshObj::Update " << this); if ( myClient.Update(theIsClear) || GetUnstructuredGrid()->GetNumberOfPoints()==0) { buildPrs(); // Fill unstructured grid return true; @@ -573,6 +619,22 @@ bool SMESH_MeshObj::Update( int theIsClear ) return false; } +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); +} //================================================================================= // function : GetElemDimension // purpose : Get dimension of element @@ -739,8 +801,9 @@ void SMESH_SubMeshObj::UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunc //================================================================================= bool SMESH_SubMeshObj::Update( int theIsClear ) { + MESSAGE("SMESH_SubMeshObj::Update " << this) bool changed = myMeshObj->Update( theIsClear ); - buildPrs(); + buildPrs(true); return changed; }