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:
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;
GetMesh()->compactMesh();
}
vtkUnstructuredGrid *theGrid = GetMesh()->getGrid();
- updateEntitiesFlags();
+ updateEntitiesFlags();
myGrid->ShallowCopy(theGrid);
//MESSAGE(myGrid->GetReferenceCount());
//MESSAGE( "Update - myGrid->GetNumberOfCells() = "<<myGrid->GetNumberOfCells() );
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<const SMDS_VtkVolume*>(*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<const SMDS_VtkVolume*>(*anIter) ) {
+ int nbFaces = ph->NbFaces();
+ aCellsSize += (1 + ph->NbFaces());
+ for( int i = 1; i <= nbFaces; i++ ) {
+ aCellsSize += ph->NbFaceNodes(i);
+ }
+ }
+ }
}
}
}
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<int> 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<const SMDS_VtkVolume*>(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<const SMDS_MeshNode*> (aConnect[nn]);
- // cout<<"k="<<k<<" N("<<N->X()<<","<<N->Y()<<","<<N->Z()<<")"<<endl;
- //}
- }
- else if (aNbNodes == 20) {
- static int anIds[] = {0,3,2,1,4,7,6,5,11,10,9,8,15,14,13,12,16,19,18,17};
- for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
}
else {
- }
-
- if (!(anElem->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<int>& 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++;
}
if ( !myLocalGrid && !GetMesh()->isCompacted() )
{
GetMesh()->compactMesh();
- updateEntitiesFlags();
+ updateEntitiesFlags();
vtkUnstructuredGrid *theGrid = GetMesh()->getGrid();
myGrid->ShallowCopy(theGrid);
}
//=================================================================================
void SMESH_VisualObjDef::updateEntitiesFlags() {
- unsigned int tmp = myEntitiesState;
- ClearEntitiesFlags();
+ unsigned int tmp = myEntitiesState;
+ ClearEntitiesFlags();
- map<SMDSAbs_ElementType,int> entities = SMESH::GetEntitiesFromObject(this);
-
+ map<SMDSAbs_ElementType,int> 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;
}
//=================================================================================
// purpose : Clear the entities flags
//=================================================================================
void SMESH_VisualObjDef::ClearEntitiesFlags() {
- myEntitiesState = SMESH_Actor::eAllEntity;
- myEntitiesFlag = false;
+ myEntitiesState = SMESH_Actor::eAllEntity;
+ myEntitiesFlag = false;
}
//=================================================================================
// purpose : Return the entities flag
//=================================================================================
bool SMESH_VisualObjDef::GetEntitiesFlag() {
- return myEntitiesFlag;
+ return myEntitiesFlag;
}
//=================================================================================
// purpose : Return the entities state
//=================================================================================
unsigned int SMESH_VisualObjDef::GetEntitiesState() {
- return myEntitiesState;
+ return myEntitiesState;
}
/*