23365: [CEA 1938] Export med from a xao file fails

Support multiple components
This commit is contained in:
eap 2016-10-25 17:48:54 +03:00
parent eef0bf5cc7
commit 189e207e89

View File

@ -3283,8 +3283,8 @@ void SMESH_Mesh_i::exportMEDFields( DriverMED_W_Field& fieldWriter,
( !geomAssocFields || !geomAssocFields[0] )) ( !geomAssocFields || !geomAssocFields[0] ))
return; return;
std::vector< double > dblVals( meshDS->MaxShapeIndex()+1 ); std::vector< std::vector< double > > dblVals;
std::vector< int > intVals( meshDS->MaxShapeIndex()+1 ); std::vector< std::vector< int > > intVals;
std::vector< int > subIdsByDim[ 4 ]; std::vector< int > subIdsByDim[ 4 ];
const double noneDblValue = 0.; const double noneDblValue = 0.;
const double noneIntValue = 0; const double noneIntValue = 0;
@ -3325,6 +3325,9 @@ void SMESH_Mesh_i::exportMEDFields( DriverMED_W_Field& fieldWriter,
for ( size_t iC = 0; iC < comps->length(); ++iC ) for ( size_t iC = 0; iC < comps->length(); ++iC )
fieldWriter.SetCompName( iC, comps[ iC ].in() ); fieldWriter.SetCompName( iC, comps[ iC ].in() );
dblVals.resize( comps->length() );
intVals.resize( comps->length() );
// find sub-shape IDs // find sub-shape IDs
std::vector< int >& subIds = subIdsByDim[ dim ]; std::vector< int >& subIds = subIdsByDim[ dim ];
@ -3350,6 +3353,17 @@ void SMESH_Mesh_i::exportMEDFields( DriverMED_W_Field& fieldWriter,
fieldWriter.SetDtIt( int( stamp ), int( id )); fieldWriter.SetDtIt( int( stamp ), int( id ));
// fill dblVals or intVals // fill dblVals or intVals
for ( size_t iC = 0; iC < comps->length(); ++iC )
if ( dataType == GEOM::FDT_Double )
{
dblVals[ iC ].clear();
dblVals[ iC ].resize( meshDS->MaxShapeIndex()+1, 0 );
}
else
{
intVals[ iC ].clear();
intVals[ iC ].resize( meshDS->MaxShapeIndex()+1, 0 );
}
switch ( dataType ) switch ( dataType )
{ {
case GEOM::FDT_Double: case GEOM::FDT_Double:
@ -3357,10 +3371,11 @@ void SMESH_Mesh_i::exportMEDFields( DriverMED_W_Field& fieldWriter,
GEOM::GEOM_DoubleFieldStep_var dblStep = GEOM::GEOM_DoubleFieldStep::_narrow( step ); GEOM::GEOM_DoubleFieldStep_var dblStep = GEOM::GEOM_DoubleFieldStep::_narrow( step );
if ( dblStep->_is_nil() ) continue; if ( dblStep->_is_nil() ) continue;
GEOM::ListOfDouble_var vv = dblStep->GetValues(); GEOM::ListOfDouble_var vv = dblStep->GetValues();
if ( vv->length() != subIds.size() ) if ( vv->length() != subIds.size() * comps->length() )
THROW_SALOME_CORBA_EXCEPTION( METH "BUG: wrong nb subIds", SALOME::INTERNAL_ERROR ); THROW_SALOME_CORBA_EXCEPTION( METH "BUG: wrong nb subIds", SALOME::INTERNAL_ERROR );
for ( size_t i = 0; i < vv->length(); ++i ) for ( size_t iS = 0, iV = 0; iS < subIds.size(); ++iS )
dblVals[ subIds[ i ]] = vv[ i ]; for ( size_t iC = 0; iC < comps->length(); ++iC )
dblVals[ iC ][ subIds[ iS ]] = vv[ iV++ ];
break; break;
} }
case GEOM::FDT_Int: case GEOM::FDT_Int:
@ -3368,10 +3383,11 @@ void SMESH_Mesh_i::exportMEDFields( DriverMED_W_Field& fieldWriter,
GEOM::GEOM_IntFieldStep_var intStep = GEOM::GEOM_IntFieldStep::_narrow( step ); GEOM::GEOM_IntFieldStep_var intStep = GEOM::GEOM_IntFieldStep::_narrow( step );
if ( intStep->_is_nil() ) continue; if ( intStep->_is_nil() ) continue;
GEOM::ListOfLong_var vv = intStep->GetValues(); GEOM::ListOfLong_var vv = intStep->GetValues();
if ( vv->length() != subIds.size() ) if ( vv->length() != subIds.size() * comps->length() )
THROW_SALOME_CORBA_EXCEPTION( METH "BUG: wrong nb subIds", SALOME::INTERNAL_ERROR ); THROW_SALOME_CORBA_EXCEPTION( METH "BUG: wrong nb subIds", SALOME::INTERNAL_ERROR );
for ( size_t i = 0; i < vv->length(); ++i ) for ( size_t iS = 0, iV = 0; iS < subIds.size(); ++iS )
intVals[ subIds[ i ]] = (int) vv[ i ]; for ( size_t iC = 0; iC < comps->length(); ++iC )
intVals[ iC ][ subIds[ iS ]] = (int) vv[ iV++ ];
break; break;
} }
case GEOM::FDT_Bool: case GEOM::FDT_Bool:
@ -3379,10 +3395,11 @@ void SMESH_Mesh_i::exportMEDFields( DriverMED_W_Field& fieldWriter,
GEOM::GEOM_BoolFieldStep_var boolStep = GEOM::GEOM_BoolFieldStep::_narrow( step ); GEOM::GEOM_BoolFieldStep_var boolStep = GEOM::GEOM_BoolFieldStep::_narrow( step );
if ( boolStep->_is_nil() ) continue; if ( boolStep->_is_nil() ) continue;
GEOM::short_array_var vv = boolStep->GetValues(); GEOM::short_array_var vv = boolStep->GetValues();
if ( vv->length() != subIds.size() ) if ( vv->length() != subIds.size() * comps->length() )
THROW_SALOME_CORBA_EXCEPTION( METH "BUG: wrong nb subIds", SALOME::INTERNAL_ERROR ); THROW_SALOME_CORBA_EXCEPTION( METH "BUG: wrong nb subIds", SALOME::INTERNAL_ERROR );
for ( size_t i = 0; i < vv->length(); ++i ) for ( size_t iS = 0, iV = 0; iS < subIds.size(); ++iS )
intVals[ subIds[ i ]] = (int) vv[ i ]; for ( size_t iC = 0; iC < comps->length(); ++iC )
intVals[ iC ][ subIds[ iS ]] = (int) vv[ iV++ ];
break; break;
} }
default: continue; default: continue;
@ -3395,20 +3412,24 @@ void SMESH_Mesh_i::exportMEDFields( DriverMED_W_Field& fieldWriter,
{ {
const SMDS_MeshElement* e = elemIt->next(); const SMDS_MeshElement* e = elemIt->next();
const int shapeID = e->getshapeId(); const int shapeID = e->getshapeId();
if ( shapeID < 1 || shapeID >= (int) dblVals.size() ) if ( shapeID < 1 || shapeID >= (int) dblVals[0].size() )
for ( size_t iC = 0; iC < comps->length(); ++iC )
fieldWriter.AddValue( noneDblValue ); fieldWriter.AddValue( noneDblValue );
else else
fieldWriter.AddValue( dblVals[ shapeID ]); for ( size_t iC = 0; iC < comps->length(); ++iC )
fieldWriter.AddValue( dblVals[ iC ][ shapeID ]);
} }
else else
while ( elemIt->more() ) while ( elemIt->more() )
{ {
const SMDS_MeshElement* e = elemIt->next(); const SMDS_MeshElement* e = elemIt->next();
const int shapeID = e->getshapeId(); const int shapeID = e->getshapeId();
if ( shapeID < 1 || shapeID >= (int) intVals.size() ) if ( shapeID < 1 || shapeID >= (int) intVals[0].size() )
for ( size_t iC = 0; iC < comps->length(); ++iC )
fieldWriter.AddValue( (double) noneIntValue ); fieldWriter.AddValue( (double) noneIntValue );
else else
fieldWriter.AddValue( (double) intVals[ shapeID ]); for ( size_t iC = 0; iC < comps->length(); ++iC )
fieldWriter.AddValue( (double) intVals[ iC ][ shapeID ]);
} }
// write a step // write a step