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=30f3ac4a31223b8caaadccd4bba229b0aee15e02;hp=82722c15f3e4f327e412a593d228d6eaaa165c63;hb=6472eab132825fec572beda8276947593f85ffa1;hpb=51760fb76f57da9ab446585e6f87b101679c58cb diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx index 82722c15f..30f3ac4a3 100644 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2019 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 @@ -31,11 +31,12 @@ #include "MED_Factory.hxx" #include "MED_Utilities.hxx" #include "SMDS_IteratorOnIterators.hxx" -#include "SMDS_MeshElement.hxx" #include "SMDS_MeshNode.hxx" -#include "SMDS_PolyhedralVolumeOfNodes.hxx" #include "SMDS_SetIterator.hxx" #include "SMESHDS_Mesh.hxx" +#include "MED_Common.hxx" + +#include #include #include @@ -52,7 +53,6 @@ using namespace MED; DriverMED_W_SMESHDS_Mesh::DriverMED_W_SMESHDS_Mesh(): - myMedVersion(MED::eV2_2), myAllSubMeshes (false), myDoGroupOfNodes (false), myDoGroupOfEdges (false), @@ -62,19 +62,14 @@ DriverMED_W_SMESHDS_Mesh::DriverMED_W_SMESHDS_Mesh(): myDoGroupOfBalls(false), myAutoDimension(false), myAddODOnVertices(false), - myDoAllInGroups(false) + myDoAllInGroups(false), + myVersion(-1), + myZTolerance(-1.) {} -void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName, - MED::EVersion theId) -{ - Driver_SMESHDS_Mesh::SetFile(theFileName); - myMedVersion = theId; - //MESSAGE("myMedVersion:"<(majeur, mineur, release); + majeur=MED_MAJOR_NUM; + mineur=MED_MINOR_NUM; + release=MED_RELEASE_NUM; TInt imposedMineur = mineur; - switch( theVersion ) { - case MED::eV2_1 : - case MED::eV2_2 : - case MED::eLATEST : break; - case MED::eMINOR_0 : imposedMineur = 0; break; - case MED::eMINOR_1 : imposedMineur = 1; break; - case MED::eMINOR_2 : imposedMineur = 2; break; - case MED::eMINOR_3 : imposedMineur = 3; break; - case MED::eMINOR_4 : imposedMineur = 4; break; - case MED::eMINOR_5 : imposedMineur = 5; break; - case MED::eMINOR_6 : imposedMineur = 6; break; - case MED::eMINOR_7 : imposedMineur = 7; break; - case MED::eMINOR_8 : imposedMineur = 8; break; - case MED::eMINOR_9 : imposedMineur = 9; break; - case MED::eVUnknown : imposedMineur = mineur; break; - } - if (imposedMineur > mineur) + + if (theMinor < 0) imposedMineur = mineur; + else if (theMinor > MED_MINOR_NUM) + imposedMineur = mineur; + else + imposedMineur = theMinor; + ostringstream name; if ( theNbDigits > 0 ) name << majeur; @@ -360,10 +346,6 @@ namespace Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() { Status aResult = DRS_OK; - if (myMesh->hasConstructionEdges() || myMesh->hasConstructionFaces()) { - INFOS("SMDS_MESH with hasConstructionEdges() or hasConstructionFaces() do not supports!!!"); - return DRS_FAIL; - } try { //MESSAGE("Perform - myFile : "<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()); @@ -437,6 +419,8 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() 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; + if ( myZTolerance > 0 && anIsZDimension ) + anIsZDimension = (aBounds[5] > myZTolerance || aBounds[4] < -myZTolerance ); aSpaceDimension = Max( aMeshDimension, anIsXDimension + anIsYDimension + anIsZDimension ); if ( !aSpaceDimension ) aSpaceDimension = 3; @@ -454,7 +438,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() } } - SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(/*idInceasingOrder=*/true); + SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(); switch ( aSpaceDimension ) { case 3: aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXYZGetCoord,aXYZName)); @@ -477,8 +461,8 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() break; } } - //MESSAGE("myMedVersion:"<CrMeshInfo(aMeshDimension,aSpaceDimension,aMeshName); //MESSAGE("Add - aMeshName : "<GetName()); myMed->SetMeshInfo(aMeshInfo); @@ -570,6 +554,10 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() for(TInt iCoord = 0; iCoord < aSpaceDimension; iCoord++){ aTCoordSlice[iCoord] = aCoordHelperPtr->GetCoord(iCoord); } + if ( aSpaceDimension == 3 && + -myZTolerance < aTCoordSlice[2] && aTCoordSlice[2] < myZTolerance ) + aTCoordSlice[2] = 0.; + // node number int aNodeID = aCoordHelperPtr->GetID(); aNodeInfo->SetElemNum( iNode, aNodeID ); @@ -780,6 +768,13 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() continue; } + // build map of family numbers for this type + if ( !isElemFamMapBuilt[ aElemTypeData->_smdsType ]) + { + fillElemFamilyMap( anElemFamMap, aFamilies, aElemTypeData->_smdsType ); + isElemFamMapBuilt[ aElemTypeData->_smdsType ] = true; + } + // iterator on elements of a current type SMDS_ElemIteratorPtr elemIterator; int iElem = 0; @@ -850,18 +845,16 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() // Treat POLYEDREs // ---------------- - else if (aElemTypeData->_geomType == ePOLYEDRE ) + else if ( aElemTypeData->_geomType == ePOLYEDRE ) { elemIterator = myMesh->elementGeomIterator( SMDSGeom_POLYHEDRA ); - + if ( nbPolyhedronNodes == 0 ) { // Count nb of nodes 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(); + nbPolyhedronNodes += anElem->NbNodes(); + nbPolyhedronFaces += anElem->NbFaces(); if ( ++iElem == aElemTypeData->_nbElems ) break; } @@ -886,8 +879,8 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() TInt iFace = 0, iNode = 0; while ( elemIterator->more() ) { - const SMDS_MeshElement* anElem = elemIterator->next(); - const SMDS_VtkVolume *aPolyedre = dynamic_cast(anElem); + const SMDS_MeshElement* anElem = elemIterator->next(); + const SMDS_MeshVolume *aPolyedre = myMesh->DownCast< SMDS_MeshVolume >( anElem ); if ( !aPolyedre ) continue; // index TInt aNbFaces = aPolyedre->NbFaces(); @@ -930,13 +923,6 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() // 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() ) { @@ -976,12 +962,6 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() theConnMode, theIsElemNum, theIsElemNames); - // build map of family numbers for this type - if ( !isElemFamMapBuilt[ aElemTypeData->_smdsType ]) - { - fillElemFamilyMap( anElemFamMap, aFamilies, aElemTypeData->_smdsType ); - isElemFamMapBuilt[ aElemTypeData->_smdsType ] = true; - } TInt aNbNodes = MED::GetNbNodes(aElemTypeData->_geomType); elemIterator = myMesh->elementsIterator( aElemTypeData->_smdsType );