]> SALOME platform Git repositories - plugins/netgenplugin.git/commitdiff
Salome HOME
Merge from V5_1_main 14/05/2010
authorvsr <vsr@opencascade.com>
Fri, 14 May 2010 15:49:35 +0000 (15:49 +0000)
committervsr <vsr@opencascade.com>
Fri, 14 May 2010 15:49:35 +0000 (15:49 +0000)
69 files changed:
Makefile.am
NETGENPLUGIN_version.h.in
adm_local/Makefile.am
adm_local/cmake_files/FindNETGEN.cmake
adm_local/unix/Makefile.am
adm_local/unix/config_files/Makefile.am
adm_local/unix/config_files/check_NETGEN.m4
adm_local/unix/config_files/check_NETGENPLUGIN.m4
adm_local/unix/make_common_starter.am
bin/Makefile.am
build_cmake
build_cmake.bat
build_configure
clean_configure
configure.ac
idl/Makefile.am
idl/NETGENPlugin_Algorithm.idl
resources/Makefile.am
resources/NETGENPlugin.xml
resources/SalomeApp.xml
src/GUI/Makefile.am
src/GUI/NETGENPluginGUI.cxx
src/GUI/NETGENPluginGUI.h
src/GUI/NETGENPluginGUI_HypothesisCreator.cxx
src/GUI/NETGENPluginGUI_HypothesisCreator.h
src/GUI/NETGENPluginGUI_SimpleCreator.cxx
src/GUI/NETGENPluginGUI_SimpleCreator.h
src/GUI/NETGENPlugin_images.ts
src/GUI/NETGENPlugin_msg_en.ts
src/Makefile.am
src/NETGEN/Makefile.am
src/NETGEN/ReadMeForNgUsers
src/NETGENPlugin/Makefile.am
src/NETGENPlugin/NETGENPlugin_Defs.hxx
src/NETGENPlugin/NETGENPlugin_Hypothesis.cxx
src/NETGENPlugin/NETGENPlugin_Hypothesis.hxx
src/NETGENPlugin/NETGENPlugin_Hypothesis_2D.cxx
src/NETGENPlugin/NETGENPlugin_Hypothesis_2D.hxx
src/NETGENPlugin/NETGENPlugin_Hypothesis_2D_i.cxx
src/NETGENPlugin/NETGENPlugin_Hypothesis_2D_i.hxx
src/NETGENPlugin/NETGENPlugin_Hypothesis_i.cxx
src/NETGENPlugin/NETGENPlugin_Hypothesis_i.hxx
src/NETGENPlugin/NETGENPlugin_Mesher.cxx
src/NETGENPlugin/NETGENPlugin_Mesher.hxx
src/NETGENPlugin/NETGENPlugin_NETGEN_2D.cxx
src/NETGENPlugin/NETGENPlugin_NETGEN_2D.hxx
src/NETGENPlugin/NETGENPlugin_NETGEN_2D3D.cxx
src/NETGENPlugin/NETGENPlugin_NETGEN_2D3D.hxx
src/NETGENPlugin/NETGENPlugin_NETGEN_2D3D_i.cxx
src/NETGENPlugin/NETGENPlugin_NETGEN_2D3D_i.hxx
src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.cxx
src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.hxx
src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY_i.cxx
src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY_i.hxx
src/NETGENPlugin/NETGENPlugin_NETGEN_2D_i.cxx
src/NETGENPlugin/NETGENPlugin_NETGEN_2D_i.hxx
src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx
src/NETGENPlugin/NETGENPlugin_NETGEN_3D.hxx
src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.cxx
src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.hxx
src/NETGENPlugin/NETGENPlugin_SimpleHypothesis_2D.cxx
src/NETGENPlugin/NETGENPlugin_SimpleHypothesis_2D.hxx
src/NETGENPlugin/NETGENPlugin_SimpleHypothesis_2D_i.cxx
src/NETGENPlugin/NETGENPlugin_SimpleHypothesis_2D_i.hxx
src/NETGENPlugin/NETGENPlugin_SimpleHypothesis_3D.cxx
src/NETGENPlugin/NETGENPlugin_SimpleHypothesis_3D.hxx
src/NETGENPlugin/NETGENPlugin_SimpleHypothesis_3D_i.cxx
src/NETGENPlugin/NETGENPlugin_SimpleHypothesis_3D_i.hxx
src/NETGENPlugin/NETGENPlugin_i.cxx

index c9abb167e92850c8bf6bc41c9be0864d803db450..cf83c3f6137a6a42c529052a514098cb7f3a89d2 100644 (file)
@@ -1,7 +1,4 @@
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+
 # -* Makefile *- 
 # Author : Patrick GOLDBRONN (CEA)
 # Date : 28/06/2001
index 8f1132a983d1fc1184678fdd3f8bb27601b805cf..134c3a061d557fba93240690db9b1b43b1ad2778 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  File   : NETGENPLUGIN_version.h
 //  Author : Vadim SANDLER
 //  Module : SALOME
index f35273fac7de52921e587cdc5f9641c7f3116fc3..a04c819626b6d2e41ea5db4d13352f3ead58bb98 100644 (file)
@@ -1,7 +1,4 @@
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+
 include $(top_srcdir)/adm_local/unix/make_common_starter.am
 
 SUBDIRS = unix
index a054e7cf6007826f5990031161399a52d530ed79..4855340262ba1f11a76427e5ac7a63bb85d523c2 100644 (file)
@@ -1,7 +1,4 @@
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -48,3 +45,5 @@ SET(NETGEN_LIBS ${NETGEN_LIBS} ${NETGEN_LIB_nginterface})
 SET(NETGEN_LIBS ${NETGEN_LIBS} ${NETGEN_LIB_occ})
 SET(NETGEN_LIBS ${NETGEN_LIBS} ${NETGEN_LIB_opti})
 SET(NETGEN_LIBS ${NETGEN_LIBS} ${NETGEN_LIB_stlgeom})
+
+SET(CMAKE_BUILD 1)
index 5f6d5f7536c72fc43090c511c2a26518cb92af5d..190640454b95c4400f4dd63790e41f5d61e5a25e 100644 (file)
@@ -1,7 +1,4 @@
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+
 include $(top_srcdir)/adm_local/unix/make_common_starter.am
 
 SUBDIRS = config_files
index ef7b6d68ed2f61c00101fba92868504e75cb4004..5f00cd03416f7124befd3be4f8bfed0793177de1 100644 (file)
@@ -1,7 +1,4 @@
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+
 include $(top_srcdir)/adm_local/unix/make_common_starter.am
 
 dist_admlocalm4_DATA =         \
index 6a8d94e10868276d11557a8196618dc2e9d41087..b7f39754f97449408b9d5a19e665858a147c6a17 100644 (file)
@@ -1,4 +1,4 @@
-dnl  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+dnl  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 dnl
 dnl  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 dnl  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@ dnl  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 dnl
 dnl  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 dnl
