0020511: EDF 1101 SMESH : Add CGNS to Mesh Format Supported

This commit is contained in:
eap 2011-08-10 10:33:38 +00:00
parent 8fd7836b55
commit 52749e3d7f
9 changed files with 402 additions and 118 deletions

View File

@ -0,0 +1,98 @@
dnl Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
dnl
dnl Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
dnl
dnl This library is free software; you can redistribute it and/or
dnl modify it under the terms of the GNU Lesser General Public
dnl License as published by the Free Software Foundation; either
dnl version 2.1 of the License.
dnl
dnl This library is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
dnl Lesser General Public License for more details.
dnl
dnl You should have received a copy of the GNU Lesser General Public
dnl License along with this library; if not, write to the Free Software
dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
dnl
dnl See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
dnl
AC_DEFUN([CHECK_CGNS],[
AC_REQUIRE([AC_PROG_CC])dnl
AC_REQUIRE([AC_PROG_CPP])dnl
AC_REQUIRE([CHECK_HDF5])dnl
AC_CHECKING(for CGNS)
AC_ARG_WITH(cgns,
[ --with-cgns=DIR root directory path to CGNS installation ],
[CGNSHOME="$withval"
AC_MSG_RESULT("select $withval as path to CGNS")
])
AC_SUBST(CGNS_INCLUDES)
AC_SUBST(CGNS_LIBS)
CGNS_INCLUDES=""
CGNS_LIBS=""
cgns_ok=no
LOCAL_INCLUDES=""
LOCAL_LIBS="-lcgns $HDF5_LIBS"
if test -z $CGNSHOME
then
AC_MSG_WARN(undefined CGNSHOME variable which specify CGNS library installation directory)
AC_PATH_PROG(BINDIR, cgnsversion)
if test "x$BINDIR" != "x" ; then
CGNSHOME=$BINDIR
CGNSHOME=`echo ${CGNSHOME} | sed -e "s,[[^/]]*$,,;s,/$,,;s,^$,.,"`
CGNSHOME=`echo ${CGNSHOME} | sed -e "s,[[^/]]*$,,;s,/$,,;s,^$,.,"`
fi
fi
if test ! -z $CGNSHOME
then
LOCAL_INCLUDES="-I$CGNSHOME/include"
if test "x$CGNSHOME" != "x/usr"; then
LOCAL_LIBS="-L$CGNSHOME/lib $LOCAL_LIBS"
fi
fi
dnl check cgnslib header
CPPFLAGS_old=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $LOCAL_INCLUDES"
AC_CHECK_HEADER(cgnslib.h,cgns_ok=yes ,cgns_ok=no)
CPPFLAGS=$CPPFLAGS_old
if test "x$cgns_ok" = "xyes"
then
dnl check cgns library
LIBS_old="$LIBS"
LIBS="$LIBS $LOCAL_LIBS"
AC_CHECK_LIB(cgns,cg_open,cgns_ok=yes,cgns_ok=no)
LIBS="$LIBS_old"
fi
if test "x$cgns_ok" = "xyes"
then
CGNS_LIBS="$LOCAL_LIBS"
CGNS_INCLUDES="$LOCAL_INCLUDES"
#CPPFLAGS="-DWITH_CGNS $CPPFLAGS"
fi
AC_MSG_RESULT(for CGNS: $cgns_ok)
#AM_CONDITIONAL(WITH_CGNS, [test x"$cgns_ok" = xyes])
])dnl

View File

