X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FDriverMED%2FDriverMED_W_SMESHDS_Mesh.cxx;h=39b03f2d619cd4435c71d253ee0d0967f0ebc71f;hb=a438b8cfa9fc179bad1285578ee7d298dd315fa4;hp=d7d2d0768d83fe01c9b33dce2d76e1c884094e5d;hpb=2c607013a23bd4e7ba07e72e0c04dee2c1209cff;p=modules%2Fsmesh.git diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx index d7d2d0768..39b03f2d6 100644 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -27,7 +27,6 @@ #include #include "DriverMED_W_SMESHDS_Mesh.h" -#include "DriverMED_W_SMDS_Mesh.h" #include "DriverMED_Family.h" #include "SMESHDS_Mesh.hxx" @@ -84,11 +83,6 @@ string DriverMED_W_SMESHDS_Mesh::GetVersionString(const MED::EVersion theVersion return name.str(); } -void DriverMED_W_SMESHDS_Mesh::SetMeshName(const std::string& theMeshName) -{ - myMeshName = theMeshName; -} - void DriverMED_W_SMESHDS_Mesh::AddGroup(SMESHDS_GroupBase* theGroup) { myGroups.push_back(theGroup); @@ -221,36 +215,6 @@ namespace{ }; typedef boost::shared_ptr TCoordHelperPtr; - - //------------------------------------------------------- - /*! - * \brief Class helping to use either SMDS_0DElementIterator, - * SMDS_EdgeIterator, SMDS_FaceIterator or SMDS_VolumeIterator - * in the same code - */ - //------------------------------------------------------- - struct TElemIterator - { - virtual const SMDS_MeshElement* next() = 0; - virtual ~TElemIterator() {} - }; - typedef boost::shared_ptr PElemIterator; - - template< class SMDSIteratorPtr > class TypedElemIterator: public TElemIterator - { - SMDSIteratorPtr myItPtr; - public: - TypedElemIterator(SMDSIteratorPtr it): myItPtr(it) {} - virtual const SMDS_MeshElement* next() { - if ( myItPtr->more() ) return myItPtr->next(); - else return 0; - } - }; - typedef TypedElemIterator< SMDS_0DElementIteratorPtr > T0DElementIterator; - typedef TypedElemIterator< SMDS_EdgeIteratorPtr > TEdgeIterator; - typedef TypedElemIterator< SMDS_FaceIteratorPtr > TFaceIterator; - typedef TypedElemIterator< SMDS_VolumeIteratorPtr > TVolumeIterator; - //------------------------------------------------------- /*! * \brief Structure describing element type @@ -269,7 +233,6 @@ namespace{ typedef NCollection_DataMap< Standard_Address, int > TElemFamilyMap; - //typedef map TElemFamilyMap; //================================================================================ /*! @@ -348,7 +311,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() // Mesh dimension definition TInt aSpaceDimension; TCoordHelperPtr aCoordHelperPtr; - { + { bool anIsXDimension = false; bool anIsYDimension = false; bool anIsZDimension = false; @@ -431,24 +394,24 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() // Storing SMDS groups and sub-meshes as med families //---------------------------------------------------- - int myNodesDefaultFamilyId = 0; + int myNodesDefaultFamilyId = 0; int my0DElementsDefaultFamilyId = 0; - int myEdgesDefaultFamilyId = 0; - int myFacesDefaultFamilyId = 0; - int myVolumesDefaultFamilyId = 0; - int nbNodes = myMesh->NbNodes(); - //int nb0DElements = myMesh->Nb0DElements(); - int nbEdges = myMesh->NbEdges(); - int nbFaces = myMesh->NbFaces(); - int nbVolumes = myMesh->NbVolumes(); - if (myDoGroupOfNodes && nbNodes) - myNodesDefaultFamilyId = REST_NODES_FAMILY; - if (myDoGroupOfEdges && nbEdges) - myEdgesDefaultFamilyId = REST_EDGES_FAMILY; - if (myDoGroupOfFaces && nbFaces) - myFacesDefaultFamilyId = REST_FACES_FAMILY; - if (myDoGroupOfVolumes && nbVolumes) - myVolumesDefaultFamilyId = REST_VOLUMES_FAMILY; + int myBallsDefaultFamilyId = 0; + int myEdgesDefaultFamilyId = 0; + int myFacesDefaultFamilyId = 0; + int myVolumesDefaultFamilyId = 0; + int nbNodes = myMesh->NbNodes(); + int nb0DElements = myMesh->Nb0DElements(); + int nbBalls = myMesh->NbBalls(); + int nbEdges = myMesh->NbEdges(); + int nbFaces = myMesh->NbFaces(); + int nbVolumes = myMesh->NbVolumes(); + if (myDoGroupOfNodes && nbNodes) myNodesDefaultFamilyId = REST_NODES_FAMILY; + if (myDoGroupOfEdges && nbEdges) myEdgesDefaultFamilyId = REST_EDGES_FAMILY; + if (myDoGroupOfFaces && nbFaces) myFacesDefaultFamilyId = REST_FACES_FAMILY; + if (myDoGroupOfVolumes && nbVolumes) myVolumesDefaultFamilyId = REST_VOLUMES_FAMILY; + if (myDoGroupOf0DElems && nb0DElements) my0DElementsDefaultFamilyId = REST_0DELEM_FAMILY; + if (myDoGroupOfVolumes && nbVolumes) myBallsDefaultFamilyId = REST_BALL_FAMILY; MESSAGE("Perform - aFamilyInfo"); //cout << " DriverMED_Family::MakeFamilies() " << endl; @@ -459,14 +422,18 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() myDoGroupOfNodes && nbNodes, myDoGroupOfEdges && nbEdges, myDoGroupOfFaces && nbFaces, - myDoGroupOfVolumes && nbVolumes); + myDoGroupOfVolumes && nbVolumes, + myDoGroupOf0DElems && nb0DElements, + myDoGroupOfBalls && nbBalls); } else { aFamilies = DriverMED_Family::MakeFamilies (mySubMeshes, myGroups, myDoGroupOfNodes && nbNodes, myDoGroupOfEdges && nbEdges, myDoGroupOfFaces && nbFaces, - myDoGroupOfVolumes && nbVolumes); + myDoGroupOfVolumes && nbVolumes, + myDoGroupOf0DElems && nb0DElements, + myDoGroupOfBalls && nbBalls); } //cout << " myMed->SetFamilyInfo() " << endl; list::iterator aFamsIter; @@ -552,6 +519,13 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() ePOINT1, nbElemInfo.Nb0DElements(), SMDSAbs_0DElement)); +#ifdef _ELEMENTS_BY_DIM_ + anEntity = eSTRUCT_ELEMENT; +#endif + aTElemTypeDatas.push_back( TElemTypeData(anEntity, + eBALL, + nbElemInfo.NbBalls(), + SMDSAbs_Ball)); #ifdef _ELEMENTS_BY_DIM_ anEntity = eARETE; #endif @@ -579,9 +553,14 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() nbElemInfo.NbQuadrangles( ORDER_LINEAR ), SMDSAbs_Face)); aTElemTypeDatas.push_back( TElemTypeData(anEntity, - eQUAD8, - nbElemInfo.NbQuadrangles( ORDER_QUADRATIC ), - SMDSAbs_Face)); + eQUAD8, + nbElemInfo.NbQuadrangles( ORDER_QUADRATIC ) - + nbElemInfo.NbBiQuadQuadrangles(), + SMDSAbs_Face)); + aTElemTypeDatas.push_back( TElemTypeData(anEntity, + eQUAD9, + nbElemInfo.NbBiQuadQuadrangles(), + SMDSAbs_Face)); if ( polyTypesSupported ) { aTElemTypeDatas.push_back( TElemTypeData(anEntity, ePOLYGONE, @@ -626,10 +605,18 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() SMDSAbs_Volume)); aTElemTypeDatas.push_back( TElemTypeData(anEntity, eHEXA20, - nbElemInfo.NbHexas( ORDER_QUADRATIC ), + nbElemInfo.NbHexas( ORDER_QUADRATIC )- + nbElemInfo.NbTriQuadHexas(), + SMDSAbs_Volume)); + aTElemTypeDatas.push_back( TElemTypeData(anEntity, + eHEXA27, + nbElemInfo.NbTriQuadHexas(), + SMDSAbs_Volume)); + aTElemTypeDatas.push_back( TElemTypeData(anEntity, + eOCTA12, + nbElemInfo.NbHexPrisms(), SMDSAbs_Volume)); if ( polyTypesSupported ) { - //MESSAGE("polyTypesSupported"); aTElemTypeDatas.push_back( TElemTypeData(anEntity, ePOLYEDRE, nbElemInfo.NbPolyhedrons(), @@ -651,44 +638,43 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() 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_Ball: + defaultFamilyId = myBallsDefaultFamilyId; + 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; } + + // iterator on elements of a current type + SMDS_ElemIteratorPtr elemIterator; int iElem = 0; - //cout << " Treat type " << aElemTypeData->_geomType << " nb = " <_nbElems<< endl; // Treat POLYGONs // --------------- if ( aElemTypeData->_geomType == ePOLYGONE ) { + elemIterator = myMesh->elementGeomIterator( SMDSGeom_POLYGON ); 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; - } + while ( elemIterator->more() ) { + const SMDS_MeshElement* anElem = elemIterator->next(); + nbPolygonNodes += anElem->NbNodes(); + if ( ++iElem == aElemTypeData->_nbElems ) + break; } } else { @@ -703,11 +689,9 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() TElemNum & index = *(aPolygoneInfo->myIndex.get()); index[0] = 1; - while ( const SMDS_MeshElement* anElem = elemIterator->next() ) + while ( elemIterator->more() ) { - if ( !anElem->IsPoly() ) - continue; - + const SMDS_MeshElement* anElem = elemIterator->next(); // index TInt aNbNodes = anElem->NbNodes(); index[ iElem+1 ] = index[ iElem ] + aNbNodes; @@ -732,11 +716,6 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() 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); } @@ -746,21 +725,19 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() // ---------------- else if (aElemTypeData->_geomType == ePOLYEDRE ) { - //MESSAGE("_geomType == ePOLYEDRE"); + elemIterator = myMesh->elementGeomIterator( SMDSGeom_POLYHEDRA ); + if ( nbPolyhedronNodes == 0 ) { // Count nb of nodes - while ( const SMDS_MeshElement* anElem = elemIterator->next() ) { - const SMDS_VtkVolume *aPolyedre = dynamic_cast(anElem); - if ( aPolyedre && aPolyedre->IsPoly()) { - nbPolyhedronNodes += aPolyedre->NbNodes(); - nbPolyhedronFaces += aPolyedre->NbFaces(); - if ( ++iElem == aElemTypeData->_nbElems ) - break; - } + while ( elemIterator->more() ) { + const SMDS_MeshElement* anElem = elemIterator->next(); + const SMDS_VtkVolume *aPolyedre = dynamic_cast(anElem); + if ( !aPolyedre ) continue; + 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 @@ -780,24 +757,19 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() faces[0] = 1; TInt iFace = 0, iNode = 0; - while ( const SMDS_MeshElement* anElem = elemIterator->next() ) + while ( elemIterator->more() ) { + const SMDS_MeshElement* anElem = elemIterator->next(); const SMDS_VtkVolume *aPolyedre = dynamic_cast(anElem); - if ( !aPolyedre ) - continue; - if ( !aPolyedre->IsPoly() ) - continue; - //MESSAGE("index[" << iElem << "]=" << index[iElem] << " iElem=" << iElem); + if ( !aPolyedre ) continue; // 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(); @@ -805,10 +777,8 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() 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; } @@ -822,11 +792,52 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() if ( ++iElem == aPolyhInfo->GetNbElem() ) break; } - //cout << " SetPolyedreInfo(aPolyhInfo )" << endl; myMed->SetPolyedreInfo(aPolyhInfo); } } // if (aElemTypeData->_geomType == ePOLYEDRE ) + // Treat BALLs + // ---------------- + else if (aElemTypeData->_geomType == eBALL ) + { + // allocate data arrays + PBallInfo aBallInfo = myMed->CrBallInfo( aMeshInfo, + aElemTypeData->_nbElems ); + + // build map of family numbers for this type + if ( !isElemFamMapBuilt[ aElemTypeData->_smdsType ]) + { + fillElemFamilyMap( anElemFamMap, aFamilies, aElemTypeData->_smdsType ); + isElemFamMapBuilt[ aElemTypeData->_smdsType ] = true; + } + + elemIterator = myMesh->elementsIterator( SMDSAbs_Ball ); + while ( elemIterator->more() ) + { + const SMDS_MeshElement* anElem = elemIterator->next(); + // connectivity + const SMDS_MeshElement* aNode = anElem->GetNode( 0 ); +#ifdef _EDF_NODE_IDS_ + (*aBallInfo->myConn)[ iElem ] = aNodeIdMap[aNode->GetID()]; +#else + (*aBallInfo->myConn)[ iElem ] = aNode->GetID(); +#endif + // element number + aBallInfo->SetElemNum( iElem, anElem->GetID() ); + + // diameter + aBallInfo->myDiameters[ iElem ] = + static_cast( anElem )->GetDiameter(); + + // family number + int famNum = getFamilyId( anElemFamMap, anElem, defaultFamilyId ); + aBallInfo->SetFamNum( iElem, famNum ); + ++iElem; + } + // store data in a file + myMed->SetBallInfo(aBallInfo); + } + else { // Treat standard types @@ -849,8 +860,10 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() } TInt aNbNodes = MED::GetNbNodes(aElemTypeData->_geomType); - while ( const SMDS_MeshElement* anElem = elemIterator->next() ) + elemIterator = myMesh->elementsIterator( aElemTypeData->_smdsType ); + while ( elemIterator->more() ) { + const SMDS_MeshElement* anElem = elemIterator->next(); if ( anElem->NbNodes() != aNbNodes || anElem->IsPoly() ) continue; // other geometry @@ -875,7 +888,6 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() break; } // store data in a file - //cout << " SetCellInfo(aCellInfo)" << endl; myMed->SetCellInfo(aCellInfo); }