From 922619aad64bf90317b241a166222674263995ce Mon Sep 17 00:00:00 2001 From: vsr Date: Thu, 9 Aug 2012 11:52:00 +0000 Subject: [PATCH] Merge from V6_main_20120808 08Aug12 --- AUTHORS | 3 +- ChangeLog | 3 +- GHS3DPRLPLUGIN_version.h.in | 8 +- INSTALL | 3 +- Makefile.am | 13 +- NEWS | 3 +- adm_local/Makefile.am | 7 +- adm_local/unix/Makefile.am | 7 +- adm_local/unix/config_files/Makefile.am | 7 +- adm_local/unix/config_files/check_GHS3DPRL.m4 | 3 +- .../unix/config_files/check_GHS3DPRLPLUGIN.m4 | 3 +- adm_local/unix/make_common_starter.am | 12 +- bin/Makefile.am | 7 +- bin/VERSION.in | 4 +- build_cmake | 27 + build_cmake.bat | 20 + build_configure | 78 +- clean_configure | 17 +- configure.ac | 153 ++-- doc/Makefile.am | 24 + doc/salome/Makefile.am | 28 + doc/salome/gui/GHS3DPRLPLUGIN/Makefile.am | 62 ++ doc/salome/gui/GHS3DPRLPLUGIN/doxyfile.in | 80 ++ doc/salome/gui/GHS3DPRLPLUGIN/doxyfile_py.in | 159 ++++ .../images/ghs3dprl_parameters_basic.png | Bin 0 -> 25365 bytes doc/salome/gui/GHS3DPRLPLUGIN/images/head.png | Bin 0 -> 78545 bytes .../gui/GHS3DPRLPLUGIN/images/image2.gif | Bin 0 -> 4694 bytes .../GHS3DPRLPLUGIN/input/ghs3dprl_hypo.doc | 471 ++++++++++ .../input/ghs3dprlplugin_python_interface.doc | 9 + doc/salome/gui/GHS3DPRLPLUGIN/input/index.doc | 25 + .../gui/GHS3DPRLPLUGIN/static/doxygen.css | 836 ++++++++++++++++++ .../gui/GHS3DPRLPLUGIN/static/footer.html | 12 + .../gui/GHS3DPRLPLUGIN/static/header.html.in | 20 + .../GHS3DPRLPLUGIN/static/header_py.html.in | 21 + doc/salome/gui/Makefile.am | 26 + idl/GHS3DPRLPlugin_Algorithm.idl | 7 +- idl/Makefile.am | 26 +- resources/GHS3DPRLPlugin.xml | 30 +- resources/Makefile.am | 7 +- resources/SalomeApp.xml | 23 + resources/mesh_tree_algo_GHS3DPRL.png | Bin 225 -> 278 bytes resources/mesh_tree_hypo_GHS3DPRL.png | Bin 225 -> 278 bytes src/GHS3DPRLPlugin/GHS3DPRLPluginDC.py | 79 ++ src/GHS3DPRLPlugin/GHS3DPRLPlugin_Defs.hxx | 37 + .../GHS3DPRLPlugin_GHS3DPRL.cxx | 123 ++- .../GHS3DPRLPlugin_GHS3DPRL.hxx | 14 +- .../GHS3DPRLPlugin_GHS3DPRL_i.cxx | 7 +- .../GHS3DPRLPlugin_GHS3DPRL_i.hxx | 11 +- .../GHS3DPRLPlugin_Hypothesis.cxx | 33 +- .../GHS3DPRLPlugin_Hypothesis.hxx | 33 +- .../GHS3DPRLPlugin_Hypothesis_i.cxx | 7 +- .../GHS3DPRLPlugin_Hypothesis_i.hxx | 11 +- src/GHS3DPRLPlugin/GHS3DPRLPlugin_i.cxx | 13 +- src/GHS3DPRLPlugin/Makefile.am | 26 +- src/Makefile.am | 11 +- src/gui/GHS3DPRLPluginGUI.cxx | 9 +- .../GHS3DPRLPluginGUI_HypothesisCreator.cxx | 8 +- src/gui/GHS3DPRLPluginGUI_HypothesisCreator.h | 20 +- src/gui/GHS3DPRLPlugin_images.ts | 3 +- src/gui/GHS3DPRLPlugin_msg_en.ts | 113 +-- src/gui/GHS3DPRLPlugin_msg_fr.ts | 59 ++ src/gui/Makefile.am | 17 +- src/tepal2med/Makefile.am | 11 +- src/tepal2med/dlg_ghs3dmain.cxx | 7 +- src/tepal2med/dlg_ghs3dmain.h | 7 +- src/tepal2med/ghs3dprl_mesh_wrap.cxx | 804 +++++++++-------- src/tepal2med/ghs3dprl_mesh_wrap.h | 48 +- src/tepal2med/ghs3dprl_msg_parser.cxx | 41 +- src/tepal2med/ghs3dprl_msg_parser.h | 7 +- src/tepal2med/tepal2med.cxx | 453 +++++----- src/tools/Makefile.am | 34 + src/tools/facespoints2mesh.py | 67 ++ src/tools/mesh2facespoints.py | 135 +++ 73 files changed, 3473 insertions(+), 1019 deletions(-) create mode 100755 build_cmake create mode 100644 build_cmake.bat create mode 100644 doc/Makefile.am create mode 100644 doc/salome/Makefile.am create mode 100755 doc/salome/gui/GHS3DPRLPLUGIN/Makefile.am create mode 100755 doc/salome/gui/GHS3DPRLPLUGIN/doxyfile.in create mode 100755 doc/salome/gui/GHS3DPRLPLUGIN/doxyfile_py.in create mode 100644 doc/salome/gui/GHS3DPRLPLUGIN/images/ghs3dprl_parameters_basic.png create mode 100755 doc/salome/gui/GHS3DPRLPLUGIN/images/head.png create mode 100755 doc/salome/gui/GHS3DPRLPLUGIN/images/image2.gif create mode 100644 doc/salome/gui/GHS3DPRLPLUGIN/input/ghs3dprl_hypo.doc create mode 100644 doc/salome/gui/GHS3DPRLPLUGIN/input/ghs3dprlplugin_python_interface.doc create mode 100644 doc/salome/gui/GHS3DPRLPLUGIN/input/index.doc create mode 100755 doc/salome/gui/GHS3DPRLPLUGIN/static/doxygen.css create mode 100755 doc/salome/gui/GHS3DPRLPLUGIN/static/footer.html create mode 100755 doc/salome/gui/GHS3DPRLPLUGIN/static/header.html.in create mode 100644 doc/salome/gui/GHS3DPRLPLUGIN/static/header_py.html.in create mode 100644 doc/salome/gui/Makefile.am create mode 100644 src/GHS3DPRLPlugin/GHS3DPRLPluginDC.py create mode 100755 src/GHS3DPRLPlugin/GHS3DPRLPlugin_Defs.hxx create mode 100755 src/gui/GHS3DPRLPlugin_msg_fr.ts create mode 100644 src/tools/Makefile.am create mode 100755 src/tools/facespoints2mesh.py create mode 100755 src/tools/mesh2facespoints.py diff --git a/AUTHORS b/AUTHORS index d59af62..c92da15 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,6 +16,7 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- # # File : AUTHORS diff --git a/ChangeLog b/ChangeLog index 2d8966e..bc79b5d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,6 +16,7 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- # # File : ChangeLog diff --git a/GHS3DPRLPLUGIN_version.h.in b/GHS3DPRLPLUGIN_version.h.in index 76ecf03..b9bbf78 100644 --- a/GHS3DPRLPLUGIN_version.h.in +++ b/GHS3DPRLPLUGIN_version.h.in @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : GHS3DPRLPLUGIN_version.h // Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -// // --- - +// #if !defined(__GHS3DPRLPLUGIN_VERSION_H__) #define __GHS3DPRLPLUGIN_VERSION_H__ @@ -32,5 +31,6 @@ #define GHS3DPRLPLUGIN_VERSION_STR "@VERSION@" #define GHS3DPRLPLUGIN_VERSION @XVERSION@ +#define GHS3DPRLPLUGIN_DEVELOPMENT @VERSION_DEV@ #endif // __GHS3DPRLPLUGIN_VERSION_H__ diff --git a/INSTALL b/INSTALL index 827ab1b..0d2e0c5 100644 --- a/INSTALL +++ b/INSTALL @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,6 +16,7 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- # # File : INSTALL diff --git a/Makefile.am b/Makefile.am index 5a82da2..9391fff 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : Makefile.am # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- - +# include $(top_srcdir)/adm_local/unix/make_common_starter.am if GHS3DPRLPLUGIN_ENABLE_GUI @@ -40,11 +39,11 @@ else !GHS3DPRLPLUGIN_ENABLE_GUI -I ${SMESH_ROOT_DIR}/adm_local/unix/config_files endif -SUBDIRS = idl adm_local resources src bin +SUBDIRS = idl adm_local resources src bin doc -DIST_SUBDIRS = idl adm_local resources src bin +DIST_SUBDIRS = idl adm_local resources src bin doc -DISTCLEANFILES = a.out aclocal.m4 configure +DISTCLEANFILES = a.out aclocal.m4 configure local-install.sh hack_libtool salomeinclude_DATA = GHS3DPRLPLUGIN_version.h diff --git a/NEWS b/NEWS index 4c13d67..d22503a 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,6 +16,7 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- # # File : NEWS diff --git a/adm_local/Makefile.am b/adm_local/Makefile.am index 6516664..4e47880 100644 --- a/adm_local/Makefile.am +++ b/adm_local/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : Makefile.am # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- - +# include $(top_srcdir)/adm_local/unix/make_common_starter.am SUBDIRS = unix diff --git a/adm_local/unix/Makefile.am b/adm_local/unix/Makefile.am index 386058f..55a47ce 100644 --- a/adm_local/unix/Makefile.am +++ b/adm_local/unix/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : Makefile.am # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- - +# include $(top_srcdir)/adm_local/unix/make_common_starter.am SUBDIRS = config_files diff --git a/adm_local/unix/config_files/Makefile.am b/adm_local/unix/config_files/Makefile.am index 52d567c..faadda9 100644 --- a/adm_local/unix/config_files/Makefile.am +++ b/adm_local/unix/config_files/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : Makefile.am # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- - +# include $(top_srcdir)/adm_local/unix/make_common_starter.am dist_admlocalm4_DATA = \ diff --git a/adm_local/unix/config_files/check_GHS3DPRL.m4 b/adm_local/unix/config_files/check_GHS3DPRL.m4 index 604d3be..1ccd67a 100755 --- a/adm_local/unix/config_files/check_GHS3DPRL.m4 +++ b/adm_local/unix/config_files/check_GHS3DPRL.m4 @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,6 +16,7 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- # # File : check_GHS3DPRL.m4 diff --git a/adm_local/unix/config_files/check_GHS3DPRLPLUGIN.m4 b/adm_local/unix/config_files/check_GHS3DPRLPLUGIN.m4 index 5b9fbb8..3105f0e 100755 --- a/adm_local/unix/config_files/check_GHS3DPRLPLUGIN.m4 +++ b/adm_local/unix/config_files/check_GHS3DPRLPLUGIN.m4 @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,6 +16,7 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- # # File : check_GHS3DPRLPLUGIN.m4 diff --git a/adm_local/unix/make_common_starter.am b/adm_local/unix/make_common_starter.am index 1ea9fb9..fabd7a0 100644 --- a/adm_local/unix/make_common_starter.am +++ b/adm_local/unix/make_common_starter.am @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,19 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : make_common_starter.am # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- +# ============================================================ +# The following is to avoid PACKAGE_... env variable +# redefinition compilation warnings +# ============================================================ # +AM_CXXFLAGS = @KERNEL_CXXFLAGS@ -include SALOMEconfig.h +AM_CPPFLAGS = @KERNEL_CXXFLAGS@ -include SALOMEconfig.h + # ============================================================ # This file defines the common definitions used in several # Makefile. This file must be included, if needed, by the file diff --git a/bin/Makefile.am b/bin/Makefile.am index 7839332..24e249a 100644 --- a/bin/Makefile.am +++ b/bin/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : Makefile.am # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- - +# include $(top_srcdir)/adm_local/unix/make_common_starter.am # non-distributed files diff --git a/bin/VERSION.in b/bin/VERSION.in index e3551b5..ac37cb2 100755 --- a/bin/VERSION.in +++ b/bin/VERSION.in @@ -1 +1,3 @@ -THIS IS SALOME - GHS3DPRLPLUGIN VERSION: @VERSION@ +[SALOME GHS3DPRLPLUGIN] : @VERSION@ +[DEVELOPMENT] : @VERSION_DEV@ +[DESCRIPTION] : DISTENE TetGen-GHS3d parallel meshing plug-in for SALOME Mesh module diff --git a/build_cmake b/build_cmake new file mode 100755 index 0000000..d2f451a --- /dev/null +++ b/build_cmake @@ -0,0 +1,27 @@ +#!/bin/sh +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +CURRENT_DIR=`pwd` +CONF_DIR=`echo $0 | sed -e "s,[^/]*$,,;s,/$,,;s,^$,.,"` +cd ${CONF_DIR} +python $KERNEL_ROOT_DIR/salome_adm/cmake_files/am2cmake.py --ghs3dprlplugin +status=$? +cd ${CURRENT_DIR} +exit $status diff --git a/build_cmake.bat b/build_cmake.bat new file mode 100644 index 0000000..6533456 --- /dev/null +++ b/build_cmake.bat @@ -0,0 +1,20 @@ +@REM Copyright (C) 2007-2012 CEA/DEN, EDF R&D +@REM +@REM This library is free software; you can redistribute it and/or +@REM modify it under the terms of the GNU Lesser General Public +@REM License as published by the Free Software Foundation; either +@REM version 2.1 of the License. +@REM +@REM This library is distributed in the hope that it will be useful, +@REM but WITHOUT ANY WARRANTY; without even the implied warranty of +@REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +@REM Lesser General Public License for more details. +@REM +@REM You should have received a copy of the GNU Lesser General Public +@REM License along with this library; if not, write to the Free Software +@REM Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +@REM +@REM See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +@REM + +%PYTHONBIN% %KERNEL_ROOT_DIR%\salome_adm\cmake_files\am2cmake.py --ghs3dprlplugin diff --git a/build_configure b/build_configure index c0fa009..1b0e6de 100755 --- a/build_configure +++ b/build_configure @@ -1,6 +1,5 @@ #!/bin/bash - -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -18,16 +17,14 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : build_configure # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- - +# ORIG_DIR=`pwd` CONF_DIR=`echo $0 | sed -e "s,[^/]*$,,;s,/$,,;s,^$,.,"` -GHS3DPRLPLUGIN_WITH_GUI="yes" ######################################################################## # Test if the KERNEL_ROOT_DIR is set correctly @@ -44,28 +41,6 @@ fi # exit #fi -for option -do - case $option in - -with-gui | --with-gui) - GHS3DPRLPLUGIN_WITH_GUI="yes" - break;; - -without-gui | --without-gui | -with-gui=no | --with-gui=no) - GHS3DPRLPLUGIN_WITH_GUI="no" - break;; - esac -done - -######################################################################## -# Test if the GUI_ROOT_DIR is set correctly - -if test ${GHS3DPRLPLUGIN_WITH_GUI} = yes; then - if test ! -d "${GUI_ROOT_DIR}"; then - echo "failed : GUI_ROOT_DIR variable is not correct !" - exit - fi -fi - ######################################################################## # Test if the MED_ROOT_DIR is set correctly @@ -94,40 +69,17 @@ cd ${CONF_DIR} ABS_CONF_DIR=`pwd` ####################################################################### -# Update configure.ac script: to set GHS3DPRLPLUGIN_WITH_GUI variable -sed -e s/GHS3DPRLPLUGIN_WITH_GUI=[a-z]*/GHS3DPRLPLUGIN_WITH_GUI=${GHS3DPRLPLUGIN_WITH_GUI}/g configure.ac > configure.tmp -mv -f configure.tmp configure.ac - -mkdir -p salome_adm/unix/config_files -#cp -f ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files/* salome_adm/unix/config_files -#cp -f ${KERNEL_ROOT_DIR}/salome_adm/unix/pythonbe.py salome_adm/unix - -cp -f ${KERNEL_ROOT_DIR}/salome_adm/unix/SALOMEconfig.h.in salome_adm/unix - -#cp -f ${GUI_ROOT_DIR}/adm_local/unix/config_files/* salome_adm/unix/config_files -#cp -f ${MED_ROOT_DIR}/adm_local/unix/config_files/* salome_adm/unix/config_files -#cp -f ${GEOM_ROOT_DIR}/adm_local/unix/config_files/* salome_adm/unix/config_files -#cp -f ${SMESH_ROOT_DIR}/adm_local/unix/config_files/* salome_adm/unix/config_files - -# remove KERNEL deprecated configure files -#for deprecated in ac_cc_warnings.m4 ac_cxx_partial_specialization.m4 \ -# check_mico.m4 config.guess ltmain.sh ac_cxx_bool.m4 ltconfig ac_cxx_typename.m4 \ -# check_pthreads.m4 config.sub libtool.m4 ac_cxx_mutable.m4 missing -# do -# rm -f salome_adm/unix/config_files/${deprecated} -# done - # ____________________________________________________________________ # aclocal creates the aclocal.m4 file from the standard macro and the -# custom macro embedded in the directory salome_adm/unix/config_files +# custom macro embedded in the directory adm_local/unix/config_files # and KERNEL config_files directory. # output: # aclocal.m4 # autom4te.cache (directory) -echo "====================================================== aclocal" +echo "======================================================= aclocal" -if test ${GHS3DPRLPLUGIN_WITH_GUI} = yes; then +if test -d "${GUI_ROOT_DIR}"; then aclocal -I adm_local/unix/config_files \ -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \ -I ${GUI_ROOT_DIR}/adm_local/unix/config_files \ @@ -148,10 +100,10 @@ fi # version. The files are created in the directory specified with the # AC_CONFIG_AUX_DIR() tag (see configure.ac). # output: -# salome_adm/unix/config_files/config.guess -# salome_adm/unix/config_files/config.sub -# salome_adm/unix/config_files/ltmain.sh -#echo "====================================================== libtoolize" +# adm_local/unix/config_files/config.guess +# adm_local/unix/config_files/config.sub +# adm_local/unix/config_files/ltmain.sh +echo "==================================================== libtoolize" libtoolize --force --copy --automake || exit 1 @@ -171,11 +123,11 @@ autoconf # AC_CONFIG_AUX_DIR() tag (see configure.ac). This step also # creates the Makefile.in files from the Makefile.am files. # output: -# salome_adm/unix/config_files/compile -# salome_adm/unix/config_files/depcomp -# salome_adm/unix/config_files/install-sh -# salome_adm/unix/config_files/missing -# salome_adm/unix/config_files/py-compile +# adm_local/unix/config_files/compile +# adm_local/unix/config_files/depcomp +# adm_local/unix/config_files/install-sh +# adm_local/unix/config_files/missing +# adm_local/unix/config_files/py-compile # Makefile.in (from Makefile.am) echo "====================================================== automake" diff --git a/clean_configure b/clean_configure index 9f42b6d..9997669 100755 --- a/clean_configure +++ b/clean_configure @@ -1,6 +1,5 @@ #!/bin/bash - -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -18,23 +17,17 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : clean_configure # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- - +# rm -rf autom4te.cache aclocal.m4 configure make_config find . -name "*~" -print -exec rm {} \; find . -name "*.pyc" -print -exec rm {} \; # ... -find bin -name Makefile.in | xargs rm -f -find doc -name Makefile.in | xargs rm -f -find idl -name Makefile.in | xargs rm -f -find resources -name Makefile.in | xargs rm -f -find salome_adm -name Makefile.in | xargs rm -f -find src -name Makefile.in | xargs rm -f -rm -f Makefile.in +find . -name Makefile.in | xargs rm -f +( cd adm_local/unix/config_files && rm -f config.* depcomp install-sh ltmain.sh missing py-compile ) diff --git a/configure.ac b/configure.ac index 23af624..e5bd0bc 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,5 @@ #!/bin/bash - -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -18,21 +17,22 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : configure.ac # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- - -AC_INIT([Salome2 Project GHS3DPRLPLUGIN module], [5.1.0], [webmaster.salome@opencascade.com], [SalomeGHS3DPRLPLUGIN]) -AC_CONFIG_AUX_DIR(salome_adm/unix/config_files) +# +AC_INIT([Salome2 Project GHS3DPRLPLUGIN module], [6.5.0], [webmaster.salome@opencascade.com], [SalomeGHS3DPRLPLUGIN]) +AC_CONFIG_AUX_DIR(adm_local/unix/config_files) AC_CANONICAL_HOST AC_CANONICAL_TARGET -AM_INIT_AUTOMAKE +AM_INIT_AUTOMAKE([-Wno-portability]) XVERSION=`echo $VERSION | awk -F. '{printf("0x%02x%02x%02x",$1,$2,$3)}'` AC_SUBST(XVERSION) +VERSION_DEV=1 +AC_SUBST(VERSION_DEV) # set up MODULE_NAME variable for dynamic construction of directories (resources, etc.) MODULE_NAME=ghs3dprlplugin @@ -74,6 +74,7 @@ echo AC_PROG_MAKE_SET AC_PROG_INSTALL +AC_LOCAL_INSTALL dnl dnl libtool macro check for CC, LD, NM, LN_S, RANLIB, STRIP + pour les librairies dynamiques ! @@ -95,7 +96,7 @@ dnl Fix up the INSTALL macro if it s a relative path. We want the dnl full-path to the binary instead. case "$INSTALL" in *install-sh*) - INSTALL='\${KERNEL_ROOT_DIR}'/salome_adm/unix/config_files/install-sh + INSTALL='\${KERNEL_ROOT_DIR}'/adm_local/unix/config_files/install-sh ;; esac @@ -155,7 +156,15 @@ dnl testing MPICH dnl --------------------------------------------- dnl -CHECK_MPICH +dnl CHECK_MPICH + +echo +echo --------------------------------------------- +echo testing MPI +echo --------------------------------------------- +echo + +CHECK_MPI echo echo --------------------------------------------- @@ -231,11 +240,34 @@ AC_SUBST_FILE(CORBA) corba=make_$ORB CORBA=adm_local/unix/$corba -GHS3DPRLPLUGIN_WITH_GUI=yes +echo +echo --------------------------------------------- +echo Testing GUI +echo --------------------------------------------- +echo + +CHECK_GUI_MODULE -AM_CONDITIONAL(GHS3DPRLPLUGIN_ENABLE_GUI, [test "${GHS3DPRLPLUGIN_WITH_GUI}" = "yes"]) +gui_ok=no +if test "${SalomeGUI_need}" != "no" -a "${FullGUI_ok}" = "yes" ; then + gui_ok=yes +fi -if test "${GHS3DPRLPLUGIN_WITH_GUI}" = "yes"; then +AM_CONDITIONAL(GHS3DPRLPLUGIN_ENABLE_GUI, [test "${gui_ok}" = "yes"]) + +if test "${SalomeGUI_need}" == "yes"; then + if test "${FullGUI_ok}" != "yes"; then + AC_MSG_WARN(For configure GHS3DPRLPLUGIN module necessary full GUI!) + fi +elif test "${SalomeGUI_need}" == "auto"; then + if test "${FullGUI_ok}" != "yes"; then + AC_MSG_WARN(Full GUI not found. Build will be done without GUI!) + fi +elif test "${SalomeGUI_need}" == "no"; then + echo Build without GUI option has been chosen +fi + +if test "${gui_ok}" = "yes"; then echo echo --------------------------------------------- echo testing openGL @@ -251,35 +283,15 @@ if test "${GHS3DPRLPLUGIN_WITH_GUI}" = "yes"; then echo CHECK_QT +fi - echo - echo --------------------------------------------- - echo testing VTK - echo --------------------------------------------- - echo - - CHECK_VTK - - echo - echo --------------------------------------------- - echo Testing GUI - echo --------------------------------------------- - echo - - CHECK_SALOME_GUI - - echo - echo --------------------------------------------- - echo Testing full GUI - echo --------------------------------------------- - echo +echo +echo --------------------------------------------- +echo testing VTK +echo --------------------------------------------- +echo - CHECK_CORBA_IN_GUI - if test "x${CORBA_IN_GUI}" != "xyes"; then - echo "failed : For configure GHS3DPRLPLUGIN module necessary full GUI !" - exit - fi -fi +CHECK_VTK echo echo --------------------------------------------- @@ -362,13 +374,15 @@ echo #AM_CONDITIONAL( USE_GFORTRAN, [test "$F77" = "gfortran"]) -if test "${GHS3DPRLPLUGIN_WITH_GUI}" = "yes"; then -variables="cc_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 Kernel_ok Geom_ok Med_ok SMesh_ok SalomeGUI_ok libxml_ok" -opt_variables="GHS3DPRL_ok" -fi -if test "${GHS3DPRLPLUGIN_WITH_GUI}" = "no"; then -variables="cc_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok hdf5_ok omniORB_ok occ_ok doxygen_ok graphviz_ok Kernel_ok Geom_ok Med_ok SMesh_ok libxml_ok" -opt_variables="GHS3DPRL_ok" +if test "${gui_ok}" = "yes"; then + variables="cc_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 Kernel_ok Geom_ok Med_ok SMesh_ok gui_ok libxml_ok" + opt_variables="GHS3DPRL_ok" +elif test "${SalomeGUI_need}" != "no"; then + variables="cc_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok vtk_ok hdf5_ok omniORB_ok occ_ok doxygen_ok graphviz_ok Kernel_ok Geom_ok Med_ok SMesh_ok gui_ok libxml_ok" + opt_variables="GHS3DPRL_ok" +else + variables="cc_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok vtk_ok hdf5_ok omniORB_ok occ_ok doxygen_ok graphviz_ok Kernel_ok Geom_ok Med_ok SMesh_ok libxml_ok" + opt_variables="GHS3DPRL_ok" fi echo @@ -419,23 +433,42 @@ echo # chmod +x ./bin/salome/*; #]) +AC_HACK_LIBTOOL +AC_CONFIG_COMMANDS([hack_libtool],[ +sed -i "s%^CC=\"\(.*\)\"%hack_libtool (){ \n\ + $(pwd)/hack_libtool \1 \"\$[@]\" \n\ +}\n\ +CC=\"hack_libtool\"%g" libtool +sed -i "s%\(\s*\)for searchdir in \$newlib_search_path \$lib_search_path \$sys_lib_search_path \$shlib_search_path; do%\1searchdirs=\"\$newlib_search_path \$lib_search_path \$sys_lib_search_path \$shlib_search_path\"\n\1for searchdir in \$searchdirs; do%g" libtool +sed -i "s%\(\s*\)searchdirs=\"\$newlib_search_path \$lib_search_path \(.*\)\"%\1searchdirs=\"\$newlib_search_path \$lib_search_path\"\n\1sss_beg=\"\"\n\1sss_end=\"\2\"%g" libtool +sed -i "s%\(\s*\)\(for searchdir in \$searchdirs; do\)%\1for sss in \$searchdirs; do\n\1 if ! test -d \$sss; then continue; fi\n\1 ssss=\$(cd \$sss; pwd)\n\1 if test \"\$ssss\" != \"\" \&\& test -d \$ssss; then\n\1 case \$ssss in\n\1 /usr/lib | /usr/lib64 ) ;;\n\1 * ) sss_beg=\"\$sss_beg \$ssss\" ;;\n\1 esac\n\1 fi\n\1done\n\1searchdirs=\"\$sss_beg \$sss_end\"\n\1\2%g" libtool +],[]) + # This list is initiated using autoscan and must be updated manually # when adding a new file .in to manage. When you execute # autoscan, the Makefile list is generated in the output file configure.scan. # This could be helpfull to update de configuration. AC_OUTPUT([ \ - ./salome_adm/unix/SALOMEconfig.h \ - ./adm_local/Makefile \ - ./adm_local/unix/Makefile \ - ./adm_local/unix/config_files/Makefile \ - ./bin/VERSION \ - ./bin/Makefile \ - ./idl/Makefile \ - ./resources/Makefile \ - ./src/Makefile \ - ./src/GHS3DPRLPlugin/Makefile \ - ./src/gui/Makefile \ - ./src/tepal2med/Makefile \ - ./GHS3DPRLPLUGIN_version.h \ + adm_local/Makefile \ + adm_local/unix/Makefile \ + adm_local/unix/config_files/Makefile \ + bin/VERSION \ + bin/Makefile \ + idl/Makefile \ + resources/Makefile \ + doc/Makefile \ + doc/salome/Makefile \ + doc/salome/gui/Makefile \ + doc/salome/gui/GHS3DPRLPLUGIN/Makefile \ + doc/salome/gui/GHS3DPRLPLUGIN/doxyfile \ + doc/salome/gui/GHS3DPRLPLUGIN/static/header.html \ + doc/salome/gui/GHS3DPRLPLUGIN/doxyfile_py \ + doc/salome/gui/GHS3DPRLPLUGIN/static/header_py.html \ + src/Makefile \ + src/GHS3DPRLPlugin/Makefile \ + src/gui/Makefile \ + src/tepal2med/Makefile \ + src/tools/Makefile \ + GHS3DPRLPLUGIN_version.h \ Makefile \ ]) diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..395d3aa --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,24 @@ +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +SUBDIRS = salome + +usr_docs: + (cd salome && $(MAKE) $(AM_MAKEFLAGS) usr_docs) + +docs: usr_docs \ No newline at end of file diff --git a/doc/salome/Makefile.am b/doc/salome/Makefile.am new file mode 100644 index 0000000..15038d3 --- /dev/null +++ b/doc/salome/Makefile.am @@ -0,0 +1,28 @@ +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +SUBDIRS = gui +SUBDIRSGUI = gui + +usr_docs: + @@SETX@; for d in $(SUBDIRSGUI); do \ + (cd $$d && $(MAKE) $@) || exit 1; \ + done; + +docs: usr_docs \ No newline at end of file diff --git a/doc/salome/gui/GHS3DPRLPLUGIN/Makefile.am b/doc/salome/gui/GHS3DPRLPLUGIN/Makefile.am new file mode 100755 index 0000000..ef5f90d --- /dev/null +++ b/doc/salome/gui/GHS3DPRLPLUGIN/Makefile.am @@ -0,0 +1,62 @@ +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +EXTRA_DIST += images input static/footer.html static/doxygen.css + +guidocdir = $(docdir)/gui/GHS3DPRLPLUGIN +guidoc_DATA = images/head.png + + +usr_docs: doxyfile + echo "===========================================" ; \ + echo "Generating Python interface documentation"; \ + echo "===========================================" ; \ + $(DOXYGEN) doxyfile_py \ + echo "===========================================" ; \ + echo "Generating GUI documentation" ; \ + echo "===========================================" ; \ + $(DOXYGEN) doxyfile ; + +docs: usr_docs + +clean-local: + @for filen in `find . -maxdepth 1` ; do \ + case $${filen} in \ + ./Makefile | ./doxyfile | ./doxyfile_py ) ;; \ + . | .. | ./static ) ;; \ + *) echo "Removing $${filen}" ; rm -rf $${filen} ;; \ + esac ; \ + done ; + +install-data-local: usr_docs + $(INSTALL) -d $(DESTDIR)$(docdir)/gui/GHS3DPRLPLUGIN + @for filen in `find . -maxdepth 1` ; do \ + case $${filen} in \ + ./Makefile | ./doxyfile | ./doxyfile_py ) ;; \ + ./doxyfile.bak | ./doxyfile_py.bak ) ;; \ + . | .. | ./static ) ;; \ + *) echo "Installing $${filen}" ; cp -rp $${filen} $(DESTDIR)$(docdir)/gui/GHS3DPRLPLUGIN ;; \ + esac ; \ + done ; + cp -rp $(srcdir)/images/head.png $(DESTDIR)$(docdir)/gui/GHS3DPRLPLUGIN/ghs3dprlpluginpy_doc/ ; + +uninstall-local: + rm -rf $(DESTDIR)$(docdir)/gui/GHS3DPRLPLUGIN + diff --git a/doc/salome/gui/GHS3DPRLPLUGIN/doxyfile.in b/doc/salome/gui/GHS3DPRLPLUGIN/doxyfile.in new file mode 100755 index 0000000..51cfcb8 --- /dev/null +++ b/doc/salome/gui/GHS3DPRLPLUGIN/doxyfile.in @@ -0,0 +1,80 @@ +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = "SALOME GHS3DPRLPLUGIN User's Guide" +OUTPUT_DIRECTORY = . +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +TAB_SIZE = 5 + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES + +#--------------------------------------------------------------------------- +#Input related options +#--------------------------------------------------------------------------- +INPUT = @srcdir@/input +FILE_PATTERNS = *.doc +EXCLUDE = +IMAGE_PATH = @srcdir@/images +EXAMPLE_PATH = + +#--------------------------------------------------------------------------- +#HTML related options +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = . +HTML_HEADER = @builddir@/static/header.html +HTML_FOOTER = @srcdir@/static/footer.html +HTML_STYLESHEET = @srcdir@/static/doxygen.css +TOC_EXPAND = YES +DISABLE_INDEX = NO +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 300 + +#--------------------------------------------------------------------------- +#SORT related options +#--------------------------------------------------------------------------- +SORT_GROUP_NAMES = NO + + +#--------------------------------------------------------------------------- +#LaTeX related option +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +EXTRA_PACKAGES = amsmath + +#--------------------------------------------------------------------------- +#RTF related options +#--------------------------------------------------------------------------- +GENERATE_RTF = NO + +#--------------------------------------------------------------------------- +#External reference options +#--------------------------------------------------------------------------- +#rnv: 07.04.2011 Workaround for the doxygen 1.7.3: +#because it wrongly defines location of the html files for search. +TAGFILES = ghs3dprlpluginpy_doc.tag=../GHS3DPRLPLUGIN/ghs3dprlpluginpy_doc +SEARCHENGINE = YES \ No newline at end of file diff --git a/doc/salome/gui/GHS3DPRLPLUGIN/doxyfile_py.in b/doc/salome/gui/GHS3DPRLPLUGIN/doxyfile_py.in new file mode 100755 index 0000000..a085321 --- /dev/null +++ b/doc/salome/gui/GHS3DPRLPLUGIN/doxyfile_py.in @@ -0,0 +1,159 @@ +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = "SALOME GHS3DPRLPLUGIN User's Guide" +OUTPUT_DIRECTORY = . +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ALWAYS_DETAILED_SEC = YES +INLINE_INHERITED_MEMB = YES +FULL_PATH_NAMES = NO +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = YES +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 5 +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = YES +BUILTIN_STL_SUPPORT = NO +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = YES +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = YES +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +MAX_INITIALIZER_LINES = 25 +SHOW_USED_FILES = NO +SHOW_DIRECTORIES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = YES +USE_HTAGS = NO +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +EXCLUDE_SYMLINKS = NO +EXAMPLE_RECURSIVE = NO + +#--------------------------------------------------------------------------- +#Input related options +#--------------------------------------------------------------------------- +INPUT = @top_srcdir@/src/GHS3DPRLPlugin/GHS3DPRLPluginDC.py +FILE_PATTERNS = +IMAGE_PATH = @srcdir@/images +RECURSIVE = NO +EXAMPLE_PATH = + +#--------------------------------------------------------------------------- +#HTML related options +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = ghs3dprlpluginpy_doc +HTML_HEADER = @builddir@/static/header_py.html +HTML_FOOTER = @srcdir@/static/footer.html +HTML_STYLESHEET = @srcdir@/static/doxygen.css +TOC_EXPAND = YES +DISABLE_INDEX = NO +GENERATE_TREEVIEW = NO + +#--------------------------------------------------------------------------- +#LaTeX related option +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO + +#--------------------------------------------------------------------------- +#RTF related options +#--------------------------------------------------------------------------- +GENERATE_RTF = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = NO +HIDE_UNDOC_RELATIONS = NO +HAVE_DOT = NO +CLASS_GRAPH = NO +COLLABORATION_GRAPH = NO +GROUP_GRAPHS = NO +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = NO +INCLUDED_BY_GRAPH = NO +CALL_GRAPH = NO +GRAPHICAL_HIERARCHY = NO +DIRECTORY_GRAPH = NO +DOT_IMAGE_FORMAT = jpg +DOT_FONTNAME = Arial +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1200 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = NO +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +#External reference options +#--------------------------------------------------------------------------- +GENERATE_TAGFILE = ghs3dprlpluginpy_doc.tag +SEARCHENGINE = YES \ No newline at end of file diff --git a/doc/salome/gui/GHS3DPRLPLUGIN/images/ghs3dprl_parameters_basic.png b/doc/salome/gui/GHS3DPRLPLUGIN/images/ghs3dprl_parameters_basic.png new file mode 100644 index 0000000000000000000000000000000000000000..0628058ee764c5f3bc1ee602b34555ba48742017 GIT binary patch literal 25365 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 LhHAdDMbN(i*6NoX literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GHS3DPRLPLUGIN/images/head.png b/doc/salome/gui/GHS3DPRLPLUGIN/images/head.png new file mode 100755 index 0000000000000000000000000000000000000000..307d9ef9a4c07f8fba2c8721309a978433bcf63c GIT binary patch literal 78545 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 D4zrO! literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GHS3DPRLPLUGIN/images/image2.gif b/doc/salome/gui/GHS3DPRLPLUGIN/images/image2.gif new file mode 100755 index 0000000000000000000000000000000000000000..198351307f7783f5771a22bb6ea363dea50a10e8 GIT binary patch literal 4694 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 BV)+07 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/GHS3DPRLPLUGIN/input/ghs3dprl_hypo.doc b/doc/salome/gui/GHS3DPRLPLUGIN/input/ghs3dprl_hypo.doc new file mode 100644 index 0000000..a7f69df --- /dev/null +++ b/doc/salome/gui/GHS3DPRLPLUGIN/input/ghs3dprl_hypo.doc @@ -0,0 +1,471 @@ +/*! + +\page ghs3dprl_hypo_page GHS3DPRL Parameters hypothesis + +\n GHS3DPRL Parameters hypothesis works only with Tetrahedron (Tepal with TetMesh-GHS3D) algorithm. +This algorithm is a commercial software, its use requires a licence (http://www.distene.com/fr/build/offer.html). +\n Tepal_V1.4 gives the possibility to generate a partitioned +mesh with 200 million tetrahedrons on a computer with average memory size +(2Go RAM) in about 50 hours on one CPU (Xeon, 2008). +\n New Tepal_V2.0 gives the possibility to generate a partitioned mesh with (for the moment) no more than 100 million +tetrahedrons on computers using MPI, (Total 16 Go RAM) +in about 900 seconds (!yes! : !seconds!) on 2 octo processors (Xeon, 2009). +The launch of this beta-version is described below. +\n This is a serious alternative to GHS3D, which requires a much less common +configuration with 64Go RAM to only try to make a partition of a mesh with +200 million tetrahedrons, no result guaranteed. +\n +\note The Plugin doesn't load in the Memory the supposedly large resulting meshes. +The meshes are saved in MED files and can be imported in the user-defined location via menu File-Import-MED Files. +\n Pay attention, that Salome GUI needs 2Go RAM to load a MED +file with 5 million tetrahedrons. + +\image html ghs3dprl_parameters_basic.png + +
    +
  • +Name - allows to define the name of the hypothesis (GHS3DPRL Parameters by default). +
  • +
  • +MED_Name - allows to define the path and the prefix of the +resulting MED files ("DOMAIN" by default). +If the path is not defined, the environment variable $SALOME_TMP_DIR +is used. If $SALOME_TMP_DIR is not defined as well, the environment +variable $TMP is used. +
  • +
  • +Nb_Part - allows to define the number of generated MED files. +The initial skin (triangles) will be meshed (tetrahedrons) and partitioned +in Nb_Part by the elementary algorithm implemented in Tepal.
    +
  • +
  • +Keep_Files - if this box is checked, input files of Tepal +(GHS3DPRL.points and GHS3DPRL.faces) are not deleted after use (...if the +background mode was not used). +
  • +
  • +Tepal_in_Background - if this box is checked, Tepal execution +and MED file generation are launched in background mode and the user +can even exit Salome. Pay attention that in this case Tepal algorithm works +independently of "killSalome.py", and sometimes on another host. +
  • +
  • +To_Mesh_Holes - if this box is checked, the parameter component +of tetmesh-ghs3d will mesh holes. +
  • + +

    Modifying GHS3DPRL Advanced Parameters


    +GHS3DPRL Plugin launches a standalone binary executable tepal2med.
    +tepal2med launches tepal, waits for the end of computation, and +converts the resulting output tepal files into MED files.
    +Some advanced optional parameters are accessible as arguments.
    + +If keep_files option is checked, it is possible to re-launch tepal2med +or tepal in the Terminal as a command with custom parameters.
    + +
  • +Advanced tepal2med Parameters - type "tepal2med --help" in the Terminal.

    + +\verbatim +myname@myhost > /export/home/myname/salome_5/GHS3DPRLPLUGIN_5/bin/salome/tepal2med --help +Available options: + --help : produces this help message + --casename : path and name of input tepal2med files which are + - output files of tepal .msg .noboite .faces .points .glo + - output file of GHS3DPRL_Plugin casename_skin.med (optional) + with initial skin and its initial groups + --number : number of partitions + --medname : path and name of output MED files + --limitswap : max size of working cpu memory (Mo) (before swapping on .temp files) + --verbose : trace of execution (0->6) + --test : more tests about joints, before generation of output files + --menu : a GUI menu for option number + --launchtepal : also launch tepal on files casename.faces and casename.points and option number + --meshholes : force parameter component of tetmesh-ghs3d to mesh holes + --background : force background mode from launch tepal and generation of final MED files (big meshes) + --deletegroups : regular expression (see QRegExp) which matches unwanted groups in final MED files + (try --deletegroups="(\bAll_Nodes|\bAll_Faces)" + (try --deletegroups="((\bAll_|\bNew_)(N|F|T))" +example: + tepal2med --casename=/tmp/GHS3DPRL --number=2 --medname=DOMAIN --limitswap=1000 + --verbose=0 --test=yes --menu=no --launchtepal=no + +\endverbatim +\n +

  • +
  • +Advanced Tepal_V1.4 Parameters

    + +\verbatim + +USAGE : tepal options + +With options : + --filename name (-f name) : + Prefix of the input case (MANDATORY) + + --ndom n (-n n) : + Number of subdomains to make (MANDATORY) + + --ghs3d ghs3d options (-g ghs3d options) : + Runs temesh ghs3d on a previously generated subdomain. (ghs3d options must be "quoted") + + --memory m (-m m) : + Max amount of memory (megabytes) allowed for ghs in the cutting process. (default is 0 : unlimited) + + --mesh_only (-Z ) : + Only (re)meshes all subdomains and updates communications messages + + --mesh_call command (-c command) : + Calls the user specified command for meshing all the + subomains after their skin has been generated + + --stats_only (-S ) : + Only computes and shows some statistics on subdomains + + --rebuild (-r ) : + Merges final subdomains skins + + --rebuild_tetra (-R ) : + Merges final subdomains skins and tetraedra + + --rebuild_iface (-i ) : + Includes interfaces in final subdomains merge + + --rebuild_retag (-t ) : + Tags vertices, faces (and tetra if selected) with their + subdomain number in the final merge of subdomains (keeps the lowest tag for shared elements) + + --rebuild_ensight_parts (-e ) : + Builds ensight geom file with parts + + --tetmesh_args str (-G str) : + Arguments to pass to Tetmesh during cutting process + +\endverbatim +\n +

  • +
  • +Advanced ghs3d Parameters (through Tepal_V1.4's --tetmesh_args) - type "ghs3d -h" in a Terminal.

    + +\verbatim +myname@myhost > ghs3d -h + +USE + /export/home/myname/ghs3d-4.0/DISTENE/Tools/TetMesh-GHS3D4.0/bin/Linux/ghs3dV4.0 + [-u] [-m memory>] [-M MEMORY] [-f prefix] [-v verbose] + [-c component] [-p0] [-C] [-E count] [-t] [-o level] + [-I filetype] [-a/-b] [-O n m] + +DESCRIPTION + + -u (-h) : prints this message. + + -m memory : launches the software with memory in Megabytes. + The default value of this parameter is 64 Megabytes and its + minimum value is 10 Megabytes. + It is also possible to set this parameter with the + environment variable GHS3D_MEMORY by means of an operation + equivalent to: + setenv GHS3D_MEMORY memory, + the value specified in the command line has the priority on + the environment variable. + + -M MEMORY : provides the automatic memory adjustment feature. + If MEMORY (in Megabytes) is equal to zero, the size of the work space is + calculated from the input. If MEMORY is not equal to + zero, the software starts with MEMORY amount of work space. + The software reallocates memory as necessary. + The start value of MEMORY can range from 0 to 64 Megabytes, + the maximum depends on -m option and the actual memory available. + + -f prefix : defines the generic prefix of the files. + + -v verbose : sets the output level parameter (the verbose parameter + must be in the range 0 to 10). + + -c component : chooses the meshed component. If the parameter is + 0, all components will be meshed, if + 1, only the main (outermost) component will be meshed + + -p0 : disables creation of internal points. + + -C : uses an alternative boundary recovery mechanism. It should be used only + when the standard boundary recovery fails. + + -E count : sets the extended output for error messages. If -E is used, + the error messages will be printed, it is possible + to indicate the maximum number of printed messages between 1 and 100. + + -t : generates an error file prefix.Log + + -o level : sets the required optimisation level. + Valid optimisation levels are: + none, light, standard or strong, + with increase of "quality vs speed" ratio. + + -I filetype : defines the input mesh format as follows: + -IP input files are ascii files, named prefix.points + and prefix.faces - this is the default type of files + -IPb input files are binary files, named prefix.pointsb + and prefix.facesb + -IM input file is ascii file, named prefix.mesh + where prefix is defined with -f option + + -a/-b : selects the output file type: + -a for ascii (the default) and + -b for binary. + + -On : saves a NOPO file in addition. NOPO is the mesh data + structure of the Simail and Modulef software packages. + -Om : saves a mesh file in addition. + -Omn : saves both NOPO and mesh files. + + ============================================================================== + TETMESH-GHS3D SOFTWARE 4.0-3 (December, 2006) + END OF SESSION + COPYRIGHT (C)1989-2006 INRIA ALL RIGHTS RESERVED + ============================================================================== + ( Distene SAS + Phone: +33(0)1-69-26-62-10 Fax: +33(0)1-69-26-90-33 + EMail: support@distene.com ) + +\endverbatim +\n +

  • +

    Saving user's preferred GHS3DPRL Advanced Parameters


    +GHS3DPRL Plugin launches standalone binary executable tepal2med.
    +You may rename file tepal2med as tepal2med.exe for example, and replace +tepal2med by a shell script at your convenience to overriding parameters. +
    ... or else $PATH modification... .
    Idem for file tepal.

    +
  • +Advanced tepal2med Parameters - overriding parameter deletegroups

    +You may rename tepal2med as tepal2med.exe for example. + +\code +#!/bin/bash +#script tepal2med overriding parameter deletegroups +#we have renamed binary executable tepal2med as tepal2med.exe +#echo tepal2med initial parameters are $1 $2 $3 $4 ... or $* +#$0 is ignored + +tepal2med.exe $* --deletegroups="(\bAll_Nodes|\bAll_Faces)" + +\endcode +\n +

  • +
  • +Advanced Tepal_V1.4 Parameters - overriding parameter component of ghs3d (to mesh holes).

    +You may rename tepal as tepal.exe for example. + +\code +#!/bin/bash +#script tepal overriding parameter component of tetmesh-ghs3d +#we have renamed binary executable tepal as tepal.exe + +#optionnaly we could set licence only for us +DISTENE_LICENSE_FILE="Use global envvar: DLIM8VAR" +DLIM8VAR="dlim8 1:1:29030@is142356/0016175ef08c::a1ba1...etc...e19" +SIMULOGD_LICENSE_FILE=29029@is142356 + +tepal.exe $* --tetmesh_args "-c 0" + +\endcode +\n +

  • +
  • +Advanced tepal Parameters - overriding launching tepal on other host.

    +You may rename tepal as tepal.exe for example. + +\code +#!/bin/bash +#script tepal overriding launching tepal on other host (tepal run 64 bits only) +#we have renamed binary executable tepal as tepal.exe +#common file system (same path) otherwise scp... on input or result files +#ssh -keygen -t rsa done and files id_rsa et id-rsa.pub move in ~/.ssh + +#example of typical command +#tepal -f /home/myname/tmp/GHS3DPRL -n 4 > /home/myname/tmp/tepal.log +#echo parameters $1 $2 $3 $4 ... or $* + +#tepal licence ought to be known on otherhost +ssh otherhost "tepal.exe $* > /home/myname/tmp/tepal.log" + +#or more and more +#ssh otherhost "tepal.exe $* --tetmesh_args \"-c 0\"" > /home/myname/tmp/tepal.log + +\endcode +\n +

  • + +

    Tepal_V2.0 and MPI use.


    +This all new beta-version needs MPI, (openmpi-1.3.1 was used). To use it you have to proceed +as done in "overriding parameter component of ghs3d". +Advanced ghs3d Parameters (through Tepal_V1.4's --tetmesh_args) are not assumed yet. +It meshes holes. +\n You may rename tepal as tepal64_v2.exe for example, and replace tepal by a shell script like below. + +
  • +example tepal_v2_mpirun.

    + +\code + +#!/bin/bash +#script tepal overriding launching Tepal_V2.0 with MPI (tepal run 64 bits only). +#we have renamed binary executable tepal as tepal64_v2.exe. +#typical command to launch tepal v1 : +#tepal -f /tmp/myname/GHS3DPRL -n 16 > /tmp/myname/tepal.log +#this file is an exemple to transform this call for tepal v2.0, +# (beta version using .mesh input file) +#you have to adapt for your convenience. + +#first problem is convert v1 input files GHS3DPRL.faces and GHS3DPRL.points +# to v2 input file GHS3DPRL.mesh. +#second problem is to launch on heterogeneous system linux cluster of +# 2 hosts (64 bits) of 8 nodes (by example) +# with different 2 executables codes linked on 2 different +# openmpi shared library codes. +#third problem is convert tepal v2 output files GHS3DPRL*.mesh +# to v1 input files GHS3DPRL*.faces an GHS3DPRL*.points. + +#you have to work on the same physical disk and same path input and ouput files : $SAME_DIR +#you have to work on different physical disk but same path and name for executable files +# (and shared libraries) : $DIFF_DIR + +echo "parameter 0="$0 +echo "parameter 1="$1 +echo "parameter 2="$2 +echo "parameter 3="$3 +echo "parameter 4="$4 + +export SAME_DIR=/same_physical_disk_and_same path/tmp +export DIFF_DIR=/different_physical_disk_but_same path/myname + +#copy input local files from local current directory (something like /tmp/myname) +#in this case we need /tmp/myname and $SAME_DIR different +cd $SAME_DIR +rm * +cp $2* . + +export IN_FILES=`basename $2` +export IN_DIR=`dirname $2` +#created .mesh from .faces et .points +/through_salome_path/facespoints2mesh.py $IN_FILES + +#there are 2 executable openmpi and library through 2 physical DIFF_DIR +export PATH=$DIFF_DIR/openmpi-1.3.1_install/bin:${PATH} +export LD_LIBRARY_PATH=$DIFF_DIR/openmpi-1.3.1_install/lib:${LD_LIBRARY_PATH} + +#there are 2 executables tepal_v2 through 2 physical DIFF_DIR +export LD_LIBRARY_PATH=$DIFF_DIR/tepal-2.0.0/bin/Linux_64:${LD_LIBRARY_PATH} +export PATH=$DIFF_DIR/tepal-2.0.0/bin/Linux_64:$PATH + +#small test betweeen friends +#rm hostnames.log +#mpirun -n $4 hostname >> hostnames.log + +#there necessary set env licence file for tepal v2 +export DISTENE_LICENSE_FILE="Use global envvar: DLIM8VAR" +export DLIM8VAR="dlim8 1:1:29030@is142356/0016175ef08c::a1ba...9e19" +export SIMULOGD_LICENSE_FILE=29029@is142356 +export LICENSE_FILE=/product/distene/dlim8.var.sh + +#mpirun with necessary set envenvironment +export TMP_ENV="-x PATH -x LD_LIBRARY_PATH -x DISTENE_LICENSE_FILE -x DLIM8VAR \ + -x SIMULOGD_LICENSE_FILE -x LICENSE_FILE" +#mpirun $TMPENV -n $4 which tepal64_v2.exe >> hostnames.log + +#real mpirun uncomment after verify small test +mpirun $TMPENV -n $4 tepal64_v2.exe --in $IN_FILES.mesh --out $IN_FILES.mesh --verbose 100 + +#convert output files tepalv1 format +/through_salome_path/mesh2facespoints.py $IN_FILES + +#copy ouputs files from $SAME_DIR to local current directory (something like /tmp/myname) +cp -f hostnames.log $IN_DIR +cp -f $IN_FILES* $IN_DIR + +#ls -al $SAME_DIR +#cat $SAME_DIR/hostnames.log +#cat /tmp/myname/tepal.log + +\endcode +\n +

  • + +

    TUI use.


    + +
  • +example ex30_tepal.py.

    + +\code + +#!/bin/python +import os + +import geompy +import smesh + +# Parameters +# ---------- + +results = "/tmp/ZZ" + +radius = 50 +height = 200 + +# Build a cylinder +# ---------------- + +base = geompy.MakeVertex(0, 0, 0) +direction = geompy.MakeVectorDXDYDZ(0, 0, 1) + +cylinder = geompy.MakeCylinder(base, direction, radius, height) + +geompy.addToStudy(cylinder, "Cylinder") + +# Define a mesh on a geometry +# --------------------------- + +m = smesh.Mesh(cylinder) + +# 2D mesh with BLSURF +# ------------------- + +algo2d = m.Triangle(smesh.BLSURF) + +algo2d.SetPhysicalMesh(1) +algo2d.SetPhySize(5) + +algo2d.SetGeometricMesh(0) + +# 3D mesh with tepal +# ------------------ + +algo3d = m.Tetrahedron(smesh.GHS3DPRL) + +algo3d.SetMEDName(results) +algo3d.SetNbPart(4) +algo3d.SetBackground(False) +algo3d.SetKeepFiles(False) +algo3d.SetToMeshHoles(True) + +# Launch meshers +# -------------- + +status = m.Compute() + +# Test if ok +# ---------- + +if os.access(results+".xml", os.F_OK): + print "Ok: tepal" +else: + print "KO: tepal" +\endcode +\n +

  • +
+ + +*/ diff --git a/doc/salome/gui/GHS3DPRLPLUGIN/input/ghs3dprlplugin_python_interface.doc b/doc/salome/gui/GHS3DPRLPLUGIN/input/ghs3dprlplugin_python_interface.doc new file mode 100644 index 0000000..d1591e1 --- /dev/null +++ b/doc/salome/gui/GHS3DPRLPLUGIN/input/ghs3dprlplugin_python_interface.doc @@ -0,0 +1,9 @@ +/*! + +\page ghs3dprlplugin_python_interface_page Python Interface + +Python package \ref GHS3DPRLPluginDC "GHS3DPRLPlugin" defines several classes, destined for creation of the 3D meshes. + +Documentation for GHS3DPRLPlugin package is available in linear form grouped by classes, declared in the GHS3DPRLPluginDC.py file. + +*/ diff --git a/doc/salome/gui/GHS3DPRLPLUGIN/input/index.doc b/doc/salome/gui/GHS3DPRLPLUGIN/input/index.doc new file mode 100644 index 0000000..9f0df8a --- /dev/null +++ b/doc/salome/gui/GHS3DPRLPLUGIN/input/index.doc @@ -0,0 +1,25 @@ +/*! + +\mainpage Introduction to GHS3DPRLPLUGIN + +\note GHS3DPRLPLUGIN plugin used GHS3D commercial mesher and require a +license to be used within the Mesh module. + +\n \b GHS3DPRLPLUGIN plugin is destined for: + +
    +
  • Meshing 3D geometric entities.
  • + - Volumes are split into tetrahedral (pyramidal) elements. +
  • Generating 3D meshes from 2D meshes, working without geometrical objects.
  • +
+ +To manage parameters of the GHS3DPRLPLUGIN use \subpage ghs3dprl_hypo_page. + +Also all GHS3DPRLPLUGIN functionalities are accessible via +\subpage ghs3dprlplugin_python_interface_page "GHS3DPRLPLUGIN Python interface". + + +\image html image2.gif "Example of a tetrahedral 3D mesh" + + +*/ diff --git a/doc/salome/gui/GHS3DPRLPLUGIN/static/doxygen.css b/doc/salome/gui/GHS3DPRLPLUGIN/static/doxygen.css new file mode 100755 index 0000000..7a2dcbd --- /dev/null +++ b/doc/salome/gui/GHS3DPRLPLUGIN/static/doxygen.css @@ -0,0 +1,836 @@ +/* The standard CSS for doxygen */ + +body, table, div, p, dl { + font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; + font-size: 12px; +} + +/* @group Heading Levels */ + +h1 { + font-size: 150%; +} + +h2 { + font-size: 120%; +} + +h3 { + font-size: 100%; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd, p.starttd { + margin-top: 2px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + padding: 2px; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #ffffff; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code { + color: #4665A2; +} + +a.codeRef { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +.fragment { + font-family: monospace, fixed; + font-size: 105%; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; +} + +div.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.version { + border:1px solid #0000FF; + color: #CCCCCC; + font-family: Arial, Helvetica, sans-serif; + font-size: 9pt; + text-align: center; + width:100px; + -moz-border-radius: 8px; + margin: 5px; +} + +div.footer1 { + background-color: #DFE5F1; + border: 1px solid #AAAAAA; + font-family: Arial, Helvetica, sans-serif; + font-size: 11px; + padding: 10px; + margin-top: 15px; +} + + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 10px; + margin-right: 10px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memItemLeft, .memItemRight, .memTemplParams { + border-top: 1px solid #C4CFE5; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.memitem { + padding: 0; + margin-bottom: 10px; +} + +.memname { + white-space: nowrap; + font-weight: bold; + margin-left: 6px; +} + +.memproto { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 8px; + border-top-left-radius: 8px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 8px; + -moz-border-radius-topleft: 8px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 8px; + -webkit-border-top-left-radius: 8px; + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + +} + +.memdoc { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 2px 5px; + background-color: #FBFCFD; + border-top-width: 0; + /* opera specific markup */ + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 8px; + -moz-border-radius-bottomright: 8px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7); + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7)); +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} + +.params, .retval, .exception, .tparams { + border-spacing: 6px 2px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + + + + +/* @end */ + +/* @group Directory (tree) */ + +/* for the tree view */ + +.ftvtree { + font-family: sans-serif; + margin: 0px; +} + +/* these are for tree view when used as main index */ + +.directory { + font-size: 9pt; + font-weight: bold; + margin: 5px; +} + +.directory h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +/* +The following two styles can be used to replace the root node title +with an image of your choice. Simply uncomment the next two styles, +specify the name of your image and be sure to set 'height' to the +proper pixel height of your image. +*/ + +/* +.directory h3.swap { + height: 61px; + background-repeat: no-repeat; + background-image: url("yourimage.gif"); +} +.directory h3.swap span { + display: none; +} +*/ + +.directory > h3 { + margin-top: 0; +} + +.directory p { + margin: 0px; + white-space: nowrap; +} + +.directory div { + display: none; + margin: 0px; +} + +.directory img { + vertical-align: -30%; +} + +/* these are for tree view when not used as main index */ + +.directory-alt { + font-size: 100%; + font-weight: bold; +} + +.directory-alt h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +.directory-alt > h3 { + margin-top: 0; +} + +.directory-alt p { + margin: 0px; + white-space: nowrap; +} + +.directory-alt div { + display: none; + margin: 0px; +} + +.directory-alt img { + vertical-align: -30%; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable { + border-collapse:collapse; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; +} + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +div.ingroups +{ + font-size: 8pt; + padding-left: 5px; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.title { + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +dl +{ + padding: 0 0 0 10px; +} + +dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug +{ + border-left:4px solid; + padding: 0 0 0 6px; +} + +dl.note +{ + border-color: #D0D000; +} + +dl.warning, dl.attention +{ + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + border-color: #00D000; +} + +dl.deprecated +{ + border-color: #505050; +} + +dl.todo +{ + border-color: #00C0E0; +} + +dl.test +{ + border-color: #3030E0; +} + +dl.bug +{ + border-color: #C08050; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectname +{ + background-color: #175783; + border: 1px solid; + height: 80px; + background-repeat: no-repeat; +/* font: 300% arial,sans-serif;*/ + margin: 0px; + padding: 0px; +} + +#projectbrief +{ + font: 120% arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + background: url("head.png"); + background-color: #175783; + border: 1px solid; + height: 80px; + background-repeat: no-repeat; + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + diff --git a/doc/salome/gui/GHS3DPRLPLUGIN/static/footer.html b/doc/salome/gui/GHS3DPRLPLUGIN/static/footer.html new file mode 100755 index 0000000..4c89a2b --- /dev/null +++ b/doc/salome/gui/GHS3DPRLPLUGIN/static/footer.html @@ -0,0 +1,12 @@ + + + +
+
+ Copyright © 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
+ Copyright © 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+
+
+ + + \ No newline at end of file diff --git a/doc/salome/gui/GHS3DPRLPLUGIN/static/header.html.in b/doc/salome/gui/GHS3DPRLPLUGIN/static/header.html.in new file mode 100755 index 0000000..4571b43 --- /dev/null +++ b/doc/salome/gui/GHS3DPRLPLUGIN/static/header.html.in @@ -0,0 +1,20 @@ + + + + + +$title + +$treeview +$search +$mathjax + + + + +
+
Version: @VERSION@
+ +
diff --git a/doc/salome/gui/GHS3DPRLPLUGIN/static/header_py.html.in b/doc/salome/gui/GHS3DPRLPLUGIN/static/header_py.html.in new file mode 100644 index 0000000..61414bb --- /dev/null +++ b/doc/salome/gui/GHS3DPRLPLUGIN/static/header_py.html.in @@ -0,0 +1,21 @@ + + + + + +$title + +$treeview +$search +$mathjax + + + + +
diff --git a/doc/salome/gui/Makefile.am b/doc/salome/gui/Makefile.am new file mode 100644 index 0000000..a8fc025 --- /dev/null +++ b/doc/salome/gui/Makefile.am @@ -0,0 +1,26 @@ +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +SUBDIRS = GHS3DPRLPLUGIN + +usr_docs: + (cd GHS3DPRLPLUGIN && $(MAKE) $(AM_MAKEFLAGS) usr_docs) + +docs: usr_docs diff --git a/idl/GHS3DPRLPlugin_Algorithm.idl b/idl/GHS3DPRLPlugin_Algorithm.idl index 952a300..61c77bc 100755 --- a/idl/GHS3DPRLPlugin_Algorithm.idl +++ b/idl/GHS3DPRLPlugin_Algorithm.idl @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : GHS3DPRLPlugin_Algorithm.idl // Author : Christian VAN WAMBEKE (CEA) -// // --- - +// #ifndef _SMESH_GHS3DPRLALGORITHM_IDL_ #define _SMESH_GHS3DPRLALGORITHM_IDL_ diff --git a/idl/Makefile.am b/idl/Makefile.am index 3f15614..b22ef8e 100644 --- a/idl/Makefile.am +++ b/idl/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,24 +16,22 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : Makefile.am # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- - -# # This Makefile is responsible of generating the client and server # implementation of IDL interfaces for both C++ and python usage. # The building process of the C++ files is in charge of each source # package and then is not manage here. # - include $(top_srcdir)/adm_local/unix/make_common_starter.am BASEIDL_FILES = GHS3DPRLPlugin_Algorithm.idl +BASEIDL_FILES_PY=$(BASEIDL_FILES:%.idl=%_idl.py) + # This variable defines the files to be installed dist_salomeidl_DATA = $(BASEIDL_FILES) @@ -52,7 +50,6 @@ libSalomeIDLGHS3DPRLPLUGIN_la_CPPFLAGS = \ $(SMESH_CXXFLAGS) \ @CORBA_CXXFLAGS@ \ @CORBA_INCLUDES@ \ - -I$(top_builddir)/salome_adm/unix \ -I$(top_builddir)/idl libSalomeIDLGHS3DPRLPLUGIN_la_LDFLAGS = -no-undefined -version-info=0:0:0 @@ -77,8 +74,7 @@ IDLCXXFLAGS = \ -I$(top_builddir)/idl/salome \ -I$(KERNEL_ROOT_DIR)/idl/salome \ -I$(GEOM_ROOT_DIR)/idl/salome \ - -I$(SMESH_ROOT_DIR)/idl/salome \ - -I$(top_builddir)/salome_adm/unix + -I$(SMESH_ROOT_DIR)/idl/salome IDLPYFLAGS = \ @IDLPYFLAGS@ \ -I$(KERNEL_ROOT_DIR)/idl/salome \ @@ -98,9 +94,15 @@ install-exec-local: $(BASEIDL_FILES:%=$(top_srcdir)/idl/%) $(OMNIORB_IDL) $(IDLPYFLAGS) -C$(DESTDIR)$(salomepythondir) $$file ; \ done -# uninstall-local removes too much, but it works in distcheck +# we want to remove only staff generated for IDL files and nothing more uninstall-local: - rm -rf $(DESTDIR)$(salomepythondir)/* + @for modulen in GHS3DPRLPlugin ; do \ + test -d $(DESTDIR)$(salomepythondir)/$${modulen} && echo "Removing $(DESTDIR)$(salomepythondir)/$${modulen}" && rm -rf $(DESTDIR)$(salomepythondir)/$${modulen} ; \ + test -d $(DESTDIR)$(salomepythondir)/$${modulen}__POA && echo "Removing $(DESTDIR)$(salomepythondir)/$${modulen}__POA" && rm -rf $(DESTDIR)$(salomepythondir)/$${modulen}__POA ; \ + done ; \ + for filen in $(BASEIDL_FILES_PY) ; do \ + echo "Removing $(DESTDIR)$(salomepythondir)/$${filen}" && rm -f $(DESTDIR)$(salomepythondir)/$${filen}* ; \ + done mostlyclean-local: -rm -f *.hh *.cc .depidl @@ -114,7 +116,7 @@ mostlyclean-local: @for dep in $^ dummy; do \ if [ $$dep != "dummy" ]; then \ echo Building dependencies for $$dep; \ - $(CPP) $(C_DEPEND_FLAG) -x c -I$(srcdir) -I$(KERNEL_ROOT_DIR)/idl/salome -I$(GEOM_ROOT_DIR)/idl/salome -I$(SMESH_ROOT_DIR)/idl/salome -I$(top_builddir)/salome_adm/unix $$dep 2>/dev/null | \ + $(CPP) $(C_DEPEND_FLAG) -x c -I$(srcdir) -I$(KERNEL_ROOT_DIR)/idl/salome -I$(GEOM_ROOT_DIR)/idl/salome -I$(SMESH_ROOT_DIR)/idl/salome $$dep 2>/dev/null | \ sed 's/\.o/\SK.cc/' >>$@; \ fi; \ done ; diff --git a/resources/GHS3DPRLPlugin.xml b/resources/GHS3DPRLPlugin.xml index b5552f5..cc13596 100755 --- a/resources/GHS3DPRLPlugin.xml +++ b/resources/GHS3DPRLPlugin.xml @@ -1,5 +1,25 @@ + @@ -19,9 +39,15 @@ + dim="3"> + + GHS3DPRL_3D=Tetrahedron(algo=smesh.GHS3DPRL) + GHS3DPRL_Parameters=Parameters() + + + diff --git a/resources/Makefile.am b/resources/Makefile.am index d310ed8..ba9697a 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : Makefile.am # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- - +# include $(top_srcdir)/adm_local/unix/make_common_starter.am dist_salomeres_DATA = \ diff --git a/resources/SalomeApp.xml b/resources/SalomeApp.xml index c03dd1a..2e440d9 100644 --- a/resources/SalomeApp.xml +++ b/resources/SalomeApp.xml @@ -1,3 +1,23 @@ +
@@ -6,4 +26,7 @@
+
+ +
diff --git a/resources/mesh_tree_algo_GHS3DPRL.png b/resources/mesh_tree_algo_GHS3DPRL.png index 092eae3c049d4e0190e7bee44dd45172f8234d25..ad5e9f3c4c3bde47d12ecc2b38ad11c3f05c041e 100755 GIT binary patch delta 224 zcmV<603ZM10hR)gK7SGb01FZU(%pXi00007bV*G`2i61y4lNU8=QUdZ005&&L_t&- z)16Ym4Fe$zvu}y}_gzL|Cd5n`1$BfJAQVIUcPjt(DdN-mUKc5_mDnKvuiI$7siOyO0XBo{33F*b)F zfTJ%jrZ5y{Uuc|4oEtF+Oo9(6?q~IeB$wqMTdd`)>#h@UB<%-)u1cM5{9~ZpthhX0 a9r8C#dv9sO5tJGL0000G72*xW?~cuN(0RXwM zx^XhUrchLE&V`q7E({3BET`4}Mf%;U2XE)l@O;Rqg&^j;o+JrEJ6eDVdcZPj1aSU| ZuN&XWDH9yP%fkQw002ovPDHLkV1fwjLJ$A| diff --git a/resources/mesh_tree_hypo_GHS3DPRL.png b/resources/mesh_tree_hypo_GHS3DPRL.png index cd813c86ac35ddd35ad0169fc285870902fbb093..ad5e9f3c4c3bde47d12ecc2b38ad11c3f05c041e 100755 GIT binary patch delta 224 zcmV<603ZM10hR)gK7SGb01FZU(%pXi00007bV*G`2i61y4lNU8=QUdZ005&&L_t&- z)16Ym4Fe$zvu}y}_gzL|Cd5n`1$BfJAQVIUcPjt(DdN-mUKc5_mDnKvuiI$7siOyO0XBo{33F*b)F zfTJ%jrZ5y{Uuc|4oEtF+Oo9(6?q~IeB$wqMTdd`)>#h@UB<%-)u1cM5{9~ZpthhX0 a9r8C#dv9sO5tJGL0000G72*xW?~cuN(0RXwM zx^XhUrchLE&V`q7E({3BET`4}Mf%;U2XE)l@O;Rqg&^j;o+JrEJ6eDVdcZPj1aSU| ZuN&XWDH9yP%fkQw002ovPDHLkV1h-xK&Aiy diff --git a/src/GHS3DPRLPlugin/GHS3DPRLPluginDC.py b/src/GHS3DPRLPlugin/GHS3DPRLPluginDC.py new file mode 100644 index 0000000..b9bb2a3 --- /dev/null +++ b/src/GHS3DPRLPlugin/GHS3DPRLPluginDC.py @@ -0,0 +1,79 @@ +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +from smesh import Mesh_Algorithm, AssureGeomPublished + +# import GHS3DPRLPlugin module if possible +noGHS3DPRLPlugin = 0 +try: + import GHS3DPRLPlugin +except ImportError: + noGHS3DPRLPlugin = 1 + pass + +# Optimization level of GHS3D +# V3.1 +None_Optimization, Light_Optimization, Medium_Optimization, Strong_Optimization = 0,1,2,3 +# V4.1 (partialy redefines V3.1). Issue 0020574 +None_Optimization, Light_Optimization, Standard_Optimization, StandardPlus_Optimization, Strong_Optimization = 0,1,2,3,4 + +GHS3DPRL = "GHS3DPRL_3D" + + +## Tetrahedron GHS3DPRL 3D algorithm +# It is created by calling Mesh.Tetrahedron( GHS3DPRL, geom=0 ) +# +class GHS3DPRL_Algorithm(Mesh_Algorithm): + + meshMethod = "Tetrahedron" + algoType = GHS3DPRL + + ## Private constructor. + def __init__(self, mesh, geom=0): + Mesh_Algorithm.__init__(self) + if none_optimization: print "Warning: GHS3DPRLPlugin module unavailable" + self.Create(mesh, geom, self.algoType, "libGHS3DPRLEngine.so") + + ## Defines hypothesis having several parameters + # + def Parameters(self): + if not self.params: + self.params = self.Hypothesis("GHS3DPRL_Parameters", [], + "libGHS3DPRLEngine.so", UseExisting=0) + return self.params + + ## To keep working files or remove them. Log file remains in case of errors anyway. + def SetKeepFiles(self, toKeep): + self.Parameters().SetKeepFiles(toKeep) + + ## Sets MED files name and path. + def SetMEDName(self, value): + self.Parameters().SetMEDName(value) + + ## Sets the number of partition of the initial mesh + def SetNbPart(self, value): + self.Parameters().SetNbPart(value) + + ## When big mesh, start tepal in background + def SetBackground(self, value): + self.Parameters().SetBackground(value) + + ## To mesh "holes" in a solid or not. Default is to mesh. + def SetToMeshHoles(self, toMesh): + self.Parameters().SetToMeshHoles(toMesh) diff --git a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Defs.hxx b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Defs.hxx new file mode 100755 index 0000000..3c5d519 --- /dev/null +++ b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Defs.hxx @@ -0,0 +1,37 @@ +// Copyright (C) 2004-2012 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +//============================================================================= +// File : GHS3DPlugin_Defs.hxx +// Author : Alexander A. BORODIN +// +#ifndef _GHS3DPRLPlugin_DEFS_HXX_ +#define _GHS3DPRLPlugin_DEFS_HXX_ + +#ifdef WIN32 + #if defined GHS3DPRLPLUGIN_EXPORTS || defined GHS3DPRLEngine_EXPORTS + #define GHS3DPRLPLUGIN_EXPORT __declspec( dllexport ) + #else + #define GHS3DPRLPLUGIN_EXPORT __declspec( dllimport ) + #endif +#else + #define GHS3DPRLPLUGIN_EXPORT +#endif + +#endif diff --git a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_GHS3DPRL.cxx b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_GHS3DPRL.cxx index 0278eac..cb93731 100755 --- a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_GHS3DPRL.cxx +++ b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_GHS3DPRL.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : GHS3DPRLPlugin_GHS3DPRL.cxx // Author : Christian VAN WAMBEKE (CEA) (from Hexotic plugin Lioka RAZAFINDRAZAKA) -// // --- - +// #include "GHS3DPRLPlugin_GHS3DPRL.hxx" #include "GHS3DPRLPlugin_Hypothesis.hxx" @@ -50,7 +49,12 @@ #include #include +#include #include +#include +#include +#include +#include /* extern "C" { @@ -62,6 +66,16 @@ extern "C" { } using namespace med_2_2;*/ +static void removeFile( const TCollection_AsciiString& fileName ) +{ + try { + OSD_File( fileName ).Remove(); + } + catch ( Standard_ProgramError ) { + MESSAGE("Can't remove file: " << fileName.ToCString() << " ; file does not exist or permission denied"); + } +} + //============================================================================= GHS3DPRLPlugin_GHS3DPRL::GHS3DPRLPlugin_GHS3DPRL(int hypId, int studyId, SMESH_Gen* gen) : SMESH_3D_Algo(hypId, studyId, gen) @@ -126,11 +140,11 @@ static bool writeGHS3DPRLFiles (const TCollection_AsciiString & GHS3DPRL_In, int ifam=0; TCollection_AsciiString namefile(GHS3DPRL_In); namefile+=".points"; - OSD_File(namefile).Remove(); + removeFile(namefile); ofstream theFile; theFile.open(namefile.ToCString(),ios::out); #ifdef WIN32 - Ok=theFile->is_open(); + Ok = theFile.is_open(); #else Ok=theFile.rdbuf()->is_open(); #endif @@ -169,10 +183,10 @@ static bool writeGHS3DPRLFiles (const TCollection_AsciiString & GHS3DPRL_In, theFile.close(); namefile=GHS3DPRL_In+".faces"; - OSD_File(namefile).Remove(); + removeFile(namefile); theFile.open(namefile.ToCString(),ios::out); #ifdef WIN32 - Ok=theFile->is_open(); + Ok=theFile.is_open(); #else Ok=theFile.rdbuf()->is_open(); #endif @@ -281,10 +295,10 @@ static bool readResult(FILE * theFile, int shapeID = theMesh->ShapeToIndex( theShape ); int line = 1, EndOfFile = 0, nbElem = 0, nField = 10, nbRef = 0, aGHS3DPRLNodeID = 0; - char * theField; + const char * theField; - char * tabField [nField]; - int tabRef [nField]; + vector tabField = vector(nField); + vector tabRef = vector(nField); tabField[0] = "MeshVersionFormatted"; tabRef[0] = 0; tabField[1] = "Dimension"; tabRef[1] = 0; @@ -331,7 +345,7 @@ static bool readResult(FILE * theFile, if ( strcmp(theField, "Vertices") == 0 ) { int aGHS3DPRLID; - double coord[nbRef]; + vector coord = vector(nbRef); SMDS_MeshNode * aGHS3DPRLNode; for ( int iElem = 0; iElem < nbElem; iElem++ ) { @@ -345,7 +359,7 @@ static bool readResult(FILE * theFile, } } else { - const SMDS_MeshNode * node[nbRef]; + vector node = vector(nbRef); SMDS_MeshElement* aGHS3DPRLElement; map ::iterator itOnGHS3DPRLNode; @@ -506,7 +520,7 @@ bool GHS3DPRLPlugin_GHS3DPRL::Compute(SMESH_Mesh& theMesh, cout<<"GHS3DPRL command : "<> (istream & load, GHS3DPRLPlugin_GHS3DPRL & hyp) { return hyp.LoadFrom( load ); } + + +//============================================================================= +/*! + * + */ +//============================================================================= +bool GHS3DPRLPlugin_GHS3DPRL::Evaluate(SMESH_Mesh& aMesh, + const TopoDS_Shape& aShape, + MapShapeNbElems& aResMap) +{ + int nbtri = 0, nbqua = 0; + double fullArea = 0.0; + for (TopExp_Explorer exp(aShape, TopAbs_FACE); exp.More(); exp.Next()) { + TopoDS_Face F = TopoDS::Face( exp.Current() ); + SMESH_subMesh *sm = aMesh.GetSubMesh(F); + MapShapeNbElemsItr anIt = aResMap.find(sm); + if( anIt==aResMap.end() ) { + SMESH_ComputeErrorPtr& smError = sm->GetComputeError(); + smError.reset( new SMESH_ComputeError(COMPERR_ALGO_FAILED, + "Submesh can not be evaluated",this)); + return false; + } + std::vector aVec = (*anIt).second; + nbtri += Max(aVec[SMDSEntity_Triangle],aVec[SMDSEntity_Quad_Triangle]); + nbqua += Max(aVec[SMDSEntity_Quadrangle],aVec[SMDSEntity_Quad_Quadrangle]); + GProp_GProps G; + BRepGProp::SurfaceProperties(F,G); + double anArea = G.Mass(); + fullArea += anArea; + } + + // collect info from edges + int nb0d_e = 0, nb1d_e = 0; + bool IsQuadratic = false; + bool IsFirst = true; + TopTools_MapOfShape tmpMap; + for (TopExp_Explorer exp(aShape, TopAbs_EDGE); exp.More(); exp.Next()) { + TopoDS_Edge E = TopoDS::Edge(exp.Current()); + if( tmpMap.Contains(E) ) + continue; + tmpMap.Add(E); + SMESH_subMesh *aSubMesh = aMesh.GetSubMesh(exp.Current()); + MapShapeNbElemsItr anIt = aResMap.find(aSubMesh); + std::vector aVec = (*anIt).second; + nb0d_e += aVec[SMDSEntity_Node]; + nb1d_e += Max(aVec[SMDSEntity_Edge],aVec[SMDSEntity_Quad_Edge]); + if(IsFirst) { + IsQuadratic = (aVec[SMDSEntity_Quad_Edge] > aVec[SMDSEntity_Edge]); + IsFirst = false; + } + } + tmpMap.Clear(); + + double ELen = sqrt(2.* ( fullArea/(nbtri+nbqua*2) ) / sqrt(3.0) ); + + GProp_GProps G; + BRepGProp::VolumeProperties(aShape,G); + double aVolume = G.Mass(); + double tetrVol = 0.1179*ELen*ELen*ELen; + double CoeffQuality = 0.9; + int nbVols = (int)aVolume/tetrVol/CoeffQuality; + int nb1d_f = (nbtri*3 + nbqua*4 - nb1d_e) / 2; + int nb1d_in = (int) ( nbVols*6 - nb1d_e - nb1d_f ) / 5; + std::vector aVec(SMDSEntity_Last); + for(int i=0; i #include CORBA_SERVER_HEADER(GHS3DPRLPlugin_Algorithm) #include CORBA_SERVER_HEADER(SALOME_Exception) @@ -36,7 +37,7 @@ // ====================================================== // GHS3DPRL 3d algorithm // ====================================================== -class GHS3DPRLPlugin_GHS3DPRL_i: +class GHS3DPRLPLUGIN_EXPORT GHS3DPRLPlugin_GHS3DPRL_i: public virtual POA_GHS3DPRLPlugin::GHS3DPRLPlugin_GHS3DPRL, public virtual SMESH_3D_Algo_i { diff --git a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis.cxx b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis.cxx index 8f29b51..04bb483 100755 --- a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis.cxx +++ b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis.cxx @@ -1,27 +1,28 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- // File : GHS3DPRLPlugin_Hypothesis.cxx // Author : Christian VAN WAMBEKE (CEA) (from Hexotic plugin Lioka RAZAFINDRAZAKA) // --- - -#include +// +#include "GHS3DPRLPlugin_Hypothesis.hxx" #include //============================================================================= @@ -61,7 +62,7 @@ static std::string cutOrReplaceBlancs(std::string theIn) for (int i = 0, j = 0; i < len; i++) { - ushort ucs = (ushort)(str1[i]); + unsigned short ucs = (unsigned short)(str1[i]); if ((9 <= ucs && ucs <= 13) || ucs == 32) { if (!del) diff --git a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis.hxx b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis.hxx index 7dd85b3..8d9808a 100755 --- a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis.hxx +++ b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis.hxx @@ -1,36 +1,39 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- // File : GHS3DPRLPlugin_Hypothesis.hxx // Author : Christian VAN WAMBEKE (CEA) (from Hexotic plugin Lioka RAZAFINDRAZAKA) // --- - +// #ifndef _GHS3DPRLPlugin_Hypothesis_HXX_ #define _GHS3DPRLPlugin_Hypothesis_HXX_ +#include "GHS3DPRLPlugin_Defs.hxx" + #include "SMESH_Hypothesis.hxx" #include "Utils_SALOME_Exception.hxx" // Parameters for work of GHS3DPRL // -class GHS3DPRLPlugin_Hypothesis: public SMESH_Hypothesis +class GHS3DPRLPLUGIN_EXPORT GHS3DPRLPlugin_Hypothesis: public SMESH_Hypothesis { public: diff --git a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis_i.cxx b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis_i.cxx index c7f044d..70c4bcf 100755 --- a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis_i.cxx +++ b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis_i.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : GHS3DPRLPlugin_Hypothesis_i.cxx // Author : Christian VAN WAMBEKE (CEA) (from Hexotic plugin Lioka RAZAFINDRAZAKA) -// // --- - +// #include "GHS3DPRLPlugin_Hypothesis_i.hxx" #include "SMESH_Gen.hxx" #include "SMESH_PythonDump.hxx" diff --git a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis_i.hxx b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis_i.hxx index e62fb30..0c9d0fb 100755 --- a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis_i.hxx +++ b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_Hypothesis_i.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,16 +16,17 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : GHS3DPRLPlugin_Hypothesis_i.hxx // Author : Christian VAN WAMBEKE (CEA) (from Hexotic plugin Lioka RAZAFINDRAZAKA) -// // --- - +// #ifndef _GHS3DPRLPlugin_Hypothesis_i_HXX_ #define _GHS3DPRLPlugin_Hypothesis_i_HXX_ +#include "GHS3DPRLPlugin_Defs.hxx" + #include #include CORBA_SERVER_HEADER(GHS3DPRLPlugin_Algorithm) @@ -36,7 +37,7 @@ class SMESH_Gen; // GHS3DPRLPlugin parameters hypothesis -class GHS3DPRLPlugin_Hypothesis_i: +class GHS3DPRLPLUGIN_EXPORT GHS3DPRLPlugin_Hypothesis_i: public virtual POA_GHS3DPRLPlugin::GHS3DPRLPlugin_Hypothesis, public virtual SMESH_Hypothesis_i { diff --git a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_i.cxx b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_i.cxx index bd5fd31..026c483 100755 --- a/src/GHS3DPRLPlugin/GHS3DPRLPlugin_i.cxx +++ b/src/GHS3DPRLPlugin/GHS3DPRLPlugin_i.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,13 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : GHS3DPRLPlugin_i.cxx // Author : Christian VAN WAMBEKE (CEA) (from Hexotic plugin Lioka RAZAFINDRAZAKA) -// // --- - +// +#include "GHS3DPRLPlugin_Defs.hxx" #include "SMESH_Hypothesis_i.hxx" #include "utilities.h" @@ -44,7 +44,10 @@ template class GHS3DPRLPlugin_Creator_i:public HypothesisCreator_i extern "C" { - GenericHypothesisCreator_i* GetHypothesisCreator (const char* aHypName) + + GHS3DPRLPLUGIN_EXPORT GenericHypothesisCreator_i* GetHypothesisCreator (const char* aHypName); + + GHS3DPRLPLUGIN_EXPORT GenericHypothesisCreator_i* GetHypothesisCreator (const char* aHypName) { MESSAGE("GetHypothesisCreator " << aHypName); diff --git a/src/GHS3DPRLPlugin/Makefile.am b/src/GHS3DPRLPlugin/Makefile.am index cafa635..8a6c8c1 100644 --- a/src/GHS3DPRLPlugin/Makefile.am +++ b/src/GHS3DPRLPlugin/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : Makefile.am # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- - +# include $(top_srcdir)/adm_local/unix/make_common_starter.am # header files @@ -32,8 +31,9 @@ salomeinclude_HEADERS = lib_LTLIBRARIES = libGHS3DPRLEngine.la dist_libGHS3DPRLEngine_la_SOURCES = \ - GHS3DPRLPlugin_GHS3DPRL.hxx \ - GHS3DPRLPlugin_GHS3DPRL.cxx \ + GHS3DPRLPlugin_Defs.hxx \ + GHS3DPRLPlugin_GHS3DPRL.hxx \ + GHS3DPRLPlugin_GHS3DPRL.cxx \ GHS3DPRLPlugin_GHS3DPRL_i.hxx \ GHS3DPRLPlugin_GHS3DPRL_i.cxx \ GHS3DPRLPlugin_Hypothesis.hxx \ @@ -48,14 +48,20 @@ libGHS3DPRLEngine_la_CPPFLAGS = \ $(MED_CXXFLAGS) \ $(GEOM_CXXFLAGS) \ $(CAS_CPPFLAGS) \ + $(VTK_INCLUDES) \ $(SMESH_CXXFLAGS) \ $(CORBA_CXXFLAGS) \ $(CORBA_INCLUDES) \ $(BOOST_CPPFLAGS) \ - -I$(top_builddir)/idl \ - -I$(top_builddir)/salome_adm/unix + -I$(top_builddir)/idl libGHS3DPRLEngine_la_LDFLAGS = \ ../../idl/libSalomeIDLGHS3DPRLPLUGIN.la \ - $(SMESH_LDFLAGS) -lSMESHimpl -lSMESHEngine -lStdMeshersEngine \ - $(KERNEL_LDFLAGS) -lSalomeGenericObj + $(SMESH_LDFLAGS) -lSMESHimpl -lSMESHEngine -lStdMeshersEngine \ + $(KERNEL_LDFLAGS) -lSalomeGenericObj -lSALOMELocalTrace \ + $(MED_LDFLAGS) -lSalomeIDLMED \ + $(CAS_LDFLAGS) -lTKBRep -lTKG3d -lTKTopAlgo\ + $(SMESH_LDFLAGS) -lSMDS -lSMESHDS -lTKG2d + +# Scripts to be installed. +dist_salomescript_DATA= GHS3DPRLPluginDC.py diff --git a/src/Makefile.am b/src/Makefile.am index 57db467..20ada46 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,19 +16,18 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : Makefile.am # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- - +# include $(top_srcdir)/adm_local/unix/make_common_starter.am -SUBDIRS = GHS3DPRLPlugin +SUBDIRS = GHS3DPRLPlugin tools if GHS3DPRLPLUGIN_ENABLE_GUI SUBDIRS += gui tepal2med endif -DIST_SUBDIRS = GHS3DPRLPlugin gui tepal2med +DIST_SUBDIRS = GHS3DPRLPlugin gui tepal2med tools diff --git a/src/gui/GHS3DPRLPluginGUI.cxx b/src/gui/GHS3DPRLPluginGUI.cxx index b5210f1..d4d8f40 100755 --- a/src/gui/GHS3DPRLPluginGUI.cxx +++ b/src/gui/GHS3DPRLPluginGUI.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : GHS3DPRLPluginGUI.cxx // Author : Christian VAN WAMBEKE (CEA) (from Hexotic plugin Lioka RAZAFINDRAZAKA) -// // --- - +// #include "GHS3DPRLPluginGUI_HypothesisCreator.h" //============================================================================= @@ -32,7 +31,7 @@ //============================================================================= extern "C" { - SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator( const QString& aHypType ) + GHS3DPRLPLUGINGUI_EXPORT SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator( const QString& aHypType ) { SMESHGUI_GenericHypothesisCreator* aCreator = NULL; if( aHypType=="GHS3DPRL_Parameters" ) diff --git a/src/gui/GHS3DPRLPluginGUI_HypothesisCreator.cxx b/src/gui/GHS3DPRLPluginGUI_HypothesisCreator.cxx index 5927a6c..c0f9e48 100755 --- a/src/gui/GHS3DPRLPluginGUI_HypothesisCreator.cxx +++ b/src/gui/GHS3DPRLPluginGUI_HypothesisCreator.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : GHS3DPRLPluginGUI_HypothesisCreator.cxx // Author : Christian VAN WAMBEKE (CEA) (from Hexotic plugin Lioka RAZAFINDRAZAKA) -// // --- - +// #include "GHS3DPRLPluginGUI_HypothesisCreator.h" #include @@ -47,6 +46,7 @@ GHS3DPRLPluginGUI_HypothesisCreator::GHS3DPRLPluginGUI_HypothesisCreator( const : SMESHGUI_GenericHypothesisCreator( theHypType ), myIs3D( true ) { + printf("Hypo creator !!!!!!!!!!!!!!!!!!!!!!!!!! RNV"); } GHS3DPRLPluginGUI_HypothesisCreator::~GHS3DPRLPluginGUI_HypothesisCreator() diff --git a/src/gui/GHS3DPRLPluginGUI_HypothesisCreator.h b/src/gui/GHS3DPRLPluginGUI_HypothesisCreator.h index fd59e9c..b7717c9 100755 --- a/src/gui/GHS3DPRLPluginGUI_HypothesisCreator.h +++ b/src/gui/GHS3DPRLPluginGUI_HypothesisCreator.h @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,16 +16,26 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : GHS3DPRLPluginGUI_HypothesisCreator.h // Author : Christian VAN WAMBEKE (CEA) (from Hexotic plugin Lioka RAZAFINDRAZAKA) -// // --- - +// #ifndef GHS3DPRLPLUGINGUI_HypothesisCreator_H #define GHS3DPRLPLUGINGUI_HypothesisCreator_H +#ifdef WIN32 + #if defined GHS3DPRLPluginGUI_EXPORTS + #define GHS3DPRLPLUGINGUI_EXPORT __declspec( dllexport ) + #else + #define GHS3DPRLPLUGINGUI_EXPORT __declspec( dllimport ) + #endif +#else + #define GHS3DPRLPLUGINGUI_EXPORT +#endif + + #include class QtxIntSpinBox; @@ -45,7 +55,7 @@ typedef struct /*! * \brief Class for creation of GHS3DPRL hypotheses */ -class GHS3DPRLPluginGUI_HypothesisCreator : public SMESHGUI_GenericHypothesisCreator +class GHS3DPRLPLUGINGUI_EXPORT GHS3DPRLPluginGUI_HypothesisCreator : public SMESHGUI_GenericHypothesisCreator { Q_OBJECT diff --git a/src/gui/GHS3DPRLPlugin_images.ts b/src/gui/GHS3DPRLPlugin_images.ts index b46d1aa..e19cd0a 100644 --- a/src/gui/GHS3DPRLPlugin_images.ts +++ b/src/gui/GHS3DPRLPlugin_images.ts @@ -1,5 +1,6 @@ + - + @default diff --git a/src/gui/GHS3DPRLPlugin_msg_en.ts b/src/gui/GHS3DPRLPlugin_msg_en.ts index 5c65fc0..1cc4e4f 100644 --- a/src/gui/GHS3DPRLPlugin_msg_en.ts +++ b/src/gui/GHS3DPRLPlugin_msg_en.ts @@ -1,58 +1,59 @@ + - - - @default - - GHS3DPRL_3D_HYPOTHESIS - GHS3DPRL 3D - - - GHS3DPRL_3D_TITLE - Hypothesis Construction - - - GHS3DPRL_KeepFiles - Keep_Files - - - GHS3DPRL_Background - Tepal_in_Background - - - GHS3DPRL_ToMeshHoles - To_Mesh_Holes - - - GHS3DPRL_MEDName - MED_Name - - - GHS3DPRL_NbPart - Nb_Part - - - GHS3DPRL_WhatsThis_KeepFiles - Keep intemediates tepal Files (.faces,.points,.msg,.noboite...) - - - GHS3DPRL_WhatsThis_Background - lanch tepal in background (for a big mesh, a long time...) - - - GHS3DPRL_WhatsThis_ToMeshHoles - tepal meshes holes - - - GHS3DPRL_WhatsThis_MEDName - Generic path/name of finals outputs files (.med) - - - GHS3DPRL_WhatsThis_Name - Name of applied hypothese - - - GHS3DPRL_WhatsThis_NbPart - Number of partitions of initial wrap - - + + + @default + + GHS3DPRL_3D_HYPOTHESIS + GHS3DPRL 3D + + + GHS3DPRL_3D_TITLE + Hypothesis Construction + + + GHS3DPRL_KeepFiles + Keep files + + + GHS3DPRL_Background + Tepal in background + + + GHS3DPRL_ToMeshHoles + To mesh holes + + + GHS3DPRL_MEDName + MED Name + + + GHS3DPRL_NbPart + Nb partitions + + + GHS3DPRL_WhatsThis_KeepFiles + Keep intemediates Tepal Files (.faces,.points,.msg,.noboite...) + + + GHS3DPRL_WhatsThis_Background + Lanch Tepal in background (for a big mesh, a long time...) + + + GHS3DPRL_WhatsThis_ToMeshHoles + Tepal meshes holes + + + GHS3DPRL_WhatsThis_MEDName + Generic path/name of finals outputs files (.med) + + + GHS3DPRL_WhatsThis_Name + Name of applied hypothese + + + GHS3DPRL_WhatsThis_NbPart + Number of partitions of initial wrap + + diff --git a/src/gui/GHS3DPRLPlugin_msg_fr.ts b/src/gui/GHS3DPRLPlugin_msg_fr.ts new file mode 100755 index 0000000..2758ea7 --- /dev/null +++ b/src/gui/GHS3DPRLPlugin_msg_fr.ts @@ -0,0 +1,59 @@ + + + + + @default + + GHS3DPRL_3D_HYPOTHESIS + GHS3DPRL 3D + + + GHS3DPRL_3D_TITLE + Construction d'une hypothèse + + + GHS3DPRL_KeepFiles + Sauvegarder les fichiers + + + GHS3DPRL_Background + Tepal en arrière plan + + + GHS3DPRL_ToMeshHoles + Mailler les trous + + + GHS3DPRL_MEDName + Nom MED + + + GHS3DPRL_NbPart + Nombre de partitions + + + GHS3DPRL_WhatsThis_KeepFiles + Préserver les fichiers Tepal intermédiaires (.faces,.points,.msg,.noboite...) + + + GHS3DPRL_WhatsThis_Background + Lancer Tepal en arrière-plan (prend du temps pour un maillage de grand volume...) + + + GHS3DPRL_WhatsThis_ToMeshHoles + Tepal maille les trous + + + GHS3DPRL_WhatsThis_MEDName + Chemin/nom générique des fichiers de sortie finaux (.med) + + + GHS3DPRL_WhatsThis_Name + Nom de l'hypothèse appliquée + + + GHS3DPRL_WhatsThis_NbPart + Nombre de partitions de l'enveloppe initiale + + + diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am index 185164e..386397f 100644 --- a/src/gui/Makefile.am +++ b/src/gui/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : Makefile.am # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- - +# include $(top_srcdir)/adm_local/unix/make_common_starter.am # header files @@ -57,15 +56,17 @@ libGHS3DPRLPluginGUI_la_CPPFLAGS = \ $(CORBA_CXXFLAGS) \ $(CORBA_INCLUDES) \ -I$(srcdir)/../GHS3DPRLPlugin \ - -I$(top_builddir)/idl \ - -I$(top_builddir)/salome_adm/unix + -I$(top_builddir)/idl libGHS3DPRLPluginGUI_la_LDFLAGS = \ + $(QT_LIBS) \ ../GHS3DPRLPlugin/libGHS3DPRLEngine.la \ ${SMESH_LDFLAGS} -lSMESH \ - $(CAS_KERNEL) + $(CAS_KERNEL) \ + $(GUI_LDFLAGS) -lsuit -lqtx -lSalomeApp # resources files nodist_salomeres_DATA = \ GHS3DPRLPlugin_images.qm \ - GHS3DPRLPlugin_msg_en.qm + GHS3DPRLPlugin_msg_en.qm \ + GHS3DPRLPlugin_msg_fr.qm diff --git a/src/tepal2med/Makefile.am b/src/tepal2med/Makefile.am index a64fd0a..bafa2f1 100644 --- a/src/tepal2med/Makefile.am +++ b/src/tepal2med/Makefile.am @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # + # --- -# # File : Makefile.am # Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -# # --- - +# include $(top_srcdir)/adm_local/unix/make_common_starter.am bin_PROGRAMS = tepal2med @@ -44,6 +43,6 @@ BUILT_SOURCES = $(UIC_FILES) nodist_tepal2med_SOURCES = $(MOC_FILES) $(UIC_FILES) -tepal2med_CPPFLAGS = $(QT_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) $(LIBXML_INCLUDES) +tepal2med_CPPFLAGS = -I. $(QT_INCLUDES) $(MED3_INCLUDES) $(HDF5_INCLUDES) $(LIBXML_INCLUDES) -tepal2med_LDADD = $(QT_LIBS) $(MED2_LIBS) $(HDF5_LIBS) $(LIBXML_LIBS) +tepal2med_LDADD = $(QT_LIBS) $(MED3_LIBS) $(HDF5_LIBS) $(LIBXML_LIBS) diff --git a/src/tepal2med/dlg_ghs3dmain.cxx b/src/tepal2med/dlg_ghs3dmain.cxx index d56048c..0e4cdcd 100755 --- a/src/tepal2med/dlg_ghs3dmain.cxx +++ b/src/tepal2med/dlg_ghs3dmain.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : dlg_gsh3dmain.cxx // Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -// // --- - +// #include "dlg_ghs3dmain.h" dlg_ghs3dmain::dlg_ghs3dmain() diff --git a/src/tepal2med/dlg_ghs3dmain.h b/src/tepal2med/dlg_ghs3dmain.h index cc10918..c28e886 100755 --- a/src/tepal2med/dlg_ghs3dmain.h +++ b/src/tepal2med/dlg_ghs3dmain.h @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : dlg_gsh3dmain.h // Author : Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com) -// // --- - +// #ifndef DLG_GHS3DMAIN_H #define DLG_GHS3DMAIN_H diff --git a/src/tepal2med/ghs3dprl_mesh_wrap.cxx b/src/tepal2med/ghs3dprl_mesh_wrap.cxx index 090425d..aaeb05c 100755 --- a/src/tepal2med/ghs3dprl_mesh_wrap.cxx +++ b/src/tepal2med/ghs3dprl_mesh_wrap.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,37 +16,52 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : ghs3dprl_mesh_wrap.cxx // Author : Christian VAN WAMBEKE (CEA) -// // --- - +// #include "ghs3dprl_mesh_wrap.h" #include #include #include #include +#ifndef WIN32 +#include +#endif #include #include #include #include +#ifdef WIN32 +#include +#include +#include +#define F_OK 0 +#undef max +#undef min +#endif #include #include +#include -using namespace std; -using namespace med_2_2; +extern "C" { +#include +//#include +//#include +//#include +} //utils procedures //************************************ -string i2a(const int &v) +std::string i2a(const int &v) { - ostringstream ss; + std::ostringstream ss; ss<\tGroups="; + nbf++; + std::cout<<"Family=<"<<(*it1).first.toLatin1().constData()<<">\tGroups="; gb=(*it1).second; for (it2=gb.begin(); it2!=gb.end(); ++it2){ - cout<<"<"<<(*it2).first.toLatin1().constData()<<"> "; + std::cout<<"<"<<(*it2).first.toLatin1().constData()<<"> "; } - cout<\tFamilies="; + nbg++; + std::cout<<"Group=<"<<(*it1).first.toLatin1().constData()<<">\tFamilies="; gb=(*it1).second; for (it2=gb.begin(); it2!=gb.end(); ++it2){ - cout<<"<"<<(*it2).first.toLatin1().constData()<<"> "; + std::cout<<"<"<<(*it2).first.toLatin1().constData()<<"> "; } - cout<\t<"<\n"; + //std::cout<<"add family <"<\t<"<\n"; fagr::iterator it; it=fam.find(nomfam); if (it==fam.end()){ - //cout<<"add new family <"<\t<"<\n"; + //std::cout<<"add new family <"<\t<"<\n"; newfam(nomfam); it=fam.find(nomfam); } @@ -165,7 +184,7 @@ void charendnull(char *p, QString deb, int lg) (*it).second[nomgro]=0; it=gro.find(nomgro); if (it==gro.end()){ - //cout<<"***new*** "<<"<<*tmp<<">\n"; + //std::cout<<"NewFamily Found<"<<*ires<<"><"<<*tmp<<">\n"; return true; } ii=ii+pas; } - cerr<<"***get_number_of_new_family*** Problem new family not found"< from <"<< + //std::cout<<"find_family_on_groups old <"< from <"<< // fam1<<"><"<\n"; return ires; } } - //cout<<"no family found!!! - groups of "<add(tmp,(*it).first); } - //cout<<"new family <"< intersection of <"<<"<\n"; + //std::cout<<"new family <"< intersection of <"<<"<\n"; return ires; } @@ -241,7 +260,7 @@ bool familles::get_number_of_new_family(int sign, med_int *ires, QString *tmp) nom2=nom2.sprintf("%d",fam2); it2=fam.find(nom2); if ( (it1==fam.end())||(it2==fam.end()) ) { - cerr<<"***fuse_goups*** non existing family "< "; + std::cout<<"<"<<(*it).first.toLatin1().constData()<<"> "; } - cout<memorymax) { - cout<<"***WARNING*** memory max reached "<memorymax) { - cout<<"***WARNING*** memory max reached "<filename<filename<CVWtab_deallocate(); //remove temporary file if (this->filename!="_NO_FILE") { remove(this->filename.toLatin1().constData()); //#include - //cout<filename<<" successfully deleted\n"; + //std::cout<filename<<" successfully deleted\n"; } } @@ -313,7 +332,7 @@ CVWtab::~CVWtab() //************************************ bool CVWtab::CVWtab_deallocate() { - //cout<<" deallocate CVWtab*** "<size<type==1) cout<<"med_int tab1[0]="<tmint[0]<type==2) cout<<"med_float tab1[0]="<tmflo[0]<size<type==1) std::cout<<"med_int tab1[0]="<tmint[0]<type==2) std::cout<<"med_float tab1[0]="<tmflo[0]<size!=tab2->size) return false; if (this->type!=tab2->type) return false; if (this->type==1) { if (!this->tmint) - { cout<<"***is_equal*** pb pointer NULL with tmint size="<size<size<size<=tab1->size) { - cerr<<"BadIndice tab1 in is_equal_vertices "<< - di1<<" not in "<size<size<=tab2->size) { - cerr<<"BadIndice tab2 in is_equal_vertices "<< - di2<<" not in "<size<size<tmflo+di1); @@ -399,11 +418,11 @@ bool CVW_is_equal_vertices(CVWtab *tab1, long i1, } //************************************ -bool CVW_FindString(const string &str,fstream &Ff, long &count) +bool CVW_FindString(const std::string &str,std::fstream &Ff, long &count) //find in file first line with string str in first position of line //converts count value expected after "='" in line found { - string line; + std::string line; QString tmp; do { @@ -422,7 +441,7 @@ bool CVW_FindString(const string &str,fstream &Ff, long &count) } else { - cerr<<"Problem line '"< for speed (and so no test) { QString tmp; - fstream Ff(FileName.toLatin1().constData(),ios_base::in); - string line; + std::fstream Ff(FileName.toLatin1().constData(),std::ios_base::in); + std::string line; long i,count,nbneighbour,ineighbour; bool ok; if (!Ff.is_open()) { - cerr<<"Problem File '"<nofile<<"="<4) std::cout<<"Vertices "<nofile,ineighbour); @@ -466,7 +485,7 @@ bool ghs3dprl_mesh_wrap::ReadFileMSGnew(const QString FileName) if (count>0){ med_int *tmint=new med_int[count]; for (int i=0; i>tmint[i]; - if (verbose>4) cout<<"Edges "<4) std::cout<<"Edges "<nofile,ineighbour); @@ -476,7 +495,7 @@ bool ghs3dprl_mesh_wrap::ReadFileMSGnew(const QString FileName) if (count>0){ med_int *tmint=new med_int[count]; for (int i=0; i>tmint[i]; - if (verbose>4) cout<<"Faces "<4) std::cout<<"Faces "<nofile,ineighbour); @@ -486,7 +505,7 @@ bool ghs3dprl_mesh_wrap::ReadFileMSGnew(const QString FileName) if (count>0){ med_int *tmint=new med_int[count]; for (int i=0; i>tmint[i]; - if (verbose>4) cout<<"Elements "<4) std::cout<<"Elements "<nofile,ineighbour); @@ -505,25 +524,25 @@ bool ghs3dprl_mesh_wrap::ReadFileGLO(const QString FileName) //read file .glo with no parser xml because big file (volume) { QString tmp; - fstream Ff(FileName.toLatin1().constData(),ios_base::in); - string line; + std::fstream Ff(FileName.toLatin1().constData(),std::ios_base::in); + std::string line; long count; bool ok; if (!Ff.is_open()) { - cerr<<"Problem File '"<4) std::cout<<"Elements "<nofile); @@ -531,12 +550,12 @@ bool ghs3dprl_mesh_wrap::ReadFileGLO(const QString FileName) } if (!CVW_FindString("4) std::cout<<"Elements "<nofile); @@ -544,12 +563,12 @@ bool ghs3dprl_mesh_wrap::ReadFileGLO(const QString FileName) } if (!CVW_FindString("4) std::cout<<"Elements "<nofile); @@ -557,12 +576,12 @@ bool ghs3dprl_mesh_wrap::ReadFileGLO(const QString FileName) } if (!CVW_FindString("4) std::cout<<"Elements "<nofile); @@ -579,19 +598,19 @@ bool ghs3dprl_mesh_wrap::ReadFileFACES(const QString FileName) //read file .faces (wrap) { QString tmp; - fstream Ff(FileName.toLatin1().constData(),ios_base::in); - string line; + std::fstream Ff(FileName.toLatin1().constData(),std::ios_base::in); + std::string line; long nbelem,ntype; bool ok; if (!Ff.is_open()) { - cerr<<"Problem File '"<3) cout<<"FacesNumberOfElements="<3) std::cout<<"FacesNumberOfElements="<>ntype; if (ntype!=3) //only triangles { - cerr<<"Problem on ntype != 3"<>tmint[i+j]; - //for (int j=0; j<7; j++) cout<4) cout<<"Elements "<4) std::cout<<"Elements "<nofile); @@ -633,28 +652,28 @@ bool ghs3dprl_mesh_wrap::ReadFileNOBOITE(const QString FileName) //(parameter option of ghs3d but NOT tepal) { QString tmp; - fstream Ff(FileName.toLatin1().constData(),ios_base::in); + std::fstream Ff(FileName.toLatin1().constData(),std::ios_base::in); long ne,np,npfixe,subnumber,reste; bool ok; if (!Ff.is_open()){ - cerr<<"Problem File '"<>ne>>np>>npfixe; if (verbose>3){ - cout<<"NoboiteNumberOfElements="<>tmint[i]; - if (verbose>4) cout<<"Elements "<4) std::cout<<"Elements "<nofile); @@ -662,17 +681,36 @@ bool ghs3dprl_mesh_wrap::ReadFileNOBOITE(const QString FileName) med_float *tmflo=new med_float[np*3]; for (int i=0; i>tmflo[i]; - if (verbose>4) cout<<"Vertices "<4) std::cout<<"Vertices "<nofile); ok=this->insert_key(tmp,montab); Ff>>subnumber; - if (verbose>2) cout<<"NumberOfSubdomains="<>tmint[i]; - if (verbose>4) cout<<"Subdomains "<2) std::cout<<"NumberOfSubdomains="<::max(); + //pb from tepalv2 + bool isproblem=true; + for (int i=0; i>onelong; + //pb from tepalv2 + if (onelong<0) { + if (isproblem && verbose>1) std::cout<<"There is one or more negative med_int value in NumberOfSubdomains "<maxint) { + if (isproblem && verbose>1) std::cout<<"There is one or more truncated med_int value in NumberOfSubdomains "<4) std::cout<<"Subdomains "<nofile); @@ -698,7 +736,7 @@ bool ghs3dprl_mesh_wrap::ReadFileNOBOITEB(const QString FileName) { bool ok; QString tmp; - cerr<<"Problem function ReadFileNOBOITEB\n" + std::cerr<<"Problem function ReadFileNOBOITEB\n" <<"(no FORTRAN binary format files in tepal)\n\n"; //file binary FILE *Ff=fopen(FileName.toLatin1().constData(),"rb"); @@ -709,24 +747,24 @@ bool ghs3dprl_mesh_wrap::ReadFileNOBOITEB(const QString FileName) //=> 2*long(68) (68=17*4octets) long r1[17+2]; if (!Ff){ - cerr<<"Problem File '"<3){ - cout<<"NoboitebNumberOfElements="<4) std::cout<<"Elements "<nofile); ok=this->insert_key(tmp,montab); fread(&reste,sizeof(long),1,Ff); - //cout<<"info "<2) cout<<"NumberOfSubdomains="<2) std::cout<<"NumberOfSubdomains="<2) cout<<"NumberOfVertices="<2) std::cout<<"NumberOfVertices="< size="<size< size="<size<verbose>6) cout<<"remove key "<verbose>6) std::cout<<"remove key "< it(this->mestab); while ( it.hasNext() ){ it.next(); if (it.key().contains(rxp)) nbremove++; } - //cout<<"nb_key_mesh_wrap found "<tmint){ if (verbose>3) - cout<<"SwapOnFile_binary "<filename.toLatin1().constData()<< + std::cout<<"SwapOnFile_binary "<filename.toLatin1().constData()<< " NbElements "<tmint,sizeof(med_int),taille,fichier); //fread(&gagnants,sizeof(gagnants),1,fichier); } if (tab->tmflo){ if (verbose>3) - cout<<"SwapOnFile_binary "<filename.toLatin1().constData()<< + std::cout<<"SwapOnFile_binary "<filename.toLatin1().constData()<< " NbElements "<tmflo,sizeof(med_float),taille,fichier); } fclose(fichier); } else{ - if (verbose>3) cout<<"SwapOnFile in binary file done yet "<< - tab->filename.toLatin1().constData()<3) std::cout<<"SwapOnFile in binary file done yet "<< + tab->filename.toLatin1().constData()<CVWtab_deallocate(); //free memory @@ -956,9 +994,9 @@ long ghs3dprl_mesh_wrap::SwapOutOfMemory_key_mesh_wrap(const QRegExp &rxp, nb++; if ((it.value()->size>0)&&(it.value()->size>ifgreaterthan)){ if (verbose>3) - cout<<"SwapOutOfMemory_key_mesh_wrap on demand "<< + std::cout<<"SwapOutOfMemory_key_mesh_wrap on demand "<< it.key().toLatin1().constData()<< - " size "<size<<">"<size<<">"<path,it.value(),this->verbose); } @@ -971,34 +1009,34 @@ bool ghs3dprl_mesh_wrap::list_onekey_mesh_wrap(const QString &key) { CVWtab *montab=this->mestab[key]; if (montab){ - //cout<<"key "< size="<size< size="<size<type==1) for ( long i=0; isize; i++ ) - cout<tmint[i]<<" "; + std::cout<tmint[i]<<" "; if (montab->type==2) for ( long i=0; isize; i++ ) - cout<tmflo[i]<<" "; - cout<tmflo[i]<<" "; + std::cout<nbelem_limit_swap +//insertion conditionn� par limite this->nbelem_limit_swap //si tableaux contenus on dimension superieure //alors swap disque dans getenv(tmp) fichier temporaire binaire { bool ok; if (verbose>4) - cout<<"insert key "<nbelem_limit_swapsize) { - if (verbose>3) cout<<"insert key automatic SwapOnFile "<< - key.toLatin1().constData()<3) std::cout<<"insert key automatic SwapOnFile "<< + key.toLatin1().constData()<path,tab,this->verbose); } this->mestab.insert(key,tab); @@ -1006,48 +1044,48 @@ bool ghs3dprl_mesh_wrap::insert_key(const QString &key,CVWtab *tab) } //************************************ CVWtab* ghs3dprl_mesh_wrap::restore_key(const QString &key) -//retauration conditionnée par limite nbelem +//retauration conditionn� par limite nbelem //si tableaux contenus on dimension superieure a nbelem //alors swap disque dans getenv(tmp) fichier temporaire //alors lecture du fichier (et reallocate memory) { CVWtab *tab=NULL; tab=this->mestab[key]; - /*if (tab) cout<<" -> size in proc "<size< tab NULL\n";*/ + /*if (tab) std::cout<<" -> size in proc "<size< tab NULL\n";*/ if (!tab) //it is NOT a problem { - if (verbose>6) cout<<"restore key not found "<6) std::cout<<"restore key not found "<size > 0){ - if (verbose>5) cout<<"restore key direct from memory "<filename.toLatin1().constData()<< - " type unexpexted "<type<filename.toLatin1().constData()<< + " type unexpexted "<type<filename<filename<filename.toLatin1().constData(),"rb"); long taille; fread(&taille,sizeof(long),1,fichier); if (taille!=-tab->size){ - cerr<<"Problem restore_key from binary file "<filename.toLatin1().constData()<< - " size unexpexted "<size<filename.toLatin1().constData()<< + " size unexpexted "<size<type==1){ if (verbose>5) - cout<<"restore key from binary file "<filename.toLatin1().constData()<< + std::cout<<"restore key from binary file "<filename.toLatin1().constData()<< " number of elements "<tmint=new med_int[taille]; //allocate memory @@ -1055,16 +1093,16 @@ CVWtab* ghs3dprl_mesh_wrap::restore_key(const QString &key) } if (tab->type==2){ if (verbose>5) - cout<<"restore key from binary file "<filename.toLatin1().constData()<< + std::cout<<"restore key from binary file "<filename.toLatin1().constData()<< " number of elements "<tmflo=new med_float[taille]; //allocate memory for (int i=0; itmflo[i]=-1e0; fread(tab->tmflo,sizeof(med_float),taille,fichier); - /*for (int i=0; itmflo[i]<<"/"; - cout<tmflo[i]<<"/"; + std::cout<size=-tab->size; @@ -1088,26 +1126,26 @@ bool ghs3dprl_mesh_wrap::test_msg_wrap() if (ifile==ineig) continue; //impossible key1=key1.sprintf("MS%ld NE%ld ",ifile,ineig)+typ.section(' ',i,i)+" SE"; key2=key2.sprintf("MS%ld NE%ld ",ifile,ineig)+typ.section(' ',i,i)+" RE"; - //cout<<"key "<restore_key(key1); //tab1=this->mestab[key1]; tab2=this->restore_key(key2); //tab2=this->mestab[key2]; - //cout<<"sortie key "<is_equal(tab2)) - { cout<<"key "<restore_key(key2); //tab2=this->mestab[key2]; if (!tab1 && !tab2) continue; //case not neighbours if (!tab1) - { cout<<"key "<type!=tab2->type)||(tab1->size!=tab2->size)) - { cout<<"key "<size!=tab2->size) { - cerr<<"TestEqualityCoordinates key "<2)&&(ok1)) - cout<<"TestEqualityCoordinates "<size<< - " Vertices "<size<< + " Vertices "<size<< - " Vertices "<size<< + " Vertices "<restore_key(QString("SKIN_VERTICES_COORDINATES")); - if (verbose>4)cout<<"NumberVerticesSKIN="<size/3<4)std::cout<<"NumberVerticesSKIN="<size/3<nbfiles; ifile++) { @@ -1264,11 +1302,11 @@ bool ghs3dprl_mesh_wrap::Find_VerticesDomainToVerticesSkin() key2=key2.sprintf("GL%ld VE",ifile); glodom=this->restore_key(key2); if (verbose>4) - cout<<"NumberVerticesDOMAIN_"<size<8){ - cout<<"\nglobal numbering nodes: no iglo\n"; + std::cout<<"\nglobal numbering nodes: no iglo\n"; for (jd=0; jd < glodom->size; jd++) - cout<<"\t"<tmint[jd]<tmint[jd]<size; jd=jd+3) { p2=(coodom->tmflo+jd); @@ -1290,8 +1328,8 @@ bool ghs3dprl_mesh_wrap::Find_VerticesDomainToVerticesSkin() p1=(cooskin->tmflo+js); if (p1[0]==p2[0] && p1[1]==p2[1] && p1[2]==p2[2]) { - cout<<"\t"<tmint[i]-1<< - key2.sprintf("\t%13.5e%13.5e%13.5e",p1[0],p1[1],p1[2]).toLatin1().constData()<tmint[i]-1<< + key2.sprintf("\t%13.5e%13.5e%13.5e",p1[0],p1[1],p1[2]).toLatin1().constData()<insert_key(tmp,montab); if (verbose>4){ - cout<<"NumberOfEqualsVerticesDOMAIN_"<tm_year+1900,time_asc->tm_mon+1,time_asc->tm_mday, time_asc->tm_hour,time_asc->tm_min); +#endif xmlNewProp(node, BAD_CAST "when", BAD_CAST buff); xmlNewProp(node, BAD_CAST "from", BAD_CAST "tepal2med"); @@ -1431,35 +1477,49 @@ bool ghs3dprl_mesh_wrap::Write_MEDfiles_v2(bool deletekeys) { bool ok=true,oktmp; QString tmp,cmd; - char description[MED_TAILLE_DESC]; + char description[MED_COMMENT_SIZE]; + char dtunit[MED_SNAME_SIZE+1]="_NO_UNIT"; + char axisname[MED_SNAME_SIZE*3+1]="x y z "; + char axisunit[MED_SNAME_SIZE*3+1]="_NO_UNIT _NO_UNIT _NO_UNIT "; med_int nb; //remove path //precaution because casename->med_nomfinal no more 32 character //if path, in this->path. //20 preserve for add postfixes "_idom" etc... - if (verbose>0)cout<<"\nWrite_MEDfiles_v2\n"; - if (verbose>6){cout<<"\nInitialFamilies\n"; families.write();} + if (verbose>0)std::cout<<"\nWrite_MEDfiles_v2\n"; + if (verbose>6){std::cout<<"\nInitialFamilies\n"; families.write();} medname=medname.section('/',-1); if (medname.length()>20) { - cerr<<"CaseNameMed truncated (no more 20 characters)"<0) cout<<"CreateMEDFile for all joints <"<\n"; + charendnull(distfilename,tmp,MED_COMMENT_SIZE); + fidjoint=MEDfileOpen(distfilename,MED_ACC_CREAT); + if (fidjoint<0) std::cerr<<"Problem MEDfileOpen "<0) std::cout<<"CreateMEDFile for all joints <"<\n"; //copy file source/GHS3DPRL_skin.med as destination/DOMAIN.skin.med tmp=path+medname+"_skin.med"; - cmd="cp "+pathini+casename+"_skin.med "+tmp; - //cout<<"Copy skin.med Command = "<0)cout<<"CreateMEDFile for initial skin <"<\n"; + cmd=pathini+casename+"_skin.med"; + int ret = access(cmd.toLatin1().constData(),F_OK); //on regarde si le fichier existe + if (ret >= 0) { +#ifdef WIN32 + cmd="copy "; +#else + cmd="cp "; +#endif + cmd = cmd+pathini+casename+"_skin.med "+tmp; + //std::cout<<"Copy skin.med Command = "<0) std::cout<<"CreateMEDFile for initial skin <"<\n"; } + else { + if (verbose>0) std::cout<<"No CreateMEDFile <"< for initial skin because <"<< + cmd.toLatin1().constData()<<"> does not exist\n"; } //define family 0 if not existing, no groups families.add("0",""); @@ -1469,45 +1529,45 @@ bool ghs3dprl_mesh_wrap::Write_MEDfiles_v2(bool deletekeys) oktmp=families.get_number_of_new_family(1,&famallnodes,&tmp); families.add(tmp,"All_Nodes"); } - else if (verbose>3) cout<<"--deletegroups matches \"All_Nodes\"\n"; + else if (verbose>3) std::cout<<"--deletegroups matches \"All_Nodes\"\n"; famalltria3=0; if (QString("All_Faces").contains(deletegroups)==0){ oktmp=families.get_number_of_new_family(-1,&famalltria3,&tmp); families.add(tmp,"All_Faces"); } - else if (verbose>3) cout<<"--deletegroups matches \"All_Faces\"\n"; + else if (verbose>3) std::cout<<"--deletegroups matches \"All_Faces\"\n"; famalltetra4=0; if (QString("All_Tetrahedra").contains(deletegroups)==0){ oktmp=families.get_number_of_new_family(-1,&famalltetra4,&tmp); families.add(tmp,"All_Tetrahedra"); } - else if (verbose>3) cout<<"--deletegroups matches \"All_Tetrahedra\"\n"; + else if (verbose>3) std::cout<<"--deletegroups matches \"All_Tetrahedra\"\n"; famnewnodes=0; if (QString("New_Nodes").contains(deletegroups)==0){ oktmp=families.get_number_of_new_family(1,&famnewnodes,&tmp); families.add(tmp,"New_Nodes"); } - else if (verbose>3) cout<<"--deletegroups matches \"New_Nodes\"\n"; + else if (verbose>3) std::cout<<"--deletegroups matches \"New_Nodes\"\n"; famnewtria3=0; if (QString("New_Faces").contains(deletegroups)==0){ oktmp=families.get_number_of_new_family(-1,&famnewtria3,&tmp); families.add(tmp,"New_Faces"); } - else if (verbose>3) cout<<"--deletegroups matches \"New_Faces\"\n"; + else if (verbose>3) std::cout<<"--deletegroups matches \"New_Faces\"\n"; famnewtetra4=0; if (QString("New_Tetrahedra").contains(deletegroups)==0){ oktmp=families.get_number_of_new_family(-1,&famnewtetra4,&tmp); families.add(tmp,"New_Tetrahedra"); } - else if (verbose>3) cout<<"--deletegroups matches \"New_Tetrahedra\"\n"; + else if (verbose>3) std::cout<<"--deletegroups matches \"New_Tetrahedra\"\n"; - if (verbose>6){cout<<"\nIntermediatesFamilies\n"; families.write();} - if (verbose>6) cout<<"\nNumber0fFiles="<6){std::cout<<"\nIntermediatesFamilies\n"; families.write();} + if (verbose>6) std::cout<<"\nNumber0fFiles="<1) families=intermediatesfamilies; //if (idom>1) continue; tmp=path+medname+tmp.sprintf("_%d.med",idom); - charendnull(distfilename,tmp,MED_TAILLE_DESC); + charendnull(distfilename,tmp,MED_COMMENT_SIZE); - //cout<<"<"<"<"<0){ - if (verbose>2) cout<\n"; + if (verbose>2) std::cout<\n"; } //create mesh tmp=medname+tmp.sprintf("_%d",idom); - charendnull(nomfinal,tmp,MED_TAILLE_NOM); + charendnull(nomfinal,tmp,MED_NAME_SIZE); tmp=tmp.sprintf("domain %d among %d",idom,nbfilestot); - charendnull(description,tmp,MED_TAILLE_DESC); + charendnull(description,tmp,MED_COMMENT_SIZE); - if (verbose>4) cout<<"Description : "<4) std::cout<<"Description : "<6){cout<<"\nFinalsFamilies\n"; families.write();} + if (verbose>6){std::cout<<"\nFinalsFamilies\n"; families.write();} //for nodes families nb=create_families(fid,1); - if (verbose>5)cout<<"NumberOfFamiliesNodes="<5)std::cout<<"NumberOfFamiliesNodes="<8) - cout<<"MEDfamEcr nodes "<5)cout<<"NumberOfFamiliesFacesAndEdgesEtc="<5)std::cout<<"NumberOfFamiliesFacesAndEdgesEtc="<8) - cout<<"MEDfamEcr tria3 "<8) - cout<<"MEDfamEcr tetra4 "<0)cout<<"\nTotalNumberOftetrahedra="<0)std::cout<<"\nTotalNumberOftetrahedra="<remove_key_mesh_wrap(QRegExp(tmp,true,true)); xx=this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); nbnodes=tab->size/3; - err=MEDcoordEcr(fid,nomfinal,3,tab->tmflo,MED_FULL_INTERLACE, - nbnodes,MED_CART,nomcoo,unicoo); - if (err<0) {cerr<<"Problem MEDcoordEcr"<4)cout<<"NumberOfNodes="<tmflo); + if (err<0) {std::cerr<<"Problem MEDmeshNodeCoordinateWr"<4)std::cout<<"NumberOfNodes="<restore_key(key1); //tab1=this->mestab[key1]; if (!tab1) { tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,idom)+".glo"; ok=this->ReadFileGLO(tmp); - if (!ok) {cerr<<"Problem file "<restore_key(key1); //tab1=this->mestab[key1]; if (!tab1) return false; } - if (nbnodes!=tab1->size){cerr<<"Problem size GLi VE!=nbnodes!"<size){std::cerr<<"Problem size GLi VE!=nbnodes!"<restore_key(key2); //tab1=this->mestab[key1]; - med_int nbskin=tab2->size; - //for (i=0; itmint[i]<size; + //for (i=0; itmint[i]<tmint[j]<< + //std::cout<<"nodes loc "<tmint[j]<< // tmp.sprintf("\t%23.15e%23.15e%23.15e",tab3->tmflo[i*3], - // tab3->tmflo[i*3+1],tab3->tmflo[i*3+2])<tmflo[i*3+1],tab3->tmflo[i*3+2])<tmint,nbnodes,MED_NOEUD,MED_NONE); - if (err<0){cerr<<"Problem MEDglobalNumEcr nodes"<tmint); + if (err<0){std::cerr<<"Problem MEDmeshGlobalNumberWr nodes"< newfam "< newfam "<300) cout<< - "***set_one_more_family*** warning many initial families could decrease speed "<300) std::cout<< + "***set_one_more_family*** warning many initial families could decrease speed "< newfam "< newfam "<=0) newfami[ii]=newfam; } /*else { - cout<<"!!! oldfam "< newfam "< newfam "<size/7; - if (verbose>4) cout<<"NumberOfTriangles="<4) std::cout<<"NumberOfTriangles="<tmint[i+2]; ii++; i=i+7; } - err=MEDconnEcr(fid,nomfinal,3,arrayi,MED_FULL_INTERLACE,nbtria3,MED_MAILLE,MED_TRIA3,MED_NOD); + err=MEDmeshElementConnectivityWr(fid,nomfinal,MED_NO_DT,MED_NO_IT,0.,MED_CELL,MED_TRIA3,MED_NODAL,MED_FULL_INTERLACE,nbtria3,arrayi); delete[] arrayi; //need immediately more little array - if (err<0){cerr<<"Problem MEDconnEcr for triangles connectivity"< arrayi[i]=!NBFACES!+i+1 arrayi=new med_int[nbtria3]; for (i=0; irestore_key(key1); //tab1=this->mestab[key1]; - if (nbtria3!=tab1->size){cerr<<"Problem size GLi FA!=nbtria3!"<size){std::cerr<<"Problem size GLi FA!=nbtria3!"<restore_key(key2); //tab1=this->mestab[key1]; - med_int nbskin=tab2->size; - + med_int nbskin=0; + if (tab2) nbskin=tab2->size; + //set families of faces existing in GHS3DPRL_skin.med med_int nb=nbtria3; famtria3=new med_int[nb]; @@ -1838,12 +1899,12 @@ bool ghs3dprl_mesh_wrap::idom_faces() } ok=set_one_more_family(famtria3,fammore,nb); delete[] fammore; - + //writing faces(triangles) global numbering - //if (verbose>2) - // cout<<"CreateMEDglobalNumerotation_Faces "<size<tmint,tab1->size,MED_MAILLE,MED_TRIA3); - if (err<0){cerr<<"Problem MEDglobalNumEcr faces"<2) + std::cout<<"CreateMEDglobalNumerotation_Faces "<size<size,tab1->tmint); + if (err<0){std::cerr<<"Problem MEDmeshGlobalNumberWr faces"<remove_key_mesh_wrap(QRegExp("FC*",true,true)); tmp=tmp.sprintf("GL%d FA",idom); @@ -1864,14 +1925,17 @@ bool ghs3dprl_mesh_wrap::idom_joints() CVWtab *tab,*tab1,*tab2; med_int ineig,ii,jj,i,j,k,*arrayi,nb,famjoint,*fammore,*inodes,*arrayfaces; med_float *arraynodes; - char namejnt[MED_TAILLE_NOM+1]; //no more 32 - char namedist[MED_TAILLE_NOM+1]; - char descjnt[MED_TAILLE_DESC+1]; + char namejnt[MED_NAME_SIZE+1]; //no more 32 + char namedist[MED_NAME_SIZE+1]; + char descjnt[MED_COMMENT_SIZE+1]; med_int numfam_ini_wrap=100; joints_node=xmlNewNode(NULL, BAD_CAST "joints"); //masterfile.xml med_int nbjoints=0,nbnodesneig,nbtria3neig; - string sjoints=""; //which domains are neighbourg + std::string sjoints=""; //which domains are neighbourg int xx; + char dtunit[MED_SNAME_SIZE+1]="_NO_UNIT"; + char axisname[MED_SNAME_SIZE*3+1]="x y z "; + char axisunit[MED_SNAME_SIZE*3+1]="_NO_UNIT _NO_UNIT _NO_UNIT "; tmp=tmp.sprintf("MS%d *",idom); //read file .msg if not done @@ -1891,7 +1955,7 @@ bool ghs3dprl_mesh_wrap::idom_joints() tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,idom)+".msg"; ok=this->ReadFileMSGnew(tmp); if (!ok) { - cerr<<"Problem in file "<no joints - key1=key1.sprintf("MS%d NE%d VE RE",idom,ineig); //SE or RE - tab2=tab1; //tab2=this->restore_key(key1); //no need because equals - if (!tab2) cerr<<"Problem nodes joint with no in file .msg"<size; nbnodesneig=nb; + key1=key1.sprintf("MS%d NE%d VE SE",ineig,idom); //SE or RE identicals + tab2=this->restore_key(key1); + //if not yet loaded (first time) try to load necessary file msg of neighbourg + if (!tab2) { + tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfilestot,ineig)+".msg"; + this->nofile=ineig; //neighbourg file + ok=this->ReadFileMSGnew(tmp); + this->nofile=idom; //restaure initial domain + if (!ok) { + std::cerr<<"Problem in file "<restore_key(key1); + } + if (!tab2) std::cerr<<"Problem existing nodes joint in domain "<size; nbnodesneig=tab2->size; + if (nb!=nbnodesneig) { + std::cerr<<"Problem in file "<"<4) - cout<<"NumberOfNodesOfJoint_"<restore_key(key); //tab1=this->mestab[key1]; @@ -1950,63 +2035,77 @@ bool ghs3dprl_mesh_wrap::idom_joints() arrayi[ii]=tab1->tmint[i]; ii++; arrayi[ii]=tab2->tmint[i]; ii++; } - ok=set_one_more_family(famnodes,fammore,nbnodes); + if (namejoint.contains(deletegroups)==0){ + ok=set_one_more_family(famnodes,fammore,nbnodes); + } delete[] fammore; - err=MEDjointEcr(fid,nomfinal,namejnt,arrayi,nb, - MED_NOEUD,MED_NONE,MED_NOEUD,MED_NONE); - if (err<0) cerr<<"Problem MEDjointEcr nodes"<restore_key(key1); //tab1=this->mestab[key1]; if (!tab1){ if (verbose>4) - cout<<"NumberOfTrianglesOfJoint_"<no joints } else //have to set xml may be no faces but nodes in a joint! { - key1=key1.sprintf("MS%d NE%d FA RE",idom,ineig); //SE or RE? - tab2=tab1; //tab2=this->restore_key(key1); //no need because equals - if (!tab2) cerr<<"Problem triangles joint send with no receive"<restore_key(key1); + if (!tab2) std::cerr<<"Problem existing triangles of joint in domain "<size; nbtria3neig=tab2->size; + if (nb!=nbtria3neig) { + std::cerr<<"Problem in file "<"<restore_key(key); //tab1=this->mestab[key1]; med_int nb=tab1->size; nbtria3neig=nb; if (verbose>4) - cout<<"NumberOfTrianglesOfJoint_"<0) { - //for (i=0; iremove_key_mesh_wrap(QRegExp(tmp,true,true)); xx=this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); - tmp=tmp.sprintf("MS%d NE*",idom); + //tmp=tmp.sprintf("MS%d NE*",idom); //qt3 xx=this->remove_key_mesh_wrap(QRegExp(tmp,true,true)); - xx=this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); + //xx=this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); tmp=tmp.sprintf("FC%d",idom); //qt3 xx=this->remove_key_mesh_wrap(QRegExp(tmp,true,true)); xx=this->remove_key_mesh_wrap(QRegExp(tmp,Qt::CaseSensitive,QRegExp::RegExp)); @@ -2093,17 +2191,17 @@ bool ghs3dprl_mesh_wrap::idom_tetras() tab1=this->restore_key(key1); //tab1=this->mestab[key1]; nbtetra4=tab1->size/4; nbtetrastotal=nbtetrastotal + nbtetra4; - if (verbose>5)cout<<"NumberOftetrahedra="<tmint,MED_FULL_INTERLACE,nbtetra4,MED_MAILLE,MED_TETRA4,MED_NOD); - if (err<0){cerr<<"Problem MEDconnEcr for tetra connectivity"<5)std::cout<<"NumberOftetrahedra="<tmint); + if (err<0){std::cerr<<"Problem MEDmeshElementConnectivityWr for tetra connectivity"<size!=nbtetra4){ - cerr<<"Problem incorrect size of tetrahedra global numbering"<2) - cout<<"CreateMEDglobalNumerotation_tetrahedra "<size<tmint,tab1->size,MED_MAILLE,MED_TETRA4); - if (err<0){cerr<<"Problem MEDglobalNumEcr tetrahedra"<size<size,tab1->tmint); + if (err<0){std::cerr<<"Problem MEDmeshGlobalNumberWr tetrahedra"<remove_key_mesh_wrap(QRegExp(tmp,true,true)); @@ -2138,8 +2236,8 @@ med_int ghs3dprl_mesh_wrap::create_families(med_idt fid, int sign) //if sign >= 0 family zero and family nodes { med_int pas,ires; - char nomfam[MED_TAILLE_NOM+1]; //it.current()->name; - char attdes[MED_TAILLE_DESC+1]="_NO_DESCRIPTION"; + char nomfam[MED_NAME_SIZE+1]; //it.current()->name; + char attdes[MED_COMMENT_SIZE+1]="_NO_DESCRIPTION"; char *gro; med_int i,attide=1,attval=1,natt=1,num,ngro; @@ -2152,28 +2250,26 @@ med_int ghs3dprl_mesh_wrap::create_families(med_idt fid, int sign) num=(*it1).first.toLong(); if ((pas==-1) && (num>=0)) continue; //not good families if ((pas== 1) && (num< 0)) continue; //not good families - charendnull(nomfam,(*it1).first,MED_TAILLE_NOM); + charendnull(nomfam,(*it1).first,MED_NAME_SIZE); ires++; //med_int natt=0; ngro=(*it1).second.size(); if (verbose>5) - cout<<"CreateFamilyInMEDFile <"<\tNbGroups="<\tNbGroups="<5)cout<<" <"<<&gro[i*MED_TAILLE_LNOM]<<"> "; + charendnull(&gro[i*MED_LNAME_SIZE],(*it2).first,MED_LNAME_SIZE); + if (verbose>5)std::cout<<" <"<<&gro[i*MED_LNAME_SIZE]<<"> "; i++; } - if (verbose>5)cout<5)std::cout< +#include #include +#include #include -//Med File V 2.2 attributes -#undef MED_H -#undef MED_PROTO_H -namespace med_2_2 { - extern "C" { -#include -#include - } -} - #include #include #include #include -using namespace std; -using namespace med_2_2; +//Med File V 2.2 attributes +//#undef MED_H +//#undef MED_PROTO_H + + extern "C" { +#include +//#include + } class CVWtab //contains size=size of vector and the vector (med_int or med_float) @@ -67,8 +63,8 @@ public: bool is_equal(CVWtab *tab2); }; -typedef map fend; -typedef map fagr; +typedef std::map fend; +typedef std::map fagr; class familles{ private: void newfam(QString nom); @@ -101,8 +97,8 @@ public: med_int idom; //master.xml - string filemaster,domainname; - char distfilename[MED_TAILLE_DESC]; + std::string filemaster,domainname; + char distfilename[MED_COMMENT_SIZE]; xmlDocPtr master_doc; xmlNodePtr root_node,node,node2, joints_node,info_node,files_node,mesh_node; @@ -111,16 +107,16 @@ public: familles families; //from skin.med - char nommaa[MED_TAILLE_NOM+1]; - char maillage_description[MED_TAILLE_DESC+1]; - char nomcoo[3*MED_TAILLE_PNOM+1]; - char unicoo[3*MED_TAILLE_PNOM+1]; + char nommaa[MED_NAME_SIZE+1]; + char maillage_description[MED_COMMENT_SIZE+1]; + char nomcoo[3*MED_SNAME_SIZE+1]; + char unicoo[3*MED_SNAME_SIZE+1]; med_int *famnodesskin; //from skin.med... med_int *famseg2skin; //...valid on global index/numerotation med_int *famtria3skin; //to final files .med with tetrahedra - char nomfinal[MED_TAILLE_NOM+1]; + char nomfinal[MED_NAME_SIZE+1]; med_int *famnodes,nbnodes,famnewnodes,famallnodes; //to final files .med with tetrahedra med_int *famseg2,nbseg2,famnewseg2,famallseg2; med_int *famtria3,nbtria3,famnewtria3,famalltria3; diff --git a/src/tepal2med/ghs3dprl_msg_parser.cxx b/src/tepal2med/ghs3dprl_msg_parser.cxx index 08badd1..4995891 100755 --- a/src/tepal2med/ghs3dprl_msg_parser.cxx +++ b/src/tepal2med/ghs3dprl_msg_parser.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,20 +16,17 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : ghs3dprl_mesh_parser.cxx // Author : Christian VAN WAMBEKE (CEA) (from Hexotic plugin Lioka RAZAFINDRAZAKA) -// // --- - +// #include #include "ghs3dprl_msg_parser.h" #include "ghs3dprl_mesh_wrap.h" -using namespace med_2_2; - //************************************ bool ghs3dprl_msg_parser::startDocument() { @@ -57,9 +54,9 @@ bool ghs3dprl_msg_parser::startDocument() //************************************ bool ghs3dprl_msg_parser::startElement(const QString &namespaceURI, - const QString &localName, - const QString &qName, - const QXmlAttributes &attrs) + const QString &localName, + const QString &qName, + const QXmlAttributes &attrs) { bool ok; if (verbose) std::cout<nofile,neighbourindice)+ - shorttypel+shortsendreceive; + mailw->nofile,neighbourindice)+ + shorttypel+shortsendreceive; tmp=tmp.simplified(); ok=mailw->insert_key(tmp,montab); return true; diff --git a/src/tepal2med/ghs3dprl_msg_parser.h b/src/tepal2med/ghs3dprl_msg_parser.h index dafc39c..76067cd 100755 --- a/src/tepal2med/ghs3dprl_msg_parser.h +++ b/src/tepal2med/ghs3dprl_msg_parser.h @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : ghs3dprl_mesh_parser.h // Author : Christian VAN WAMBEKE (CEA) (from Hexotic plugin Lioka RAZAFINDRAZAKA) -// // --- - +// #ifndef GHS3DPRL_MSG_PARSER_H #define GHS3DPRL_MSG_PARSER_H diff --git a/src/tepal2med/tepal2med.cxx b/src/tepal2med/tepal2med.cxx index d6c27b0..bbbdf4f 100755 --- a/src/tepal2med/tepal2med.cxx +++ b/src/tepal2med/tepal2med.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 OPEN CASCADE, CEA/DEN, EDF R&D +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,12 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // --- -// // File : tepal2med.cxx // Author : Christian VAN WAMBEKE (CEA) -// // --- - +// /* ** prog principal de ghs3dprl */ @@ -30,11 +29,17 @@ #include /* printf clrscr fopen fread fwrite fclose */ #include #include +#include #include #include #include +#include +#ifndef WIN32 +#include +#endif #include + #include #include #include @@ -42,20 +47,22 @@ #include "ghs3dprl_msg_parser.h" #include "dlg_ghs3dmain.h" +#ifdef WIN32 +#include +#include +#define F_OK 0 +#endif + //#include "MEDMEM_Exception.hxx" //#include "MEDMEM_define.hxx" extern "C" { #include //#include -#include +//#include //#include -#include } -using namespace std; -using namespace med_2_2; - //************************************ med_idt ouvre_fichier_MED(char *fichier,int verbose) { @@ -68,27 +75,28 @@ med_idt ouvre_fichier_MED(char *fichier,int verbose) if (ret < 0) return fid; /* on regarde s'il s'agit d'un fichier au format HDF5 */ - ret = MEDformatConforme(fichier); + med_bool hdfok,medok; + ret = MEDfileCompatibility(fichier,&hdfok,&medok); if (ret < 0){ - cerr<<"File "<0)fprintf(stdout,"\nReading %s with MED V%d.%d.%d", fichier,majeur,mineur,release); /* Ouverture du fichier MED en lecture seule */ - fid = MEDouvrir(fichier,MED_LECTURE); + fid = MEDfileOpen(fichier,MED_ACC_RDONLY); if (ret < 0) return fid; - MEDversionLire(fid, &majeur, &mineur, &release); + MEDfileNumVersionRd(fid, &majeur, &mineur, &release); if (majeur < 2 || majeur == 2 && mineur < 2) { fprintf(stderr,"File %s from MED V%d.%d.%d not assumed\n", fichier,majeur,mineur,release); - //" version est antérieure à la version 2.2"; - ret = MEDfermer(fid); + //" version est ant�ieure �la version 2.2"; + ret = MEDfileClose(fid); fid=0; } else { if (verbose>0)fprintf(stdout,", file from MED V%d.%d.%d\n",majeur,mineur,release); } @@ -101,75 +109,78 @@ bool ReadFileMED(QString nomfilemed,ghs3dprl_mesh_wrap *mymailw) { med_err ret; med_idt fid=0; - med_int i,j,mdim,nmaa,edim,majeur_lu,mineur_lu,release_lu,nprofils; - med_maillage type_maillage; + med_int i,j,sdim,mdim,nmaa,edim,majeur_lu,mineur_lu,release_lu,nprofils,nstep; + med_mesh_type type_maillage; + char dtunit[MED_SNAME_SIZE+1]; + char axisname[MED_SNAME_SIZE+1]; + char axisunit[MED_SNAME_SIZE*3+1]; + med_sorting_type sortingtype; + med_axis_type axistype; int numero=1; - med_connectivite typ_con=MED_NOD; QString key,tmp; - + med_bool chan; + med_bool tran; + //version qt3 - char chaine[nomfilemed.length()+1]; + char* chaine = (char*)malloc((nomfilemed.length()+1)*sizeof(char)); strncpy(chaine,nomfilemed.toLatin1().constData(),nomfilemed.length()+1); - //cout<<"*** ReadFileMED *** "<verbose); + free(chaine); if (fid == 0) { - cerr<<"Problem opening file "< 1) cout<<"More than one mesh in "<nommaa,&mdim,&type_maillage, - mymailw->maillage_description); + if (nmaa > 1) std::cout<<"More than one mesh in "<nommaa,&sdim,&mdim,&type_maillage,mymailw->maillage_description, + dtunit,&sortingtype,&nstep,&axistype,axisname,axisunit); if (ret < 0){ - cerr<<"Problem MEDmaaInfo in "<nommaa); - if (!((edim == 3)||(edim == -1))){ - cerr<<"Problem dimension Espace should be 3 or -1: "<nommaa,MED_COOR,MED_NOEUD, - (med_geometrie_element)0,(med_connectivite)0); + //cf med-3.0.0_install/share/doc/html/maillage_utilisateur.html + med_int nnoe=MEDmeshnEntity(fid,mymailw->nommaa,MED_NO_DT,MED_NO_IT, + MED_NODE,MED_NO_GEOTYPE,MED_COORDINATE,MED_NO_CMODE,&chan,&tran); + //(med_geometrie_element)0,(med_connectivite)0); if (nnoe<1){ - cerr<<"Problem number of Vertices < 1\n"; - ret = MEDfermer(fid); + std::cerr<<"Problem number of Vertices < 1\n"; + ret = MEDfileClose(fid); return false; } //nombre d'objets MED : mailles, faces, aretes , ... - med_int nmailles[MED_NBR_GEOMETRIE_MAILLE],nbtria3; - med_int nfaces[MED_NBR_GEOMETRIE_FACE]; - med_int naretes[MED_NBR_GEOMETRIE_ARETE],nbseg2; + med_int nmailles[MED_N_CELL_GEO],nbtria3; + med_int nfaces[MED_N_FACE_GEO]; + med_int naretes[MED_N_EDGE_FIXED_GEO],nbseg2; + //med_int nmailles[MED_NBR_GEOMETRIE_MAILLE],nbtria3; + //med_int nfaces[MED_NBR_GEOMETRIE_FACE]; + //med_int naretes[MED_NBR_GEOMETRIE_ARETE],nbseg2; //polygones et polyedres familles equivalences joints med_int nmpolygones,npolyedres,nfpolygones,nfam,nequ,njnt; @@ -177,244 +188,221 @@ bool ReadFileMED(QString nomfilemed,ghs3dprl_mesh_wrap *mymailw) /*for (i=0;inommaa,MED_CONN,MED_MAILLE,typmai[i],typ_con); //lecture_nombre_mailles_standards(fid,nommaa,typmai[i],typ_con,i); - if (mymailw->verbose>6) cout<<"NumberOf"<verbose>6) std::cout<<"NumberOf"<nommaa,MED_CONN,MED_MAILLE,MED_TRIA3,typ_con); - nbseg2=MEDnEntMaa(fid,mymailw->nommaa,MED_CONN,MED_MAILLE,MED_SEG2,typ_con); - - //Combien de mailles polygones quelconques ? - //nmpolygones = lecture_nombre_mailles_polygones(fid,nommaa,typ_con); - //Combien de mailles polyedres quelconques ? - //npolyedres = lecture_nombre_mailles_polyedres(fid,nommaa,typ_con); + + nbtria3=MEDmeshnEntity(fid,mymailw->nommaa,MED_NO_DT,MED_NO_IT, + MED_CELL,MED_TRIA3,MED_CONNECTIVITY,MED_NODAL,&chan,&tran); + nbseg2=MEDmeshnEntity(fid,mymailw->nommaa,MED_NO_DT,MED_NO_IT, + MED_CELL,MED_SEG2,MED_CONNECTIVITY,MED_NODAL,&chan,&tran); //combien de familles ? - nfam=MEDnFam(fid,mymailw->nommaa); + nfam=MEDnFamily(fid,mymailw->nommaa); if (mymailw->verbose>2) { - cout<<"\nNumberOfFamilies="< famdelete = std::vector(nfam); { - med_int natt,ngro; - char *attdes,*gro; - med_int *attval,*attide; - char nomfam[MED_TAILLE_NOM+1]; + med_int ngro; + char *gro; + char nomfam[MED_NAME_SIZE+1]; med_int numfam; - char str1[MED_TAILLE_DESC+1]; - char str2[MED_TAILLE_LNOM+1]; + char str1[MED_COMMENT_SIZE+1]; + char str2[MED_LNAME_SIZE+1]; med_err ret = 0; for (i=0;inommaa,i+1); + ngro = MEDnFamilyGroup(fid,mymailw->nommaa,i+1); if (ngro < 0){ - cerr<<"Problem reading number of groups of family\n"; - continue; - } - - //nombre d'attributs - natt = MEDnAttribut(fid,mymailw->nommaa,i+1); - if (natt < 0){ - cerr<<"Problem reading number of attributes of family\n"; + std::cerr<<"Problem reading number of groups of family\n"; continue; } - //nom,numero,attributs,groupes + //atributs obsolete MED3 //allocation memoire par exces - attide = (med_int*) malloc(sizeof(med_int)*(natt+1)); - attval = (med_int*) malloc(sizeof(med_int)*(natt+1)); - attdes = (char *) malloc(MED_TAILLE_DESC*(natt+1)); - gro = (char*) malloc(MED_TAILLE_LNOM*(ngro+1)); + gro = (char*) malloc(MED_LNAME_SIZE*(ngro+1)); - ret = MEDfamInfo(fid,mymailw->nommaa,i+1,nomfam,&numfam,attide,attval, - attdes,&natt,gro,&ngro); + ret = MEDfamilyInfo(fid,mymailw->nommaa,i+1,nomfam,&numfam,gro); if (ret < 0){ - cerr<<"Problem reading informations of family\n"; + std::cerr<<"Problem reading informations of family\n"; continue; } if (mymailw->verbose>8) { - cout<<"Family "<deletegroups)>0) { - //cout<<"idelete++ "<0) { //only delete family whith all delete groups - //cout<<"famdelete++ "<deletegroups)==0){ if (sgro.contains(qgroup)>0) { sgro="Skin_"+sgro; //pas sur que ce soit pertinent } - if (mymailw->verbose>8) cout<<"families.add("<verbose>8) std::cout<<"families.add("<families.add(sfam,sgro); } else { //sgro="Skin_"+sgro; //pas sur que ce soit pertinent - //cout<<"--deletegroups matches \""<verbose>3) cout<<"--deletegroups matches \""<< + //std::cout<<"--deletegroups matches \""<verbose>3) std::cout<<"--deletegroups matches \""<< sgro.toLatin1().constData()<< - "\" in family "<deletegroups)==0){ //sgro="Skin_"+sgro; //pas sur que ce soit pertinent - cout<<"families.add("<families.add(sfam,sgro); } else { - cout<<"--deletegroups matches \""<verbose>3){ - cout<<"\nFamiliesAndGroupsOf "<families.write(); } - - med_repere rep; - med_mode_switch mode_coo=MED_FULL_INTERLACE; - /* Allocations memoires */ - /* table des coordonnees profil : (dimension * nombre de noeuds ) */ - med_float *coo=new med_float[nnoe*mdim]; + /* table des coordonnees profil : (space dimension * nombre de noeuds ) */ + med_float *coo=new med_float[nnoe*sdim]; /* table des numeros de familles des noeuds profil : (nombre de noeuds) */ med_int *famnodesskin=new med_int[nnoe]; med_int *pfltab=new med_int[1]; //inutilise car on lit tout //lecture des noeuds : coordonnees - ret=MEDcoordLire(fid,mymailw->nommaa,mdim,coo, - mode_coo,MED_ALL, - pfltab,0,&rep,mymailw->nomcoo,mymailw->unicoo); + ret=MEDmeshNodeCoordinateRd(fid,mymailw->nommaa,MED_NO_DT,MED_NO_IT,MED_FULL_INTERLACE,coo); + //mdim,coo,mode_coo,MED_ALL,pfltab,0,&rep,mymailw->nomcoo,mymailw->unicoo); if (ret < 0){ - cerr<<"Problem reading nodes\n"; - ret = MEDfermer(fid); + std::cerr<<"Problem reading nodes\n"; + ret = MEDfileClose(fid); //return false; } - ret=MEDfamLire(fid,mymailw->nommaa,famnodesskin,nnoe,MED_NOEUD,(med_geometrie_element) 0); + ret=MEDmeshEntityFamilyNumberRd(fid,mymailw->nommaa,MED_NO_DT,MED_NO_IT,MED_NODE,MED_NONE,famnodesskin); + //famnodesskin,nnoe,MED_NOEUD,(med_geometrie_element) 0); if (ret < 0){ - cerr<<"Problem reading families of nodes\n"; - ret = MEDfermer(fid); + std::cerr<<"Problem reading families of nodes\n"; + ret = MEDfileClose(fid); return false; } if (mymailw->verbose>9) { - cout<<"\nVertices: no x y z family\n"; + std::cout<<"\nVertices: no x y z family\n"; for (i=0;inommaa,mdim,conn2,mode_coo, - pfltab,0,MED_MAILLE,MED_SEG2,MED_NOD); + ret=MEDmeshElementConnectivityRd(fid,mymailw->nommaa,MED_NO_DT,MED_NO_IT, + MED_CELL,MED_SEG2,MED_NODAL,MED_FULL_INTERLACE,conn2); + //mdim,conn2,mode_coo,pfltab,0,MED_MAILLE,MED_SEG2,MED_NOD); if (ret < 0){ - cerr<<"Problem reading MED_SEG2\n"; - ret = MEDfermer(fid); + std::cerr<<"Problem reading MED_SEG2\n"; + ret = MEDfileClose(fid); //return false; } med_int *famseg2skin=new med_int[nbseg2]; - ret=MEDfamLire(fid,mymailw->nommaa,famseg2skin,nbseg2,MED_MAILLE,MED_SEG2); + ret=MEDmeshEntityFamilyNumberRd(fid,mymailw->nommaa,MED_NO_DT,MED_NO_IT,MED_CELL,MED_SEG2,famseg2skin); + //MEDfamLire(fid,mymailw->nommaa,famseg2skin,nbseg2,MED_MAILLE,MED_SEG2); if (ret < 0){ - cerr<<"Problem reading families of MED_SEG2\n"; - ret = MEDfermer(fid); + std::cerr<<"Problem reading families of MED_SEG2\n"; + ret = MEDfileClose(fid); return false; } if (mymailw->verbose>9) { - cout<<"\nConnectivity MED_SEG2: no node1 node2 family\n"; + std::cout<<"\nConnectivity MED_SEG2: no node1 node2 family\n"; for (i=0;inommaa,mdim,conn3,mode_coo, - pfltab,0,MED_MAILLE,MED_TRIA3,MED_NOD); + ret=MEDmeshElementConnectivityRd(fid,mymailw->nommaa,MED_NO_DT,MED_NO_IT, + MED_CELL,MED_TRIA3,MED_NODAL,MED_FULL_INTERLACE,pfltab); + //MEDconnLire(fid,mymailw->nommaa,mdim,conn3,mode_coo,pfltab,0,MED_MAILLE,MED_TRIA3,MED_NOD); if (ret < 0){ - cerr<<"Problem reading MED_TRIA3\n"; - ret = MEDfermer(fid); + std::cerr<<"Problem reading MED_TRIA3\n"; + ret = MEDfileClose(fid); //return false; } med_int *famtria3skin=new med_int[nbtria3]; - ret=MEDfamLire(fid,mymailw->nommaa,famtria3skin,nbtria3,MED_MAILLE,MED_TRIA3); + ret=MEDmeshEntityFamilyNumberRd(fid,mymailw->nommaa,MED_NO_DT,MED_NO_IT,MED_CELL,MED_TRIA3,famtria3skin); + //MEDfamLire(fid,mymailw->nommaa,famtria3skin,nbtria3,MED_MAILLE,MED_TRIA3); if (ret < 0){ - cerr<<"Problem reading families of MED_TRIA3\n"; - ret = MEDfermer(fid); + std::cerr<<"Problem reading families of MED_TRIA3\n"; + ret = MEDfileClose(fid); return false; } if (mymailw->verbose>9) { - cout<<"\nConnectivity MED_TRIA3: no node1 node2 node3 family\n"; + std::cout<<"\nConnectivity MED_TRIA3: no node1 node2 node3 family\n"; for (i=0;iverbose>3){ delete[] nufano;*/ if (ifamdelete>0) { - //cout<<"!!!!!!!!nodes "<verbose>3){ //if (mymailw->verbose>6) ok=mymailw->list_keys_mesh_wrap(); - ret = MEDfermer(fid); + ret = MEDfileClose(fid); if (ret < 0){ - cerr<<"Problem closing "<2048){ //delirium in 2008 - cerr<<"--number: a positive integer <= 2048 is expected\n\n"; + std::cerr<<"--number: a positive integer <= 2048 is expected\n\n"; return 1; } if (!cmedname) cmedname=ccasename; @@ -627,11 +612,11 @@ int main(int argc, char *argv[]) tmp=climitswap; limit_swap=tmp.toLong(&ok,10); if (!ok){ - cerr<<"--limitswap: an integer is expected. try 1000\n\n"; + std::cerr<<"--limitswap: an integer is expected. try 1000\n\n"; return 1; } if (limit_swap<1 || limit_swap>32000){ - cerr<<"--limitswap: [1->32000] expected. try 1000\n\n"; + std::cerr<<"--limitswap: [1->32000] expected. try 1000\n\n"; return 1; } } @@ -644,11 +629,11 @@ int main(int argc, char *argv[]) tmp=cverbose; verbose=tmp.toLong(&ok,10); if (!ok){ - cerr<<"--verbose: an integer is expected\n\n"; + std::cerr<<"--verbose: an integer is expected\n\n"; return 1; } if (verbose<0){ - cerr<<"--verbose: a positive integer is expected\n\n"; + std::cerr<<"--verbose: a positive integer is expected\n\n"; return 1; } } @@ -676,12 +661,6 @@ int main(int argc, char *argv[]) tmp=cbackground; if (tmp=="yes") background="yes"; } - - meshholes="no"; //default - if (cmeshholes){ - tmp=cmeshholes; - if (tmp=="yes") meshholes="yes"; - } // We must always have an application @@ -692,7 +671,7 @@ int main(int argc, char *argv[]) m->show(); a.exec(); if ( m->result() == QDialog::Accepted ) { - cout<<"parameters "<KeepFiles()<<" "<NbPart()<KeepFiles()<<" "<NbPart()<NbPart(); } else { @@ -708,7 +687,7 @@ int main(int argc, char *argv[]) path="./"; casenamemed=casenamemed.section('/',-1); if (casenamemed.length()>20){ - cerr<<"--medname truncated (no more 20 characters)"<20){ - cerr<<"--casename truncated (no more 20 characters)"<0) - cout<<"tepal2med "< 0) { @@ -764,16 +738,17 @@ int main(int argc, char *argv[]) setsid(); system("sleep 10"); //for debug } +#else + printf("background mode is not supported on win32 platform !\n"); +#endif //"tepal -f exemple1 -n 4" if (launchtepal=="yes"){ //tepal64.exe -f /home/wambeke/tmp/GHS3DPRL -n 5 --tetmesh_args "-c 0" //cmd="tepal --tetmesh_args \"-c 0\" -f "+pathini+casename+" -n "+cmd.sprintf("%d",nbfiles)+" > "+path+"tepal.log"; - cmd="tepal -f "+pathini+casename+" -n "+cmd.sprintf("%d",nbfiles); - if (meshholes=="yes") cmd=cmd+" --tetmesh_args \"-c 0\""; - cmd=cmd+" > "+path+"tepal.log"; - cout<<"\nlaunchtepal command: background="< "+path+"tepal.log"; + std::cout<<"\nlaunchtepal command: background="<families.no=1; - //cout<<"coucou1 "<families.no<families.no<families.add(casename,casenamemed); format=format.sprintf("%d",nbfiles); int nbf=format.length(); @@ -810,11 +785,16 @@ int main(int argc, char *argv[]) char ctmp[fileskinmed.length()+1] ; strcpy(ctmp,fileskinmed); int res=dumpMED(&ctmp[0],1); }*/ - ok=ReadFileMED(fileskinmed,mymailw); + int ret = access(fileskinmed.toLatin1().constData(),F_OK); //on regarde si le fichier existe + if (ret >= 0) { + ok=ReadFileMED(fileskinmed,mymailw); } + else { + if (verbose>0)std::cout<<"Initial skin file <"< does not exist\n"; } + //if test read all files before (only small files) if (test=="yes"){ - if (verbose>0) cout<<"\nReading output files of tepal as input files of tepal2med...\n"; + if (verbose>0) std::cout<<"\nReading output files of tepal as input files of tepal2med...\n"; //read files .msg //supposed big files big arrays so don't read with parser @@ -822,13 +802,13 @@ int main(int argc, char *argv[]) for (int i=1; i<=nbfiles; i++){ mymailw->nofile=i; tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfiles,i)+".msg"; - if (verbose>0) cout<<"FileName="<0) std::cout<<"FileName="<ReadFileMSGnew(tmp); } if (verbose>0) - cout<<"NumberOfFilesMSGacquired="<nbfiles<<"\n\n"; + std::cout<<"NumberOfFilesMSGacquired="<nbfiles<<"\n\n"; if (mymailw->nbfiles != nbfiles){ - cerr<<"NumberOfFiles != NumberOfFilesAcquired is unexpected\n\n"; + std::cerr<<"NumberOfFiles != NumberOfFilesAcquired is unexpected\n\n"; return 1; } @@ -841,26 +821,26 @@ int main(int argc, char *argv[]) mymailw->nofile=i; //tmp=casename+tmp.sprintf(".%d.%d.msg",nbfiles,i); tmp=pathini+casename+tmp.sprintf(format,nbfiles,i)+".msg"; - if (verbose>0) cout<<"FileName="<0) std::cout<<"FileName="<0) - cout<<"NumberOfFilesMSGAcquired="<nbfiles<<"\n"; + std::cout<<"NumberOfFilesMSGAcquired="<nbfiles<<"\n"; if (mymailw->nbfiles != nbfiles){ - cerr<<"Problem NumberOfFiles != NumberOfFilesAcquired\n"; + std::cerr<<"Problem NumberOfFiles != NumberOfFilesAcquired\n"; return 1; } if (test=="yes"){ ok=mymailw->test_msg_wrap(); if (ok){ - if (verbose>0) cout<<"\nResult_test_msg_wrap=ok\n\n"; + if (verbose>0) std::cout<<"\nResult_test_msg_wrap=ok\n\n"; } else{ - cerr<<"\nResult_test_msg_wrap=NO_OK!\n\n"; + std::cerr<<"\nResult_test_msg_wrap=NO_OK!\n\n"; return 1; } } @@ -877,7 +857,7 @@ int main(int argc, char *argv[]) //because equals nb=0; nb=mymailw->remove_key_mesh_wrap(QRegExp("RE",Qt::CaseSensitive,QRegExp::RegExp)); - if (verbose>3) cout<<"NumberOfKeysRemoved="<3) std::cout<<"NumberOfKeysRemoved="<3) ok=mymailw->list_keys_mesh_wrap(); //test read files .noboiteb @@ -890,23 +870,23 @@ int main(int argc, char *argv[]) for (int i=1; i<=nbfiles; i++){ mymailw->nofile=i; tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfiles,i)+".noboite"; - if (verbose>0) cout<<"FileName="<0) std::cout<<"FileName="<ReadFileNOBOITE(tmp); } if (verbose>0) - cout<<"NumberOfFilesNOBOITEAcquired="<nbfiles<<"\n"; + std::cout<<"NumberOfFilesNOBOITEAcquired="<nbfiles<<"\n"; if (mymailw->nbfiles != nbfiles){ - cerr<<"NumberOfFiles != NumberOfFilesAcquired is unexpected\n"; + std::cerr<<"NumberOfFiles != NumberOfFilesAcquired is unexpected\n"; return 1; } //if (test=="yes"){ ok=mymailw->test_vertices_wrap(); if (ok){ - if (verbose>0) cout<<"\nResult_test_vertices_wrap=ok\n\n"; + if (verbose>0) std::cout<<"\nResult_test_vertices_wrap=ok\n\n"; } else{ - cerr<<"\nResult_test_vertices_wrap=NO_OK!\n\n"; + std::cerr<<"\nResult_test_vertices_wrap=NO_OK!\n\n"; return 1; } //} @@ -916,13 +896,13 @@ int main(int argc, char *argv[]) for (int i=1; i<=nbfiles; i++){ mymailw->nofile=i; tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfiles,i)+".faces"; - if (verbose>0) cout<<"FileName="<0) std::cout<<"FileName="<ReadFileFACES(tmp); } if (verbose>0) - cout<<"NumberOfFilesFACESAcquired="<nbfiles<<"\n\n"; + std::cout<<"NumberOfFilesFACESAcquired="<nbfiles<<"\n\n"; if (mymailw->nbfiles != nbfiles){ - cerr<<"NumberOfFiles != NumberOfFilesAcquired is unexpected\n\n"; + std::cerr<<"NumberOfFiles != NumberOfFilesAcquired is unexpected\n\n"; return 1; } @@ -932,14 +912,14 @@ int main(int argc, char *argv[]) for (int i=1; i<=nbfiles; i++){ mymailw->nofile=i; tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfiles,i)+".points"; - if (verbose>0) cout<<"FileName="<0) std::cout<<"FileName="<ReadFilePOINTS(tmp); } if (verbose>0) - cout<<"NumberOfFilesPOINTSAcquired="<nbfiles<<"\n\n"; + std::cout<<"NumberOfFilesPOINTSAcquired="<nbfiles<<"\n\n"; if (mymailw->nbfiles != nbfiles) { - cerr<<"NumberOfFiles != NumberOfFilesAcquired is unexpected\n\n"; + std::cerr<<"NumberOfFiles != NumberOfFilesAcquired is unexpected\n\n"; return 1; } */ @@ -950,14 +930,14 @@ int main(int argc, char *argv[]) for (int i=1; i<=nbfiles; i++){ mymailw->nofile=i; tmp=pathini+casename+tmp.sprintf(format.toLatin1().constData(),nbfiles,i)+".glo"; - if (verbose>0) cout<<"FileName="<0) std::cout<<"FileName="<ReadFileGLO(tmp); //mymailw->SwapOutOfMemory_key_mesh_wrap(QRegExp("GL",true,false)); } if (verbose>0) - cout<<"NumberOfFilesGLOAcquired="<nbfiles<<"\n\n"; + std::cout<<"NumberOfFilesGLOAcquired="<nbfiles<<"\n\n"; if (mymailw->nbfiles != nbfiles){ - cerr<<"NumberOfFiles != NumberOfFilesAcquired is unexpected\n\n"; + std::cerr<<"NumberOfFiles != NumberOfFilesAcquired is unexpected\n\n"; return 1; } @@ -977,7 +957,7 @@ int main(int argc, char *argv[]) //test remove points (type 3) //nb=mymailw->remove_key_mesh_wrap(QRegExp("PO",true,false)); - //cout<<"***remove_key_mesh_wrap*** remove nb="<0)cout<3)std::cout<<"***remove_all_key_mesh_wrap*** "<0)std::cout< Tepal V2 +example of use (when Tepal V2): + facespoints2mesh.py GHS3DPRL + tepal2med --casename=GHS3DPRL --number=12 --medname=DOMAIN --launchtepal=no + mesh2facespoints.py DOMAIN +""" + +import os +import sys + +file_fp='GHS3DPRL' +if len(sys.argv)==2: + file_fp=sys.argv[1] + +f1=file_fp+'.points' +f2=file_fp+'.faces' +f3=file_fp+'.mesh' + +fs=open(f1, 'r') +ft=open(f3, 'w') +ft.write('MeshVersionFormatted 1\n') +ft.write('\nDimension\n3\n') +tmp=fs.readline() +nb=int(tmp) +ft.write('\nVertices\n') +ft.write(tmp) +for i in xrange(0,nb): + lig=fs.readline() + ft.write(lig) +fs.close() + +fs=open(f2, 'r') +lig=fs.readline() +nb=int(lig.split()[0]) +ft.write('\nTriangles\n'+lig.split()[0]+'\n') +for i in xrange(0,nb): + lig=fs.readline() + lig=lig.split() + ft.write(lig[1]+' '+lig[2]+' '+lig[3]+' '+lig[4]+'\n') +ft.write('\nEnd\n') +ft.close() +print 'facespoints2mesh creation of file '+f3 diff --git a/src/tools/mesh2facespoints.py b/src/tools/mesh2facespoints.py new file mode 100755 index 0000000..f03b9b0 --- /dev/null +++ b/src/tools/mesh2facespoints.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +""" +these file is using in GHS3DPRL Plugin +to convert output files .mesh of Tepal V2 +to output files files .faces and .points of Tepal V1 +assume compatibility GHS3DPRL Plugin Tepal V1 => Tepal V2 +example of use (when Tepal V2): + facespoints2mesh.py GHS3DPRL + tepal2med --casename=GHS3DPRL --number=12 --medname=DOMAIN --launchtepal=no + mesh2facespoints.py DOMAIN +""" + +import os +import sys +import glob +import fileinput +import string + +file_m='GHS3DPRL' +if len(sys.argv)==2: + file_m=sys.argv[1] + +def find_cr_or_not(fs,tag): + """find number after tag with cr or sp""" + for line in fs: + if tag+'\n' in line: + #print tag+'' + res=fs.readline() + break + if tag+' ' in line: + #print 'vertices' + res=line.split()[1] + break + res=res.strip("\t\n ") + print tag+' '+res + return res + +def m2fp(f1): + """convert .mesh file to .points and .faces and .noboite""" + print '\nconversion '+f1+' to .points and .faces and .noboite' + #fs=open(f1, 'r') + #fs=fileinput.FileInput(f1,mode='r') #mode not in v2.4.4 + fs=fileinput.FileInput(f1) + (shortname, extension)=os.path.splitext(f1) + f2=shortname+'.points' + print 'creating',f2 + fp=open(f2, 'w') + nb=find_cr_or_not(fs,'Vertices') + np=nb #for .noboite + fp.write(nb+'\n') + for i in xrange(0,int(nb)): + fp.write(fs.readline()) + fp.close() + + f2=shortname+'.faces' + print 'creating',f2 + ff=open(f2, 'w') + nb=find_cr_or_not(fs,'Triangles') + ff.write(nb+' 0\n') + for i in xrange(0,int(nb)): + ff.write('3 '+fs.readline().strip('\t\n ')+' 0 0 0\n') + ff.close() + + ne=find_cr_or_not(fs,'Tetrahedra') + f3=shortname+'.noboite' + fb=open(f3, 'w') + npfixe="0" + fb.write(ne+' '+np+' '+npfixe+' 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n') + for i in xrange(0,int(ne)): + lig=fs.readline().strip('\t\n ') + lig=lig.split() + fb.write(lig[0]+" "+lig[1]+" "+lig[2]+" "+lig[3]+" ") + fb.write('\n') + fs.close() + fs=fileinput.FileInput(shortname+'.points') + nb=fs.readline() #eqal to np + for i in xrange(0,int(nb)): + lig=fs.readline().strip('\t\n ') + lig=lig.split() + fb.write(lig[0]+" "+lig[1]+" "+lig[2]+" ") + fb.write('\n0\n') #subnumber + fs.close() + fb.close() + +def rename_tepal_v1(f1,imax): + """rename files as version v1 of tepal expect""" + (shortname, extension)=os.path.splitext(f1) + fs=os.path.splitext(shortname) + i=int(fs[1].strip('.')) + ff=fs[0]+'.'+str(imax)+'.'+string.zfill(str(i),len(str(imax))) + #noboite en ".32.02.noboite!" + mvcp='mv ' #ou 'cp ' + f2=shortname+'.points' ; f3=ff+os.path.splitext(f2)[1] + print f2,'->',f3 ; os.system(mvcp+f2+' '+f3) + f2=shortname+'.faces' ; f3=ff+os.path.splitext(f2)[1] + print f2,'->',f3 ; os.system(mvcp+f2+' '+f3) + f2=shortname+'.noboite' ; f3=ff+os.path.splitext(f2)[1] + print f2,'->',f3 ; os.system(mvcp+f2+' '+f3) + f2=shortname+'.glo' ; f3=ff+os.path.splitext(f2)[1] + print f2,'->',f3 ; os.system(mvcp+f2+' '+f3) + f2=shortname+'.msg' ; f3=ff+os.path.splitext(f2)[1] + print f2,'->',f3 ; os.system(mvcp+f2+' '+f3) + +def my_test(a): return int(os.path.basename(a).split('.')[1]) + +f0=file_m+'.?????.mesh' +#print f0 +fics=glob.glob(f0) +fics.sort(lambda a, b: cmp(my_test(b), my_test(a))) #tri ordre decroissant +print 'conversion of files:\n',fics + +imax=len(fics) +for f in fics: + m2fp(f) + rename_tepal_v1(f,imax) -- 2.30.2