X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FDriverMED%2FDriverMED_W_SMESHDS_Mesh.cxx;h=2ba1663cd8acd09e7e5cfe4bcccad63215ada5d5;hb=86b667c6a5f16806d4cebf72ecaab0d6ab5b6546;hp=8afbd565946986776352cb5154ae3b755f9c036e;hpb=4592fecfcf7f19fbb7650f63c49947e0ac9b108b;p=modules%2Fsmesh.git diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx index 8afbd5659..2ba1663cd 100644 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx @@ -1,24 +1,25 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2011 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 +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // SMESH DriverMED : driver to read and write 'med' files // File : DriverMED_W_SMESHDS_Mesh.cxx // Module : SMESH @@ -26,7 +27,6 @@ #include #include "DriverMED_W_SMESHDS_Mesh.h" -#include "DriverMED_W_SMDS_Mesh.h" #include "DriverMED_Family.h" #include "SMESHDS_Mesh.hxx" @@ -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); @@ -69,9 +69,9 @@ string DriverMED_W_SMESHDS_Mesh::GetVersionString(const MED::EVersion theVersion { TInt majeur, mineur, release; majeur = mineur = release = 0; - if ( theVersion == eV2_1 ) - MED::GetVersionRelease(majeur, mineur, release); - else +// if ( theVersion == eV2_1 ) +// MED::GetVersionRelease(majeur, mineur, release); +// else MED::GetVersionRelease(majeur, mineur, release); ostringstream name; if ( theNbDigits > 0 ) @@ -83,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); @@ -189,9 +184,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 +195,7 @@ namespace{ virtual ~TCoordHelper(){} bool Next(){ return myNodeIter->more() && - (myCurrentNode = myNodeIter->next()); + (myCurrentNode = myNodeIter->next()); } const SMDS_MeshNode* GetNode(){ return myCurrentNode; @@ -345,79 +340,86 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() } // Mesh dimension definition - TInt aMeshDimension; + TInt aSpaceDimension; 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; + aSpaceDimension = anIsXDimension + anIsYDimension + anIsZDimension; + if(!aSpaceDimension) + aSpaceDimension = 3; // PAL16857(SMESH not conform to the MED convention): - if ( aMeshDimension == 2 && anIsZDimension ) // 2D only if mesh is in XOY plane - aMeshDimension = 3; + if ( aSpaceDimension == 2 && anIsZDimension ) // 2D only if mesh is in XOY plane + aSpaceDimension = 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 ( aSpaceDimension == 1 && !anIsXDimension ) {// 1D only if mesh is along OX if ( anIsYDimension ) { - aMeshDimension = 2; + aSpaceDimension = 2; anIsXDimension = true; } else { - aMeshDimension = 3; + aSpaceDimension = 3; } + } } - SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(); - switch(aMeshDimension){ + SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(/*idInceasingOrder=*/true); + switch(aSpaceDimension){ 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(aMeshDimension,aSpaceDimension,aMeshName); MESSAGE("Add - aMeshName : "<GetName()); myMed->SetMeshInfo(aMeshInfo); @@ -429,7 +431,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() int myFacesDefaultFamilyId = 0; int myVolumesDefaultFamilyId = 0; int nbNodes = myMesh->NbNodes(); - int nb0DElements = myMesh->Nb0DElements(); + //int nb0DElements = myMesh->Nb0DElements(); int nbEdges = myMesh->NbEdges(); int nbFaces = myMesh->NbFaces(); int nbVolumes = myMesh->NbVolumes(); @@ -494,8 +496,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 < aSpaceDimension; iCoord++){ + aTCoordSlice[iCoord] = aCoordHelperPtr->GetCoord(iCoord); } // node number int aNodeID = aCoordHelperPtr->GetID(); @@ -511,7 +513,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 < aSpaceDimension; iCoord++) { aNodeInfo->SetCoordName( iCoord, aCoordHelperPtr->GetName(iCoord)); aNodeInfo->SetCoordUnit( iCoord, aCoordHelperPtr->GetUnit(iCoord)); } @@ -621,6 +623,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() nbElemInfo.NbHexas( ORDER_QUADRATIC ), SMDSAbs_Volume)); if ( polyTypesSupported ) { + //MESSAGE("polyTypesSupported"); aTElemTypeDatas.push_back( TElemTypeData(anEntity, ePOLYEDRE, nbElemInfo.NbPolyhedrons(), @@ -737,18 +740,21 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() // ---------------- else if (aElemTypeData->_geomType == ePOLYEDRE ) { + //MESSAGE("_geomType == ePOLYEDRE"); if ( nbPolyhedronNodes == 0 ) { // Count nb of nodes while ( const SMDS_MeshElement* anElem = elemIterator->next() ) { - const SMDS_PolyhedralVolumeOfNodes* aPolyedre = - dynamic_cast( anElem ); - if ( aPolyedre ) { + const SMDS_VtkVolume *aPolyedre = dynamic_cast(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 @@ -770,19 +776,22 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() TInt iFace = 0, iNode = 0; while ( const SMDS_MeshElement* anElem = elemIterator->next() ) { - const SMDS_PolyhedralVolumeOfNodes* aPolyedre = - dynamic_cast( anElem ); + const SMDS_VtkVolume *aPolyedre = dynamic_cast(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(); @@ -790,8 +799,10 @@ 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; } @@ -867,11 +878,11 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() } catch(const std::exception& exc) { - INFOS("Follow exception was cought:\n\t"<