X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FDriverMED%2FDriverMED_W_SMESHDS_Mesh.cxx;h=f5370662b8c79d07566f61206a240e6992369f86;hp=cf7d9a8195e30a8be642c467c2a3e7d04d29e89e;hb=79b1ac2b6df9117f16f11d444b1f165d477a1813;hpb=090aff07266d376ae028ae43434bdea7c0a0f9bb diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx index cf7d9a819..f5370662b 100644 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx @@ -17,7 +17,7 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // // @@ -33,9 +33,10 @@ #include "SMESHDS_Mesh.hxx" #include "SMDS_MeshElement.hxx" #include "SMDS_MeshNode.hxx" +#include "SMDS_PolyhedralVolumeOfNodes.hxx" + #include "utilities.h" -#include "MED_Factory.hxx" #include "MED_Utilities.hxx" #define _EDF_NODE_IDS_ @@ -53,7 +54,8 @@ DriverMED_W_SMESHDS_Mesh::DriverMED_W_SMESHDS_Mesh(): myDoGroupOfVolumes (false) {} -void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName, MED::EVersion theId) +void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName, + MED::EVersion theId) { myMed = CrWrapper(theFileName,theId); Driver_SMESHDS_Mesh::SetFile(theFileName); @@ -61,7 +63,25 @@ void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName, MED::EVer void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName) { - return SetFile(theFileName,MED::eV2_1); + return SetFile(theFileName,MED::eV2_2); +} + +string DriverMED_W_SMESHDS_Mesh::GetVersionString(const MED::EVersion theVersion, int theNbDigits) +{ + TInt majeur, mineur, release; + majeur = mineur = release = 0; + if ( theVersion == eV2_1 ) + MED::GetVersionRelease(majeur, mineur, release); + else + MED::GetVersionRelease(majeur, mineur, release); + ostringstream name; + if ( theNbDigits > 0 ) + name << majeur; + if ( theNbDigits > 1 ) + name << "." << mineur; + if ( theNbDigits > 2 ) + name << "." << release; + return name.str(); } void DriverMED_W_SMESHDS_Mesh::SetMeshName(const std::string& theMeshName) @@ -108,50 +128,58 @@ namespace{ typedef double (SMDS_MeshNode::* TGetCoord)() const; typedef const char* TName; typedef const char* TUnit; - - TUnit aUnit[3] = {"m","m","m"}; + // name length in a mesh must be equal to 16 : + // 1234567890123456 + TName M = "m "; + TName X = "x "; + TName Y = "y "; + TName Z = "z "; + + TUnit aUnit[3] = {M,M,M}; + + // 3 dim TGetCoord aXYZGetCoord[3] = { &SMDS_MeshNode::X, &SMDS_MeshNode::Y, &SMDS_MeshNode::Z }; - TName aXYZName[3] = {"x","y","z"}; - + TName aXYZName[3] = {X,Y,Z}; + // 2 dim TGetCoord aXYGetCoord[2] = { &SMDS_MeshNode::X, &SMDS_MeshNode::Y }; - TName aXYName[2] = {"x","y"}; + TName aXYName[2] = {X,Y}; TGetCoord aYZGetCoord[2] = { &SMDS_MeshNode::Y, &SMDS_MeshNode::Z }; - TName aYZName[2] = {"y","z"}; + TName aYZName[2] = {Y,Z}; TGetCoord aXZGetCoord[2] = { &SMDS_MeshNode::X, &SMDS_MeshNode::Z }; - TName aXZName[2] = {"x","z"}; - + TName aXZName[2] = {X,Z}; + // 1 dim TGetCoord aXGetCoord[1] = { &SMDS_MeshNode::X }; - TName aXName[1] = {"x"}; + TName aXName[1] = {X}; TGetCoord aYGetCoord[1] = { &SMDS_MeshNode::Y }; - TName aYName[1] = {"y"}; + TName aYName[1] = {Y}; TGetCoord aZGetCoord[1] = { &SMDS_MeshNode::Z }; - TName aZName[1] = {"z"}; + TName aZName[1] = {Z}; class TCoordHelper{ @@ -252,6 +280,17 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() aMeshDimension = anIsXDimension + anIsYDimension + anIsZDimension; if(!aMeshDimension) aMeshDimension = 3; + // PAL16857(SMESH not conform to the MED convention): + if ( aMeshDimension == 2 && anIsZDimension ) // 2D only if mesh is in XOY plane + aMeshDimension = 3; + // PAL18941(a saved study with a mesh belong Z is opened and the mesh is belong X) + if ( aMeshDimension == 1 && !anIsXDimension ) // 1D only if mesh is along OX + if ( anIsYDimension ) { + aMeshDimension = 2; + anIsXDimension = true; + } else { + aMeshDimension = 3; + } } SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(); @@ -285,17 +324,21 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() // Storing SMDS groups and sub-meshes //----------------------------------- - int myNodesDefaultFamilyId = 0; - int myEdgesDefaultFamilyId = 0; - int myFacesDefaultFamilyId = 0; + int myNodesDefaultFamilyId = 0; + int myEdgesDefaultFamilyId = 0; + int myFacesDefaultFamilyId = 0; int myVolumesDefaultFamilyId = 0; - if (myDoGroupOfNodes) + int nbNodes = myMesh->NbNodes(); + int nbEdges = myMesh->NbEdges(); + int nbFaces = myMesh->NbFaces(); + int nbVolumes = myMesh->NbVolumes(); + if (myDoGroupOfNodes && nbNodes) myNodesDefaultFamilyId = REST_NODES_FAMILY; - if (myDoGroupOfEdges) + if (myDoGroupOfEdges && nbEdges) myEdgesDefaultFamilyId = REST_EDGES_FAMILY; - if (myDoGroupOfFaces) + if (myDoGroupOfFaces && nbFaces) myFacesDefaultFamilyId = REST_FACES_FAMILY; - if (myDoGroupOfVolumes) + if (myDoGroupOfVolumes && nbVolumes) myVolumesDefaultFamilyId = REST_VOLUMES_FAMILY; MESSAGE("Perform - aFamilyInfo"); @@ -304,11 +347,17 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() if (myAllSubMeshes) { aFamilies = DriverMED_Family::MakeFamilies (myMesh->SubMeshes(), myGroups, - myDoGroupOfNodes, myDoGroupOfEdges, myDoGroupOfFaces, myDoGroupOfVolumes); + myDoGroupOfNodes && nbNodes, + myDoGroupOfEdges && nbEdges, + myDoGroupOfFaces && nbFaces, + myDoGroupOfVolumes && nbVolumes); } else { aFamilies = DriverMED_Family::MakeFamilies (mySubMeshes, myGroups, - myDoGroupOfNodes, myDoGroupOfEdges, myDoGroupOfFaces, myDoGroupOfVolumes); + myDoGroupOfNodes && nbNodes, + myDoGroupOfEdges && nbEdges, + myDoGroupOfFaces && nbFaces, + myDoGroupOfVolumes && nbVolumes); } list::iterator aFamsIter = aFamilies.begin(); @@ -319,12 +368,11 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() int aFamId = (*aFamsIter)->GetId(); const set& anElems = (*aFamsIter)->GetElements(); - set::iterator anElemsIter = anElems.begin(); + set::const_iterator anElemsIter = anElems.begin(); for (; anElemsIter != anElems.end(); anElemsIter++) { anElemFamMap[*anElemsIter] = aFamId; } -// delete (*aFamsIter); } // Storing SMDS nodes to the MED file for the MED mesh @@ -363,8 +411,9 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() const ERepere SMDS_COORDINATE_SYSTEM = eCART; PNodeInfo aNodeInfo = myMed->CrNodeInfo(aMeshInfo, - SMDS_COORDINATE_SYSTEM, aCoordinates, + eFULL_INTERLACE, + SMDS_COORDINATE_SYSTEM, aCoordNames, aCoordUnits, aFamilyNums, @@ -383,39 +432,90 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() #ifdef _ELEMENTS_BY_DIM_ SMDS_MED_ENTITY = eARETE; #endif + // count edges of diff types + int aNbSeg3 = 0, aNbSeg2 = 0; SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator(); - TInt aNbConnectivity = MED::GetNbConn(SMDS_MED_ENTITY,eSEG2,aMeshDimension); - MED::TIntVector anElemNums(aNbElems); - MED::TIntVector aFamilyNums(aNbElems); - MED::TIntVector aConnectivity(aNbElems*aNbConnectivity); + while ( anIter->more() ) + if ( anIter->next()->NbNodes() == 3 ) + ++aNbSeg3; + aNbSeg2 = aNbElems - aNbSeg3; + + TInt aNbSeg2Conn = MED::GetNbNodes(eSEG2); + MED::TIntVector aSeg2ElemNums, aSeg2FamilyNums, aSeg2Conn; + aSeg2ElemNums .reserve( aNbSeg2 ); + aSeg2FamilyNums.reserve( aNbSeg2 ); + aSeg2Conn .reserve( aNbSeg2*aNbSeg2Conn ); - for(TInt iElem = 0, iConn = 0; anIter->more(); iElem++, iConn+=aNbConnectivity){ + TInt aNbSeg3Conn = MED::GetNbNodes(eSEG3); + MED::TIntVector aSeg3ElemNums, aSeg3FamilyNums, aSeg3Conn; + aSeg3ElemNums .reserve( aNbSeg3 ); + aSeg3FamilyNums.reserve( aNbSeg3 ); + aSeg3Conn .reserve( aNbSeg3*aNbSeg3Conn ); + + anIter = myMesh->edgesIterator(); + while ( anIter->more() ) { const SMDS_MeshEdge* anElem = anIter->next(); - SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); - for(TInt iNode = 0; iNode < aNbConnectivity && aNodesIter->more(); iNode++){ - const SMDS_MeshElement* aNode = aNodesIter->next(); + TInt aNbNodes = anElem->NbNodes(); + + TInt aNbConnectivity; + MED::TIntVector* anElemNums; + MED::TIntVector* aFamilyNums; + MED::TIntVector* aConnectivity; + switch(aNbNodes){ + case 2: + aNbConnectivity = aNbSeg2Conn; + anElemNums = &aSeg2ElemNums; + aFamilyNums = &aSeg2FamilyNums; + aConnectivity = &aSeg2Conn; + break; + case 3: + aNbConnectivity = aNbSeg3Conn; + anElemNums = &aSeg3ElemNums; + aFamilyNums = &aSeg3FamilyNums; + aConnectivity = &aSeg3Conn; + break; + default: + break; + } + + for(TInt iNode = 0; iNode < aNbNodes; iNode++) { + const SMDS_MeshElement* aNode = anElem->GetNode( iNode ); #ifdef _EDF_NODE_IDS_ - aConnectivity[iConn+iNode] = aNodeIdMap[aNode->GetID()]; + aConnectivity->push_back( aNodeIdMap[aNode->GetID()] ); #else - aConnectivity[iConn+iNode] = aNode->GetID(); + aConnectivity->push_back( aNode->GetID() ); #endif - } - anElemNums[iElem] = anElem->GetID(); + } - if (anElemFamMap.find(anElem) != anElemFamMap.end()) - aFamilyNums[iElem] = anElemFamMap[anElem]; + anElemNums->push_back(anElem->GetID()); + + map::iterator edge_fam = anElemFamMap.find( anElem ); + if ( edge_fam != anElemFamMap.end() ) + aFamilyNums->push_back( edge_fam->second ); else - aFamilyNums[iElem] = myEdgesDefaultFamilyId; + aFamilyNums->push_back( myEdgesDefaultFamilyId ); } - PCellInfo aCellInfo = myMed->CrCellInfo(aMeshInfo, - SMDS_MED_ENTITY, - eSEG2, - SMDS_MED_CONNECTIVITY, - aConnectivity, - aFamilyNums, - anElemNums); - myMed->SetCellInfo(aCellInfo); + if ( aNbSeg2 ) { + PCellInfo aCellInfo = myMed->CrCellInfo(aMeshInfo, + SMDS_MED_ENTITY, + eSEG2, + aSeg2Conn, + SMDS_MED_CONNECTIVITY, + aSeg2FamilyNums, + aSeg2ElemNums); + myMed->SetCellInfo(aCellInfo); + } + if ( aNbSeg3 ) { + PCellInfo aCellInfo = myMed->CrCellInfo(aMeshInfo, + SMDS_MED_ENTITY, + eSEG3, + aSeg3Conn, + SMDS_MED_CONNECTIVITY, + aSeg3FamilyNums, + aSeg3ElemNums); + myMed->SetCellInfo(aCellInfo); + } } // Storing SMDS Faces @@ -424,7 +524,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() #ifdef _ELEMENTS_BY_DIM_ SMDS_MED_ENTITY = eFACE; #endif - TInt aNbTriaConn = MED::GetNbConn(SMDS_MED_ENTITY,eTRIA3,aMeshDimension); + TInt aNbTriaConn = MED::GetNbNodes(eTRIA3); MED::TIntVector anTriaElemNums; anTriaElemNums.reserve(aNbElems); MED::TIntVector aTriaFamilyNums; @@ -432,7 +532,15 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() MED::TIntVector aTriaConn; aTriaConn.reserve(aNbElems*aNbTriaConn); - TInt aNbQuadConn = MED::GetNbConn(SMDS_MED_ENTITY,eQUAD4,aMeshDimension); + TInt aNbTria6Conn = MED::GetNbNodes(eTRIA6); + MED::TIntVector anTria6ElemNums; + anTria6ElemNums.reserve(aNbElems); + MED::TIntVector aTria6FamilyNums; + aTria6FamilyNums.reserve(aNbElems); + MED::TIntVector aTria6Conn; + aTria6Conn.reserve(aNbElems*aNbTria6Conn); + + TInt aNbQuadConn = MED::GetNbNodes(eQUAD4); MED::TIntVector aQuadElemNums; aQuadElemNums.reserve(aNbElems); MED::TIntVector aQuadFamilyNums; @@ -440,6 +548,24 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() MED::TIntVector aQuadConn; aQuadConn.reserve(aNbElems*aNbQuadConn); + TInt aNbQuad8Conn = MED::GetNbNodes(eQUAD8); + MED::TIntVector aQuad8ElemNums; + aQuad8ElemNums.reserve(aNbElems); + MED::TIntVector aQuad8FamilyNums; + aQuad8FamilyNums.reserve(aNbElems); + MED::TIntVector aQuad8Conn; + aQuad8Conn.reserve(aNbElems*aNbQuad8Conn); + + MED::TIntVector aPolygoneElemNums; + aPolygoneElemNums.reserve(aNbElems); + MED::TIntVector aPolygoneInds; + aPolygoneInds.reserve(aNbElems + 1); + aPolygoneInds.push_back(1); // reference on the first element in the connectivities + MED::TIntVector aPolygoneFamilyNums; + aPolygoneFamilyNums.reserve(aNbElems); + MED::TIntVector aPolygoneConn; + aPolygoneConn.reserve(aNbElems*aNbQuadConn); + for(TInt iElem = 0; iElem < aNbElems && anIter->more(); iElem++){ const SMDS_MeshFace* anElem = anIter->next(); TInt aNbNodes = anElem->NbNodes(); @@ -448,41 +574,55 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() MED::TIntVector* anElemNums; MED::TIntVector* aFamilyNums; MED::TIntVector* aConnectivity; - switch(aNbNodes){ - case 3: - aNbConnectivity = aNbTriaConn; - anElemNums = &anTriaElemNums; - aFamilyNums = &aTriaFamilyNums; - aConnectivity = &aTriaConn; - break; - case 4: - aNbConnectivity = aNbQuadConn; - anElemNums = &aQuadElemNums; - aFamilyNums = &aQuadFamilyNums; - aConnectivity = &aQuadConn; - break; - } + if (anElem->IsPoly()) { + aNbConnectivity = aNbNodes; + anElemNums = &aPolygoneElemNums; + aFamilyNums = &aPolygoneFamilyNums; + aConnectivity = &aPolygoneConn; + } + else { + switch(aNbNodes){ + case 3: + aNbConnectivity = aNbTriaConn; + anElemNums = &anTriaElemNums; + aFamilyNums = &aTriaFamilyNums; + aConnectivity = &aTriaConn; + break; + case 4: + aNbConnectivity = aNbQuadConn; + anElemNums = &aQuadElemNums; + aFamilyNums = &aQuadFamilyNums; + aConnectivity = &aQuadConn; + break; + case 6: + aNbConnectivity = aNbTria6Conn; + anElemNums = &anTria6ElemNums; + aFamilyNums = &aTria6FamilyNums; + aConnectivity = &aTria6Conn; + break; + case 8: + aNbConnectivity = aNbQuad8Conn; + anElemNums = &aQuad8ElemNums; + aFamilyNums = &aQuad8FamilyNums; + aConnectivity = &aQuad8Conn; + break; + default: + break; + } + } MED::TIntVector aVector(aNbNodes); for(TInt iNode = 0; aNodesIter->more(); iNode++){ const SMDS_MeshElement* aNode = aNodesIter->next(); +#ifdef _EDF_NODE_IDS_ + aVector[iNode] = aNodeIdMap[aNode->GetID()]; +#else aVector[iNode] = aNode->GetID(); +#endif } TInt aSize = aConnectivity->size(); aConnectivity->resize(aSize+aNbConnectivity); - // There is some differnce between SMDS and MED in cells mapping -#ifdef _EDF_NODE_IDS_ - switch(aNbNodes){ - case 4: - (*aConnectivity)[aSize+0] = aNodeIdMap[aVector[0]]; - (*aConnectivity)[aSize+1] = aNodeIdMap[aVector[1]]; - (*aConnectivity)[aSize+2] = aNodeIdMap[aVector[3]]; - (*aConnectivity)[aSize+3] = aNodeIdMap[aVector[2]]; - default: - for(TInt iNode = 0; iNode < aNbNodes; iNode++) - (*aConnectivity)[aSize+iNode] = aNodeIdMap[aVector[iNode]]; - } -#else + // There is some differences between SMDS and MED in cells mapping switch(aNbNodes){ case 4: (*aConnectivity)[aSize+0] = aVector[0]; @@ -493,7 +633,13 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() for(TInt iNode = 0; iNode < aNbNodes; iNode++) (*aConnectivity)[aSize+iNode] = aVector[iNode]; } -#endif + + if (anElem->IsPoly()) { + // fill indices for polygonal element + TInt aPrevPos = aPolygoneInds.back(); + aPolygoneInds.push_back(aPrevPos + aNbNodes); + } + anElemNums->push_back(anElem->GetID()); if (anElemFamMap.find(anElem) != anElemFamMap.end()) @@ -505,8 +651,8 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() PCellInfo aCellInfo = myMed->CrCellInfo(aMeshInfo, SMDS_MED_ENTITY, eTRIA3, - SMDS_MED_CONNECTIVITY, aTriaConn, + SMDS_MED_CONNECTIVITY, aTriaFamilyNums, anTriaElemNums); MESSAGE("Perform - anEntity = "<NbFaces(); + for (int iface = 1; iface <= aNbFaces; iface++) { + int aNbFaceNodes = aPolyedre->NbFaceNodes(iface); + for (int inode = 1; inode <= aNbFaceNodes; inode++) { + aNodeId = aPolyedre->GetFaceNode(iface, inode)->GetID(); #ifdef _EDF_NODE_IDS_ - switch(aNbNodes){ - case 5: - (*aConnectivity)[aSize+0] = aNodeIdMap[aVector[0]]; - (*aConnectivity)[aSize+1] = aNodeIdMap[aVector[3]]; - (*aConnectivity)[aSize+2] = aNodeIdMap[aVector[2]]; - (*aConnectivity)[aSize+3] = aNodeIdMap[aVector[1]]; - (*aConnectivity)[aSize+4] = aNodeIdMap[aVector[4]]; - default: - for(TInt iNode = 0; iNode < aNbNodes; iNode++) - (*aConnectivity)[aSize+iNode] = aNodeIdMap[aVector[iNode]]; - } + aPolyedreConn.push_back(aNodeIdMap[aNodeId]); #else - switch(aNbNodes){ - case 5: - (*aConnectivity)[aSize+0] = aVector[0]; - (*aConnectivity)[aSize+1] = aVector[3]; - (*aConnectivity)[aSize+2] = aVector[2]; - (*aConnectivity)[aSize+3] = aVector[1]; - (*aConnectivity)[aSize+4] = aVector[4]; - default: - for(TInt iNode = 0; iNode < aNbNodes; iNode++) - (*aConnectivity)[aSize+iNode] = aVector[iNode]; - } + aPolyedreConn.push_back(aNodeId); #endif - anElemNums->push_back(anElem->GetID()); + } + TInt aPrevPos = aPolyedreFaces.back(); + aPolyedreFaces.push_back(aPrevPos + aNbFaceNodes); + } + TInt aPrevPos = aPolyedreInds.back(); + aPolyedreInds.push_back(aPrevPos + aNbFaces); + + } + else { + TInt aNbNodes = anElem->NbNodes(); + SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); + TInt aNbConnectivity; + MED::TIntVector* aConnectivity; + switch(aNbNodes){ + case 4: + aNbConnectivity = aNbTetraConn; + anElemNums = &anTetraElemNums; + aFamilyNums = &aTetraFamilyNums; + aConnectivity = &aTetraConn; + break; + case 5: + aNbConnectivity = aNbPyraConn; + anElemNums = &anPyraElemNums; + aFamilyNums = &aPyraFamilyNums; + aConnectivity = &aPyraConn; + break; + case 6: + aNbConnectivity = aNbPentaConn; + anElemNums = &anPentaElemNums; + aFamilyNums = &aPentaFamilyNums; + aConnectivity = &aPentaConn; + break; + case 8: + aNbConnectivity = aNbHexaConn; + anElemNums = &aHexaElemNums; + aFamilyNums = &aHexaFamilyNums; + aConnectivity = &aHexaConn; + break; + case 10: + aNbConnectivity = aNbTetra10Conn; + anElemNums = &anTetra10ElemNums; + aFamilyNums = &aTetra10FamilyNums; + aConnectivity = &aTetra10Conn; + break; + case 13: + aNbConnectivity = aNbPyra13Conn; + anElemNums = &anPyra13ElemNums; + aFamilyNums = &aPyra13FamilyNums; + aConnectivity = &aPyra13Conn; + break; + case 15: + aNbConnectivity = aNbPenta15Conn; + anElemNums = &anPenta15ElemNums; + aFamilyNums = &aPenta15FamilyNums; + aConnectivity = &aPenta15Conn; + break; + case 20: + aNbConnectivity = aNbHexa20Conn; + anElemNums = &aHexa20ElemNums; + aFamilyNums = &aHexa20FamilyNums; + aConnectivity = &aHexa20Conn; + } + + TInt aSize = aConnectivity->size(); + aConnectivity->resize(aSize + aNbConnectivity); + + MED::TIntVector aVector(aNbNodes); + for(TInt iNode = 0; aNodesIter->more(); iNode++){ + const SMDS_MeshElement* aNode = aNodesIter->next(); +#ifdef _EDF_NODE_IDS_ + aVector[iNode] = aNodeIdMap[aNode->GetID()]; +#else + aVector[iNode] = aNode->GetID(); +#endif + } + // There is some difference between SMDS and MED in cells mapping + switch(aNbNodes){ + case 5: + (*aConnectivity)[aSize+0] = aVector[0]; + (*aConnectivity)[aSize+1] = aVector[3]; + (*aConnectivity)[aSize+2] = aVector[2]; + (*aConnectivity)[aSize+3] = aVector[1]; + (*aConnectivity)[aSize+4] = aVector[4]; + default: + for(TInt iNode = 0; iNode < aNbNodes; iNode++) + (*aConnectivity)[aSize+iNode] = aVector[iNode]; + } + } + + anElemNums->push_back(anElem->GetID()); if (anElemFamMap.find(anElem) != anElemFamMap.end()) aFamilyNums->push_back(anElemFamMap[anElem]); @@ -642,8 +920,8 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() PCellInfo aCellInfo = myMed->CrCellInfo(aMeshInfo, SMDS_MED_ENTITY, eTETRA4, - SMDS_MED_CONNECTIVITY, aTetraConn, + SMDS_MED_CONNECTIVITY, aTetraFamilyNums, anTetraElemNums); MESSAGE("Perform - anEntity = "<