X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FDriverMED%2FDriverMED_W_SMESHDS_Mesh.cxx;h=f31f262c03438b16bd4bcd561a227484f13ab973;hb=b5ebe3d272215cab7ba91694ec97f66a684662e3;hp=b4ab8dbe401b4a8caf9d5649d61359ea9f110ea3;hpb=193c49c87753b6ccabb2b5e6dc935aa480d2d43e;p=modules%2Fsmesh.git diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx index b4ab8dbe4..f31f262c0 100644 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -37,6 +37,10 @@ #include "SMDS_SetIterator.hxx" #include "SMESHDS_Mesh.hxx" +#include +#include +#include + #include @@ -56,7 +60,7 @@ DriverMED_W_SMESHDS_Mesh::DriverMED_W_SMESHDS_Mesh(): myDoGroupOfVolumes (false), myDoGroupOf0DElems(false), myDoGroupOfBalls(false), - myAutoDimension(true), + myAutoDimension(false), myAddODOnVertices(false) {} @@ -254,7 +258,6 @@ namespace const SMDSAbs_ElementType anElemType) { anElemFamMap.Clear(); - //anElemFamMap.clear(); list::iterator aFamsIter = aFamilies.begin(); while ( aFamsIter != aFamilies.end() ) { @@ -263,12 +266,11 @@ namespace } else { int aFamId = (*aFamsIter)->GetId(); - const set& anElems = (*aFamsIter)->GetElements(); - set::const_iterator anElemsIter = anElems.begin(); + const ElementsSet& anElems = (*aFamsIter)->GetElements(); + ElementsSet::const_iterator anElemsIter = anElems.begin(); for (; anElemsIter != anElems.end(); anElemsIter++) { anElemFamMap.Bind( (Standard_Address)*anElemsIter, aFamId ); - //anElemFamMap[*anElemsIter] = aFamId; } // remove a family from the list aFamilies.erase( aFamsIter++ ); @@ -288,9 +290,7 @@ namespace { if ( anElemFamMap.IsBound( (Standard_Address) anElement )) return anElemFamMap( (Standard_Address) anElement ); -// TElemFamilyMap::iterator elem_famNum = anElemFamMap.find( anElement ); -// if ( elem_famNum != anElemFamMap.end() ) -// return elem_famNum->second; + return aDefaultFamilyId; } @@ -317,7 +317,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() return DRS_FAIL; } try { - MESSAGE("Perform - myFile : "<NbEdges() > 0 ) + aMeshDimension = 1; + if ( myMesh->NbFaces() > 0 ) + aMeshDimension = 2; + if ( myMesh->NbVolumes() > 0 ) + aMeshDimension = 3; + TInt aSpaceDimension = 3; TCoordHelperPtr aCoordHelperPtr; { bool anIsXDimension = false; bool anIsYDimension = false; bool anIsZDimension = false; - if ( myAutoDimension ) + if ( myAutoDimension && aMeshDimension < 3 ) { SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(); double aBounds[6]; @@ -354,17 +363,34 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() 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; + TopoDS_Shape mainShape = myMesh->ShapeToMesh(); + bool hasShapeToMesh = ( myMesh->SubMeshIndices().size() > 1 ); + if ( !mainShape.IsNull() && hasShapeToMesh ) + { + // define EPS by max tolerance of the mainShape (IPAL53097) + TopExp_Explorer subShape; + for ( subShape.Init( mainShape, TopAbs_FACE ); subShape.More(); subShape.Next() ) { + EPS = Max( EPS, BRep_Tool::Tolerance( TopoDS::Face( subShape.Current() ))); + } + for ( subShape.Init( mainShape, TopAbs_EDGE ); subShape.More(); subShape.Next() ) { + EPS = Max( EPS, BRep_Tool::Tolerance( TopoDS::Edge( subShape.Current() ))); + } + for ( subShape.Init( mainShape, TopAbs_VERTEX ); subShape.More(); subShape.Next() ) { + EPS = Max( EPS, BRep_Tool::Tolerance( TopoDS::Vertex( subShape.Current() ))); + } + EPS *= 2.; + } 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 = Max( aMeshDimension, anIsXDimension + anIsYDimension + anIsZDimension ); + if ( !aSpaceDimension ) aSpaceDimension = 3; // PAL16857(SMESH not conform to the MED convention): if ( aSpaceDimension == 2 && anIsZDimension ) // 2D only if mesh is in XOY plane @@ -381,7 +407,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() } SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(/*idInceasingOrder=*/true); - switch(aSpaceDimension){ + switch ( aSpaceDimension ) { case 3: aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXYZGetCoord,aXYZName)); break; @@ -403,17 +429,10 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() break; } } - TInt aMeshDimension = 0; - if ( myMesh->NbEdges() > 0 ) - aMeshDimension = 1; - if ( myMesh->NbFaces() > 0 ) - aMeshDimension = 2; - if ( myMesh->NbVolumes() > 0 ) - aMeshDimension = 3; MED::PWrapper myMed = CrWrapper(myFile,myMedVersion); PMeshInfo aMeshInfo = myMed->CrMeshInfo(aMeshDimension,aSpaceDimension,aMeshName); - MESSAGE("Add - aMeshName : "<GetName()); + //MESSAGE("Add - aMeshName : "<GetName()); myMed->SetMeshInfo(aMeshInfo); // Storing SMDS groups and sub-meshes as med families @@ -437,7 +456,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() if (myDoGroupOf0DElems && nb0DElements) my0DElementsDefaultFamilyId = REST_0DELEM_FAMILY; if (myDoGroupOfBalls && nbBalls) myBallsDefaultFamilyId = REST_BALL_FAMILY; - MESSAGE("Perform - aFamilyInfo"); + //MESSAGE("Perform - aFamilyInfo"); list aFamilies; if (myAllSubMeshes) { aFamilies = DriverMED_Family::MakeFamilies @@ -448,7 +467,8 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() myDoGroupOfVolumes && nbVolumes, myDoGroupOf0DElems && nb0DElements, myDoGroupOfBalls && nbBalls); - } else { + } + else { aFamilies = DriverMED_Family::MakeFamilies (getIterator( mySubMeshes ), myGroups, myDoGroupOfNodes && nbNodes, @@ -481,7 +501,6 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() PNodeInfo aNodeInfo = myMed->CrNodeInfo(aMeshInfo, aNbNodes, theMode, theSystem, theIsElemNum, theIsElemNames); - //cout << " fillElemFamilyMap( SMDSAbs_Node )" << endl; // find family numbers for nodes TElemFamilyMap anElemFamMap; fillElemFamilyMap( anElemFamMap, aFamilies, SMDSAbs_Node ); @@ -512,8 +531,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() aNodeInfo->SetCoordUnit( iCoord, aCoordHelperPtr->GetUnit(iCoord)); } - //cout << " SetNodeInfo(aNodeInfo)" << endl; - MESSAGE("Perform - aNodeInfo->GetNbElem() = "<GetNbElem() = "<SetNodeInfo(aNodeInfo); aNodeInfo.reset(); // free memory used for arrays @@ -525,7 +543,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() const SMDS_MeshInfo& nbElemInfo = myMesh->GetMeshInfo(); // poly elements are not supported by med-2.1 - bool polyTypesSupported = myMed->CrPolygoneInfo(aMeshInfo,eMAILLE,ePOLYGONE,0,0); + bool polyTypesSupported = ( myMed->CrPolygoneInfo(aMeshInfo,eMAILLE,ePOLYGONE,0,0).get() != 0 ); TInt nbPolygonNodes = 0, nbPolyhedronNodes = 0, nbPolyhedronFaces = 0; // nodes on VERTEXes where 0D elements are absent @@ -691,21 +709,11 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() int defaultFamilyId = 0; switch ( aElemTypeData->_smdsType ) { - case SMDSAbs_0DElement: - defaultFamilyId = my0DElementsDefaultFamilyId; - break; - case SMDSAbs_Ball: - defaultFamilyId = myBallsDefaultFamilyId; - break; - case SMDSAbs_Edge: - defaultFamilyId = myEdgesDefaultFamilyId; - break; - case SMDSAbs_Face: - defaultFamilyId = myFacesDefaultFamilyId; - break; - case SMDSAbs_Volume: - defaultFamilyId = myVolumesDefaultFamilyId; - break; + case SMDSAbs_0DElement: defaultFamilyId = my0DElementsDefaultFamilyId; break; + case SMDSAbs_Ball: defaultFamilyId = myBallsDefaultFamilyId; break; + case SMDSAbs_Edge: defaultFamilyId = myEdgesDefaultFamilyId; break; + case SMDSAbs_Face: defaultFamilyId = myFacesDefaultFamilyId; break; + case SMDSAbs_Volume: defaultFamilyId = myVolumesDefaultFamilyId; break; default: continue; } @@ -787,7 +795,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() if ( nbPolyhedronNodes == 0 ) { // Count nb of nodes while ( elemIterator->more() ) { - const SMDS_MeshElement* anElem = elemIterator->next(); + const SMDS_MeshElement* anElem = elemIterator->next(); const SMDS_VtkVolume *aPolyedre = dynamic_cast(anElem); if ( !aPolyedre ) continue; nbPolyhedronNodes += aPolyedre->NbNodes(); @@ -816,7 +824,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() TInt iFace = 0, iNode = 0; while ( elemIterator->more() ) { - const SMDS_MeshElement* anElem = elemIterator->next(); + const SMDS_MeshElement* anElem = elemIterator->next(); const SMDS_VtkVolume *aPolyedre = dynamic_cast(anElem); if ( !aPolyedre ) continue; // index @@ -858,8 +866,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() else if (aElemTypeData->_geomType == eBALL ) { // allocate data arrays - PBallInfo aBallInfo = myMed->CrBallInfo( aMeshInfo, - aElemTypeData->_nbElems ); + PBallInfo aBallInfo = myMed->CrBallInfo( aMeshInfo, aElemTypeData->_nbElems ); // build map of family numbers for this type if ( !isElemFamMapBuilt[ aElemTypeData->_smdsType ])