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=376d108653228fc6da3242b2cb1cc8de9ff9fd34;hp=9f8e9c06cee7d341826425543431413b1133869b;hb=991f4107746ffffd2e5944212fba84ff1b6efc58;hpb=0635c9fc80f67d1e5dc0e94ec85f487286a92070 diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx index 9f8e9c06c..376d10865 100644 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx @@ -54,7 +54,7 @@ DriverMED_W_SMESHDS_Mesh::DriverMED_W_SMESHDS_Mesh(): {} void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName, - MED::EVersion theId) + MED::EVersion theId) { myMed = CrWrapper(theFileName,theId); Driver_SMESHDS_Mesh::SetFile(theFileName); @@ -189,9 +189,9 @@ namespace{ TUnit* myUnit; public: TCoordHelper(const SMDS_NodeIteratorPtr& theNodeIter, - TGetCoord* theGetCoord, - TName* theName, - TUnit* theUnit = aUnit): + TGetCoord* theGetCoord, + TName* theName, + TUnit* theUnit = aUnit): myNodeIter(theNodeIter), myGetCoord(theGetCoord), myName(theName), @@ -200,7 +200,7 @@ namespace{ virtual ~TCoordHelper(){} bool Next(){ return myNodeIter->more() && - (myCurrentNode = myNodeIter->next()); + (myCurrentNode = myNodeIter->next()); } const SMDS_MeshNode* GetNode(){ return myCurrentNode; @@ -223,8 +223,9 @@ namespace{ //------------------------------------------------------- /*! - * \brief Class helping to use either SMDS_EdgeIterator, SMDS_FaceIterator - * or SMDS_VolumeIterator in the same code + * \brief Class helping to use either SMDS_0DElementIterator, + * SMDS_EdgeIterator, SMDS_FaceIterator or SMDS_VolumeIterator + * in the same code */ //------------------------------------------------------- struct TElemIterator @@ -244,6 +245,7 @@ namespace{ else return 0; } }; + typedef TypedElemIterator< SMDS_0DElementIteratorPtr > T0DElementIterator; typedef TypedElemIterator< SMDS_EdgeIteratorPtr > TEdgeIterator; typedef TypedElemIterator< SMDS_FaceIteratorPtr > TFaceIterator; typedef TypedElemIterator< SMDS_VolumeIteratorPtr > TVolumeIterator; @@ -342,90 +344,99 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() aMeshName = myMeshName; } - // Mesh dimension definition - TInt aMeshDimension; + // Space dimension definition + TInt aSpaceDim; TCoordHelperPtr aCoordHelperPtr; { bool anIsXDimension = false; bool anIsYDimension = false; bool anIsZDimension = false; { - SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(); - double aBounds[6]; - if(aNodesIter->more()){ - const SMDS_MeshNode* aNode = aNodesIter->next(); - aBounds[0] = aBounds[1] = aNode->X(); - aBounds[2] = aBounds[3] = aNode->Y(); - aBounds[4] = aBounds[5] = aNode->Z(); - } - while(aNodesIter->more()){ - const SMDS_MeshNode* aNode = aNodesIter->next(); - aBounds[0] = min(aBounds[0],aNode->X()); - aBounds[1] = max(aBounds[1],aNode->X()); - - aBounds[2] = min(aBounds[2],aNode->Y()); - aBounds[3] = max(aBounds[3],aNode->Y()); - - aBounds[4] = min(aBounds[4],aNode->Z()); - aBounds[5] = max(aBounds[5],aNode->Z()); - } - - double EPS = 1.0E-7; - anIsXDimension = (aBounds[1] - aBounds[0]) + abs(aBounds[1]) + abs(aBounds[0]) > EPS; - anIsYDimension = (aBounds[3] - aBounds[2]) + abs(aBounds[3]) + abs(aBounds[2]) > EPS; - anIsZDimension = (aBounds[5] - aBounds[4]) + abs(aBounds[5]) + abs(aBounds[4]) > EPS; - aMeshDimension = anIsXDimension + anIsYDimension + anIsZDimension; - if(!aMeshDimension) - aMeshDimension = 3; + SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(); + double aBounds[6]; + if(aNodesIter->more()){ + const SMDS_MeshNode* aNode = aNodesIter->next(); + aBounds[0] = aBounds[1] = aNode->X(); + aBounds[2] = aBounds[3] = aNode->Y(); + aBounds[4] = aBounds[5] = aNode->Z(); + } + while(aNodesIter->more()){ + const SMDS_MeshNode* aNode = aNodesIter->next(); + aBounds[0] = min(aBounds[0],aNode->X()); + aBounds[1] = max(aBounds[1],aNode->X()); + + aBounds[2] = min(aBounds[2],aNode->Y()); + aBounds[3] = max(aBounds[3],aNode->Y()); + + aBounds[4] = min(aBounds[4],aNode->Z()); + aBounds[5] = max(aBounds[5],aNode->Z()); + } + + double EPS = 1.0E-7; + anIsXDimension = (aBounds[1] - aBounds[0]) + abs(aBounds[1]) + abs(aBounds[0]) > EPS; + anIsYDimension = (aBounds[3] - aBounds[2]) + abs(aBounds[3]) + abs(aBounds[2]) > EPS; + anIsZDimension = (aBounds[5] - aBounds[4]) + abs(aBounds[5]) + abs(aBounds[4]) > EPS; + aSpaceDim = anIsXDimension + anIsYDimension + anIsZDimension; + if(!aSpaceDim) + aSpaceDim = 3; // PAL16857(SMESH not conform to the MED convention): - if ( aMeshDimension == 2 && anIsZDimension ) // 2D only if mesh is in XOY plane - aMeshDimension = 3; + if ( aSpaceDim == 2 && anIsZDimension ) // 2D only if mesh is in XOY plane + aSpaceDim = 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 ( aSpaceDim == 1 && !anIsXDimension ) // 1D only if mesh is along OX if ( anIsYDimension ) { - aMeshDimension = 2; + aSpaceDim = 2; anIsXDimension = true; } else { - aMeshDimension = 3; + aSpaceDim = 3; } } SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(); - switch(aMeshDimension){ + switch(aSpaceDim){ case 3: - aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXYZGetCoord,aXYZName)); - break; + aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXYZGetCoord,aXYZName)); + break; case 2: - if(anIsXDimension && anIsYDimension) - aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXYGetCoord,aXYName)); - if(anIsYDimension && anIsZDimension) - aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aYZGetCoord,aYZName)); - if(anIsXDimension && anIsZDimension) - aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXZGetCoord,aXZName)); - break; + if(anIsXDimension && anIsYDimension) + aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXYGetCoord,aXYName)); + if(anIsYDimension && anIsZDimension) + aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aYZGetCoord,aYZName)); + if(anIsXDimension && anIsZDimension) + aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXZGetCoord,aXZName)); + break; case 1: - if(anIsXDimension) - aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXGetCoord,aXName)); - if(anIsYDimension) - aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aYGetCoord,aYName)); - if(anIsZDimension) - aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aZGetCoord,aZName)); - break; + if(anIsXDimension) + aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXGetCoord,aXName)); + if(anIsYDimension) + aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aYGetCoord,aYName)); + if(anIsZDimension) + aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aZGetCoord,aZName)); + break; } } - + TInt aMeshDimension = 0; + if ( myMesh->NbEdges() > 0 ) + aMeshDimension = 1; + if ( myMesh->NbFaces() > 0 ) + aMeshDimension = 2; + if ( myMesh->NbVolumes() > 0 ) + aMeshDimension = 3; - PMeshInfo aMeshInfo = myMed->CrMeshInfo(aMeshDimension,aMeshName); + PMeshInfo aMeshInfo = myMed->CrMeshInfo(aSpaceDim,aMeshName); + aMeshInfo->myMeshDim = aMeshDimension; MESSAGE("Add - aMeshName : "<GetName()); myMed->SetMeshInfo(aMeshInfo); // Storing SMDS groups and sub-meshes as med families //---------------------------------------------------- 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(); @@ -490,8 +501,8 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() { // coordinates TCoordSlice aTCoordSlice = aNodeInfo->GetCoordSlice( iNode ); - for(TInt iCoord = 0; iCoord < aMeshDimension; iCoord++){ - aTCoordSlice[iCoord] = aCoordHelperPtr->GetCoord(iCoord); + for(TInt iCoord = 0; iCoord < aSpaceDim; iCoord++){ + aTCoordSlice[iCoord] = aCoordHelperPtr->GetCoord(iCoord); } // node number int aNodeID = aCoordHelperPtr->GetID(); @@ -507,7 +518,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() anElemFamMap.Clear(); // coordinate names and units - for (TInt iCoord = 0; iCoord < aMeshDimension; iCoord++) { + for (TInt iCoord = 0; iCoord < aSpaceDim; iCoord++) { aNodeInfo->SetCoordName( iCoord, aCoordHelperPtr->GetName(iCoord)); aNodeInfo->SetCoordUnit( iCoord, aCoordHelperPtr->GetUnit(iCoord)); } @@ -533,6 +544,13 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() list< TElemTypeData > aTElemTypeDatas; EEntiteMaillage anEntity = eMAILLE; +#ifdef _ELEMENTS_BY_DIM_ + anEntity = eNOEUD_ELEMENT; +#endif + aTElemTypeDatas.push_back(TElemTypeData(anEntity, + ePOINT1, + nbElemInfo.Nb0DElements(), + SMDSAbs_0DElement)); #ifdef _ELEMENTS_BY_DIM_ anEntity = eARETE; #endif @@ -635,6 +653,10 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() 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;