X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FOBJECT%2FSMESH_Object.cxx;h=f2a83df939398e61668ea0afde87e970fab9846a;hp=c12d63bfa68c6d733b7632f80495b6a7da527ed3;hb=faf45035fc7589def5fefb624752f48c989d3a6b;hpb=5b191ae5dd2b8f51a6ce2b324d4ddf300e3e737d diff --git a/src/OBJECT/SMESH_Object.cxx b/src/OBJECT/SMESH_Object.cxx index c12d63bfa..f2a83df93 100644 --- a/src/OBJECT/SMESH_Object.cxx +++ b/src/OBJECT/SMESH_Object.cxx @@ -101,6 +101,7 @@ static inline vtkIdType getCellType( const SMDSAbs_ElementType theType, 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; case SMDSAbs_Volume: @@ -109,18 +110,12 @@ static inline vtkIdType getCellType( const SMDSAbs_ElementType theType, else if ( theNbNodes == 5 ) return VTK_PYRAMID; else if ( theNbNodes == 6 ) return VTK_WEDGE; else if ( theNbNodes == 8 ) return VTK_HEXAHEDRON; - else if ( theNbNodes == 10 ) { - return VTK_QUADRATIC_TETRA; - } - else if ( theNbNodes == 20 ) { - return VTK_QUADRATIC_HEXAHEDRON; - } - else if ( theNbNodes == 15 ) { - return VTK_QUADRATIC_WEDGE; - } - else if ( theNbNodes==13 ) { - return VTK_QUADRATIC_PYRAMID; //VTK_CONVEX_POINT_SET; - } + 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; @@ -277,7 +272,7 @@ void SMESH_VisualObjDef::buildPrs(bool buildGrid) GetMesh()->compactMesh(); } vtkUnstructuredGrid *theGrid = GetMesh()->getGrid(); - updateEntitiesFlags(); + updateEntitiesFlags(); myGrid->ShallowCopy(theGrid); //MESSAGE(myGrid->GetReferenceCount()); //MESSAGE( "Update - myGrid->GetNumberOfCells() = "<GetNumberOfCells() ); @@ -372,22 +367,22 @@ void SMESH_VisualObjDef::buildElemPrs() const TEntityList& aList = anEnts[ aTypes[ i ] ]; TEntityList::const_iterator anIter; for ( anIter = aList.begin(); anIter != aList.end(); ++anIter ) { - if((*anIter)->GetEntityType() != SMDSEntity_Polyhedra && - (*anIter)->GetEntityType() != SMDSEntity_Quad_Polyhedra) { - aCellsSize += (*anIter)->NbNodes() + 1; - } - // Special case for the VTK_POLYHEDRON: - // itsinput cellArray is of special format. - // [nCellFaces, nFace0Pts, i, j, k, nFace1Pts, i, j, k, ...] - else { - if( const SMDS_VtkVolume* ph = dynamic_cast(*anIter) ) { - int nbFaces = ph->NbFaces(); - aCellsSize += (1 + ph->NbFaces()); - for( int i = 1; i <= nbFaces; i++ ) { - aCellsSize += ph->NbFaceNodes(i); - } - } - } + if((*anIter)->GetEntityType() != SMDSEntity_Polyhedra && + (*anIter)->GetEntityType() != SMDSEntity_Quad_Polyhedra) { + aCellsSize += (*anIter)->NbNodes() + 1; + } + // Special case for the VTK_POLYHEDRON: + // itsinput cellArray is of special format. + // [nCellFaces, nFace0Pts, i, j, k, nFace1Pts, i, j, k, ...] + else { + if( const SMDS_VtkVolume* ph = dynamic_cast(*anIter) ) { + int nbFaces = ph->NbFaces(); + aCellsSize += (1 + ph->NbFaces()); + for( int i = 1; i <= nbFaces; i++ ) { + aCellsSize += ph->NbFaceNodes(i); + } + } + } } } } @@ -429,102 +424,55 @@ void SMESH_VisualObjDef::buildElemPrs() for ( anIter = aList.begin(); anIter != aList.end(); ++anIter ) { const SMDS_MeshElement* anElem = *anIter; - + vtkIdType aNbNodes = anElem->NbNodes(); anIdList->SetNumberOfIds( aNbNodes ); - + const vtkIdType vtkElemType = getCellType( aType, anElem->IsPoly(), aNbNodes ); + int anId = anElem->GetID(); - + mySMDS2VTKElems.insert( TMapOfIds::value_type( anId, iElem ) ); myVTK2SMDSElems.insert( TMapOfIds::value_type( iElem, anId ) ); - + SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); - switch (aType) { - case SMDSAbs_Volume: { - aConnect.clear(); - std::vector aConnectivities; + { // Convertions connectivities from SMDS to VTK - - if (anElem->IsPoly() && aNbNodes > 3) { // POLYEDRE - anIdList->Reset(); + + if (aType == SMDSAbs_Volume && anElem->IsPoly() && aNbNodes > 3) { // POLYEDRE + anIdList->Reset(); if ( const SMDS_VtkVolume* ph = dynamic_cast(anElem) ) { - int nbFaces = ph->NbFaces(); - anIdList->InsertNextId(nbFaces); - for( int i = 1; i <= nbFaces; i++ ) { - anIdList->InsertNextId(ph->NbFaceNodes(i)); - for(int j = 1; j <= ph->NbFaceNodes(i); j++) { - const SMDS_MeshNode* n = ph->GetFaceNode(i,j); - if(n) { - anIdList->InsertNextId(mySMDS2VTKNodes[n->GetID()]); - } - } - } + int nbFaces = ph->NbFaces(); + anIdList->InsertNextId(nbFaces); + for( int i = 1; i <= nbFaces; i++ ) { + anIdList->InsertNextId(ph->NbFaceNodes(i)); + for(int j = 1; j <= ph->NbFaceNodes(i); j++) { + const SMDS_MeshNode* n = ph->GetFaceNode(i,j); + if(n) { + anIdList->InsertNextId(mySMDS2VTKNodes[n->GetID()]); + } + } + } } - - } else if (aNbNodes == 4) { - static int anIds[] = {0,2,1,3}; - for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]); - - } else if (aNbNodes == 5) { - static int anIds[] = {0,3,2,1,4}; - for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]); - - } else if (aNbNodes == 6) { - static int anIds[] = {0,1,2,3,4,5}; - for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]); - - } - else if (aNbNodes == 8) { - static int anIds[] = {0,3,2,1,4,7,6,5}; - for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]); - - } - else if (aNbNodes == 10) { - static int anIds[] = {0,2,1,3,6,5,4,7,9,8}; - for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]); - } - else if (aNbNodes == 13) { - static int anIds[] = {0,3,2,1,4,8,7,6,5,9,12,11,10}; - for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]); - } - else if (aNbNodes == 15) { - //static int anIds[] = {0,2,1,3,5,4,8,7,6,11,10,9,12,14,13}; - static int anIds[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; - for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]); - //for (int k = 0; k < aNbNodes; k++) { - // int nn = aConnectivities[k]; - // const SMDS_MeshNode* N = static_cast (aConnect[nn]); - // cout<<"k="<X()<<","<Y()<<","<Z()<<")"<IsPoly() && aNbNodes > 3)) { - if ( aConnect.empty() ) - GetConnect(aNodesIter,aConnect); - - if (aConnectivities.size() > 0) { - for (vtkIdType aNodeId = 0; aNodeId < aNbNodes; aNodeId++) - SetId(anIdList,mySMDS2VTKNodes,aConnect,aNodeId,aConnectivities[aNodeId]); - } - } - break; - } - default: - for( vtkIdType aNodeId = 0; aNodesIter->more(); aNodeId++ ){ - const SMDS_MeshElement* aNode = aNodesIter->next(); - anIdList->SetId( aNodeId, mySMDS2VTKNodes[aNode->GetID()] ); + const std::vector& aConnectivities = + SMDS_MeshCell::toVtkOrder( VTKCellType( vtkElemType )); + if (aConnectivities.size() > 0) { + aConnect.clear(); + GetConnect(aNodesIter,aConnect); + for (vtkIdType aNodeId = 0; aNodeId < aNbNodes; aNodeId++) + SetId(anIdList,mySMDS2VTKNodes,aConnect,aNodeId,aConnectivities[aNodeId]); + } + else { + for( vtkIdType aNodeId = 0; aNodesIter->more(); aNodeId++ ){ + const SMDS_MeshElement* aNode = aNodesIter->next(); + anIdList->SetId( aNodeId, mySMDS2VTKNodes[aNode->GetID()] ); + } + } } } - - aConnectivity->InsertNextCell( anIdList ); - aCellTypesArray->InsertNextValue( getCellType( aType, anElem->IsPoly(), aNbNodes ) ); + aCellTypesArray->InsertNextValue( vtkElemType ); iElem++; } @@ -601,7 +549,7 @@ vtkUnstructuredGrid* SMESH_VisualObjDef::GetUnstructuredGrid() if ( !myLocalGrid && !GetMesh()->isCompacted() ) { GetMesh()->compactMesh(); - updateEntitiesFlags(); + updateEntitiesFlags(); vtkUnstructuredGrid *theGrid = GetMesh()->getGrid(); myGrid->ShallowCopy(theGrid); } @@ -629,29 +577,29 @@ bool SMESH_VisualObjDef::IsValid() const //================================================================================= 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_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; } //================================================================================= @@ -659,8 +607,8 @@ void SMESH_VisualObjDef::updateEntitiesFlags() { // purpose : Clear the entities flags //================================================================================= void SMESH_VisualObjDef::ClearEntitiesFlags() { - myEntitiesState = SMESH_Actor::eAllEntity; - myEntitiesFlag = false; + myEntitiesState = SMESH_Actor::eAllEntity; + myEntitiesFlag = false; } //================================================================================= @@ -668,7 +616,7 @@ void SMESH_VisualObjDef::ClearEntitiesFlags() { // purpose : Return the entities flag //================================================================================= bool SMESH_VisualObjDef::GetEntitiesFlag() { - return myEntitiesFlag; + return myEntitiesFlag; } //================================================================================= @@ -676,7 +624,7 @@ bool SMESH_VisualObjDef::GetEntitiesFlag() { // purpose : Return the entities state //================================================================================= unsigned int SMESH_VisualObjDef::GetEntitiesState() { - return myEntitiesState; + return myEntitiesState; } /*