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
echo
echo ---------------------------------------------
echo Testing CGNS library
echo ---------------------------------------------
echo
CHECK_CGNS
echo
echo ---------------------------------------------
echo Summary
@ -401,11 +409,11 @@ echo
echo Configure
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
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
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
for var in $variables
@ -492,11 +500,13 @@ AC_OUTPUT([ \
src/DriverMED/Makefile \
src/DriverSTL/Makefile \
src/DriverUNV/Makefile \
src/DriverCGNS/Makefile \
src/MEFISTO2/Makefile \
src/OBJECT/Makefile \
src/PluginUtils/Makefile \
src/SMDS/Makefile \
src/SMESH/Makefile \
src/SMESHUtils/Makefile \
src/SMESHClient/Makefile \
src/SMESHDS/Makefile \
src/SMESHFiltersSelection/Makefile \

View File

@ -221,6 +221,13 @@ module SMESH
SMESH_Mesh CreateMeshesFromSTL( in string theFileName )
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
* \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 ExportSTL( in string file,
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,
in string file ) raises (SALOME::SALOME_Exception);
void ExportPartToUNV( in SMESH_IDSource meshPart,

View File

@ -197,9 +197,12 @@
else if ( theCommandID == 111 ) {
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)" );
}
else if ( theCommandID == 116 ) {
filter.append( QObject::tr( "CGNS_FILES_FILTER" ) + " (*.cgns)" );
}
QString anInitialPath = "";
if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
@ -249,7 +252,7 @@
}
break;
}
case 140:
case 115:
{
// STL format
aMeshes->length( 1 );
@ -260,6 +263,17 @@
}
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 ) {
@ -328,16 +342,24 @@
if( aSel )
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)
if( selected.Extent() == 0 ||
( selected.Extent() > 1 && theCommandID != 122 && theCommandID != 125 ) )
( selected.Extent() > 1 && !isMED && !isSTL ))
return;
// get mesh object from selection and check duplication of their names
bool hasDuplicatedMeshNames = false;
QList< QPair< SMESH::SMESH_IDSource_var, QString > > aMeshList;
QList< QPair< SMESH::SMESH_IDSource_var, QString > >::iterator aMeshIter;
SALOME_ListIteratorOfListIO It( selected );
for( ; It.More(); It.Next() ) {
for( ; It.More(); It.Next() )
{
Handle(SALOME_InteractiveObject) anIObject = It.Value();
SMESH::SMESH_IDSource_var aMeshItem = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(anIObject);
if ( aMeshItem->_is_nil() ) {
@ -349,18 +371,19 @@
QString aMeshName = anIObject->getName();
// check for duplications
for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
if( aMeshName == (*aMeshIter).second ) {
hasDuplicatedMeshNames = true;
break;
// check for name duplications
if ( !hasDuplicatedMeshNames )
for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
if( aMeshName == (*aMeshIter).second ) {
hasDuplicatedMeshNames = true;
break;
}
}
}
aMeshList.append( QPair< SMESH::SMESH_IDSource_var, QString >( aMeshItem, aMeshName ) );
}
if( hasDuplicatedMeshNames ) {
if( hasDuplicatedMeshNames && isMED ) {
int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
QObject::tr("SMESH_WRN_WARNING"),
QObject::tr("SMESH_EXPORT_MED_DUPLICATED_MESH_NAMES"),
@ -375,67 +398,41 @@
SMESH::SMESH_Mesh_var aMesh = aMeshOrGroup->GetMesh();
QString aMeshName = (*aMeshIter).second;
QList<SALOMEDS::Color> aReservedColors;
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
for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
SMESH::SMESH_Mesh_var aMeshItem = SMESH::SMESH_Mesh::_narrow( (*aMeshIter).first );
if ( !aMeshItem->_is_nil() && aMeshItem->HasDuplicatedGroupNamesMED()) {
int aRet = SUIT_MessageBox::warning
(SMESHGUI::desktop(),
QObject::tr("SMESH_WRN_WARNING"),
QObject::tr("SMESH_EXPORT_MED_DUPLICATED_GRP").arg((*aMeshIter).second),
QObject::tr("SMESH_BUT_YES"),
QObject::tr("SMESH_BUT_NO"), 0, 1);
if (aRet != 0)
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;
case 124:
case 121:
aFilter = QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)";
break;
case 126:
case 123: // UNV
{
SMESH::long_array_var nbElems = aMeshOrGroup->GetMeshInfo();
int nbPyramids = nbElems[ SMESH::Entity_Pyramid ] + nbElems[ SMESH::Entity_Quad_Pyramid ];
if ( nbPyramids > 0 ) {
if ( isMED || isCGNS )
{
// check for equal group names within each mesh
for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
SMESH::SMESH_Mesh_var aMeshItem = SMESH::SMESH_Mesh::_narrow( (*aMeshIter).first );
if ( !aMeshItem->_is_nil() && aMeshItem->HasDuplicatedGroupNamesMED()) {
int aRet = SUIT_MessageBox::warning
(SMESHGUI::desktop(),
QObject::tr("SMESH_WRN_WARNING"),
QObject::tr("SMESH_EXPORT_UNV").arg(aMeshName),
QObject::tr("SMESH_EXPORT_MED_DUPLICATED_GRP").arg((*aMeshIter).second),
QObject::tr("SMESH_BUT_YES"),
QObject::tr("SMESH_BUT_NO"), 0, 1);
if (aRet != 0)
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;
}
else if ( isUNV )
{
// warn the user about presence of not supported elements
SMESH::long_array_var nbElems = aMeshOrGroup->GetMeshInfo();
int nbPyramids = nbElems[ SMESH::Entity_Pyramid ] + nbElems[ SMESH::Entity_Quad_Pyramid ];
if ( nbPyramids > 0 ) {
int aRet = SUIT_MessageBox::warning
(SMESHGUI::desktop(),
QObject::tr("SMESH_WRN_WARNING"),
QObject::tr("SMESH_EXPORT_UNV").arg(aMeshName),
QObject::tr("SMESH_BUT_YES"),
QObject::tr("SMESH_BUT_NO"), 0, 1);
if (aRet != 0)
return;
}
}
// Get parameters of export operation
QString aFilename;
SMESH::MED_VERSION aFormat;
@ -447,22 +444,48 @@
toCreateGroups = resMgr->booleanValue( "SMESH", "auto_groups", false );
bool toOverwrite = true;
QString aFilter, aTitle = QObject::tr("SMESH_EXPORT_MESH");
QString anInitialPath = "";
if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
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();
aFilename = SUIT_FileDlg::getFileName(SMESHGUI::desktop(),
anInitialPath + QString("/") + aMeshName,
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;
QMap<QString, int>::const_iterator it = aFilterMapSTL.begin();
for ( ; it != aFilterMapSTL.end(); ++it )
QMap<QString, int>::const_iterator it = aFilterMap.begin();
for ( ; it != aFilterMap.end(); ++it )
filters.push_back( it.key() );
SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true );
@ -476,13 +499,19 @@
while (!is_ok) {
if ( fd->exec() )
aFilename = fd->selectedFile();
aIsASCII_STL = (aFilterMapSTL[fd->selectedNameFilter()]) == 1 ? true: false;
aIsASCII_STL = (aFilterMap[fd->selectedNameFilter()]) == 1 ? true: false;
is_ok = true;
}
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;
QString aDefaultFilter;
QMap<QString, SMESH::MED_VERSION>::const_iterator it = aFilterMap.begin();
@ -583,6 +612,13 @@
toCreateGroups = fd->IsChecked();
delete fd;
}
else
{
return;
}
// Perform export
if ( !aFilename.isEmpty() ) {
// Check whether the file already exists and delete it if yes
QFile aFile( aFilename );
@ -591,20 +627,20 @@
SUIT_OverrideCursor wc;
try {
bool Renumber = false;
// PAL 14172 : Check of we have to renumber or not from the preferences before export
if (resMgr)
Renumber= resMgr->booleanValue("SMESH","renumbering");
if (Renumber){
SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
aMeshEditor->RenumberNodes();
aMeshEditor->RenumberElements();
if ( SMESHGUI::automaticUpdate() )
SMESH::UpdateView();
}
switch ( theCommandID ) {
case 125:
case 122:
// Renumbering is not needed since SMDS redesign in V6.2.0 (Nov 2010)
// bool Renumber = false;
// // PAL 14172 : Check of we have to renumber or not from the preferences before export
// if (resMgr)
// Renumber= resMgr->booleanValue("SMESH","renumbering");
// if (Renumber){
// SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
// aMeshEditor->RenumberNodes();
// aMeshEditor->RenumberElements();
// if ( SMESHGUI::automaticUpdate() )
// SMESH::UpdateView();
// }
if ( isMED )
{
aMeshIter = aMeshList.begin();
for( int aMeshIndex = 0; aMeshIter != aMeshList.end(); aMeshIter++, aMeshIndex++ )
{
@ -617,29 +653,39 @@
aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toLatin1().data(), toCreateGroups,
aFormat, toOverwrite && aMeshIndex == 0 );
}
break;
case 124:
case 121:
}
else if ( isDAT )
{
if ( aMeshOrGroup->_is_equivalent( aMesh ))
aMesh->ExportDAT( aFilename.toLatin1().data() );
else
aMesh->ExportPartToDAT( aMeshOrGroup, aFilename.toLatin1().data() );
break;
case 126:
case 123:
}
else if ( isUNV )
{
if ( aMeshOrGroup->_is_equivalent( aMesh ))
aMesh->ExportUNV( aFilename.toLatin1().data() );
else
aMesh->ExportPartToUNV( aMeshOrGroup, aFilename.toLatin1().data() );
break;
case 141:
}
else if ( isSTL )
{
if ( aMeshOrGroup->_is_equivalent( aMesh ))
aMesh->ExportSTL( aFilename.toLatin1().data(), aIsASCII_STL );
else
aMesh->ExportPartToSTL( aMeshOrGroup, aFilename.toLatin1().data(), aIsASCII_STL );
break;
default:
break;
}
else if ( isCGNS )
{
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){
@ -1885,10 +1931,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
OnEditDelete();
break;
case 113: // IMPORT
case 116:
case 115:
case 113:
case 112:
case 111:
case 140:
case 111: // IMPORT
{
if(checkLock(aStudy)) break;
::ImportMeshesFromFile(GetSMESHGen(),theCommandID);
@ -1920,7 +1967,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
case 124:
case 125:
case 126:
case 140:
case 141:
case 142:
case 143:
{
::ExportMeshToFile(theCommandID);
break;
@ -3277,14 +3327,18 @@ void SMESHGUI::initialize( CAM_Application* app )
createSMESHAction( 112, "UNV", "", (Qt::CTRL+Qt::Key_U) );
createSMESHAction( 113, "MED", "", (Qt::CTRL+Qt::Key_M) );
createSMESHAction( 114, "NUM" );
createSMESHAction( 115, "STL" );
createSMESHAction( 116, "CGNS" );
createSMESHAction( 121, "DAT" );
createSMESHAction( 122, "MED" );
createSMESHAction( 123, "UNV" );
createSMESHAction( 140, "STL" );
createSMESHAction( 142, "CGNS" );
createSMESHAction( 124, "EXPORT_DAT" );
createSMESHAction( 125, "EXPORT_MED" );
createSMESHAction( 126, "EXPORT_UNV" );
createSMESHAction( 141, "EXPORT_STL" );
createSMESHAction( 143, "EXPORT_CGNS" );
createSMESHAction( 150, "FILE_INFO" );
createSMESHAction( 33, "DELETE", "ICON_DELETE", Qt::Key_Delete );
createSMESHAction( 5105, "SEL_FILTER_LIB" );
@ -3447,12 +3501,14 @@ void SMESHGUI::initialize( CAM_Application* app )
createMenu( 111, importId, -1 );
createMenu( 112, importId, -1 );
createMenu( 113, importId, -1 );
createMenu( 140, importId, -1 );
createMenu( 115, importId, -1 );
createMenu( 116, importId, -1 );
createMenu( 121, exportId, -1 );
createMenu( 122, 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 );
@ -3754,6 +3810,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createPopupItem( 125, OB, mesh_group, multiple_non_empty ); // EXPORT_MED
createPopupItem( 126, OB, mesh_group, only_one_non_empty ); // EXPORT_UNV
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
popupMgr()->insert( separator(), -1, 0 );

View File

@ -31,6 +31,10 @@
<source>STL_ASCII_FILES_FILTER</source>
<translation>STL ASCII files</translation>
</message>
<message>
<source>CGNS_FILES_FILTER</source>
<translation>CGNS files</translation>
</message>
<message>
<source>STL_BIN_FILES_FILTER</source>
<translation>STL binary files</translation>
@ -363,6 +367,10 @@
<source>MEN_EXPORT_MED</source>
<translation>Export to MED File</translation>
</message>
<message>
<source>MEN_EXPORT_CGNS</source>
<translation>Export to CGNS File</translation>
</message>
<message>
<source>MEN_EXPORT_SAUV</source>
<translation>Export to SAUV (ASCII) file</translation>
@ -487,6 +495,10 @@
<source>MEN_MED</source>
<translation>MED file</translation>
</message>
<message>
<source>MEN_CGNS</source>
<translation>CGNS file</translation>
</message>
<message>
<source>MEN_SAUV</source>
<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>
<translation>There are duplicated group names in mesh &quot;%1&quot;.
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.
Do you want to continue ?</translation>
</message>

View File

@ -25,35 +25,35 @@
#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_W_SMESHDS_Mesh.h"
#include "SMDS_EdgePosition.hxx"
#include "SMDS_ElemIterator.hxx"
#include "SMDS_FacePosition.hxx"
#include "SMDS_IteratorOnIterators.hxx"
#include "SMDS_SetIterator.hxx"
#include "SMDS_VolumeTool.hxx"
#include "SMESHDS_Command.hxx"
#include "SMESHDS_CommandType.hxx"
#include "SMESHDS_GroupOnGeom.hxx"
#include "SMESH_Filter_i.hxx"
#include "SMESH_Gen_i.hxx"
#include "SMESH_Group.hxx"
#include "SMESH_Group_i.hxx"
#include "SMESH_MEDMesh_i.hxx"
#include "SMESH_MeshEditor.hxx"
#include "SMESH_MeshEditor_i.hxx"
#include "SMESH_MesherHelper.hxx"
#include "SMESH_PythonDump.hxx"
#include "SMESH_subMesh_i.hxx"
#include "OpUtil.hxx"
#include "SALOME_NamingService.hxx"
#include "Utils_CorbaException.hxx"
#include "Utils_ExceptHandlers.hxx"
#include "Utils_SINGLETON.hxx"
#include "utilities.h"
#include "GEOMImpl_Types.hxx"
#include <OpUtil.hxx>
#include <SALOME_NamingService.hxx>
#include <Utils_CorbaException.hxx>
#include <Utils_ExceptHandlers.hxx>
#include <Utils_SINGLETON.hxx>
#include <utilities.h>
#include <GEOMImpl_Types.hxx>
// OCCT Includes
#include <BRep_Builder.hxx>
@ -340,6 +340,34 @@ SMESH_Mesh_i::ImportMEDFile( const char* theFileName, const char* theMeshName )
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
@ -2745,6 +2773,28 @@ void SMESH_Mesh_i::ExportPartToSTL(::SMESH::SMESH_IDSource_ptr meshPart,
<< 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();
SetPersistentId( _meshDS->GetPersistentId() );
if ( mesh_i == SMESH::DownCast<SMESH_Mesh_i*>( meshPart ))
{
// <meshPart> is the whole mesh
myInfo = _meshDS->GetMeshInfo(); // copy mesh info;
// copy groups
set<SMESHDS_GroupBase*>& myGroupSet = const_cast<set<SMESHDS_GroupBase*>&>( GetGroups() );
myGroupSet = _meshDS->GetGroups();
}
else
{
@ -4402,8 +4457,20 @@ SMESH_MeshPartDS::SMESH_MeshPartDS(SMESH::SMESH_IDSource_ptr meshPart):
SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementsIterator(SMDSAbs_ElementType type) const
{
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
( new TIter( _elements[type].begin(), _elements[type].end() ));
( new TIter( _elements[type].begin(), _elements[type].end() ));
}
#define _GET_ITER_DEFINE( iterType, methName, elem, elemType) \
iterType SMESH_MeshPartDS::methName( bool idInceasingOrder) const \

View File

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

View File

@ -685,6 +685,17 @@ class smeshDC(SMESH._objref_SMESH_Gen):
aMesh = Mesh(self, self.geompyD, aSmeshMesh)
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.
# @return an instance of Mesh class
# @param meshes the meshes to combine into one mesh
@ -1741,6 +1752,17 @@ class Mesh:
else:
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:
# ----------------------