+ list< TElemTypeData >::iterator aElemTypeData = aTElemTypeDatas.begin();
+ for ( ; aElemTypeData != aTElemTypeDatas.end(); ++aElemTypeData )
+ {
+ if ( aElemTypeData->_nbElems == 0 )
+ continue;
+
+ // iterator on elements of a current type
+ PElemIterator elemIterator;
+ int defaultFamilyId = 0;
+ switch ( aElemTypeData->_smdsType ) {
+ case SMDSAbs_0DElement:
+ elemIterator = PElemIterator( new T0DElementIterator( myMesh->elements0dIterator() ));
+ defaultFamilyId = my0DElementsDefaultFamilyId;
+ break;
+ case SMDSAbs_Edge:
+ elemIterator = PElemIterator( new TEdgeIterator( myMesh->edgesIterator() ));
+ defaultFamilyId = myEdgesDefaultFamilyId;
+ break;
+ case SMDSAbs_Face:
+ elemIterator = PElemIterator( new TFaceIterator( myMesh->facesIterator() ));
+ defaultFamilyId = myFacesDefaultFamilyId;
+ break;
+ case SMDSAbs_Volume:
+ elemIterator = PElemIterator( new TVolumeIterator( myMesh->volumesIterator() ));
+ defaultFamilyId = myVolumesDefaultFamilyId;
+ break;
+ default:
+ continue;
+ }
+ int iElem = 0;
+
+ //cout << " Treat type " << aElemTypeData->_geomType << " nb = " <<aElemTypeData->_nbElems<< endl;
+ // Treat POLYGONs
+ // ---------------
+ if ( aElemTypeData->_geomType == ePOLYGONE )
+ {
+ if ( nbPolygonNodes == 0 ) {
+ // Count nb of nodes
+ while ( const SMDS_MeshElement* anElem = elemIterator->next() ) {
+ if ( anElem->IsPoly() ) {
+ nbPolygonNodes += anElem->NbNodes();
+ if ( ++iElem == aElemTypeData->_nbElems )
+ break;
+ }
+ }
+ }
+ else {
+ // Store in med file
+ PPolygoneInfo aPolygoneInfo = myMed->CrPolygoneInfo(aMeshInfo,
+ aElemTypeData->_entity,
+ aElemTypeData->_geomType,
+ aElemTypeData->_nbElems,
+ nbPolygonNodes,
+ theConnMode, theIsElemNum,
+ theIsElemNames);
+ TElemNum & index = *(aPolygoneInfo->myIndex.get());
+ index[0] = 1;
+
+ while ( const SMDS_MeshElement* anElem = elemIterator->next() )
+ {
+ if ( !anElem->IsPoly() )
+ continue;
+
+ // index
+ TInt aNbNodes = anElem->NbNodes();
+ index[ iElem+1 ] = index[ iElem ] + aNbNodes;
+
+ // connectivity
+ TConnSlice aTConnSlice = aPolygoneInfo->GetConnSlice( iElem );
+ for(TInt iNode = 0; iNode < aNbNodes; iNode++) {
+ const SMDS_MeshElement* aNode = anElem->GetNode( iNode );
+#ifdef _EDF_NODE_IDS_
+ aTConnSlice[ iNode ] = aNodeIdMap[aNode->GetID()];
+#else
+ aTConnSlice[ iNode ] = aNode->GetID();
+#endif
+ }
+ // element number
+ aPolygoneInfo->SetElemNum( iElem, anElem->GetID() );
+
+ // family number
+ int famNum = getFamilyId( anElemFamMap, anElem, defaultFamilyId );
+ aPolygoneInfo->SetFamNum( iElem, famNum );
+
+ if ( ++iElem == aPolygoneInfo->GetNbElem() )
+ break;
+ }
+ // if(TInt aNbElems = aPolygoneElemNums.size())
+ // // add one element in connectivities,
+ // // referenced by the last element in indices
+ // aPolygoneConn.push_back(0);
+ //cout << " SetPolygoneInfo(aPolygoneInfo)" << endl;
+ myMed->SetPolygoneInfo(aPolygoneInfo);
+ }
+
+ }
+
+ // Treat POLYEDREs
+ // ----------------
+ else if (aElemTypeData->_geomType == ePOLYEDRE )
+ {
+ //MESSAGE("_geomType == ePOLYEDRE");
+ if ( nbPolyhedronNodes == 0 ) {
+ // Count nb of nodes
+ while ( const SMDS_MeshElement* anElem = elemIterator->next() ) {
+ const SMDS_VtkVolume *aPolyedre = dynamic_cast<const SMDS_VtkVolume*>(anElem);
+ if ( aPolyedre && aPolyedre->IsPoly()) {
+ nbPolyhedronNodes += aPolyedre->NbNodes();
+ nbPolyhedronFaces += aPolyedre->NbFaces();
+ if ( ++iElem == aElemTypeData->_nbElems )
+ break;
+ }
+ }
+ //MESSAGE("nbPolyhedronNodes=" << nbPolyhedronNodes);
+ //MESSAGE("nbPolyhedronFaces=" << nbPolyhedronFaces);
+ //MESSAGE("_nbElems="<< aElemTypeData->_nbElems);
+ }
+ else {
+ // Store in med file
+ PPolyedreInfo aPolyhInfo = myMed->CrPolyedreInfo(aMeshInfo,
+ aElemTypeData->_entity,
+ aElemTypeData->_geomType,
+ aElemTypeData->_nbElems,
+ nbPolyhedronFaces+1,
+ nbPolyhedronNodes,
+ theConnMode,
+ theIsElemNum,
+ theIsElemNames);
+ TElemNum & index = *(aPolyhInfo->myIndex.get());
+ TElemNum & faces = *(aPolyhInfo->myFaces.get());
+ TElemNum & conn = *(aPolyhInfo->myConn.get());
+ index[0] = 1;
+ faces[0] = 1;
+
+ TInt iFace = 0, iNode = 0;
+ while ( const SMDS_MeshElement* anElem = elemIterator->next() )
+ {
+ const SMDS_VtkVolume *aPolyedre = dynamic_cast<const SMDS_VtkVolume*>(anElem);
+ if ( !aPolyedre )
+ continue;
+ if ( !aPolyedre->IsPoly() )
+ continue;
+ //MESSAGE("index[" << iElem << "]=" << index[iElem] << " iElem=" << iElem);
+ // index
+ TInt aNbFaces = aPolyedre->NbFaces();
+ index[ iElem+1 ] = index[ iElem ] + aNbFaces;
+ //MESSAGE("index[" << iElem+1 << "]=" << index[iElem+1] << " iElem=" << iElem);
+
+ // face index
+ for (TInt f = 1; f <= aNbFaces; ++f, ++iFace ) {
+ int aNbFaceNodes = aPolyedre->NbFaceNodes( f );
+ faces[ iFace+1 ] = faces[ iFace ] + aNbFaceNodes;
+ //MESSAGE("faces[" << iFace+1 << "]=" << faces[iFace+1] << " iFace=" << iFace);
+ }
+ // connectivity
+ SMDS_ElemIteratorPtr nodeIt = anElem->nodesIterator();
+ while ( nodeIt->more() ) {
+ const SMDS_MeshElement* aNode = nodeIt->next();
+#ifdef _EDF_NODE_IDS_
+ conn[ iNode ] = aNodeIdMap[aNode->GetID()];
+ //MESSAGE("conn["<< iNode << "]=" << conn[iNode] << " aNode->GetID()=" << aNode->GetID());
+#else
+ conn[ iNode ] = aNode->GetID();
+ //MESSAGE("conn["<< iNode << "]=" << conn[iNode]);
+#endif
+ ++iNode;
+ }
+ // element number
+ aPolyhInfo->SetElemNum( iElem, anElem->GetID() );
+
+ // family number
+ int famNum = getFamilyId( anElemFamMap, anElem, defaultFamilyId );
+ aPolyhInfo->SetFamNum( iElem, famNum );
+
+ if ( ++iElem == aPolyhInfo->GetNbElem() )
+ break;
+ }
+ //cout << " SetPolyedreInfo(aPolyhInfo )" << endl;
+ myMed->SetPolyedreInfo(aPolyhInfo);
+ }
+ } // if (aElemTypeData->_geomType == ePOLYEDRE )
+
+ else
+ {
+ // Treat standard types
+ // ---------------------
+
+ // allocate data arrays
+ PCellInfo aCellInfo = myMed->CrCellInfo( aMeshInfo,
+ aElemTypeData->_entity,
+ aElemTypeData->_geomType,
+ aElemTypeData->_nbElems,
+ theConnMode,
+ theIsElemNum,
+ theIsElemNames);
+ // build map of family numbers for this type
+ if ( !isElemFamMapBuilt[ aElemTypeData->_smdsType ])
+ {
+ //cout << " fillElemFamilyMap()" << endl;
+ fillElemFamilyMap( anElemFamMap, aFamilies, aElemTypeData->_smdsType );
+ isElemFamMapBuilt[ aElemTypeData->_smdsType ] = true;
+ }
+
+ TInt aNbNodes = MED::GetNbNodes(aElemTypeData->_geomType);
+ while ( const SMDS_MeshElement* anElem = elemIterator->next() )
+ {
+ if ( anElem->NbNodes() != aNbNodes || anElem->IsPoly() )
+ continue; // other geometry
+
+ // connectivity
+ TConnSlice aTConnSlice = aCellInfo->GetConnSlice( iElem );
+ for (TInt iNode = 0; iNode < aNbNodes; iNode++) {
+ const SMDS_MeshElement* aNode = anElem->GetNode( iNode );
+#ifdef _EDF_NODE_IDS_
+ aTConnSlice[ iNode ] = aNodeIdMap[aNode->GetID()];
+#else
+ aTConnSlice[ iNode ] = aNode->GetID();
+#endif
+ }
+ // element number
+ aCellInfo->SetElemNum( iElem, anElem->GetID() );
+
+ // family number
+ int famNum = getFamilyId( anElemFamMap, anElem, defaultFamilyId );
+ aCellInfo->SetFamNum( iElem, famNum );
+
+ if ( ++iElem == aCellInfo->GetNbElem() )
+ break;
+ }
+ // store data in a file
+ //cout << " SetCellInfo(aCellInfo)" << endl;
+ myMed->SetCellInfo(aCellInfo);
+ }