X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FOBJECT%2FSMESH_Object.cxx;h=885ee3de35b4b66aed1a34dcc8e1166956a27870;hb=b99281785418b27fd87472f97840a888b7c78437;hp=eb39610cbc494f1e3aaea44834d4984a4a36e9ed;hpb=c3bf92bd87b770fd81631a3853f7f5bb1ac6a4e8;p=modules%2Fsmesh.git diff --git a/src/OBJECT/SMESH_Object.cxx b/src/OBJECT/SMESH_Object.cxx index eb39610cb..885ee3de3 100644 --- a/src/OBJECT/SMESH_Object.cxx +++ b/src/OBJECT/SMESH_Object.cxx @@ -25,16 +25,23 @@ // Author : Nicolas REJNERI // Module : SMESH -#include "SMESH_Object.h" +#include "SMESH_ObjectDef.h" +#include "SMESH_ActorUtils.h" + #include "SMDS_Mesh.hxx" -#include "SALOME_ExtractUnstructuredGrid.h" #include "SMESH_Actor.h" +#include "SMESH_ControlsDef.hxx" +#include #include CORBA_SERVER_HEADER(SALOME_Exception) +#include +#include +#include +#include +#include + #include -#include -#include #include #include @@ -54,7 +61,7 @@ using namespace std; #endif #ifdef _DEBUG_ -static int MYDEBUG = 1; +static int MYDEBUG = 0; static int MYDEBUGWITHFILES = 0; #else static int MYDEBUG = 0; @@ -62,15 +69,6 @@ static int MYDEBUGWITHFILES = 0; #endif -void WriteUnstructuredGrid(vtkUnstructuredGrid* theGrid, const char* theFileName){ - vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New(); - aWriter->SetFileName(theFileName); - aWriter->SetInput(theGrid); - aWriter->Write(); - aWriter->Delete(); -} - - namespace{ inline const SMDS_MeshNode* FindNode(const SMDS_Mesh* theMesh, int theId){ @@ -109,7 +107,6 @@ namespace{ SMESH::log_array_var& theSeq, CORBA::Long theId) { - const SMESH::double_array& aCoords = theSeq[theId].coords; const SMESH::long_array& anIndexes = theSeq[theId].indexes; CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number; if(3*aNbElems != anIndexes.length()) @@ -128,7 +125,6 @@ namespace{ SMESH::log_array_var& theSeq, CORBA::Long theId) { - const SMESH::double_array& aCoords = theSeq[theId].coords; const SMESH::long_array& anIndexes = theSeq[theId].indexes; CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number; if(4*aNbElems != anIndexes.length()) @@ -148,7 +144,6 @@ namespace{ SMESH::log_array_var theSeq, CORBA::Long theId) { - const SMESH::double_array& aCoords = theSeq[theId].coords; const SMESH::long_array& anIndexes = theSeq[theId].indexes; CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number; if(5*aNbElems != anIndexes.length()) @@ -165,11 +160,34 @@ namespace{ } + inline void AddPolygonsWithID(SMDS_Mesh* theMesh, + SMESH::log_array_var& theSeq, + CORBA::Long theId) + { + const SMESH::long_array& anIndexes = theSeq[theId].indexes; + CORBA::Long anIndexId = 0, aNbElems = theSeq[theId].number; + + for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++) { + int aFaceId = anIndexes[anIndexId++]; + + int aNbNodes = anIndexes[anIndexId++]; + std::vector nodes_ids (aNbNodes); + for (int i = 0; i < aNbNodes; i++) { + nodes_ids[i] = anIndexes[anIndexId++]; + } + + SMDS_MeshElement* anElem = theMesh->AddPolygonalFaceWithID(nodes_ids, aFaceId); + if (!anElem) + EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolygonalFaceWithID for ID = " + << anElemId); + } + } + + inline void AddTetrasWithID(SMDS_Mesh* theMesh, SMESH::log_array_var& theSeq, CORBA::Long theId) { - const SMESH::double_array& aCoords = theSeq[theId].coords; const SMESH::long_array& anIndexes = theSeq[theId].indexes; CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number; if(5*aNbElems != anIndexes.length()) @@ -181,7 +199,7 @@ namespace{ anIndexes[anIndexId+4], anIndexes[anIndexId]); if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<GetReferenceCount() = " << myGrid->GetReferenceCount() ); @@ -306,37 +389,37 @@ SMESH_VisualObj::~SMESH_VisualObj() // functions : GetNodeObjId, GetNodeVTKId, GetElemObjId, GetElemVTKId // purpose : Methods for retrieving VTK IDs by SMDS IDs and vice versa //================================================================================= -vtkIdType SMESH_VisualObj::GetNodeObjId( int theVTKID ) +vtkIdType SMESH_VisualObjDef::GetNodeObjId( int theVTKID ) { return myVTK2SMDSNodes.find(theVTKID) == myVTK2SMDSNodes.end() ? -1 : myVTK2SMDSNodes[theVTKID]; } -vtkIdType SMESH_VisualObj::GetNodeVTKId( int theObjID ) +vtkIdType SMESH_VisualObjDef::GetNodeVTKId( int theObjID ) { return mySMDS2VTKNodes.find(theObjID) == mySMDS2VTKNodes.end() ? -1 : mySMDS2VTKNodes[theObjID]; } -vtkIdType SMESH_VisualObj::GetElemObjId( int theVTKID ) +vtkIdType SMESH_VisualObjDef::GetElemObjId( int theVTKID ) { return myVTK2SMDSElems.find(theVTKID) == myVTK2SMDSElems.end() ? -1 : myVTK2SMDSElems[theVTKID]; } -vtkIdType SMESH_VisualObj::GetElemVTKId( int theObjID ) +vtkIdType SMESH_VisualObjDef::GetElemVTKId( int theObjID ) { return mySMDS2VTKElems.find(theObjID) == mySMDS2VTKElems.end() ? -1 : mySMDS2VTKElems[theObjID]; } //================================================================================= -// function : SMESH_VisualObj::createPoints +// function : SMESH_VisualObjDef::createPoints // purpose : Create points from nodes //================================================================================= -void SMESH_VisualObj::createPoints( vtkPoints* thePoints ) +void SMESH_VisualObjDef::createPoints( vtkPoints* thePoints ) { if ( thePoints == 0 ) return; TEntityList aNodes; - vtkIdType nbNodes = GetEntities( SMESH::NODE, aNodes ); + vtkIdType nbNodes = GetEntities( SMDSAbs_Node, aNodes ); thePoints->SetNumberOfPoints( nbNodes ); int nbPoints = 0; @@ -363,7 +446,7 @@ void SMESH_VisualObj::createPoints( vtkPoints* thePoints ) // function : buildPrs // purpose : create VTK cells( fill unstructured grid ) //================================================================================= -void SMESH_VisualObj::buildPrs() +void SMESH_VisualObjDef::buildPrs() { try { @@ -387,26 +470,26 @@ void SMESH_VisualObj::buildPrs() } if( MYDEBUG ) MESSAGE( "Update - myGrid->GetNumberOfCells() = "<GetNumberOfCells() ); - if( MYDEBUGWITHFILES ) WriteUnstructuredGrid( myGrid,"/tmp/buildPrs" ); + if( MYDEBUGWITHFILES ) SMESH::WriteUnstructuredGrid( myGrid,"/tmp/buildPrs" ); } //================================================================================= // function : buildNodePrs // purpose : create VTK cells for nodes //================================================================================= -void SMESH_VisualObj::buildNodePrs() +void SMESH_VisualObjDef::buildNodePrs() { vtkPoints* aPoints = vtkPoints::New(); createPoints( aPoints ); - int nbPoints = aPoints->GetNumberOfPoints(); myGrid->SetPoints( aPoints ); aPoints->Delete(); myGrid->SetCells( 0, 0, 0 ); // Create cells - - /*vtkIdList *anIdList = vtkIdList::New(); + /* + int nbPoints = aPoints->GetNumberOfPoints(); + vtkIdList *anIdList = vtkIdList::New(); anIdList->SetNumberOfIds( 1 ); vtkCellArray *aCells = vtkCellArray::New(); @@ -436,14 +519,41 @@ void SMESH_VisualObj::buildNodePrs() aCellLocationsArray->Delete(); aCellTypesArray->Delete(); aCells->Delete(); - anIdList->Delete(); */ + anIdList->Delete(); + */ } //================================================================================= // function : buildElemPrs // purpose : Create VTK cells for elements //================================================================================= -void SMESH_VisualObj::buildElemPrs() + +namespace{ + typedef std::vector TConnect; + + int GetConnect(const SMDS_ElemIteratorPtr& theNodesIter, + TConnect& theConnect) + { + theConnect.clear(); + for(; theNodesIter->more();) + theConnect.push_back(theNodesIter->next()); + return theConnect.size(); + } + + inline + void SetId(vtkIdList *theIdList, + const SMESH_VisualObjDef::TMapOfIds& theSMDS2VTKNodes, + const TConnect& theConnect, + int thePosition, + int theId) + { + theIdList->SetId(thePosition,theSMDS2VTKNodes.find(theConnect[theId]->GetID())->second); + } + +} + + +void SMESH_VisualObjDef::buildElemPrs() { // Create points @@ -457,16 +567,16 @@ void SMESH_VisualObj::buildElemPrs() // Calculate cells size - static SMESH::ElementType aTypes[ 3 ] = { SMESH::EDGE, SMESH::FACE, SMESH::VOLUME }; + static SMDSAbs_ElementType aTypes[ 3 ] = { SMDSAbs_Edge, SMDSAbs_Face, SMDSAbs_Volume }; // get entity data - map< int, int > nbEnts; - map< int, TEntityList > anEnts; + map nbEnts; + map anEnts; for ( int i = 0; i <= 2; i++ ) nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] ); - vtkIdType aCellsSize = 3 * nbEnts[ SMESH::EDGE ]; + vtkIdType aCellsSize = 3 * nbEnts[ SMDSAbs_Edge ]; for ( int i = 1; i <= 2; i++ ) // iterate through faces and volumes { @@ -479,7 +589,7 @@ void SMESH_VisualObj::buildElemPrs() } } - vtkIdType aNbCells = nbEnts[ SMESH::EDGE ] + nbEnts[ SMESH::FACE ] + nbEnts[ SMESH::VOLUME ]; + vtkIdType aNbCells = nbEnts[ SMDSAbs_Edge ] + nbEnts[ SMDSAbs_Face ] + nbEnts[ SMDSAbs_Volume ]; if ( MYDEBUG ) MESSAGE( "Update - aNbCells = "<NbNodes(); } break; - case SMESH::EDGE: + case SMDSAbs_Edge: { return myMesh->NbEdges(); } break; - case SMESH::FACE: + case SMDSAbs_Face: { return myMesh->NbFaces(); } break; - case SMESH::VOLUME: + case SMDSAbs_Volume: { return myMesh->NbVolumes(); } @@ -704,31 +935,31 @@ int SMESH_MeshObj::GetNbEntities( const SMESH::ElementType theType) const } } -int SMESH_MeshObj::GetEntities( const SMESH::ElementType theType, TEntityList& theObjs ) const +int SMESH_MeshObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& theObjs ) const { theObjs.clear(); switch ( theType ) { - case SMESH::NODE: + case SMDSAbs_Node: { SMDS_NodeIteratorPtr anIter = myMesh->nodesIterator(); while ( anIter->more() ) theObjs.push_back( anIter->next() ); } break; - case SMESH::EDGE: + case SMDSAbs_Edge: { SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator(); while ( anIter->more() ) theObjs.push_back( anIter->next() ); } break; - case SMESH::FACE: + case SMDSAbs_Face: { SMDS_FaceIteratorPtr anIter = myMesh->facesIterator(); while ( anIter->more() ) theObjs.push_back( anIter->next() ); } break; - case SMESH::VOLUME: + case SMDSAbs_Volume: { SMDS_VolumeIteratorPtr anIter = myMesh->volumesIterator(); while ( anIter->more() ) theObjs.push_back( anIter->next() ); @@ -745,9 +976,9 @@ int SMESH_MeshObj::GetEntities( const SMESH::ElementType theType, TEntityList& t // function : UpdateFunctor // purpose : Update functor in accordance with current mesh //================================================================================= -void SMESH_MeshObj::UpdateFunctor( SMESH::Functor_ptr f ) +void SMESH_MeshObj::UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ) { - f->SetMesh( myMeshServer ); + theFunctor->SetMesh( GetMesh() ); } //================================================================================= @@ -793,13 +1024,13 @@ int SMESH_SubMeshObj::GetElemDimension( const int theObjId ) // function : UpdateFunctor // purpose : Update functor in accordance with current mesh //================================================================================= -void SMESH_SubMeshObj::UpdateFunctor( SMESH::Functor_ptr f ) +void SMESH_SubMeshObj::UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ) { - f->SetMesh( myMeshObj->GetMeshServer() ); + theFunctor->SetMesh( myMeshObj->GetMesh() ); } //================================================================================= -// function : UpdateFunctor +// function : Update // purpose : Update mesh object and fill grid with new values //================================================================================= void SMESH_SubMeshObj::Update( int theIsClear ) @@ -818,10 +1049,10 @@ void SMESH_SubMeshObj::Update( int theIsClear ) // function : SMESH_GroupObj // purpose : Constructor //================================================================================= -SMESH_GroupObj::SMESH_GroupObj( SMESH::SMESH_Group_ptr theGroup, - SMESH_MeshObj* theMeshObj ) +SMESH_GroupObj::SMESH_GroupObj( SMESH::SMESH_GroupBase_ptr theGroup, + SMESH_MeshObj* theMeshObj ) : SMESH_SubMeshObj( theMeshObj ), - myGroupServer( SMESH::SMESH_Group::_duplicate(theGroup) ) + myGroupServer( SMESH::SMESH_GroupBase::_duplicate(theGroup) ) { if ( MYDEBUG ) MESSAGE("SMESH_GroupObj - theGroup->_is_nil() = "<_is_nil()); myGroupServer->Register(); @@ -878,14 +1109,14 @@ static int getNodesFromElems( SMESH::long_array_var& theElemIds, // function : getPointers // purpose : Get std::list from list of IDs //================================================================================= -static int getPointers( const SMESH::ElementType theRequestType, +static int getPointers( const SMDSAbs_ElementType theRequestType, SMESH::long_array_var& theElemIds, const SMDS_Mesh* theMesh, std::list& theResList ) { for ( CORBA::Long i = 0, n = theElemIds->length(); i < n; i++ ) { - const SMDS_MeshElement* anElem = theRequestType == SMESH::NODE + const SMDS_MeshElement* anElem = theRequestType == SMDSAbs_Node ? theMesh->FindNode( theElemIds[ i ] ) : theMesh->FindElement( theElemIds[ i ] ); if ( anElem != 0 ) @@ -900,15 +1131,15 @@ static int getPointers( const SMESH::ElementType theRequestType, // function : GetEntities // purpose : Get entities of specified type. Return number of entities //================================================================================= -int SMESH_GroupObj::GetNbEntities( const SMESH::ElementType theType) const +int SMESH_GroupObj::GetNbEntities( const SMDSAbs_ElementType theType) const { - if(myGroupServer->GetType() == theType){ + if(SMDSAbs_ElementType(myGroupServer->GetType()) == theType){ return myGroupServer->Size(); } return 0; } -int SMESH_GroupObj::GetEntities( const SMESH::ElementType theType, TEntityList& theResList ) const +int SMESH_GroupObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& theResList ) const { theResList.clear(); SMDS_Mesh* aMesh = myMeshObj->GetMesh(); @@ -916,12 +1147,12 @@ int SMESH_GroupObj::GetEntities( const SMESH::ElementType theType, TEntityList& if ( myGroupServer->Size() == 0 || aMesh == 0 ) return 0; - SMESH::ElementType aGrpType = myGroupServer->GetType(); + SMDSAbs_ElementType aGrpType = SMDSAbs_ElementType(myGroupServer->GetType()); SMESH::long_array_var anIds = myGroupServer->GetListOfID(); if ( aGrpType == theType ) return getPointers( theType, anIds, aMesh, theResList ); - else if ( theType == SMESH::NODE ) + else if ( theType == SMDSAbs_Node ) return getNodesFromElems( anIds, aMesh, theResList ); else return 0; @@ -958,20 +1189,21 @@ SMESH_subMeshObj::~SMESH_subMeshObj() // function : GetEntities // purpose : Get entities of specified type. Return number of entities //================================================================================= -int SMESH_subMeshObj::GetNbEntities( const SMESH::ElementType theType) const +int SMESH_subMeshObj::GetNbEntities( const SMDSAbs_ElementType theType) const { switch ( theType ) { - case SMESH::NODE: + case SMDSAbs_Node: { - return mySubMeshServer->GetNumberOfNodes(); + return mySubMeshServer->GetNumberOfNodes( false ); } break; - case SMESH::EDGE: - case SMESH::FACE: - case SMESH::VOLUME: + case SMDSAbs_Edge: + case SMDSAbs_Face: + case SMDSAbs_Volume: { - SMESH::long_array_var anIds = mySubMeshServer->GetElementsByType( theType ); + SMESH::long_array_var anIds = + mySubMeshServer->GetElementsByType( SMESH::ElementType(theType) ); return anIds->length(); } default: @@ -980,7 +1212,7 @@ int SMESH_subMeshObj::GetNbEntities( const SMESH::ElementType theType) const } } -int SMESH_subMeshObj::GetEntities( const SMESH::ElementType theType, TEntityList& theResList ) const +int SMESH_subMeshObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& theResList ) const { theResList.clear(); @@ -992,22 +1224,23 @@ int SMESH_subMeshObj::GetEntities( const SMESH::ElementType theType, TEntityList if ( isNodal ) { - if ( theType == SMESH::NODE ) + if ( theType == SMDSAbs_Node ) { SMESH::long_array_var anIds = mySubMeshServer->GetNodesId(); - return getPointers( SMESH::NODE, anIds, aMesh, theResList ); + return getPointers( SMDSAbs_Node, anIds, aMesh, theResList ); } } else { - if ( theType == SMESH::NODE ) + if ( theType == SMDSAbs_Node ) { SMESH::long_array_var anIds = mySubMeshServer->GetElementsId(); return getNodesFromElems( anIds, aMesh, theResList ); } else { - SMESH::long_array_var anIds = mySubMeshServer->GetElementsByType( theType ); + SMESH::long_array_var anIds = + mySubMeshServer->GetElementsByType( SMESH::ElementType(theType) ); return getPointers( theType, anIds, aMesh, theResList ); } }