@ -392,6 +392,14 @@ CHECK_MED
CHECK_PLATFORM CHECK_PLATFORM
echo
echo ---------------------------------------------
echo Testing CGNS library
echo ---------------------------------------------
echo
CHECK_CGNS
echo echo
echo --------------------------------------------- echo ---------------------------------------------
echo Summary echo Summary
@ -401,11 +409,11 @@ echo
echo Configure echo Configure
if test "${gui_ok}" = "yes"; then if test "${gui_ok}" = "yes"; then
variables="cc_ok fortran_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok OpenGL_ok qt_ok vtk_ok hdf5_ok omniORB_ok occ_ok doxygen_ok graphviz_ok sphinx_ok qwt_ok Kernel_ok Geom_ok Med_ok gui_ok" variables="cc_ok fortran_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok OpenGL_ok qt_ok vtk_ok hdf5_ok cgns_ok omniORB_ok occ_ok doxygen_ok graphviz_ok sphinx_ok qwt_ok Kernel_ok Geom_ok Med_ok gui_ok"
elif test "${SalomeGUI_need}" != "no"; then elif test "${SalomeGUI_need}" != "no"; then
variables="cc_ok fortran_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok vtk_ok hdf5_ok med2_ok omniORB_ok occ_ok doxygen_ok graphviz_ok sphinx_ok Kernel_ok Geom_ok Med_ok gui_ok" variables="cc_ok fortran_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok vtk_ok hdf5_ok cgns_ok med2_ok omniORB_ok occ_ok doxygen_ok graphviz_ok sphinx_ok Kernel_ok Geom_ok Med_ok gui_ok"
else else
variables="cc_ok fortran_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok vtk_ok hdf5_ok med2_ok omniORB_ok occ_ok doxygen_ok graphviz_ok sphinx_ok Kernel_ok Geom_ok Med_ok" variables="cc_ok fortran_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok vtk_ok hdf5_ok cgns_ok med2_ok omniORB_ok occ_ok doxygen_ok graphviz_ok sphinx_ok Kernel_ok Geom_ok Med_ok"
fi fi
for var in $variables for var in $variables
@ -492,11 +500,13 @@ AC_OUTPUT([ \
src/DriverMED/Makefile \ src/DriverMED/Makefile \
src/DriverSTL/Makefile \ src/DriverSTL/Makefile \
src/DriverUNV/Makefile \ src/DriverUNV/Makefile \
src/DriverCGNS/Makefile \
src/MEFISTO2/Makefile \ src/MEFISTO2/Makefile \
src/OBJECT/Makefile \ src/OBJECT/Makefile \
src/PluginUtils/Makefile \ src/PluginUtils/Makefile \
src/SMDS/Makefile \ src/SMDS/Makefile \
src/SMESH/Makefile \ src/SMESH/Makefile \
src/SMESHUtils/Makefile \
src/SMESHClient/Makefile \ src/SMESHClient/Makefile \
src/SMESHDS/Makefile \ src/SMESHDS/Makefile \
src/SMESHFiltersSelection/Makefile \ src/SMESHFiltersSelection/Makefile \

View File

@ -221,6 +221,13 @@ module SMESH
SMESH_Mesh CreateMeshesFromSTL( in string theFileName ) SMESH_Mesh CreateMeshesFromSTL( in string theFileName )
raises ( SALOME::SALOME_Exception ); raises ( SALOME::SALOME_Exception );
/*!
* Create Mesh object(s) importing data from given CGNS file
*/
mesh_array CreateMeshesFromCGNS( in string theFileName,
out SMESH::DriverMED_ReadStatus theStatus )
raises ( SALOME::SALOME_Exception );
/*! /*!
* Create a mesh by copying a part of another mesh * Create a mesh by copying a part of another mesh
* \param meshPart - a part of mesh to copy * \param meshPart - a part of mesh to copy

View File

@ -617,6 +617,9 @@ module SMESH
void ExportUNV( in string file ) raises (SALOME::SALOME_Exception); void ExportUNV( in string file ) raises (SALOME::SALOME_Exception);
void ExportSTL( in string file, void ExportSTL( in string file,
in boolean isascii ) raises (SALOME::SALOME_Exception); in boolean isascii ) raises (SALOME::SALOME_Exception);
void ExportCGNS( in SMESH_IDSource meshPart,
in string file,
in boolean overwrite ) raises (SALOME::SALOME_Exception);
void ExportPartToDAT( in SMESH_IDSource meshPart, void ExportPartToDAT( in SMESH_IDSource meshPart,
in string file ) raises (SALOME::SALOME_Exception); in string file ) raises (SALOME::SALOME_Exception);
void ExportPartToUNV( in SMESH_IDSource meshPart, void ExportPartToUNV( in SMESH_IDSource meshPart,

View File

@ -197,9 +197,12 @@
else if ( theCommandID == 111 ) { else if ( theCommandID == 111 ) {
filter.append( QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)" ); filter.append( QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)" );
} }
else if ( theCommandID == 140 ) { else if ( theCommandID == 115 ) {
filter.append( QObject::tr( "STL_ASCII_FILES_FILTER" ) + " (*.stl)" ); filter.append( QObject::tr( "STL_ASCII_FILES_FILTER" ) + " (*.stl)" );
} }
else if ( theCommandID == 116 ) {
filter.append( QObject::tr( "CGNS_FILES_FILTER" ) + " (*.cgns)" );
}
QString anInitialPath = ""; QString anInitialPath = "";
if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() ) if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
@ -249,7 +252,7 @@
} }
break; break;
} }
case 140: case 115:
{ {
// STL format // STL format
aMeshes->length( 1 ); aMeshes->length( 1 );
@ -260,6 +263,17 @@
} }
break; break;
} }
case 116:
{
// CGNS format
SMESH::DriverMED_ReadStatus res;
aMeshes = theComponentMesh->CreateMeshesFromCGNS( filename.toLatin1().constData(), res );
if ( res != SMESH::DRS_OK ) {
errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) );
}
break;
}
} }
} }
catch ( const SALOME::SALOME_Exception& S_ex ) { catch ( const SALOME::SALOME_Exception& S_ex ) {
@ -328,16 +342,24 @@
if( aSel ) if( aSel )
aSel->selectedObjects( selected ); aSel->selectedObjects( selected );
const bool isMED = ( theCommandID == 122 || theCommandID == 125 );
const bool isDAT = ( theCommandID == 121 || theCommandID == 124 );
const bool isUNV = ( theCommandID == 123 || theCommandID == 126 );
const bool isSTL = ( theCommandID == 140 || theCommandID == 141 );
const bool isCGNS= ( theCommandID == 142 || theCommandID == 143 );
// actually, the following condition can't be met (added for insurance) // actually, the following condition can't be met (added for insurance)
if( selected.Extent() == 0 || if( selected.Extent() == 0 ||
( selected.Extent() > 1 && theCommandID != 122 && theCommandID != 125 ) ) ( selected.Extent() > 1 && !isMED && !isSTL ))
return; return;
// get mesh object from selection and check duplication of their names
bool hasDuplicatedMeshNames = false; bool hasDuplicatedMeshNames = false;
QList< QPair< SMESH::SMESH_IDSource_var, QString > > aMeshList; QList< QPair< SMESH::SMESH_IDSource_var, QString > > aMeshList;
QList< QPair< SMESH::SMESH_IDSource_var, QString > >::iterator aMeshIter; QList< QPair< SMESH::SMESH_IDSource_var, QString > >::iterator aMeshIter;
SALOME_ListIteratorOfListIO It( selected ); SALOME_ListIteratorOfListIO It( selected );
for( ; It.More(); It.Next() ) { for( ; It.More(); It.Next() )
{
Handle(SALOME_InteractiveObject) anIObject = It.Value(); Handle(SALOME_InteractiveObject) anIObject = It.Value();
SMESH::SMESH_IDSource_var aMeshItem = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(anIObject); SMESH::SMESH_IDSource_var aMeshItem = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(anIObject);
if ( aMeshItem->_is_nil() ) { if ( aMeshItem->_is_nil() ) {
@ -349,7 +371,8 @@
QString aMeshName = anIObject->getName(); QString aMeshName = anIObject->getName();
// check for duplications // check for name duplications
if ( !hasDuplicatedMeshNames )
for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) { for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
if( aMeshName == (*aMeshIter).second ) { if( aMeshName == (*aMeshIter).second ) {
hasDuplicatedMeshNames = true; hasDuplicatedMeshNames = true;
@ -360,7 +383,7 @@
aMeshList.append( QPair< SMESH::SMESH_IDSource_var, QString >( aMeshItem, aMeshName ) ); aMeshList.append( QPair< SMESH::SMESH_IDSource_var, QString >( aMeshItem, aMeshName ) );
} }
if( hasDuplicatedMeshNames ) { if( hasDuplicatedMeshNames && isMED ) {
int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(), int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
QObject::tr("SMESH_WRN_WARNING"), QObject::tr("SMESH_WRN_WARNING"),
QObject::tr("SMESH_EXPORT_MED_DUPLICATED_MESH_NAMES"), QObject::tr("SMESH_EXPORT_MED_DUPLICATED_MESH_NAMES"),
@ -375,14 +398,7 @@
SMESH::SMESH_Mesh_var aMesh = aMeshOrGroup->GetMesh(); SMESH::SMESH_Mesh_var aMesh = aMeshOrGroup->GetMesh();
QString aMeshName = (*aMeshIter).second; QString aMeshName = (*aMeshIter).second;
QList<SALOMEDS::Color> aReservedColors; if ( isMED || isCGNS )
QString aFilter, aTitle = QObject::tr("SMESH_EXPORT_MESH");
QMap<QString, SMESH::MED_VERSION> aFilterMap;
QMap<QString, int> aFilterMapSTL;
switch ( theCommandID ) {
case 125:
case 122: // MED
{ {
// check for equal group names within each mesh // check for equal group names within each mesh
for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) { for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
@ -398,19 +414,10 @@
return; return;
} }
} }
//QString v21 (aMesh->GetVersionString(SMESH::MED_V2_1, 2));
QString v22 (aMesh->GetVersionString(SMESH::MED_V2_2, 2));
//aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v21 ) + " (*.med)", SMESH::MED_V2_1 );
aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v22 ) + " (*.med)", SMESH::MED_V2_2 );
} }
break; else if ( isUNV )
case 124:
case 121:
aFilter = QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)";
break;
case 126:
case 123: // UNV
{ {
// warn the user about presence of not supported elements
SMESH::long_array_var nbElems = aMeshOrGroup->GetMeshInfo(); SMESH::long_array_var nbElems = aMeshOrGroup->GetMeshInfo();
int nbPyramids = nbElems[ SMESH::Entity_Pyramid ] + nbElems[ SMESH::Entity_Quad_Pyramid ]; int nbPyramids = nbElems[ SMESH::Entity_Pyramid ] + nbElems[ SMESH::Entity_Quad_Pyramid ];
if ( nbPyramids > 0 ) { if ( nbPyramids > 0 ) {
@ -423,20 +430,10 @@
if (aRet != 0) if (aRet != 0)
return; return;
} }
aFilter = QObject::tr( "IDEAS_FILES_FILTER" ) + " (*.unv)";
}
break;
case 141:
{
// export STL
aFilterMapSTL.insert( QObject::tr( "STL_ASCII_FILES_FILTER" ) + " (*.stl)", 1 ); // 1 - ASCII mode
aFilterMapSTL.insert( QObject::tr( "STL_BIN_FILES_FILTER" ) + " (*.stl)", 0 ); // 0 - Binary mode
}
break;
default:
return;
} }
// Get parameters of export operation
QString aFilename; QString aFilename;
SMESH::MED_VERSION aFormat; SMESH::MED_VERSION aFormat;
// Init the parameters with the default values // Init the parameters with the default values
@ -447,22 +444,48 @@
toCreateGroups = resMgr->booleanValue( "SMESH", "auto_groups", false ); toCreateGroups = resMgr->booleanValue( "SMESH", "auto_groups", false );
bool toOverwrite = true; bool toOverwrite = true;
QString aFilter, aTitle = QObject::tr("SMESH_EXPORT_MESH");
QString anInitialPath = ""; QString anInitialPath = "";
if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() ) if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
anInitialPath = QDir::currentPath(); anInitialPath = QDir::currentPath();
if ( theCommandID != 122 && theCommandID != 125 && theCommandID != 141) // neither MED nor STL if ( isUNV || isDAT )
{ {
if ( isUNV )
aFilter = QObject::tr( "IDEAS_FILES_FILTER" ) + " (*.unv)";
else
aFilter = QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)";
if ( anInitialPath.isEmpty() ) anInitialPath = SUIT_FileDlg::getLastVisitedPath(); if ( anInitialPath.isEmpty() ) anInitialPath = SUIT_FileDlg::getLastVisitedPath();
aFilename = SUIT_FileDlg::getFileName(SMESHGUI::desktop(), aFilename = SUIT_FileDlg::getFileName(SMESHGUI::desktop(),
anInitialPath + QString("/") + aMeshName, anInitialPath + QString("/") + aMeshName,
aFilter, aTitle, false); aFilter, aTitle, false);
} }
else if(theCommandID == 141) // Export to STL else if ( isCGNS )// Export to CGNS
{ {
SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true );
fd->setWindowTitle( aTitle );
fd->setNameFilter( QObject::tr( "CGNS_FILES_FILTER" ) + " (*.cgns)" );
if ( !anInitialPath.isEmpty() )
fd->setDirectory( anInitialPath );
fd->selectFile(aMeshName);
SMESHGUI_FileValidator* fv = new SMESHGUI_FileValidator( fd );
fd->setValidator( fv );
if ( fd->exec() )
aFilename = fd->selectedFile();
toOverwrite = fv->isOverwrite();
delete fd;
}
else if ( isSTL ) // Export to STL
{
QMap<QString, int> aFilterMap;
aFilterMap.insert( QObject::tr( "STL_ASCII_FILES_FILTER" ) + " (*.stl)", 1 );
aFilterMap.insert( QObject::tr( "STL_BIN_FILES_FILTER" ) + " (*.stl)", 0 );
QStringList filters; QStringList filters;
QMap<QString, int>::const_iterator it = aFilterMapSTL.begin(); QMap<QString, int>::const_iterator it = aFilterMap.begin();
for ( ; it != aFilterMapSTL.end(); ++it ) for ( ; it != aFilterMap.end(); ++it )
filters.push_back( it.key() ); filters.push_back( it.key() );
SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true ); SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true );
@ -476,13 +499,19 @@
while (!is_ok) { while (!is_ok) {
if ( fd->exec() ) if ( fd->exec() )
aFilename = fd->selectedFile(); aFilename = fd->selectedFile();
aIsASCII_STL = (aFilterMapSTL[fd->selectedNameFilter()]) == 1 ? true: false; aIsASCII_STL = (aFilterMap[fd->selectedNameFilter()]) == 1 ? true: false;
is_ok = true; is_ok = true;
} }
delete fd; delete fd;
} }
else // Export to MED else if ( isMED ) // Export to MED
{ {
QMap<QString, SMESH::MED_VERSION> aFilterMap;
//QString v21 (aMesh->GetVersionString(SMESH::MED_V2_1, 2));
QString v22 (aMesh->GetVersionString(SMESH::MED_V2_2, 2));
//aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v21 ) + " (*.med)", SMESH::MED_V2_1 );
aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v22 ) + " (*.med)", SMESH::MED_V2_2 );
QStringList filters; QStringList filters;
QString aDefaultFilter; QString aDefaultFilter;
QMap<QString, SMESH::MED_VERSION>::const_iterator it = aFilterMap.begin(); QMap<QString, SMESH::MED_VERSION>::const_iterator it = aFilterMap.begin();
@ -583,6 +612,13 @@
toCreateGroups = fd->IsChecked(); toCreateGroups = fd->IsChecked();
delete fd; delete fd;
} }
else
{
return;
}
// Perform export
if ( !aFilename.isEmpty() ) { if ( !aFilename.isEmpty() ) {
// Check whether the file already exists and delete it if yes // Check whether the file already exists and delete it if yes
QFile aFile( aFilename ); QFile aFile( aFilename );
@ -591,20 +627,20 @@
SUIT_OverrideCursor wc; SUIT_OverrideCursor wc;
try { try {
bool Renumber = false; // Renumbering is not needed since SMDS redesign in V6.2.0 (Nov 2010)
// PAL 14172 : Check of we have to renumber or not from the preferences before export // bool Renumber = false;
if (resMgr) // // PAL 14172 : Check of we have to renumber or not from the preferences before export
Renumber= resMgr->booleanValue("SMESH","renumbering"); // if (resMgr)
if (Renumber){ // Renumber= resMgr->booleanValue("SMESH","renumbering");
SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor(); // if (Renumber){
aMeshEditor->RenumberNodes(); // SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
aMeshEditor->RenumberElements(); // aMeshEditor->RenumberNodes();
if ( SMESHGUI::automaticUpdate() ) // aMeshEditor->RenumberElements();
SMESH::UpdateView(); // if ( SMESHGUI::automaticUpdate() )
} // SMESH::UpdateView();
switch ( theCommandID ) { // }
case 125: if ( isMED )
case 122: {
aMeshIter = aMeshList.begin(); aMeshIter = aMeshList.begin();
for( int aMeshIndex = 0; aMeshIter != aMeshList.end(); aMeshIter++, aMeshIndex++ ) for( int aMeshIndex = 0; aMeshIter != aMeshList.end(); aMeshIter++, aMeshIndex++ )
{ {
@ -617,29 +653,39 @@
aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toLatin1().data(), toCreateGroups, aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toLatin1().data(), toCreateGroups,
aFormat, toOverwrite && aMeshIndex == 0 ); aFormat, toOverwrite && aMeshIndex == 0 );
} }
break; }
case 124: else if ( isDAT )
case 121: {
if ( aMeshOrGroup->_is_equivalent( aMesh )) if ( aMeshOrGroup->_is_equivalent( aMesh ))
aMesh->ExportDAT( aFilename.toLatin1().data() ); aMesh->ExportDAT( aFilename.toLatin1().data() );
else else
aMesh->ExportPartToDAT( aMeshOrGroup, aFilename.toLatin1().data() ); aMesh->ExportPartToDAT( aMeshOrGroup, aFilename.toLatin1().data() );
break; }
case 126: else if ( isUNV )
case 123: {
if ( aMeshOrGroup->_is_equivalent( aMesh )) if ( aMeshOrGroup->_is_equivalent( aMesh ))
aMesh->ExportUNV( aFilename.toLatin1().data() ); aMesh->ExportUNV( aFilename.toLatin1().data() );
else else
aMesh->ExportPartToUNV( aMeshOrGroup, aFilename.toLatin1().data() ); aMesh->ExportPartToUNV( aMeshOrGroup, aFilename.toLatin1().data() );
break; }
case 141: else if ( isSTL )
{
if ( aMeshOrGroup->_is_equivalent( aMesh )) if ( aMeshOrGroup->_is_equivalent( aMesh ))
aMesh->ExportSTL( aFilename.toLatin1().data(), aIsASCII_STL ); aMesh->ExportSTL( aFilename.toLatin1().data(), aIsASCII_STL );
else else
aMesh->ExportPartToSTL( aMeshOrGroup, aFilename.toLatin1().data(), aIsASCII_STL ); aMesh->ExportPartToSTL( aMeshOrGroup, aFilename.toLatin1().data(), aIsASCII_STL );
break; }
default: else if ( isCGNS )
break; {
aMeshIter = aMeshList.begin();
for( int aMeshIndex = 0; aMeshIter != aMeshList.end(); aMeshIter++, aMeshIndex++ )
{
SMESH::SMESH_IDSource_var aMeshOrGroup = (*aMeshIter).first;
SMESH::SMESH_Mesh_var aMeshItem = aMeshOrGroup->GetMesh();
aMeshItem->ExportCGNS( aMeshOrGroup,
aFilename.toLatin1().data(),
toOverwrite && aMeshIndex == 0 );
}
} }
} }
catch (const SALOME::SALOME_Exception& S_ex){ catch (const SALOME::SALOME_Exception& S_ex){
@ -1885,10 +1931,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
OnEditDelete(); OnEditDelete();
break; break;
case 113: // IMPORT case 116:
case 115:
case 113:
case 112: case 112:
case 111: case 111: // IMPORT
case 140:
{ {
if(checkLock(aStudy)) break; if(checkLock(aStudy)) break;
::ImportMeshesFromFile(GetSMESHGen(),theCommandID); ::ImportMeshesFromFile(GetSMESHGen(),theCommandID);
@ -1920,7 +1967,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
case 124: case 124:
case 125: case 125:
case 126: case 126:
case 140:
case 141: case 141:
case 142:
case 143:
{ {
::ExportMeshToFile(theCommandID); ::ExportMeshToFile(theCommandID);
break; break;
@ -3277,14 +3327,18 @@ void SMESHGUI::initialize( CAM_Application* app )
createSMESHAction( 112, "UNV", "", (Qt::CTRL+Qt::Key_U) ); createSMESHAction( 112, "UNV", "", (Qt::CTRL+Qt::Key_U) );
createSMESHAction( 113, "MED", "", (Qt::CTRL+Qt::Key_M) ); createSMESHAction( 113, "MED", "", (Qt::CTRL+Qt::Key_M) );
createSMESHAction( 114, "NUM" ); createSMESHAction( 114, "NUM" );
createSMESHAction( 115, "STL" );
createSMESHAction( 116, "CGNS" );
createSMESHAction( 121, "DAT" ); createSMESHAction( 121, "DAT" );
createSMESHAction( 122, "MED" ); createSMESHAction( 122, "MED" );
createSMESHAction( 123, "UNV" ); createSMESHAction( 123, "UNV" );
createSMESHAction( 140, "STL" ); createSMESHAction( 140, "STL" );
createSMESHAction( 142, "CGNS" );
createSMESHAction( 124, "EXPORT_DAT" ); createSMESHAction( 124, "EXPORT_DAT" );
createSMESHAction( 125, "EXPORT_MED" ); createSMESHAction( 125, "EXPORT_MED" );
createSMESHAction( 126, "EXPORT_UNV" ); createSMESHAction( 126, "EXPORT_UNV" );
createSMESHAction( 141, "EXPORT_STL" ); createSMESHAction( 141, "EXPORT_STL" );
createSMESHAction( 143, "EXPORT_CGNS" );
createSMESHAction( 150, "FILE_INFO" ); createSMESHAction( 150, "FILE_INFO" );
createSMESHAction( 33, "DELETE", "ICON_DELETE", Qt::Key_Delete ); createSMESHAction( 33, "DELETE", "ICON_DELETE", Qt::Key_Delete );
createSMESHAction( 5105, "SEL_FILTER_LIB" ); createSMESHAction( 5105, "SEL_FILTER_LIB" );
@ -3447,12 +3501,14 @@ void SMESHGUI::initialize( CAM_Application* app )
createMenu( 111, importId, -1 ); createMenu( 111, importId, -1 );
createMenu( 112, importId, -1 ); createMenu( 112, importId, -1 );
createMenu( 113, importId, -1 ); createMenu( 113, importId, -1 );
createMenu( 140, importId, -1 ); createMenu( 115, importId, -1 );
createMenu( 116, importId, -1 );
createMenu( 121, exportId, -1 ); createMenu( 121, exportId, -1 );
createMenu( 122, exportId, -1 ); createMenu( 122, exportId, -1 );
createMenu( 123, exportId, -1 ); createMenu( 123, exportId, -1 );
createMenu( 141, exportId, -1 ); // export to stl STL createMenu( 140, exportId, -1 ); // export to STL
createMenu( 142, exportId, -1 ); // export to CGNS
createMenu( separator(), fileId, 10 ); createMenu( separator(), fileId, 10 );
@ -3754,6 +3810,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createPopupItem( 125, OB, mesh_group, multiple_non_empty ); // EXPORT_MED createPopupItem( 125, OB, mesh_group, multiple_non_empty ); // EXPORT_MED
createPopupItem( 126, OB, mesh_group, only_one_non_empty ); // EXPORT_UNV createPopupItem( 126, OB, mesh_group, only_one_non_empty ); // EXPORT_UNV
createPopupItem( 141, OB, mesh_group, only_one_2D ); // EXPORT_STL createPopupItem( 141, OB, mesh_group, only_one_2D ); // EXPORT_STL
createPopupItem( 143, OB, mesh_group, multiple_non_empty ); // EXPORT_CGNS
createPopupItem( 33, OB, mesh_part + " " + hyp_alg ); // DELETE createPopupItem( 33, OB, mesh_part + " " + hyp_alg ); // DELETE
popupMgr()->insert( separator(), -1, 0 ); popupMgr()->insert( separator(), -1, 0 );

View File

@ -31,6 +31,10 @@
<source>STL_ASCII_FILES_FILTER</source> <source>STL_ASCII_FILES_FILTER</source>
<translation>STL ASCII files</translation> <translation>STL ASCII files</translation>
</message> </message>
<message>
<source>CGNS_FILES_FILTER</source>
<translation>CGNS files</translation>
</message>
<message> <message>
<source>STL_BIN_FILES_FILTER</source> <source>STL_BIN_FILES_FILTER</source>
<translation>STL binary files</translation> <translation>STL binary files</translation>
@ -363,6 +367,10 @@
<source>MEN_EXPORT_MED</source> <source>MEN_EXPORT_MED</source>
<translation>Export to MED File</translation> <translation>Export to MED File</translation>
</message> </message>
<message>
<source>MEN_EXPORT_CGNS</source>
<translation>Export to CGNS File</translation>
</message>
<message> <message>
<source>MEN_EXPORT_SAUV</source> <source>MEN_EXPORT_SAUV</source>
<translation>Export to SAUV (ASCII) file</translation> <translation>Export to SAUV (ASCII) file</translation>
@ -487,6 +495,10 @@
<source>MEN_MED</source> <source>MEN_MED</source>
<translation>MED file</translation> <translation>MED file</translation>
</message> </message>
<message>
<source>MEN_CGNS</source>
<translation>CGNS file</translation>
</message>
<message> <message>
<source>MEN_SAUV</source> <source>MEN_SAUV</source>
<translation>SAUV (ASCII) file</translation> <translation>SAUV (ASCII) file</translation>
@ -1336,7 +1348,7 @@ Probably, there is not enough space on disk.</translation>
<source>SMESH_EXPORT_MED_DUPLICATED_GRP</source> <source>SMESH_EXPORT_MED_DUPLICATED_GRP</source>
<translation>There are duplicated group names in mesh &quot;%1&quot;. <translation>There are duplicated group names in mesh &quot;%1&quot;.
You can cancel exporting and rename them, You can cancel exporting and rename them,
otherwise some group names in the resulting MED file otherwise some group names in the resulting file
will not match ones in the study. will not match ones in the study.
Do you want to continue ?</translation> Do you want to continue ?</translation>
</message> </message>

View File

@ -25,35 +25,35 @@
#include "SMESH_Mesh_i.hxx" #include "SMESH_Mesh_i.hxx"
#include "SMESH_Filter_i.hxx"
#include "SMESH_Gen_i.hxx"
#include "SMESH_Group_i.hxx"
#include "SMESH_MEDMesh_i.hxx"
#include "SMESH_MeshEditor_i.hxx"
#include "SMESH_PythonDump.hxx"
#include "SMESH_subMesh_i.hxx"
#include "DriverMED_R_SMESHDS_Mesh.h" #include "DriverMED_R_SMESHDS_Mesh.h"
#include "DriverMED_W_SMESHDS_Mesh.h" #include "DriverMED_W_SMESHDS_Mesh.h"
#include "SMDS_EdgePosition.hxx" #include "SMDS_EdgePosition.hxx"
#include "SMDS_ElemIterator.hxx" #include "SMDS_ElemIterator.hxx"
#include "SMDS_FacePosition.hxx" #include "SMDS_FacePosition.hxx"
#include "SMDS_IteratorOnIterators.hxx"
#include "SMDS_SetIterator.hxx" #include "SMDS_SetIterator.hxx"
#include "SMDS_VolumeTool.hxx" #include "SMDS_VolumeTool.hxx"
#include "SMESHDS_Command.hxx" #include "SMESHDS_Command.hxx"
#include "SMESHDS_CommandType.hxx" #include "SMESHDS_CommandType.hxx"
#include "SMESHDS_GroupOnGeom.hxx" #include "SMESHDS_GroupOnGeom.hxx"
#include "SMESH_Filter_i.hxx"
#include "SMESH_Gen_i.hxx"
#include "SMESH_Group.hxx" #include "SMESH_Group.hxx"
#include "SMESH_Group_i.hxx"
#include "SMESH_MEDMesh_i.hxx"
#include "SMESH_MeshEditor.hxx" #include "SMESH_MeshEditor.hxx"
#include "SMESH_MeshEditor_i.hxx"
#include "SMESH_MesherHelper.hxx" #include "SMESH_MesherHelper.hxx"
#include "SMESH_PythonDump.hxx"
#include "SMESH_subMesh_i.hxx"
#include "OpUtil.hxx" #include <OpUtil.hxx>
#include "SALOME_NamingService.hxx" #include <SALOME_NamingService.hxx>
#include "Utils_CorbaException.hxx" #include <Utils_CorbaException.hxx>
#include "Utils_ExceptHandlers.hxx" #include <Utils_ExceptHandlers.hxx>
#include "Utils_SINGLETON.hxx" #include <Utils_SINGLETON.hxx>
#include "utilities.h" #include <utilities.h>
#include "GEOMImpl_Types.hxx" #include <GEOMImpl_Types.hxx>
// OCCT Includes // OCCT Includes
#include <BRep_Builder.hxx> #include <BRep_Builder.hxx>
@ -340,6 +340,34 @@ SMESH_Mesh_i::ImportMEDFile( const char* theFileName, const char* theMeshName )
return ConvertDriverMEDReadStatus(status); return ConvertDriverMEDReadStatus(status);
} }
//================================================================================
/*!
* \brief Imports mesh data from the CGNS file
*/
//================================================================================
SMESH::DriverMED_ReadStatus SMESH_Mesh_i::ImportCGNSFile( const char* theFileName,
const int theMeshIndex,
std::string& theMeshName )
throw ( SALOME::SALOME_Exception )
{
Unexpect aCatch(SALOME_SalomeException);
int status;
try {
status = _impl->CGNSToMesh( theFileName, theMeshIndex, theMeshName );
}
catch( SALOME_Exception& S_ex ) {
THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
}
catch ( ... ) {
THROW_SALOME_CORBA_EXCEPTION("ImportCGNSFile(): unknown exception", SALOME::BAD_PARAM);
}
CreateGroupServants();
return ConvertDriverMEDReadStatus(status);
}
//================================================================================ //================================================================================
/*! /*!
* \brief Return string representation of a MED file version comprising nbDigits * \brief Return string representation of a MED file version comprising nbDigits
@ -2745,6 +2773,28 @@ void SMESH_Mesh_i::ExportPartToSTL(::SMESH::SMESH_IDSource_ptr meshPart,
<< meshPart<< ", r'" << file << "', " << isascii << ")"; << meshPart<< ", r'" << file << "', " << isascii << ")";
} }
//================================================================================
/*!
* \brief Export a part of mesh to an STL file
*/
//================================================================================
void SMESH_Mesh_i::ExportCGNS(::SMESH::SMESH_IDSource_ptr meshPart,
const char* file,
CORBA::Boolean overwrite)
throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
PrepareForWriting(file,overwrite);
SMESH_MeshPartDS partDS( meshPart );
_impl->ExportCGNS(file, &partDS);
TPythonDump() << _this() << ".ExportCGNS( "
<< meshPart<< ", r'" << file << "', " << overwrite << ")";
}
//============================================================================= //=============================================================================
/*! /*!
* *
@ -4361,10 +4411,15 @@ SMESH_MeshPartDS::SMESH_MeshPartDS(SMESH::SMESH_IDSource_ptr meshPart):
_meshDS = mesh_i->GetImpl().GetMeshDS(); _meshDS = mesh_i->GetImpl().GetMeshDS();
SetPersistentId( _meshDS->GetPersistentId() );
if ( mesh_i == SMESH::DownCast<SMESH_Mesh_i*>( meshPart )) if ( mesh_i == SMESH::DownCast<SMESH_Mesh_i*>( meshPart ))
{ {
// <meshPart> is the whole mesh // <meshPart> is the whole mesh
myInfo = _meshDS->GetMeshInfo(); // copy mesh info; myInfo = _meshDS->GetMeshInfo(); // copy mesh info;
// copy groups
set<SMESHDS_GroupBase*>& myGroupSet = const_cast<set<SMESHDS_GroupBase*>&>( GetGroups() );
myGroupSet = _meshDS->GetGroups();
} }
else else
{ {
@ -4402,6 +4457,18 @@ SMESH_MeshPartDS::SMESH_MeshPartDS(SMESH::SMESH_IDSource_ptr meshPart):
SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementsIterator(SMDSAbs_ElementType type) const SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementsIterator(SMDSAbs_ElementType type) const
{ {
typedef SMDS_SetIterator<const SMDS_MeshElement*, TIDSortedElemSet::const_iterator > TIter; typedef SMDS_SetIterator<const SMDS_MeshElement*, TIDSortedElemSet::const_iterator > TIter;
if ( type == SMDSAbs_All && !_meshDS )
{
typedef vector< SMDS_ElemIteratorPtr > TIterVec;
TIterVec iterVec;
for ( int i = 0; i < SMDSAbs_NbElementTypes; ++i )
if ( !_elements[i].empty() && i != SMDSAbs_Node )
iterVec.push_back
( SMDS_ElemIteratorPtr( new TIter( _elements[i].begin(), _elements[i].end() )));
typedef SMDS_IteratorOnIterators<const SMDS_MeshElement*, TIterVec > TIterOnIters;
return SMDS_ElemIteratorPtr( new TIterOnIters( iterVec ));
}
return _meshDS ? _meshDS->elementsIterator(type) : SMDS_ElemIteratorPtr return _meshDS ? _meshDS->elementsIterator(type) : SMDS_ElemIteratorPtr
( new TIter( _elements[type].begin(), _elements[type].end() )); ( new TIter( _elements[type].begin(), _elements[type].end() ));
} }

View File

@ -194,6 +194,11 @@ public:
SMESH::DriverMED_ReadStatus ImportMEDFile( const char* theFileName, const char* theMeshName ) SMESH::DriverMED_ReadStatus ImportMEDFile( const char* theFileName, const char* theMeshName )
throw (SALOME::SALOME_Exception); throw (SALOME::SALOME_Exception);
SMESH::DriverMED_ReadStatus ImportCGNSFile( const char* theFileName,
const int theMeshIndex,
std::string& theMeshName)
throw (SALOME::SALOME_Exception);
/*! /*!
* Auto color * Auto color
*/ */
@ -225,6 +230,9 @@ public:
void ExportDAT( const char* file ) throw (SALOME::SALOME_Exception); void ExportDAT( const char* file ) throw (SALOME::SALOME_Exception);
void ExportUNV( const char* file ) throw (SALOME::SALOME_Exception); void ExportUNV( const char* file ) throw (SALOME::SALOME_Exception);
void ExportSTL( const char* file, bool isascii ) throw (SALOME::SALOME_Exception); void ExportSTL( const char* file, bool isascii ) throw (SALOME::SALOME_Exception);
void ExportCGNS(SMESH::SMESH_IDSource_ptr meshPart,
const char* file,
CORBA::Boolean overwrite) throw (SALOME::SALOME_Exception);
void ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart, void ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart,
const char* file, const char* file,

View File

@ -685,6 +685,17 @@ class smeshDC(SMESH._objref_SMESH_Gen):
aMesh = Mesh(self, self.geompyD, aSmeshMesh) aMesh = Mesh(self, self.geompyD, aSmeshMesh)
return aMesh return aMesh
## Creates Mesh objects importing data from the given CGNS file
# @return an instance of Mesh class
# @ingroup l2_impexp
def CreateMeshesFromCGNS( self, theFileName ):
aSmeshMeshes, aStatus = SMESH._objref_SMESH_Gen.CreateMeshesFromCGNS(self,theFileName)
aMeshes = []
for iMesh in range(len(aSmeshMeshes)) :
aMesh = Mesh(self, self.geompyD, aSmeshMeshes[iMesh])
aMeshes.append(aMesh)
return aMeshes, aStatus
## Concatenate the given meshes into one mesh. ## Concatenate the given meshes into one mesh.
# @return an instance of Mesh class # @return an instance of Mesh class
# @param meshes the meshes to combine into one mesh # @param meshes the meshes to combine into one mesh
@ -1741,6 +1752,17 @@ class Mesh:
else: else:
self.mesh.ExportSTL(f, ascii) self.mesh.ExportSTL(f, ascii)
## Exports the mesh in a file in CGNS format
# @param f is the file name
# @param overwrite boolean parameter for overwriting/not overwriting the file
# @param meshPart a part of mesh (group, sub-mesh) to export instead of the mesh
# @ingroup l2_impexp
def ExportCGNS(self, f, overwrite=1, meshPart=None):
if isinstance( meshPart, list ):
meshPart = self.GetIDSource( meshPart, SMESH.ALL )
elif not meshPart:
meshPart = self.mesh
self.mesh.ExportCGNS(meshPart, f, overwrite)
# Operations with groups: # Operations with groups:
# ---------------------- # ----------------------