+
 AC_DEFUN([CHECK_NETGEN],[
 
 AC_REQUIRE([AC_PROG_CXX])dnl
@@ -219,7 +220,7 @@ namespace nglib {
 
       if test "x$Netgen_ok" == xno ; then
       AC_MSG_RESULT(no)
-      AC_MSG_ERROR(Netgen is not properly installed)
+      AC_MSG_ERROR(Netgen is not properly installed. Read NETGENPLUGIN_SRC/src/NETGEN/ReadMeForNgUsers for details.)
       fi
 
       NETGEN_LIBS="-L${NETGEN_LIBS_DIR} -lnglib"
@@ -234,10 +235,15 @@ namespace nglib {
 
   if test "x$Netgen_ok" == xno ; then
     AC_MSG_RESULT(no)
-    AC_MSG_WARN(Netgen libraries not found or not properly installed)
+    AC_MSG_ERROR(Netgen libraries not found or not properly installed)
   else
     AC_MSG_RESULT(yes)
   fi
+
+else
+
+    AC_MSG_ERROR(Netgen libraries not found. Please define NETGENHOME or use --with-netgen option)
+
 fi
 
 AC_SUBST(NETGEN_INCLUDES)
index 9ceac78d3a31305e4f4bf3bbf87d8aad5dd4f6d0..bc8e37e643870ff3b02ec7709b146f3bba633c3a 100644 (file)
@@ -1,4 +1,4 @@
-dnl  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+dnl  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 dnl
 dnl  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 dnl  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@ dnl  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 dnl
 dnl  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 dnl
+
 #------------------------------------------------------------
 #  Check availability of Salome NETGEN mesh plugin module
 #   distribution
index cd851519b43b9a45f237e8476506361a49c93fb6..782a8154d27034f5e4b01b24d234fa80f21e9102 100644 (file)
@@ -1,7 +1,4 @@
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -24,6 +21,7 @@
 # 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
 
index 88eceb70157e7a4a3e7d489478ac3f9720078420..92999a58afedf20219a2cded661652d97972c9d4 100644 (file)
@@ -1,7 +1,4 @@
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+
 # -* Makefile *- 
 # Author : Guillaume Boulant (CSSI)
 # Module : KERNEL
index 2a652c098227950875f92c24fb0a60dc9ea4f625..90f5526c7bafac522d2e7aa8a21f6b4a499d5b16 100755 (executable)
@@ -1,8 +1,5 @@
 #!/bin/sh
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
index 67b99a71182471ebbc227072a83e643d1e53acc1..a0e5969b028266ae273812b3b5f3fd62f6e8e31e 100644 (file)
@@ -1,2 +1,20 @@
-\r
+@REM  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+@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 --netgenplugin\r
index 35c5d6959dde69fdc86c806e68842fb75dfc4589..8a3ea3cc4c9822274cd71067bee5cc1cc7ae7194 100755 (executable)
@@ -1,5 +1,5 @@
 #!/bin/bash
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+#  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 #
 #  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 #  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -20,6 +20,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+
 # Tool for updating list of .in file for the SALOME project 
 # and regenerating configure script
 # Author : Marc Tajchman - CEA
index f57f7b3bf98d03cab5f0acc1a75b80d039d61886..36652087444b78045d18dd53e9b4122bba33eebb 100755 (executable)
@@ -1,8 +1,5 @@
 #!/bin/sh
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -20,6 +17,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+
 rm -rf autom4te.cache aclocal.m4 configure make_config
 find . -name "*~" -print -exec rm {} \;
 find . -name "*.pyc" -print -exec rm {} \;
index 490143050a0523e1c2a5248341e1bdb027b7a4ee..7c8e78d99188d5fb663a5418450fe95433a772f9 100644 (file)
@@ -1,7 +1,4 @@
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+
 #  PLEASE DO NOT MODIFY configure.in FILE
 #  ALL CHANGES WILL BE DISCARDED BY THE NEXT
 #  build_configure COMMAND
@@ -31,7 +29,7 @@
 # Reorganization for usage of autotools
 # Created from configure.in.base
 #
-AC_INIT([Salome2 Project NETGENPLUGIN module], [5.1.3], [webmaster.salome@opencascade.com], [SalomeNETGENPLUGIN])
+AC_INIT([Salome2 Project NETGENPLUGIN module], [5.1.4], [webmaster.salome@opencascade.com], [SalomeNETGENPLUGIN])
 AC_CONFIG_AUX_DIR(adm_local/unix/config_files)
 AC_CANONICAL_HOST
 AC_CANONICAL_TARGET
@@ -361,6 +359,7 @@ echo Summary
 echo ---------------------------------------------
 echo
 
+AM_CONDITIONAL(CMAKE_BUILD, 0)
 #AM_CONDITIONAL( USE_GFORTRAN, [test "$F77" = "gfortran"])
 
 echo Configure
index de2be4351e5d3cf603de6c750d22508b8781dde8..43580c7117e54994dcd7db88c02eecccaa4ea642 100644 (file)
@@ -1,7 +1,4 @@
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@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
index f968db2ea16d62330cc26a81ba796035033e4256..fa7a5cc6ad681eb44c1c951808049d1dbd8770e7 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  File   : NETGENPlugin_Algorithm.idl
 //  Author : Julia DOROVSKIKH
 //  $Header$
index d11fed6b5011a36c52a3f7b3873f2b4b31f46634..b4aa68c6f30f9a181b64214fabed7d1e1080fb4d 100644 (file)
@@ -1,7 +1,4 @@
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+
 # -* Makefile *- 
 # Author : Patrick GOLDBRONN (CEA)
 # Date : 28/06/2001
index 248e1e1306ff8ededbb3764410c6a98a9fea140f..0d3ec830d3906c47884822564c07739f54b6bf59 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0' encoding='us-ascii'?>
 <!DOCTYPE meshers PUBLIC "" "desktop.dtd">
 <!--
-  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 
   Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
   CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
index 818f345f139679e8db1e46ae2941a070e911a738..e8236956e6b1f2eeb27fb41374bac05163f3d6d7 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 
   Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
   CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
index 5b3fa8a9d42d43414753cef5f3801937b474cde9..4f85c75d2624c41038fea1265d4e86061d018a2d 100644 (file)
@@ -1,7 +1,4 @@
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+
 #  File   : Makefile.in
 #  Author : Michael Sazonov
 #  Modified by : Alexander BORODIN (OCN) - autotools usage
index d4555475e7b61a2867db85ab27db7f2fe3d19f54..54954afdc1603b68ceea936d6021e80f334beb8c 100755 (executable)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin GUI: GUI for plugged-in mesher NETGENPlugin
 //  File   : NETGENPluginGUI.cxx
 //  Author : Michael Zorin
index 8d68dce9088dc5e542c0d552144a53c946072ef5..6283f9999c5896fd1db6a869d2ca1046ad6fcfb3 100755 (executable)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin GUI: GUI for plugged-in mesher NETGENPlugin
 //  File   : NETGENPluginGUI.h
 //  Author : Alexander A. BORODIN
index f3a1b7fc17ef572675b3c0caa26d60b2cac78e6d..13aea929f96392d576c5ec4709f4c996e39ffe91 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin GUI: GUI for plugged-in mesher NETGENPlugin
 //  File   : NETGENPluginGUI_HypothesisCreator.cxx
 //  Author : Michael Zorin
@@ -30,6 +31,7 @@
 #include <SMESHGUI_Utils.h>
 #include <SMESHGUI_HypothesesUtils.h>
 #include <SMESHGUI.h>
+#include <SMESHGUI_SpinBox.h>
 
 #include CORBA_SERVER_HEADER(NETGENPlugin_Algorithm)
 
@@ -38,8 +40,6 @@
 
 #include <SalomeApp_Tools.h>
 
-#include <SalomeApp_DoubleSpinBox.h>
-
 #include <QComboBox>
 #include <QLabel>
 #include <QGroupBox>
@@ -110,11 +110,8 @@ QFrame* NETGENPluginGUI_HypothesisCreator::buildFrame()
   }
 
   aGroupLayout->addWidget( new QLabel( tr( "NETGEN_MAX_SIZE" ), GroupC1 ), row, 0 );
-  myMaxSize = new SalomeApp_DoubleSpinBox( GroupC1 );
-  myMaxSize->setDecimals( 7 );
-  myMaxSize->setMinimum( 1e-07 );
-  myMaxSize->setMaximum( 1e+06 );
-  myMaxSize->setSingleStep( 10 );
+  myMaxSize = new SMESHGUI_SpinBox( GroupC1 );
+  myMaxSize->RangeStepAndValidator( 1e-07, 1e+06, 10., "length_precision" );
   aGroupLayout->addWidget( myMaxSize, row, 1 );
   row++;
   
@@ -132,26 +129,22 @@ QFrame* NETGENPluginGUI_HypothesisCreator::buildFrame()
   row++;
 
   aGroupLayout->addWidget( new QLabel( tr( "NETGEN_GROWTH_RATE" ), GroupC1 ), row, 0 );
-  myGrowthRate = new SalomeApp_DoubleSpinBox( GroupC1 );
-  myGrowthRate->setMinimum( 0.1 );
-  myGrowthRate->setMaximum( 10 );
-  myGrowthRate->setSingleStep( 0.1 );
+  myGrowthRate = new SMESHGUI_SpinBox( GroupC1 );
+  myGrowthRate->RangeStepAndValidator( .1, 10., .1, "parametric_precision" );
   aGroupLayout->addWidget( myGrowthRate, row, 1 );
   row++;
 
   const double VALUE_MAX = 1.0e+6;
 
   aGroupLayout->addWidget( new QLabel( tr( "NETGEN_SEG_PER_EDGE" ), GroupC1 ), row, 0 );
-  myNbSegPerEdge = new SalomeApp_DoubleSpinBox( GroupC1 );
-  myNbSegPerEdge->setMinimum( 0.2 );
-  myNbSegPerEdge->setMaximum( VALUE_MAX ); // (PAL14890) max value in native netgen gui is 5
+  myNbSegPerEdge = new SMESHGUI_SpinBox( GroupC1 );
+  myNbSegPerEdge->RangeStepAndValidator( .2, VALUE_MAX, .1, "parametric_precision" );
   aGroupLayout->addWidget( myNbSegPerEdge, row, 1 );
   row++;
   
   aGroupLayout->addWidget( new QLabel( tr( "NETGEN_SEG_PER_RADIUS" ), GroupC1 ), row, 0 );
-  myNbSegPerRadius = new SalomeApp_DoubleSpinBox( GroupC1 );
-  myNbSegPerRadius->setMinimum( 0.2 );
-  myNbSegPerRadius->setMaximum( VALUE_MAX ); // (PAL14890) max value in native netgen gui is 5
+  myNbSegPerRadius = new SMESHGUI_SpinBox( GroupC1 );
+  myNbSegPerRadius->RangeStepAndValidator( .2, VALUE_MAX, .1, "parametric_precision" );
   aGroupLayout->addWidget( myNbSegPerRadius, row, 1 );
   row++;
 
index a23739eee8b3e008bb815c9de4f940577f181afb..2ea4bd1e158cc905ef67fe9ca67f9ae637cfc7e4 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin GUI: GUI for plugged-in mesher NETGENPlugin
 //  File   : NETGENPluginGUI_HypothesisCreator.h
 //  Author : Michael Zorin
@@ -32,7 +33,7 @@
 
 #include <SMESHGUI_Hypotheses.h>
 
-class SalomeApp_DoubleSpinBox;
+class SMESHGUI_SpinBox;
 class QComboBox;
 class QCheckBox;
 class QLineEdit;
@@ -79,13 +80,13 @@ private:
 
 private:
  QLineEdit*        myName;
- SalomeApp_DoubleSpinBox* myMaxSize;
+ SMESHGUI_SpinBox* myMaxSize;
  QCheckBox*        mySecondOrder;
  QCheckBox*        myOptimize;
  QComboBox*        myFineness;
- SalomeApp_DoubleSpinBox* myGrowthRate;
- SalomeApp_DoubleSpinBox* myNbSegPerEdge;
- SalomeApp_DoubleSpinBox* myNbSegPerRadius;
+ SMESHGUI_SpinBox* myGrowthRate;
+ SMESHGUI_SpinBox* myNbSegPerEdge;
+ SMESHGUI_SpinBox* myNbSegPerRadius;
  QCheckBox*        myAllowQuadrangles;
 
  bool myIs2D;
index 3a9c87172490470634dd044d6494f4341b015611..6bdf0654b67a5425665b0ccb5b21a75456903af8 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 // File   : NETGENPluginGUI_SimpleCreator.cxx
 // Author : Open CASCADE S.A.S.
 // SMESH includes
@@ -151,7 +149,7 @@ QFrame* NETGENPluginGUI_SimpleCreator::buildFrame()
   // * local length
   myLengthRadioBut = new QRadioButton( tr( "SMESH_LOCAL_LENGTH_HYPOTHESIS" ), dimGroup );
   myLength = new SMESHGUI_SpinBox( dimGroup );
-  myLength->RangeStepAndValidator( VALUE_SMALL, VALUE_MAX, 0.1, 6 );
+  myLength->RangeStepAndValidator( VALUE_SMALL, VALUE_MAX, 0.1, "length_precision" );
   myLength->setValue( 1. );
   dimLay->addWidget( myLengthRadioBut, dimRow, 0 );
   dimLay->addWidget( myLength, dimRow, 1 );
@@ -178,7 +176,7 @@ QFrame* NETGENPluginGUI_SimpleCreator::buildFrame()
   // * max area
   dimLay->addWidget( new QLabel( tr( "SMESH_MAX_ELEMENT_AREA_HYPOTHESIS" ), dimGroup), dimRow, 0);
   myArea = new SMESHGUI_SpinBox( dimGroup );
-  myArea->RangeStepAndValidator( VALUE_SMALL_2, VALUE_MAX_2, 0.1, 6 );
+  myArea->RangeStepAndValidator( VALUE_SMALL_2, VALUE_MAX_2, 0.1, "area_precision" );
   myArea->setValue( 1. );
   dimLay->addWidget( myArea, dimRow, 1 );
   dimRow++;
@@ -205,7 +203,7 @@ QFrame* NETGENPluginGUI_SimpleCreator::buildFrame()
     // * max volume
     dimLay->addWidget(new QLabel( tr("SMESH_MAX_ELEMENT_VOLUME_HYPOTHESIS"), dimGroup), dimRow, 0);
     myVolume = new SMESHGUI_SpinBox( dimGroup );
-    myVolume->RangeStepAndValidator( VALUE_SMALL_3, VALUE_MAX_3, 0.1, 6 );
+    myVolume->RangeStepAndValidator( VALUE_SMALL_3, VALUE_MAX_3, 0.1, "volume_precision" );
     myVolume->setValue( 1. );
     dimLay->addWidget( myVolume, dimRow, 1 );
     dimRow++;
index 4b7bb88d57dfe5f3656fec82e3bbf78a91dcc5d1..8531370ca56856fdd93b4c56b37598d9f9bac5a6 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 // File   : NETGENPluginGUI_SimpleCreator.h
 // Author : Open CASCADE S.A.S.
 //
index 92ae6586bb49990a6be0a4352a5568a6ef898ff3..b47a5d66ffadeae8badffda3c0a00a512595dbac 100644 (file)
@@ -1,6 +1,6 @@
 <!DOCTYPE TS>
 <!--
-  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 
   Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
   CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
index 42ef251e9dba53df6a0a405f4771f6d90bb9b959..3aea2e336de37ddc867a7b7b8a5270a5ac70e6ea 100644 (file)
@@ -1,6 +1,6 @@
 <!DOCTYPE TS>
 <!--
-  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 
   Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
   CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
index cbd2d9ee89b2e598ee54031ef7f9f8476e9dd7e2..bf9671e06ca3bb023c0b321143fd8e68cb0820e6 100644 (file)
@@ -1,7 +1,4 @@
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+
 #  File   : Makefile.in
 #  Author : Patrick GOLDBRONN (CEA)
 #  Modified by : Alexander BORODIN (OCN) - autotools usage
 include $(top_srcdir)/adm_local/unix/make_common_starter.am
 
 SUBDIRS =
-if ! NETGEN_NEW
+if CMAKE_BUILD
+else
+if NETGEN_NEW
+else
   SUBDIRS += NETGEN
 endif
+endif
 SUBDIRS += NETGENPlugin
 
 if NETGENPLUGIN_ENABLE_GUI
index 0ac053960d56e7961e5ee1b6e5b70db4f5712bec..60285ebf2e26e9af23ad75e193cd1babb1283480 100644 (file)
@@ -1,7 +1,4 @@
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+
 # -* Makefile *- 
 # Author : Edward AGAPOV (OCC)
 #  Modified by : Alexander BORODIN (OCN) - autotools usage
index ddea381229c72775c7d973209d30d8e6cd5e816d..7d982a80803a6d56266c830bfa6ce2cfc4de690f 100644 (file)
@@ -9,13 +9,13 @@ Netgen can be find at http://www.hpfem.jku.at/netgen/
 1. How to build Netgen for Netgen Plugin
 ------------------------------
 
-1.1. Download Netgen archive (here netgen-4.9.11.tar.gz) and unpack it
+1.1. Download Netgen archive (here netgen-4.9.12.tar.gz) and unpack it
 
 1.2. Configure the netgen compilation. The "good" options are
-     ../netgen-4.9.11/configure \
+     ../netgen-4.9.12/configure \ 
         --prefix=THE_INSTALLATION_PATH \
-        --enable-occ --enable-nglib --with-occ=${CASROOT} \
-        CXXFLAGS="-DOCCGEOMETRY -I${CASROOT}/inc -DHAVE_IOSTREAM -DHAVE_LIMITS -DHAVE_LIMITS_H -DHAVE_IOMANIP -I${TOGL_HOME}/include" \
+        --with-occ=${CASROOT} \
+        CXXFLAGS="-I${TOGL_HOME}/include" \
         LDFLAGS="-L${TOGL_HOME}/lib/Togl1.7"
 
 1.3. Compile the netgen product
index 849330b2669d2dbedb81637f282560fe5ba3354e..b43c700e7c54e2c3348ef34b9360862ba086d413 100644 (file)
@@ -1,7 +1,4 @@
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+
 # -* Makefile *- 
 # Author : Edward AGAPOV (OCC)
 #  Modified by : Alexander BORODIN (OCN) - autotools usage
@@ -93,5 +91,6 @@ endif
 libNETGENEngine_la_LDFLAGS  += \
        ../../idl/libSalomeIDLNETGENPLUGIN.la \
        $(CAS_LDPATH) -lTKernel -lTKBRep -lTKShHealing -lTKSTEP -lTKXSBase -lTKIGES -lTKMesh -lTKSTL -lTKG3d -lTKTopAlgo -lTKG2d -lTKBool -lTKGeomAlgo -lTKOffset -lTKGeomBase -lTKBO \
+       $(MED_LDFLAGS) -lSalomeIDLMED \
        $(SMESH_LDFLAGS) -lSMESHimpl -lSMESHEngine -lStdMeshersEngine -lStdMeshers -lSMESHDS -lSMDS -lSMESHControls \
        $(KERNEL_LDFLAGS) -lSalomeGenericObj -lSALOMELocalTrace -lOpUtil
index 4d2f19991b9ec90ec8f153dbd8b39c7b55351833..69d008fe5f812c802837c0f0471f308bc3d1d349 100755 (executable)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //=============================================================================
 // File      : NETGENPlugin_Defs.hxx
 // Author    : Alexander A. BORODIN
index f743919a7ffbea747c94726f82dbd897adb10635..b825d07c0fb14f1f3954a4b95a736a9ad254587a 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_Hypothesis.cxx
 // Author    : Michael Sazonov (OCN)
index 3654f86102219ba4959a6d48fbd1dbb30f3d55af..649548e1d0b522b51c01929433cb2b0abfd9c742 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_Hypothesis.hxx
 // Author    : Michael Sazonov (OCN)
index 93dd11645a088d710eb8a453b38fafbf62b46024..b1ea23110d30f23f12332f744c47a9591e86a0a1 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_Hypothesis_2D.cxx
 // Author    : Michael Sazonov (OCN)
index 07f1195d57c717c4a9b79c4a17e645cee046664f..086c723b203d7c22c3f9232459126ccd44d169cd 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_Hypothesis_2D.hxx
 // Author    : Michael Sazonov (OCN)
index cdb595c80b9e11ec42873f82219b134d106a045b..84a46d7340edc09feda354b48d1054ca04b5f374 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_Hypothesis_2D_i.cxx
 // Author    : Michael Sazonov (OCN)
index 1a94bc66526fac380826e55f5853fdd6b1744962..0c02b2ad5b71cc00a0c1c4194b44e89755c44451 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_Hypothesis_2D_i.hxx
 // Author    : Michael Sazonov (OCN)
index f13e9db5bd365942d6e1d774934654d5224a03e4..b9ac7823c8ca6f742ad01a5cd008abeeafa5b36c 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_Hypothesis_i.cxx
 // Author    : Michael Sazonov (OCN)
index 94ad126536fc9abc67719e6c6c877207bee5f02a..1d02796b9b506c1696ab6b32d2a444da88608783 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_Hypothesis_i.hxx
 // Author    : Michael Sazonov (OCN)
index 7a20b1a1071ba1d05c479b1fe523fdeca91b9f01..8a0cfbbc4d9620a41d4fcac725aab4e1195ae6e4 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_Mesher.cxx
 // Author    : Michael Sazonov (OCN)
 #include "NETGENPlugin_Hypothesis_2D.hxx"
 #include "NETGENPlugin_SimpleHypothesis_3D.hxx"
 
-#include <SMESH_Mesh.hxx>
+#include <SMDS_FaceOfNodes.hxx>
+#include <SMDS_MeshElement.hxx>
+#include <SMDS_MeshNode.hxx>
+#include <SMESHDS_Mesh.hxx>
 #include <SMESH_Comment.hxx>
 #include <SMESH_ComputeError.hxx>
-#include <SMESH_subMesh.hxx>
+#include <SMESH_File.hxx>
+#include <SMESH_Mesh.hxx>
 #include <SMESH_MesherHelper.hxx>
-#include <SMESHDS_Mesh.hxx>
-#include <SMDS_MeshElement.hxx>
-#include <SMDS_MeshNode.hxx>
+#include <SMESH_subMesh.hxx>
 #include <utilities.h>
 
 #include <vector>
@@ -61,9 +64,6 @@
 #include <TopoDS.hxx>
 
 // Netgen include files
-namespace nglib {
-#include <nglib.h>
-}
 #define OCCGEOMETRY
 #include <occgeom.hpp>
 #include <meshing.hpp>
@@ -73,14 +73,26 @@ namespace netgen {
   extern MeshingParameters mparam;
 }
 
+using namespace nglib;
 using namespace std;
 
 #ifdef _DEBUG_
-#define nodeVec_ACCESS(index) nodeVec.at((index))
+#define nodeVec_ACCESS(index) (SMDS_MeshNode*) nodeVec.at((index))
 #else
-#define nodeVec_ACCESS(index) nodeVec[index]
+#define nodeVec_ACCESS(index) (SMDS_MeshNode*) nodeVec[index]
 #endif
 
+#ifdef NETGEN_NEW
+#define NGPOINT_COORDS(p) p(0),p(1),p(2)
+#else
+#define NGPOINT_COORDS(p) p.X(),p.Y(),p.Z()
+#endif
+
+// dump elements added to ng mesh
+//#define DUMP_SEGMENTS
+//#define DUMP_TRIANGLES
+//#define DUMP_TRIANGLES_SCRIPT "/tmp/trias.py" //!< debug addIntVerticesInSolids()
+
 //=============================================================================
 /*!
  *
@@ -107,11 +119,7 @@ NETGENPlugin_Mesher::NETGENPlugin_Mesher (SMESH_Mesh* mesh,
 
 void NETGENPlugin_Mesher::defaultParameters()
 {
-#ifdef WNT
-  netgen::MeshingParameters& mparams = netgen::GlobalMeshingParameters();
-#else
   netgen::MeshingParameters& mparams = netgen::mparam;
-#endif
   // maximal mesh edge size
   mparams.maxh = NETGENPlugin_Hypothesis::GetDefaultMaxSize();
   // minimal number of segments per edge
@@ -138,11 +146,7 @@ void NETGENPlugin_Mesher::SetParameters(const NETGENPlugin_Hypothesis* hyp)
 {
   if (hyp)
   {
-#ifdef WNT
-    netgen::MeshingParameters& mparams = netgen::GlobalMeshingParameters();
-#else
     netgen::MeshingParameters& mparams = netgen::mparam;
-#endif
     // Initialize global NETGEN parameters:
     // maximal mesh segment size
     mparams.maxh = hyp->GetMaxSize();
@@ -206,11 +210,11 @@ Standard_Boolean IsEqual(const Link& aLink1, const Link& aLink2)
  */
 //================================================================================
 
-void NETGENPlugin_Mesher::PrepareOCCgeometry(netgen::OCCGeometry&          occgeo,
-                                             const TopoDS_Shape&           shape,
-                                             SMESH_Mesh&                   mesh,
-                                             list< SMESH_subMesh* > *      meshedSM,
-                                             TopTools_DataMapOfShapeShape* internalE2F)
+void NETGENPlugin_Mesher::PrepareOCCgeometry(netgen::OCCGeometry&     occgeo,
+                                             const TopoDS_Shape&      shape,
+                                             SMESH_Mesh&              mesh,
+                                             list< SMESH_subMesh* > * meshedSM,
+                                             NETGENPlugin_Internals*  intern)
 {
   BRepTools::Clean (shape);
   try {
@@ -233,23 +237,6 @@ void NETGENPlugin_Mesher::PrepareOCCgeometry(netgen::OCCGeometry&          occge
 
   occgeo.shape = shape;
   occgeo.changed = 1;
-  //occgeo.BuildFMap();
-
-  TopTools_MapOfShape internalV;
-  if ( internalE2F )
-  {
-    for ( TopExp_Explorer f( shape, TopAbs_FACE ); f.More(); f.Next() )
-      for ( TopExp_Explorer e( f.Current(), TopAbs_EDGE ); e.More(); e.Next() )
-        if ( e.Current().Orientation() == TopAbs_INTERNAL )
-        {
-          SMESH_subMesh* sm = mesh.GetSubMesh( e.Current() );
-          if ( !meshedSM || sm->IsEmpty() ) {
-            internalE2F->Bind( e.Current(), f.Current() );
-            for ( TopoDS_Iterator v(e.Current()); v.More(); v.Next() )
-              internalV.Add( v.Value() );
-          }
-        }
-  }
 
   // fill maps of shapes of occgeo with not yet meshed subshapes
 
@@ -272,24 +259,29 @@ void NETGENPlugin_Mesher::PrepareOCCgeometry(netgen::OCCGeometry&          occge
     // to find a right orientation of subshapes (PAL20462)
     TopTools_IndexedMapOfShape subShapes;
     TopExp::MapShapes(root->GetSubShape(), subShapes);
-    while ( smIt->more() ) {
+    while ( smIt->more() )
+    {
       SMESH_subMesh* sm = smIt->next();
-      if ( !meshedSM || sm->IsEmpty() ) {
-        TopoDS_Shape shape = sm->GetSubShape();
+      TopoDS_Shape shape = sm->GetSubShape();
+      if ( intern && intern->isShapeToPrecompute( shape ))
+        continue;
+      if ( !meshedSM || sm->IsEmpty() )
+      {
         if ( shape.ShapeType() != TopAbs_VERTEX )
           shape = subShapes( subShapes.FindIndex( shape ));// shape -> index -> oriented shape
+        if ( shape.Orientation() >= TopAbs_INTERNAL )
+          shape.Orientation( TopAbs_FORWARD ); // isuue 0020676
         switch ( shape.ShapeType() ) {
         case TopAbs_FACE  : occgeo.fmap.Add( shape ); break;
-        case TopAbs_EDGE  :
-          if ( !internalE2F || !internalE2F->IsBound( shape )) occgeo.emap.Add( shape ); break;
-        case TopAbs_VERTEX:
-          if ( !internalV.Contains( shape )) occgeo.vmap.Add( shape ); break;
+        case TopAbs_EDGE  : occgeo.emap.Add( shape ); break;
+        case TopAbs_VERTEX: occgeo.vmap.Add( shape ); break;
         case TopAbs_SOLID :occgeo.somap.Add( shape ); break;
         default:;
         }
       }
       // collect submeshes of meshed shapes
-      else if (meshedSM) {
+      else if (meshedSM)
+      {
         meshedSM->push_back( sm );
       }
     }
@@ -299,30 +291,39 @@ void NETGENPlugin_Mesher::PrepareOCCgeometry(netgen::OCCGeometry&          occge
 #ifdef NETGEN_NEW
   occgeo.face_maxh.SetSize(occgeo.fmap.Extent());
   occgeo.face_maxh = netgen::mparam.maxh;
+  occgeo.face_maxh_modified.SetSize(occgeo.fmap.Extent());
+  occgeo.face_maxh_modified = 0;
 #endif
 
 }
 
-//================================================================================
-/*!
- * \brief return id of netgen point corresponding to SMDS node
- */
-//================================================================================
-typedef map< const SMDS_MeshNode*, int > TNode2IdMap;
-
-static int ngNodeId( const SMDS_MeshNode* node,
-                     netgen::Mesh&        ngMesh,
-                     TNode2IdMap&         nodeNgIdMap)
+namespace
 {
-  int newNgId = ngMesh.GetNP() + 1;
+  //================================================================================
+  /*!
+   * \brief return id of netgen point corresponding to SMDS node
+   */
+  //================================================================================
+  typedef map< const SMDS_MeshNode*, int > TNode2IdMap;
+
+  int ngNodeId( const SMDS_MeshNode* node,
+                netgen::Mesh&        ngMesh,
+                TNode2IdMap&         nodeNgIdMap)
+  {
+    int newNgId = ngMesh.GetNP() + 1;
 
-  pair< TNode2IdMap::iterator, bool > it_isNew = nodeNgIdMap.insert( make_pair( node, newNgId ));
+    TNode2IdMap::iterator node_id = nodeNgIdMap.insert( make_pair( node, newNgId )).first;
 
-  if ( it_isNew.second ) {
-    netgen::MeshPoint p( netgen::Point<3> (node->X(), node->Y(), node->Z()) );
-    ngMesh.AddPoint( p );
+    if ( node_id->second == newNgId)
+    {
+#if defined(DUMP_SEGMENTS) || defined(DUMP_TRIANGLES)
+      cout << "Ng " << newNgId << " - " << node;
+#endif
+      netgen::MeshPoint p( netgen::Point<3> (node->X(), node->Y(), node->Z()) );
+      ngMesh.AddPoint( p );
+    }
+    return node_id->second;
   }
-  return it_isNew.first->second;
 }
 
 //================================================================================
@@ -331,19 +332,21 @@ static int ngNodeId( const SMDS_MeshNode* node,
  */
 //================================================================================
 
-bool NETGENPlugin_Mesher::fillNgMesh(netgen::OCCGeometry&           occgeom,
+bool NETGENPlugin_Mesher::fillNgMesh(const netgen::OCCGeometry&     occgeom,
                                      netgen::Mesh&                  ngMesh,
-                                     vector<SMDS_MeshNode*>&        nodeVec,
+                                     vector<const SMDS_MeshNode*>&  nodeVec,
                                      const list< SMESH_subMesh* > & meshedSM)
 {
   TNode2IdMap nodeNgIdMap;
+  if ( !nodeVec.empty() )
+    for ( int i = 1; i < nodeVec.size(); ++i )
+      nodeNgIdMap.insert( make_pair( nodeVec[i], i ));
 
   TopTools_MapOfShape visitedShapes;
 
   SMESH_MesherHelper helper (*_mesh);
 
   int faceID = occgeom.fmap.Extent();
-  _faceDescriptors.clear();
 
   list< SMESH_subMesh* >::const_iterator smIt, smEnd = meshedSM.end();
   for ( smIt = meshedSM.begin(); smIt != smEnd; ++smIt )
@@ -353,36 +356,32 @@ bool NETGENPlugin_Mesher::fillNgMesh(netgen::OCCGeometry&           occgeom,
       continue;
 
     SMESHDS_SubMesh * smDS = sm->GetSubMeshDS();
+    if ( !smDS ) continue;
 
     switch ( sm->GetSubShape().ShapeType() )
     {
     case TopAbs_EDGE: { // EDGE
       // ----------------------
-      const TopoDS_Edge& geomEdge  = TopoDS::Edge( sm->GetSubShape() );
+      TopoDS_Edge geomEdge  = TopoDS::Edge( sm->GetSubShape() );
+      if ( geomEdge.Orientation() >= TopAbs_INTERNAL )
+        geomEdge.Orientation( TopAbs_FORWARD ); // isuue 0020676
 
       // Add ng segments for each not meshed face the edge bounds
       TopTools_MapOfShape visitedAncestors;
-      const TopTools_ListOfShape& ancestors = _mesh->GetAncestors( geomEdge );
-      TopTools_ListIteratorOfListOfShape ancestorIt ( ancestors );
-      for ( ; ancestorIt.More(); ancestorIt.Next() )
+      PShapeIteratorPtr fIt = helper.GetAncestors( geomEdge, *sm->GetFather(), TopAbs_FACE );
+      while ( const TopoDS_Shape * anc = fIt->next() )
       {
-        const TopoDS_Shape & ans = ancestorIt.Value();
-        if ( ans.ShapeType() != TopAbs_FACE || !visitedAncestors.Add( ans ))
-          continue;
-        const TopoDS_Face& face = TopoDS::Face( ans );
+        if ( !visitedAncestors.Add( *anc )) continue;
+        TopoDS_Face face = TopoDS::Face( *anc );
+        if ( face.Orientation() >= TopAbs_INTERNAL )
+          face.Orientation( TopAbs_FORWARD ); // isuue 0020676
 
         int faceID = occgeom.fmap.FindIndex( face );
         if ( faceID < 1 )
           continue; // meshed face
 
         // find out orientation of geomEdge within face
-        TopAbs_Orientation fOri;
-        for ( TopExp_Explorer exp( face, TopAbs_EDGE ); exp.More(); exp.Next() ) {
-          if ( geomEdge.IsSame( exp.Current() )) {
-            fOri = exp.Current().Orientation();
-            break;
-          }
-        }
+        TopAbs_Orientation fOri = helper.GetSubShapeOri( face, geomEdge );
 
         // get all nodes from geomEdge
         bool isForwad = ( fOri == geomEdge.Orientation() );
@@ -409,13 +408,8 @@ bool NETGENPlugin_Mesher::fillNgMesh(netgen::OCCGeometry&           occgeom,
 
           netgen::Segment seg;
           // ng node ids
-#ifdef NETGEN_NEW
-          seg.pnums[0] = prevNgId;
-          seg.pnums[1] = prevNgId = ngNodeId( p2.node, ngMesh, nodeNgIdMap );
-#else
-          seg.p1 = prevNgId;
-          seg.p2 = prevNgId = ngNodeId( p2.node, ngMesh, nodeNgIdMap );
-#endif
+          seg[0] = prevNgId;
+          seg[1] = prevNgId = ngNodeId( p2.node, ngMesh, nodeNgIdMap );
           // node param on curve
           seg.epgeominfo[ 0 ].dist = p1.param;
           seg.epgeominfo[ 1 ].dist = p2.param;
@@ -429,7 +423,18 @@ bool NETGENPlugin_Mesher::fillNgMesh(netgen::OCCGeometry&           occgeom,
           seg.si = faceID;                   // = geom.fmap.FindIndex (face);
           seg.edgenr = ngMesh.GetNSeg() + 1; // segment id
           ngMesh.AddSegment (seg);
-
+#ifdef DUMP_SEGMENTS
+          cout << "Segment: " << seg.edgenr << " on SMESH face " << helper.GetMeshDS()->ShapeToIndex( face ) << endl
+               << "\tface index: " << seg.si << endl
+               << "\tp1: " << seg.p1 << endl
+               << "\tp2: " << seg.p2 << endl
+               << "\tp0 param: " << seg.epgeominfo[ 0 ].dist << endl
+               << "\tp0 uv: " << seg.epgeominfo[ 0 ].u <<", "<< seg.epgeominfo[ 0 ].v << endl
+               << "\tp0 edge: " << seg.epgeominfo[ 0 ].edgenr << endl
+               << "\tp1 param: " << seg.epgeominfo[ 1 ].dist << endl
+               << "\tp1 uv: " << seg.epgeominfo[ 1 ].u <<", "<< seg.epgeominfo[ 1 ].v << endl
+               << "\tp1 edge: " << seg.epgeominfo[ 1 ].edgenr << endl;
+#endif
           if ( isSeam )
           {
             if ( helper.GetPeriodicIndex() == 1 ) {
@@ -441,25 +446,20 @@ bool NETGENPlugin_Mesher::fillNgMesh(netgen::OCCGeometry&           occgeom,
               seg.epgeominfo[ 1 ].v = otherSeamParam;
               swap (seg.epgeominfo[0].u, seg.epgeominfo[1].u);
             }
-#ifdef NETGEN_NEW
-            swap (seg.pnums[0], seg.pnums[1]);
-#else
-            swap (seg.p1, seg.p2);
-#endif
+            swap (seg[0], seg[1]);
             swap (seg.epgeominfo[0].dist, seg.epgeominfo[1].dist);
             seg.edgenr = ngMesh.GetNSeg() + 1; // segment id
             ngMesh.AddSegment (seg);
           }
           else if ( fOri == TopAbs_INTERNAL )
           {
-#ifdef NETGEN_NEW
-            swap (seg.pnums[0], seg.pnums[1]);
-#else
-            swap (seg.p1, seg.p2);
-#endif
+            swap (seg[0], seg[1]);
             swap( seg.epgeominfo[0], seg.epgeominfo[1] );
             seg.edgenr = ngMesh.GetNSeg() + 1; // segment id
             ngMesh.AddSegment (seg);
+#ifdef DUMP_SEGMENTS
+            cout << "Segment: " << seg.edgenr << endl << "\t is REVERSE of the previous" << endl;
+#endif
           }
         }
       } // loop on geomEdge ancestors
@@ -471,19 +471,16 @@ bool NETGENPlugin_Mesher::fillNgMesh(netgen::OCCGeometry&           occgeom,
       // ----------------------
       const TopoDS_Face& geomFace  = TopoDS::Face( sm->GetSubShape() );
       helper.SetSubShape( geomFace );
+      bool isInternalFace = ( geomFace.Orientation() == TopAbs_INTERNAL );
 
       // Find solids the geomFace bounds
       int solidID1 = 0, solidID2 = 0;
-      const TopTools_ListOfShape& ancestors = _mesh->GetAncestors( geomFace );
-      TopTools_ListIteratorOfListOfShape ancestorIt ( ancestors );
-      for ( ; ancestorIt.More(); ancestorIt.Next() )
+      PShapeIteratorPtr solidIt = helper.GetAncestors( geomFace, *sm->GetFather(), TopAbs_SOLID);
+      while ( const TopoDS_Shape * solid = solidIt->next() )
       {
-        const TopoDS_Shape & solid = ancestorIt.Value();
-        if ( solid.ShapeType() == TopAbs_SOLID  ) {
-          int id = occgeom.somap.FindIndex ( solid );
-          if ( solidID1 && id != solidID1 ) solidID2 = id;
-          else                              solidID1 = id;
-        }
+        int id = occgeom.somap.FindIndex ( *solid );
+        if ( solidID1 && id != solidID1 ) solidID2 = id;
+        else                              solidID1 = id;
       }
       faceID++;
       _faceDescriptors[ faceID ].first  = solidID1;
@@ -493,59 +490,72 @@ bool NETGENPlugin_Mesher::fillNgMesh(netgen::OCCGeometry&           occgeom,
       bool reverse = false;
       if ( solidID1 ) {
         TopoDS_Shape solid = occgeom.somap( solidID1 );
-        for ( TopExp_Explorer f( solid, TopAbs_FACE ); f.More(); f.Next() ) {
-          if ( geomFace.IsSame( f.Current() )) {
-            reverse = SMESH_Algo::IsReversedSubMesh( TopoDS::Face( f.Current()), helper.GetMeshDS() );
-            break;
-          }
-        }
+        TopAbs_Orientation faceOriInSolid = helper.GetSubShapeOri( solid, geomFace );
+        if ( faceOriInSolid >= 0 )
+          reverse = SMESH_Algo::IsReversedSubMesh
+            ( TopoDS::Face( geomFace.Oriented( faceOriInSolid )), helper.GetMeshDS() );
       }
 
       // Add surface elements
-      SMDS_ElemIteratorPtr faces = smDS->GetElements();
-      while ( faces->more() ) {
 
+      netgen::Element2d tri(3);
+      tri.SetIndex ( faceID );
+
+
+#ifdef DUMP_TRIANGLES
+      cout << "SMESH face " << helper.GetMeshDS()->ShapeToIndex( geomFace )
+           << " internal="<<isInternalFace<< " border="<<isBorderFace << endl;
+#endif
+      SMDS_ElemIteratorPtr faces = smDS->GetElements();
+      while ( faces->more() )
+      {
         const SMDS_MeshElement* f = faces->next();
-        if ( f->NbNodes() % 3 != 0 ) { // not triangle
-          for ( ancestorIt.Initialize(ancestors); ancestorIt.More(); ancestorIt.Next() )
-            if ( ancestorIt.Value().ShapeType() == TopAbs_SOLID  ) {
-              sm = _mesh->GetSubMesh( ancestorIt.Value() );
-              break;
-            }
+        if ( f->NbNodes() % 3 != 0 ) // not triangle
+        {
+          PShapeIteratorPtr solidIt=helper.GetAncestors(geomFace,*sm->GetFather(),TopAbs_SOLID);
+          if ( const TopoDS_Shape * solid = solidIt->next() )
+            sm = _mesh->GetSubMesh( *solid );
           SMESH_ComputeErrorPtr& smError = sm->GetComputeError();
           smError.reset( new SMESH_ComputeError(COMPERR_BAD_INPUT_MESH,"Not triangle submesh"));
           smError->myBadElements.push_back( f );
           return false;
         }
 
-        netgen::Element2d tri(3);
-        tri.SetIndex ( faceID );
-
-        for ( int i = 0; i < 3; ++i ) {
+        for ( int i = 0; i < 3; ++i )
+        {
           const SMDS_MeshNode* node = f->GetNode( i ), * inFaceNode=0;
-          if ( helper.IsSeamShape( node->GetPosition()->GetShapeId() ))
+
+          // get node UV on face
+          int shapeID = node->GetPosition()->GetShapeId();
+          if ( helper.IsSeamShape( shapeID ))
             if ( helper.IsSeamShape( f->GetNodeWrap( i+1 )->GetPosition()->GetShapeId() ))
               inFaceNode = f->GetNodeWrap( i-1 );
             else 
               inFaceNode = f->GetNodeWrap( i+1 );
-
           gp_XY uv = helper.GetNodeUV( geomFace, node, inFaceNode );
-          if ( reverse ) {
-            tri.GeomInfoPi(3-i).u = uv.X();
-            tri.GeomInfoPi(3-i).v = uv.Y();
-            tri.PNum      (3-i) = ngNodeId( node, ngMesh, nodeNgIdMap );
-          } else {
-            tri.GeomInfoPi(i+1).u = uv.X();
-            tri.GeomInfoPi(i+1).v = uv.Y();
-            tri.PNum      (i+1) = ngNodeId( node, ngMesh, nodeNgIdMap );
-          }
+
+          int ind = reverse ? 3-i : i+1;
+          tri.GeomInfoPi(ind).u = uv.X();
+          tri.GeomInfoPi(ind).v = uv.Y();
+          tri.PNum      (ind) = ngNodeId( node, ngMesh, nodeNgIdMap );
         }
 
         ngMesh.AddSurfaceElement (tri);
+#ifdef DUMP_TRIANGLES
+        cout << tri << endl;
+#endif
 
+        if ( isInternalFace )
+        {
+          swap( tri[1], tri[2] );
+          ngMesh.AddSurfaceElement (tri);
+#ifdef DUMP_TRIANGLES
+        cout << tri << endl;
+#endif
+        }
       }
       break;
-    } //
+    } // case TopAbs_FACE
 
     case TopAbs_VERTEX: { // VERTEX
       // --------------------------
@@ -567,6 +577,522 @@ bool NETGENPlugin_Mesher::fillNgMesh(netgen::OCCGeometry&           occgeom,
   return true;
 }
 
+//================================================================================
+/*!
+ * \brief Duplicate mesh faces on internal geom faces
+ */
+//================================================================================
+
+void NETGENPlugin_Mesher::fixIntFaces(const netgen::OCCGeometry& occgeom,
+                                      netgen::Mesh&              ngMesh,
+                                      NETGENPlugin_Internals&    internalShapes)
+{
+  SMESHDS_Mesh* meshDS = internalShapes.getMesh().GetMeshDS();
+  
+  // find ng indices of internal faces
+  set<int> ngFaceIds;
+  for ( int ngFaceID = 1; ngFaceID <= occgeom.fmap.Extent(); ++ngFaceID )
+  {
+    int smeshID = meshDS->ShapeToIndex( occgeom.fmap( ngFaceID ));
+    if ( internalShapes.isInternalShape( smeshID ))
+      ngFaceIds.insert( ngFaceID );
+  }
+  if ( !ngFaceIds.empty() )
+  {
+    // duplicate faces
+    int i, nbFaces = ngMesh.GetNSE();
+    for (int i = 1; i <= nbFaces; ++i)
+    {
+      netgen::Element2d elem = ngMesh.SurfaceElement(i);
+      if ( ngFaceIds.count( elem.GetIndex() ))
+      {
+        swap( elem[1], elem[2] );
+        ngMesh.AddSurfaceElement (elem);
+      }
+    }
+  }
+}
+
+namespace
+{
+  //================================================================================
+  // define gp_XY_Subtracted pointer to function calling gp_XY::Subtracted(gp_XY)
+  gp_XY_FunPtr(Subtracted);
+  //gp_XY_FunPtr(Added);
+
+  //================================================================================
+  /*!
+   * \brief Evaluate distance between two 2d points along the surface
+   */
+  //================================================================================
+
+  double evalDist( const gp_XY&                uv1,
+                   const gp_XY&                uv2,
+                   const Handle(Geom_Surface)& surf,
+                   const int                   stopHandler=-1)
+  {
+    if ( stopHandler > 0 ) // continue recursion
+    {
+      gp_XY mid = SMESH_MesherHelper::GetMiddleUV( surf, uv1, uv2 );
+      return evalDist( uv1,mid, surf, stopHandler-1 ) + evalDist( mid,uv2, surf, stopHandler-1 );
+    }
+    double dist3D = surf->Value( uv1.X(), uv1.Y() ).Distance( surf->Value( uv2.X(), uv2.Y() ));
+    if ( stopHandler == 0 ) // stop recursion
+      return dist3D;
+    
+    // start recursion if necessary
+    double dist2D = SMESH_MesherHelper::applyIn2D(surf, uv1, uv2, gp_XY_Subtracted, 0).Modulus();
+    if ( fabs( dist3D - dist2D ) < dist2D * 1e-10 )
+      return dist3D; // equal parametrization of a planar surface
+
+    return evalDist( uv1, uv2, surf, 3 ); // start recursion
+  }
+
+  //================================================================================
+  /*!
+   * \brief Data of vertex internal in geom face
+   */
+  //================================================================================
+
+  struct TIntVData
+  {
+    gp_XY uv;        //!< UV in face parametric space
+    int   ngId;      //!< ng id of corrsponding node
+    gp_XY uvClose;   //!< UV of closest boundary node
+    int   ngIdClose; //!< ng id of closest boundary node
+  };
+
+  //================================================================================
+  /*!
+   * \brief Data of vertex internal in solid
+   */
+  //================================================================================
+
+  struct TIntVSoData
+  {
+    int   ngId;      //!< ng id of corrsponding node
+    int   ngIdClose; //!< ng id of closest 2d mesh element
+    int   ngIdCloseN; //!< ng id of closest node of the closest 2d mesh element
+  };
+
+  inline double dist2(const netgen::MeshPoint& p1, const netgen::MeshPoint& p2)
+  {
+    return gp_Pnt( NGPOINT_COORDS(p1)).SquareDistance( gp_Pnt( NGPOINT_COORDS(p2)));
+  }
+}
+
+//================================================================================
+/*!
+ * \brief Make netgen take internal vertices in faces into account by adding
+ *        segments including internal vertices
+ *
+ * This function works in supposition that 1D mesh is already computed in ngMesh
+ */
+//================================================================================
+
+void NETGENPlugin_Mesher::addIntVerticesInFaces(const netgen::OCCGeometry&     occgeom,
+                                                netgen::Mesh&                  ngMesh,
+                                                vector<const SMDS_MeshNode*>&  nodeVec,
+                                                NETGENPlugin_Internals&        internalShapes)
+{
+  if ( nodeVec.size() < ngMesh.GetNP() )
+    nodeVec.resize( ngMesh.GetNP(), 0 );
+
+  SMESHDS_Mesh* meshDS = internalShapes.getMesh().GetMeshDS();
+  SMESH_MesherHelper helper( internalShapes.getMesh() );
+
+  const map<int,list<int> >& face2Vert = internalShapes.getFacesWithVertices();
+  map<int,list<int> >::const_iterator f2v = face2Vert.begin();
+  for ( ; f2v != face2Vert.end(); ++f2v )
+  {
+    const TopoDS_Face& face = TopoDS::Face( meshDS->IndexToShape( f2v->first ));
+    if ( face.IsNull() ) continue;
+    int faceNgID = occgeom.fmap.FindIndex (face);
+    if ( faceNgID < 0 ) continue;
+
+    TopLoc_Location loc;
+    Handle(Geom_Surface) surf = BRep_Tool::Surface(face,loc);
+
+    helper.SetSubShape( face );
+    helper.SetElementsOnShape( true );
+
+    // Get data of internal vertices and add them to ngMesh
+
+    multimap< double, TIntVData > dist2VData; // sort vertices by distance from boundary nodes
+
+    int i, nbSegInit = ngMesh.GetNSeg();
+
+    // boundary characteristics
+    double totSegLen2D = 0;
+    int totNbSeg = 0;
+
+    const list<int>& iVertices = f2v->second;
+    list<int>::const_iterator iv = iVertices.begin();
+    for ( int nbV = 0; iv != iVertices.end(); ++iv, nbV++ )
+    {
+      TIntVData vData;
+      // get node on vertex
+      const TopoDS_Vertex V = TopoDS::Vertex( meshDS->IndexToShape( *iv ));
+      const SMDS_MeshNode * nV = SMESH_Algo::VertexNode( V, meshDS );
+      if ( !nV )
+      {
+        SMESH_subMesh* sm = helper.GetMesh()->GetSubMesh( V );
+        sm->ComputeStateEngine( SMESH_subMesh::COMPUTE );
+        nV = SMESH_Algo::VertexNode( V, meshDS );
+        if ( !nV ) continue;
+      }
+      // add ng node
+      netgen::MeshPoint mp( netgen::Point<3> (nV->X(), nV->Y(), nV->Z()) );
+      ngMesh.AddPoint ( mp, 1, netgen::EDGEPOINT );
+      vData.ngId = ngMesh.GetNP();
+      nodeVec.push_back( nV );
+
+      // get node UV
+      bool uvOK = false;
+      vData.uv = helper.GetNodeUV( face, nV, 0, &uvOK );
+      if ( !uvOK ) helper.CheckNodeUV( face, nV, vData.uv, BRep_Tool::Tolerance(V),/*force=*/1);
+
+      // loop on all segments of the face to find the node closest to vertex and to count
+      // average segment 2d length
+      double closeDist2 = numeric_limits<double>::max(), dist2;
+      int ngIdLast = 0;
+      for (i = 1; i <= ngMesh.GetNSeg(); ++i)
+      {
+        netgen::Segment & seg = ngMesh.LineSegment(i);
+        if ( seg.si != faceNgID ) continue;
+        gp_XY uv[2];
+        for ( int iEnd = 0; iEnd < 2; ++iEnd)
+        {
+          uv[iEnd].SetCoord( seg.epgeominfo[iEnd].u, seg.epgeominfo[iEnd].v );
+          if ( ngIdLast == seg[ iEnd ] ) continue;
+          dist2 = helper.applyIn2D(surf, uv[iEnd], vData.uv, gp_XY_Subtracted,0).SquareModulus();
+          if ( dist2 < closeDist2 )
+            vData.ngIdClose = seg[ iEnd ], vData.uvClose = uv[iEnd], closeDist2 = dist2;
+          ngIdLast = seg[ iEnd ];
+        }
+        if ( !nbV )
+        {
+          totSegLen2D += helper.applyIn2D(surf, uv[0], uv[1], gp_XY_Subtracted, false).Modulus();
+          totNbSeg++;
+        }
+      }
+      dist2VData.insert( make_pair( closeDist2, vData ));
+    }
+
+    if ( totNbSeg == 0 ) break;
+    double avgSegLen2d = totSegLen2D / totNbSeg;
+
+    // Loop on vertices to add segments
+
+    multimap< double, TIntVData >::iterator dist_vData = dist2VData.begin();
+    for ( ; dist_vData != dist2VData.end(); ++dist_vData )
+    {
+      double closeDist2 = dist_vData->first, dist2;
+      TIntVData & vData = dist_vData->second;
+
+      // try to find more close node among segments added for internal vertices
+      for (i = nbSegInit+1; i <= ngMesh.GetNSeg(); ++i)
+      {
+        netgen::Segment & seg = ngMesh.LineSegment(i);
+        if ( seg.si != faceNgID ) continue;
+        gp_XY uv[2];
+        for ( int iEnd = 0; iEnd < 2; ++iEnd)
+        {
+          uv[iEnd].SetCoord( seg.epgeominfo[iEnd].u, seg.epgeominfo[iEnd].v );
+          dist2 = helper.applyIn2D(surf, uv[iEnd], vData.uv, gp_XY_Subtracted,0).SquareModulus();
+          if ( dist2 < closeDist2 )
+            vData.ngIdClose = seg[ iEnd ], vData.uvClose = uv[iEnd], closeDist2 = dist2;
+        }
+      }
+      // decide whether to use the closest node as the second end of segment or to
+      // create a new point
+      int segEnd1 = vData.ngId;
+      int segEnd2 = vData.ngIdClose; // to use closest node
+      gp_XY uvV = vData.uv, uvP = vData.uvClose;
+      double segLenHint  = ngMesh.GetH( ngMesh.Point( vData.ngId ));
+      double nodeDist2D  = sqrt( closeDist2 );
+      double nodeDist3D  = evalDist( vData.uv, vData.uvClose, surf );
+      bool avgLenOK  = ( avgSegLen2d < 0.75 * nodeDist2D );
+      bool hintLenOK = ( segLenHint  < 0.75 * nodeDist3D );
+      //cout << "uvV " << uvV.X() <<","<<uvV.Y() << " ";
+      if ( hintLenOK || avgLenOK )
+      {
+        // create a point between the closest node and V
+
+        // how far from V
+        double r = min( 0.5, ( hintLenOK ? segLenHint/nodeDist3D : avgSegLen2d/nodeDist2D ));
+        // direction from V to closet node in 2D
+        gp_Dir2d v2n( helper.applyIn2D(surf, uvP, uvV, gp_XY_Subtracted, false ));
+        // new point
+        uvP = vData.uv + r * nodeDist2D * v2n.XY();
+        gp_Pnt P = surf->Value( uvP.X(), uvP.Y() ).Transformed( loc );
+
+        netgen::MeshPoint mp( netgen::Point<3> (P.X(), P.Y(), P.Z()));
+        ngMesh.AddPoint ( mp, 1, netgen::EDGEPOINT );
+        segEnd2 = ngMesh.GetNP();
+        //cout << "Middle " << r << " uv " << uvP.X() << "," << uvP.Y() << "( " << ngMesh.Point(segEnd2).X()<<","<<ngMesh.Point(segEnd2).Y()<<","<<ngMesh.Point(segEnd2).Z()<<" )"<< endl;
+        SMDS_MeshNode * nP = helper.AddNode(P.X(), P.Y(), P.Z());
+        nodeVec.push_back( nP );
+      }
+      //else cout << "at Node " << " uv " << uvP.X() << "," << uvP.Y() << endl;
+
+      // Add the segment
+      netgen::Segment seg;
+
+      if ( segEnd1 > segEnd2 ) swap( segEnd1, segEnd2 ), swap( uvV, uvP );
+      seg[0] = segEnd1;  // ng node id
+      seg[1] = segEnd2;  // ng node id
+      seg.edgenr = ngMesh.GetNSeg() + 1;// segment id
+      seg.si = faceNgID;
+
+      seg.epgeominfo[ 0 ].dist = 0; // param on curve
+      seg.epgeominfo[ 0 ].u    = uvV.X();
+      seg.epgeominfo[ 0 ].v    = uvV.Y();
+      seg.epgeominfo[ 1 ].dist = 1; // param on curve
+      seg.epgeominfo[ 1 ].u    = uvP.X();
+      seg.epgeominfo[ 1 ].v    = uvP.Y();
+
+//       seg.epgeominfo[ 0 ].edgenr = 10; //  = geom.emap.FindIndex(edge);
+//       seg.epgeominfo[ 1 ].edgenr = 10; //  = geom.emap.FindIndex(edge);
+
+      ngMesh.AddSegment (seg);
+
+      // add reverse segment
+      swap (seg[0], seg[1]);
+      swap( seg.epgeominfo[0], seg.epgeominfo[1] );
+      seg.edgenr = ngMesh.GetNSeg() + 1; // segment id
+      ngMesh.AddSegment (seg);
+    }
+
+  }
+}
+
+//================================================================================
+/*!
+ * \brief Make netgen take internal vertices in solids into account by adding
+ *        faces including internal vertices
+ *
+ * This function works in supposition that 2D mesh is already computed in ngMesh
+ */
+//================================================================================
+
+void NETGENPlugin_Mesher::addIntVerticesInSolids(const netgen::OCCGeometry&     occgeom,
+                                                 netgen::Mesh&                  ngMesh,
+                                                 vector<const SMDS_MeshNode*>&  nodeVec,
+                                                 NETGENPlugin_Internals&        internalShapes)
+{
+#ifdef DUMP_TRIANGLES_SCRIPT
+  // create a python script making a mesh containing triangles added for internal vertices
+  ofstream py(DUMP_TRIANGLES_SCRIPT);
+  py << "from smesh import * "<< endl
+     << "m = Mesh(name='triangles')" << endl;
+#endif
+  if ( nodeVec.size() < ngMesh.GetNP() )
+    nodeVec.resize( ngMesh.GetNP(), 0 );
+
+  SMESHDS_Mesh* meshDS = internalShapes.getMesh().GetMeshDS();
+  SMESH_MesherHelper helper( internalShapes.getMesh() );
+
+  const map<int,list<int> >& so2Vert = internalShapes.getSolidsWithVertices();
+  map<int,list<int> >::const_iterator s2v = so2Vert.begin();
+  for ( ; s2v != so2Vert.end(); ++s2v )
+  {
+    const TopoDS_Shape& solid = meshDS->IndexToShape( s2v->first );
+    if ( solid.IsNull() ) continue;
+    int solidNgID = occgeom.somap.FindIndex (solid);
+    if ( solidNgID < 0 && !occgeom.somap.IsEmpty() ) continue;
+
+    helper.SetSubShape( solid );
+    helper.SetElementsOnShape( true );
+
+    // find ng indices of faces within the solid
+    set<int> ngFaceIds;
+    for (TopExp_Explorer fExp(solid, TopAbs_FACE); fExp.More(); fExp.Next() )
+      ngFaceIds.insert( occgeom.fmap.FindIndex( fExp.Current() ));
+    if ( ngFaceIds.size() == 1 && *ngFaceIds.begin() == 0 )
+      ngFaceIds.insert( 1 );
+
+    // Get data of internal vertices and add them to ngMesh
+
+    multimap< double, TIntVSoData > dist2VData; // sort vertices by distance from ng faces
+
+    int i, nbFaceInit = ngMesh.GetNSE();
+
+    // boundary characteristics
+    double totSegLen = 0;
+    int totNbSeg = 0;
+
+    const list<int>& iVertices = s2v->second;
+    list<int>::const_iterator iv = iVertices.begin();
+    for ( int nbV = 0; iv != iVertices.end(); ++iv, nbV++ )
+    {
+      TIntVSoData vData;
+      const TopoDS_Vertex V = TopoDS::Vertex( meshDS->IndexToShape( *iv ));
+
+      // get node on vertex
+      const SMDS_MeshNode * nV = SMESH_Algo::VertexNode( V, meshDS );
+      if ( !nV )
+      {
+        SMESH_subMesh* sm = helper.GetMesh()->GetSubMesh( V );
+        sm->ComputeStateEngine( SMESH_subMesh::COMPUTE );
+        nV = SMESH_Algo::VertexNode( V, meshDS );
+        if ( !nV ) continue;
+      }
+      // add ng node
+      netgen::MeshPoint mpV( netgen::Point<3> (nV->X(), nV->Y(), nV->Z()) );
+      ngMesh.AddPoint ( mpV, 1, netgen::FIXEDPOINT );
+      vData.ngId = ngMesh.GetNP();
+      nodeVec.push_back( nV );
+
+      // loop on all 2d elements to find the one closest to vertex and to count
+      // average segment length
+      double closeDist2 = numeric_limits<double>::max(), avgDist2;
+      for (i = 1; i <= ngMesh.GetNSE(); ++i)
+      {
+        const netgen::Element2d& elem = ngMesh.SurfaceElement(i);
+        if ( !ngFaceIds.count( elem.GetIndex() )) continue;
+        avgDist2 = 0;
+        multimap< double, int> dist2nID; // sort nodes of element by distance from V
+        for ( int j = 0; j < elem.GetNP(); ++j)
+        {
+          netgen::MeshPoint mp = ngMesh.Point( elem[j] );
+          double d2 = dist2( mpV, mp );
+          dist2nID.insert( make_pair( d2, elem[j] ));
+          avgDist2 += d2 / elem.GetNP();
+          if ( !nbV )
+            totNbSeg++, totSegLen+= sqrt( dist2( mp, ngMesh.Point( elem[(j+1)%elem.GetNP()])));
+        }
+        double dist = dist2nID.begin()->first; //avgDist2;
+        if ( dist < closeDist2 )
+          vData.ngIdClose= i, vData.ngIdCloseN= dist2nID.begin()->second, closeDist2= dist;
+      }
+      dist2VData.insert( make_pair( closeDist2, vData ));
+    }
+
+    if ( totNbSeg == 0 ) break;
+    double avgSegLen = totSegLen / totNbSeg;
+
+    // Loop on vertices to add triangles
+
+    multimap< double, TIntVSoData >::iterator dist_vData = dist2VData.begin();
+    for ( ; dist_vData != dist2VData.end(); ++dist_vData )
+    {
+      double closeDist2   = dist_vData->first;
+      TIntVSoData & vData = dist_vData->second;
+
+      const netgen::MeshPoint& mpV = ngMesh.Point( vData.ngId );
+
+      // try to find more close face among ones added for internal vertices
+      for (i = nbFaceInit+1; i <= ngMesh.GetNSE(); ++i)
+      {
+        double avgDist2 = 0;
+        multimap< double, int> dist2nID;
+        const netgen::Element2d& elem = ngMesh.SurfaceElement(i);
+        for ( int j = 0; j < elem.GetNP(); ++j)
+        {
+          double d = dist2( mpV, ngMesh.Point( elem[j] ));
+          dist2nID.insert( make_pair( d, elem[j] ));
+          avgDist2 += d / elem.GetNP();
+          if ( avgDist2 < closeDist2 )
+            vData.ngIdClose= i, vData.ngIdCloseN= dist2nID.begin()->second, closeDist2= avgDist2;
+        }
+      }
+      // sort nodes of the closest face by angle with vector from V to the closest node
+      const double tol = numeric_limits<double>::min();
+      map< double, int > angle2ID;
+      const netgen::Element2d& closeFace = ngMesh.SurfaceElement( vData.ngIdClose );
+      netgen::MeshPoint mp[2];
+      mp[0] = ngMesh.Point( vData.ngIdCloseN );
+      gp_XYZ p1( NGPOINT_COORDS( mp[0] ));
+      gp_XYZ pV( NGPOINT_COORDS( mpV ));
+      gp_Vec v2p1( pV, p1 );
+      double distN1 = v2p1.Magnitude();
+      if ( distN1 <= tol ) continue;
+      v2p1 /= distN1;
+      for ( int j = 0; j < closeFace.GetNP(); ++j)
+      {
+        mp[1] = ngMesh.Point( closeFace[j] );
+        gp_Vec v2p( pV, gp_Pnt( NGPOINT_COORDS( mp[1] )) );
+        angle2ID.insert( make_pair( v2p1.Angle( v2p ), closeFace[j]));
+      }
+      // get node with angle of 60 degrees or greater
+      map< double, int >::iterator angle_id = angle2ID.lower_bound( 60*PI180 );
+      if ( angle_id == angle2ID.end() ) angle_id = --angle2ID.end();
+      const double minAngle = 30 * PI180;
+      const double angle = angle_id->first;
+      bool angleOK = ( angle > minAngle );
+
+      // find points to create a triangle
+      netgen::Element2d tri(3);
+      tri.SetIndex ( 1 );
+      tri[0] = vData.ngId;
+      tri[1] = vData.ngIdCloseN; // to use the closest nodes
+      tri[2] = angle_id->second; // to use the node with best angle
+
+      // decide whether to use the closest node and the node with best angle or to create new ones
+      for ( int isBestAngleN = 0; isBestAngleN < 2; ++isBestAngleN )
+      {
+        bool createNew = !angleOK, distOK = true;
+        double distFromV;
+        int triInd = isBestAngleN ? 2 : 1;
+        mp[isBestAngleN] = ngMesh.Point( tri[triInd] );
+        if ( isBestAngleN )
+        {
+          if ( angleOK )
+          {
+            double distN2 = sqrt( dist2( mpV, mp[isBestAngleN]));
+            createNew = ( fabs( distN2 - distN1 ) > 0.25 * distN1 );
+          }
+          else if ( angle < tol )
+          {
+            v2p1.SetX( v2p1.X() + 1e-3 );
+          }
+          distFromV = distN1;
+        }
+        else
+        {
+          double segLenHint = ngMesh.GetH( ngMesh.Point( vData.ngId ));
+          bool avgLenOK  = ( avgSegLen < 0.75 * distN1 );
+          bool hintLenOK = ( segLenHint  < 0.75 * distN1 );
+          createNew = (createNew || avgLenOK || hintLenOK );
+          // we create a new node not closer than 0.5 to the closest face
+          // in order not to clash with other close face
+          double r = min( 0.5, ( hintLenOK ? segLenHint : avgSegLen ) / distN1 );
+          distFromV = r * distN1;
+        }
+        if ( createNew )
+        {
+          // create a new point, between the node and the vertex if angleOK
+          gp_XYZ p( NGPOINT_COORDS( mp[isBestAngleN] ));
+          gp_Vec v2p( pV, p ); v2p.Normalize();
+          if ( isBestAngleN && !angleOK )
+            p = p1 + gp_Dir( v2p.XYZ() - v2p1.XYZ()).XYZ() * distN1 * 0.95;
+          else
+            p = pV + v2p.XYZ() * distFromV;
+
+          if ( !isBestAngleN ) p1 = p, distN1 = distFromV;
+
+          mp[isBestAngleN].SetPoint( netgen::Point<3> (p.X(), p.Y(), p.Z()));
+          ngMesh.AddPoint ( mp[isBestAngleN], 1, netgen::SURFACEPOINT );
+          tri[triInd] = ngMesh.GetNP();
+          nodeVec.push_back( helper.AddNode( p.X(), p.Y(), p.Z()) );
+        }
+      }
+      ngMesh.AddSurfaceElement (tri);
+      swap( tri[1], tri[2] );
+      ngMesh.AddSurfaceElement (tri);
+
+#ifdef DUMP_TRIANGLES_SCRIPT
+      py << "n1 = m.AddNode( "<< mpV.X()<<", "<< mpV.Y()<<", "<< mpV.Z()<<") "<< endl
+         << "n2 = m.AddNode( "<< mp[0].X()<<", "<< mp[0].Y()<<", "<< mp[0].Z()<<") "<< endl
+         << "n3 = m.AddNode( "<< mp[1].X()<<", "<< mp[1].Y()<<", "<< mp[1].Z()<<" )" << endl
+         << "m.AddFace([n1,n2,n3])" << endl;
+#endif
+    } // loop on internal vertices of a solid
+
+  } // loop on solids with internal vertices
+}
+
 //================================================================================
 /*!
  * \brief Fill SMESH mesh according to contents of netgen mesh
@@ -583,7 +1109,7 @@ int NETGENPlugin_Mesher::FillSMesh(const netgen::OCCGeometry&          occgeo,
                                    const netgen::Mesh&                 ngMesh,
                                    const NETGENPlugin_ngMeshInfo&      initState,
                                    SMESH_Mesh&                         sMesh,
-                                   std::vector<SMDS_MeshNode*>&        nodeVec,
+                                   std::vector<const SMDS_MeshNode*>&  nodeVec,
                                    SMESH_Comment&                      comment)
 {
   int nbNod = ngMesh.GetNP();
@@ -598,65 +1124,51 @@ int NETGENPlugin_Mesher::FillSMesh(const netgen::OCCGeometry&          occgeo,
   // create and insert nodes into nodeVec
   nodeVec.resize( nbNod + 1 );
   int i, nbInitNod = initState._nbNodes;
-  for (i = nbInitNod+1; i <= nbNod /*&& isOK*/; ++i )
+  for (i = nbInitNod+1; i <= nbNod; ++i )
   {
     const netgen::MeshPoint& ngPoint = ngMesh.Point(i);
     SMDS_MeshNode* node = NULL;
-    bool newNodeOnVertex = false;
     TopoDS_Vertex aVert;
-    if (i-nbInitNod <= occgeo.vmap.Extent())
+    // First, netgen creates nodes on vertices in occgeo.vmap,
+    // so node index corresponds to vertex index
+    // but (isuue 0020776) netgen does not create nodes with equal coordinates
+    if ( i-nbInitNod <= occgeo.vmap.Extent() )
     {
-      // point on vertex
-      aVert = TopoDS::Vertex(occgeo.vmap(i-nbInitNod));
-      SMESHDS_SubMesh * submesh = meshDS->MeshElements(aVert);
-      if (submesh)
+      gp_Pnt p ( NGPOINT_COORDS(ngPoint) );
+      for (int iV = i-nbInitNod; aVert.IsNull() && iV <= occgeo.vmap.Extent(); ++iV)
       {
-        SMDS_NodeIteratorPtr it = submesh->GetNodes();
-        if (it->more())
-        {
-          node = const_cast<SMDS_MeshNode*> (it->next());
-          pindMap.Add(i);
-        }
+        aVert = TopoDS::Vertex( occgeo.vmap( iV ) );
+        gp_Pnt pV = BRep_Tool::Pnt( aVert );
+        if ( p.SquareDistance( pV ) > 1e-20 )
+          aVert.Nullify();
+        else
+          node = const_cast<SMDS_MeshNode*>( SMESH_Algo::VertexNode( aVert, meshDS ));
       }
-      if (!node)
-        newNodeOnVertex = true;
-    }
-    if (!node)
-#ifdef NETGEN_NEW
-      node = meshDS->AddNode(ngPoint(0), ngPoint(1), ngPoint(2));
-#else
-    node = meshDS->AddNode(ngPoint.X(), ngPoint.Y(), ngPoint.Z());
-#endif
-    if (!node)
-    {
-      MESSAGE("Cannot create a mesh node");
-      if ( !comment.size() ) comment << "Cannot create a mesh node";
-      nbSeg = nbFac = nbVol = 0;
-      break;
     }
-    nodeVec_ACCESS(i) = node;
-    if (newNodeOnVertex)
-    {
-      // point on vertex
-      meshDS->SetNodeOnVertex(node, aVert);
+    if (node) // node found on vertex
       pindMap.Add(i);
+    else
+    {
+      node = meshDS->AddNode( NGPOINT_COORDS( ngPoint ));
+      if (!aVert.IsNull())
+      {
+        // point on vertex
+        meshDS->SetNodeOnVertex(node, aVert);
+        pindMap.Add(i);
+      }
     }
+    nodeVec[i] = node;
   }
 
   // create mesh segments along geometric edges
   NCollection_Map<Link> linkMap;
   int nbInitSeg = initState._nbSegments;
-  for (i = nbInitSeg+1; i <= nbSeg/* && isOK*/; ++i )
+  for (i = nbInitSeg+1; i <= nbSeg; ++i )
   {
     const netgen::Segment& seg = ngMesh.LineSegment(i);
-#ifdef NETGEN_NEW
-    Link link(seg.pnums[0], seg.pnums[1]);
-#else
-    Link link(seg.p1, seg.p2);
-#endif
-    if (linkMap.Contains(link))
+    Link link(seg[0], seg[1]);
+    if (!linkMap.Add(link))
       continue;
-    linkMap.Add(link);
     TopoDS_Edge aEdge;
 #ifdef NETGEN_NEW
     int pinds[3] = { seg.pnums[0], seg.pnums[1], seg.pnums[2] };
@@ -711,7 +1223,7 @@ int NETGENPlugin_Mesher::FillSMesh(const netgen::OCCGeometry&          occgeo,
 
   // create mesh faces along geometric faces
   int nbInitFac = initState._nbFaces;
-  for (i = nbInitFac+1; i <= nbFac/* && isOK*/; ++i )
+  for (i = nbInitFac+1; i <= nbFac; ++i )
   {
     const netgen::Element2d& elem = ngMesh.SurfaceElement(i);
     int aGeomFaceInd = elem.GetIndex();
@@ -822,11 +1334,9 @@ int NETGENPlugin_Mesher::FillSMesh(const netgen::OCCGeometry&          occgeo,
 
 bool NETGENPlugin_Mesher::Compute()
 {
-#ifdef WNT
-  netgen::MeshingParameters& mparams = netgen::GlobalMeshingParameters();
-#else
+  NETGENPlugin_NetgenLibWrapper ngLib;
+
   netgen::MeshingParameters& mparams = netgen::mparam;
-#endif  
   MESSAGE("Compute with:\n"
           " max size = " << mparams.maxh << "\n"
           " segments per edge = " << mparams.segmentsperedge);
@@ -837,7 +1347,7 @@ bool NETGENPlugin_Mesher::Compute()
           " quad allowed = " << mparams.quad);
 
   SMESH_ComputeErrorPtr error = SMESH_ComputeError::New();
-  nglib::Ng_Init();
+  
 
   // -------------------------
   // Prepare OCC geometry
@@ -845,8 +1355,8 @@ bool NETGENPlugin_Mesher::Compute()
 
   netgen::OCCGeometry occgeo;
   list< SMESH_subMesh* > meshedSM;
-  TopTools_DataMapOfShapeShape internalEdge2Face;
-  PrepareOCCgeometry( occgeo, _shape, *_mesh, &meshedSM, &internalEdge2Face );
+  NETGENPlugin_Internals internals( *_mesh, _shape, _isVolume );
+  PrepareOCCgeometry( occgeo, _shape, *_mesh, &meshedSM, &internals );
 
   // -------------------------
   // Generate the mesh
@@ -859,13 +1369,13 @@ bool NETGENPlugin_Mesher::Compute()
   int err = 0;
 
   // vector of nodes in which node index == netgen ID
-  vector< SMDS_MeshNode* > nodeVec;
+  vector< const SMDS_MeshNode* > nodeVec;
   try
   {
     // ----------------
     // compute 1D mesh
     // ----------------
-    // pass 1D simple parameters to NETGEN
+    // Pass 1D simple parameters to NETGEN
     if ( _simpleHyp ) {
       if ( int nbSeg = _simpleHyp->GetNumberOfSegments() ) {
         // nb of segments
@@ -879,52 +1389,49 @@ bool NETGENPlugin_Mesher::Compute()
         mparams.maxh = _simpleHyp->GetLocalLength();
       }
     }
-    // let netgen create ngMesh and calculate element size on not meshed shapes
+    // Let netgen create ngMesh and calculate element size on not meshed shapes
     char *optstr = 0;
     int startWith = netgen::MESHCONST_ANALYSE;
     int endWith   = netgen::MESHCONST_ANALYSE;
     err = netgen::OCCGenerateMesh(occgeo, ngMesh, startWith, endWith, optstr);
     if (err) comment << "Error in netgen::OCCGenerateMesh() at MESHCONST_ANALYSE step";
+    ngLib.setMesh(( Ng_Mesh*) ngMesh );
 
-    // precompute internal edges (issue 0020676)
-    if ( !err && !internalEdge2Face.IsEmpty() )
+    // Precompute internal edges (issue 0020676) in order to
+    // add mesh on them correctly (twice) to netgen mesh
+    if ( !err && internals.hasInternalEdges() )
     {
-      netgen::OCCGeometry intEdgeOccgeo;
-      TopTools_DataMapIteratorOfDataMapOfShapeShape e2f( internalEdge2Face );
-      for ( ; e2f.More(); e2f.Next() )
-      {
-        intEdgeOccgeo.emap.Add( e2f.Key() );
-        intEdgeOccgeo.fmap.Add( e2f.Value() );
-        for ( TopoDS_Iterator v(e2f.Key() ); v.More(); v.Next() )
-          intEdgeOccgeo.vmap.Add( v.Value() );
-        SMESH_subMesh* sm = _mesh->GetSubMesh( e2f.Key() );
-        SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(/*includeSelf=*/true,true);
-        while ( smIt->more() ) meshedSM.push_back( smIt->next() );
-      }
-      intEdgeOccgeo.boundingbox = occgeo.boundingbox;
-      intEdgeOccgeo.shape = occgeo.shape;
+      // load internal shapes into OCCGeometry
+      netgen::OCCGeometry intOccgeo;
+      internals.getInternalEdges( intOccgeo.fmap, intOccgeo.emap, intOccgeo.vmap, meshedSM);
+      intOccgeo.boundingbox = occgeo.boundingbox;
+      intOccgeo.shape = occgeo.shape;
 
+      // let netgen compute element size by the main geometry in temporary mesh
       netgen::Mesh *tmpNgMesh = NULL;
       netgen::OCCGenerateMesh(occgeo, tmpNgMesh, startWith, endWith, optstr);
+      // compute mesh on internal edges
       endWith = netgen::MESHCONST_MESHEDGES;
-      err = netgen::OCCGenerateMesh(intEdgeOccgeo, tmpNgMesh, startWith, endWith, optstr);
+      err = netgen::OCCGenerateMesh(intOccgeo, tmpNgMesh, startWith, endWith, optstr);
       if (err) comment << "Error in netgen::OCCGenerateMesh() at meshing internal edges";
 
-      vector< SMDS_MeshNode* > tmpNodeVec;
-      FillSMesh( intEdgeOccgeo, *tmpNgMesh, initState, *_mesh, tmpNodeVec, comment );
+      // fill SMESH by netgen mesh
+      vector< const SMDS_MeshNode* > tmpNodeVec;
+      FillSMesh( intOccgeo, *tmpNgMesh, initState, *_mesh, tmpNodeVec, comment );
       err = ( !comment.empty() );
 
       nglib::Ng_DeleteMesh((nglib::Ng_Mesh*)tmpNgMesh);
     }
 
-    // fill ngMesh with nodes and elements of computed submeshes
+    // Fill ngMesh with nodes and elements of computed submeshes
     if ( !err )
     {
+      _faceDescriptors.clear();
       err = ! fillNgMesh(occgeo, *ngMesh, nodeVec, meshedSM);
     }
     initState = NETGENPlugin_ngMeshInfo(ngMesh);
 
-    // compute mesh
+    // Compute 1d mesh
     if (!err)
     {
       startWith = endWith = netgen::MESHCONST_MESHEDGES;
@@ -936,7 +1443,7 @@ bool NETGENPlugin_Mesher::Compute()
     // ---------------------
     if (!err)
     {
-      // pass 2D simple parameters to NETGEN
+      // Pass 2D simple parameters to NETGEN
       if ( _simpleHyp ) {
         if ( double area = _simpleHyp->GetMaxElementArea() ) {
           // face area
@@ -945,20 +1452,20 @@ bool NETGENPlugin_Mesher::Compute()
         }
         else {
           // length from edges
-          double length = 0;
-          TopTools_MapOfShape tmpMap;
-          for ( TopExp_Explorer exp( _shape, TopAbs_EDGE ); exp.More(); exp.Next() )
-            if( tmpMap.Add(exp.Current()) )
-              length += SMESH_Algo::EdgeLength( TopoDS::Edge( exp.Current() ));
-
           if ( ngMesh->GetNSeg() ) {
+            double edgeLength = 0;
+            TopTools_MapOfShape visitedEdges;
+            for ( TopExp_Explorer exp( _shape, TopAbs_EDGE ); exp.More(); exp.Next() )
+              if( visitedEdges.Add(exp.Current()) )
+                edgeLength += SMESH_Algo::EdgeLength( TopoDS::Edge( exp.Current() ));
             // we have to multiply length by 2 since for each TopoDS_Edge there
             // are double set of NETGEN edges or, in other words, we have to
-            // divide ngMesh->GetNSeg() on 2.
-            mparams.maxh = 2*length / ngMesh->GetNSeg();
+            // divide ngMesh->GetNSeg() by 2.
+            mparams.maxh = 2*edgeLength / ngMesh->GetNSeg();
           }
-          else
+          else {
             mparams.maxh = 1000;
+          }
           mparams.grading = 0.2; // slow size growth
         }
         mparams.maxh = min( mparams.maxh, occgeo.boundingbox.Diam()/2 );
@@ -967,7 +1474,63 @@ bool NETGENPlugin_Mesher::Compute()
         bb.Increase (bb.Diam()/20);
         ngMesh->SetLocalH (bb.PMin(), bb.PMax(), mparams.grading);
       }
-      // let netgen compute 2D mesh
+
+      // Care of vertices internal in faces (issue 0020676)
+      if ( internals.hasInternalVertexInFace() )
+      {
+        // store computed segments in SMESH in order not to create SMESH
+        // edges for ng segments added by addIntVerticesInFaces()
+        FillSMesh( occgeo, *ngMesh, initState, *_mesh, nodeVec, comment );
+        // add segments to faces with internal vertices
+        addIntVerticesInFaces( occgeo, *ngMesh, nodeVec, internals );
+        initState = NETGENPlugin_ngMeshInfo(ngMesh);
+      }
+
+      // Precompute internal faces (issue 0020676) in order to
+      // add mesh on them correctly (twice to emulate the crack) to netgen mesh
+      //if ( internals.hasInternalFaces() )
+      // {
+//         // fill SMESH with generated segments
+//         FillSMesh( occgeo, *ngMesh, initState, *_mesh, nodeVec, comment );
+
+//         // load internal shapes into a separate OCCGeometry
+//         netgen::OCCGeometry intOccgeo;
+//         list< SMESH_subMesh* > boundarySM;
+//         internals.getInternalFaces( intOccgeo.fmap, intOccgeo.emap, meshedSM, boundarySM);
+//         intOccgeo.boundingbox = occgeo.boundingbox;
+//         intOccgeo.shape = occgeo.shape;
+//         intOccgeo.facemeshstatus.SetSize (intOccgeo.fmap.Extent());
+//         intOccgeo.facemeshstatus = 0;
+
+//         // let netgen compute element size by the main geometry in temporary mesh
+//         int start = netgen::MESHCONST_ANALYSE, end = netgen::MESHCONST_ANALYSE;
+//         netgen::Mesh *tmpNgMesh = NULL;
+//         netgen::OCCGenerateMesh(occgeo, tmpNgMesh, start, end, optstr);
+
+//         // add already computed elements from submeshes of internal faces to tmpNgMesh
+//         vector< const SMDS_MeshNode* > tmpNodeVec;
+//         fillNgMesh(intOccgeo, *tmpNgMesh, tmpNodeVec, boundarySM);
+//         addIntVerticesInFaces( intOccgeo, *tmpNgMesh, tmpNodeVec, internals );
+
+//         // compute mesh on internal faces
+//         NETGENPlugin_ngMeshInfo prevState(tmpNgMesh);
+//         start = netgen::MESHCONST_MESHEDGES;
+//         end = netgen::MESHCONST_MESHSURFACE;
+//         err = netgen::OCCGenerateMesh(intOccgeo, tmpNgMesh, start, end, optstr);
+//         if (err) comment << "Error in netgen::OCCGenerateMesh() at meshing internal faces";
+
+//         // fill SMESH with computed elements
+//         FillSMesh( intOccgeo, *tmpNgMesh, prevState, *_mesh, tmpNodeVec, comment );
+//         err = ( !comment.empty() );
+
+//         // finally, correctly add elements on internal faces to netgen mesh
+//         err = ! fillNgMesh(occgeo, *ngMesh, nodeVec, meshedSM);
+//         initState = NETGENPlugin_ngMeshInfo(ngMesh);
+
+//         nglib::Ng_DeleteMesh((nglib::Ng_Mesh*)tmpNgMesh);
+//       }
+
+      // Let netgen compute 2D mesh
       startWith = netgen::MESHCONST_MESHSURFACE;
       endWith = _optimize ? netgen::MESHCONST_OPTSURFACE : netgen::MESHCONST_MESHSURFACE;
       err = netgen::OCCGenerateMesh(occgeo, ngMesh, startWith, endWith, optstr);
@@ -978,7 +1541,7 @@ bool NETGENPlugin_Mesher::Compute()
     // ---------------------
     if (!err && _isVolume)
     {
-      // add ng face descriptors of meshed faces
+      // Add ng face descriptors of meshed faces
       map< int, pair<int,int> >::iterator fId_soIds = _faceDescriptors.begin();
       for ( ; fId_soIds != _faceDescriptors.end(); ++fId_soIds ) {
         int faceID   = fId_soIds->first;
@@ -986,7 +1549,7 @@ bool NETGENPlugin_Mesher::Compute()
         int solidID2 = fId_soIds->second.second;
         ngMesh->AddFaceDescriptor (netgen::FaceDescriptor(faceID, solidID1, solidID2, 0));
       }
-      // pass 3D simple parameters to NETGEN
+      // Pass 3D simple parameters to NETGEN
       const NETGENPlugin_SimpleHypothesis_3D* simple3d =
         dynamic_cast< const NETGENPlugin_SimpleHypothesis_3D* > ( _simpleHyp );
       if ( simple3d ) {
@@ -1007,7 +1570,19 @@ bool NETGENPlugin_Mesher::Compute()
         mparams.grading = 0.4;
         ngMesh->CalcLocalH();
       }
-      // let netgen compute 3D mesh
+      // Care of vertices internal in solids and internal faces (issue 0020676)
+      if ( internals.hasInternalVertexInSolid() || internals.hasInternalFaces() )
+      {
+        // store computed faces in SMESH in order not to create SMESH
+        // faces for ng faces added here
+        FillSMesh( occgeo, *ngMesh, initState, *_mesh, nodeVec, comment );
+        // add ng faces to solids with internal vertices
+        addIntVerticesInSolids( occgeo, *ngMesh, nodeVec, internals );
+        // duplicate mesh faces on internal faces
+        fixIntFaces( occgeo, *ngMesh, internals );
+        initState = NETGENPlugin_ngMeshInfo(ngMesh);
+      }
+      // Let netgen compute 3D mesh
       startWith = netgen::MESHCONST_MESHVOLUME;
       endWith = _optimize ? netgen::MESHCONST_OPTVOLUME : netgen::MESHCONST_MESHVOLUME;
       err = netgen::OCCGenerateMesh(occgeo, ngMesh, startWith, endWith, optstr);
@@ -1042,8 +1617,11 @@ bool NETGENPlugin_Mesher::Compute()
   // ------------------------------------------------------------
 
   if ( true /*isOK*/ ) // get whatever built
-    FillSMesh( occgeo, *ngMesh, initState, *_mesh, nodeVec, comment );
+    FillSMesh( occgeo, *ngMesh, initState, *_mesh, nodeVec, comment ); //!< 
 
+  SMESH_ComputeErrorPtr readErr = readErrors(nodeVec);
+  if ( readErr && !readErr->myBadElements.empty() )
+    error = readErr;
 
   if ( error->IsOK() && ( !isOK || comment.size() > 0 ))
     error->myName = COMPERR_ALGO_FAILED;
@@ -1053,26 +1631,38 @@ bool NETGENPlugin_Mesher::Compute()
   // set bad compute error to subshapes of all failed subshapes shapes
   if ( !error->IsOK() && err )
   {
+    bool pb2D = false;
     for (int i = 1; i <= occgeo.fmap.Extent(); i++) {
       int status = occgeo.facemeshstatus[i-1];
       if (status == 1 ) continue;
+      pb2D = true;
       if ( SMESH_subMesh* sm = _mesh->GetSubMeshContaining( occgeo.fmap( i ))) {
         SMESH_ComputeErrorPtr& smError = sm->GetComputeError();
         if ( !smError || smError->IsOK() ) {
           if ( status == -1 )
-            smError.reset( new SMESH_ComputeError( error->myName, error->myComment ));
+            smError.reset( new SMESH_ComputeError( *error ));
           else
             smError.reset( new SMESH_ComputeError( COMPERR_ALGO_FAILED, "Ignored" ));
         }
       }
     }
+    if ( !pb2D ) // all faces are OK
+      for (int i = 1; i <= occgeo.somap.Extent(); i++)
+        if ( SMESH_subMesh* sm = _mesh->GetSubMeshContaining( occgeo.somap( i )))
+        {
+          bool smComputed = !sm->IsEmpty();
+          if ( smComputed && internals.hasInternalVertexInSolid( sm->GetId() ))
+          {
+            int nbIntV = internals.getSolidsWithVertices().find( sm->GetId() )->second.size();
+            SMESHDS_SubMesh* smDS = sm->GetSubMeshDS();
+            smComputed = ( smDS->NbElements() > 0 || smDS->NbNodes() > nbIntV );
+          }
+          SMESH_ComputeErrorPtr& smError = sm->GetComputeError();
+          if ( !smComputed && ( !smError || smError->IsOK() ))
+            smError.reset( new SMESH_ComputeError( *error ));
+        }
   }
 
-  nglib::Ng_DeleteMesh((nglib::Ng_Mesh*)ngMesh);
-  nglib::Ng_Exit();
-
-  RemoveTmpFiles();
-
   return error->IsOK();
 }
 
@@ -1083,11 +1673,7 @@ bool NETGENPlugin_Mesher::Compute()
 //=============================================================================
 bool NETGENPlugin_Mesher::Evaluate(MapShapeNbElems& aResMap)
 {
-#ifdef WNT
-  netgen::MeshingParameters& mparams = netgen::GlobalMeshingParameters();
-#else
   netgen::MeshingParameters& mparams = netgen::mparam;
-#endif
 
 
   // -------------------------
@@ -1117,12 +1703,13 @@ bool NETGENPlugin_Mesher::Evaluate(MapShapeNbElems& aResMap)
     }
   }
   // let netgen create ngMesh and calculate element size on not meshed shapes
-  nglib::Ng_Init();
+  NETGENPlugin_NetgenLibWrapper ngLib;
   netgen::Mesh *ngMesh = NULL;
   char *optstr = 0;
   int startWith = netgen::MESHCONST_ANALYSE;
   int endWith   = netgen::MESHCONST_MESHEDGES;
   int err = netgen::OCCGenerateMesh(occgeo, ngMesh, startWith, endWith, optstr);
+  ngLib.setMesh(( Ng_Mesh*) ngMesh );
   if (err) {
     if ( SMESH_subMesh* sm = _mesh->GetSubMeshContaining( _shape ))
       sm->GetComputeError().reset( new SMESH_ComputeError( COMPERR_ALGO_FAILED ));
@@ -1155,11 +1742,7 @@ bool NETGENPlugin_Mesher::Evaluate(MapShapeNbElems& aResMap)
   for (int i = 1; i <= ngMesh->GetNSeg(); ++i )
   {
     const netgen::Segment& seg = ngMesh->LineSegment(i);
-#ifdef NETGEN_NEW
-    Link link(seg.pnums[0], seg.pnums[1]);
-#else
-    Link link(seg.p1, seg.p2);
-#endif
+    Link link(seg[0], seg[1]);
     if ( !linkMap.Add( link )) continue;
     int aGeomEdgeInd = seg.epgeominfo[0].edgenr;
     if (aGeomEdgeInd > 0 && aGeomEdgeInd <= occgeo.emap.Extent())
@@ -1179,8 +1762,6 @@ bool NETGENPlugin_Mesher::Evaluate(MapShapeNbElems& aResMap)
     fullNbSeg += aVec[ entity ];
     Edge2NbSeg( Edge2NbSegIt.Key() ) = aVec[ entity ];
   }
-  nglib::Ng_DeleteMesh((nglib::Ng_Mesh*)ngMesh);
-  nglib::Ng_Exit();
 
   // ----------------
   // evaluate 2D 
@@ -1284,31 +1865,80 @@ bool NETGENPlugin_Mesher::Evaluate(MapShapeNbElems& aResMap)
 
 //================================================================================
 /*!
- * \brief remove given file
+ * \brief Remove "test.out" and "problemfaces" files in current directory
  */
 //================================================================================
 
-static void removeFile( const TCollection_AsciiString& fileName )
+void NETGENPlugin_Mesher::RemoveTmpFiles()
 {
-  try {
-    OSD_File( fileName ).Remove();
-  }
-  catch ( Standard_ProgramError ) {
-    MESSAGE("Can't remove file: " << fileName.ToCString() << " ; file does not exist or permission denied");
-  }
+  SMESH_File("test.out").remove();
+  SMESH_File("problemfaces").remove();
+  SMESH_File("occmesh.rep").remove();
 }
 
 //================================================================================
 /*!
- * \brief Remove "test.out" and "problemfaces" files in current directory
+ * \brief Read mesh entities preventing successful computation from "test.out" file
  */
 //================================================================================
 
-void NETGENPlugin_Mesher::RemoveTmpFiles()
+SMESH_ComputeErrorPtr
+NETGENPlugin_Mesher::readErrors(const vector<const SMDS_MeshNode* >& nodeVec)
 {
-  removeFile("test.out");
-  removeFile("problemfaces");
-  removeFile("occmesh.rep");
+  SMESH_ComputeErrorPtr err = SMESH_ComputeError::New
+    (COMPERR_BAD_INPUT_MESH, "Some edges multiple times in surface mesh");
+  SMESH_File file("test.out");
+  vector<int> two(2);
+  const char* badEdgeStr = " multiple times in surface mesh";
+  const int   badEdgeStrLen = strlen( badEdgeStr );
+  while( !file.eof() )
+  {
+    if ( strncmp( file, "Edge ", 5 ) == 0 &&
+         file.getInts( two ) &&
+         strncmp( file, badEdgeStr, badEdgeStrLen ) == 0 &&
+         two[0] < nodeVec.size() && two[1] < nodeVec.size())
+    {
+      err->myBadElements.push_back( new SMDS_MeshEdge( nodeVec[ two[0]], nodeVec[ two[1]] ));
+      file += badEdgeStrLen;
+    }
+    else if ( strncmp( file, "Intersecting: ", 14 ) == 0 )
+    {
+// Intersecting: 
+// openelement 18 with open element 126
+// 41  36  38  
+// 69  70  72
+      vector<int> three1(3), three2(3);
+      file.getLine();
+      const char* pos = file;
+      bool ok = ( strncmp( file, "openelement ", 12 ) == 0 );
+      ok = ok && file.getInts( two );
+      ok = ok && file.getInts( three1 );
+      ok = ok && file.getInts( three2 );
+      for ( int i = 0; ok && i < 3; ++i )
+        ok = ( three1[i] < nodeVec.size() && nodeVec[ three1[i]]);
+      for ( int i = 0; ok && i < 3; ++i ) 
+        ok = ( three2[i] < nodeVec.size() && nodeVec[ three2[i]]);
+      if ( ok )
+      {
+        err->myBadElements.push_back( new SMDS_FaceOfNodes( nodeVec[ three1[0]],
+                                                            nodeVec[ three1[1]],
+                                                            nodeVec[ three1[2]]));
+        err->myBadElements.push_back( new SMDS_FaceOfNodes( nodeVec[ three2[0]],
+                                                            nodeVec[ three2[1]],
+                                                            nodeVec[ three2[2]]));
+        err->myComment = "Intersecting triangles";
+      }
+      else
+      {
+        file.setPos( pos );
+      }
+    }
+    else
+    {
+      ++file;
+    }
+  }
+  return err;
 }
 
 //================================================================================
@@ -1331,3 +1961,384 @@ NETGENPlugin_ngMeshInfo::NETGENPlugin_ngMeshInfo( netgen::Mesh* ngMesh)
     _nbNodes = _nbSegments = _nbFaces = _nbVolumes = 0;
   }
 }
+
+//================================================================================
+/*!
+ * \brief Find "internal" sub-shapes
+ */
+//================================================================================
+
+NETGENPlugin_Internals::NETGENPlugin_Internals( SMESH_Mesh&         mesh,
+                                                const TopoDS_Shape& shape,
+                                                bool                is3D )
+  : _mesh( mesh ), _is3D( is3D )
+{
+  SMESHDS_Mesh* meshDS = mesh.GetMeshDS();
+
+  TopExp_Explorer f,e;
+  for ( f.Init( shape, TopAbs_FACE ); f.More(); f.Next() )
+  {
+    int faceID = meshDS->ShapeToIndex( f.Current() );
+
+    // find not computed internal edges
+
+    for ( e.Init( f.Current().Oriented(TopAbs_FORWARD), TopAbs_EDGE ); e.More(); e.Next() )
+      if ( e.Current().Orientation() == TopAbs_INTERNAL )
+      {
+        SMESH_subMesh* eSM = mesh.GetSubMesh( e.Current() );
+        if ( eSM->IsEmpty() )
+        {
+          _e2face.insert( make_pair( eSM->GetId(), faceID ));
+          for ( TopoDS_Iterator v(e.Current()); v.More(); v.Next() )
+            _e2face.insert( make_pair( meshDS->ShapeToIndex( v.Value() ), faceID ));
+        }
+      }
+
+    // find internal vertices in a face
+    set<int> intVV; // issue 0020850 where same vertex is twice in a face
+    for ( TopoDS_Iterator fSub( f.Current() ); fSub.More(); fSub.Next())
+      if ( fSub.Value().ShapeType() == TopAbs_VERTEX )
+      {
+        int vID = meshDS->ShapeToIndex( fSub.Value() );
+        if ( intVV.insert( vID ).second )
+          _f2v[ faceID ].push_back( vID );
+      }
+
+    if ( is3D )
+    {
+      // find internal faces and their subshapes where nodes are to be doubled
+      //  to make a crack with non-sewed borders
+
+      if ( f.Current().Orientation() == TopAbs_INTERNAL )
+      {
+        _intShapes.insert( meshDS->ShapeToIndex( f.Current() ));
+
+        // egdes
+        list< TopoDS_Shape > edges;
+        for ( e.Init( f.Current(), TopAbs_EDGE ); e.More(); e.Next())
+          if ( SMESH_MesherHelper::NbAncestors( e.Current(), mesh, TopAbs_FACE ) > 1 )
+          {
+            _intShapes.insert( meshDS->ShapeToIndex( e.Current() ));
+            edges.push_back( e.Current() );
+            // find border faces
+            PShapeIteratorPtr fIt =
+              SMESH_MesherHelper::GetAncestors( edges.back(),mesh,TopAbs_FACE );
+            while ( const TopoDS_Shape* pFace = fIt->next() )
+              if ( !pFace->IsSame( f.Current() ))
+                _borderFaces.insert( meshDS->ShapeToIndex( *pFace ));
+          }
+        // vertices
+        // we consider vertex internal if it is shared by more than one internal edge
+        list< TopoDS_Shape >::iterator edge = edges.begin();
+        for ( ; edge != edges.end(); ++edge )
+          for ( TopoDS_Iterator v( *edge ); v.More(); v.Next() )
+          {
+            set<int> internalEdges;
+            PShapeIteratorPtr eIt =
+              SMESH_MesherHelper::GetAncestors( v.Value(),mesh,TopAbs_EDGE );
+            while ( const TopoDS_Shape* pEdge = eIt->next() )
+            {
+              int edgeID = meshDS->ShapeToIndex( *pEdge );
+              if ( isInternalShape( edgeID ))
+                internalEdges.insert( edgeID );
+            }
+            if ( internalEdges.size() > 1 )
+              _intShapes.insert( meshDS->ShapeToIndex( v.Value() ));
+          }
+      }
+    }
+  } // loop on geom faces
+
+  // find vertices internal in solids
+  if ( is3D )
+  {
+    for ( TopExp_Explorer so(shape, TopAbs_SOLID); so.More(); so.Next())
+    {
+      int soID = meshDS->ShapeToIndex( so.Current() );
+      for ( TopoDS_Iterator soSub( so.Current() ); soSub.More(); soSub.Next())
+        if ( soSub.Value().ShapeType() == TopAbs_VERTEX )
+          _s2v[ soID ].push_back( meshDS->ShapeToIndex( soSub.Value() ));
+    }
+  }
+}
+
+//================================================================================
+/*!
+ * \brief Find mesh faces on non-internal geom faces sharing internal edge
+ * some nodes of which are to be doubled to make the second border of the "crack"
+ */
+//================================================================================
+
+void NETGENPlugin_Internals::findBorderElements( TIDSortedElemSet & borderElems )
+{
+  if ( _intShapes.empty() ) return;
+
+  SMESH_Mesh& mesh = const_cast<SMESH_Mesh&>(_mesh);
+  SMESHDS_Mesh* meshDS = mesh.GetMeshDS();
+
+  // loop on internal geom edges
+  set<int>::const_iterator intShapeId = _intShapes.begin();
+  for ( ; intShapeId != _intShapes.end(); ++intShapeId )
+  {
+    const TopoDS_Shape& s = meshDS->IndexToShape( *intShapeId );
+    if ( s.ShapeType() != TopAbs_EDGE ) continue;
+
+    // get internal and non-internal geom faces sharing the internal edge <s>
+    int intFace = 0;
+    set<int>::iterator bordFace = _borderFaces.end();
+    PShapeIteratorPtr faces = SMESH_MesherHelper::GetAncestors( s, _mesh, TopAbs_FACE );
+    while ( const TopoDS_Shape* pFace = faces->next() )
+    {
+      int faceID = meshDS->ShapeToIndex( *pFace );
+      if ( isInternalShape( faceID ))
+        intFace = faceID;
+      else
+        bordFace = _borderFaces.insert( faceID ).first;
+    }
+    if ( bordFace == _borderFaces.end() || !intFace ) continue;
+
+    // get all links of mesh faces on internal geom face sharing nodes on edge <s>
+    set< SMESH_OrientedLink > links; //!< links of faces on internal geom face
+    list<const SMDS_MeshElement*> suspectFaces[2]; //!< mesh faces on border geom faces
+    int nbSuspectFaces = 0;
+    SMESHDS_SubMesh* intFaceSM = meshDS->MeshElements( intFace );
+    if ( !intFaceSM || intFaceSM->NbElements() == 0 ) continue;
+    SMESH_subMeshIteratorPtr smIt = mesh.GetSubMesh( s )->getDependsOnIterator(true,true);
+    while ( smIt->more() )
+    {
+      SMESHDS_SubMesh* sm = smIt->next()->GetSubMeshDS();
+      if ( !sm ) continue;
+      SMDS_NodeIteratorPtr nIt = sm->GetNodes();
+      while ( nIt->more() )
+      {
+        const SMDS_MeshNode* nOnEdge = nIt->next();
+        SMDS_ElemIteratorPtr fIt = nOnEdge->GetInverseElementIterator(SMDSAbs_Face);
+        while ( fIt->more() )
+        {
+          const SMDS_MeshElement* f = fIt->next();
+          int nbNodes = f->NbNodes() / ( f->IsQuadratic() ? 2 : 1 );
+          if ( intFaceSM->Contains( f ))
+          {
+            for ( int i = 0; i < nbNodes; ++i )
+              links.insert( SMESH_OrientedLink( f->GetNode(i), f->GetNode((i+1)%nbNodes)));
+          }
+          else
+          {
+            int nbDblNodes = 0;
+            for ( int i = 0; i < nbNodes; ++i )
+              nbDblNodes += isInternalShape( f->GetNode(i)->GetPosition()->GetShapeId() );
+            if ( nbDblNodes )
+              suspectFaces[ nbDblNodes < 2 ].push_back( f );
+            nbSuspectFaces++;
+          }
+        }
+      }
+    }
+    // suspectFaces[0] having link with same orientation as mesh faces on
+    // the internal geom face are <borderElems>. suspectFaces[1] have
+    // only one node on edge <s>, we decide on them later (at the 2nd loop)
+    // by links of <borderElems> found at the 1st and 2nd loops
+    set< SMESH_OrientedLink > borderLinks;
+    for ( int isPostponed = 0; isPostponed < 2; ++isPostponed )
+    {
+      list<const SMDS_MeshElement*>::iterator fIt = suspectFaces[isPostponed].begin();
+      for ( int nbF = 0; fIt != suspectFaces[isPostponed].end(); ++fIt, ++nbF )
+      {
+        const SMDS_MeshElement* f = *fIt;
+        bool isBorder = false, linkFound = false, borderLinkFound = false;
+        list< SMESH_OrientedLink > faceLinks;
+        int nbNodes = f->NbNodes() / ( f->IsQuadratic() ? 2 : 1 );
+        for ( int i = 0; i < nbNodes; ++i )
+        {
+          SMESH_OrientedLink link( f->GetNode(i), f->GetNode((i+1)%nbNodes));
+          faceLinks.push_back( link );
+          if ( !linkFound )
+          {
+            set< SMESH_OrientedLink >::iterator foundLink = links.find( link );
+            if ( foundLink != links.end() )
+            {
+              linkFound= true;
+              isBorder = ( foundLink->_reversed == link._reversed );
+              if ( !isBorder && !isPostponed ) break;
+              faceLinks.pop_back();
+            }
+            else if ( isPostponed && !borderLinkFound )
+            {
+              foundLink = borderLinks.find( link );
+              if ( foundLink != borderLinks.end() )
+              {
+                borderLinkFound = true;
+                isBorder = ( foundLink->_reversed != link._reversed );
+              }
+            }
+          }
+        }
+        if ( isBorder )
+        {
+          borderElems.insert( f );
+          borderLinks.insert( faceLinks.begin(), faceLinks.end() );
+        }
+        else if ( !linkFound && !borderLinkFound )
+        {
+          suspectFaces[1].push_back( f );
+          if ( nbF > 2 * nbSuspectFaces )
+            break; // dead loop protection
+        }
+      }
+    }
+  }
+}
+
+//================================================================================
+/*!
+ * \brief put internal shapes in maps and fill in submeshes to precompute
+ */
+//================================================================================
+
+void NETGENPlugin_Internals::getInternalEdges( TopTools_IndexedMapOfShape& fmap,
+                                               TopTools_IndexedMapOfShape& emap,
+                                               TopTools_IndexedMapOfShape& vmap,
+                                               list< SMESH_subMesh* >& smToPrecompute)
+{
+  if ( !hasInternalEdges() ) return;
+  map<int,int>::const_iterator ev_face = _e2face.begin();
+  for ( ; ev_face != _e2face.end(); ++ev_face )
+  {
+    const TopoDS_Shape& ev   = _mesh.GetMeshDS()->IndexToShape( ev_face->first );
+    const TopoDS_Shape& face = _mesh.GetMeshDS()->IndexToShape( ev_face->second );
+
+    ( ev.ShapeType() == TopAbs_EDGE ? emap : vmap ).Add( ev );
+    fmap.Add( face );
+    //cout<<"INTERNAL EDGE or VERTEX "<<ev_face->first<<" on face "<<ev_face->second<<endl;
+
+    smToPrecompute.push_back( _mesh.GetSubMeshContaining( ev_face->first ));
+  }
+}
+
+//================================================================================
+/*!
+ * \brief return shapes and submeshes to be meshed and already meshed boundary submeshes
+ */
+//================================================================================
+
+void NETGENPlugin_Internals::getInternalFaces( TopTools_IndexedMapOfShape& fmap,
+                                               TopTools_IndexedMapOfShape& emap,
+                                               list< SMESH_subMesh* >&     intFaceSM,
+                                               list< SMESH_subMesh* >&     boundarySM)
+{
+  if ( !hasInternalFaces() ) return;
+
+  // <fmap> and <emap> are for not yet meshed shapes
+  // <intFaceSM> is for submeshes of faces
+  // <boundarySM> is for meshed edges and vertices
+
+  intFaceSM.clear();
+  boundarySM.clear();
+
+  set<int> shapeIDs ( _intShapes );
+  if ( !_borderFaces.empty() )
+    shapeIDs.insert( _borderFaces.begin(), _borderFaces.end() );
+
+  set<int>::const_iterator intS = shapeIDs.begin();
+  for ( ; intS != shapeIDs.end(); ++intS )
+  {
+    SMESH_subMesh* sm = _mesh.GetSubMeshContaining( *intS );
+
+    if ( sm->GetSubShape().ShapeType() != TopAbs_FACE ) continue;
+
+    intFaceSM.push_back( sm );
+
+    // add submeshes of not computed internal faces
+    if ( !sm->IsEmpty() ) continue;
+
+    SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(true,true);
+    while ( smIt->more() )
+    {
+      sm = smIt->next();
+      const TopoDS_Shape& s = sm->GetSubShape();
+
+      if ( sm->IsEmpty() )
+      {
+        // not yet meshed
+        switch ( s.ShapeType() ) {
+        case TopAbs_FACE: fmap.Add ( s ); break;
+        case TopAbs_EDGE: emap.Add ( s ); break;
+        default:;
+        }
+      }
+      else
+      {
+        if ( s.ShapeType() != TopAbs_FACE )
+          boundarySM.push_back( sm );
+      }
+    }
+  }
+}
+
+//================================================================================
+/*!
+ * \brief Return true if given shape is to be precomputed in order to be correctly
+ * added to netgen mesh
+ */
+//================================================================================
+
+bool NETGENPlugin_Internals::isShapeToPrecompute(const TopoDS_Shape& s)
+{
+  int shapeID = _mesh.GetMeshDS()->ShapeToIndex( s );
+  switch ( s.ShapeType() ) {
+  case TopAbs_FACE  : break; //return isInternalShape( shapeID ) || isBorderFace( shapeID );
+  case TopAbs_EDGE  : return isInternalEdge( shapeID );
+  case TopAbs_VERTEX: break;
+  default:;
+  }
+  return false;
+}
+
+//================================================================================
+/*!
+ * \brief Return SMESH
+ */
+//================================================================================
+
+SMESH_Mesh& NETGENPlugin_Internals::getMesh() const
+{
+  return const_cast<SMESH_Mesh&>( _mesh );
+}
+
+//================================================================================
+/*!
+ * \brief Initialize netgen library
+ */
+//================================================================================
+
+NETGENPlugin_NetgenLibWrapper::NETGENPlugin_NetgenLibWrapper()
+{
+  Ng_Init();
+  _ngMesh = Ng_NewMesh();
+}
+
+//================================================================================
+/*!
+ * \brief Finish using netgen library
+ */
+//================================================================================
+
+NETGENPlugin_NetgenLibWrapper::~NETGENPlugin_NetgenLibWrapper()
+{
+  Ng_DeleteMesh( _ngMesh );
+  Ng_Exit();
+  NETGENPlugin_Mesher::RemoveTmpFiles();
+}
+
+//================================================================================
+/*!
+ * \brief Set netgen mesh to delete at destruction
+ */
+//================================================================================
+
+void NETGENPlugin_NetgenLibWrapper::setMesh( Ng_Mesh* mesh )
+{
+  if ( _ngMesh )
+    Ng_DeleteMesh( _ngMesh );
+  _ngMesh = mesh;
+}
index d10d771eca5b63f18406e7ffecf9a0c371fb4908..f9745eea5c86727d47dd7290c2392287ee4318b7 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_Mesher.hxx
 // Author    : Michael Sazonov (OCN)
 
 #include "NETGENPlugin_Defs.hxx"
 #include "StdMeshers_FaceSide.hxx"
+#include "SMDS_MeshElement.hxx"
+#include "SMESH_Algo.hxx"
+
+namespace nglib {
+#include <nglib.h>
+}
+
 #include <map>
+#include <vector>
+#include <set>
 
 class SMESH_Mesh;
 class SMESH_Comment;
 class SMESHDS_Mesh;
 class TopoDS_Shape;
 class TopTools_DataMapOfShapeShape;
+class TopTools_IndexedMapOfShape;
 class NETGENPlugin_Hypothesis;
 class NETGENPlugin_SimpleHypothesis_2D;
+class NETGENPlugin_Internals;
 namespace netgen {
   class OCCGeometry;
   class Mesh;
@@ -69,7 +81,7 @@ class NETGENPLUGIN_EXPORT NETGENPlugin_Mesher
   NETGENPlugin_Mesher (SMESH_Mesh* mesh, const TopoDS_Shape& aShape,
                        const bool isVolume);
 
-  void SetParameters(const NETGENPlugin_Hypothesis* hyp);
+  void SetParameters(const NETGENPlugin_Hypothesis*          hyp);
   void SetParameters(const NETGENPlugin_SimpleHypothesis_2D* hyp);
 
   bool Compute();
@@ -80,24 +92,40 @@ class NETGENPLUGIN_EXPORT NETGENPlugin_Mesher
                                  const TopoDS_Shape&           shape,
                                  SMESH_Mesh&                   mesh,
                                  std::list< SMESH_subMesh* > * meshedSM=0,
-                                 TopTools_DataMapOfShapeShape* internalE2F=0);
+                                 NETGENPlugin_Internals*       internalShapes=0);
 
   static int FillSMesh(const netgen::OCCGeometry&          occgeom,
                        const netgen::Mesh&                 ngMesh,
                        const NETGENPlugin_ngMeshInfo&      initState,
                        SMESH_Mesh&                         sMesh,
-                       std::vector<SMDS_MeshNode*>&        nodeVec,
+                       std::vector<const SMDS_MeshNode*>&  nodeVec,
                        SMESH_Comment&                      comment);
 
-  bool fillNgMesh(netgen::OCCGeometry&                occgeom,
+  bool fillNgMesh(const netgen::OCCGeometry&          occgeom,
                   netgen::Mesh&                       ngMesh,
-                  std::vector<SMDS_MeshNode*>&        nodeVec,
+                  std::vector<const SMDS_MeshNode*>&  nodeVec,
                   const std::list< SMESH_subMesh* > & meshedSM);
 
+  static void fixIntFaces(const netgen::OCCGeometry& occgeom,
+                          netgen::Mesh&              ngMesh,
+                          NETGENPlugin_Internals&    internalShapes);
+
+  static void addIntVerticesInFaces(const netgen::OCCGeometry&          occgeom,
+                                    netgen::Mesh&                       ngMesh,
+                                    std::vector<const SMDS_MeshNode*>&  nodeVec,
+                                    NETGENPlugin_Internals&             internalShapes);
+
+  static void addIntVerticesInSolids(const netgen::OCCGeometry&         occgeom,
+                                    netgen::Mesh&                       ngMesh,
+                                    std::vector<const SMDS_MeshNode*>&  nodeVec,
+                                    NETGENPlugin_Internals&             internalShapes);
+
   void defaultParameters();
 
   static void RemoveTmpFiles();
 
+  static SMESH_ComputeErrorPtr readErrors(const std::vector< const SMDS_MeshNode* >& nodeVec);
+
  private:
   SMESH_Mesh*          _mesh;
   const TopoDS_Shape&  _shape;
@@ -108,4 +136,89 @@ class NETGENPLUGIN_EXPORT NETGENPlugin_Mesher
   std::map< int, std::pair<int,int> >      _faceDescriptors;
 };
 
+//=============================================================================
+/*!
+ * \brief Container of info needed to solve problems with internal shapes.
+ *
+ * Issue 0020676. It is made up as a class to be ready to extract from NETGEN
+ * and put in SMESH as soon as the same solution is needed somewhere else.
+ * The approach is to precompute internal edges in 2D and internal faces in 3D
+ * and put their mesh correctly (twice) into netgen mesh.
+ * In 2D, this class finds internal edges in faces and their vertices.
+ * In 3D, it additionally finds internal faces, their edges shared with other faces,
+ * and their vertices shared by several internal edges. Nodes built on the found
+ * shapes and mesh faces built on the found internal faces are to be doubled in
+ * netgen mesh to emulate a "crack"
+ *
+ * For internal faces a more simple solution is found, which is just to duplicate
+ * mesh faces on internal geom faces without modeling a "real crack". For this
+ * reason findBorderElements() is no more used anywhere.
+ */
+//=============================================================================
+
+class NETGENPLUGIN_EXPORT NETGENPlugin_Internals
+{
+  SMESH_Mesh&       _mesh;
+  bool              _is3D;
+  //2D
+  std::map<int,int> _e2face;//!<edges and their vertices in faces where they are TopAbs_INTERNAL
+  std::map<int,std::list<int> > _f2v;//!<faces with internal vertices
+  // 3D
+  std::set<int>     _intShapes;
+  std::set<int>     _borderFaces; //!< non-intrnal faces sharing the internal edge
+  std::map<int,std::list<int> > _s2v;//!<solids with internal vertices
+
+public:
+  NETGENPlugin_Internals( SMESH_Mesh& mesh, const TopoDS_Shape& shape, bool is3D );
+
+  SMESH_Mesh& getMesh() const;
+
+  bool isShapeToPrecompute(const TopoDS_Shape& s);
+
+  // 2D meshing
+  // edges 
+  bool hasInternalEdges() const { return !_e2face.empty(); }
+  bool isInternalEdge( int id ) const { return _e2face.count( id ); }
+  const std::map<int,int>& getEdgesAndVerticesWithFaces() const { return _e2face; }
+  void getInternalEdges( TopTools_IndexedMapOfShape&  fmap,
+                         TopTools_IndexedMapOfShape&  emap,
+                         TopTools_IndexedMapOfShape&  vmap,
+                         std::list< SMESH_subMesh* >& smToPrecompute);
+  // vertices
+  bool hasInternalVertexInFace() const { return !_f2v.empty(); }
+  const std::map<int,std::list<int> >& getFacesWithVertices() const { return _f2v; }
+
+  // 3D meshing
+  // faces
+  bool hasInternalFaces() const { return !_intShapes.empty(); }
+  bool isInternalShape( int id ) const { return _intShapes.count( id ); }
+  void findBorderElements( std::set< const SMDS_MeshElement*, TIDCompare > & borderElems );
+  bool isBorderFace( int faceID ) const { return _borderFaces.count( faceID ); }
+  void getInternalFaces( TopTools_IndexedMapOfShape&  fmap,
+                         TopTools_IndexedMapOfShape&  emap,
+                         std::list< SMESH_subMesh* >& facesSM,
+                         std::list< SMESH_subMesh* >& boundarySM);
+  // vertices
+  bool hasInternalVertexInSolid() const { return !_s2v.empty(); }
+  bool hasInternalVertexInSolid(int soID ) const { return _s2v.count(soID); }
+  const std::map<int,std::list<int> >& getSolidsWithVertices() const { return _s2v; }
+
+
+};
+
+//================================================================================
+/*!
+ * \brief It correctly initializes netgen library at constructor and
+ *        correctly finishes using netgen library at destructor
+ */
+//================================================================================
+
+struct NETGENPLUGIN_EXPORT NETGENPlugin_NetgenLibWrapper
+{
+  nglib::Ng_Mesh * _ngMesh;
+  NETGENPlugin_NetgenLibWrapper();
+  ~NETGENPlugin_NetgenLibWrapper();
+  void setMesh( nglib::Ng_Mesh* mesh );
+};
+
 #endif
index 331de00cd733ac77c183cb87256bc863bee82f87..ed5526adc7f3aecb1f40384df171d4a772bd1808 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File   : NETGENPlugin_NETGEN_2D.cxx
 // Author : Michael Sazonov (OCN)
index 7f6698861d2c5b4de49b14f6b3304cbd81168a52..2c25b823bfed1611e13cb94beb368ab24eb4fe70 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_NETGEN_2D.hxx
 // Author    : Michael Sazonov (OCN)
index f16743622283d79083dfafbd97af5a5e3ef13bb1..3ce64cc2c3f46d694d364731eef1633adcc7ab5b 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File   : NETGENPlugin_NETGEN_2D3D.cxx
 // Author : Michael Sazonov (OCN)
index 3740bb039c683593f259dd377a7acc6ff4747c52..539dc25c8cdfab8c123d447c0eace00a2672abcc 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_NETGEN_2D3D.hxx
 // Author    : Michael Sazonov (OCN)
index c15f825211f54f643532e5521a8a002ab7f67f55..647243f398f6506acea2b3efbc38481a1e7a8894 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : idl implementation
 //  File   : NETGENPlugin_NETGEN_2D3D_i.cxx
 //  Author : Michael Sazonov (OCN)
index 083deebb10dc6d09f9d79716fea9eb8af0e2cd13..28040b7133a0e8cb824ccbf93d8b977044234677 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : idl implementation
 //  File   : NETGENPlugin_NETGEN_2D3D_i.hxx
 //  Author : Michael Sazonov (OCN)
index 5b2b2b83c0198027f73a4677313a8a21d1aa1a7e..dc396b7dd623e3178e94d436d4b2539f230637be 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 // File      : NETGENPlugin_NETGEN_2D_ONLY.cxx
 // Author    : Edward AGAPOV (OCC)
 // Project   : SALOME
@@ -61,13 +59,15 @@ namespace nglib {
 //#include <meshtype.hpp>
 namespace netgen {
   extern int OCCGenerateMesh (OCCGeometry&, Mesh*&, int, int, char*);
-  /*extern*/ MeshingParameters mparam;
+  extern MeshingParameters mparam;
 }
 
 using namespace std;
 using namespace netgen;
 using namespace nglib;
 
+//#define DUMP_SEGMENTS
+
 //=============================================================================
 /*!
  *  
@@ -174,6 +174,7 @@ static TError AddSegmentsToMesh(netgen::Mesh&                    ngMesh,
   // Check wires and count nodes
   // ----------------------------
   int nbNodes = 0;
+  double totalLength = 0;
   for ( int iW = 0; iW < wires.size(); ++iW )
   {
     StdMeshers_FaceSidePtr wire = wires[ iW ];
@@ -187,7 +188,8 @@ static TError AddSegmentsToMesh(netgen::Mesh&                    ngMesh,
         (new SMESH_ComputeError(COMPERR_BAD_INPUT_MESH,
                                 SMESH_Comment("Unexpected nb of points on wire ") << iW
                                 << ": " << uvPtVec.size()<<" != "<<wire->NbPoints()));
-    nbNodes += wire->NbSegments();
+    nbNodes += wire->NbPoints();
+    totalLength += wire->Length();
   }
   nodeVec.reserve( nbNodes );
 
@@ -199,43 +201,59 @@ static TError AddSegmentsToMesh(netgen::Mesh&                    ngMesh,
 //   bb.Increase (bb.Diam()/10);
 //   ngMesh.SetLocalH (bb.PMin(), bb.PMax(), 0.5); // set grading
 
+  // map for nodes on vertices since they can be shared between wires
+  // ( issue 0020676, face_int_box.brep)
+  map<const SMDS_MeshNode*, int > node2ngID;
+
   const int faceID = 1, solidID = 0;
-  ngMesh.AddFaceDescriptor (FaceDescriptor(faceID, solidID, solidID, 0));
+  if ( ngMesh.GetNFD() < 1 )
+    ngMesh.AddFaceDescriptor (FaceDescriptor(faceID, solidID, solidID, 0));
 
   for ( int iW = 0; iW < wires.size(); ++iW )
   {
     StdMeshers_FaceSidePtr wire = wires[ iW ];
     const vector<UVPtStruct>& uvPtVec = wire->GetUVPtStruct();
+    const int nbSegments = wire->NbPoints() - 1;
 
-    int firstPointID = ngMesh.GetNP() + 1;
     int edgeID = 1, posID = -2;
-    bool isInternalEdge = false;
-    for ( int i = 0; i < wire->NbSegments(); ++i ) // loop on segments
+    bool isInternalWire = false;
+    for ( int i = 0; i < nbSegments; ++i ) // loop on segments
     {
       // Add the first point of a segment
       const SMDS_MeshNode * n = uvPtVec[ i ].node;
       const int posShapeID = n->GetPosition()->GetShapeId();
+      bool onVertex = ( n->GetPosition()->GetTypeOfPosition() == SMDS_TOP_VERTEX );
 
       // skip nodes on degenerated edges
       if ( helper.IsDegenShape( posShapeID ) &&
            helper.IsDegenShape( uvPtVec[ i+1 ].node->GetPosition()->GetShapeId() ))
         continue;
 
-      nodeVec.push_back( n );
-
-      MeshPoint mp( Point<3> (n->X(), n->Y(), n->Z()) );
-      ngMesh.AddPoint ( mp, 1, EDGEPOINT );
+      int ngID1 = ngMesh.GetNP() + 1, ngID2 = ngID1+1;
+      if ( onVertex )
+        ngID1 = node2ngID.insert( make_pair( n, ngID1 )).first->second;
+      if ( ngID1 > ngMesh.GetNP() )
+      {
+        MeshPoint mp( Point<3> (n->X(), n->Y(), n->Z()) );
+        ngMesh.AddPoint ( mp, 1, EDGEPOINT );
+        nodeVec.push_back( n );
+      }
+      else
+      {
+        ngID2 = ngMesh.GetNP() + 1;
+        if ( i > 0 ) // prev segment belongs to same wire
+        {
+          Segment& prevSeg = ngMesh.LineSegment( ngMesh.GetNSeg() );
+          prevSeg[1] = ngID1;
+        }
+      }
 
       // Add the segment
       Segment seg;
 
-#ifdef NETGEN_NEW
-      seg.pnums[0] = ngMesh.GetNP();          // ng node id
-      seg.pnums[1] = seg.pnums[0] + 1;              // ng node id
-#else
-      seg.p1 = ngMesh.GetNP();          // ng node id
-      seg.p2 = seg.p1 + 1;              // ng node id
-#endif
+      seg[0] = ngID1;  // ng node id
+      seg[1] = ngID2;  // ng node id
+
       seg.edgenr = ngMesh.GetNSeg() + 1;// segment id
       seg.si = faceID;                  // = geom.fmap.FindIndex (face);
 
@@ -248,7 +266,7 @@ static TError AddSegmentsToMesh(netgen::Mesh&                    ngMesh,
         seg.epgeominfo[ iEnd ].v    = pnt.v;
 
         // find out edge id and node parameter on edge
-        bool onVertex = ( pnt.node->GetPosition()->GetTypeOfPosition() == SMDS_TOP_VERTEX );
+        onVertex = ( pnt.node->GetPosition()->GetTypeOfPosition() == SMDS_TOP_VERTEX );
         if ( onVertex || posShapeID != posID )
         {
           // get edge id
@@ -258,7 +276,7 @@ static TError AddSegmentsToMesh(netgen::Mesh&                    ngMesh,
           const TopoDS_Edge& edge = wire->Edge( wire->EdgeIndex( normParam ));
           edgeID = geom.emap.FindIndex( edge );
           posID  = posShapeID;
-          isInternalEdge = ( edge.Orientation() == TopAbs_INTERNAL );
+          isInternalWire = ( edge.Orientation() == TopAbs_INTERNAL );
           if ( onVertex ) // param on curve is different on each of two edges
             seg.epgeominfo[ iEnd ].dist = helper.GetNodeU( edge, pnt.node );
         }
@@ -267,52 +285,55 @@ static TError AddSegmentsToMesh(netgen::Mesh&                    ngMesh,
 
       ngMesh.AddSegment (seg);
 
-//       cout << "Segment: " << seg.edgenr << endl
-//            << "\tp1: " << seg.p1 << endl
-//            << "\tp2: " << seg.p2 << endl
-//            << "\tp0 param: " << seg.epgeominfo[ 0 ].dist << endl
-//            << "\tp0 uv: " << seg.epgeominfo[ 0 ].u <<", "<< seg.epgeominfo[ 0 ].v << endl
-//            << "\tp0 edge: " << seg.epgeominfo[ 0 ].edgenr << endl
-//            << "\tp1 param: " << seg.epgeominfo[ 1 ].dist << endl
-//            << "\tp1 uv: " << seg.epgeominfo[ 1 ].u <<", "<< seg.epgeominfo[ 1 ].v << endl
-//            << "\tp1 edge: " << seg.epgeominfo[ 1 ].edgenr << endl;
-
-      if ( isInternalEdge )
-      {
-#ifdef NETGEN_NEW
-        swap (seg.pnums[0], seg.pnums[1]);
-#else
-        swap (seg.p1, seg.p2);
+#ifdef DUMP_SEGMENTS
+        cout << "Segment: " << seg.edgenr << endl
+           << "\tp1: " << seg[0] << endl
+           << "\tp2: " << seg[1] << endl
+           << "\tp0 param: " << seg.epgeominfo[ 0 ].dist << endl
+           << "\tp0 uv: " << seg.epgeominfo[ 0 ].u <<", "<< seg.epgeominfo[ 0 ].v << endl
+           << "\tp0 edge: " << seg.epgeominfo[ 0 ].edgenr << endl
+           << "\tp1 param: " << seg.epgeominfo[ 1 ].dist << endl
+           << "\tp1 uv: " << seg.epgeominfo[ 1 ].u <<", "<< seg.epgeominfo[ 1 ].v << endl
+           << "\tp1 edge: " << seg.epgeominfo[ 1 ].edgenr << endl;
 #endif
+      if ( isInternalWire )
+      {
+        swap (seg[0], seg[1]);
         swap( seg.epgeominfo[0], seg.epgeominfo[1] );
         seg.edgenr = ngMesh.GetNSeg() + 1; // segment id
         ngMesh.AddSegment (seg);
+#ifdef DUMP_SEGMENTS
+        cout << "Segment: " << seg.edgenr << endl << "\tis REVRESE of the previous one" << endl;
+#endif
       }
     } // loop on segments on a wire
 
     // close chain of segments
-    bool isClosedWire = ( wire->FirstVertex().IsSame( wire->LastVertex() ));
-    if ( isClosedWire )
+    if ( nbSegments > 0 )
     {
-      Segment& seg = ngMesh.LineSegment( ngMesh.GetNSeg() );
-#ifdef NETGEN_NEW
-      seg.pnums[1] = firstPointID;
-#else
-      seg.p2 = firstPointID;
-#endif
-    }
-    else // INTERNAL wire (Issue 0020676)
-    {
-      const SMDS_MeshNode * n = uvPtVec.back().node;
-      nodeVec.push_back( n );
-
-      MeshPoint mp( Point<3> (n->X(), n->Y(), n->Z()) );
-      ngMesh.AddPoint ( mp, 1, EDGEPOINT );
+      Segment& lastSeg = ngMesh.LineSegment( ngMesh.GetNSeg() - int( isInternalWire));
+      const SMDS_MeshNode * lastNode = uvPtVec.back().node;
+      lastSeg[1] = node2ngID.insert( make_pair( lastNode, lastSeg[1] )).first->second;
+      if ( lastSeg[1] > ngMesh.GetNP() )
+      {
+        MeshPoint mp( Point<3> (lastNode->X(), lastNode->Y(), lastNode->Z()) );
+        ngMesh.AddPoint ( mp, 1, EDGEPOINT );
+        nodeVec.push_back( lastNode );
+      }
+      if ( isInternalWire )
+      {
+        Segment& realLastSeg = ngMesh.LineSegment( ngMesh.GetNSeg() );
+        realLastSeg[0] = lastSeg[1];
+      }
     }
 
   } // loop on wires of a face
 
-  ngMesh.CalcSurfacesOfNode();  
+  // add a segment instead of internal vertex
+  NETGENPlugin_Internals intShapes( *helper.GetMesh(), helper.GetSubShape(), /*is3D=*/false );
+  NETGENPlugin_Mesher::addIntVerticesInFaces( geom, ngMesh, nodeVec, intShapes );
+
+  ngMesh.CalcSurfacesOfNode();
 
   return TError();
 }
@@ -355,8 +376,8 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
   // Make input netgen mesh
   // -------------------------
 
-  Ng_Init();
-  netgen::Mesh * ngMesh = new netgen::Mesh ();
+  NETGENPlugin_NetgenLibWrapper ngLib;
+  netgen::Mesh * ngMesh = (netgen::Mesh*) ngLib._ngMesh;
 
   netgen::OCCGeometry occgeo;
   NETGENPlugin_Mesher::PrepareOCCgeometry( occgeo, F, aMesh );
@@ -365,10 +386,8 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
 
   vector< const SMDS_MeshNode* > nodeVec;
   problem = AddSegmentsToMesh( *ngMesh, occgeo, wires, helper, nodeVec );
-  if ( problem && !problem->IsOK() ) {
-    delete ngMesh; Ng_Exit();
+  if ( problem && !problem->IsOK() )
     return error( problem );
-  }
 
   // --------------------
   // compute edge length
@@ -479,11 +498,6 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
       face = helper.AddFace(nodes[0],nodes[1],nodes[2],nodes[3]);
   }
 
-  Ng_DeleteMesh((nglib::Ng_Mesh*)ngMesh);
-  Ng_Exit();
-
-  NETGENPlugin_Mesher::RemoveTmpFiles();
-
   return !err;
 }
 
index 14b3b2cf6b5a8d286487f4aeed3f2507ff7ad026..35369a87ef9238e9cdd71e954461456e0caa90c9 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 // File      : NETGENPlugin_NETGEN_2D_ONLY.hxx
 // Project   : SALOME
 // Author    : Edward AGAPOV (OCC)
 #include "SMESH_2D_Algo.hxx"
 #include "SMESH_Mesh.hxx"
 
-/*#define OCCGEOMETRY
-#include <occgeom.hpp>
-#include <meshing.hpp>//amv*/
-
 class StdMeshers_MaxElementArea;
 class StdMeshers_LengthFromEdges;
 class StdMeshers_QuadranglePreference;
-//class NETGENPlugin_Hypothesis;
-
-/*namespace netgen {
-  class OCCGeometry;
-}*/
-/*namespace netgen {
-  class OCCGeometry;
-  extern int OCCGenerateMesh (OCCGeometry&, Mesh*&, int, int, char*);
-  extern MeshingParameters mparam;
-}*/
-
-//using namespace netgen;
 
 /*!
  * \brief Mesher generating 2D elements on a geometrical face taking
index dfe93eba3cc640421479ac522614b7e7f50de67e..af1389da396e0ece3a50788453bce7bb1d9587c2 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
 //  File   : NETGENPlugin_NETGEN_2D_ONLY_i.cxx
 //  Author : Edward AGAPOV (OCC)
index 125a5dc5d55d2f4e5ea874dfd6878ef5533ff83e..6d7a13a35da2c0ae62e9a5a760d3183079670d27 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
 //  File   : NETGENPlugin_NETGEN_2D_ONLY_i.cxx
 //  Author : Edward AGAPOV (OCC)
index 3a113f6a4dda0bacf6a14483d0333d981ebac1c9..ce284f6e779d9f54e9352b250055d6813c3c8c75 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : idl implementation
 //  File   : NETGENPlugin_NETGEN_2D_i.cxx
 //  Author : Michael Sazonov (OCN)
index 984f9533148772e4b1e9e8117e86bfd46c648529..738611ee4aa88f070bac079154da7f20989da9a7 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : idl implementation
 //  File   : NETGENPlugin_NETGEN_2D_i.hxx
 //  Author : Michael Sazonov (OCN)
index 08fc384b10566bf1dded6292824b2bc68219b6af..cdee32950646afa79500fb57de04a93eefc9ab30 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //=============================================================================
 // File      : NETGENPlugin_NETGEN_3D.cxx
 //             Moved here from SMESH_NETGEN_3D.cxx
 #include "SMESH_MeshEditor.hxx"
 #include "StdMeshers_QuadToTriaAdaptor.hxx"
 
+#include <BRepGProp.hxx>
 #include <BRep_Tool.hxx>
 #include <GProp_GProps.hxx>
-#include <BRepGProp.hxx>
 #include <TopExp.hxx>
 #include <TopExp_Explorer.hxx>
+#include <TopTools_ListIteratorOfListOfShape.hxx>
 #include <TopoDS.hxx>
 
 #include <Standard_Failure.hxx>
@@ -62,6 +64,8 @@
   Netgen include files
 */
 
+#define OCCGEOMETRY
+#include <occgeom.hpp>
 namespace nglib {
 #include <nglib.h>
 }
@@ -107,10 +111,9 @@ NETGENPlugin_NETGEN_3D::~NETGENPlugin_NETGEN_3D()
  */
 //=============================================================================
 
-bool NETGENPlugin_NETGEN_3D::CheckHypothesis
-                         (SMESH_Mesh& aMesh,
-                          const TopoDS_Shape& aShape,
-                          SMESH_Hypothesis::Hypothesis_Status& aStatus)
+bool NETGENPlugin_NETGEN_3D::CheckHypothesis (SMESH_Mesh&         aMesh,
+                                              const TopoDS_Shape& aShape,
+                                              Hypothesis_Status&  aStatus)
 {
   MESSAGE("NETGENPlugin_NETGEN_3D::CheckHypothesis");
 
@@ -163,90 +166,126 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh&         aMesh,
 
   SMESHDS_Mesh* meshDS = aMesh.GetMeshDS();
 
-  const int invalid_ID = -1;
+  SMESH_MesherHelper helper(aMesh);
+  bool _quadraticMesh = helper.IsQuadraticSubMesh(aShape);
+  helper.SetElementsOnShape( true );
 
-  SMESH::Controls::Area areaControl;
-  SMESH::Controls::TSequenceOfXYZ nodesCoords;
+  int Netgen_NbOfNodes     = 0;
+  int Netgen_param2ndOrder = 0;
+  double Netgen_paramFine  = 1.;
+  double Netgen_paramSize  = pow( 72, 1/6. ) * pow( _maxElementVolume, 1/3. );
 
-  // -------------------------------------------------------------------
-  // get triangles on aShell and make a map of nodes to Netgen node IDs
-  // -------------------------------------------------------------------
+  double Netgen_point[3];
+  int Netgen_triangle[3];
+  int Netgen_tetrahedron[4];
 
-  SMESH_MesherHelper helper(aMesh);
-  SMESH_MesherHelper* myTool = &helper;
-  bool _quadraticMesh = myTool->IsQuadraticSubMesh(aShape);
+  NETGENPlugin_NetgenLibWrapper ngLib;
+  Ng_Mesh * Netgen_mesh = ngLib._ngMesh;
 
-  typedef map< const SMDS_MeshNode*, int, TIDCompare > TNodeToIDMap;
-  TNodeToIDMap nodeToNetgenID;
-  list< const SMDS_MeshElement* > triangles;
-  list< bool >                    isReversed; // orientation of triangles
+  // vector of nodes in which node index == netgen ID
+  vector< const SMDS_MeshNode* > nodeVec;
+  {
+    const int invalid_ID = -1;
 
-  TopAbs_ShapeEnum mainType = aMesh.GetShapeToMesh().ShapeType();
-  bool checkReverse = ( mainType == TopAbs_COMPOUND || mainType == TopAbs_COMPSOLID );
+    SMESH::Controls::Area areaControl;
+    SMESH::Controls::TSequenceOfXYZ nodesCoords;
 
-  // for the degeneraged edge: ignore all but one node on it;
-  // map storing ids of degen edges and vertices and their netgen id:
-  map< int, int* > degenShapeIdToPtrNgId;
-  map< int, int* >::iterator shId_ngId;
-  list< int > degenNgIds;
+    // maps nodes to ng ID
+    typedef map< const SMDS_MeshNode*, int, TIDCompare > TNodeToIDMap;
+    typedef TNodeToIDMap::value_type                     TN2ID;
+    TNodeToIDMap nodeToNetgenID;
 
-  StdMeshers_QuadToTriaAdaptor Adaptor;
-  Adaptor.Compute(aMesh,aShape);
+    // find internal shapes
+    NETGENPlugin_Internals internals( aMesh, aShape, /*is3D=*/true );
 
-  for (TopExp_Explorer exp(aShape,TopAbs_FACE);exp.More();exp.Next())
-  {
-    const TopoDS_Shape& aShapeFace = exp.Current();
-    const SMESHDS_SubMesh * aSubMeshDSFace = meshDS->MeshElements( aShapeFace );
-    if ( aSubMeshDSFace )
+    // ---------------------------------
+    // Feed the Netgen with surface mesh
+    // ---------------------------------
+
+    TopAbs_ShapeEnum mainType = aMesh.GetShapeToMesh().ShapeType();
+    bool checkReverse = ( mainType == TopAbs_COMPOUND || mainType == TopAbs_COMPSOLID );
+
+    StdMeshers_QuadToTriaAdaptor Adaptor;
+    if ( aMesh.NbQuadrangles() > 0 )
+      Adaptor.Compute(aMesh,aShape);
+
+    for ( TopExp_Explorer exFa( aShape, TopAbs_FACE ); exFa.More(); exFa.Next())
     {
+      const TopoDS_Shape& aShapeFace = exFa.Current();
+      int faceID = meshDS->ShapeToIndex( aShapeFace );
+      bool isInternalFace = internals.isInternalShape( faceID );
       bool isRev = false;
-      if ( checkReverse && helper.NbAncestors(aShapeFace, aMesh, aShape.ShapeType()) > 1 )
+      if ( checkReverse && !isInternalFace &&
+           helper.NbAncestors(aShapeFace, aMesh, aShape.ShapeType()) > 1 )
         // IsReversedSubMesh() can work wrong on strongly curved faces,
         // so we use it as less as possible
         isRev = SMESH_Algo::IsReversedSubMesh( TopoDS::Face(aShapeFace), meshDS );
 
+      const SMESHDS_SubMesh * aSubMeshDSFace = meshDS->MeshElements( aShapeFace );
+      if ( !aSubMeshDSFace ) continue;
       SMDS_ElemIteratorPtr iteratorElem = aSubMeshDSFace->GetElements();
-      while ( iteratorElem->more() ) // loop on elements on a face
+      while ( iteratorElem->more() ) // loop on elements on a geom face
       {
-        // check element
+        // check mesh face
         const SMDS_MeshElement* elem = iteratorElem->next();
         if ( !elem )
           return error( COMPERR_BAD_INPUT_MESH, "Null element encounters");
+        vector< const SMDS_MeshElement* > trias;
         bool isTraingle = ( elem->NbNodes() == ( elem->IsQuadratic() ? 6 : 3 ));
-        if ( !isTraingle ) {
-          // using adaptor
+        if ( !isTraingle )
+        {
+          // use adaptor to convert quadrangle face into triangles
           const list<const SMDS_FaceOfNodes*>* faces = Adaptor.GetTriangles(elem);
-          if(faces==0) {
+          if(faces==0)
             return error( COMPERR_BAD_INPUT_MESH,
                           SMESH_Comment("No triangles in adaptor for element ")<<elem->GetID());
-          }
-          list<const SMDS_FaceOfNodes*>::const_iterator itf = faces->begin();
-          for(; itf!=faces->end(); itf++ ) {
-            triangles.push_back( (*itf) );
-            isReversed.push_back( isRev );
-            // put triange's nodes to nodeToNetgenID map
-            SMDS_ElemIteratorPtr triangleNodesIt = (*itf)->nodesIterator();
-            while ( triangleNodesIt->more() ) {
-              const SMDS_MeshNode * node =
-                static_cast<const SMDS_MeshNode *>(triangleNodesIt->next());
-              if(myTool->IsMedium(node))
-                continue;
-              nodeToNetgenID.insert( make_pair( node, invalid_ID ));
+          trias.assign( faces->begin(), faces->end() );
+        }
+        else
+        {
+          trias.push_back( elem );
+        }
+        // Add nodes of triangles and triangles them-selves to netgen mesh
+
+        for ( int i = 0; i < trias.size(); ++i )
+        {
+          // add three nodes of triangle
+          bool hasDegen = false;
+          for ( int iN = 0; iN < 3; ++iN )
+          {
+            const SMDS_MeshNode* node = trias[i]->GetNode( iN );
+            int shapeID = node->GetPosition()->GetShapeId();
+            if ( node->GetPosition()->GetTypeOfPosition() == SMDS_TOP_EDGE &&
+                 helper.IsDegenShape( shapeID ))
+            {
+              // ignore all nodes on degeneraged edge and use node on its vertex instead
+              TopoDS_Shape vertex = TopoDS_Iterator( meshDS->IndexToShape( shapeID )).Value();
+              node = SMESH_Algo::VertexNode( TopoDS::Vertex( vertex ), meshDS );
+              hasDegen = true;
+            }
+            int& ngID = nodeToNetgenID.insert(TN2ID( node, invalid_ID )).first->second;
+            if ( ngID == invalid_ID )
+            {
+              ngID = ++Netgen_NbOfNodes;
+              Netgen_point [ 0 ] = node->X();
+              Netgen_point [ 1 ] = node->Y();
+              Netgen_point [ 2 ] = node->Z();
+              Ng_AddPoint(Netgen_mesh, Netgen_point);
             }
+            Netgen_triangle[ isRev ? 2-iN : iN ] = ngID;
           }
-        }
-        else {
-          // keep a triangle
-          triangles.push_back( elem );
-          isReversed.push_back( isRev );
-          // put elem nodes to nodeToNetgenID map
-          SMDS_ElemIteratorPtr triangleNodesIt = elem->nodesIterator();
-          while ( triangleNodesIt->more() ) {
-            const SMDS_MeshNode * node =
-              static_cast<const SMDS_MeshNode *>(triangleNodesIt->next());
-            if(myTool->IsMedium(node))
-              continue;
-            nodeToNetgenID.insert( make_pair( node, invalid_ID ));
+          // add triangle
+          if ( hasDegen && (Netgen_triangle[0] == Netgen_triangle[1] ||
+                            Netgen_triangle[0] == Netgen_triangle[2] ||
+                            Netgen_triangle[2] == Netgen_triangle[1] ))
+            continue;
+
+          Ng_AddSurfaceElement(Netgen_mesh, NG_TRIG, Netgen_triangle);
+
+          if ( isInternalFace && isTraingle )
+          {
+            swap( Netgen_triangle[1], Netgen_triangle[2] );
+            Ng_AddSurfaceElement(Netgen_mesh, NG_TRIG, Netgen_triangle);
           }
         }
 #ifdef _DEBUG_
@@ -257,91 +296,24 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh&         aMesh,
           MESSAGE( "Warning: Degenerated " << elem );
         }
 #endif
-      }
-      // look for degeneraged edges and vetices
-      for (TopExp_Explorer expE(aShapeFace,TopAbs_EDGE);expE.More();expE.Next())
-      {
-        TopoDS_Edge aShapeEdge = TopoDS::Edge( expE.Current() );
-        if ( BRep_Tool::Degenerated( aShapeEdge ))
-        {
-          degenNgIds.push_back( invalid_ID );
-          int* ptrIdOnEdge = & degenNgIds.back();
-          // remember edge id
-          int edgeID = meshDS->ShapeToIndex( aShapeEdge );
-          degenShapeIdToPtrNgId.insert( make_pair( edgeID, ptrIdOnEdge ));
-          // remember vertex id
-          int vertexID = meshDS->ShapeToIndex( TopExp::FirstVertex( aShapeEdge ));
-          degenShapeIdToPtrNgId.insert( make_pair( vertexID, ptrIdOnEdge ));
-        }
-      }
-    }
-  }
-  // ---------------------------------
-  // Feed the Netgen with surface mesh
-  // ---------------------------------
+      } // loop on elements on a face
+    } // loop on faces of a SOLID or SHELL
 
-  int Netgen_NbOfNodes = 0;
-  int Netgen_param2ndOrder = 0;
-  double Netgen_paramFine = 1.;
-  double Netgen_paramSize = pow( 72, 1/6. ) * pow( _maxElementVolume, 1/3. );
-
-  double Netgen_point[3];
-  int Netgen_triangle[3];
-  int Netgen_tetrahedron[4];
-
-  Ng_Init();
-
-  Ng_Mesh * Netgen_mesh = Ng_NewMesh();
-
-  // set nodes and remember thier netgen IDs
-  bool isDegen = false, hasDegen = !degenShapeIdToPtrNgId.empty();
-  TNodeToIDMap::iterator n_id = nodeToNetgenID.begin();
-  for ( ; n_id != nodeToNetgenID.end(); ++n_id )
-  {
-    const SMDS_MeshNode* node = n_id->first;
-
-    // ignore nodes on degenerated edge
-    if ( hasDegen ) {
-      int shapeId = node->GetPosition()->GetShapeId();
-      shId_ngId = degenShapeIdToPtrNgId.find( shapeId );
-      isDegen = ( shId_ngId != degenShapeIdToPtrNgId.end() );
-      if ( isDegen && *(shId_ngId->second) != invalid_ID ) {
-        n_id->second = *(shId_ngId->second);
-        continue;
-      }
-    }
-    Netgen_point [ 0 ] = node->X();
-    Netgen_point [ 1 ] = node->Y();
-    Netgen_point [ 2 ] = node->Z();
-    Ng_AddPoint(Netgen_mesh, Netgen_point);
-    n_id->second = ++Netgen_NbOfNodes; // set netgen ID
-
-    if ( isDegen ) // all nodes on a degen edge get one netgen ID
-      *(shId_ngId->second) = n_id->second;
-  }
+    // insert old nodes into nodeVec
+    nodeVec.resize( nodeToNetgenID.size() + 1, 0 );
+    TNodeToIDMap::iterator n_id = nodeToNetgenID.begin();
+    for ( ; n_id != nodeToNetgenID.end(); ++n_id )
+      nodeVec[ n_id->second ] = n_id->first;
+    nodeToNetgenID.clear();
 
-  // set triangles
-  list< const SMDS_MeshElement* >::iterator tria = triangles.begin();
-  list< bool >::iterator                 reverse = isReversed.begin();
-  for ( ; tria != triangles.end(); ++tria, ++reverse )
-  {
-    int i = 0;
-    SMDS_ElemIteratorPtr triangleNodesIt = (*tria)->nodesIterator();
-    while ( triangleNodesIt->more() ) {
-      const SMDS_MeshNode * node =
-        static_cast<const SMDS_MeshNode *>(triangleNodesIt->next());
-      if(myTool->IsMedium(node))
-        continue;
-      Netgen_triangle[ *reverse ? 2 - i : i ] = nodeToNetgenID[ node ];
-      ++i;
-    }
-    if ( !hasDegen ||
-         // ignore degenerated triangles, they have 2 or 3 same ids
-         (Netgen_triangle[0] != Netgen_triangle[1] &&
-          Netgen_triangle[0] != Netgen_triangle[2] &&
-          Netgen_triangle[2] != Netgen_triangle[1] ))
+    if ( internals.hasInternalVertexInSolid() )
     {
-      Ng_AddSurfaceElement(Netgen_mesh, NG_TRIG, Netgen_triangle);
+      netgen::OCCGeometry occgeo;
+      NETGENPlugin_Mesher::addIntVerticesInSolids( occgeo,
+                                                   (netgen::Mesh&) *Netgen_mesh,
+                                                   nodeVec,
+                                                   internals);
+      Netgen_NbOfNodes = Ng_GetNP(Netgen_mesh);
     }
   }
 
@@ -352,8 +324,8 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh&         aMesh,
   Ng_Meshing_Parameters Netgen_param;
 
   Netgen_param.secondorder = Netgen_param2ndOrder;
-  Netgen_param.fineness = Netgen_paramFine;
-  Netgen_param.maxh = Netgen_paramSize;
+  Netgen_param.fineness    = Netgen_paramFine;
+  Netgen_param.maxh        = Netgen_paramSize;
 
   Ng_Result status;
 
@@ -382,8 +354,7 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh&         aMesh,
   }
 
   int Netgen_NbOfNodesNew = Ng_GetNP(Netgen_mesh);
-
-  int Netgen_NbOfTetra = Ng_GetNE(Netgen_mesh);
+  int Netgen_NbOfTetra    = Ng_GetNE(Netgen_mesh);
 
   MESSAGE("End of Volume Mesh Generation. status=" << status <<
           ", nb new nodes: " << Netgen_NbOfNodesNew - Netgen_NbOfNodes <<
@@ -393,49 +364,46 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh&         aMesh,
   // Feed back the SMESHDS with the generated Nodes and Volume Elements
   // -------------------------------------------------------------------
 
+  if ( status == NG_VOLUME_FAILURE )
+  {
+    SMESH_ComputeErrorPtr err = NETGENPlugin_Mesher::readErrors(nodeVec);
+    if ( err && !err->myBadElements.empty() )
+      error( err );
+  }
+
   bool isOK = ( /*status == NG_OK &&*/ Netgen_NbOfTetra > 0 );// get whatever built
   if ( isOK )
   {
-    // vector of nodes in which node index == netgen ID
-    vector< const SMDS_MeshNode* > nodeVec ( Netgen_NbOfNodesNew + 1 );
-    // insert old nodes into nodeVec
-    for ( n_id = nodeToNetgenID.begin(); n_id != nodeToNetgenID.end(); ++n_id ) {
-      nodeVec.at( n_id->second ) = n_id->first;
-    }
     // create and insert new nodes into nodeVec
+    nodeVec.resize( Netgen_NbOfNodesNew + 1, 0 );
     int nodeIndex = Netgen_NbOfNodes + 1;
-    int shapeID = meshDS->ShapeToIndex( aShape );
     for ( ; nodeIndex <= Netgen_NbOfNodesNew; ++nodeIndex )
     {
       Ng_GetPoint( Netgen_mesh, nodeIndex, Netgen_point );
-      SMDS_MeshNode * node = meshDS->AddNode(Netgen_point[0],
-                                             Netgen_point[1],
-                                             Netgen_point[2]);
-      meshDS->SetNodeInVolume(node, shapeID);
-      nodeVec.at(nodeIndex) = node;
+      nodeVec.at(nodeIndex) = helper.AddNode(Netgen_point[0], Netgen_point[1], Netgen_point[2]);
     }
 
     // create tetrahedrons
     for ( int elemIndex = 1; elemIndex <= Netgen_NbOfTetra; ++elemIndex )
     {
       Ng_GetVolumeElement(Netgen_mesh, elemIndex, Netgen_tetrahedron);
-      SMDS_MeshVolume * elt = myTool->AddVolume (nodeVec.at( Netgen_tetrahedron[0] ),
-                                                 nodeVec.at( Netgen_tetrahedron[1] ),
-                                                 nodeVec.at( Netgen_tetrahedron[2] ),
-                                                 nodeVec.at( Netgen_tetrahedron[3] ));
-      meshDS->SetMeshElementOnShape(elt, shapeID );
+      helper.AddVolume (nodeVec.at( Netgen_tetrahedron[0] ),
+                        nodeVec.at( Netgen_tetrahedron[1] ),
+                        nodeVec.at( Netgen_tetrahedron[2] ),
+                        nodeVec.at( Netgen_tetrahedron[3] ));
     }
   }
 
-  Ng_DeleteMesh(Netgen_mesh);
-  Ng_Exit();
-
-  NETGENPlugin_Mesher::RemoveTmpFiles();
-
   return (status == NG_OK);
 }
 
-bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
+//================================================================================
+/*!
+ * \brief Compute tetrahedral mesh from 2D mesh without geometry
+ */
+//================================================================================
+
+bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh&         aMesh,
                                      SMESH_MesherHelper* aHelper)
 {
   MESSAGE("NETGENPlugin_NETGEN_3D::Compute with maxElmentsize = " << _maxElementVolume);  
@@ -462,42 +430,32 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
   while( fIt->more()) sortedFaces.insert( fIt->next() );
 
   TIDSortedElemSet::iterator itFace = sortedFaces.begin(), fEnd = sortedFaces.end();
-  for ( ; itFace != fEnd; ++itFace ) {
+  for ( ; itFace != fEnd; ++itFace )
+  {
     // check element
     const SMDS_MeshElement* elem = *itFace;
     if ( !elem )
       return error( COMPERR_BAD_INPUT_MESH, "Null element encounters");
+
+    vector< const SMDS_MeshElement* > trias;
     bool isTraingle = ( elem->NbNodes() == ( elem->IsQuadratic() ? 6 : 3 ));
     if ( !isTraingle ) {
       // using adaptor
       const list<const SMDS_FaceOfNodes*>* faces = Adaptor.GetTriangles(elem);
-      if(faces==0) {
+      if(faces==0)
         continue; // Issue 0020682. There already can be 3d mesh
-      }
-      list<const SMDS_FaceOfNodes*>::const_iterator itf = faces->begin();
-      for(; itf!=faces->end(); itf++ ) {
-        triangles.push_back( (*itf) );
-        // put triange's nodes to nodeToNetgenID map
-        SMDS_ElemIteratorPtr triangleNodesIt = (*itf)->nodesIterator();
-        while ( triangleNodesIt->more() ) {
-          const SMDS_MeshNode * node =
-            static_cast<const SMDS_MeshNode *>(triangleNodesIt->next());
-          if(aHelper->IsMedium(node))
-            continue;
-          nodeToNetgenID.insert( make_pair( node, invalid_ID ));
-        }
-      }
+      trias.assign( faces->begin(), faces->end() );
     }
     else {
-      // keep a triangle
-      triangles.push_back( elem );
-      // put elem nodes to nodeToNetgenID map
-      SMDS_ElemIteratorPtr triangleNodesIt = elem->nodesIterator();
-      while ( triangleNodesIt->more() ) {
-        const SMDS_MeshNode * node =
-          static_cast<const SMDS_MeshNode *>(triangleNodesIt->next());
-        if(aHelper->IsMedium(node))
-          continue;
+      trias.push_back( elem );
+    }
+    for ( int i = 0; i < trias.size(); ++i )
+    {
+      triangles.push_back( trias[i] );
+      for ( int iN = 0; iN < 3; ++iN )
+      {
+        const SMDS_MeshNode* node = trias[i]->GetNode( iN );
+        // put elem nodes to nodeToNetgenID map
         nodeToNetgenID.insert( make_pair( node, invalid_ID ));
       }
     }
@@ -516,11 +474,10 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
   int Netgen_triangle[3];
   int Netgen_tetrahedron[4];
 
-  Ng_Init();
-
-  Ng_Mesh * Netgen_mesh = Ng_NewMesh();
+  NETGENPlugin_NetgenLibWrapper ngLib;
+  Ng_Mesh * Netgen_mesh = ngLib._ngMesh;
 
-    // set nodes and remember thier netgen IDs
+  // set nodes and remember thier netgen IDs
   
   TNodeToIDMap::iterator n_id = nodeToNetgenID.begin();
   for ( ; n_id != nodeToNetgenID.end(); ++n_id )
@@ -625,11 +582,6 @@ bool NETGENPlugin_NETGEN_3D::Compute(SMESH_Mesh& aMesh,
     }
   }
 
-  Ng_DeleteMesh(Netgen_mesh);
-  Ng_Exit();
-  
-  NETGENPlugin_Mesher::RemoveTmpFiles();
-  
   return (status == NG_OK);
 }
 
@@ -646,8 +598,8 @@ bool NETGENPlugin_NETGEN_3D::Evaluate(SMESH_Mesh& aMesh,
 {
   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() );
+  for (TopExp_Explorer expF(aShape, TopAbs_FACE); expF.More(); expF.Next()) {
+    TopoDS_Face F = TopoDS::Face( expF.Current() );
     SMESH_subMesh *sm = aMesh.GetSubMesh(F);
     MapShapeNbElemsItr anIt = aResMap.find(sm);
     if( anIt==aResMap.end() ) {
@@ -669,12 +621,12 @@ bool NETGENPlugin_NETGEN_3D::Evaluate(SMESH_Mesh& aMesh,
   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());
+  for (TopExp_Explorer expF(aShape, TopAbs_EDGE); expF.More(); expF.Next()) {
+    TopoDS_Edge E = TopoDS::Edge(expF.Current());
     if( tmpMap.Contains(E) )
       continue;
     tmpMap.Add(E);
-    SMESH_subMesh *aSubMesh = aMesh.GetSubMesh(exp.Current());
+    SMESH_subMesh *aSubMesh = aMesh.GetSubMesh(expF.Current());
     MapShapeNbElemsItr anIt = aResMap.find(aSubMesh);
     if( anIt==aResMap.end() ) {
       SMESH_ComputeErrorPtr& smError = aSubMesh->GetComputeError();
index c3f6be0542bc78ada6c57812d309b53b7996ad81..520cb44a5698bd62d87358ca085e230f75ed6de5 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //=============================================================================
 // File      : NETGENPlugin_NETGEN_3D.hxx
 //             Moved here from SMESH_NETGEN_3D.hxx
index e541cb6744e5b8fc9c17c9bd9f3a8f340421ce02..b89557d610dac532a246a15de21e64ded6185228 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
 //  File   : NETGENPlugin_NETGEN_3D_i.cxx
 //           Moved here from SMESH_NETGEN_3D_i.cxx
index cbc660b420573131cca3e7319208778f2cf8efeb..f3d901c05a1db3ee99eb088467a07d71ec4b84ae 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
 //  File   : NETGENPlugin_NETGEN_3D_i.hxx
 //           Moved here from SMESH_NETGEN_3D_i.hxx
index a54d2fbf35695d9ff07e0d68fe772a820d0a0346..a105de0ae6b9dede3851e50aca41df1cdb948919 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_SimpleHypothesis_2D.cxx
 // Author    : Edward AGAPOV
index 4ed92181a184e633c48b89cd17b34f1ce83032fe..5409d04dbc06d4159b7115a27422983b2d9211bb 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_SimpleHypothesis_2D.hxx
 // Author    : Edward AGAPOV
index fac763ef12f1e52f63d209727ca0a5460632f6d4..7ac19e9129b89322bf9fea968897a9b5e1f9e9b0 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_SimpleHypothesis_2D_i.cxx
 // Author    : Edward AGAPOV
index 54262931022d165669636aa4c427eebd06b6bc3d..8dab168275c36d28a011f0a91315909977279145 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_SimpleHypothesis_2D_i.hxx
 // Author    : Edward AGAPOV
index fd799b9cb0c71459a92b2f5df3913f315c3b6244..39836b72997e4fa004cbf9d85825ba3af59fa45a 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_SimpleHypothesis_3D.cxx
 // Author    : Edward AGAPOV
index 7b7de4f172e67e6e9d7b5a44a224e1cdda431bd7..371bd321e9ffc488b4b1034dae9fcbe8c2d04daa 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_SimpleHypothesis_3D.hxx
 // Author    : Edward AGAPOV
index 96b9aa861d11f2d7d4cbffe2cf06f9dec94cb978..f8b49408fc886d4bec77246d998c795c9a25fbed 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_SimpleHypothesis_3D_i.cxx
 // Author    : Edward AGAPOV
index 6fd66885954f996842f6e6e176f7e7d6f8b9884b..e2ed8d1d7405fdf2e53fb26324c394bf937800ef 100644 (file)
@@ -1,7 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//  Copyright (C) 2007-2010  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
@@ -19,6 +16,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  NETGENPlugin : C++ implementation
 // File      : NETGENPlugin_SimpleHypothesis_3D_i.hxx
 // Author    : Edward AGAPOV
index 78e77c14923d08bb30a58cf4abfbbc6ce6d0b510..c8a9edaa316b0ce5bf0f34852742db848d22a824 100644 (file)
@@ -1,4 +1,4 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -19,6 +19,7 @@
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 //  SMESH NETGENPlugin : implementaion of SMESH idl descriptions
 //  File   : NETGENPlugin.cxx
 //  Author : Julia DOROVSKIKH