IPAL53097: At med export "Automatically define space dimension" does not work

This commit is contained in:
eap 2016-03-11 18:17:39 +03:00
parent a1a6d5ddc1
commit 77ab849209

View File

@ -37,6 +37,10 @@
#include "SMDS_SetIterator.hxx" #include "SMDS_SetIterator.hxx"
#include "SMESHDS_Mesh.hxx" #include "SMESHDS_Mesh.hxx"
#include <BRep_Tool.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
#include <utilities.h> #include <utilities.h>
@ -356,11 +360,28 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
} }
double EPS = 1.0E-7; 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; anIsXDimension = (aBounds[1] - aBounds[0]) + abs(aBounds[1]) + abs(aBounds[0]) > EPS;
anIsYDimension = (aBounds[3] - aBounds[2]) + abs(aBounds[3]) + abs(aBounds[2]) > 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; anIsZDimension = (aBounds[5] - aBounds[4]) + abs(aBounds[5]) + abs(aBounds[4]) > EPS;
aSpaceDimension = anIsXDimension + anIsYDimension + anIsZDimension; aSpaceDimension = anIsXDimension + anIsYDimension + anIsZDimension;
if(!aSpaceDimension) if ( !aSpaceDimension )
aSpaceDimension = 3; aSpaceDimension = 3;
// PAL16857(SMESH not conform to the MED convention): // PAL16857(SMESH not conform to the MED convention):
if ( aSpaceDimension == 2 && anIsZDimension ) // 2D only if mesh is in XOY plane if ( aSpaceDimension == 2 && anIsZDimension ) // 2D only if mesh is in XOY plane
@ -377,7 +398,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
} }
SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(/*idInceasingOrder=*/true); SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(/*idInceasingOrder=*/true);
switch(aSpaceDimension){ switch ( aSpaceDimension ) {
case 3: case 3:
aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXYZGetCoord,aXYZName)); aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXYZGetCoord,aXYZName));
break; break;
@ -444,7 +465,8 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
myDoGroupOfVolumes && nbVolumes, myDoGroupOfVolumes && nbVolumes,
myDoGroupOf0DElems && nb0DElements, myDoGroupOf0DElems && nb0DElements,
myDoGroupOfBalls && nbBalls); myDoGroupOfBalls && nbBalls);
} else { }
else {
aFamilies = DriverMED_Family::MakeFamilies aFamilies = DriverMED_Family::MakeFamilies
(getIterator( mySubMeshes ), myGroups, (getIterator( mySubMeshes ), myGroups,
myDoGroupOfNodes && nbNodes, myDoGroupOfNodes && nbNodes,
@ -477,7 +499,6 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
PNodeInfo aNodeInfo = myMed->CrNodeInfo(aMeshInfo, aNbNodes, PNodeInfo aNodeInfo = myMed->CrNodeInfo(aMeshInfo, aNbNodes,
theMode, theSystem, theIsElemNum, theIsElemNames); theMode, theSystem, theIsElemNum, theIsElemNames);
//cout << " fillElemFamilyMap( SMDSAbs_Node )" << endl;
// find family numbers for nodes // find family numbers for nodes
TElemFamilyMap anElemFamMap; TElemFamilyMap anElemFamMap;
fillElemFamilyMap( anElemFamMap, aFamilies, SMDSAbs_Node ); fillElemFamilyMap( anElemFamMap, aFamilies, SMDSAbs_Node );
@ -687,21 +708,11 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
int defaultFamilyId = 0; int defaultFamilyId = 0;
switch ( aElemTypeData->_smdsType ) { switch ( aElemTypeData->_smdsType ) {
case SMDSAbs_0DElement: case SMDSAbs_0DElement: defaultFamilyId = my0DElementsDefaultFamilyId; break;
defaultFamilyId = my0DElementsDefaultFamilyId; case SMDSAbs_Ball: defaultFamilyId = myBallsDefaultFamilyId; break;
break; case SMDSAbs_Edge: defaultFamilyId = myEdgesDefaultFamilyId; break;
case SMDSAbs_Ball: case SMDSAbs_Face: defaultFamilyId = myFacesDefaultFamilyId; break;
defaultFamilyId = myBallsDefaultFamilyId; case SMDSAbs_Volume: defaultFamilyId = myVolumesDefaultFamilyId; break;
break;
case SMDSAbs_Edge:
defaultFamilyId = myEdgesDefaultFamilyId;
break;
case SMDSAbs_Face:
defaultFamilyId = myFacesDefaultFamilyId;
break;
case SMDSAbs_Volume:
defaultFamilyId = myVolumesDefaultFamilyId;
break;
default: default:
continue; continue;
} }
@ -854,8 +865,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
else if (aElemTypeData->_geomType == eBALL ) else if (aElemTypeData->_geomType == eBALL )
{ {
// allocate data arrays // allocate data arrays
PBallInfo aBallInfo = myMed->CrBallInfo( aMeshInfo, PBallInfo aBallInfo = myMed->CrBallInfo( aMeshInfo, aElemTypeData->_nbElems );
aElemTypeData->_nbElems );
// build map of family numbers for this type // build map of family numbers for this type
if ( !isElemFamMapBuilt[ aElemTypeData->_smdsType ]) if ( !isElemFamMapBuilt[ aElemTypeData->_smdsType ])