Salome HOME
Merge from V6_4_BR 05/12/2011
authorvsr <vsr@opencascade.com>
Mon, 5 Dec 2011 11:03:04 +0000 (11:03 +0000)
committervsr <vsr@opencascade.com>
Mon, 5 Dec 2011 11:03:04 +0000 (11:03 +0000)
177 files changed:
Makefile.am
adm_local/unix/make_common_starter.am
configure.ac
doc/Makefile.am
doc/docutils/conf.py.in
doc/salome/gui/SMESH/doxyfile.in
doc/salome/gui/SMESH/images/cartesian3D_hyp.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/cartesian3D_sphere.png [new file with mode: 0644]
doc/salome/gui/SMESH/input/basic_meshing_algos.doc
doc/salome/gui/SMESH/input/blsurf_hypo.doc
doc/salome/gui/SMESH/input/cartesian_algo.doc [new file with mode: 0644]
doc/salome/gui/SMESH/input/clipping.doc
doc/salome/gui/SMESH/input/colors_size.doc
doc/salome/gui/SMESH/input/creating_groups.doc
doc/salome/gui/SMESH/input/editing_groups.doc
doc/salome/gui/SMESH/input/ghs3d_hypo.doc
doc/salome/gui/SMESH/input/grouping_elements.doc
doc/salome/gui/SMESH/input/make_2dmesh_from_3d.doc
doc/salome/gui/SMESH/input/max_element_length_2d.doc
doc/salome/gui/SMESH/input/max_element_length_3d.doc
doc/salome/gui/SMESH/input/measurements.doc
doc/salome/gui/SMESH/input/mesh_infos.doc
doc/salome/gui/SMESH/input/over_constrained_faces.doc
doc/salome/gui/SMESH/input/over_constrained_volumes.doc
doc/salome/gui/SMESH/input/projection_algos.doc
doc/salome/gui/SMESH/input/selection_filter_library.doc
doc/salome/gui/SMESH/input/smeshpy_interface.doc
doc/salome/gui/SMESH/input/tui_cartesian_algo.doc [new file with mode: 0644]
doc/salome/gui/SMESH/input/use_existing_algos.doc
doc/salome/tui/Makefile.am
doc/salome/tui/static/myheader.html [deleted file]
idl/SMESH_MeshEditor.idl
src/MEFISTO2/Makefile.am
src/OBJECT/Makefile.am
src/OBJECT/SMESH_Actor.cxx
src/OBJECT/SMESH_ActorDef.h
src/OBJECT/SMESH_CellLabelActor.cxx [new file with mode: 0644]
src/OBJECT/SMESH_CellLabelActor.h [new file with mode: 0644]
src/OBJECT/SMESH_DeviceActor.cxx
src/OBJECT/SMESH_ExtractGeometry.cxx
src/OBJECT/SMESH_NodeLabelActor.cxx [new file with mode: 0644]
src/OBJECT/SMESH_NodeLabelActor.h [new file with mode: 0644]
src/OBJECT/SMESH_Object.cxx
src/OBJECT/SMESH_vtkPVUpdateSuppressor.cxx [deleted file]
src/OBJECT/SMESH_vtkPVUpdateSuppressor.h [deleted file]
src/SMDS/SMDS_VtkVolume.cxx
src/SMESH/SMESH_Algo.cxx
src/SMESH/SMESH_Gen.cxx
src/SMESH/SMESH_HypoFilter.cxx
src/SMESH/SMESH_HypoFilter.hxx
src/SMESH/SMESH_Mesh.cxx
src/SMESH/SMESH_MeshEditor.cxx
src/SMESH/SMESH_MesherHelper.cxx
src/SMESH/SMESH_MesherHelper.hxx
src/SMESH/SMESH_subMesh.cxx
src/SMESHGUI/SMESHGUI.cxx
src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx
src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx
src/SMESHGUI/SMESHGUI_CreatePolyhedralVolumeDlg.cxx
src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx [deleted file]
src/SMESHGUI/SMESHGUI_MeshInfosDlg.h [deleted file]
src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx [deleted file]
src/SMESHGUI/SMESHGUI_MoveNodesDlg.h [deleted file]
src/SMESHGUI/SMESHGUI_NodesDlg.cxx
src/SMESHGUI/SMESHGUI_StandardMeshInfosDlg.cxx [deleted file]
src/SMESHGUI/SMESHGUI_StandardMeshInfosDlg.h [deleted file]
src/SMESHGUI/SMESHGUI_WhatIsDlg.cxx [deleted file]
src/SMESHGUI/SMESHGUI_WhatIsDlg.h [deleted file]
src/SMESHGUI/SMESH_msg_en.ts
src/SMESHGUI/SMESH_msg_fr.ts
src/SMESH_I/SMESH_2smeshpy.cxx
src/SMESH_I/SMESH_2smeshpy.hxx
src/SMESH_I/SMESH_DumpPython.cxx
src/SMESH_I/SMESH_Gen_i.cxx
src/SMESH_I/SMESH_Group_i.cxx
src/SMESH_I/SMESH_MeshEditor_i.cxx
src/SMESH_I/SMESH_MeshEditor_i.hxx
src/SMESH_I/SMESH_Mesh_i.cxx
src/SMESH_PY/Makefile.am
src/SMESH_SWIG/smeshDC.py
src/StdMeshers/StdMeshers_Cartesian_3D.cxx
src/StdMeshers/StdMeshers_Hexa_3D.cxx
src/StdMeshers/StdMeshers_ImportSource.cxx
src/StdMeshers/StdMeshers_ImportSource.hxx
src/StdMeshers/StdMeshers_Import_1D.cxx
src/StdMeshers/StdMeshers_Prism_3D.cxx
src/StdMeshers/StdMeshers_Prism_3D.hxx
src/StdMeshers/StdMeshers_Regular_1D.cxx
src/StdMeshers/StdMeshers_ViscousLayers.cxx
src/StdMeshersGUI/StdMeshersGUI_CartesianParamCreator.cxx
src/StdMeshersGUI/StdMeshersGUI_CartesianParamCreator.h
src/StdMeshersGUI/StdMeshers_msg_en.ts
src/StdMeshersGUI/StdMeshers_msg_fr.ts
src/Tools/Makefile.am
src/Tools/MeshCut/Makefile.am
src/Tools/padder/Makefile.am [new file with mode: 0644]
src/Tools/padder/README.txt [new file with mode: 0644]
src/Tools/padder/doc/Makefile.am [new file with mode: 0755]
src/Tools/padder/doc/doxyfile.in [new file with mode: 0755]
src/Tools/padder/doc/images/SMESH_spadder_end.png [new file with mode: 0644]
src/Tools/padder/doc/images/SMESH_spadder_inputdialog_concrete.png [new file with mode: 0644]
src/Tools/padder/doc/images/SMESH_spadder_inputdialog_start.png [new file with mode: 0644]
src/Tools/padder/doc/images/SMESH_spadder_inputdialog_steelbar.png [new file with mode: 0644]
src/Tools/padder/doc/images/SMESH_spadder_menu.png [new file with mode: 0644]
src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_finished.png [new file with mode: 0644]
src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_ready.png [new file with mode: 0644]
src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_running.png [new file with mode: 0644]
src/Tools/padder/doc/images/SMESH_spadder_plugindialog_published.png [new file with mode: 0644]
src/Tools/padder/doc/images/SMESH_spadder_plugindialog_start.png [new file with mode: 0644]
src/Tools/padder/doc/images/SMESH_spadder_start.png [new file with mode: 0644]
src/Tools/padder/doc/input/padder_userguide.doc [new file with mode: 0644]
src/Tools/padder/meshjob/Makefile.am [new file with mode: 0644]
src/Tools/padder/meshjob/idl/MESHJOB.idl [new file with mode: 0644]
src/Tools/padder/meshjob/idl/Makefile.am [new file with mode: 0644]
src/Tools/padder/meshjob/idl/SPADDERPluginTest.idl [new file with mode: 0644]
src/Tools/padder/meshjob/impl/Makefile.am [new file with mode: 0644]
src/Tools/padder/meshjob/impl/MeshJobManager_i.cxx [new file with mode: 0644]
src/Tools/padder/meshjob/impl/MeshJobManager_i.hxx [new file with mode: 0644]
src/Tools/padder/meshjob/impl/SPADDERPluginTester_i.cxx [new file with mode: 0644]
src/Tools/padder/meshjob/impl/SPADDERPluginTester_i.hxx [new file with mode: 0644]
src/Tools/padder/meshjob/impl/testhelper.hxx [new file with mode: 0644]
src/Tools/padder/resources/Makefile.am [new file with mode: 0644]
src/Tools/padder/resources/SPADDERCatalog.xml [new file with mode: 0644]
src/Tools/padder/resources/appligen/CatalogResources.xml [new file with mode: 0644]
src/Tools/padder/resources/appligen/Makefile.am [new file with mode: 0644]
src/Tools/padder/resources/appligen/README.txt [new file with mode: 0644]
src/Tools/padder/resources/appligen/SalomeApp.xml [new file with mode: 0644]
src/Tools/padder/resources/appligen/appli-splashscreen.jpg [new file with mode: 0644]
src/Tools/padder/resources/appligen/appligen.sh.in [new file with mode: 0755]
src/Tools/padder/resources/appligen/config_appli.xml.in [new file with mode: 0644]
src/Tools/padder/resources/appligen/genenv.sh [new file with mode: 0755]
src/Tools/padder/resources/padderexe/Makefile.am [new file with mode: 0644]
src/Tools/padder/resources/padderexe/buildparticules.py [new file with mode: 0755]
src/Tools/padder/resources/padderexe/envPadder.sh.in [new file with mode: 0644]
src/Tools/padder/resources/padderexe/med2/REF_FinalEDMesh.med [new file with mode: 0644]
src/Tools/padder/resources/padderexe/med2/REF_spheres.dat.xyz [new file with mode: 0644]
src/Tools/padder/resources/padderexe/med2/concrete.med [new file with mode: 0644]
src/Tools/padder/resources/padderexe/med2/data.txt [new file with mode: 0644]
src/Tools/padder/resources/padderexe/med2/ferraill.med [new file with mode: 0644]
src/Tools/padder/resources/padderexe/med2/ferrtran.med [new file with mode: 0644]
src/Tools/padder/resources/padderexe/med2/padder.exe [new file with mode: 0755]
src/Tools/padder/resources/padderexe/med3/concrete.med [new file with mode: 0644]
src/Tools/padder/resources/padderexe/med3/data.txt [new file with mode: 0644]
src/Tools/padder/resources/padderexe/med3/ferraill.med [new file with mode: 0644]
src/Tools/padder/resources/padderexe/med3/padder.exe [new file with mode: 0755]
src/Tools/padder/resources/padderexe/padder.sh [new file with mode: 0755]
src/Tools/padder/resources/padderexe/particules.png [new file with mode: 0644]
src/Tools/padder/spadderpy/Makefile.am [new file with mode: 0644]
src/Tools/padder/spadderpy/__init__.py [new file with mode: 0644]
src/Tools/padder/spadderpy/configreader.py [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/Makefile.am [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/__init__.py [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/addinput.png [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/clear.png [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/compute.png [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/concrete.png [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/deleteinput.png [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/input.png [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/inputdata.py [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/inputdialog.py [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/inputframe.ui [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/parameters.png [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/plugindialog.py [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/plugindialog.ui [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/publish.png [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/refresh.png [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/select.png [new file with mode: 0644]
src/Tools/padder/spadderpy/gui/steelbar.png [new file with mode: 0644]
src/Tools/padder/spadderpy/padder.cfg.in [new file with mode: 0644]
src/Tools/padder/spadderpy/plugin/Makefile.am [new file with mode: 0644]
src/Tools/padder/spadderpy/plugin/envPlugins.sh.in [new file with mode: 0644]
src/Tools/padder/spadderpy/plugin/smesh_plugins.py [new file with mode: 0755]
src/Tools/padder/unittests/Makefile.am [new file with mode: 0644]
src/Tools/padder/unittests/__init__.py [new file with mode: 0644]
src/Tools/padder/unittests/autotest.sh.in [new file with mode: 0644]
src/Tools/padder/unittests/usecase_meshJobManager.py [new file with mode: 0644]
src/Tools/padder/unittests/usecase_spadderPluginTester.py [new file with mode: 0644]

index aaf432892e4a10acd8a7e16880b528b123cda7dd..b782b886e176f67c4c03f92648c9c6f3b7a0ab57 100644 (file)
@@ -48,6 +48,8 @@ salomeinclude_DATA = SMESH_version.h
 EXTRA_DIST +=          \
        build_configure \
        clean_configure \
+       build_cmake     \
+       build_cmake.bat \
        LICENCE
 
 dist-hook:
index 77936ec88f900e083386e3e0a13d8ac5fdf1fc99..feb12fc58cb2a23918d8cdacfdd04074dc4e3fe2 100644 (file)
@@ -39,6 +39,12 @@ salomescriptdir    = $(bindir)
 salomepythondir    = $(pythondir)/salome
 salomepyexecdir    = $(pyexecdir)/salome
 
+# Root directory of the python packages of SMESH
+smeshpypkgdir      = $(salomepythondir)/salome/smesh
+
+# Directory for installing SALOME plugins files
+salomepluginsdir    = $(prefix)/share/salome/plugins/@MODULE_NAME@
+
 # Directory for installing idl files
 salomeidldir       = $(prefix)/idl/salome
 
index b1de4d2f45e7cd109f0c36159360abe1fd496734..f7569d1ce96b8d0bd5230f5afd55d64419d4320b 100644 (file)
@@ -24,7 +24,7 @@
 # Modified by : Alexander BORODIN (OCN) - autotools usage
 # Created from configure.in.base
 #
-AC_INIT([Salome2 Project SMESH module], [6.3.1], [webmaster.salome@opencascade.com], [SalomeSMESH])
+AC_INIT([Salome2 Project SMESH module], [6.4.0], [webmaster.salome@opencascade.com], [SalomeSMESH])
 AC_CONFIG_AUX_DIR(adm_local/unix/config_files)
 AC_CANONICAL_HOST
 AC_CANONICAL_TARGET
@@ -302,6 +302,22 @@ if test "${gui_ok}" = "yes"; then
 
     CHECK_QT
 
+    echo
+    echo ---------------------------------------------
+    echo testing sip
+    echo ---------------------------------------------
+    echo
+
+    CHECK_SIP
+
+    echo
+    echo ---------------------------------------------
+    echo testing pyqt
+    echo ---------------------------------------------
+    echo
+
+    CHECK_PYQT
+
     echo
     echo ---------------------------------------------
     echo Testing qwt
@@ -366,6 +382,14 @@ echo ---------------------------------------------
 echo
 CHECK_SPHINX
 
+echo
+echo ---------------------------------------------
+echo testing libxm
+echo ---------------------------------------------
+echo
+dnl Check the libxml that will be required to use the SALOME launcher
+CHECK_LIBXML
+
 echo
 echo ---------------------------------------------
 echo Testing Kernel
@@ -520,6 +544,25 @@ AC_OUTPUT([ \
   src/SMESH_PY/Makefile \
   src/Tools/Makefile \
   src/Tools/MeshCut/Makefile \
+  src/Tools/padder/Makefile \
+  src/Tools/padder/meshjob/Makefile \
+  src/Tools/padder/meshjob/idl/Makefile \
+  src/Tools/padder/meshjob/impl/Makefile \
+  src/Tools/padder/spadderpy/Makefile \
+  src/Tools/padder/spadderpy/padder.cfg \
+  src/Tools/padder/spadderpy/gui/Makefile \
+  src/Tools/padder/spadderpy/plugin/Makefile \
+  src/Tools/padder/spadderpy/plugin/envPlugins.sh \
+  src/Tools/padder/resources/Makefile \
+  src/Tools/padder/resources/appligen/Makefile \
+  src/Tools/padder/resources/appligen/appligen.sh \
+  src/Tools/padder/resources/appligen/config_appli.xml \
+  src/Tools/padder/resources/padderexe/Makefile \
+  src/Tools/padder/resources/padderexe/envPadder.sh \
+  src/Tools/padder/unittests/Makefile \
+  src/Tools/padder/unittests/autotest.sh \
+  src/Tools/padder/doc/Makefile \
+  src/Tools/padder/doc/doxyfile \
   resources/Makefile \
   resources/SMESHCatalog.xml \
   resources/SalomeApp.xml \
index e5c494e5126a7ac624d960528b11dff455cd6b26..3edbc8c0acd9425e05052a2f2ea6d1996b35437d 100644 (file)
@@ -25,6 +25,7 @@
 # source path
 #
 SUBDIRS = salome docutils
+#SUBDIRS = salome
 
 usr_docs:
        (cd salome && $(MAKE) $(AM_MAKEFLAGS) usr_docs)
index b2bb21f71a929e641e5406a06260ccadd2123816..1aea4dc5494e4d9f14d68e55e8940213e6ee72e7 100644 (file)
@@ -184,7 +184,7 @@ latex_documents = [
 
 # The name of an image file (relative to this directory) to place at the top of
 # the title page.
-latex_logo = '../salome/tui/images/head.png'
+latex_logo = '@srcdir@/../salome/tui/images/head.png'
 
 # For "manual" documents, if this is true, then toplevel headings are parts,
 # not chapters.
index aec3397c21c0a1bc0feac8be8f44e13378c69c30..b303e848785979eda4c6567379f94d8e149877b6 100755 (executable)
@@ -38,10 +38,10 @@ WARNINGS          = YES
 #---------------------------------------------------------------------------
 #Input related options
 #---------------------------------------------------------------------------
-INPUT             = @srcdir@/input               
+INPUT             = @srcdir@/input @top_srcdir@/src/Tools/padder/doc/input
 FILE_PATTERNS     = *.doc
 EXCLUDE           = 
-IMAGE_PATH        = @srcdir@/images
+IMAGE_PATH        = @srcdir@/images @top_srcdir@/src/Tools/padder/doc/images
 EXAMPLE_PATH      = @top_srcdir@/src/SMESH_SWIG
 
 #---------------------------------------------------------------------------
diff --git a/doc/salome/gui/SMESH/images/cartesian3D_hyp.png b/doc/salome/gui/SMESH/images/cartesian3D_hyp.png
new file mode 100644 (file)
index 0000000..b8373ed
Binary files /dev/null and b/doc/salome/gui/SMESH/images/cartesian3D_hyp.png differ
diff --git a/doc/salome/gui/SMESH/images/cartesian3D_sphere.png b/doc/salome/gui/SMESH/images/cartesian3D_sphere.png
new file mode 100644 (file)
index 0000000..45bffda
Binary files /dev/null and b/doc/salome/gui/SMESH/images/cartesian3D_sphere.png differ
index 274ab74385be74e34b0cb05252da168a7eccce53..828561875cecbf658289620f4379e0ddd355ce7f 100644 (file)
@@ -23,10 +23,8 @@ shape of a mesh.</li>
 <ul>
 <li>Triangle meshing algorithms (Mefisto, Netgen 1D-2D and BLSUFR ) - Faces
 are split into triangular elements.</li>
-<li>Quadrangle meshing algorithm (Mapping) - Faces are split into
+<li>Quadrangle meshing algorithm (Mapping) - quadrilateral Faces are split into
 quadrangular elements.</li>
-<li>Radial quadrangle 1D2D algorithm - Faces (circles or part of circles)
-are split into triangular and quadrangle elements.</li>
 </ul>
 
 \image html image123.gif "Example of a triangular 2D mesh"
@@ -36,10 +34,14 @@ are split into triangular and quadrangle elements.</li>
 <li>For meshing of 3D entities (<b>volume objects</b>):</li>
 
 <ul>
-<li>Hexahedron meshing algorithm (i,j,k) - Volumes are split into
+<li>Hexahedron meshing algorithm (i,j,k) - 6-sided Volumes are split into
 hexahedral (cubic) elements.</li>
 <li>Tetrahedron (Netgen and GHS3D) meshing algorithms - Volumes are split into
 tetrahedral (pyramidal) elements.</li>
+<li>\subpage cartesian_algo_page</li>
+internal parts of Volumes are split into hexahedral elements forming a
+Cartesian grid; polyhedra and other types of elements are generated
+where the geometrical boundary intersects Cartesian cells.</li>
 </ul>
 
 \image html image125.gif "Example of a tetrahedral 3D mesh"
index c5cc5c8e277cf338560cedea8ef6659e9b33cb72..2f39999da8085a61d47915b130ac77f7dad38470 100644 (file)
@@ -96,8 +96,8 @@ not sewed faces.
   <li>"PreCAD" is an auxiliary CAD pre-processing module which has 
   two main goals:
   <ul>
-    <li> Complete missing or inadequate CAD-description.</li>
-    <li>Perform topology reconstruction and specific geometry 
+    <li> Complete missing or inadequate CAD descriptions.</li>
+    <li> Perform topology reconstruction and specific geometry 
     enhancement for mesh generation.</li>
   </ul>
   This module requires a specific licence.
@@ -105,15 +105,15 @@ not sewed faces.
   The following PreCAD options are the most significant and important ones:
   <ul>
   <li><b>Merge Edges</b> - allows PreCAD to optimize the geometry by merging some
-  edges. Default is 0.</li>
+  edges. This option is 0 by default.</li>
   <li><b>Remove nano edges</b> - allows PreCAD to optimize the geometry by removing 
-  the nano edges whenever possible. Default is 0.</li>
+  the nano edges whenever possible. This option is 0 by default.</li>
   <li><b>Nano edge length</b> - gives the length below which an edge is considered as nano 
   for the topology processing. See also the \b remove_nano_edges option. If unset, PreCAD
   default value is \f$\mathrm{diag} \times 10^{-5}\f$.</li>
   <li><b>Discard input topology</b> - computes the CAD topology from scratch, 
   without considering the toplogical information contained in the original CAD
-  (Useful for iges files). Default is 0.</li>
+  (Useful for iges files). This option is 0 by default.</li>
   </ul>
   </li>
 </ul>
@@ -208,29 +208,34 @@ files. Default is 1.</li>
 The following PreCAD options are commonly usable. 
 <ul>
 <li>\b closed_geometry (int) - describes whether the working geometry 
-should be closed or not. When activated, this option helps PreCAD to treat 
-the most dirtiest geometries. Default is 0.</li>
+should be closed or not. When activated, this option helps PreCAD to process 
+the dirtiest geometries. By default this option is 0.</li>
 <li>\b debug (int) - If debug = 1 PreCAD will be very verbose and will output 
-some intermediate files in the working directory. Default is 0.</li>
-<li>\b eps_nano_relative (real) -  Same as \b eps_nano but given in relatively to 
-the diagonal of the box bounding the geometry. Default is \f$10^{-5}\f$.</li>
+some intermediate files in the working directory. By default this
+option is 0.</li>
+<li>\b eps_nano_relative (real) -  the same as \b eps_nano, but relatively to 
+the diagonal of the box bounding the geometry. By default this option is \f$10^{-5}\f$.</li>
 <li>\b eps_sewing (real) - tolerance of the assembly. It rarely requires to be tuned. 
-Default is \f$\mathrm{diag} \times 5 \cdot 10^{-4}\f$.</li>
-<li>\b eps_sewing_relative (real) -  Same as \b eps_nano but given in relatively to 
-the diagonal of the box bounding the geometry. Default is \f$5 \cdot 10^{-4}\f$.</li>
+By default this option is \f$\mathrm{diag} \times 5 \cdot 10^{-4}\f$.</li>
+<li>\b eps_sewing_relative (real) -  the same as \b eps_nano but relatively to 
+the diagonal of the box bounding the geometry. By default this option is \f$5 \cdot 10^{-4}\f$.</li>
 <li>\b manifold_geometry (int) - describes whether the working geometry should be manifold or not.
-When activated, this option helps PreCAD to treat the most dirtiest geometries. Default is 0.</li>
-<li>\b create_tag_collision (int) - creates some new tags from original ones in case 
-of collision (entity merge or association for example). Default is 0.</li>
-<li>\b periodic_tolerance (real) - defines the maximum distance error accepted between 
-two sets of periodic entities. Default is \f$\mathrm{diag} \times 10^{-5}\f$.</li>
-<li>\b periodic_tolerance_relative (real) -  Same as \b periodic_tolerance but in relative
-unit. Default is \f$10^{-5}\f$.</li>
-<li>\b periodic_split_tolerance (real) - This periodicity processing related option defines 
+When activated, this option helps PreCAD to process the dirtiest
+geometries. By default this option is 0.</li>
+<li>\b create_tag_collision (int) - creates new tags from original ones in case 
+of collision (entity merge or association for example). By default
+this option is 0.</li>
+<li>\b periodic_tolerance (real) - defines the maximum distance error accepted between 
+two sets of periodic entities. By default this option is \f$\mathrm{diag} \times 10^{-5}\f$.</li>
+<li>\b periodic_tolerance_relative (real) -  the same as \b
+periodic_tolerance but in a relative unit. Bu default this option is \f$10^{-5}\f$.</li>
+<li>\b periodic_split_tolerance (real) - This periodicity processing related option defines 
 the minimum distance between a CAD point and an imprinted point. It allows to indirectly 
-control the number of points and small edges created. Default is \f$\mathrm{diag} \times 10^{-4}\f$.</li>
-<li>\b periodic_split_tolerance_relative (real -  Same as \b periodic_split_tolerance but in
-relative unit. Default is \f$10^{-4}\f$.</li>
+control the number of created points and small edges. By default this
+option is \f$\mathrm{diag} \times 10^{-4}\f$.</li>
+<li>\b periodic_split_tolerance_relative (real -  the same as \b
+periodic_split_tolerance but in a relative unit. By default this
+option is \f$10^{-4}\f$.</li>
 </ul>
 
 \n
diff --git a/doc/salome/gui/SMESH/input/cartesian_algo.doc b/doc/salome/gui/SMESH/input/cartesian_algo.doc
new file mode 100644 (file)
index 0000000..89b11e9
--- /dev/null
@@ -0,0 +1,75 @@
+/*!
+
+\page cartesian_algo_page Body Fitting 3D meshing algorithm
+
+Body Fitting algorithm generates hexahedrons of a Cartesian grid in
+the internal part of geometry and polyhedra and other types of
+elements at the intersection of Cartesian cells with the geometrical
+boundary.
+
+\image html cartesian3D_sphere.png "A shpere meshed by Body Fitting algorithm"
+
+The meshing algorithm is as follows.
+<ol>
+<li> Lines of a Cartesian structured grid defined by
+\ref cartesian_hyp_anchor "Body Fitting Parameters" hypothesis are
+intersected with the geometry boundary, thus nodes lying on the
+boundary are found. This step also allows finding out for each node of
+the Cartesian grid if it is inside or outside the geometry. </li>
+<li> For each cell of the grid, check how many of its nodes are outside
+of the geometry boundary. Depending on a result of this check
+<ul>
+<li> skip a cell, if all its nodes are outside </li>
+<li> skip a cell, if it is too small according to <b> Size
+    Threshold </b> paremeter</li>
+<li> add a hexahedron in the mesh, if all nodes are inside </li>
+<li> add a polyhedron or another cell type in the mesh, if some
+nodes are inside and some outside. </li> 
+</ul>
+</li>
+</ol>
+To apply this algorithm when you define your mesh, select <b>Body
+  Fitting</b> in the list of 3D algorithms and click <em> "Add
+  Hypothesis" </em> button and <em>"Body Fitting Parameters"</em>" menu
+  item. Dialog of <b>Body Fitting Parameters
+  hypothesis</b> will appear.
+
+<br>
+\anchor cartesian_hyp_anchor
+<h2>Body Fitting Parameters hypothesis</h2>
+
+\image html cartesian3D_hyp.png "Body Fitting Parameters hypothesis dialog"
+
+This dialog allows to define
+<ul>
+<li>\b Name of the algorithm </li>
+<li> Minimal size of a cell truncated by the geometry boundary. If the
+  size of a truncated grid cell is \b Threshold times less than a
+  initial cell size, then a mesh element is not created. </li>
+<li> Cartesian structured grid. Each grid axis is defined
+  individually. <b> Definition mode </b> chooses a way of grid
+  definition: <ul> 
+  <li> You can specify the \b Coordinates of grid nodes. \b Insert button
+    inserts a node at distance \b Step (negative or positive) from a
+    selected node. \b Delete button removes a selected node. Double
+    click on a coordinate in the list enables its edition. A grid
+    defined by \b Coordinates should enclose the geometry, else the
+    algorithm will fail. </li>
+  <li> You can define the \b Spacing of a grid as an algebraic formular 
+    <em>f(t)</em> where \a t is a position along a grid axiz
+    normalized at [0.0,1.0]. The whole range of geometry can be
+    divided into sub-ranges with their own spacing formulars to apply;
+    \a t varies between 0.0 and 1.0 within each sub-range. \b Insert button
+    divides a selected range into two ones. \b Delete button adds the
+    selected sub-range to the previous one. Double click on a range in
+    the list enables edition of its right boundary. Double click on a
+    function in the list enables its edition. 
+  </li> </ul>
+</li>
+</ul>
+
+<br>
+<b>See Also</b> a sample TUI Script of a 
+\ref tui_cartesian_algo "Usage of Body Fitting algorithm".  
+
+*/
index df3e39495f7902a152e70f6465df1f64c3fd70c9..2bfa8292bc6ba53c8415e91b4d1dda2c871d8972 100644 (file)
@@ -9,15 +9,20 @@ To start, click on the \em New button.
 
 \image html a-clipping2.png
 
-Now you can define the parameters of your cross-section: list of
-<b>meshes, sub-meshes and groups</b> the cross-section will be applied to
-(<b>Select all</b> button allows to select and deselect all available
-objects at once), \b Orientation (X-Y, X-Z or Y-Z); \b Distance between the
-opposite extremities of the boundary box of selected objects, if it is set
-to 0.5 the boundary box is split in two halves; and \b Rotation (in angle
-degrees) <b>around X</b> (Y to Z) and <b>around Y</b> (X to Z).
-If the <b>Show preview</b> button is on, you can see the clipping plane
-in the <b>3D Viewer</b>.
+Now you can define the parameters of cross-section: 
+<ul>
+<li> List of <b>meshes, sub-meshes and groups</b> to which the cross-section will be applied.
+/n <b>Select all</b> button allows to select and deselect all available
+objects at once).</li>
+<li> \b Orientation (X-Y, X-Z or Y-Z).</li>
+<li> \b Distance between the opposite extremities of the boundary box
+of selected objects, if it is set
+to 0.5 the boundary box is split in two halves. </li>
+<li> \b Rotation (in angle
+degrees) <b>around X</b> (Y to Z) and <b>around Y</b> (X to Z).</li>
+<li>If the <b>Show preview</b> button is on, you can see the clipping plane
+in the <b>3D Viewer</b>.</li>
+</ul>
 
 \image html image79.jpg "The plane and the cut object"
 
index 1eb84f0cabfd201ac63e2aa5f130da01623f4f6d..1ac27a494152e7ee46b2eadc3802a86282a1968f 100644 (file)
@@ -9,11 +9,11 @@ parameters:
 <ul>
 <li><b>Elements</b></li>
 <ul>
-<li><b>Surface color</b> - color of surface of elements (seen in Shading mode).</li>
-<li><b>Back surface color</b> - color of interior surface of elements. Use slider to select this color. This color 
-generated on base of the <b>Surface color</b> by changing it's brightness and saturation.</li>
-<li><b>Outline color</b> - color of borders of elements.</li>
-<li><b>Wireframe color</b> - color of borders of elements in wireframe mode.</li>
+<li><b>Surface color</b> - surface color of elements (seen in Shading mode).</li>
+<li><b>Back surface color</b> - interior surface color of elements. Use slider to select this color 
+generated on base of the <b>Surface color</b> by changing its brightness and saturation.</li>
+<li><b>Outline color</b> - color of element borders.</li>
+<li><b>Wireframe color</b> - color of element borders in wireframe mode.</li>
 <li><b>0D slements</b> - color of 0D elements.</li>
 <li><b>Size of 0D slements</b> - size of 0D elements.</li>
 <li><b>Width</b> - width of lines (edges and borders of elements).</li>
@@ -34,4 +34,4 @@ generated on base of the <b>Surface color</b> by changing it's brightness and sa
 </ul>
 </ul>
 
-*/
\ No newline at end of file
+*/
index de0953a5592fc06c5383ce201f35b2517da7c783..966e091fe04a83a4fd0970ab76ca81e0447ff651 100644 (file)
@@ -2,10 +2,10 @@
 
 \page creating_groups_page Creating groups
 
-\n In MESH you can create groups of elements of a certain type whose
-contents is defined in different ways. To create a group, in the \b
+\n In MESH you can create a group of elements of a certain type. The
+contents of the group can be defined in different ways. To create a group, in the \b
 Mesh menu select <b>Create Group</b> item (also available in the
-contextual menu of the mesh).<br> 
+context menu of the mesh).<br> 
 To create a group of any type you should define the following: 
 <ul>
 <li><b>Mesh</b> - the mesh whose elements will form your
@@ -36,18 +36,18 @@ the following ways:
 <ul>
 <li>By adding all entities of the chosen type existing in the
   mesh. For this, turn on the <b>Select All</b> check box. In this mode
-  all controls, which allow selecting the entities in other ways are
+  all controls, which allow selecting the entities in other ways, are
   disabled.</li>
 <li>By applying the Filter. The <b>Set filter</b> button allows to
   define the filter for selection of the elements for your group. See more
   about filters on the 
   \ref selection_filter_library_page "Selection filter library" page.<br>
-  If the <b>Enable manual edition</b> check box is turned off, the defined
-  filter defines contents of the group. In this mode, the filter is
-  applied to all elements of the mesh. If none entity satisfies the
-  filter, the \b Apply button is disabled.<br>
+  If the <b>Enable manual edition</b> check box is turned off, the 
+  filter entirely defines the group contents. In this mode, the filter is
+  applied to all elements of the mesh. If there are no entities
+  corresponding to the filter, the \b Apply button is disabled.<br>
   If the <b>Enable manual edition</b> check box is turned on, the defined
-  filter can be used to for selection of entities composing the group.</li>
+  filter can be used to for selection of entities for the group.</li>
 <li>By choosing entities manually with the mouse in the 3D Viewer. For
   this, turn on the <b>Enable manual edition</b> check box. You can
   click on an element in the 3D viewer and it will be highlighted. After
@@ -56,11 +56,11 @@ the following ways:
 <li>By adding entities from either a submesh or an existing
   group.  For this, turn on the <b>Enable manual edition</b> check
   box. <b>Select from</b> set of fields allows to select a submesh or
-  a group of an appropriate type.</li>
+  a group of the appropriate type.</li>
 </ul>
 In the <b>manual edition</b> mode you can
 <ul>
-<li>click the \b Remove button to remove selected elements from the list</li>
+<li>click the \b Remove button to remove the selected elements from the list</li>
 <li>click the <b>Sort List</b> button to sort the list of IDs of 
 mesh elements.</li>
 </ul>
@@ -104,7 +104,7 @@ operation.
 To create a group on geometry check <b>Group on geometry</b> in the \b
 Group \b type field. The group on geometry contains the elements
 of a certain type generated on the selected geometrical object. Group
-contents is dynamically updated if the mesh is modified.<br>
+contents are dynamically updated if the mesh is modified.<br>
 To define a group, select in the Objet Browser or in the 3D viewer a
 geometrical object from which the elements will be taken. After
 confirmation of the operation a new group of mesh elements will be
@@ -121,12 +121,11 @@ created.
 operation.
 
 
-
 \anchor group_on_filter <br><h2>"Group on Filter"</h2>
 
 To create a group on filter check <b>Group on filter</b> in the <b>
 Group type</b> field. The group on filter contains the elements
-of a certain type satisfying the defined filter. Group contents is
+of a certain type satisfying the defined filter. Group contents are
 dynamically updated if the mesh is modified.<br> To define a group,
 click the <b>Set filter</b> button and define criteria of the
 filter in the opened dialog. After confirmation of the operation a
index d59bdcb1045a43e2c17e7cd0f6050030e590fc85..ca9b7a2228f5d652b2c776b5edaacf972d931582 100644 (file)
@@ -15,7 +15,7 @@ The following dialog box will appear:
 \image html editgroup.png
 
 In this dialog box you can modify the name and the color of your group
-despite of it's type. You can add or remove the elements forming the
+despite of its type. You can add or remove the elements forming a
 <em>standalone group</em>. You can change criteria of the filter of
 the <em>group on filter</em>. For more information see
 \ref creating_groups_page "Creating Groups" page.
@@ -35,8 +35,8 @@ Standalone</b> item.</li>
 \image html image74.gif
 <center><em>"Edit Group as Standalone" button</em></center>
 
-The selected group will be converted into a standalone group and can
-it's contents can be modified.
+The selected group will be converted into a standalone group and 
+its contents can be modified.
 
 <li>Click the \b Apply or <b>Apply and Close</b> button to confirm modification of the
 group.</li>
index c2216427b705598060ac05a262b9a586c86c6ad5..dfd0041f591b71097e86475d52061ada968e4af8 100644 (file)
@@ -122,7 +122,8 @@ for ghs3d, for example, advanced options. </li>
 \anchor ghs3d_enforced_vertices
 <h1>Enforced vertices</h1>
 
-\note This feature is currently only available on meshes with no geometry attached. Such meshes can be obtained by
+\note This feature is currently available only on meshes with no
+geometry attached. Such meshes can be obtained by
 <ul>
 <li>Copying an existing mesh</li>
 <li>Importing a mesh from file</li>
@@ -131,7 +132,8 @@ for ghs3d, for example, advanced options. </li>
 
 \image html ghs3d_enforced_vertices.png
 
-GHS3D algorithm can locally make the mesh finer. It is possible to define enforced vertices in the volume where the mesh will be detailed.
+GHS3D algorithm can locally make the mesh finer. It is possible to
+define enforced vertices in the volume where the mesh will be detailed.
 A node will be created at the enforced vertex coordinates.
 
 An enforced vertex is defined by:
@@ -142,14 +144,16 @@ An enforced vertex is defined by:
 <li>or from (x,y,z) cartesian coordinates</li>
 </ul>
 <li>A constant physical size</li>
-<li>If a group name is given, the created node will be added to the group. If the group does not exist, it is created.</li>
+<li>If a group name is given, the created node will be added to the
+group. If the group does not exist, it is created.</li>
 </ul>
 \ref ghs3d_top "Back to top"
 
 \anchor ghs3d_enforced_meshes
 <h1>Enforced Meshes</h1>
 
-\note This feature is currently only available on meshes with no geometry attached. Such meshes can be obtained by
+\note This feature is currently only available on meshes with no
+geometry attached. Such meshes can be obtained by
 <ul>
 <li>Copying an existing mesh</li>
 <li>Importing a mesh from file</li>
@@ -158,8 +162,9 @@ An enforced vertex is defined by:
 
 \image html ghs3d_enforced_meshes.png
 
-GHS3D algorithm can be forced by other meshes, sub-meshes or groups. The constraint elements should be contained
-entirely into the solid meshed.
+GHS3D algorithm can be forced by other meshes, sub-meshes or
+groups. The constraint elements should be contained
+entirely into the solid mesh.
 <ul>
 <li>The constraint element types are:
 <ul>
@@ -167,8 +172,10 @@ entirely into the solid meshed.
 <li>EDGE</li>
 <li>FACE</li>
 </ul></li>
-<li>If a size is given, the meshe will be refined around the enforced elements given the size</li>
-<li>If a group name is given, the enforced elements will be added to the group. If the group does not exist, it is created.</li>
+<li>If a size is given, the mesh will be refined around the enforced
+elements given the size</li>
+<li>If a group name is given, the enforced elements will be added to
+the group. If the group does not exist, it is created.</li>
 </ul>
 
 <br><b>See Also</b> a sample TUI Script of the \ref tui_ghs3d "creation of a Ghs3D hypothesis", including enforced vertices.
index 8d075463043193c59ed519fcf92e582d058deee7..9615ad4c39b858009442b9ac7afc3716e174520b 100644 (file)
@@ -6,39 +6,33 @@ In Mesh module it is possible to create groups of mesh elements:
 nodes, edges, faces or volumes. One group contains elements of only
 one type. The following ways of creation are possible:
 
-<ul>
-<li> by selecting the elements using filters and/or
-  directly on the presentation in the VTK viewer, and/or by using
-  elements of other mesh objects - <b>Standalone group</b> tab of 
-  \ref standalone_group "Create group" dialog.</li>
-<li> by creating a group of elements generated on the chosen
-  geometrical object - <b>Group on geometry</b> tab of \ref
-  creating_groups_page "Create group" dialog and \ref
-  create_groups_from_geometry_page "Create Groups from Geometry"
-  dialog.</li>
-<li> by creating a group of elements satisfying to certain critaria -
-  <b>Group on filter</b> tab of \ref creating_groups_page 
-  "Create group" dialog.</li>
-<li> by creating groups of nodes and elements from the chosen submesh
+- by selecting the elements using filters and/or directly on the 
+  presentation in the VTK viewer, and/or by using elements of other
+  mesh objects - \ref standalone_group "Standalone group"
+  tab of \ref creating_groups_page "Create group" dialog.
+- by creating a group of elements generated on the chosen geometrical
+  object - \ref group_on_geom "Group on geometry" tab of
+  \subpage creating_groups_page "Create group" dialog and
+  \subpage create_groups_from_geometry_page "Create Groups from Geometry"
+  dialog.
+- by creating a group of elements satisfying to certain criteria -
+  \ref group_on_filter "Group on filter" tab of
+  \subpage creating_groups_page "Create group" dialog.
+- by creating groups of nodes and elements from the chosen submesh
   (type of elements depends on dimension of submesh geometry) -
-  using <b>Mesh -> Construct Group</b> menu item (available in contextual
-  menu as well).</li>
-<li> by creating groups of entities from existing groups of superior
+  using <b>Mesh -> Construct Group</b> menu item (available in context
+  menu as well).
+- by creating groups of entities from existing groups of superior
   dimensions - using \subpage group_of_underlying_elements_page
-  "Create Group of Underlying Elements" dialog.</li>
-</ul>
-
+  "Create Group of Underlying Elements" dialog.
 
 The created groups can be later:
 
-<ul>
-<li>\subpage editing_groups_page "Edited"</li>
-<li>\subpage using_operations_on_groups_page "Subjected to Boolean operations"</li>
-<li>\subpage deleting_groups_page "Deleted"</li>
-</ul>
+- \subpage editing_groups_page "Edited"
+- \subpage using_operations_on_groups_page "Subjected to Boolean operations"
+- \subpage deleting_groups_page "Deleted"
 
 An important tool, providing filters for creation of \b Standalone
 groups is \ref selection_filter_library_page.
 
-
 */
index 0ab41a24df44a6cb6ec0d9041d4021bac569657e..a53257eefd4a6c997f9efe564a74ab493227ffb9 100644 (file)
@@ -7,7 +7,7 @@ elements of a higher dimension.
 
 <em>To generate border elements:</em>
 <ol>
-<li>Select a mesh or groups in the Object Browser or in the 3D Viewer</li>
+<li>Select a mesh or group in the Object Browser or in the 3D Viewer</li>
 <li>From the Modification menu choose "Create boundary elements"
 item, or click "Create boundary elements" button in the toolbar
 
index 933ac55ee6596eddec68e62519e09109e0557368..6ec4f71160ed1bdbb0f086e26ecbf362c1a20c05 100644 (file)
@@ -2,9 +2,8 @@
 
 \page max_element_length_2d_page Element Diameter 2D
 
-\n This quality control criterion consists of calculation of length of
-the edges and diagonals combining the meshing elements (triangles and quadrangles)
-of your mesh.
+\n This quality control criterion consists in calculation of the length of
+edges and diagonals combining 2D mesh elements (triangles and quadrangles).
 
 <em>To apply the Element Diameter 2D quality criterion to your mesh:</em>
 <ol>
@@ -26,4 +25,4 @@ applied mesh quality control criterion:
 <br><b>See Also</b> a sample TUI Script of a 
 \ref tui_max_element_length_2d "Element Diameter 2D quality control" operation.  
 
-*/
\ No newline at end of file
+*/
index 9326ad8377ddd633cd999f85f8d7093d036f7f78..7aa70ad7bac61de67d2878b8e815222407cc916e 100644 (file)
@@ -2,10 +2,9 @@
 
 \page max_element_length_3d_page Element Diameter 3D
 
-\n This quality control criterion consists of calculation of length of
-the edges and diagonals combining the 3D meshing elements
-(tetrahedrons, pyramids, pentahendrons, hexahedrons and polyhedrons)
-of your mesh.
+\n This quality control criterion consists in calculation of the length of
+edges and diagonals combining 3D mesh elements
+(tetrahedrons, pyramids, pentahendrons, hexahedrons and polyhedrons).
 
 <em>To apply the Element Diameter 3D quality criterion to your mesh:</em>
 <ol>
@@ -27,4 +26,4 @@ applied mesh quality control criterion:
 <br><b>See Also</b> a sample TUI Script of a 
 \ref tui_max_element_length_3d "Element Diameter 3D quality control" operation.  
 
-*/
\ No newline at end of file
+*/
index 27894a49aa19bca3d82f565148812567bef0c60b..6514cf287ddd2dcb712b6866dc4203abf0cf0fcf 100644 (file)
@@ -2,19 +2,19 @@
 
 \page measurements_page Measurements
 
-Mesh module provides possibility to perform different measurements
+Mesh module provides the possibility to perform different measurements
 of the selected mesh data.
 
-All the measurement operations are available via \b Measurements
-top-level menu. An access to the measurements operations is
-implemented via single dialog box, where each operation is represented
+All measurement operations are available via \b Measurements
+top-level menu. Access to the measurements operations is
+implemented via single dialog box, where each operation is represented
 as a separate tab page.
 
 \section min_distance_anchor Minimum Distance
 
-This operation allows measuring a distance between two objects.
+This operation allows measuring the distance between two objects.
 Currently only node-to-node and node-to-origin operations are
-available, but this operation will be extended in future to support
+available, but this operation will be extended in the future to support
 other mesh objects - elements, meshes, sub-meshes and groups.
 
 To start <b>Minimum Distance</b> operation, select <b>Minimum Distance</b>
@@ -22,9 +22,9 @@ item from \b Measurements menu.
 
 \image html min_distance.png
 
-In the dialog box choose the first target and second target mode by
-switching the corresponding radio buttons, then select the objects
-between which the distance is to be calculated (or enter directly IDs
+In the dialog box choose the first target and the second target mode by
+switching the corresponding radio buttons, then select the objects the distance
+between which is to be calculated (or input their IDs directly 
 in case of nodes/elements) and press \em Compute button.
 
 The following types of targets are supported:
@@ -35,7 +35,7 @@ version);
 - \em Origin: origin of the global co-ordinate system.
 
 The result will
-be shown in the bottom area of the dialog box. In addition, the simple
+be shown in the bottom area of the dialog box. In addition, a simple
 preview will be shown in the 3D viewer.
 
 \image html min_distance_preview.png
@@ -50,17 +50,16 @@ item from \b Measurements menu.
 
 \image html bnd_box.png
 
-In the dialog box choose desired type of the object by switching the
-corresponding radio button, select the desired object(s) and press
-\em Compute button.
+In the dialog box choose the required type of the object by switching the
+corresponding radio button, select the object(s) and press \em Compute button.
 
 The following types of input are available:
-- \em Objects: select one or more mesh, sub-mesh, group objects;
-- \em Nodes: select set of mesh nodes;
-- \em Elements: select set of mesh elements.
+- \em Objects: select one or several mesh, sub-mesh or group objects;
+- \em Nodes: select set of mesh nodes;
+- \em Elements: select set of mesh elements.
 
 The result of calculation will be shown in the bottom area of the
-dialog box. In addition, the simple preview will be shown in the 3D
+dialog box. In addition, a simple preview will be shown in the 3D
 viewer.
 
 \image html bnd_box_preview.png
index 1a34bc48b1bf218437780eebdbf3b75707350557..06a02d2cc1d90d5d356fe5badf49f6016df7b5a7 100644 (file)
@@ -2,7 +2,7 @@
 
 \page mesh_infos_page Mesh Information
 
-The user can obtain an information about the selected mesh object
+The user can obtain information about the selected mesh object
 (mesh, sub-mesh or group) using <b>Mesh Information</b> dialog box.
 
 To view the <b>Mesh Information</b>, select your mesh, sub-mesh or
@@ -14,12 +14,12 @@ in the toolbar.
 <center><em>"Mesh Information" button</em></center>
 
 The <b>Mesh Information</b> dialog box provides three tab pages:
-- <b>\ref advanced_mesh_infos_anchor "Base Info"</b> - to show base information about selected mesh
-object
-- <b>\ref mesh_element_info_anchor "Element Info"</b> - to show detail information about selected mesh
-node or element.
+- <b>\ref advanced_mesh_infos_anchor "Base Info"</b> - to show base
+information about the selected mesh object
+- <b>\ref mesh_element_info_anchor "Element Info"</b> - to show
+detailed information about the selected mesh node or element.
 - <b>\ref mesh_addition_info_anchor "Additional Info"</b> - to show additional information available
-for selected mesh, sub-mesh or group object.
+for the selected mesh, sub-mesh or group object.
 
 \anchor advanced_mesh_infos_anchor
 <h2>Base Information</h2>
@@ -56,7 +56,7 @@ The <b>Additional Info</b> tab page of the dialog box provides an
 additional information on the selected object: mesh, sub-mesh or
 group.
 
-For mesh object, the following information is shown:
+For mesh object, the following information is shown:
 - Name
 - Type: based on geomerty, imported, standalone
 - Shape (if mesh is based on geometry)
@@ -68,7 +68,7 @@ For mesh object, the following information is shown:
 <center><em>"Additional Info" page, mesh information</em></center>
 <br>
 
-For sub-mesh object, the following information is shown:
+For sub-mesh object, the following information is shown:
 - Name
 - Parent mesh
 - Shape
@@ -77,7 +77,7 @@ For sub-mesh object, the following information is shown:
 <center><em>"Additional Info" page, sub-mesh information</em></center>
 <br>
 
-For group object, the following information is shown:
+For group object, the following information is shown:
 - Name
 - Parent mesh
 - Type: standalone, group on geometry, group on filter
@@ -90,12 +90,12 @@ For group object, the following information is shown:
 <center><em>"Additional Info" page, group information</em></center>
 <br>
 
-\note For the performance reasons, number of underlying nodes is
+\note For the performance reasons, the number of underlying nodes is
 computed only by demand. For this, the user should press the "Compute"
-button (see picture). Also, number of underlying nodes is
+button (see picture). Also, the number of underlying nodes is
 automatically calculated if the size of the group does not exceed
-limit set via the preferences - "Mesh information" group,
-"Automatic nodes compute limit" item (zero value means no limit).
+the "Automatic nodes compute limit" set via the  "Mesh information"
+preferences (zero value means no limit).
 
 In case you get <b>Mesh Information</b> via a TUI script, the information is
 displayed in the Python Console. 
index ca00dbd1a04538926e9be44b889d6a8f7d39d260..6c026f84a570cfabbbacb79419afe3c3c91058bd 100644 (file)
@@ -2,9 +2,11 @@
 
 \page over_constrained_faces_page Over-constrained faces
 
-\n This mesh quality control highlights faces sharing only one of its borders with other faces. In other words the faces having all there nodes on the external border of the mesh are highlighted.
+\n This mesh quality control highlights faces sharing only one border
+with other faces. In other words, the faces having all thier nodes on
+the external border of the mesh are highlighted.
 
-\note The highlighted faces are actually over constrained only if, at the computation time, 
+\note The highlighted faces are actually over-constrained only if, at the computation time, 
 the boundary conditions on the borders where the nodes are located are all Dirichlet boundary conditions.
 
 \image html over_constrained_faces.png
index 9c11ebb0c6ae01eb467080a105c669e7bf763524..7f1ba280d70c78508bf1826b86d41c07686e7459 100644 (file)
@@ -2,10 +2,10 @@
 
 \page over_constrained_volumes_page Over-constrained volumes
 
-\n This mesh quality control highlights volumes sharing only one of its borders with other volumes.
-In other words the volumes having all there nodes on the external border of the mesh are highlighted.
+\n This mesh quality control highlights volumes sharing only one border with other volumes.
+In other words, the volumes having all their nodes on the external border of the mesh are highlighted.
 
-\note The highlighted volumes are actually over constrained only if, at the computation time, 
+\note The highlighted volumes are actually over-constrained only if, at the computation time, 
 the boundary conditions on the borders where the nodes are located are all Dirichlet boundary conditions.
 
 \image html over_constrained_volumes.png
@@ -15,4 +15,4 @@ In this picture the over-constrained volume is displayed in red.
 <br><b>See Also</b> a sample TUI Script of a 
 \ref tui_over_constrained_volumes "Over-constrained volumes" filter.  
 
-*/
\ No newline at end of file
+*/
index 69ea855d67f65a257c242cf0a39b8c8d7c106006..dcbae8db4056b95ac68be47f352b383f4e82feb9 100644 (file)
@@ -26,7 +26,7 @@ the created \b Edge.
 <br>
 For a group of edges, <b>Source</b> and <b>Target</b> vertices should be
 shared by one edge of the group. If <b>Source</b> and <b>Target</b>
-vertices are specified, the elements of the group must be ajacent.
+vertices are specified, the elements of the group must be adjacent.
 The source and target groups must contain equal number of edges
 and they must form topologically equal structures.
 
@@ -56,13 +56,12 @@ For groups of face, they must contain equal number of faces
 and they must form topologically equal structures.
 
 \n <b>Projection 1D-2D</b> algorithm differs from <b>Projection 2D</b>
-algorithm in one point, namely it generates mesh segments on edges of
+algorithm in one aspect: it generates mesh segments on edges of
 the face according to the projected 2D elements; thus it does not
-require that edges to be meshed by any other 1D algorithm; moreover it
+require the edges to be meshed by any other 1D algorithm; moreover it
 does not allow to mesh edges of the face using another algorithm via
 definition of sub-meshes.
 
-
 \n <b>Projection 3D</b> algorithm allows to define the mesh of a shape by
 the projection of another already meshed shape.  This algorithm works
 only if all faces and edges of the target shape have been meshed as 1D-2D
index 823643d80defc1d75404b75882ff2b23ad0dd65d..0e83703c4e11b46096e87934a8ef72fdac933b1a 100644 (file)
@@ -180,7 +180,7 @@ normal to the neighboring face and the normal to the selected face is less then
 angular tolerance (defined in degrees). Selection continues among all neighbor faces of already 
 selected ones.<br>
 </li><li>
-<b>Element Diameter 2D</b> selects triangles and quadrangles combining of the edges and
+<b>Element Diameter 2D</b> selects triangles and quadrangles composed of the edges and
 diagonals with a value of length, which is more, less or equal
 (within a given <b>Tolerance</b>) to the predefined <b>Threshold Value</b>. See also a
 \ref max_element_length_2d_page "Element Diameter 2D quality control".
@@ -197,7 +197,7 @@ Additional criteria to select mesh <b>Volumes</b> are the following:
 \ref volume_page "Volume quality control"), which is more, less or equal (within a given
 <b>Tolerance</b>) to the predefined <b>Threshold Value</b>.
 </li><li>
-<b>Element Diameter 3D</b> selects 3D mesh elements combining of the edges and
+<b>Element Diameter 3D</b> selects 3D mesh elements composed of the edges and
 diagonals with a value of length, which is more, less or equal
 (within a given <b>Tolerance</b>) to the predefined <b>Threshold Value</b>. See also a
 \ref max_element_length_3d_page "Element Diameter 3D quality control".
index a677107cffeab97a17127d6319daa1667c3d08de..84663c93d5f9f7654011d4ffe99b460cc4ea316a 100644 (file)
@@ -130,6 +130,7 @@ Examples of Python scripts for all Mesh operations are available by
 the following links:
 
 - \subpage tui_creating_meshes_page
+- \subpage tui_cartesian_algo
 - \subpage tui_viewing_meshes_page
 - \subpage tui_defining_hypotheses_page
 - \subpage tui_quality_controls_page
diff --git a/doc/salome/gui/SMESH/input/tui_cartesian_algo.doc b/doc/salome/gui/SMESH/input/tui_cartesian_algo.doc
new file mode 100644 (file)
index 0000000..f121843
--- /dev/null
@@ -0,0 +1,49 @@
+/*!
+
+\page tui_cartesian_algo Usage of Body Fitting algorithm
+
+\code
+from smesh import *
+SetCurrentStudy(salome.myStudy)
+
+# create a sphere
+sphere = geompy.MakeSphereR( 50 )
+geompy.addToStudy( sphere, "sphere" )
+
+# create a mesh and assign a "Body Fitting" algo
+mesh = Mesh( sphere )
+cartAlgo = mesh.BodyFitted()
+
+# define a cartesian grid using Coordinates
+coords = range(-100,100,10)
+cartHyp = cartAlgo.SetGrid( coords,coords,coords, 1000000)
+
+# compute the mesh
+mesh.Compute()
+print "nb hexahedra",mesh.NbHexas()
+print "nb tetrahedra",mesh.NbTetras()
+print "nb polyhedra",mesh.NbPolyhedrons()
+print
+
+# define the grid by sitting constant spacing
+cartHyp = cartAlgo.SetGrid( "10","10","10", 1000000)
+
+mesh.Compute()
+print "nb hexahedra",mesh.NbHexas()
+print "nb tetrahedra",mesh.NbTetras()
+print "nb polyhedra",mesh.NbPolyhedrons()
+
+
+# define the grid by sitting different spacing in 2 sub-ranges of geometry
+spaceFuns = ["5","10+10*t"]
+cartAlgo.SetGrid( [spaceFuns, [0.5]], [spaceFuns, [0.5]], [spaceFuns, [0.25]], 2 )
+
+mesh.Compute()
+print "nb hexahedra",mesh.NbHexas()
+print "nb tetrahedra",mesh.NbTetras()
+print "nb polyhedra",mesh.NbPolyhedrons()
+print
+
+\endcode
+
+*/
index 9f77b3b62d81ae222b347e012933d45656ae932e..3634ccf6046e4a3a85e4e221a6df40abb3f7ba2c 100644 (file)
@@ -3,9 +3,9 @@
 \page import_algos_page Use Existing Elements Algorithms
 
 \n <em>Use Existing Elements </em>algorithms allow to define the mesh of a geometrical
-object by the importing suitably located mesh elements from another
-mesh. The mesh elements to import from the other mesh are to be contained in
-groups. If several groups are used to mesh one geometry, validity of
+object by importing suitably located mesh elements from another
+mesh. The mesh elements to import from the other mesh should be contained in
+groups. If several groups are used to mesh the same geometry, validity of
 nodal connectivity of result mesh must be assured by connectivity of
 the source mesh; no geometrical checks are performed to merge
 different nodes at same locations.
@@ -32,9 +32,9 @@ In this dialog box you can define
 <ul>
 <li>The \b Name of the algorithm. </li>
 <li>The <b>Groups of Edges</b> to import 1D elements from.
-<li>The <b>To copy mesh</b> checkbox is to import not only the edges of
-the selected <b>Groups of Edges</b> but to copy the whole source
-mesh. In this case <b>To copy groups</b>, if checked, forces creating
+<li><b>To copy mesh</b> checkbox allows to import not only the edges of
+the selected <b>Groups of Edges</b>, but the whole source
+mesh. In this case <b>To copy groups</b> checkbox allows to create
 the same groups as in the imported source mesh.</li>
 </ul>
 
@@ -52,10 +52,10 @@ The following dialog box will appear:
 In this dialog box you can define 
 <ul>
 <li>The \b Name of the algorithm. </li>
-<li>The <b>Groups of Faces</b> to import 2D elements from.
-<li>The <b>To copy mesh</b> checkbox is to import not only the faces of
-the selected <b>Groups of Faces</b> but to copy the whole source
-mesh. In this case <b>To copy groups</b>, if checked, forces creating
+<li>The <b>Groups of Edges</b> to import 1D elements from.
+<li><b>To copy mesh</b> checkbox allows to import not only the edges of
+the selected <b>Groups of Edges</b>, but the whole source
+mesh. In this case <b>To copy groups</b> checkbox allows to create
 the same groups as in the imported source mesh.</li>
 </ul>
 
index d5e3e13ee4b0409cbab2074819cf3c1d1f895260..e35ac049b1f34c2a873f76d1270417f3410825df 100644 (file)
@@ -23,7 +23,7 @@
 #
 include $(top_srcdir)/adm_local/unix/make_common_starter.am
 
-EXTRA_DIST += images static/doxygen.css static/footer.html
+EXTRA_DIST += input images static/doxygen.css static/footer.html
 
 tuidocdir = $(docdir)/tui/SMESH
 tuidoc_DATA = images/head.png images/smeshscreen.png
diff --git a/doc/salome/tui/static/myheader.html b/doc/salome/tui/static/myheader.html
deleted file mode 100755 (executable)
index d2efb75..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
-   <title>Main Page</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head>
-<body>
-&nbsp;
-</body>
-</html>
index 8ee52b34189b8c768b1dc87aec61290636b5d0b8..e461074de21d6535f2edd31e76999ba2f5b47942 100644 (file)
@@ -1031,7 +1031,8 @@ module SMESH
      * \return TRUE if operation has been completed successfully, FALSE otherwise
      */
     boolean DoubleNodesOnGroupBoundaries( in ListOfGroups theDomains,
-                                          in boolean createJointElems );
+                                          in boolean createJointElems ) 
+      raises (SALOME::SALOME_Exception);
 
     /*!
      * \brief Double nodes on some external faces and create flat elements.
index 846e441c9396efc05067566c7f925af019d9751b..1e02043bf6b08e091c7dbe3f40f3ff99a582b626 100644 (file)
@@ -51,3 +51,6 @@ libMEFISTO2D_la_LDFLAGS = \
 #libMEFISTO2D_la_LDFLAGS += -lg2c
 #endif
 
+OBSOLETE_FILES = areteideale.f
+
+EXTRA_DIST += $(OBSOLETE_FILES)
index 0264d62eb58e13b6ca9a3508db07a06b61734c28..6b38c0ca43dd8974f880bac823579ec2c6423be3 100644 (file)
@@ -35,7 +35,9 @@ salomeinclude_HEADERS = \
        SMESH_PreviewActorsCollection.h \
        SMESH_ExtractGeometry.h \
        SMESH_FaceOrientationFilter.h \
-       SMESH_ScalarBarActor.h
+       SMESH_ScalarBarActor.h \
+       SMESH_NodeLabelActor.h \
+       SMESH_CellLabelActor.h
 
 # Libraries targets
 
@@ -48,7 +50,9 @@ dist_libSMESHObject_la_SOURCES = \
        SMESH_ExtractGeometry.cxx \
        SMESH_ActorUtils.cxx \
        SMESH_FaceOrientationFilter.cxx \
-       SMESH_ScalarBarActor.cxx
+       SMESH_ScalarBarActor.cxx \
+       SMESH_NodeLabelActor.cxx \
+       SMESH_CellLabelActor.cxx 
 
 libSMESHObject_la_CPPFLAGS = \
         $(QT_INCLUDES) \
index 8a4df7dbbe15ff1a9e8189e92fe081dc7766a4cb..4d5dcfd113f48d99b652ad782de01084cf71dead 100644 (file)
 #include "SMESH_ActorDef.h"
 #include "SMESH_ActorUtils.h"
 #include "SMESH_DeviceActor.h"
+#include "SMESH_NodeLabelActor.h"
+#include "SMESH_CellLabelActor.h"
 #include "SMESH_ObjectDef.h"
 #include "SMESH_ControlsDef.hxx"
 #include "SMDS_UnstructuredGrid.hxx"
 #include "SMESH_ScalarBarActor.h"
-#include "VTKViewer_CellCenters.h"
 #include "VTKViewer_ExtractUnstructuredGrid.h"
 #include "VTKViewer_FramedTextActor.h"
 #include "SALOME_InteractiveObject.hxx"
 #include <vtkActor2D.h>
 #include <vtkProperty2D.h>
 #include <vtkPolyData.h>
-#include <vtkMaskPoints.h>
 #include <vtkTextProperty.h>
-#include <vtkLabeledDataMapper.h>
-#include <vtkSelectVisiblePoints.h>
 
 #include <vtkLookupTable.h>
 
@@ -121,7 +119,8 @@ SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj,
 
 SMESH_ActorDef::SMESH_ActorDef()
 {
-  if(MYDEBUG) MESSAGE("SMESH_ActorDef - "<<this);
+  if(MYDEBUG) MESSAGE("SMESH_ActorDef - "<<this);  
+  myBaseActor = SMESH_DeviceActor::New();
 
   myTimeStamp = vtkTimeStamp::New();
 
@@ -158,7 +157,8 @@ SMESH_ActorDef::SMESH_ActorDef()
   bfc = Qtx::mainColorToSecondary(ffc, delta);
   myBackSurfaceProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. );
 
-  my2DActor = SMESH_DeviceActor::New();
+  my2DActor = SMESH_CellLabelActor::New();
+  my2DActor->SetStoreGemetryMapping(true);
   my2DActor->SetUserMatrix(aMatrix);
   my2DActor->PickableOff();
   my2DActor->SetProperty(mySurfaceProp);
@@ -193,7 +193,8 @@ SMESH_ActorDef::SMESH_ActorDef()
   aFilter->RegisterCellsWithType(VTK_QUADRATIC_TRIANGLE);
   aFilter->RegisterCellsWithType(VTK_QUADRATIC_QUAD);
 
-  my3DActor = SMESH_DeviceActor::New();
+  my3DActor = SMESH_CellLabelActor::New();
+  my3DActor->SetStoreGemetryMapping(true);
   my3DActor->SetUserMatrix(aMatrix);
   my3DActor->PickableOff();
   my3DActor->SetProperty(mySurfaceProp);
@@ -246,7 +247,8 @@ SMESH_ActorDef::SMESH_ActorDef()
   myEdgeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
   myEdgeProp->SetLineWidth(aLineWidth);
 
-  my1DActor = SMESH_DeviceActor::New();
+  my1DActor = SMESH_CellLabelActor::New();
+  my1DActor->SetStoreGemetryMapping(true);
   my1DActor->SetUserMatrix(aMatrix);
   my1DActor->PickableOff();
   my1DActor->SetHighlited(true);
@@ -291,9 +293,9 @@ SMESH_ActorDef::SMESH_ActorDef()
   my0DProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
   my0DProp->SetPointSize(aElem0DSize);
 
-  my0DActor = SMESH_DeviceActor::New();
+  my0DActor = SMESH_CellLabelActor::New();
   my0DActor->SetUserMatrix(aMatrix);
-  my0DActor->SetStoreClippingMapping(true);
+  my0DActor->SetStoreGemetryMapping(true);
   my0DActor->PickableOff();
   my0DActor->SetVisibility(false);
   my0DActor->SetProperty(my0DProp);
@@ -331,7 +333,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   SMESH::GetColor( "SMESH", "node_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 0, 0 ) );
   myNodeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
 
-  myNodeActor = SMESH_DeviceActor::New();
+  myNodeActor = SMESH_NodeLabelActor::New();
   myNodeActor->SetUserMatrix(aMatrix);
   myNodeActor->SetStoreClippingMapping(true);
   myNodeActor->PickableOff();
@@ -363,11 +365,9 @@ SMESH_ActorDef::SMESH_ActorDef()
   //Definition of Pickable and Highlitable engines
   //----------------------------------------------
 
-  myBaseActor = SMESH_DeviceActor::New();
   myBaseActor->SetUserMatrix(aMatrix);
   myBaseActor->SetStoreGemetryMapping(true);
   myBaseActor->GetProperty()->SetOpacity(0.0);
-
   myPickableActor = myBaseActor;
 
   myHighlightProp = vtkProperty::New();
@@ -430,92 +430,12 @@ SMESH_ActorDef::SMESH_ActorDef()
   if( !mgr )
     return;
 
-  //Definition of points numbering pipeline
-  //---------------------------------------
-  myPointsNumDataSet = vtkUnstructuredGrid::New();
-
-  myPtsMaskPoints = vtkMaskPoints::New();
-  myPtsMaskPoints->SetInput(myPointsNumDataSet);
-  myPtsMaskPoints->SetOnRatio(1);
-
-  myPtsSelectVisiblePoints = vtkSelectVisiblePoints::New();
-  myPtsSelectVisiblePoints->SetInput(myPtsMaskPoints->GetOutput());
-  myPtsSelectVisiblePoints->SelectInvisibleOff();
-  myPtsSelectVisiblePoints->SetTolerance(0.1);
-    
-  myPtsLabeledDataMapper = vtkLabeledDataMapper::New();
-  myPtsLabeledDataMapper->SetInput(myPtsSelectVisiblePoints->GetOutput());
-#if (VTK_XVERSION < 0x050200)
-  myPtsLabeledDataMapper->SetLabelFormat("%g");
-#endif
-  myPtsLabeledDataMapper->SetLabelModeToLabelScalars();
-    
-  vtkTextProperty* aPtsTextProp = vtkTextProperty::New();
-  aPtsTextProp->SetFontFamilyToTimes();
-  static int aPointsFontSize = 10;
-  aPtsTextProp->SetFontSize(aPointsFontSize);
-  aPtsTextProp->SetBold(1);
-  aPtsTextProp->SetItalic(0);
-  aPtsTextProp->SetShadow(0);
-  myPtsLabeledDataMapper->SetLabelTextProperty(aPtsTextProp);
-  aPtsTextProp->Delete();
-  
   myEntityMode = eAllEntity;
-
-  myIsPointsLabeled = false;
-
-  myPointLabels = vtkActor2D::New();
-  myPointLabels->SetMapper(myPtsLabeledDataMapper);
-  myPointLabels->GetProperty()->SetColor(1,1,1);
-  myPointLabels->SetVisibility(myIsPointsLabeled);
-
-
-  //Definition of cells numbering pipeline
-  //---------------------------------------
-  myCellsNumDataSet = vtkUnstructuredGrid::New();
-
-  myCellCenters = VTKViewer_CellCenters::New();
-  myCellCenters->SetInput(myCellsNumDataSet);
-
-  myClsMaskPoints = vtkMaskPoints::New();
-  myClsMaskPoints->SetInput(myCellCenters->GetOutput());
-  myClsMaskPoints->SetOnRatio(1);
-    
-  myClsSelectVisiblePoints = vtkSelectVisiblePoints::New();
-  myClsSelectVisiblePoints->SetInput(myClsMaskPoints->GetOutput());
-  myClsSelectVisiblePoints->SelectInvisibleOff();
-  myClsSelectVisiblePoints->SetTolerance(0.1);
-    
-  myClsLabeledDataMapper = vtkLabeledDataMapper::New();
-  myClsLabeledDataMapper->SetInput(myClsSelectVisiblePoints->GetOutput());
-#if (VTK_XVERSION < 0x050200)
-  myClsLabeledDataMapper->SetLabelFormat("%g");
-#endif
-  myClsLabeledDataMapper->SetLabelModeToLabelScalars();
-    
-  vtkTextProperty* aClsTextProp = vtkTextProperty::New();
-  aClsTextProp->SetFontFamilyToTimes();
-  static int aCellsFontSize = 12;
-  aClsTextProp->SetFontSize(aCellsFontSize);
-  aClsTextProp->SetBold(1);
-  aClsTextProp->SetItalic(0);
-  aClsTextProp->SetShadow(0);
-  myClsLabeledDataMapper->SetLabelTextProperty(aClsTextProp);
-  aClsTextProp->Delete();
-    
-  myIsCellsLabeled = false;
-
-  myCellsLabels = vtkActor2D::New();
-  myCellsLabels->SetMapper(myClsLabeledDataMapper);
-  myCellsLabels->GetProperty()->SetColor(0,1,0);
-  myCellsLabels->SetVisibility(myIsCellsLabeled);
-
+  
   // Clipping planes
   myImplicitBoolean = vtkImplicitBoolean::New();
   myImplicitBoolean->SetOperationTypeToIntersection();
   
-
-
   //Quadratic 2D elements representation
   //-----------------------------------------------------------------------------
   int aQuadratic2DMode = mgr->integerValue( "SMESH", "quadratic_mode", 0);
@@ -596,50 +516,9 @@ SMESH_ActorDef::~SMESH_ActorDef()
   myNodeActor->Delete();
   myBaseActor->Delete();
 
-  myNodeExtActor->Delete();
-  
+  myNodeExtActor->Delete();  
   myHighlitableActor->Delete();
 
-  //Deleting of points numbering pipeline
-  //---------------------------------------
-  myPointsNumDataSet->Delete();
-
-  // commented: porting to vtk 5.0
-  //  myPtsLabeledDataMapper->RemoveAllInputs();
-  myPtsLabeledDataMapper->Delete();
-
-  // commented: porting to vtk 5.0
-  //  myPtsSelectVisiblePoints->UnRegisterAllOutputs();
-  myPtsSelectVisiblePoints->Delete();
-
-  // commented: porting to vtk 5.0
-  //  myPtsMaskPoints->UnRegisterAllOutputs();
-  myPtsMaskPoints->Delete();
-
-  myPointLabels->Delete();
-
-
-  //Deleting of cells numbering pipeline
-  //---------------------------------------
-  myCellsNumDataSet->Delete();
-
-  myClsLabeledDataMapper->RemoveAllInputs();
-  myClsLabeledDataMapper->Delete();
-
-  // commented: porting to vtk 5.0
-  //  myClsSelectVisiblePoints->UnRegisterAllOutputs();
-  myClsSelectVisiblePoints->Delete();
-
-  // commented: porting to vtk 5.0
-  //  myClsMaskPoints->UnRegisterAllOutputs();
-  myClsMaskPoints->Delete();
-
-  // commented: porting to vtk 5.0
-  //  myCellCenters->UnRegisterAllOutputs();
-  myCellCenters->Delete();
-
-  myCellsLabels->Delete();
-
   myImplicitBoolean->Delete();
 
   myTimeStamp->Delete();
@@ -648,64 +527,53 @@ SMESH_ActorDef::~SMESH_ActorDef()
 
 void SMESH_ActorDef::SetPointsLabeled( bool theIsPointsLabeled )
 {    
-  vtkUnstructuredGrid* aGrid = GetUnstructuredGrid();
-    
-  myIsPointsLabeled = theIsPointsLabeled && aGrid->GetNumberOfPoints();
-
-  if ( myIsPointsLabeled )
-  {
-    myPointsNumDataSet->ShallowCopy(aGrid);
-    vtkDataSet *aDataSet = myPointsNumDataSet;
-    
-    int aNbElem = aDataSet->GetNumberOfPoints();
-    
-    vtkIntArray *anArray = vtkIntArray::New();
-    anArray->SetNumberOfValues( aNbElem );
-    
-    for ( vtkIdType anId = 0; anId < aNbElem; anId++ )
-    {
-      int aSMDSId = myVisualObj->GetNodeObjId( anId );
-      anArray->SetValue( anId, aSMDSId );
-    }
-    
-    aDataSet->GetPointData()->SetScalars( anArray );
-    anArray->Delete();
-    myPtsMaskPoints->SetInput( aDataSet );
-    myPointLabels->SetVisibility( GetVisibility() );
+  if(myNodeActor) {
+    myNodeActor->SetPointsLabeled(theIsPointsLabeled);
+    SetRepresentation(GetRepresentation());
+    myTimeStamp->Modified();
   }
-  else
-  {
-    myPointLabels->SetVisibility( false );
-  }
-  SetRepresentation(GetRepresentation());
-  myTimeStamp->Modified();
 }
 
+bool SMESH_ActorDef::GetPointsLabeled() {
+  return myNodeActor && myNodeActor->GetPointsLabeled();
+}
 
 void SMESH_ActorDef::SetCellsLabeled(bool theIsCellsLabeled)
 {
-  vtkUnstructuredGrid* aGrid = GetUnstructuredGrid();
-  myIsCellsLabeled = theIsCellsLabeled && aGrid->GetNumberOfPoints();
-  if(myIsCellsLabeled){
-    myCellsNumDataSet->ShallowCopy(aGrid);
-    vtkDataSet *aDataSet = myCellsNumDataSet;
-    int aNbElem = aDataSet->GetNumberOfCells();
-    vtkIntArray *anArray = vtkIntArray::New();
-    anArray->SetNumberOfValues(aNbElem);
-    for(int anId = 0; anId < aNbElem; anId++){
-      int aSMDSId = myVisualObj->GetElemObjId(anId);
-      anArray->SetValue(anId,aSMDSId);
-    }
-    aDataSet->GetCellData()->SetScalars(anArray);
-    myCellCenters->SetInput(aDataSet);
-    myCellsLabels->SetVisibility(GetVisibility());
-  }else{
-    myCellsLabels->SetVisibility(false);
-  }
+  if(my3DActor)
+    my3DActor->SetCellsLabeled(theIsCellsLabeled);
+
+  if(my2DActor)
+    my2DActor->SetCellsLabeled(theIsCellsLabeled);
+
+  if(my1DActor)
+    my1DActor->SetCellsLabeled(theIsCellsLabeled);
+
+  if(my0DActor)
+    my0DActor->SetCellsLabeled(theIsCellsLabeled);
+  
   myTimeStamp->Modified();
 }
 
 
+bool SMESH_ActorDef::GetCellsLabeled() {
+  bool result = false;
+  if(my3DActor)
+    result = result || my3DActor->GetCellsLabeled();
+
+  if(my2DActor)
+    result = result || my2DActor->GetCellsLabeled();
+
+  if(my1DActor)
+    result = result || my1DActor->GetCellsLabeled();
+
+  if(my0DActor)
+    result = result || my0DActor->GetCellsLabeled();
+
+  return result;
+}
+
+
 void SMESH_ActorDef::SetFacesOriented(bool theIsFacesOriented)
 {
   myIsFacesOriented = theIsFacesOriented;
@@ -993,32 +861,23 @@ SetControlMode(eControl theMode,
 
 
 void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){
-  theRenderer->AddActor(myNodeActor);
-  theRenderer->AddActor(myBaseActor);
-  
+  theRenderer->AddActor(myBaseActor);  
   theRenderer->AddActor(myNodeExtActor);
+  theRenderer->AddActor(my1DExtActor);
 
   my3DActor->AddToRender(theRenderer);
   my3DExtActor->AddToRender(theRenderer);
   my2DActor->AddToRender(theRenderer);
   my2DExtActor->AddToRender(theRenderer);
-
-  theRenderer->AddActor(my1DActor);
-  theRenderer->AddActor(my1DExtActor);
-
-  theRenderer->AddActor(my0DActor);
+  myNodeActor->AddToRender(theRenderer);
+  my1DActor->AddToRender(theRenderer);
+  my0DActor->AddToRender(theRenderer);
   //theRenderer->AddActor(my0DExtActor);
 
   theRenderer->AddActor(myHighlitableActor);
   
   theRenderer->AddActor2D(myScalarBarActor);
 
-  myPtsSelectVisiblePoints->SetRenderer(theRenderer);
-  myClsSelectVisiblePoints->SetRenderer(theRenderer);
-
-  theRenderer->AddActor2D(myPointLabels);
-  theRenderer->AddActor2D(myCellsLabels);
-
   // the superclass' method should be called at the end
   // (in particular, for correct work of selection)
   SALOME_Actor::AddToRender(theRenderer);
@@ -1027,27 +886,25 @@ void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){
 void SMESH_ActorDef::RemoveFromRender(vtkRenderer* theRenderer){
   SALOME_Actor::RemoveFromRender(theRenderer);
 
-  theRenderer->RemoveActor(myNodeActor);
   theRenderer->RemoveActor(myBaseActor);
 
   theRenderer->RemoveActor(myNodeExtActor);
 
   theRenderer->RemoveActor(myHighlitableActor);
 
-  theRenderer->RemoveActor(my0DActor);
   //theRenderer->RemoveActor(my0DExtActor);
 
-  theRenderer->RemoveActor(my1DActor);
   theRenderer->RemoveActor(my1DExtActor);
 
   my2DActor->RemoveFromRender(theRenderer);
   my2DExtActor->RemoveFromRender(theRenderer);
   my3DActor->RemoveFromRender(theRenderer);
   my3DExtActor->RemoveFromRender(theRenderer);
+  myNodeActor->RemoveFromRender(theRenderer);
+  my0DActor->RemoveFromRender(theRenderer);
+  my1DActor->RemoveFromRender(theRenderer);
 
   theRenderer->RemoveActor(myScalarBarActor);
-  theRenderer->RemoveActor(myPointLabels);
-  theRenderer->RemoveActor(myCellsLabels);
 }
 
 
@@ -1306,8 +1163,6 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){
   my3DExtActor->VisibilityOff();
   
   myScalarBarActor->VisibilityOff();
-  myPointLabels->VisibilityOff();
-  myCellsLabels->VisibilityOff();
   
   if(GetVisibility()){
     if(theIsUpdateRepersentation)
@@ -1362,13 +1217,21 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){
       my3DActor->VisibilityOn();
     }
     
-    if(myIsPointsLabeled){ 
-      myPointLabels->VisibilityOn();
+    if(myNodeActor->GetPointsLabeled()){ 
       myNodeActor->VisibilityOn();
     }
 
-    if(myIsCellsLabeled) 
-      myCellsLabels->VisibilityOn();
+    if(my0DActor)
+      my0DActor->UpdateLabels();
+    
+    if(my1DActor)
+      my1DActor->UpdateLabels();
+    
+    if(my2DActor)
+      my2DActor->UpdateLabels();
+    
+    if(my3DActor)
+      my3DActor->UpdateLabels();    
   } 
 #ifndef DISABLE_PLOT2DVIEWER
   else
@@ -1622,7 +1485,7 @@ void SMESH_ActorDef::SetPointRepresentation(bool theIsPointsVisible){
 }
 
 bool SMESH_ActorDef::GetPointRepresentation(){ 
-  return myIsPointsVisible || myIsPointsLabeled;
+  return myIsPointsVisible || myNodeActor->GetPointsLabeled();
 }
 
 
@@ -1637,18 +1500,18 @@ void SMESH_ActorDef::UpdateHighlight(){
   case SMESH_DeviceActor::eWireframe:
     {
       if(myIsHighlighted) {
-       myHighlitableActor->SetProperty(myHighlightProp);
+        myHighlitableActor->SetProperty(myHighlightProp);
       }else if(myIsPreselected){
-       myHighlitableActor->SetProperty(myPreselectProp);
+        myHighlitableActor->SetProperty(myPreselectProp);
       } else if(anIsVisible){
-       (myRepresentation == eSurface) ? 
-         myHighlitableActor->SetProperty(myOutLineProp) : myHighlitableActor->SetProperty(myEdgeProp);
+        (myRepresentation == eSurface) ? 
+          myHighlitableActor->SetProperty(myOutLineProp) : myHighlitableActor->SetProperty(myEdgeProp);
       }
       if(GetUnstructuredGrid()->GetNumberOfCells()) {
-       myHighlitableActor->SetHighlited(anIsVisible);
-       myHighlitableActor->GetExtractUnstructuredGrid()->
-         SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::eCells);
-       myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe);
+        myHighlitableActor->SetHighlited(anIsVisible);
+        myHighlitableActor->GetExtractUnstructuredGrid()->
+          SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::eCells);
+        myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe);
       }
       myHighlitableActor->SetVisibility(anIsVisible);
       break;
@@ -1656,11 +1519,11 @@ void SMESH_ActorDef::UpdateHighlight(){
   case SMESH_DeviceActor::ePoint:
     {
       if(myIsHighlighted) {
-       myNodeActor->SetProperty(myHighlightProp);
+        myNodeActor->SetProperty(myHighlightProp);
       }else if(myIsPreselected) {
-       myNodeActor->SetProperty(myPreselectProp);
+        myNodeActor->SetProperty(myPreselectProp);
       } else if(anIsVisible) {
-       myNodeActor->SetProperty(myNodeProp);
+        myNodeActor->SetProperty(myNodeProp);
       }
       myNodeActor->SetRepresentation(SMESH_DeviceActor::ePoint);
       myNodeActor->GetExtractUnstructuredGrid()->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints);
@@ -1729,12 +1592,22 @@ void SMESH_ActorDef::Update(){
     if (anObjTime > aTime)
       SetControlMode(GetControlMode(),false);
   }
-  if(myIsPointsLabeled){
-    SetPointsLabeled(myIsPointsLabeled);
-  }
-  if(myIsCellsLabeled){
-    SetCellsLabeled(myIsCellsLabeled);
-  }
+
+  if(myNodeActor)
+    myNodeActor->UpdateLabels();
+
+  if(my0DActor)
+    my0DActor->UpdateLabels();
+  
+  if(my1DActor)
+    my1DActor->UpdateLabels();
+  
+  if(my2DActor)
+    my2DActor->UpdateLabels();
+
+  if(my3DActor)
+    my3DActor->UpdateLabels();
+  
   if(myIsFacesOriented){
     SetFacesOriented(myIsFacesOriented);
   }
@@ -1929,6 +1802,7 @@ SMESH_ActorDef::AddClippingPlane(vtkPlane* thePlane)
     myCippingPlaneCont.push_back(thePlane);
     if(!IsImplicitFunctionUsed())
       SetImplicitFunctionUsed(true);
+    myNodeActor->UpdateLabels();
   }
   return myCippingPlaneCont.size();
 }
@@ -1941,6 +1815,7 @@ RemoveAllClippingPlanes()
   myImplicitBoolean->GetFunction()->Modified(); // VTK bug
   myCippingPlaneCont.clear();
   SetImplicitFunctionUsed(false);
+  myNodeActor->UpdateLabels();
 }
 
 vtkIdType
index 5961cbd068014d208e96ee4ee10a1317e1d2e156..6eec6aa2acb52d46ea3d2ed78161b850344cb63e 100644 (file)
@@ -61,17 +61,14 @@ class vtkMergeFilter;
 class vtkPolyData;
 class vtkMapper;
 class vtkActor2D;
-class vtkMaskPoints;
-class vtkLabeledDataMapper;
-class vtkSelectVisiblePoints;
 class vtkLookupTable;
 class vtkPlane;
 class vtkImplicitBoolean;
 class vtkTimeStamp;
 
-class VTKViewer_CellCenters;
-
 class SMESH_DeviceActor;
+class SMESH_NodeLabelActor;
+class SMESH_CellLabelActor;
 class SMESH_ScalarBarActor;
 
 #ifndef DISABLE_PLOT2DVIEWER
@@ -167,10 +164,10 @@ class SMESH_ActorDef : public SMESH_Actor
   virtual void UnShrink(); 
 
   virtual void SetPointsLabeled(bool theIsPointsLabeled);
-  virtual bool GetPointsLabeled(){ return myIsPointsLabeled;}
+  virtual bool GetPointsLabeled();
 
   virtual void SetCellsLabeled(bool theIsCellsLabeled);
-  virtual bool GetCellsLabeled(){ return myIsCellsLabeled;}
+  virtual bool GetCellsLabeled();
 
   virtual void SetFacesOriented(bool theIsFacesOriented);
   virtual bool GetFacesOriented();
@@ -232,7 +229,7 @@ class SMESH_ActorDef : public SMESH_Actor
   vtkProperty* myNodeProp;
 
   SMESH_DeviceActor* myBaseActor;
-  SMESH_DeviceActor* myNodeActor;
+  SMESH_NodeLabelActor* myNodeActor;
   SMESH_DeviceActor* myPickableActor;
 
   vtkProperty* myHighlightProp;
@@ -244,9 +241,9 @@ class SMESH_ActorDef : public SMESH_Actor
   eControl myControlMode;
   SMESH::Controls::FunctorPtr myFunctor;
   vtkProperty* my2DExtProp;
-  SMESH_DeviceActor* my2DActor;
+  SMESH_CellLabelActor* my2DActor;
   SMESH_DeviceActor* my2DExtActor;
-  SMESH_DeviceActor* my3DActor;
+  SMESH_CellLabelActor* my3DActor;
   SMESH_DeviceActor* my3DExtActor;
   SMESH_DeviceActor* myControlActor;
 
@@ -254,12 +251,12 @@ class SMESH_ActorDef : public SMESH_Actor
   SMESH_DeviceActor* myNodeExtActor;
 
   vtkProperty* my1DProp;
-  SMESH_DeviceActor* my1DActor;
+  SMESH_CellLabelActor* my1DActor;
   vtkProperty* my1DExtProp;
   SMESH_DeviceActor* my1DExtActor;
 
   vtkProperty* my0DProp;
-  SMESH_DeviceActor* my0DActor;
+  SMESH_CellLabelActor* my0DActor;
   vtkProperty* my0DExtProp;
   SMESH_DeviceActor* my0DExtActor;
 
@@ -270,21 +267,6 @@ class SMESH_ActorDef : public SMESH_Actor
   bool myIsShrinkable;
   bool myIsShrunk;
   
-  bool myIsPointsLabeled;
-  vtkUnstructuredGrid* myPointsNumDataSet;
-  vtkActor2D *myPointLabels;
-  vtkMaskPoints* myPtsMaskPoints;
-  vtkLabeledDataMapper* myPtsLabeledDataMapper;
-  vtkSelectVisiblePoints* myPtsSelectVisiblePoints;
-
-  bool myIsCellsLabeled;
-  vtkUnstructuredGrid* myCellsNumDataSet;
-  vtkActor2D *myCellsLabels;
-  vtkMaskPoints* myClsMaskPoints;
-  VTKViewer_CellCenters* myCellCenters;
-  vtkLabeledDataMapper* myClsLabeledDataMapper;
-  vtkSelectVisiblePoints* myClsSelectVisiblePoints;
-
   vtkImplicitBoolean* myImplicitBoolean;
   typedef TVTKSmartPtr<vtkPlane> TPlanePtr;
   typedef std::vector<TPlanePtr> TCippingPlaneCont;
diff --git a/src/OBJECT/SMESH_CellLabelActor.cxx b/src/OBJECT/SMESH_CellLabelActor.cxx
new file mode 100644 (file)
index 0000000..399bc86
--- /dev/null
@@ -0,0 +1,185 @@
+// Copyright (C) 2007-2011  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
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : SMESH_CellLabelActor.cxx
+//  Author : Roman NIKOLAEV
+//  Module : SMESH
+//
+#include "SMESH_CellLabelActor.h"
+
+#include <VTKViewer_TransformFilter.h>
+#include <VTKViewer_CellCenters.h>
+
+#include <vtkObjectFactory.h>
+#include <vtkCallbackCommand.h>
+#include <vtkMaskPoints.h>
+#include <vtkSelectVisiblePoints.h>
+#include <vtkLabeledDataMapper.h>
+#include <vtkActor2D.h>
+#include <vtkTextProperty.h>
+#include <vtkPointData.h>
+#include <vtkProperty2D.h>
+#include <vtkRenderer.h>
+#include <vtkPolyData.h>
+#include <vtkCellData.h>
+
+vtkStandardNewMacro(SMESH_CellLabelActor);
+
+/*!
+  Constructor.
+*/
+SMESH_CellLabelActor::SMESH_CellLabelActor() {
+    //Definition of cells numbering pipeline
+  //---------------------------------------
+  myCellsNumDataSet = vtkPolyData::New();
+
+  myCellCenters = VTKViewer_CellCenters::New();
+  myCellCenters->SetInput(myCellsNumDataSet);
+
+  myClsMaskPoints = vtkMaskPoints::New();
+  myClsMaskPoints->SetInput(myCellCenters->GetOutput());
+  myClsMaskPoints->SetOnRatio(1);
+    
+  myClsSelectVisiblePoints = vtkSelectVisiblePoints::New();
+  myClsSelectVisiblePoints->SetInput(myClsMaskPoints->GetOutput());
+  myClsSelectVisiblePoints->SelectInvisibleOff();
+  myClsSelectVisiblePoints->SetTolerance(0.1);
+    
+  myClsLabeledDataMapper = vtkLabeledDataMapper::New();
+  myClsLabeledDataMapper->SetInput(myClsSelectVisiblePoints->GetOutput());
+
+  myClsLabeledDataMapper->SetLabelFormat("%d");
+  myClsLabeledDataMapper->SetLabelModeToLabelScalars();
+    
+  vtkTextProperty* aClsTextProp = vtkTextProperty::New();
+  aClsTextProp->SetFontFamilyToTimes();
+  static int aCellsFontSize = 12;
+  aClsTextProp->SetFontSize(aCellsFontSize);
+  aClsTextProp->SetBold(1);
+  aClsTextProp->SetItalic(0);
+  aClsTextProp->SetShadow(0);
+  myClsLabeledDataMapper->SetLabelTextProperty(aClsTextProp);
+  aClsTextProp->Delete();
+    
+  myIsCellsLabeled = false;
+
+  myCellsLabels = vtkActor2D::New();
+  myCellsLabels->SetMapper(myClsLabeledDataMapper);
+  myCellsLabels->GetProperty()->SetColor(0,1,0);
+  myCellsLabels->SetVisibility(myIsCellsLabeled);
+
+  vtkCallbackCommand* callBackCommand = vtkCallbackCommand::New();
+  callBackCommand->SetClientData(this);
+  callBackCommand->SetCallback(SMESH_CellLabelActor::ProcessEvents);
+
+  myTransformFilter->AddObserver("VTKViewer_TransformFilter::TransformationFinished",
+                                callBackCommand);
+  callBackCommand->Delete();
+}
+
+
+/*!
+  Destructor.
+*/
+SMESH_CellLabelActor::~SMESH_CellLabelActor() {
+  //Deleting of cells numbering pipeline
+  //---------------------------------------
+  myCellsNumDataSet->Delete();
+
+  myClsLabeledDataMapper->RemoveAllInputs();
+  myClsLabeledDataMapper->Delete();
+  
+  // commented: porting to vtk 5.0
+  //  myClsSelectVisiblePoints->UnRegisterAllOutputs();
+  myClsSelectVisiblePoints->Delete();
+  
+  // commented: porting to vtk 5.0
+  //  myClsMaskPoints->UnRegisterAllOutputs();
+  myClsMaskPoints->Delete();
+  
+  // commented: porting to vtk 5.0
+  //  myCellCenters->UnRegisterAllOutputs();
+  myCellCenters->Delete();
+  
+  myCellsLabels->Delete();
+}
+
+
+void SMESH_CellLabelActor::SetCellsLabeled(bool theIsCellsLabeled) {
+  myTransformFilter->Update();
+  vtkPolyData* aGrid = vtkPolyData::SafeDownCast(myTransformFilter->GetOutput());
+  if(!aGrid)
+    return;
+
+  myIsCellsLabeled = theIsCellsLabeled && aGrid->GetNumberOfPoints();
+  if(myIsCellsLabeled){
+    myCellsNumDataSet->ShallowCopy(aGrid);
+    vtkDataSet *aDataSet = myCellsNumDataSet;
+    int aNbElem = aDataSet->GetNumberOfCells();
+    vtkIntArray *anArray = vtkIntArray::New();
+    anArray->SetNumberOfValues(aNbElem);
+    for(int anId = 0; anId < aNbElem; anId++){
+      int aSMDSId = GetElemObjId(anId);
+      anArray->SetValue(anId,aSMDSId);
+    }
+    aDataSet->GetCellData()->SetScalars(anArray);
+    myCellCenters->SetInput(aDataSet);
+    myCellsLabels->SetVisibility(GetVisibility());
+  }else{
+    myCellsLabels->SetVisibility(false);
+  }
+}
+
+void SMESH_CellLabelActor::SetVisibility(int theMode)
+{
+  SMESH_DeviceActor::SetVisibility(theMode);
+  myCellsLabels->VisibilityOff();
+  if(myIsCellsLabeled && theMode)
+    myCellsLabels->VisibilityOn();
+}
+
+void SMESH_CellLabelActor::AddToRender(vtkRenderer* theRenderer)
+{
+  SMESH_DeviceActor::AddToRender(theRenderer);
+  myClsSelectVisiblePoints->SetRenderer(theRenderer);
+  theRenderer->AddActor2D(myCellsLabels);
+}
+
+void SMESH_CellLabelActor::RemoveFromRender(vtkRenderer* theRenderer)
+{
+  theRenderer->RemoveActor(myCellsLabels);
+  SMESH_DeviceActor::RemoveFromRender(theRenderer);
+}
+
+void SMESH_CellLabelActor::UpdateLabels() {
+  if(myIsCellsLabeled)
+    SetCellsLabeled(myIsCellsLabeled);
+}
+
+
+void SMESH_CellLabelActor::ProcessEvents(vtkObject* vtkNotUsed(theObject),
+                                        unsigned long theEvent,
+                                        void* theClientData,
+                                        void* vtkNotUsed(theCallData)) {
+  SMESH_CellLabelActor* self = reinterpret_cast<SMESH_CellLabelActor*>(theClientData);
+  if(self)
+    self->UpdateLabels();
+}
diff --git a/src/OBJECT/SMESH_CellLabelActor.h b/src/OBJECT/SMESH_CellLabelActor.h
new file mode 100644 (file)
index 0000000..dda47fe
--- /dev/null
@@ -0,0 +1,82 @@
+// Copyright (C) 2007-2011  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
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : SMESH_CellLabelActor.h
+//  Author : Roman NIKOLAEV
+//  Module : SMESH
+//
+#ifndef SMESH_CELL_LABEL_ACTOR_H
+#define SMESH_CELL_LABEL_ACTOR_H
+
+#include "SMESH_DeviceActor.h"
+
+class vtkSelectVisiblePoints;
+class vtkLabeledDataMapper;
+class vtkActor2D;
+class vtkMaskPoints;
+class vtkPolyData;
+
+class VTKViewer_CellCenters;
+
+
+class SMESHOBJECT_EXPORT SMESH_CellLabelActor : public SMESH_DeviceActor {
+public:
+  static SMESH_CellLabelActor* New();
+
+  static void ProcessEvents(vtkObject* theObject,
+                           unsigned long theEvent,
+                           void* theClientData,
+                           void* theCallData);
+
+
+  vtkTypeMacro(SMESH_CellLabelActor, SMESH_DeviceActor);
+
+
+  virtual void SetCellsLabeled(bool theIsCellsLabeled);
+  virtual bool GetCellsLabeled(){ return myIsCellsLabeled;}
+
+  virtual void SetVisibility(int theMode);
+
+  virtual void AddToRender(vtkRenderer* theRenderer);
+  virtual void RemoveFromRender(vtkRenderer* theRenderer);
+
+  void UpdateLabels();
+  
+protected:
+  SMESH_CellLabelActor();
+  ~SMESH_CellLabelActor();
+
+  bool myIsCellsLabeled;
+  vtkPolyData* myCellsNumDataSet;
+  vtkActor2D *myCellsLabels;
+  vtkMaskPoints* myClsMaskPoints;
+  VTKViewer_CellCenters* myCellCenters;
+  vtkLabeledDataMapper* myClsLabeledDataMapper;
+  vtkSelectVisiblePoints* myClsSelectVisiblePoints;  
+  SMESH_DeviceActor* myBaseActor; //Pointer to the base actor
+
+protected:
+  // Not implemented.
+  SMESH_CellLabelActor(const SMESH_CellLabelActor&);
+  void operator=(const SMESH_CellLabelActor&);
+};
+
+#endif //SMESH_NODE_LABEL_ACTOR_H
index fe08178a9e272619c1757d78c3879ab9ca8e3ef3..6032c57349ccdb1ae2393ddbe75637f1388b0858 100644 (file)
@@ -626,7 +626,7 @@ void
 SMESH_DeviceActor
 ::SetFacesOriented(bool theIsFacesOriented) 
 {
-  if ( vtkDataSet* aDataSet = myPassFilter[ 1 ]->GetOutput() )
+  if ( vtkDataSet* aDataSet = myTransformFilter->GetOutput() )
   {
     myIsFacesOriented = theIsFacesOriented;
     if( theIsFacesOriented )
index 26c281382f1e1f033e42e5a707e6f02346045440..db42da397456e6133afc6a469a1851fb071d5ec2 100644 (file)
@@ -239,9 +239,14 @@ int SMESH_ExtractGeometry::RequestData(
       
     if ( npts >= numCellPts || (this->ExtractBoundaryCells && npts > 0) )
       {
-      newCellId = output->InsertNextCell(cell->GetCellType(),newCellPts);
-      myElemVTK2ObjIds.push_back(cellId);
-      outputCD->CopyData(cd,cellId,newCellId);
+        if(cell->GetCellType() == VTK_POLYHEDRON) {
+          newCellPts->Reset();
+          vtkUnstructuredGrid::SafeDownCast(input)->GetFaceStream( cellId ,newCellPts );        
+          vtkUnstructuredGrid::ConvertFaceStreamPointIds(newCellPts, pointMap);
+        }
+          newCellId = output->InsertNextCell(cell->GetCellType(),newCellPts);
+          myElemVTK2ObjIds.push_back(cellId);
+          outputCD->CopyData(cd,cellId,newCellId);
       }
     }//for all cells
 
diff --git a/src/OBJECT/SMESH_NodeLabelActor.cxx b/src/OBJECT/SMESH_NodeLabelActor.cxx
new file mode 100644 (file)
index 0000000..51c9135
--- /dev/null
@@ -0,0 +1,187 @@
+// Copyright (C) 2007-2011  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
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : SMESH_NodeLabelActor.cxx
+//  Author : Roman NIKOLAEV
+//  Module : SMESH
+//
+#include "SMESH_NodeLabelActor.h"
+
+#include <VTKViewer_TransformFilter.h>
+
+#include <vtkObjectFactory.h>
+#include <vtkCallbackCommand.h>
+#include <vtkMaskPoints.h>
+#include <vtkSelectVisiblePoints.h>
+#include <vtkLabeledDataMapper.h>
+#include <vtkActor2D.h>
+#include <vtkTextProperty.h>
+#include <vtkPointData.h>
+#include <vtkProperty2D.h>
+#include <vtkRenderer.h>
+#include <vtkPolyData.h>
+
+vtkStandardNewMacro(SMESH_NodeLabelActor);
+
+/*!
+  Constructor.
+*/
+SMESH_NodeLabelActor::SMESH_NodeLabelActor() {
+  //Definition of points numbering pipeline
+  //---------------------------------------
+  myPointsNumDataSet = vtkPolyData::New();
+
+  myPtsMaskPoints = vtkMaskPoints::New();
+  myPtsMaskPoints->SetInput(myPointsNumDataSet);
+  myPtsMaskPoints->SetOnRatio(1);
+
+  myPtsSelectVisiblePoints = vtkSelectVisiblePoints::New();
+  myPtsSelectVisiblePoints->SetInput(myPtsMaskPoints->GetOutput());
+  myPtsSelectVisiblePoints->SelectInvisibleOff();
+  myPtsSelectVisiblePoints->SetTolerance(0.1);
+    
+  myPtsLabeledDataMapper = vtkLabeledDataMapper::New();
+  myPtsLabeledDataMapper->SetInput(myPtsSelectVisiblePoints->GetOutput());
+  myPtsLabeledDataMapper->SetLabelFormat("%d");
+  myPtsLabeledDataMapper->SetLabelModeToLabelScalars();
+    
+  vtkTextProperty* aPtsTextProp = vtkTextProperty::New();
+  aPtsTextProp->SetFontFamilyToTimes();
+  static int aPointsFontSize = 10;
+  aPtsTextProp->SetFontSize(aPointsFontSize);
+  aPtsTextProp->SetBold(1);
+  aPtsTextProp->SetItalic(0);
+  aPtsTextProp->SetShadow(0);
+  myPtsLabeledDataMapper->SetLabelTextProperty(aPtsTextProp);
+  aPtsTextProp->Delete();
+
+  myIsPointsLabeled = false;
+
+  myPointLabels = vtkActor2D::New();
+  myPointLabels->SetMapper(myPtsLabeledDataMapper);
+  myPointLabels->GetProperty()->SetColor(1,1,1);
+  myPointLabels->SetVisibility(myIsPointsLabeled);
+
+  vtkCallbackCommand* callBackCommand = vtkCallbackCommand::New();
+  callBackCommand->SetClientData(this);
+  callBackCommand->SetCallback(SMESH_NodeLabelActor::ProcessEvents);
+
+  myTransformFilter->AddObserver("VTKViewer_TransformFilter::TransformationFinished",
+                                callBackCommand);
+  callBackCommand->Delete();
+}
+
+/*!
+  Destructor
+*/
+SMESH_NodeLabelActor::~SMESH_NodeLabelActor() {
+  //Deleting of points numbering pipeline
+  //---------------------------------------
+  myPointsNumDataSet->Delete();
+  
+  // commented: porting to vtk 5.0
+  //  myPtsLabeledDataMapper->RemoveAllInputs();
+  myPtsLabeledDataMapper->Delete();
+  
+  // commented: porting to vtk 5.0
+  //  myPtsSelectVisiblePoints->UnRegisterAllOutputs();
+  myPtsSelectVisiblePoints->Delete();
+  
+  // commented: porting to vtk 5.0
+  //  myPtsMaskPoints->UnRegisterAllOutputs();
+  myPtsMaskPoints->Delete();
+  myPointLabels->Delete();
+
+}
+
+void SMESH_NodeLabelActor::SetPointsLabeled(bool theIsPointsLabeled) {
+  myTransformFilter->Update();
+  vtkDataSet* aGrid = vtkPolyData::SafeDownCast(myTransformFilter->GetOutput());
+
+  if(!aGrid)
+    return;
+    
+  myIsPointsLabeled = theIsPointsLabeled && aGrid->GetNumberOfPoints();
+
+  if ( myIsPointsLabeled )
+  {
+    myPointsNumDataSet->ShallowCopy(aGrid);
+    vtkDataSet *aDataSet = myPointsNumDataSet;
+    
+    int aNbElem = aDataSet->GetNumberOfPoints();
+    
+    vtkIntArray *anArray = vtkIntArray::New();
+    anArray->SetNumberOfValues( aNbElem );
+    
+    for ( vtkIdType anId = 0; anId < aNbElem; anId++ )
+    {
+      int aSMDSId = GetNodeObjId( anId );
+      anArray->SetValue( anId, aSMDSId );
+    }
+    
+    aDataSet->GetPointData()->SetScalars( anArray );
+    myPtsMaskPoints->SetInput( aDataSet );
+    myPointLabels->SetVisibility( GetVisibility() );
+    anArray->Delete();
+  }
+  else
+  {
+    myPointLabels->SetVisibility( false );
+  } 
+}
+
+
+void SMESH_NodeLabelActor::SetVisibility(int theMode)
+{
+  SMESH_DeviceActor::SetVisibility(theMode);
+  myPointLabels->VisibilityOff();
+  if(myIsPointsLabeled && theMode)
+    myPointLabels->VisibilityOn();
+}
+
+
+void SMESH_NodeLabelActor::AddToRender(vtkRenderer* theRenderer)
+{
+  SMESH_DeviceActor::AddToRender(theRenderer);
+  myPtsSelectVisiblePoints->SetRenderer(theRenderer);
+  theRenderer->AddActor2D(myPointLabels);
+}
+
+void SMESH_NodeLabelActor::RemoveFromRender(vtkRenderer* theRenderer)
+{
+  theRenderer->RemoveActor(myPointLabels);
+  SMESH_DeviceActor::RemoveFromRender(theRenderer);
+}
+
+void SMESH_NodeLabelActor::UpdateLabels() {
+  if(myIsPointsLabeled)
+    SetPointsLabeled(myIsPointsLabeled);
+}
+
+
+void SMESH_NodeLabelActor::ProcessEvents(vtkObject* vtkNotUsed(theObject),
+                                        unsigned long theEvent,
+                                        void* theClientData,
+                                        void* vtkNotUsed(theCallData)) {
+  SMESH_NodeLabelActor* self = reinterpret_cast<SMESH_NodeLabelActor*>(theClientData);    
+  if(self)
+    self->UpdateLabels();
+}
diff --git a/src/OBJECT/SMESH_NodeLabelActor.h b/src/OBJECT/SMESH_NodeLabelActor.h
new file mode 100644 (file)
index 0000000..0a9ffaa
--- /dev/null
@@ -0,0 +1,78 @@
+// Copyright (C) 2007-2011  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
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : SMESH_NodeLabelActor.h
+//  Author : Roman NIKOLAEV
+//  Module : SMESH
+//
+#ifndef SMESH_NODE_LABEL_ACTOR_H
+#define SMESH_NODE_LABEL_ACTOR_H
+
+#include "SMESH_DeviceActor.h"
+
+class vtkSelectVisiblePoints;
+class vtkLabeledDataMapper;
+class vtkActor2D;
+class vtkMaskPoints;
+class vtkPolyData;
+
+
+class SMESHOBJECT_EXPORT SMESH_NodeLabelActor : public SMESH_DeviceActor {
+public:
+  static SMESH_NodeLabelActor* New();
+
+  static void ProcessEvents(vtkObject* theObject,
+                           unsigned long theEvent,
+                           void* theClientData,
+                           void* theCallData);
+
+
+  vtkTypeMacro(SMESH_NodeLabelActor, SMESH_DeviceActor);
+
+
+  virtual void SetPointsLabeled(bool theIsPointsLabeled);
+  virtual bool GetPointsLabeled(){ return myIsPointsLabeled;}  
+
+  virtual void SetVisibility(int theMode);  
+
+  virtual void AddToRender(vtkRenderer* theRenderer); 
+  virtual void RemoveFromRender(vtkRenderer* theRenderer);
+
+  void UpdateLabels();
+  
+protected:
+  SMESH_NodeLabelActor();
+  ~SMESH_NodeLabelActor();
+  
+  bool myIsPointsLabeled;
+  vtkPolyData* myPointsNumDataSet;
+  vtkActor2D *myPointLabels;
+  vtkMaskPoints* myPtsMaskPoints;
+  vtkLabeledDataMapper* myPtsLabeledDataMapper;
+  vtkSelectVisiblePoints* myPtsSelectVisiblePoints;
+
+protected:
+  // Not implemented.
+  SMESH_NodeLabelActor(const SMESH_NodeLabelActor&);
+  void operator=(const SMESH_NodeLabelActor&);
+};
+
+#endif //SMESH_NODE_LABEL_ACTOR_H
index 5e35f14f282dbb52ea49749b4e7da427b00bae41..cfaa700cbaf98718cde07ae36f05dce4cc4fdad2 100644 (file)
@@ -368,11 +368,27 @@ void SMESH_VisualObjDef::buildElemPrs()
     {
       const TEntityList& aList = anEnts[ aTypes[ i ] ];
       TEntityList::const_iterator anIter;
-      for ( anIter = aList.begin(); anIter != aList.end(); ++anIter )
-        aCellsSize += (*anIter)->NbNodes() + 1;
+      for ( anIter = aList.begin(); anIter != aList.end(); ++anIter ) {
+       if((*anIter)->GetEntityType() != SMDSEntity_Polyhedra &&
+          (*anIter)->GetEntityType() != SMDSEntity_Quad_Polyhedra) {
+         aCellsSize += (*anIter)->NbNodes() + 1;
+       } 
+       // Special case for the VTK_POLYHEDRON:
+       // itsinput cellArray is of special format.
+       //  [nCellFaces, nFace0Pts, i, j, k, nFace1Pts, i, j, k, ...]   
+       else {
+         if( const SMDS_VtkVolume* ph = dynamic_cast<const SMDS_VtkVolume*>(*anIter) ) {
+           int nbFaces = ph->NbFaces();
+           aCellsSize += (1 + ph->NbFaces());
+           for( int i = 1; i <= nbFaces; i++ ) {
+             aCellsSize += ph->NbFaceNodes(i);
+           }
+         }
+       }
+      }
     }
   }
-
+  
   vtkIdType aNbCells = nbEnts[ SMDSAbs_0DElement ] + nbEnts[ SMDSAbs_Edge ] +
                        nbEnts[ SMDSAbs_Face ] + nbEnts[ SMDSAbs_Volume ];
 
@@ -402,44 +418,50 @@ void SMESH_VisualObjDef::buildElemPrs()
 
   for ( int i = 0; i <= 3; i++ ) // iterate through 0d elements, edges, faces and volumes
   {
-    if ( nbEnts[ aTypes[ i ] ] > 0 )
-    {
+    if ( nbEnts[ aTypes[ i ] ] > 0 ) {
+      
       const SMDSAbs_ElementType& aType = aTypes[ i ];
       const TEntityList& aList = anEnts[ aType ];
       TEntityList::const_iterator anIter;
       for ( anIter = aList.begin(); anIter != aList.end(); ++anIter )
       {
         const SMDS_MeshElement* anElem = *anIter;
-
+       
         vtkIdType aNbNodes = anElem->NbNodes();
         anIdList->SetNumberOfIds( aNbNodes );
-
+       
         int anId = anElem->GetID();
-
+       
         mySMDS2VTKElems.insert( TMapOfIds::value_type( anId, iElem ) );
         myVTK2SMDSElems.insert( TMapOfIds::value_type( iElem, anId ) );
-
+       
         SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator();
         switch (aType) {
-        case SMDSAbs_Volume:{
+        case SMDSAbs_Volume: {
           aConnect.clear();
           std::vector<int> aConnectivities;
           // Convertions connectivities from SMDS to VTK
+         
           if (anElem->IsPoly() && aNbNodes > 3) { // POLYEDRE
-
-            if ( const SMDS_VtkVolume* ph =
-                 dynamic_cast<const SMDS_VtkVolume*> (anElem))
-            {
-              aNbNodes = GetConnect(ph->uniqueNodesIterator(),aConnect);
-              anIdList->SetNumberOfIds( aNbNodes );
+           anIdList->Reset();
+            if ( const SMDS_VtkVolume* ph = dynamic_cast<const SMDS_VtkVolume*>(anElem) ) {
+             int nbFaces = ph->NbFaces();
+             anIdList->InsertNextId(nbFaces);
+             for( int i = 1; i <= nbFaces; i++ ) {
+               anIdList->InsertNextId(ph->NbFaceNodes(i));
+               for(int j = 1; j <= ph->NbFaceNodes(i); j++) {
+                 const SMDS_MeshNode* n = ph->GetFaceNode(i,j);
+                 if(n) {
+                   anIdList->InsertNextId(mySMDS2VTKNodes[n->GetID()]);
+                 }
+               }
+             }
             }
-            for (int k = 0; k < aNbNodes; k++)
-              aConnectivities.push_back(k);
-
+           
           } else if (aNbNodes == 4) {
             static int anIds[] = {0,2,1,3};
             for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
-
+           
           } else if (aNbNodes == 5) {
             static int anIds[] = {0,3,2,1,4};
             for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
@@ -479,14 +501,16 @@ void SMESH_VisualObjDef::buildElemPrs()
           else {
           }
 
-          if ( aConnect.empty() )
-            GetConnect(aNodesIter,aConnect);
+         if (!(anElem->IsPoly() && aNbNodes > 3)) {
+           if ( aConnect.empty() )
+             GetConnect(aNodesIter,aConnect);
 
-          if (aConnectivities.size() > 0) {
-            for (vtkIdType aNodeId = 0; aNodeId < aNbNodes; aNodeId++)
-              SetId(anIdList,mySMDS2VTKNodes,aConnect,aNodeId,aConnectivities[aNodeId]);
-          }
-          break;
+           if (aConnectivities.size() > 0) {
+             for (vtkIdType aNodeId = 0; aNodeId < aNbNodes; aNodeId++)
+               SetId(anIdList,mySMDS2VTKNodes,aConnect,aNodeId,aConnectivities[aNodeId]);
+           }
+         }
+         break;
         }
         default:
           for( vtkIdType aNodeId = 0; aNodesIter->more(); aNodeId++ ){
@@ -495,6 +519,7 @@ void SMESH_VisualObjDef::buildElemPrs()
           }
         }
 
+       
         aConnectivity->InsertNextCell( anIdList );
         aCellTypesArray->InsertNextValue( getCellType( aType, anElem->IsPoly(), aNbNodes ) );
 
@@ -570,8 +595,13 @@ bool SMESH_VisualObjDef::GetEdgeNodes( const int theElemId,
 
 vtkUnstructuredGrid* SMESH_VisualObjDef::GetUnstructuredGrid()
 {
-        //MESSAGE("SMESH_VisualObjDef::GetUnstructuredGrid " << myGrid);
-        return myGrid;
+  if ( !myLocalGrid && !GetMesh()->isCompacted() )
+  {
+    GetMesh()->compactMesh();
+    vtkUnstructuredGrid *theGrid = GetMesh()->getGrid();
+    myGrid->ShallowCopy(theGrid);
+  }
+  return myGrid;
 }
 
 
diff --git a/src/OBJECT/SMESH_vtkPVUpdateSuppressor.cxx b/src/OBJECT/SMESH_vtkPVUpdateSuppressor.cxx
deleted file mode 100644 (file)
index bbab763..0000000
+++ /dev/null
@@ -1,230 +0,0 @@
-/*=========================================================================
-
- Program:   ParaView
- Module:    $RCSfile$
-
- Copyright (c) Kitware, Inc.
- All rights reserved.
- See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
-
- This software is distributed WITHOUT ANY WARRANTY; without even
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE.  See the above copyright notice for more information.
-
- =========================================================================*/
-#include "SMESH_vtkPVUpdateSuppressor.h"
-
-#include "vtkAlgorithmOutput.h"
-#include "vtkCollection.h"
-#include "vtkCommand.h"
-#include "vtkCompositeDataPipeline.h"
-#include "vtkDataObject.h"
-#include "vtkDemandDrivenPipeline.h"
-#include "vtkInformation.h"
-#include "vtkInformationDoubleVectorKey.h"
-#include "vtkInformationExecutivePortKey.h"
-#include "vtkInformationVector.h"
-#include "vtkObjectFactory.h"
-#include "vtkPolyData.h"
-//#include "vtkProcessModule.h"
-#include "vtkSmartPointer.h"
-#include "vtkUnstructuredGrid.h"
-//#include "vtkUpdateSuppressorPipeline.h"
-
-#include <vtkstd/map>
-
-#ifdef MYDEBUG
-# define vtkMyDebug(x)\
-    cout << x;
-#else
-# define vtkMyDebug(x)
-#endif
-
-vtkCxxRevisionMacro(vtkPVUpdateSuppressor, "$Revision$")
-;
-vtkStandardNewMacro(vtkPVUpdateSuppressor)
-;
-//----------------------------------------------------------------------------
-vtkPVUpdateSuppressor::vtkPVUpdateSuppressor()
-{
-  this->UpdatePiece = 0;
-  this->UpdateNumberOfPieces = 1;
-
-  this->UpdateTime = 0.0;
-  this->UpdateTimeInitialized = false;
-
-  this->Enabled = 1;
-
-  //  vtkProcessModule* pm = vtkProcessModule::GetProcessModule();
-  //
-  //  if (pm)
-  //    {
-  //    this->UpdateNumberOfPieces = pm->GetNumberOfLocalPartitions();
-  //    this->UpdatePiece = pm->GetPartitionId();
-  //    }
-}
-
-//----------------------------------------------------------------------------
-vtkPVUpdateSuppressor::~vtkPVUpdateSuppressor()
-{
-}
-
-//----------------------------------------------------------------------------
-void vtkPVUpdateSuppressor::SetUpdateTime(double utime)
-{
-  this->UpdateTimeInitialized = true;
-  if (this->UpdateTime != utime)
-    {
-      this->Modified();
-      this->UpdateTime = utime;
-    }
-}
-
-//----------------------------------------------------------------------------
-void vtkPVUpdateSuppressor::SetEnabled(int enable)
-{
-  if (this->Enabled == enable)
-    {
-      return;
-    }
-  this->Enabled = enable;
-  this->Modified();
-  //  vtkUpdateSuppressorPipeline* executive =
-  //    vtkUpdateSuppressorPipeline::SafeDownCast(this->GetExecutive());
-  //  if (executive)
-  //    {
-  //    executive->SetEnabled(enable);
-  //    }
-}
-
-//----------------------------------------------------------------------------
-void vtkPVUpdateSuppressor::ForceUpdate()
-{
-  // Make sure that output type matches input type
-  this->UpdateInformation();
-
-  vtkDataObject *input = this->GetInput();
-  if (input == 0)
-    {
-      vtkErrorMacro("No valid input.");
-      return;
-    }
-  vtkDataObject *output = this->GetOutput();
-
-  // int fixme; // I do not like this hack.  How can we get rid of it?
-  // Assume the input is the collection filter.
-  // Client needs to modify the collection filter because it is not
-  // connected to a pipeline.
-  vtkAlgorithm *source = input->GetProducerPort()->GetProducer();
-  if (source && (source->IsA("vtkMPIMoveData")
-      || source->IsA("vtkCollectPolyData") || source->IsA("vtkM2NDuplicate")
-      || source->IsA("vtkM2NCollect")
-      || source->IsA("vtkOrderedCompositeDistributor")
-      || source->IsA("vtkClientServerMoveData")))
-    {
-      source->Modified();
-    }
-
-  vtkInformation* info = input->GetPipelineInformation();
-  vtkStreamingDemandDrivenPipeline
-      * sddp =
-          vtkStreamingDemandDrivenPipeline::SafeDownCast(
-                                                         vtkExecutive::PRODUCER()->GetExecutive(
-                                                                                                info));
-  if (sddp)
-    {
-      sddp->SetUpdateExtent(info, this->UpdatePiece,
-                            this->UpdateNumberOfPieces, 0);
-    }
-  else
-    {
-      input->SetUpdatePiece(this->UpdatePiece);
-      input->SetUpdateNumberOfPieces(this->UpdateNumberOfPieces);
-      input->SetUpdateGhostLevel(0);
-    } vtkMyDebug("ForceUpdate ");
-  if (this->UpdateTimeInitialized)
-    {
-      info->Set(vtkCompositeDataPipeline::UPDATE_TIME_STEPS(),
-                &this->UpdateTime, 1);
-      vtkMyDebug(this->UpdateTime);
-    } vtkMyDebug(endl);
-
-  input->Update();
-  // Input may have changed, we obtain the pointer again.
-  input = this->GetInput();
-
-  output->ShallowCopy(input);
-  this->PipelineUpdateTime.Modified();
-}
-
-//----------------------------------------------------------------------------
-vtkExecutive* vtkPVUpdateSuppressor::CreateDefaultExecutive()
-{
-  vtkUpdateSuppressorPipeline* executive = vtkUpdateSuppressorPipeline::New();
-  executive->SetEnabled(this->Enabled);
-  return executive;
-}
-
-//----------------------------------------------------------------------------
-int vtkPVUpdateSuppressor::RequestDataObject(
-                                             vtkInformation* vtkNotUsed(reqInfo),
-                                             vtkInformationVector** inputVector,
-                                             vtkInformationVector* outputVector)
-{
-  vtkInformation* inInfo = inputVector[0]->GetInformationObject(0);
-  if (!inInfo)
-    {
-      return 0;
-    }
-
-  vtkDataObject *input = inInfo->Get(vtkDataObject::DATA_OBJECT());
-  if (input)
-    {
-      // for each output
-      for (int i = 0; i < this->GetNumberOfOutputPorts(); ++i)
-        {
-          vtkInformation* outInfo = outputVector->GetInformationObject(i);
-          vtkDataObject *output = outInfo->Get(vtkDataObject::DATA_OBJECT());
-
-          if (!output || !output->IsA(input->GetClassName()))
-            {
-              vtkDataObject* newOutput = input->NewInstance();
-              newOutput->SetPipelineInformation(outInfo);
-              newOutput->Delete();
-              this->GetOutputPortInformation(i)->Set(
-                                                     vtkDataObject::DATA_EXTENT_TYPE(),
-                                                     newOutput->GetExtentType());
-            }
-        }
-      return 1;
-    }
-  return 0;
-
-}
-
-//----------------------------------------------------------------------------
-int vtkPVUpdateSuppressor::RequestData(vtkInformation* vtkNotUsed(reqInfo),
-                                       vtkInformationVector** inputVector,
-                                       vtkInformationVector* outputVector)
-{
-  // RequestData is only called by its executive when 
-  // (Enabled==off) and thus acting as a passthrough filter
-  vtkInformation *outInfo = outputVector->GetInformationObject(0);
-  vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
-  vtkDataObject *input = inInfo->Get(vtkDataObject::DATA_OBJECT());
-  vtkDataObject *output = outInfo->Get(vtkDataObject::DATA_OBJECT());
-
-  output->ShallowCopy(input);
-  return 1;
-}
-
-//----------------------------------------------------------------------------
-void vtkPVUpdateSuppressor::PrintSelf(ostream& os, vtkIndent indent)
-{
-  this->Superclass::PrintSelf(os, indent);
-  os << indent << "UpdatePiece: " << this->UpdatePiece << endl;
-  os << indent << "UpdateNumberOfPieces: " << this->UpdateNumberOfPieces
-      << endl;
-  os << indent << "Enabled: " << this->Enabled << endl;
-  os << indent << "UpdateTime: " << this->UpdateTime << endl;
-}
diff --git a/src/OBJECT/SMESH_vtkPVUpdateSuppressor.h b/src/OBJECT/SMESH_vtkPVUpdateSuppressor.h
deleted file mode 100644 (file)
index 4cd0624..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/*=========================================================================
-
- Program:   ParaView
- Module:    $RCSfile$
-
- Copyright (c) Kitware, Inc.
- All rights reserved.
- See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
-
- This software is distributed WITHOUT ANY WARRANTY; without even
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE.  See the above copyright notice for more information.
-
- =========================================================================*/
-// .NAME vtkPVUpdateSuppressor - prevents propagation of update
-// .SECTION Description 
-// vtkPVUpdateSuppressor now uses the vtkProcessModule singleton to set up the
-// default values for UpdateNumberOfPieces and UpdatePiece, so we no longer have
-// to set the default values (in most cases).
-// .SECTION See Also
-// vtkPVCacheKeeper vtkUpdateSuppressorPipeline
-
-#ifndef __vtkPVUpdateSuppressor_h
-#define __vtkPVUpdateSuppressor_h
-
-#include "vtkDataObjectAlgorithm.h"
-
-class VTK_EXPORT vtkPVUpdateSuppressor: public vtkDataObjectAlgorithm
-{
-public:
-vtkTypeRevisionMacro(vtkPVUpdateSuppressor,vtkDataObjectAlgorithm)
-  ;
-  void PrintSelf(ostream& os, vtkIndent indent);
-
-  // Description:
-  // Construct with user-specified implicit function.
-  static vtkPVUpdateSuppressor *New();
-
-  // Description:
-  // Force update on the input.
-  virtual void ForceUpdate();
-
-  // Description:
-  // Set number of pieces and piece on the data.
-  // This causes the filter to ingore the request from the output.
-  // It is here because the user may not have celled update on the output
-  // before calling force update (it is an easy fix).
-  vtkSetMacro(UpdatePiece, int)
-  ;
-  vtkGetMacro(UpdatePiece, int)
-  ;
-  vtkSetMacro(UpdateNumberOfPieces, int)
-  ;
-  vtkGetMacro(UpdateNumberOfPieces, int)
-  ;
-
-  // Description:
-  // Get/Set if the update suppressor is enabled. If the update suppressor 
-  // is not enabled, it won't supress any updates. Enabled by default.
-  void SetEnabled(int);
-  vtkGetMacro(Enabled, int)
-  ;
-
-  // Description:
-  // Get/Set the update time that is sent up the pipeline.
-  void SetUpdateTime(double utime);
-  vtkGetMacro(UpdateTime, double)
-  ;
-
-protected:
-  vtkPVUpdateSuppressor();
-  ~vtkPVUpdateSuppressor();
-
-  int RequestDataObject(vtkInformation* request,
-                        vtkInformationVector **inputVector,
-                        vtkInformationVector *outputVector);
-  int RequestData(vtkInformation* request, vtkInformationVector **inputVector,
-                  vtkInformationVector *outputVector);
-
-  int UpdatePiece;
-  int UpdateNumberOfPieces;
-  double UpdateTime;
-
-  bool UpdateTimeInitialized;
-
-  int Enabled;
-
-  vtkTimeStamp PipelineUpdateTime;
-
-  // Create a default executive.
-  virtual vtkExecutive* CreateDefaultExecutive();
-
-private:
-  vtkPVUpdateSuppressor(const vtkPVUpdateSuppressor&); // Not implemented.
-  void operator=(const vtkPVUpdateSuppressor&); // Not implemented.
-};
-
-#endif
index bc561a20b5593f70b0f44bb27a03c6ea91df2184..d4f4a9abc4dbd76de601aba20c02f25c0871fb47 100644 (file)
@@ -95,21 +95,27 @@ void SMDS_VtkVolume::initPoly(std::vector<vtkIdType> nodeIds, std::vector<int> n
     {
       int nf = nbNodesPerFace[i];
       ptIds.push_back(nf);
-      double a[3];
-      double b[3];
-      double c[3];
-      grid->GetPoints()->GetPoint(nodeIds[k], a);
-      grid->GetPoints()->GetPoint(nodeIds[k + 1], b);
-      grid->GetPoints()->GetPoint(nodeIds[k + 2], c);
-      bool isFaceForward = this->isForward(a, b, c, center);
+      // EAP: a right approach is:
+      // - either the user should care of order of nodes or
+      // - the user should use a service method arranging nodes if he
+      //   don't want or can't to do it by him-self
+      // The method below works OK only with planar faces
+      //
+      // double a[3];
+      // double b[3];
+      // double c[3];
+      // grid->GetPoints()->GetPoint(nodeIds[k], a);
+      // grid->GetPoints()->GetPoint(nodeIds[k + 1], b);
+      // grid->GetPoints()->GetPoint(nodeIds[k + 2], c);
+      // bool isFaceForward = this->isForward(a, b, c, center);
       //MESSAGE("isFaceForward " << i << " " << isFaceForward);
       vtkIdType *facePts = &nodeIds[k];
-      if (isFaceForward)
+      //if (isFaceForward)
         for (int n = 0; n < nf; n++)
           ptIds.push_back(facePts[n]);
-      else
-        for (int n = nf - 1; n >= 0; n--)
-          ptIds.push_back(facePts[n]);
+      // else
+      //   for (int n = nf - 1; n >= 0; n--)
+      //     ptIds.push_back(facePts[n]);
       k += nf;
     }
   myVtkID = grid->InsertNextLinkedCell(VTK_POLYHEDRON, nbFaces, &ptIds[0]);
index e561cff93111cc6c257f8c3edcf3ff5f9ad42eda..f1d3fad659d984b9f8912471f98850eb5455503d 100644 (file)
@@ -438,7 +438,7 @@ bool SMESH_Algo::GetSortedNodesOnEdge(const SMESHDS_Mesh*                   theM
         return false;
       const SMDS_EdgePosition* epos =
         static_cast<const SMDS_EdgePosition*>(node->GetPosition());
-      theNodes.insert( make_pair( epos->GetUParameter(), node ));
+      theNodes.insert( theNodes.end(), make_pair( epos->GetUParameter(), node ));
       //MESSAGE("U " << epos->GetUParameter() << " ID " << node->GetID());
       ++nbNodes;
     }
index e76cc89978397e4bcb7f498424ef5aee84d457ce..fbcfc3d1a0b3e38ef1aa61566bd541b5813412c6 100644 (file)
@@ -128,6 +128,7 @@ bool SMESH_Gen::Compute(SMESH_Mesh &          aMesh,
 
   const bool includeSelf = true;
   const bool complexShapeFirst = true;
+  const int  globalAlgoDim = 100;
 
   SMESH_subMeshIteratorPtr smIt;
 
@@ -214,19 +215,30 @@ bool SMESH_Gen::Compute(SMESH_Mesh &          aMesh,
         if ( algo->SupportSubmeshes() )
         {
           // reload sub-meshes from shDim2sm into smWithAlgoSupportingSubmeshes
+          // so that more local algos to go first
           if ( prevShapeDim != aShapeDim )
           {
             prevShapeDim = aShapeDim;
             for ( shDim2smIt = shDim2sm.rbegin(); shDim2smIt != shDim2sm.rend(); ++shDim2smIt )
-              smWithAlgoSupportingSubmeshes.push_front( shDim2smIt->second );
+              if ( shDim2smIt->first == globalAlgoDim )
+                smWithAlgoSupportingSubmeshes.push_back( shDim2smIt->second );
+              else
+                smWithAlgoSupportingSubmeshes.push_front( shDim2smIt->second );
             shDim2sm.clear();
           }
           // add smToCompute to shDim2sm map
-          aShapeDim = GetShapeDim( algoShape );
-          if ( algoShape.ShapeType() == TopAbs_COMPOUND )
+          if ( algoShape.IsSame( aMesh.GetShapeToMesh() ))
           {
-            TopoDS_Iterator it( algoShape );
-            aShapeDim += GetShapeDim( it.Value() );
+            aShapeDim = globalAlgoDim; // to compute last
+          }
+          else
+          {
+            aShapeDim = GetShapeDim( algoShape );
+            if ( algoShape.ShapeType() == TopAbs_COMPOUND )
+            {
+              TopoDS_Iterator it( algoShape );
+              aShapeDim += GetShapeDim( it.Value() );
+            }
           }
           shDim2sm.insert( make_pair( aShapeDim, smToCompute ));
         }
@@ -248,7 +260,10 @@ bool SMESH_Gen::Compute(SMESH_Mesh &          aMesh,
     }
     // reload sub-meshes from shDim2sm into smWithAlgoSupportingSubmeshes
     for ( shDim2smIt = shDim2sm.rbegin(); shDim2smIt != shDim2sm.rend(); ++shDim2smIt )
-      smWithAlgoSupportingSubmeshes.push_front( shDim2smIt->second );
+      if ( shDim2smIt->first == globalAlgoDim )
+        smWithAlgoSupportingSubmeshes.push_back( shDim2smIt->second );
+      else
+        smWithAlgoSupportingSubmeshes.push_front( shDim2smIt->second );
 
     // ------------------------------------------------------------
     // sort list of submeshes according to mesh order
@@ -289,7 +304,7 @@ bool SMESH_Gen::Compute(SMESH_Mesh &          aMesh,
         SMESH_HypoFilter filter( SMESH_HypoFilter::IsAlgo() );
         filter
           .And( SMESH_HypoFilter::IsApplicableTo( aSubShape ))
-          .And( SMESH_HypoFilter::IsMoreLocalThan( algoShape ));
+          .And( SMESH_HypoFilter::IsMoreLocalThan( algoShape, aMesh.GetShapeToMesh() ));
 
         if ( SMESH_Algo* subAlgo = (SMESH_Algo*) aMesh.GetHypothesis( aSubShape, filter, true )) {
           SMESH_Hypothesis::Hypothesis_Status status;
@@ -501,7 +516,7 @@ bool SMESH_Gen::Evaluate(SMESH_Mesh &          aMesh,
         SMESH_HypoFilter filter( SMESH_HypoFilter::IsAlgo() );
         filter
           .And( SMESH_HypoFilter::IsApplicableTo( aSubShape ))
-          .And( SMESH_HypoFilter::IsMoreLocalThan( algoShape ));
+          .And( SMESH_HypoFilter::IsMoreLocalThan( algoShape, aMesh.GetShapeToMesh() ));
 
         if ( SMESH_Algo* subAlgo = (SMESH_Algo*) aMesh.GetHypothesis( aSubShape, filter, true )) {
           SMESH_Hypothesis::Hypothesis_Status status;
index 1bfef12493895cd40f8bf7d906d6e4ed8c2c1350..ce30933792ce6ecb681753a433cd503333865e47 100644 (file)
@@ -129,6 +129,9 @@ bool SMESH_HypoFilter::IsAssignedToPredicate::IsOk(const SMESH_Hypothesis* aHyp,
 bool SMESH_HypoFilter::IsMoreLocalThanPredicate::IsOk(const SMESH_Hypothesis* aHyp,
                                                       const TopoDS_Shape&     aShape) const
 {
+  if ( aShape.IsSame( _shapeToMesh ))
+    return false; // aHyp is global
+
   if ( SMESH_MesherHelper::IsSubShape( aShape, /*mainShape=*/_shape ))
     return true;
 
@@ -293,9 +296,10 @@ SMESH_HypoPredicate* SMESH_HypoFilter::IsApplicableTo(const TopoDS_Shape& theSha
 //purpose  : 
 //=======================================================================
 
-SMESH_HypoPredicate* SMESH_HypoFilter::IsMoreLocalThan(const TopoDS_Shape& theShape)
+SMESH_HypoPredicate* SMESH_HypoFilter::IsMoreLocalThan(const TopoDS_Shape& theShape,
+                                                       const TopoDS_Shape& theShapeToMesh)
 {
-  return new IsMoreLocalThanPredicate( theShape );
+  return new IsMoreLocalThanPredicate( theShape, theShapeToMesh);
 }
 
 //=======================================================================
index 31327f1ec105b25af6b11ee765bfc9023f761ace..79825295b63ecf13c6091f03bfeff6daa76ea09f 100644 (file)
@@ -72,7 +72,8 @@ class SMESH_EXPORT SMESH_HypoFilter: public SMESH_HypoPredicate
   static SMESH_HypoPredicate* IsAssignedTo(const TopoDS_Shape& theShape);
   static SMESH_HypoPredicate* Is(const SMESH_Hypothesis* theHypo);
   static SMESH_HypoPredicate* IsGlobal(const TopoDS_Shape& theMainShape);
-  static SMESH_HypoPredicate* IsMoreLocalThan(const TopoDS_Shape& theShape);
+  static SMESH_HypoPredicate* IsMoreLocalThan(const TopoDS_Shape& theShape,
+                                              const TopoDS_Shape& theShapeToMesh);
   static SMESH_HypoPredicate* HasName(const std::string & theName);
   static SMESH_HypoPredicate* HasDim(const int theDim);
   static SMESH_HypoPredicate* HasType(const int theHypType);
@@ -169,8 +170,10 @@ class SMESH_EXPORT SMESH_HypoFilter: public SMESH_HypoPredicate
   };
         
   struct IsMoreLocalThanPredicate : public SMESH_HypoPredicate {
-    TopoDS_Shape _shape;
-    IsMoreLocalThanPredicate( const TopoDS_Shape& shape ):_shape(shape){}
+    TopoDS_Shape _shape, _shapeToMesh;
+    IsMoreLocalThanPredicate( const TopoDS_Shape& shape,
+                              const TopoDS_Shape& shapeToMesh )
+      :_shape(shape),_shapeToMesh(shapeToMesh){}
     bool IsOk(const SMESH_Hypothesis* aHyp,
               const TopoDS_Shape&     aShape) const;
   };
index 09064df27f131b45d30d9a5d371e3a16b9b8a878..c750600c474df7aa7f0232f452bba104778a09e2 100644 (file)
@@ -1754,6 +1754,9 @@ SMESH_Group* SMESH_Mesh::ConvertToStandalone ( int theGroupID )
   while ( anItr->more() )
     aNewGrpDS->Add( (anItr->next())->GetID() );
 
+  // set color
+  aNewGrpDS->SetColor( anOldGrpDS->GetColor() );
+
   // remove old group
   delete anOldGrp;
 
index 55bd1be818f7adc0ca2cc1cf5ddaf3dc7b69c276..42f16ded3ed6e7a1d7f042c206b3f762a8eb3823 100644 (file)
@@ -90,7 +90,7 @@
 #include <gp_XY.hxx>
 #include <gp_XYZ.hxx>
 
-#include <math.h>
+#include <cmath>
 
 #include <map>
 #include <set>
index eba6db261caa420e17a105739efdee79334505a4..34cef148deca4712e7e86afcb159b758061a334c 100644 (file)
@@ -895,7 +895,8 @@ bool SMESH_MesherHelper::CheckNodeU(const TopoDS_Edge&   E,
 
 //=======================================================================
 //function : GetMediumPos
-//purpose  : Return index and type of the shape to set a medium node on
+//purpose  : Return index and type of the shape  (EDGE or FACE only) to
+//          set a medium node on
 //=======================================================================
 
 std::pair<int, TopAbs_ShapeEnum> SMESH_MesherHelper::GetMediumPos(const SMDS_MeshNode* n1,
@@ -910,42 +911,40 @@ std::pair<int, TopAbs_ShapeEnum> SMESH_MesherHelper::GetMediumPos(const SMDS_Mes
     shapeType = myShape.ShapeType();
     shapeID   = myShapeID;
   }
+  else if ( n1->getshapeId() == n2->getshapeId() )
+  {
+    shapeID = n2->getshapeId();
+    shape = GetSubShapeByNode( n1, GetMeshDS() );
+  }
   else
   {
-    const SMDS_PositionPtr Pos1 = n1->GetPosition();
-    const SMDS_PositionPtr Pos2 = n2->GetPosition();
+    const SMDS_TypeOfPosition Pos1 = n1->GetPosition()->GetTypeOfPosition();
+    const SMDS_TypeOfPosition Pos2 = n2->GetPosition()->GetTypeOfPosition();
 
-    if( Pos1->GetTypeOfPosition()==SMDS_TOP_FACE )
-    {
-      shapeType = TopAbs_FACE;
-      shapeID   = n1->getshapeId();
-    }
-    else if( Pos2->GetTypeOfPosition()==SMDS_TOP_FACE )
+    if ( Pos1 == SMDS_TOP_3DSPACE || Pos2 == SMDS_TOP_3DSPACE )
     {
-      shapeType = TopAbs_FACE;
-      shapeID   = n2->getshapeId();
     }
-    else if (Pos1->GetTypeOfPosition()==SMDS_TOP_3DSPACE ||
-             Pos2->GetTypeOfPosition()==SMDS_TOP_3DSPACE )
+    else if ( Pos1 == SMDS_TOP_FACE || Pos2 == SMDS_TOP_FACE )
     {
-    }
-    else if ( Pos1->GetTypeOfPosition()==SMDS_TOP_EDGE &&
-              Pos2->GetTypeOfPosition()==SMDS_TOP_EDGE )
-    {
-      if ( n1->getshapeId() == n2->getshapeId() )
+      if ( Pos1 != SMDS_TOP_FACE || Pos2 != SMDS_TOP_FACE )
       {
-        shapeType = TopAbs_EDGE;
-        shapeID   = n1->getshapeId();
-      }
-      else
-      {
-        TopoDS_Shape E1 = GetSubShapeByNode( n1, GetMeshDS() );
-        TopoDS_Shape E2 = GetSubShapeByNode( n2, GetMeshDS() );
-        shape = GetCommonAncestor( E1, E2, *myMesh, TopAbs_FACE );
+        if ( Pos1 != SMDS_TOP_FACE ) std::swap( n1,n2 );
+        TopoDS_Shape F = GetSubShapeByNode( n1, GetMeshDS() );
+        TopoDS_Shape S = GetSubShapeByNode( n2, GetMeshDS() );
+        if ( IsSubShape( S, F ))
+        {
+          shapeType = TopAbs_FACE;
+          shapeID   = n1->getshapeId();
+        }
       }
     }
-    else if ( Pos1->GetTypeOfPosition()==SMDS_TOP_VERTEX &&
-              Pos2->GetTypeOfPosition()==SMDS_TOP_VERTEX )
+    else if ( Pos1 == SMDS_TOP_EDGE && Pos2 == SMDS_TOP_EDGE )
+    {
+      TopoDS_Shape E1 = GetSubShapeByNode( n1, GetMeshDS() );
+      TopoDS_Shape E2 = GetSubShapeByNode( n2, GetMeshDS() );
+      shape = GetCommonAncestor( E1, E2, *myMesh, TopAbs_FACE );
+    }
+    else if ( Pos1 == SMDS_TOP_VERTEX && Pos2 == SMDS_TOP_VERTEX )
     {
       TopoDS_Shape V1 = GetSubShapeByNode( n1, GetMeshDS() );
       TopoDS_Shape V2 = GetSubShapeByNode( n2, GetMeshDS() );
@@ -954,7 +953,7 @@ std::pair<int, TopAbs_ShapeEnum> SMESH_MesherHelper::GetMediumPos(const SMDS_Mes
     }
     else // VERTEX and EDGE
     {
-      if ( Pos1->GetTypeOfPosition()!=SMDS_TOP_VERTEX ) std::swap( n1,n2 );
+      if ( Pos1 != SMDS_TOP_VERTEX ) std::swap( n1,n2 );
       TopoDS_Shape V = GetSubShapeByNode( n1, GetMeshDS() );
       TopoDS_Shape E = GetSubShapeByNode( n2, GetMeshDS() );
       if ( IsSubShape( V, E ))
@@ -963,9 +962,11 @@ std::pair<int, TopAbs_ShapeEnum> SMESH_MesherHelper::GetMediumPos(const SMDS_Mes
         shape = GetCommonAncestor( V, E, *myMesh, TopAbs_FACE );
     }
   }
+
   if ( !shape.IsNull() )
   {
-    shapeID = GetMeshDS()->ShapeToIndex( shape );
+    if ( shapeID < 1 )
+      shapeID = GetMeshDS()->ShapeToIndex( shape );
     shapeType = shape.ShapeType();
   }
   return make_pair( shapeID, shapeType );
@@ -999,9 +1000,6 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1,
 
   // get type of shape for the new medium node
   int faceID = -1, edgeID = -1;
-  const SMDS_PositionPtr Pos1 = n1->GetPosition();
-  const SMDS_PositionPtr Pos2 = n2->GetPosition();
-
   TopoDS_Edge E; double u [2];
   TopoDS_Face F; gp_XY  uv[2];
   bool uvOK[2] = { false, false };
@@ -1017,10 +1015,11 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1,
   }
   else if ( pos.second == TopAbs_EDGE )
   {
-    if ( Pos1->GetTypeOfPosition()==SMDS_TOP_EDGE &&
-         Pos2->GetTypeOfPosition()==SMDS_TOP_EDGE &&
-         n1->getshapeId() != n2->getshapeId() ) // issue 0021006
-    return getMediumNodeOnComposedWire(n1,n2,force3d);
+    if ( n1->GetPosition()->GetTypeOfPosition()==SMDS_TOP_EDGE &&
+         n2->GetPosition()->GetTypeOfPosition()==SMDS_TOP_EDGE &&
+         n1->getshapeId() != n2->getshapeId() )
+      // issue 0021006
+      return getMediumNodeOnComposedWire(n1,n2,force3d);
     
     E = TopoDS::Edge(meshDS->IndexToShape( edgeID = pos.first ));
     u[0] = GetNodeU(E,n1,n2, force3d ? 0 : &uvOK[0]);
index 676cbf2e44773fd967f0989eee90452d793d4cee..e5ec87a14f5bcb64381cbd825b1aa0ba67623294 100644 (file)
@@ -461,7 +461,7 @@ public:
                                      const SMDS_MeshNode* n2,
                                      const bool force3d);
   /*!
-   * \brief Return index and type of the shape to set a medium node on
+   * \brief Return index and type of the shape (EDGE or FACE only) to set a medium node on
    */
   std::pair<int, TopAbs_ShapeEnum> GetMediumPos(const SMDS_MeshNode* n1,
                                                 const SMDS_MeshNode* n2);
index 73b130c91516791815541919421e656408a07b98..73bd794f52a9ed8944e0ae67de0653fd22ce4fda 100644 (file)
@@ -2073,11 +2073,17 @@ void SMESH_subMesh::NotifyListenersOnEvent( const int         event,
 {
   map< EventListener*, EventListenerData* >::iterator l_d = myEventListeners.begin();
   for ( ; l_d != myEventListeners.end(); ++l_d )
-    if ( (*l_d).first->myBusySM.insert( this ).second )
+  {
+    std::pair< EventListener*, EventListenerData* > li_da = *l_d; /* copy to enable removal
+                                                                     of a listener from
+                                                                     myEventListeners by
+                                                                     its ProcessEvent() */
+    if ( li_da.first->myBusySM.insert( this ).second )
     {
-      l_d->first->ProcessEvent( event, eventType, this, l_d->second, hyp );
-      l_d->first->myBusySM.erase( this );
+      li_da.first->ProcessEvent( event, eventType, this, li_da.second, hyp );
+      li_da.first->myBusySM.erase( this );
     }
+  }
 }
 
 //================================================================================
index 5add18a61e93188c4349a181d64b255d07da3bd9..77b1b66b35542418bf535665ed6df60640198079 100644 (file)
@@ -23,6 +23,9 @@
 //  Author : Nicolas REJNERI, Open CASCADE S.A.S.
 
 #include <Standard_math.hxx>  // E.A. must be included before Python.h to fix compilation on windows
+#ifdef HAVE_FINITE
+#undef HAVE_FINITE            // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
+#endif
 #include "Python.h"
 //  SMESH includes
 #include "SMESHGUI.h"
@@ -49,7 +52,6 @@
 #include "SMESHGUI_Hypotheses.h"
 #include "SMESHGUI_Make2DFrom3DOp.h"
 #include "SMESHGUI_MakeNodeAtPointDlg.h"
-//#include "SMESHGUI_MeshInfosDlg.h"
 #include "SMESHGUI_Measurements.h"
 #include "SMESHGUI_MeshInfo.h"
 #include "SMESHGUI_MeshOp.h"
 #include "SMESHGUI_SewingDlg.h"
 #include "SMESHGUI_SingleEditDlg.h"
 #include "SMESHGUI_SmoothingDlg.h"
-//#include "SMESHGUI_StandardMeshInfosDlg.h"
 #include "SMESHGUI_SymmetryDlg.h"
 #include "SMESHGUI_TranslationDlg.h"
 #include "SMESHGUI_ScaleDlg.h"
 #include "SMESHGUI_TransparencyDlg.h"
-//#include "SMESHGUI_WhatIsDlg.h"
 #include "SMESHGUI_DuplicateNodesDlg.h"
 #include "SMESHGUI_CopyMeshDlg.h"
 
       QMap<QString, SMESH::MED_VERSION> aFilterMap;
       //QString v21 (aMesh->GetVersionString(SMESH::MED_V2_1, 2));
       if ( isMED ) {
-       QString v22 (aMesh->GetVersionString(SMESH::MED_V2_2, 2));
-       //aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v21 ) + " (*.med)", SMESH::MED_V2_1 );
-       aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v22 ) + " (*.med)", SMESH::MED_V2_2 );
+        QString v22 (aMesh->GetVersionString(SMESH::MED_V2_2, 2));
+        //aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v21 ) + " (*.med)", SMESH::MED_V2_1 );
+        aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v22 ) + " (*.med)", SMESH::MED_V2_2 );
       }
       else { // isSAUV
-       aFilterMap.insert("All files (*)", SMESH::MED_V2_1 );
-       aFilterMap.insert("SAUV files (*.sauv)", SMESH::MED_V2_2 );
-       aFilterMap.insert("SAUV files (*.sauve)", SMESH::MED_V2_1 );
+        aFilterMap.insert("All files (*)", SMESH::MED_V2_1 );
+        aFilterMap.insert("SAUV files (*.sauv)", SMESH::MED_V2_2 );
+        aFilterMap.insert("SAUV files (*.sauve)", SMESH::MED_V2_1 );
       }
 
       QStringList filters;
           }
         }
         else if ( isSAUV )
-       {
-         for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ )
-         {
-           SMESH::SMESH_Mesh_var aMeshItem = SMESH::SMESH_Mesh::_narrow( (*aMeshIter).first );
-           if( !aMeshItem->_is_nil() )
-             aMeshItem->ExportSAUV( aFilename.toLatin1().data(), toCreateGroups );
-         }
-       }
+        {
+          for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ )
+          {
+            SMESH::SMESH_Mesh_var aMeshItem = SMESH::SMESH_Mesh::_narrow( (*aMeshIter).first );
+            if( !aMeshItem->_is_nil() )
+              aMeshItem->ExportSAUV( aFilename.toLatin1().data(), toCreateGroups );
+          }
+        }
         else if ( isDAT )
         {
           if ( aMeshOrGroup->_is_equivalent( aMesh ))
@@ -2736,38 +2736,6 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       }
       break;
     }
-    /*
-  case 902:                                     // STANDARD MESH INFOS
-    {
-      EmitSignalDeactivateDialog();
-      LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
-      SALOME_ListIO selected;
-      if( aSel )
-        aSel->selectedObjects( selected );
-
-      if ( selected.Extent() > 1 ) { // a dlg for each IO
-        SALOME_ListIO IOs;
-        SALOME_ListIteratorOfListIO It (selected);
-        for ( ; It.More(); It.Next() ) {
-          IOs.Clear();
-          IOs.Append( It.Value() );
-          aSel->setSelectedObjects( IOs );
-          ( new SMESHGUI_StandardMeshInfosDlg( this ) )->show();
-        }
-        // restore selection
-        aSel->setSelectedObjects( selected );
-      }
-      else
-        ( new SMESHGUI_StandardMeshInfosDlg( this ) )->show();
-      break;
-    }
-  case 903:                                     // WHAT IS
-    {
-      EmitSignalDeactivateDialog();
-      ( new SMESHGUI_WhatIsDlg( this ) )->show();
-      break;
-    }
-    */
 
   case 904:                                     // FIND ELEM
     {
index 6e25fd08fb1b22c8a8078c26bdafbc69d9648d0d..0de69046ad5285ebdf416e6208cbbdd9b1d9888e 100644 (file)
@@ -243,7 +243,8 @@ SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI* theModule,
                                                         int nbNodes )
   : QDialog( SMESH::GetDesktop( theModule ) ),
     mySMESHGUI( theModule ),
-    mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
+    mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
+    myBusy ( false )
 {
   setModal( false );
   setAttribute( Qt::WA_DeleteOnClose, true );
@@ -371,6 +372,7 @@ SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI* theModule,
   TextLabel_GroupName = new QLabel( tr( "SMESH_GROUP" ), GroupGroups );
   ComboBox_GroupName = new QComboBox( GroupGroups );
   ComboBox_GroupName->setEditable( true );
+  ComboBox_GroupName->setInsertPolicy( QComboBox::NoInsert );
 
   GroupGroupsLayout->addWidget( TextLabel_GroupName );
   GroupGroupsLayout->addWidget( ComboBox_GroupName, 1 );
@@ -496,7 +498,7 @@ void SMESHGUI_AddMeshElementDlg::ClickOnApply()
         if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
           idx = i;
       }
-      if ( idx > 0 ) {
+      if ( idx > 0 && idx < myGroups.count() ) {
         SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
         if ( !aGeomGroup->_is_nil() ) {
           int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
index daa119db5590a1597597afda75ac8672638a1fdb..4f7459785ee2c533d26f864faf4328b83fcb2b60 100644 (file)
@@ -359,8 +359,6 @@ static int LastPentahedronIds[] =  {1,2,0,4,5,3,3,4,5};
 static int FirstHexahedronIds[] = {0,1,2,3,4,5,6,7,0,1,2,3};
 static int LastHexahedronIds[] =  {1,2,3,0,5,6,7,4,4,5,6,7};
 
-
-
 /*!
   \class BusyLocker
   \brief Simple 'busy state' flag locker.
@@ -419,7 +417,8 @@ SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theM
     mySMESHGUI( theModule ),
     mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
     myType( theType ),
-    myBusy( false )
+    myBusy( false ),
+    myIsEditCorners( false )
 {
   setModal( false );
   setAttribute( Qt::WA_DeleteOnClose, true );
@@ -518,6 +517,7 @@ SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theM
   TextLabel_GroupName = new QLabel( tr( "SMESH_GROUP" ), GroupGroups );
   ComboBox_GroupName = new QComboBox( GroupGroups );
   ComboBox_GroupName->setEditable( true );
+  ComboBox_GroupName->setInsertPolicy( QComboBox::NoInsert );
 
   GroupGroupsLayout->addWidget( TextLabel_GroupName );
   GroupGroupsLayout->addWidget( ComboBox_GroupName, 1 );
@@ -733,7 +733,7 @@ void SMESHGUI_AddQuadraticElementDlg::ClickOnApply()
       if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
         idx = i;
     }
-    if ( idx > 0 ) {
+    if ( idx > 0 && idx < myGroups.count() ) {
       SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
       if ( !aGeomGroup->_is_nil() ) {
         int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
index aef376bc9764e0c01e8802698a3137af99933a0b..835d24066d637bd1fdd0d79728ef45f3520a5c8b 100644 (file)
@@ -259,6 +259,7 @@ SMESHGUI_CreatePolyhedralVolumeDlg::SMESHGUI_CreatePolyhedralVolumeDlg( SMESHGUI
   TextLabel_GroupName = new QLabel( tr( "SMESH_GROUP" ), GroupGroups );
   ComboBox_GroupName = new QComboBox( GroupGroups );
   ComboBox_GroupName->setEditable( true );
+  ComboBox_GroupName->setInsertPolicy( QComboBox::NoInsert );
 
   GroupGroupsLayout->addWidget( TextLabel_GroupName );
   GroupGroupsLayout->addWidget( ComboBox_GroupName, 1 );
@@ -462,7 +463,7 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnApply()
           if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
             idx = i;
         }
-        if ( idx > 0 ) {
+        if ( idx > 0 && idx < myGroups.count() ) {
           SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
           if ( !aGeomGroup->_is_nil() ) {
             int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
diff --git a/src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx b/src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx
deleted file mode 100644 (file)
index e076771..0000000
+++ /dev/null
@@ -1,324 +0,0 @@
-// Copyright (C) 2007-2011  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
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// SMESH SMESHGUI : GUI for SMESH component
-// File   : SMESHGUI_MeshInfosDlg.cxx
-// Author : Nicolas BARBEROU
-// SMESH includes
-//
-#include "SMESHGUI_MeshInfosDlg.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_MeshInfosBox.h"
-
-// SALOME GUI includes
-#include <SUIT_Desktop.h>
-#include <SUIT_ResourceMgr.h>
-#include <SUIT_OverrideCursor.h>
-#include <SUIT_Session.h>
-#include <SUIT_MessageBox.h>
-
-#include <LightApp_SelectionMgr.h>
-#include <LightApp_Application.h>
-#include <SALOME_ListIO.hxx>
-
-// SALOME KERNEL includes
-#include <SALOMEDSClient_Study.hxx>
-
-// Qt includes
-#include <QGroupBox>
-#include <QLabel>
-#include <QFrame>
-#include <QStackedWidget>
-#include <QVBoxLayout>
-#include <QHBoxLayout>
-#include <QGridLayout>
-#include <QPushButton>
-#include <QKeyEvent>
-
-// IDL includes
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-#include CORBA_SERVER_HEADER(SMESH_Group)
-
-#define COLONIZE(str)   (QString(str).contains(":") > 0 ? QString(str) : QString(str) + " :" )
-#define SPACING 6
-#define MARGIN  11
-
-//=================================================================================
-// function : SMESHGUI_MeshInfosDlg()
-// purpose  : Constructor
-//=================================================================================
-SMESHGUI_MeshInfosDlg::SMESHGUI_MeshInfosDlg(SMESHGUI* theModule): 
-  QDialog(SMESH::GetDesktop(theModule)),
-  mySelectionMgr(SMESH::GetSelectionMgr(theModule)),
-  mySMESHGUI(theModule)
-{
-  setModal( false );
-  setAttribute( Qt::WA_DeleteOnClose, true );
-  setWindowTitle(tr("SMESH_MESHINFO_TITLE"));
-  setSizeGripEnabled(true);
-
-  myStartSelection = true;
-  myIsActiveWindow = true;
-
-  QVBoxLayout* aTopLayout = new QVBoxLayout(this);
-  aTopLayout->setSpacing(SPACING);  aTopLayout->setMargin(MARGIN);
-
-  // select button & label
-  QPixmap image0(SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH",tr("ICON_SELECT")));
-  mySelectBtn = new QPushButton(this);
-  mySelectBtn->setIcon(image0);
-  mySelectBtn->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
-
-  mySelectLab = new QLabel(this);
-  mySelectLab->setAlignment(Qt::AlignCenter);
-  QFont fnt = mySelectLab->font(); fnt.setBold(true);
-  mySelectLab->setFont(fnt);
-
-  QHBoxLayout* aSelectLayout = new QHBoxLayout;
-  aSelectLayout->setMargin(0); aSelectLayout->setSpacing(0);
-  aSelectLayout->addWidget(mySelectBtn);
-  aSelectLayout->addWidget(mySelectLab);
-
-  // top widget stack
-  myWGStack = new QStackedWidget(this);
-
-  // no valid selection
-  QWidget* myBadWidget = new QWidget(myWGStack);
-  QVBoxLayout* aBadLayout = new QVBoxLayout(myBadWidget);
-  QLabel* myBadLab = new QLabel(tr("SMESH_BAD_SELECTION"), myBadWidget);
-  myBadLab->setAlignment(Qt::AlignCenter);
-  myBadLab->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
-  aBadLayout->addWidget(myBadLab);
-  myWGStack->addWidget(myBadWidget);
-
-  // mesh
-  myMeshWidget = new QWidget(myWGStack);
-  QGridLayout* aMeshLayout = new QGridLayout(myMeshWidget);
-  aMeshLayout->setSpacing(SPACING);  aMeshLayout->setMargin(0);
-  myWGStack->addWidget(myMeshWidget);
-
-  // --> name
-  QLabel* myMeshNameLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_NAME")), myMeshWidget);
-  myMeshName    = new QLabel(myMeshWidget);
-  myMeshName->setMinimumWidth(100);
-  QFrame* line1 = new QFrame(myMeshWidget);
-  line1->setFrameStyle(QFrame::HLine | QFrame::Sunken);
-
-  myMeshInfoBox = new SMESHGUI_MeshInfosBox(true, myMeshWidget);
-
-  aMeshLayout->addWidget(myMeshNameLab,      0, 0);
-  aMeshLayout->addWidget(myMeshName,         0, 1);
-  aMeshLayout->addWidget(line1,              1, 0, 1, 2);
-  aMeshLayout->addWidget(myMeshInfoBox,      2, 0, 1, 2);
-  aMeshLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), 3, 0);
-
-  // buttons
-  myButtonsGroup = new QGroupBox(this);
-  QHBoxLayout* myButtonsGroupLayout = new QHBoxLayout(myButtonsGroup);
-  myButtonsGroupLayout->setSpacing(SPACING); myButtonsGroupLayout->setMargin(MARGIN);
-
-  // buttons --> OK and Help buttons
-  myOkBtn = new QPushButton(tr("SMESH_BUT_OK" ), myButtonsGroup);
-  myOkBtn->setAutoDefault(true);
-  myOkBtn->setDefault(true);
-  myOkBtn->setFocus();
-  myHelpBtn = new QPushButton(tr("SMESH_BUT_HELP" ), myButtonsGroup);
-  myHelpBtn->setAutoDefault(true);
-
-  myButtonsGroupLayout->addWidget(myOkBtn);
-  myButtonsGroupLayout->addSpacing(10);
-  myButtonsGroupLayout->addStretch();
-  myButtonsGroupLayout->addWidget(myHelpBtn);
-
-  aTopLayout->addLayout(aSelectLayout);
-  aTopLayout->addWidget(myWGStack);
-  aTopLayout->addWidget(myButtonsGroup);
-
-  mySMESHGUI->SetActiveDialogBox(this);
-
-  // connect signals
-  connect(myOkBtn,                 SIGNAL(clicked()),                      this, SLOT(close()));
-  connect( myHelpBtn,              SIGNAL(clicked()),                      this, SLOT(onHelp()));
-  connect(mySelectBtn,             SIGNAL(clicked()),                      this, SLOT(onStartSelection()));
-  connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()),        this, SLOT(close()));
-  connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
-  connect(mySelectionMgr,          SIGNAL(currentSelectionChanged()),      this, SLOT(onSelectionChanged()));
-
-  // init dialog with current selection
-  onSelectionChanged();
-
-  myHelpFileName = "mesh_infos_page.html#advanced_mesh_infos_anchor";
-}
-
-//=================================================================================
-// function : ~SMESHGUI_MeshInfosDlg()
-// purpose  : Destructor
-//=================================================================================
-SMESHGUI_MeshInfosDlg::~SMESHGUI_MeshInfosDlg()
-{
-}
-
-//=================================================================================
-// function : DumpMeshInfos()
-// purpose  : 
-//=================================================================================
-void SMESHGUI_MeshInfosDlg::DumpMeshInfos()
-{
-  SUIT_OverrideCursor wc;
-
-  SALOME_ListIO aList;
-  mySelectionMgr->selectedObjects(aList);
-
-  int nbSel = aList.Extent();
-  if (nbSel == 1) {
-    myStartSelection = false;
-    mySelectLab->setText("");
-    Handle(SALOME_InteractiveObject) IObject = aList.First();
-    _PTR(SObject) aSO = SMESH::GetActiveStudyDocument()->FindObjectID(IObject->getEntry());
-    if (aSO) {
-      //CORBA::Object_var anObject = aSO->GetObject();
-      CORBA::Object_var anObject = SMESH::SObjectToObject(aSO);
-      if (!CORBA::is_nil(anObject)) {
-        SMESH::SMESH_IDSource_var anIDSource = SMESH::SMESH_IDSource::_narrow(anObject);
-        if (!anIDSource->_is_nil()) {
-          myWGStack->setCurrentWidget(myMeshWidget);
-          setWindowTitle(tr("SMESH_MESHINFO_TITLE") + " [" + tr("SMESH_OBJECT_MESH") + "]");
-          myMeshName->setText(aSO->GetName().c_str());
-
-          SMESH::long_array_var aMeshInfo = anIDSource->GetMeshInfo();
-          myMeshInfoBox->SetMeshInfo( aMeshInfo );
-
-          return;
-        }
-      }
-    }
-  }
-  myWGStack->setCurrentIndex(0);
-  setWindowTitle(tr("SMESH_MESHINFO_TITLE"));
-}
-
-//=================================================================================
-// function : SelectionIntoArgument()
-// purpose  : Called when selection has changed
-//=================================================================================
-void SMESHGUI_MeshInfosDlg::onSelectionChanged()
-{
-  if (myStartSelection)
-    DumpMeshInfos();
-}
-
-//=================================================================================
-// function : closeEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_MeshInfosDlg::closeEvent(QCloseEvent* e)
-{
-  mySMESHGUI->ResetState();
-  QDialog::closeEvent(e);
-}
-
-//=================================================================================
-// function : windowActivationChange()
-// purpose  : called when window is activated/deactivated
-//=================================================================================
-void SMESHGUI_MeshInfosDlg::windowActivationChange(bool oldActive)
-{
-  QDialog::windowActivationChange(oldActive);
-  if (isActiveWindow() && myIsActiveWindow != isActiveWindow())
-    ActivateThisDialog();
-  myIsActiveWindow = isActiveWindow();
-}
-
-//=================================================================================
-// function : DeactivateActiveDialog()
-// purpose  :
-//=================================================================================
-void SMESHGUI_MeshInfosDlg::DeactivateActiveDialog()
-{
-  disconnect(mySelectionMgr, 0, this, 0);
-}
-
-//=================================================================================
-// function : ActivateThisDialog()
-// purpose  :
-//=================================================================================
-void SMESHGUI_MeshInfosDlg::ActivateThisDialog()
-{
-  /* Emit a signal to deactivate any active dialog */
-  mySMESHGUI->EmitSignalDeactivateDialog();
-  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onSelectionChanged()));
-}
-
-//=================================================================================
-// function : onStartSelection()
-// purpose  : starts selection
-//=================================================================================
-void SMESHGUI_MeshInfosDlg::onStartSelection()
-{
-  myStartSelection = true;
-  onSelectionChanged();
-  myStartSelection = true;
-  mySelectLab->setText(tr("INF_SELECT_OBJECT"));
-}
-
-//=================================================================================
-// function : onHelp()
-// purpose  :
-//=================================================================================
-void SMESHGUI_MeshInfosDlg::onHelp()
-{
-  LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
-  if (app) 
-    app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
-  else {
-    QString platform;
-#ifdef WIN32
-    platform = "winapplication";
-#else
-    platform = "application";
-#endif
-    SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
-                             tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
-                             arg(app->resourceMgr()->stringValue("ExternalBrowser", 
-                                                                 platform)).
-                             arg(myHelpFileName));
-  }
-}
-
-//=================================================================================
-// function : keyPressEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_MeshInfosDlg::keyPressEvent( QKeyEvent* e )
-{
-  QDialog::keyPressEvent( e );
-  if ( e->isAccepted() )
-    return;
-
-  if ( e->key() == Qt::Key_F1 ) {
-    e->accept();
-    onHelp();
-  }
-}
diff --git a/src/SMESHGUI/SMESHGUI_MeshInfosDlg.h b/src/SMESHGUI/SMESHGUI_MeshInfosDlg.h
deleted file mode 100644 (file)
index 988be8b..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (C) 2007-2011  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
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// SMESH SMESHGUI : GUI for SMESH component
-// File   : SMESHGUI_MeshInfosDlg.h
-// Author : Nicolas BARBEROU
-//
-#ifndef SMESHGUI_MESHINFOSDLG_H
-#define SMESHGUI_MESHINFOSDLG_H
-
-// SMESH includes
-#include "SMESH_SMESHGUI.hxx"
-
-// Qt includes
-#include <QDialog>
-
-class QGroupBox;
-class QLabel;
-class QPushButton;
-class QStackedWidget;
-
-class LightApp_SelectionMgr;
-class SMESHGUI;
-class SMESHGUI_MeshInfosBox;
-
-class SMESHGUI_EXPORT SMESHGUI_MeshInfosDlg : public QDialog
-{ 
-  Q_OBJECT
-
-public:
-  SMESHGUI_MeshInfosDlg( SMESHGUI* );
-  ~SMESHGUI_MeshInfosDlg();
-
-protected:
-  void                    closeEvent( QCloseEvent* );
-  void                    keyPressEvent( QKeyEvent* );
-  void                    windowActivationChange( bool );
-  void                    DumpMeshInfos();
-
-private slots:
-  void                    onSelectionChanged();
-  void                    DeactivateActiveDialog();
-  void                    ActivateThisDialog();
-  void                    onStartSelection();
-  void                    onHelp();
-
-private:
-  SMESHGUI*               mySMESHGUI;
-  LightApp_SelectionMgr*  mySelectionMgr; 
-  bool                    myStartSelection;
-  bool                    myIsActiveWindow;
-  
-  QPushButton*            mySelectBtn;
-  QLabel*                 mySelectLab;
-  
-  QStackedWidget*         myWGStack;
-  
-  QWidget*                myMeshWidget;
-  QLabel*                 myMeshName;
-  SMESHGUI_MeshInfosBox*  myMeshInfoBox;
-
-  QGroupBox*              myButtonsGroup;
-  QPushButton*            myOkBtn;
-  QPushButton*            myHelpBtn;
-
-  QString                 myHelpFileName;
-};
-
-#endif // SMESHGUI_MESHINFOSDLG_H
diff --git a/src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx b/src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx
deleted file mode 100644 (file)
index 50908d2..0000000
+++ /dev/null
@@ -1,662 +0,0 @@
-// Copyright (C) 2007-2011  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
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// SMESH SMESHGUI : GUI for SMESH component
-// File   : SMESHGUI_MoveNodesDlg.cxx
-// Author : Nicolas REJNERI, Open CASCADE S.A.S.
-// SMESH includes
-//
-#include "SMESHGUI_MoveNodesDlg.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_SpinBox.h"
-#include "SMESHGUI_IdValidator.h"
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_VTKUtils.h"
-#include "SMESHGUI_MeshUtils.h"
-
-#include <SMESH_Actor.h>
-#include <SMDS_Mesh.hxx>
-
-// SALOME GUI includes
-#include <LightApp_SelectionMgr.h>
-#include <LightApp_Application.h>
-#include <SUIT_ResourceMgr.h>
-#include <SUIT_Desktop.h>
-#include <SUIT_Session.h>
-#include <SUIT_MessageBox.h>
-
-#include <SVTK_ViewModel.h>
-#include <SVTK_ViewWindow.h>
-#include <SALOME_ListIO.hxx>
-
-#include <VTKViewer_CellLocationsArray.h>
-
-// OCCT includes
-#include <TColStd_MapOfInteger.hxx>
-
-// VTK includes
-#include <vtkIdList.h>
-#include <vtkCellArray.h>
-#include <vtkUnsignedCharArray.h>
-#include <vtkUnstructuredGrid.h>
-#include <vtkDataSetMapper.h>
-#include <vtkProperty.h>
-
-// Qt includes
-#include <QGroupBox>
-#include <QLabel>
-#include <QLineEdit>
-#include <QPushButton>
-#include <QRadioButton>
-#include <QHBoxLayout>
-#include <QVBoxLayout>
-#include <QKeyEvent>
-#include <QButtonGroup>
-
-// IDL includes
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-#include CORBA_SERVER_HEADER(SMESH_MeshEditor)
-
-#define SPACING 6
-#define MARGIN  11
-
-//=================================================================================
-// name    : SMESHGUI_MoveNodesDlg::SMESHGUI_MoveNodesDlg
-// Purpose :
-//=================================================================================
-SMESHGUI_MoveNodesDlg::SMESHGUI_MoveNodesDlg(SMESHGUI* theModule):
-  QDialog(SMESH::GetDesktop(theModule)),
-  mySelectionMgr(SMESH::GetSelectionMgr(theModule)),
-  mySMESHGUI(theModule)
-{
-  myPreviewActor = 0;
-  myBusy = false;
-
-  setModal(false);
-  setWindowTitle(tr("CAPTION"));
-
-  QVBoxLayout* aDlgLay = new QVBoxLayout(this);
-  aDlgLay->setSpacing(SPACING);
-  aDlgLay->setMargin(MARGIN);
-
-  QWidget* aMainFrame = createMainFrame  (this);
-  QWidget* aBtnFrame  = createButtonFrame(this);
-
-  aDlgLay->addWidget(aMainFrame);
-  aDlgLay->addWidget(aBtnFrame);
-
-  mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
-
-  myHelpFileName = "moving_nodes_page.html";
-
-  Init();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::createButtonFrame
-// Purpose : Create frame containing buttons
-//=======================================================================
-QWidget* SMESHGUI_MoveNodesDlg::createButtonFrame (QWidget* theParent)
-{
-  QFrame* aFrame = new QFrame(theParent);
-  aFrame->setFrameStyle(QFrame::Box | QFrame::Sunken);
-
-  myOkBtn     = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), aFrame);
-  myApplyBtn  = new QPushButton(tr("SMESH_BUT_APPLY"), aFrame);
-  myCloseBtn  = new QPushButton(tr("SMESH_BUT_CLOSE"), aFrame);
-  myHelpBtn   = new QPushButton(tr("SMESH_BUT_HELP"),  aFrame);
-
-  QHBoxLayout* aLay = new QHBoxLayout(aFrame);
-  aLay->setSpacing(SPACING);
-  aLay->setMargin(MARGIN);
-
-  aLay->addWidget(myOkBtn);
-  aLay->addSpacing(10);
-  aLay->addWidget(myApplyBtn);
-  aLay->addSpacing(10);
-  aLay->addStretch();
-  aLay->addWidget(myCloseBtn);
-  aLay->addWidget(myHelpBtn);
-
-  connect(myOkBtn,    SIGNAL(clicked()), SLOT(onOk()));
-  connect(myCloseBtn, SIGNAL(clicked()), SLOT(onClose()));
-  connect(myApplyBtn, SIGNAL(clicked()), SLOT(onApply()));
-  connect(myHelpBtn,  SIGNAL(clicked()), SLOT(onHelp()));
-
-  return aFrame;
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::createMainFrame
-// Purpose : Create frame containing dialog's input fields
-//=======================================================================
-QWidget* SMESHGUI_MoveNodesDlg::createMainFrame (QWidget* theParent)
-{
-  QWidget* aFrame = new QWidget(theParent);
-
-  QPixmap iconMoveNode (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_MOVE_NODE")));
-  QPixmap iconSelect   (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
-
-  //------------------------------------------------------------
-  QGroupBox* aPixGrp = new QGroupBox(tr("MESH_NODE"), aFrame);
-  QButtonGroup* aBtnGrp = new QButtonGroup(this);
-  QHBoxLayout* aPixGrpLayout = new QHBoxLayout(aPixGrp);
-  aPixGrpLayout->setSpacing(SPACING);
-  aPixGrpLayout->setMargin(MARGIN);
-
-  QRadioButton* aRBut = new QRadioButton(aPixGrp);
-  aRBut->setIcon(iconMoveNode);
-  aRBut->setChecked(true);
-
-  aPixGrpLayout->addWidget(aRBut);
-  aBtnGrp->addButton(aRBut, 0);
-
-  //------------------------------------------------------------
-  QGroupBox* anIdGrp = new QGroupBox(tr("SMESH_MOVE"), aFrame);
-  QHBoxLayout* anIdGrpLayout = new QHBoxLayout(anIdGrp);
-  anIdGrpLayout->setSpacing(SPACING);
-  anIdGrpLayout->setMargin(MARGIN);
-
-  QLabel* idLabl = new QLabel(tr("NODE_ID"), anIdGrp);
-  QPushButton* idBtn = new QPushButton(anIdGrp);
-  idBtn->setIcon(iconSelect);
-  myId = new QLineEdit(anIdGrp);
-  myId->setValidator(new SMESHGUI_IdValidator(this, 1));
-
-  anIdGrpLayout->addWidget(idLabl);
-  anIdGrpLayout->addWidget(idBtn);
-  anIdGrpLayout->addWidget(myId);
-
-  //------------------------------------------------------------
-  QGroupBox* aCoordGrp = new QGroupBox(tr("SMESH_COORDINATES"), aFrame);
-  QHBoxLayout* aCoordGrpLayout = new QHBoxLayout(aCoordGrp);
-  aCoordGrpLayout->setSpacing(SPACING);
-  aCoordGrpLayout->setMargin(MARGIN);
-
-  QLabel* aXLabel = new QLabel(tr("SMESH_X"), aCoordGrp);
-  myX = new SMESHGUI_SpinBox(aCoordGrp);
-
-  QLabel* aYLabel = new QLabel(tr("SMESH_Y"), aCoordGrp);
-  myY = new SMESHGUI_SpinBox(aCoordGrp);
-
-  QLabel* aZLabel = new QLabel(tr("SMESH_Z"), aCoordGrp);
-  myZ = new SMESHGUI_SpinBox(aCoordGrp);
-
-  aCoordGrpLayout->addWidget(aXLabel);
-  aCoordGrpLayout->addWidget(myX);
-  aCoordGrpLayout->addWidget(aYLabel);
-  aCoordGrpLayout->addWidget(myY);
-  aCoordGrpLayout->addWidget(aZLabel);
-  aCoordGrpLayout->addWidget(myZ);
-
-  //------------------------------------------------------------
-  myX->RangeStepAndValidator(COORD_MIN, COORD_MAX, 25.0, "length_precision");
-  myY->RangeStepAndValidator(COORD_MIN, COORD_MAX, 25.0, "length_precision");
-  myZ->RangeStepAndValidator(COORD_MIN, COORD_MAX, 25.0, "length_precision");
-
-  //------------------------------------------------------------
-  QVBoxLayout* aLay = new QVBoxLayout(aFrame);
-  aLay->setMargin(0);
-  aLay->setMargin(SPACING);
-  aLay->addWidget(aPixGrp);
-  aLay->addWidget(anIdGrp);
-  aLay->addWidget(aCoordGrp);
-
-  //------------------------------------------------------------
-  // connect signale and slots
-  connect(myX, SIGNAL (valueChanged(double)), this, SLOT(redisplayPreview()));
-  connect(myY, SIGNAL (valueChanged(double)), this, SLOT(redisplayPreview()));
-  connect(myZ, SIGNAL (valueChanged(double)), this, SLOT(redisplayPreview()));
-  connect(myId, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
-
-  return aFrame;
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::~SMESHGUI_MoveNodesDlg
-// Purpose :
-//=======================================================================
-SMESHGUI_MoveNodesDlg::~SMESHGUI_MoveNodesDlg()
-{
-  erasePreview();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::Init
-// Purpose : Init dialog fields
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::Init()
-{
-  myPreviewActor = 0;
-  myMeshActor = 0;
-  myBusy = false;
-
-  mySMESHGUI->SetActiveDialogBox((QDialog*)this);
-
-  // selection and SMESHGUI
-  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(onSelectionDone()));
-  connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate()));
-  connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose()));
-
-  reset();
-  setEnabled(true);
-
-  // set selection mode
-  SMESH::SetPointRepresentation(true);
-  if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-    aViewWindow->SetSelectionMode(NodeSelection);
-
-  onSelectionDone();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::isValid
-// Purpose : Verify validity of entry information
-//=======================================================================
-bool SMESHGUI_MoveNodesDlg::isValid (const bool theMess)
-{
-  if (myId->text().isEmpty()) {
-    if (theMess)
-      SUIT_MessageBox::information(this, tr("SMESH_WARNING"),
-                                   tr("NODE_ID_IS_NOT_DEFINED"));
-    return false;
-  }
-
-  QString msg;
-  bool ok = true;
-  ok = myX->isValid( msg, theMess ) && ok;
-  ok = myY->isValid( msg, theMess ) && ok;
-  ok = myZ->isValid( msg, theMess ) && ok;
-  if( !ok ) {
-    if( theMess ) {
-      QString str( tr( "SMESH_INCORRECT_INPUT" ) );
-      if ( !msg.isEmpty() )
-        str += "\n" + msg;
-      SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
-    }
-    return false;
-  }
-
-  return true;
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::reset
-// Purpose : Reset the dialog state
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::reset()
-{
-  myId->clear();
-  myX->SetValue(0);
-  myY->SetValue(0);
-  myZ->SetValue(0);
-  redisplayPreview();
-  updateButtons();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::onApply
-// Purpose : SLOT called when "Apply" button pressed.
-//=======================================================================
-bool SMESHGUI_MoveNodesDlg::onApply()
-{
-  if (mySMESHGUI->isActiveStudyLocked())
-    return false;
-
-  if (!isValid(true))
-    return false;
-
-  SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(myMeshActor->getIO());
-  if (aMesh->_is_nil()) {
-    SUIT_MessageBox::information(this, tr("SMESH_ERROR"),
-                                 tr("SMESHG_NO_MESH"));
-    return false;
-  }
-
-  SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
-  if (aMeshEditor->_is_nil())
-    return false;
-
-  int anId = myId->text().toInt();
-  bool aResult = false;
-  try {
-    aResult = aMeshEditor->MoveNode(anId, myX->GetValue(), myY->GetValue(), myZ->GetValue());
-
-    QStringList aParameters;
-    aParameters << myX->text();
-    aParameters << myY->text();
-    aParameters << myZ->text();
-    aMesh->SetParameters( aParameters.join(":").toLatin1().constData() );
-  } catch (...) {
-  }
-
-  if (aResult) {
-    SALOME_ListIO aList;
-    aList.Append(myMeshActor->getIO());
-    mySelectionMgr->setSelectedObjects(aList,false);
-    SMESH::UpdateView();
-    SMESHGUI::Modified();
-    reset();
-  }
-
-  return aResult;
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::onOk
-// Purpose : SLOT called when "Ok" button pressed.
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::onOk()
-{
-  if (onApply())
-    onClose();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::onClose
-// Purpose : SLOT called when "Close" button pressed. Close dialog
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::onClose()
-{
-  //mySelectionMgr->clearSelected();
-  SMESH::SetPointRepresentation(false);
-  if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-    aViewWindow->SetSelectionMode(ActorSelection);
-  disconnect(mySelectionMgr, 0, this, 0);
-  disconnect(mySMESHGUI, 0, this, 0);
-  erasePreview();
-  mySMESHGUI->ResetState();
-  reject();
-}
-
-//=================================================================================
-// function : onHelp()
-// purpose  :
-//=================================================================================
-void SMESHGUI_MoveNodesDlg::onHelp()
-{
-  LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
-  if (app) 
-    app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
-  else {
-                QString platform;
-#ifdef WIN32
-                platform = "winapplication";
-#else
-                platform = "application";
-#endif
-    SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
-                             tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
-                             arg(app->resourceMgr()->stringValue("ExternalBrowser", 
-                                                                 platform)).
-                             arg(myHelpFileName));
-  }
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::onTextChange
-// Purpose :
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::onTextChange (const QString& theNewText)
-{
-  if (myBusy) return;
-
-  myOkBtn->setEnabled(false);
-  myApplyBtn->setEnabled(false);
-  erasePreview();
-
-  // select entered node
-  if(myMeshActor){
-    if(SMDS_Mesh* aMesh = myMeshActor->GetObject()->GetMesh()){
-      myBusy = true;
-      Handle(SALOME_InteractiveObject) anIO = myMeshActor->getIO();
-      SALOME_ListIO aList;
-      aList.Append(anIO);
-      mySelectionMgr->setSelectedObjects(aList,false);
-      myBusy = false;
-
-      if(const SMDS_MeshElement *anElem = aMesh->FindElement(theNewText.toInt())) {
-        TColStd_MapOfInteger aListInd;
-        aListInd.Add(anElem->GetID());
-        mySelector->AddOrRemoveIndex(anIO,aListInd, false);
-        if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-          aViewWindow->highlight(anIO,true,true);
-        
-        onSelectionDone();
-      }
-    }
-  }
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::onSelectionDone
-// Purpose : SLOT called when selection changed
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::onSelectionDone()
-{
-  if (myBusy) return;
-  myMeshActor = 0;
-
-  SALOME_ListIO aList;
-  mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type());
-
-  if (aList.Extent() == 1) {
-    Handle(SALOME_InteractiveObject) anIO = aList.First();
-    myMeshActor = SMESH::FindActorByEntry(anIO->getEntry());
-    if(myMeshActor){
-      QString aText;
-      if (SMESH::GetNameOfSelectedNodes(mySelector,anIO,aText) == 1) {
-        if(SMDS_Mesh* aMesh = myMeshActor->GetObject()->GetMesh()) {
-          if(const SMDS_MeshNode* aNode = aMesh->FindNode(aText.toInt())) {
-            myBusy = true;
-            myId->setText(aText);
-            myX->SetValue(aNode->X());
-            myY->SetValue(aNode->Y());
-            myZ->SetValue(aNode->Z());
-            myBusy = false;
-            erasePreview(); // avoid overlapping of a selection and a preview
-            updateButtons();
-            return;
-          }
-        }
-      }
-    }
-  }
-
-  reset();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::onDeactivate
-// Purpose : SLOT called when dialog must be deativated
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::onDeactivate()
-{
-  setEnabled(false);
-  erasePreview();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::enterEvent
-// Purpose : Event filter
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::enterEvent (QEvent*)
-{
-  if (!isEnabled()) {
-    mySMESHGUI->EmitSignalDeactivateDialog();
-
-    // set selection mode
-    SMESH::SetPointRepresentation(true);
-    if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-      aViewWindow->SetSelectionMode(NodeSelection);
-
-    redisplayPreview();
-
-    setEnabled(true);
-  }
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::closeEvent
-// Purpose :
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::closeEvent (QCloseEvent*)
-{
-  onClose();
-  if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-    aViewWindow->Repaint();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::hideEvent
-// Purpose : may be caused by ESC key
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::hideEvent (QHideEvent*)
-{
-  if (!isMinimized())
-    onClose();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::updateButtons
-// Purpose : Update buttons state
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::updateButtons()
-{
-  bool isEnabled = isValid(false);
-  myOkBtn->setEnabled(isEnabled);
-  myApplyBtn->setEnabled(isEnabled);
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::erasePreview
-// Purpose : Erase preview
-//=======================================================================
-void  SMESHGUI_MoveNodesDlg::erasePreview()
-{
-  if (myPreviewActor == 0)
-    return;
-
-  SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI );
-  if (aViewWindow)
-    aViewWindow->RemoveActor(myPreviewActor);
-  myPreviewActor->Delete();
-  myPreviewActor = 0;
-  if (aViewWindow)
-    aViewWindow->Repaint();
-}
-
-//=======================================================================
-// name    : SMESHGUI_MoveNodesDlg::redisplayPreview
-// Purpose : Redisplay preview
-//=======================================================================
-void SMESHGUI_MoveNodesDlg::redisplayPreview()
-{
-  if (myBusy)
-    return;
-
-  if (myPreviewActor != 0)
-    erasePreview();
-
-  if (!isValid(false))
-    return;
-
-  vtkUnstructuredGrid* aGrid = vtkUnstructuredGrid::New();
-
-  vtkPoints* aPoints = vtkPoints::New();
-  aPoints->SetNumberOfPoints(1);
-  aPoints->SetPoint(0, myX->GetValue(), myY->GetValue(), myZ->GetValue());
-
-  // Create cells
-
-  vtkIdList *anIdList = vtkIdList::New();
-  anIdList->SetNumberOfIds(1);
-
-  vtkCellArray *aCells = vtkCellArray::New();
-  aCells->Allocate(2, 0);
-
-  vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
-  aCellTypesArray->SetNumberOfComponents(1);
-  aCellTypesArray->Allocate(1);
-
-  anIdList->SetId(0, 0);
-  aCells->InsertNextCell(anIdList);
-  aCellTypesArray->InsertNextValue(VTK_VERTEX);
-  anIdList->Delete();
-
-  VTKViewer_CellLocationsArray* aCellLocationsArray = VTKViewer_CellLocationsArray::New();
-  aCellLocationsArray->SetNumberOfComponents(1);
-  aCellLocationsArray->SetNumberOfTuples(1);
-
-  aCells->InitTraversal();
-  vtkIdType npts;
-  aCellLocationsArray->SetValue(0, aCells->GetTraversalLocation(npts));
-
-  aGrid->SetPoints(aPoints);
-  aPoints->Delete();
-
-  aGrid->SetCells(aCellTypesArray,aCellLocationsArray,aCells);
-  aCellLocationsArray->Delete();
-  aCellTypesArray->Delete();
-  aCells->Delete();
-
-  // Create and display actor
-  vtkDataSetMapper* aMapper = vtkDataSetMapper::New();
-  aMapper->SetInput(aGrid);
-  aGrid->Delete();
-
-  myPreviewActor = SALOME_Actor::New();
-  myPreviewActor->PickableOff();
-  myPreviewActor->SetMapper(aMapper);
-  aMapper->Delete();
-
-  vtkProperty* aProp = vtkProperty::New();
-  aProp->SetRepresentationToWireframe();
-  aProp->SetColor(250, 0, 250);
-  aProp->SetPointSize(5);
-  myPreviewActor->SetProperty(aProp);
-  aProp->Delete();
-
-  if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-    {
-      aViewWindow->AddActor(myPreviewActor);
-      aViewWindow->Repaint();
-    }
-}
-
-//=================================================================================
-// function : keyPressEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_MoveNodesDlg::keyPressEvent( QKeyEvent* e )
-{
-  QDialog::keyPressEvent( e );
-  if ( e->isAccepted() )
-    return;
-
-  if ( e->key() == Qt::Key_F1 ) {
-    e->accept();
-    onHelp();
-  }
-}
diff --git a/src/SMESHGUI/SMESHGUI_MoveNodesDlg.h b/src/SMESHGUI/SMESHGUI_MoveNodesDlg.h
deleted file mode 100644 (file)
index e9bd260..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (C) 2007-2011  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
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// SMESH SMESHGUI : GUI for SMESH component
-// File   : SMESHGUI_MoveNodesDlg.h
-// Author : Nicolas REJNERI, Open CASCADE S.A.S.
-//
-#ifndef SMESHGUI_MOVENODESDLG_H
-#define SMESHGUI_MOVENODESDLG_H
-
-// SMESH includes
-#include "SMESH_SMESHGUI.hxx"
-
-// Qt includes
-#include <QDialog>
-
-class QLineEdit;
-class QPushButton;
-
-class SMESHGUI;
-class SMESH_Actor;
-class SMESHGUI_SpinBox;
-class SALOME_Actor;
-class SVTK_Selector;
-class LightApp_SelectionMgr;
-
-//=================================================================================
-// class    : SMESHGUI_MoveNodesDlg
-// purpose  :
-//=================================================================================
-class SMESHGUI_EXPORT SMESHGUI_MoveNodesDlg : public QDialog
-{ 
-  Q_OBJECT
-
-public:
-  SMESHGUI_MoveNodesDlg( SMESHGUI* );
-  virtual ~SMESHGUI_MoveNodesDlg();
-    
-  void                          Init();
-
-private slots:
-  void                          onOk();
-  bool                          onApply();
-  void                          onClose();
-  void                          onHelp();
-
-  void                          onDeactivate();
-
-  void                          onSelectionDone();
-  void                          redisplayPreview();
-  void                          onTextChange( const QString& );
-
-private:
-  void                          closeEvent( QCloseEvent* );
-  void                          enterEvent( QEvent* );
-  void                          hideEvent( QHideEvent* );
-  void                          keyPressEvent( QKeyEvent* );
-  void                          erasePreview();
-  QWidget*                      createButtonFrame( QWidget* );
-  QWidget*                      createMainFrame  ( QWidget* );
-  bool                          isValid( const bool );
-  void                          reset();
-  void                          updateButtons();
-
-private:
-  QPushButton*                  myOkBtn;
-  QPushButton*                  myApplyBtn;
-  QPushButton*                  myCloseBtn;
-  QPushButton*                  myHelpBtn;
-  
-  QLineEdit*                    myId;
-  SMESHGUI_SpinBox*             myX;
-  SMESHGUI_SpinBox*             myY;
-  SMESHGUI_SpinBox*             myZ;
-
-  LightApp_SelectionMgr*        mySelectionMgr;
-  SVTK_Selector*                mySelector;
-  SMESHGUI*                     mySMESHGUI;
-  
-  SALOME_Actor*                 myPreviewActor;
-  SMESH_Actor*                  myMeshActor;
-  bool                          myBusy;
-
-  QString                       myHelpFileName;
-};
-
-#endif // SMESHGUI_MOVENODESDLG_H
index 460e532d3be36cb89d3f64396c529ea4d5e9c542..286d0012eba43858f8dbb42696f46dfb51d41451 100644 (file)
@@ -297,6 +297,7 @@ SMESHGUI_NodesDlg::SMESHGUI_NodesDlg( SMESHGUI* theModule ):
   TextLabel_GroupName = new QLabel( tr( "SMESH_GROUP" ), GroupGroups );
   ComboBox_GroupName = new QComboBox( GroupGroups );
   ComboBox_GroupName->setEditable( true );
+  ComboBox_GroupName->setInsertPolicy( QComboBox::NoInsert );
 
   GroupGroupsLayout->addWidget( TextLabel_GroupName );
   GroupGroupsLayout->addWidget( ComboBox_GroupName, 1 );
@@ -456,7 +457,7 @@ bool SMESHGUI_NodesDlg::ClickOnApply()
       if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
         idx = i;
     }
-    if ( idx > 0 ) {
+    if ( idx > 0 && idx < myGroups.count() ) {
       SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
       if ( !aGeomGroup->_is_nil() ) {
         int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
diff --git a/src/SMESHGUI/SMESHGUI_StandardMeshInfosDlg.cxx b/src/SMESHGUI/SMESHGUI_StandardMeshInfosDlg.cxx
deleted file mode 100644 (file)
index ea81f7e..0000000
+++ /dev/null
@@ -1,473 +0,0 @@
-// Copyright (C) 2007-2011  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
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// SMESH SMESHGUI : GUI for SMESH component
-// File   : SMESHGUI_StandardMeshInfosDlg.cxx
-// Author : Michael ZORIN, Open CASCADE S.A.S.
-// SMESH includes
-//
-#include "SMESHGUI_StandardMeshInfosDlg.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_MeshUtils.h"
-
-#include <SMESH_TypeFilter.hxx>
-
-// SALOME KERNEL includes 
-#include <SALOMEDSClient_Study.hxx>
-#include <SALOMEDSClient_SObject.hxx>
-
-// SALOME GUI includes
-#include <SUIT_Desktop.h>
-#include <SUIT_Session.h>
-#include <SUIT_OverrideCursor.h>
-#include <SUIT_MessageBox.h>
-#include <SUIT_ResourceMgr.h>
-
-#include <LightApp_Application.h>
-#include <LightApp_SelectionMgr.h>
-
-#include <SALOME_ListIO.hxx>
-
-// Qt includes
-#include <QGroupBox>
-#include <QLabel>
-#include <QVBoxLayout>
-#include <QHBoxLayout>
-#include <QLineEdit>
-#include <QTextBrowser>
-#include <QPushButton>
-#include <QKeyEvent>
-
-// IDL includes
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-#include CORBA_SERVER_HEADER(SMESH_Group)
-
-#define SPACING 6
-#define MARGIN  11
-
-//=================================================================================
-/*!
- *  SMESHGUI_StandardMeshInfosDlg::SMESHGUI_StandardMeshInfosDlg
- *
- *  Constructor
- */
-//=================================================================================
-SMESHGUI_StandardMeshInfosDlg::SMESHGUI_StandardMeshInfosDlg( SMESHGUI* theModule )
-  : QDialog( SMESH::GetDesktop( theModule ) ),
-    mySMESHGUI( theModule ),
-    mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
-{
-  setModal(false);
-  setAttribute(Qt::WA_DeleteOnClose, true);
-  setWindowTitle(tr("SMESH_STANDARD_MESHINFO_TITLE"));
-  setSizeGripEnabled(true);
-
-  myStartSelection = true;
-  myIsActiveWindow = true;
-
-  // dialog layout
-  QVBoxLayout* aDlgLayout = new QVBoxLayout(this);
-  aDlgLayout->setSpacing(SPACING);
-  aDlgLayout->setMargin(MARGIN);
-
-  // mesh group box
-  myMeshGroup = new QGroupBox(tr("SMESH_MESH"), this);
-  QHBoxLayout* myMeshGroupLayout = new QHBoxLayout(myMeshGroup);
-  myMeshGroupLayout->setSpacing(SPACING);
-  myMeshGroupLayout->setMargin(MARGIN);
-
-  // select button, label and line edit with mesh name
-  myNameLab = new QLabel(tr("SMESH_NAME"), myMeshGroup);
-  myMeshGroupLayout->addWidget(myNameLab);
-
-  QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("SMESH",tr("ICON_SELECT")));
-  mySelectBtn = new QPushButton(myMeshGroup);
-  mySelectBtn->setIcon(image0);
-  myMeshGroupLayout->addWidget(mySelectBtn);
-
-  myMeshLine = new QLineEdit(myMeshGroup);
-  myMeshGroupLayout->addWidget(myMeshLine);
-
-  aDlgLayout->addWidget(myMeshGroup);
-
-  // information group box
-  myInfoGroup  = new QGroupBox(tr("SMESH_INFORMATION"), this);
-  QVBoxLayout* myInfoGroupLayout = new QVBoxLayout(myInfoGroup);
-  myInfoGroupLayout->setSpacing(SPACING);
-  myInfoGroupLayout->setMargin(MARGIN);
-
-  // information text browser
-  myInfo = new QTextBrowser(myInfoGroup);
-  myInfo->setMinimumSize(200, 150);
-  myInfoGroupLayout->addWidget(myInfo);
-
-  aDlgLayout->addWidget(myInfoGroup);
-
-  // buttons group
-  myButtonsGroup = new QGroupBox(this);
-  QHBoxLayout* myButtonsGroupLayout = new QHBoxLayout(myButtonsGroup);
-  myButtonsGroupLayout->setSpacing(SPACING);
-  myButtonsGroupLayout->setMargin(MARGIN);
-
-  // buttons --> OK and Help buttons
-  myOkBtn = new QPushButton(tr("SMESH_BUT_OK"), myButtonsGroup);
-  myOkBtn->setAutoDefault(true); myOkBtn->setDefault(true);
-  myHelpBtn = new QPushButton(tr("SMESH_BUT_HELP"), myButtonsGroup);
-  myHelpBtn->setAutoDefault(true);
-
-  myButtonsGroupLayout->addWidget(myOkBtn);
-  myButtonsGroupLayout->addSpacing(10);
-  myButtonsGroupLayout->addStretch();
-  myButtonsGroupLayout->addWidget(myHelpBtn);
-
-  aDlgLayout->addWidget(myButtonsGroup);
-
-  mySMESHGUI->SetActiveDialogBox(this);
-
-  // connect signals
-  connect( myOkBtn,         SIGNAL(clicked()),                      this, SLOT(close()));
-  connect( myHelpBtn,       SIGNAL(clicked()),                      this, SLOT(onHelp()));
-  connect( mySelectBtn,     SIGNAL(clicked()),                      this, SLOT(onStartSelection()));
-  connect( mySMESHGUI,      SIGNAL(SignalCloseAllDialogs()),        this, SLOT(close()));
-  connect( mySMESHGUI,      SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
-  connect( mySelectionMgr,  SIGNAL(currentSelectionChanged()),      this, SLOT(onSelectionChanged()));
-
-  // init dialog with current selection
-  myMeshFilter = new SMESH_TypeFilter (MESH);
-  mySelectionMgr->installFilter(myMeshFilter);
-  onSelectionChanged();
-
-  myHelpFileName = "mesh_infos_page.html#standard_mesh_infos_anchor";
-}
-
-//=================================================================================
-/*!
- *  SMESHGUI_StandardMeshInfosDlg::~SMESHGUI_StandardMeshInfosDlg
- *
- *  Destructor
- */
-//=================================================================================
-SMESHGUI_StandardMeshInfosDlg::~SMESHGUI_StandardMeshInfosDlg()
-{
-}
-
-//=================================================================================
-/*!
- *  SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos
- */
-//=================================================================================
-void SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos()
-{
-  SUIT_OverrideCursor wc;
-
-  SALOME_ListIO aList;
-  mySelectionMgr->selectedObjects(aList);
-
-  int nbSel = aList.Extent();
-  myInfo->clear();
-  if (nbSel == 1) {
-    myStartSelection = false;
-    myMeshLine->setText("");
-    SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(aList.First());
-
-    if (!aMesh->_is_nil()) {
-      QString aName, anInfo;
-      SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aName);
-      myMeshLine->setText(aName);
-      int aNbNodes =   (int)aMesh->NbNodes();
-      int aNbEdges =   (int)aMesh->NbEdges();
-      int aNbFaces =   (int)aMesh->NbFaces();
-      int aNbVolumes = (int)aMesh->NbVolumes();
-
-      int aDimension = 0;
-      double aNbDimElements = 0;
-      if (aNbVolumes > 0) {
-        aNbDimElements = aNbVolumes;
-        aDimension = 3;
-      }
-      else if(aNbFaces > 0) {
-        aNbDimElements = aNbFaces;
-        aDimension = 2;
-      }
-      else if(aNbEdges > 0) {
-        aNbDimElements = aNbEdges;
-        aDimension = 1;
-      }
-      else if(aNbNodes > 0) {
-        aNbDimElements = aNbNodes;
-        aDimension = 0;
-      }
-
-      // information about the mesh
-      anInfo.append(QString("Nb of element of dimension %1:<b> %2</b><br>").arg(aDimension).arg(aNbDimElements));
-      anInfo.append(QString("Nb of nodes: <b>%1</b><br><br>").arg(aNbNodes));
-
-      // information about the groups of the mesh
-      _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
-      _PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh);
-      _PTR(SObject) anObj;
-
-      bool hasGroup = false;
-
-      // info about groups on nodes
-      aMeshSO->FindSubObject(SMESH::Tag_NodeGroups, anObj);
-      if (anObj) {
-        _PTR(ChildIterator) it = aStudy->NewChildIterator(anObj);
-        if (it->More()) {
-          anInfo.append(QString("Groups:<br><br>"));
-          hasGroup = true;
-        }
-        for ( ; it->More(); it->Next()) {
-          _PTR(SObject) subObj = it->Value();
-          CORBA::Object_var anObject = SMESH::SObjectToObject(subObj);
-          SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject);
-          if (!aGroup->_is_nil()) {
-            anInfo.append(QString("-   <b>%1</b><br>").arg(aGroup->GetName()));
-            anInfo.append(QString("%1<br>").arg("on nodes"));
-            anInfo.append(QString("%1<br>").arg(aGroup->Size()));
-            // check if the group based on geometry
-            SMESH::SMESH_GroupOnGeom_var aGroupOnGeom = SMESH::SMESH_GroupOnGeom::_narrow(aGroup);
-            if (!aGroupOnGeom->_is_nil()) {
-              GEOM::GEOM_Object_var aGroupMainShape = aGroupOnGeom->GetShape();
-              QString aShapeName = "<unknown>";
-              _PTR(SObject) aGeomObj, aRef;
-              if (subObj->FindSubObject(1, aGeomObj) &&  aGeomObj->ReferencedObject(aRef))
-                aShapeName = aRef->GetName().c_str();
-              anInfo.append(QString("based on <i>%1</i> geometry object<br><br>").arg(aShapeName));
-            } else {
-              anInfo.append(QString("<br>"));
-            }
-          }
-        }
-      }
-
-      // info about groups on edges
-      anObj.reset();
-      aMeshSO->FindSubObject(SMESH::Tag_EdgeGroups, anObj);
-      if (anObj) {
-        _PTR(ChildIterator) it = aStudy->NewChildIterator(anObj);
-        if (!hasGroup && it->More()) {
-          anInfo.append(QString("Groups:<br><br>"));
-          hasGroup = true;
-        }
-        for ( ; it->More(); it->Next()) {
-          _PTR(SObject) subObj = it->Value();
-          CORBA::Object_var anObject = SMESH::SObjectToObject(subObj);
-          SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject);
-          if (!aGroup->_is_nil()) {
-            anInfo.append(QString("-   <b>%1</b><br>").arg(aGroup->GetName()));
-            anInfo.append(QString("%1<br>").arg("on edges"));
-            anInfo.append(QString("%1<br>").arg(aGroup->Size()));
-            // check if the group based on geometry
-            SMESH::SMESH_GroupOnGeom_var aGroupOnGeom = SMESH::SMESH_GroupOnGeom::_narrow(aGroup);
-            if (!aGroupOnGeom->_is_nil()) {
-              GEOM::GEOM_Object_var aGroupMainShape = aGroupOnGeom->GetShape();
-              QString aShapeName = "<unknown>";
-              _PTR(SObject) aGeomObj, aRef;
-              if (subObj->FindSubObject(1, aGeomObj) && aGeomObj->ReferencedObject(aRef))
-                aShapeName = aRef->GetName().c_str();
-              anInfo.append(QString("based on <i>%1</i> geometry object<br><br>").arg(aShapeName));
-            } else {
-              anInfo.append(QString("<br>"));
-            }
-          }
-        }
-      }
-
-      // info about groups on faces
-      anObj.reset();
-      aMeshSO->FindSubObject(SMESH::Tag_FaceGroups, anObj);
-      if (anObj) {
-        _PTR(ChildIterator) it = aStudy->NewChildIterator(anObj);
-        if (!hasGroup && it->More()) {
-          anInfo.append(QString("Groups:<br><br>"));
-          hasGroup = true;
-        }
-        for ( ; it->More(); it->Next()) {
-          _PTR(SObject) subObj = it->Value();
-          CORBA::Object_var anObject = SMESH::SObjectToObject(subObj);
-          SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject);
-          if (!aGroup->_is_nil()) {
-            anInfo.append(QString("-   <b>%1</b><br>").arg(aGroup->GetName()));
-            anInfo.append(QString("%1<br>").arg("on faces"));
-            anInfo.append(QString("%1<br>").arg(aGroup->Size()));
-            // check if the group based on geometry
-            SMESH::SMESH_GroupOnGeom_var aGroupOnGeom = SMESH::SMESH_GroupOnGeom::_narrow(aGroup);
-            if (!aGroupOnGeom->_is_nil()) {
-              GEOM::GEOM_Object_var aGroupMainShape = aGroupOnGeom->GetShape();
-              QString aShapeName = "<unknown>";
-              _PTR(SObject) aGeomObj, aRef;
-              if (subObj->FindSubObject(1, aGeomObj) && aGeomObj->ReferencedObject(aRef))
-                aShapeName = aRef->GetName().c_str();
-              anInfo.append(QString("based on <i>%1</i> geometry object<br><br>").arg(aShapeName));
-            } else {
-              anInfo.append(QString("<br>"));
-            }
-          }
-        }
-      }
-
-      // info about groups on volumes
-      anObj.reset();
-      aMeshSO->FindSubObject(SMESH::Tag_VolumeGroups, anObj);
-      if (anObj) {
-        _PTR(ChildIterator) it = aStudy->NewChildIterator(anObj);
-        if (!hasGroup && it->More())
-          anInfo.append(QString("Groups:<br>"));
-        for ( ; it->More(); it->Next()) {
-          _PTR(SObject) subObj = it->Value();
-          CORBA::Object_var anObject = SMESH::SObjectToObject(subObj);
-          SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject);
-          if (!aGroup->_is_nil()) {
-            anInfo.append(QString("-   <b>%1</b><br>").arg(aGroup->GetName()));
-            anInfo.append(QString("%1<br>").arg("on volumes"));
-            anInfo.append(QString("%1<br>").arg(aGroup->Size()));
-            // check if the group based on geometry
-            SMESH::SMESH_GroupOnGeom_var aGroupOnGeom = SMESH::SMESH_GroupOnGeom::_narrow(aGroup);
-            if (!aGroupOnGeom->_is_nil()) {
-              GEOM::GEOM_Object_var aGroupMainShape = aGroupOnGeom->GetShape();
-              QString aShapeName = "<unknown>";
-              _PTR(SObject) aGeomObj, aRef;
-              if (subObj->FindSubObject(1, aGeomObj) &&  aGeomObj->ReferencedObject(aRef))
-                aShapeName = aRef->GetName().c_str();
-              anInfo.append(QString("based on <i>%1</i> geometry object<br><br>").arg(aShapeName));
-            } else {
-              anInfo.append(QString("<br>"));
-            }
-          }
-        }
-      }
-
-      myInfo->setText(anInfo);
-      return;
-    }
-  }
-}
-
-//=================================================================================
-// function : SelectionIntoArgument()
-// purpose  : Called when selection has changed
-//=================================================================================
-void SMESHGUI_StandardMeshInfosDlg::onSelectionChanged()
-{
-  if (myStartSelection)
-    DumpMeshInfos();
-}
-
-//=================================================================================
-// function : closeEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_StandardMeshInfosDlg::closeEvent (QCloseEvent* e)
-{
-  mySelectionMgr->clearFilters();
-  mySMESHGUI->ResetState();
-  QDialog::closeEvent(e);
-}
-
-//=================================================================================
-// function : windowActivationChange()
-// purpose  : called when window is activated/deactivated
-//=================================================================================
-void SMESHGUI_StandardMeshInfosDlg::windowActivationChange (bool oldActive)
-{
-  QDialog::windowActivationChange(oldActive);
-  if (isActiveWindow() && myIsActiveWindow != isActiveWindow())
-    ActivateThisDialog();
-  myIsActiveWindow = isActiveWindow();
-}
-
-//=================================================================================
-// function : DeactivateActiveDialog()
-// purpose  :
-//=================================================================================
-void SMESHGUI_StandardMeshInfosDlg::DeactivateActiveDialog()
-{
-  disconnect(mySelectionMgr, 0, this, 0);
-}
-
-//=================================================================================
-// function : ActivateThisDialog()
-// purpose  :
-//=================================================================================
-void SMESHGUI_StandardMeshInfosDlg::ActivateThisDialog()
-{
-  /* Emit a signal to deactivate any active dialog */
-  mySMESHGUI->EmitSignalDeactivateDialog();
-  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onSelectionChanged()));
-}
-
-//=================================================================================
-// function : onStartSelection()
-// purpose  : starts selection
-//=================================================================================
-void SMESHGUI_StandardMeshInfosDlg::onStartSelection()
-{
-  myStartSelection = true;
-  mySelectionMgr->installFilter(myMeshFilter);
-  myMeshLine->setText(tr("Select a mesh"));
-  onSelectionChanged();
-  myStartSelection = true;
-}
-
-//=================================================================================
-// function : onHelp()
-// purpose  :
-//=================================================================================
-void SMESHGUI_StandardMeshInfosDlg::onHelp()
-{
-  LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
-  if (app)
-    app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
-  else {
-    QString platform;
-#ifdef WIN32
-    platform = "winapplication";
-#else
-    platform = "application";
-#endif
-    SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
-                             tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
-                             arg(app->resourceMgr()->stringValue("ExternalBrowser",
-                                                                 platform)).
-                             arg(myHelpFileName));
-  }
-}
-
-//=================================================================================
-// function : keyPressEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_StandardMeshInfosDlg::keyPressEvent( QKeyEvent* e )
-{
-  QDialog::keyPressEvent( e );
-  if ( e->isAccepted() )
-    return;
-
-  if ( e->key() == Qt::Key_F1 ) {
-    e->accept();
-    onHelp();
-  }
-}
diff --git a/src/SMESHGUI/SMESHGUI_StandardMeshInfosDlg.h b/src/SMESHGUI/SMESHGUI_StandardMeshInfosDlg.h
deleted file mode 100644 (file)
index 9058e44..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (C) 2007-2011  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
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// SMESH SMESHGUI : GUI for SMESH component
-// File   : SMESHGUI_StandardMeshInfosDlg.h
-// Author : Michael ZORIN, Open CASCADE S.A.S.
-//
-#ifndef SMESHGUI_STANDARDMESHINFOSDLG_H
-#define SMESHGUI_STANDARDMESHINFOSDLG_H
-
-// SMESH includes
-#include "SMESH_SMESHGUI.hxx"
-
-// Qt includes
-#include <QDialog>
-
-class QGroupBox;
-class QLabel;
-class QPushButton;
-class QLineEdit;
-class QTextBrowser;
-class SMESHGUI;
-class LightApp_SelectionMgr;
-class SUIT_SelectionFilter;
-
-class SMESHGUI_EXPORT SMESHGUI_StandardMeshInfosDlg : public QDialog
-{ 
-  Q_OBJECT
-
-public:
-  SMESHGUI_StandardMeshInfosDlg( SMESHGUI* );
-  ~SMESHGUI_StandardMeshInfosDlg();
-
-protected:
-  void                     closeEvent( QCloseEvent* );
-  void                     keyPressEvent( QKeyEvent* );
-  void                     windowActivationChange( bool );
-  void                     DumpMeshInfos();
-
-private slots:
-  void                     onSelectionChanged();
-  void                     DeactivateActiveDialog();
-  void                     ActivateThisDialog();
-  void                     onStartSelection();
-  void                     onHelp();
-
-private:
-  SMESHGUI*                mySMESHGUI;
-  LightApp_SelectionMgr*   mySelectionMgr; 
-  bool                     myStartSelection;
-  bool                     myIsActiveWindow;
-    
-  SUIT_SelectionFilter*    myMeshFilter;
-
-  QLabel*                  myNameLab;
-  QPushButton*             mySelectBtn;
-  QLineEdit*               myMeshLine;
-    
-  QTextBrowser*            myInfo;
-    
-  QGroupBox*               myMeshGroup;
-  QGroupBox*               myInfoGroup;
-    
-  QGroupBox*               myButtonsGroup;
-  QPushButton*             myOkBtn;
-  QPushButton*             myHelpBtn;
-    
-  QString                  myHelpFileName;
-};
-
-#endif // SMESHGUI_STANDARDMESHINFOSDLG_H
diff --git a/src/SMESHGUI/SMESHGUI_WhatIsDlg.cxx b/src/SMESHGUI/SMESHGUI_WhatIsDlg.cxx
deleted file mode 100755 (executable)
index 8806dd7..0000000
+++ /dev/null
@@ -1,637 +0,0 @@
-// Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// SMESH SMESHGUI : GUI for SMESH component
-// File   : SMESHGUI_WhatIsDlg.cxx
-// Author : Vladimir TURIN, Open CASCADE S.A.S.
-// SMESH includes
-//
-#include "SMESHGUI_WhatIsDlg.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_VTKUtils.h"
-#include "SMESHGUI_MeshUtils.h"
-#include "SMESHGUI_IdValidator.h"
-
-#include "SMESH_Actor.h"
-#include "SMESH_TypeFilter.hxx"
-#include "SMESH_LogicalFilter.hxx"
-#include "SMDS_Mesh.hxx"
-#include "SMDS_VolumeTool.hxx"
-
-// SALOME GUI includes
-#include <SUIT_Desktop.h>
-#include <SUIT_ResourceMgr.h>
-#include <SUIT_Session.h>
-#include <SUIT_MessageBox.h>
-
-#include <LightApp_Application.h>
-#include <LightApp_SelectionMgr.h>
-
-#include <SVTK_ViewModel.h>
-#include <SVTK_Selection.h>
-#include <SVTK_ViewWindow.h>
-#include <SALOME_ListIO.hxx>
-#include <SALOME_ListIteratorOfListIO.hxx>
-
-// OCCT includes
-#include <TColStd_MapOfInteger.hxx>
-#include <gp_XYZ.hxx>
-
-// Qt includes
-#include <QButtonGroup>
-#include <QGroupBox>
-#include <QLabel>
-#include <QLineEdit>
-#include <QPushButton>
-#include <QRadioButton>
-#include <QTextBrowser>
-#include <QHBoxLayout>
-#include <QVBoxLayout>
-#include <QGridLayout>
-#include <QKeyEvent>
-
-// IDL includes
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Group)
-
-#define SPACING 6
-#define MARGIN  11
-
-//=================================================================================
-// class    : SMESHGUI_WhatIsDlg()
-// purpose  :
-//=================================================================================
-SMESHGUI_WhatIsDlg::SMESHGUI_WhatIsDlg( SMESHGUI* theModule )
-  : QDialog( SMESH::GetDesktop( theModule ) ),
-    mySMESHGUI( theModule ),
-    mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
-{
-  setModal( false );
-  setAttribute( Qt::WA_DeleteOnClose, true );
-  setWindowTitle(tr("SMESH_WHAT_IS_TITLE"));
-  setSizeGripEnabled(true);
-  QVBoxLayout* SMESHGUI_WhatIsDlgLayout = new QVBoxLayout(this);
-  SMESHGUI_WhatIsDlgLayout->setSpacing(SPACING);
-  SMESHGUI_WhatIsDlgLayout->setMargin(MARGIN);
-  
-  /***************************************************************/
-  GroupMesh = new QGroupBox(this);
-  QHBoxLayout* GroupMeshLayout = new QHBoxLayout(GroupMesh);
-  GroupMeshLayout->setSpacing(SPACING);
-  GroupMeshLayout->setMargin(MARGIN);
-
-  MeshLabel = new QLabel(tr("SMESH_NAME"), GroupMesh);
-  GroupMeshLayout->addWidget(MeshLabel);
-  MeshName = new QLineEdit(GroupMesh);
-  MeshName->setReadOnly(true);
-  GroupMeshLayout->addWidget(MeshName);
-
-  /***************************************************************/
-  GroupSelections = new QGroupBox(tr("ENTITY_TYPE"), this);
-  QButtonGroup* GroupSel = new QButtonGroup(this);
-  QHBoxLayout* GroupSelectionsLayout = new QHBoxLayout(GroupSelections);
-  GroupSelectionsLayout->setSpacing(SPACING);
-  GroupSelectionsLayout->setMargin(MARGIN);
-
-  RadioButtonNodes = new QRadioButton(tr("SMESH_NODES"), GroupSelections);
-  GroupSelectionsLayout->addWidget(RadioButtonNodes);
-  GroupSel->addButton(RadioButtonNodes, 0);
-  RadioButtonElements = new QRadioButton(tr("SMESH_ELEMENTS"), GroupSelections);
-  GroupSelectionsLayout->addWidget(RadioButtonElements);
-  GroupSel->addButton(RadioButtonElements, 1);
-
-  /***************************************************************/
-  GroupArguments = new QGroupBox(tr("SMESH_INFORMATION"), this);
-  QGridLayout* GroupArgumentsLayout = new QGridLayout(GroupArguments);
-  GroupArgumentsLayout->setSpacing(SPACING);
-  GroupArgumentsLayout->setMargin(MARGIN);
-
-  // Controls for elements selection
-  TextLabelElements  = new QLabel(tr("SMESH_ID_ELEMENTS"), GroupArguments);
-  GroupArgumentsLayout->addWidget(TextLabelElements, 0, 0);
-
-  LineEditElements  = new QLineEdit(GroupArguments);
-  LineEditElements->setValidator(new SMESHGUI_IdValidator(this));
-  LineEditElements->setMaxLength(-1);
-  GroupArgumentsLayout->addWidget(LineEditElements, 0, 1);
-
-  // information text browser
-  Info = new QTextBrowser(GroupArguments);
-  Info->setMinimumSize(300, 200);
-  GroupArgumentsLayout->addWidget(Info, 1, 0, 1, 2);
-
-  /***************************************************************/
-  GroupButtons = new QGroupBox(this);
-  QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons);
-  GroupButtonsLayout->setSpacing(SPACING);
-  GroupButtonsLayout->setMargin(MARGIN);
-
-  buttonOk = new QPushButton(tr("SMESH_BUT_OK"), GroupButtons);
-  buttonOk->setAutoDefault(true);
-  buttonOk->setDefault(true);
-  buttonHelp = new QPushButton(tr("SMESH_BUT_HELP"), GroupButtons);
-  buttonHelp->setAutoDefault(true);
-
-  GroupButtonsLayout->addWidget(buttonOk);
-  GroupButtonsLayout->addSpacing(10);
-  GroupButtonsLayout->addStretch();
-  GroupButtonsLayout->addWidget(buttonHelp);
-
-  SMESHGUI_WhatIsDlgLayout->addWidget(GroupMesh);
-  SMESHGUI_WhatIsDlgLayout->addWidget(GroupSelections);
-  SMESHGUI_WhatIsDlgLayout->addWidget(GroupArguments);
-  SMESHGUI_WhatIsDlgLayout->addWidget(GroupButtons);
-
-  RadioButtonNodes->setChecked(true);
-
-  mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
-
-  mySMESHGUI->SetActiveDialogBox((QDialog*)this);
-
-  // Costruction of the logical filter
-  SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
-  SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter (GROUP);
-
-  QList<SUIT_SelectionFilter*> aListOfFilters;
-  if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
-  if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
-
-  myMeshOrSubMeshOrGroupFilter =
-    new SMESH_LogicalFilter(aListOfFilters, SMESH_LogicalFilter::LO_OR);
-
-  myHelpFileName = "mesh_infos_page.html#mesh_element_info_anchor";
-
-  Init();
-
-  /* signals and slots connections */
-  connect(buttonOk,         SIGNAL(clicked()),     this, SLOT(ClickOnOk()));
-  connect(buttonHelp,       SIGNAL(clicked()),     this, SLOT(ClickOnHelp()));
-  connect(GroupSel,         SIGNAL(buttonClicked(int)), SLOT(SelectionsClicked(int)));
-
-  connect(mySMESHGUI,       SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
-  connect(mySelectionMgr,   SIGNAL(currentSelectionChanged()),      this, SLOT(SelectionIntoArgument()));
-  /* to close dialog if study change */
-  connect(mySMESHGUI,       SIGNAL(SignalCloseAllDialogs()),  this, SLOT(ClickOnCancel()));
-  connect(LineEditElements, SIGNAL(textChanged(const QString&)),    SLOT(onTextChange(const QString&)));
-
-  SelectionsClicked(0);
-  SelectionIntoArgument();
-}
-
-//=================================================================================
-// function : ~SMESHGUI_WhatIsDlg()
-// purpose  : Destroys the object and frees any allocated resources
-//=================================================================================
-SMESHGUI_WhatIsDlg::~SMESHGUI_WhatIsDlg()
-{
-}
-
-//=================================================================================
-// function : Init()
-// purpose  :
-//=================================================================================
-void SMESHGUI_WhatIsDlg::Init (bool ResetControls)
-{
-  myBusy = false;
-
-  LineEditElements->clear();
-
-  myActor = 0;
-  myMesh = SMESH::SMESH_Mesh::_nil();
-
-  if (ResetControls) {
-    if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-      aViewWindow->SetSelectionMode( CellSelection );
-    onTextChange(LineEditElements->text());
-    
-    SelectionIntoArgument();
-  }
-}
-
-//=================================================================================
-// function : SelectionsClicked()
-// purpose  : Radio button management
-//=================================================================================
-void SMESHGUI_WhatIsDlg::SelectionsClicked (int selectionId)
-{
-  disconnect(mySelectionMgr, 0, this, 0);
-
-  mySelectionMgr->clearFilters();
-
-  switch (selectionId) {
-  case 0:
-    {
-      SMESH::SetPointRepresentation(true);
-      if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-        aViewWindow->SetSelectionMode( NodeSelection );
-      break;
-    }    
-  case 1:
-    {
-      SMESH::SetPointRepresentation(false);
-      if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-        aViewWindow->SetSelectionMode( CellSelection );
-      break;
-    }
-  }
-
-  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
-  SelectionIntoArgument();
-}
-
-//=================================================================================
-// function : ClickOnOk()
-// purpose  :
-//=================================================================================
-void SMESHGUI_WhatIsDlg::ClickOnOk()
-{
-  if (mySMESHGUI->isActiveStudyLocked())
-    return;
-
-  SMESH::UpdateView();
-  Init(false);
-  SelectionIntoArgument();
-  ClickOnCancel();
-}
-
-//=================================================================================
-// function : ClickOnCancel()
-// purpose  :
-//=================================================================================
-void SMESHGUI_WhatIsDlg::ClickOnCancel()
-{
-  disconnect(mySelectionMgr, 0, this, 0);
-  mySelectionMgr->clearFilters();
-  SMESH::SetPointRepresentation(false);
-  if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-    aViewWindow->SetSelectionMode( ActorSelection );
-  mySMESHGUI->ResetState();
-  reject();
-}
-
-//=================================================================================
-// function : ClickOnHelp()
-// purpose  :
-//=================================================================================
-void SMESHGUI_WhatIsDlg::ClickOnHelp()
-{
-  LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
-  if (app) 
-    app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
-  else {
-    SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
-                             tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
-                             arg(app->resourceMgr()->stringValue("ExternalBrowser",
-                                                                 "application")).
-                             arg(myHelpFileName));
-  }
-}
-
-//=======================================================================
-// function : onTextChange()
-// purpose  :
-//=======================================================================
-void SMESHGUI_WhatIsDlg::onTextChange (const QString& theNewText)
-{
-  if (myBusy) return;
-  myBusy = true;
-
-  // hilight entered elements
-  SMDS_Mesh* aMesh = 0;
-  if (myActor)
-    aMesh = myActor->GetObject()->GetMesh();
-
-  if (aMesh) {
-    Handle(SALOME_InteractiveObject) anIO = myActor->getIO();
-    
-    TColStd_MapOfInteger newIndices;
-
-    QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts);
-
-    for (int i = 0; i < aListId.count(); i++) {
-      const SMDS_MeshElement * e = RadioButtonNodes->isChecked()?
-        aMesh->FindNode(aListId[ i ].toInt()):
-        aMesh->FindElement(aListId[ i ].toInt());
-      if (e)
-        newIndices.Add(e->GetID());
-    }
-
-    mySelector->AddOrRemoveIndex( anIO, newIndices, false );
-    if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-      aViewWindow->highlight( anIO, true, true );
-  }
-
-  SelectionIntoArgument();
-
-  myBusy = false;
-}
-
-//=================================================================================
-// function : SelectionIntoArgument()
-// purpose  : Called when selection as changed or other case
-//=================================================================================
-void SMESHGUI_WhatIsDlg::SelectionIntoArgument()
-{
-  int curBusy = myBusy;
-
-  // clear
-  myActor = 0;
-  QString aString = "";
-
-  myBusy = true;
-  if(!curBusy)
-    LineEditElements->setText(aString);
-  MeshName->setText(aString);
-  GroupMesh->setTitle(tr(""));
-  Info->clear();
-  myBusy = curBusy;
-
-  if (!GroupButtons->isEnabled()) // inactive
-    return;
-
-  // get selected mesh
-  SALOME_ListIO aList;
-  mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type());
-
-  int nbSel = aList.Extent();
-
-  if (nbSel < 1)
-    return;
-
-  Handle(SALOME_InteractiveObject) IO = aList.First();
-  myMesh = SMESH::GetMeshByIO(IO);
-  if (myMesh->_is_nil())
-    return;
-
-  if (nbSel != 1) {
-    //check if all selected objects belongs to one mesh
-    SALOME_ListIteratorOfListIO io( aList );
-    for (io.Next(); io.More(); io.Next() ) {
-      SMESH::SMESH_Mesh_var mesh = SMESH::GetMeshByIO(io.Value());
-      if (!mesh->_is_nil() && !mesh->_is_equivalent( myMesh ))
-        return;
-    }
-    // select IO with any element selected (for case of selection by rectangle)
-    IO.Nullify();
-    for (io.Initialize(aList); io.More() && IO.IsNull(); io.Next() )
-      if ( mySelector->HasIndex( io.Value() ))
-        IO = io.Value();
-    if ( IO.IsNull() ) return;
-    // unhilight others
-    if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) {
-      for (io.Initialize(aList); io.More(); io.Next() )
-        if ( !IO->isSame( io.Value() ))
-          aViewWindow->highlight( io.Value(), false, true );
-    }
-  }
-
-  myActor = SMESH::FindActorByObject(myMesh);
-  if (!myActor)
-    myActor = SMESH::FindActorByEntry(IO->getEntry());
-  if (!myActor)
-    return;
-
-  QString aName = IO->getName();
-  // cut off wite spaces from tail, else meaningful head is not visible
-  int size = aName.length();
-  while (size && aName.at(size-1).isSpace() )
-    --size;
-  if ( size != aName.length() )
-    aName.truncate( size );
-  MeshName->setText(aName); // can be something like "2 objects"
-
-  if(!SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO)->_is_nil()) {
-    GroupMesh->setTitle(tr("SMESH_MESH"));
-  } else if(!SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(IO)->_is_nil()) {
-    GroupMesh->setTitle(tr("SMESH_SUBMESH"));
-  } else if(!SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IO)->_is_nil()) {
-    GroupMesh->setTitle(tr("SMESH_GROUP"));
-  }
-
-  int aNbUnits = 0;
-  
-  aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, IO, aString);
-  
-  if (aNbUnits < 1)
-    return;
-
-  const SMDS_MeshElement * e = RadioButtonNodes->isChecked()?
-    myActor->GetObject()->GetMesh()->FindNode(aString.toInt()):
-    myActor->GetObject()->GetMesh()->FindElement(aString.toInt());
-  if (e) {
-    QString anInfo;
-    anInfo="<b>" + tr("ENTITY_TYPE") + ":</b> ";
-    if(e->GetType() == SMDSAbs_Node) {
-      anInfo+=tr("MESH_NODE")+"<br>";
-      //const SMDS_MeshNode *en = (SMDS_MeshNode*) e; // VSR: not used!
-    } else if (e->GetType() == SMDSAbs_0DElement) {
-      anInfo+=tr("SMESH_ELEM0D")+"<br>";
-    } else if(e->GetType() == SMDSAbs_Edge) {
-      anInfo+=tr("SMESH_EDGE")+"<br>";
-      anInfo+="<b>" + tr("SMESH_MESHINFO_TYPE")+":</b> ";
-      const SMDS_MeshEdge *ee = (SMDS_MeshEdge*) e;
-      anInfo+=(ee->IsQuadratic()?tr("SMESH_MESHINFO_ORDER2"):tr("SMESH_MESHINFO_ORDER1"))+"<br>";
-    } else if(e->GetType() == SMDSAbs_Face) {
-      const SMDS_MeshFace *ef = (SMDS_MeshFace*) e;
-      anInfo+=tr("SMESH_FACE")+"<br>";
-      anInfo+="<b>" + tr("SMESH_MESHINFO_TYPE")+":</b> ";
-      if(!ef->IsPoly())
-        anInfo+=(ef->IsQuadratic()?tr("SMESH_MESHINFO_ORDER2"):tr("SMESH_MESHINFO_ORDER1"))+" ";
-      switch(ef->NbNodes()) {
-      case 3:
-      case 6:
-        {
-          anInfo+=tr("SMESH_TRIANGLE");
-          break;
-        }
-      case 4:
-      case 8:
-        {
-          anInfo+=tr("SMESH_QUADRANGLE");
-          break;
-        }
-      default:
-        break;
-      }
-      anInfo+="<br>";
-    } else if(e->GetType() == SMDSAbs_Volume) {
-      anInfo+=tr("SMESH_VOLUME")+"<br>";
-      anInfo+="<b>" + tr("SMESH_MESHINFO_TYPE")+":</b> ";
-      const SMDS_MeshVolume *ev = (SMDS_MeshVolume*) e;
-      SMDS_VolumeTool vt(ev);
-      if(vt.GetVolumeType() != SMDS_VolumeTool::POLYHEDA)
-        anInfo+=(ev->IsQuadratic()?tr("SMESH_MESHINFO_ORDER2"):tr("SMESH_MESHINFO_ORDER1"))+" ";
-      switch(vt.GetVolumeType()) {
-      case SMDS_VolumeTool::TETRA:
-      case SMDS_VolumeTool::QUAD_TETRA:
-        {
-          anInfo+=tr("SMESH_TETRAS");
-          break;
-        }
-      case SMDS_VolumeTool::PYRAM:
-      case SMDS_VolumeTool::QUAD_PYRAM:
-        {
-          anInfo+=tr("SMESH_PYRAMID");
-          break;
-        }
-      case SMDS_VolumeTool::PENTA:
-      case SMDS_VolumeTool::QUAD_PENTA:
-        {
-          anInfo+=tr("SMESH_PRISM");
-          break;
-        }
-      case SMDS_VolumeTool::HEXA:
-      case SMDS_VolumeTool::QUAD_HEXA:
-        {
-          anInfo+=tr("SMESH_HEXAS");
-          break;
-        }
-      case SMDS_VolumeTool::POLYHEDA:
-        {
-          anInfo+=tr("SMESH_POLYEDRON");
-          break;
-        }
-      default:
-        break;
-      }
-      anInfo+="<br>";
-    }
-    gp_XYZ anXYZ(0.,0.,0.);
-    SMDS_ElemIteratorPtr nodeIt = e->nodesIterator();
-    int nbNodes = 0;
-    QString aNodesInfo="";
-    for( ; nodeIt->more(); nbNodes++) {
-      const SMDS_MeshNode* node = static_cast<const SMDS_MeshNode*>( nodeIt->next() );
-      anXYZ.Add( gp_XYZ( node->X(), node->Y(), node->Z() ) );
-      if(e->GetType() != SMDSAbs_Node)
-        aNodesInfo+=QString("<b>Node %1:</b><br>Id=%2, X=%3, Y=%4, Z=%5<br>").arg(nbNodes+1).arg(node->GetID()).arg(node->X()).arg(node->Y()).arg(node->Z());
-      // Calculate Connectivity
-      SMDS_ElemIteratorPtr it = node->GetInverseElementIterator();
-      if (it) {
-        aNodesInfo+="<b>" + tr("CONNECTED_ELEMENTS") + ":</b>";
-        while (it->more()) {
-          const SMDS_MeshElement* elem = it->next();
-          aNodesInfo+=QString(" %1").arg(elem->GetID());
-        }
-        if ( (nbNodes+1) != e->NbNodes())
-          aNodesInfo+=QString("<br><br>");
-      }
-    }
-    if(e->GetType() != SMDSAbs_Node)
-      anInfo+="<b>" + tr("GRAVITY_CENTER") + ":</b><br>";
-    anXYZ.Divide(e->NbNodes());
-    anInfo+=QString("X=%1, Y=%2, Z=%3").arg(anXYZ.X()).arg(anXYZ.Y()).arg(anXYZ.Z());
-    if(e->GetType() != SMDSAbs_Node)
-      anInfo+="<br>";
-    if (aNodesInfo!="")
-      anInfo+= "<br>" + aNodesInfo;
-    Info->setText(anInfo);
-  }
-
-  if(!curBusy) {
-    myBusy = true;
-    LineEditElements->setText(aString);
-    myBusy = false;
-  }
-}
-
-//=================================================================================
-// function : DeactivateActiveDialog()
-// purpose  :
-//=================================================================================
-void SMESHGUI_WhatIsDlg::DeactivateActiveDialog()
-{
-  if (GroupArguments->isEnabled()) {
-    GroupSelections->setEnabled(false);
-    GroupMesh->setEnabled(false);
-    GroupArguments->setEnabled(false);
-    GroupButtons->setEnabled(false);
-    mySMESHGUI->ResetState();
-    mySMESHGUI->SetActiveDialogBox(0);
-  }
-}
-
-//=================================================================================
-// function : ActivateThisDialog()
-// purpose  :
-//=================================================================================
-void SMESHGUI_WhatIsDlg::ActivateThisDialog()
-{
-  /* Emit a signal to deactivate the active dialog */
-  mySMESHGUI->EmitSignalDeactivateDialog();
-  GroupArguments->setEnabled(true);
-  GroupButtons->setEnabled(true);
-  GroupSelections->setEnabled(true);
-  GroupMesh->setEnabled(true);
-
-  mySMESHGUI->SetActiveDialogBox((QDialog*)this);
-
-  if ( SMESH::GetViewWindow( mySMESHGUI ))
-    SelectionsClicked(RadioButtonNodes->isChecked()?0:1);
-
-  SelectionIntoArgument();
-}
-
-//=================================================================================
-// function : enterEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_WhatIsDlg::enterEvent (QEvent*)
-{
-  if (!GroupArguments->isEnabled())
-    ActivateThisDialog();
-}
-
-//=================================================================================
-// function : closeEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_WhatIsDlg::closeEvent (QCloseEvent*)
-{
-  /* same than click on cancel button */
-  ClickOnCancel();
-}
-
-//=======================================================================
-//function : hideEvent
-//purpose  : caused by ESC key
-//=======================================================================
-void SMESHGUI_WhatIsDlg::hideEvent (QHideEvent*)
-{
-  if (!isMinimized())
-    ClickOnCancel();
-}
-
-//=================================================================================
-// function : keyPressEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_WhatIsDlg::keyPressEvent( QKeyEvent* e )
-{
-  QDialog::keyPressEvent( e );
-  if ( e->isAccepted() )
-    return;
-
-  if ( e->key() == Qt::Key_F1 ) {
-    e->accept();
-    ClickOnHelp();
-  }
-}
diff --git a/src/SMESHGUI/SMESHGUI_WhatIsDlg.h b/src/SMESHGUI/SMESHGUI_WhatIsDlg.h
deleted file mode 100755 (executable)
index 2fb0302..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// SMESH SMESHGUI : GUI for SMESH component
-// File   : SMESHGUI_WhatIsDlg.h
-// Author : Vladimir TURIN, Open CASCADE S.A.S.
-//
-#ifndef SMESHGUI_WHATISDLG_H
-#define SMESHGUI_WHATISDLG_H
-
-// Qt includes
-#include <QDialog>
-
-// IDL includes
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-
-class QGroupBox;
-class QLabel;
-class QLineEdit;
-class QPushButton;
-class QRadioButton;
-class QTextBrowser;
-class SMESHGUI;
-class SMESH_Actor;
-class SVTK_Selector;
-class LightApp_SelectionMgr;
-class SMESH_LogicalFilter;
-
-//=================================================================================
-// class    : SMESHGUI_WhatIsDlg
-// purpose  :
-//=================================================================================
-class SMESHGUI_WhatIsDlg : public QDialog
-{ 
-  Q_OBJECT
-   
-public:
-  SMESHGUI_WhatIsDlg( SMESHGUI* );
-  ~SMESHGUI_WhatIsDlg();
-  
-private:
-  void                          Init( bool = true );
-  void                          closeEvent( QCloseEvent* );
-  void                          enterEvent( QEvent* );         /* mouse enter the QWidget */
-  void                          hideEvent( QHideEvent* );      /* ESC key */
-  void                          keyPressEvent( QKeyEvent* );
-
-  SMESHGUI*                     mySMESHGUI;              /* Current SMESHGUI object */
-  LightApp_SelectionMgr*        mySelectionMgr;          /* User shape selection */
-
-  SVTK_Selector*                mySelector;
-
-  bool                          myBusy;
-  SMESH::SMESH_Mesh_var         myMesh;
-  SMESH_Actor*                  myActor;
-  SMESH_LogicalFilter*          myMeshOrSubMeshOrGroupFilter;
-
-  QGroupBox*                    GroupSelections;
-  QRadioButton*                 RadioButtonNodes;
-  QRadioButton*                 RadioButtonElements;
-  QGroupBox*                    GroupButtons;
-  QPushButton*                  buttonOk;
-  QPushButton*                  buttonHelp;
-  QGroupBox*                    GroupArguments;
-  QGroupBox*                    GroupMesh;
-  QLabel*                       TextLabelElements;
-  QLineEdit*                    LineEditElements;
-  QLabel*                       MeshLabel;
-  QLineEdit*                    MeshName;
-
-  QTextBrowser*                 Info;
-    
-  QString                       myHelpFileName;
-
-private slots:
-  void                          SelectionsClicked( int );
-  void                          ClickOnOk();
-  void                          ClickOnCancel();
-  void                          ClickOnHelp();
-  void                          SelectionIntoArgument();
-  void                          DeactivateActiveDialog();
-  void                          ActivateThisDialog();
-  void                          onTextChange( const QString& );
-};
-
-#endif // SMESHGUI_WHATISDLG_H
index aa73b2de393f416fb63789e55fbfff19e9fe2e36..6f2a48a2739dfc67d01cf93c30e7f071c8cd7737 100644 (file)
@@ -3556,10 +3556,6 @@ Please, create VTK viewer and try again</translation>
         <source>PREF_WIREFRAME</source>
         <translation>Wireframe color</translation>
     </message>
-    <message>
-        <source>PREF_GROUP_SELECTION</source>
-        <translation>Selection</translation>
-    </message>            
     <message>
         <source>PREF_SELECTION</source>
         <translation>Selection color</translation>
@@ -5488,21 +5484,6 @@ It is impossible to read point coordinates from file</translation>
         <translation>Union of two triangles</translation>
     </message>
 </context>
-<context>
-    <name>SMESHGUI_WhatIsDlg</name>
-    <message>
-        <source>ENTITY_TYPE</source>
-        <translation>Element type</translation>
-    </message>
-    <message>
-        <source>GRAVITY_CENTER</source>
-        <translation>Gravity center</translation>
-    </message>
-    <message>
-        <source>CONNECTED_ELEMENTS</source>
-        <translation>Connected With Elements</translation>
-    </message>
-</context>
 <context>
     <name>SMESHGUI_FileInfoDlg</name>
     <message>
index c4a7daad9f72e2b00b60cb0d8a9edf32b128a341..fa28ad147ab4f13d578d74b724fcd33c14e54bc3 100755 (executable)
@@ -3556,10 +3556,6 @@ Ouvrez une fenêtre VTK et essayez de nouveau</translation>
         <source>PREF_WIREFRAME</source>
         <translation>Couleur de contour</translation>
     </message>
-    <message>
-        <source>PREF_GROUP_SELECTION</source>
-        <translation>Sélection</translation>
-    </message>            
     <message>
         <source>PREF_SELECTION</source>
         <translation>Couleur de sélection</translation>
@@ -5488,21 +5484,6 @@ Il y a trop peu de points dans le fichier </translation>
         <translation>Union de deux triangles</translation>
     </message>
 </context>
-<context>
-    <name>SMESHGUI_WhatIsDlg</name>
-    <message>
-        <source>ENTITY_TYPE</source>
-        <translation>Type d&apos;élément </translation>
-    </message>
-    <message>
-        <source>GRAVITY_CENTER</source>
-        <translation>Centre de Gravité</translation>
-    </message>
-    <message>
-        <source>CONNECTED_ELEMENTS</source>
-        <translation>Connecté avec d&apos;Eléments </translation>
-    </message>
-</context>
 <context>
     <name>SMESHGUI_FileInfoDlg</name>
     <message>
index 80d7a4d79683f8780e64fc73f075d15406519bcc..2d5ee24f1031f8ead9562b5fccb35c59a7fdc5b8 100644 (file)
@@ -384,6 +384,17 @@ Handle(_pyCommand) _pyGen::AddCommand( const TCollection_AsciiString& theCommand
     aCommand->SetArg( 2, Type );
     aCommand->SetArg( 3, Compare );
 
+    if ( Type == "SMESH.FT_ElemGeomType" && Threshold.IsIntegerValue() )
+    {
+      // set SMESH.GeometryType instead of a numerical Threshold
+      const char* types[SMESH::Geom_POLYHEDRA+1] = {
+        "Geom_POINT", "Geom_EDGE", "Geom_TRIANGLE", "Geom_QUADRANGLE", "Geom_POLYGON",
+        "Geom_TETRA", "Geom_PYRAMID", "Geom_HEXA", "Geom_PENTA", "Geom_POLYHEDRA"
+      };
+      int iGeom = Threshold.IntegerValue();
+      if ( -1 < iGeom && iGeom < SMESH::Geom_POLYHEDRA+1 )
+        Threshold = SMESH + types[ iGeom ];
+    }
     if ( ThresholdStr.Length() != 2 ) // not '' or ""
       aCommand->SetArg( 4, ThresholdStr );
     else if ( ThresholdID.Length() != 2 )
@@ -980,6 +991,14 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand )
   else if ( method == "CreateGroupFromFilter" ) // --> GroupOnFilter()
   {
     theCommand->SetMethod( "GroupOnFilter" );
+    Handle(_pyGroup) group = new _pyGroup( theCommand );
+    theGen->AddObject( group );
+
+    // GroupOnFilter(typ, name, aFilter0x4743dc0 -> aFilter_1)
+    _pyID filterID = theCommand->GetArg(3);
+    Handle(_pyObject) filter = theGen->FindObject( filterID );
+    if ( !filter.IsNull() && filter->IsKind(STANDARD_TYPE(_pyFilter)))
+      filter->Process( theCommand );
   }
   // ----------------------------------------------------------------------
   else if ( method == "GetIdsFromFilter" )
@@ -1278,7 +1297,8 @@ void _pyMeshEditor::Process( const Handle(_pyCommand)& theCommand)
       "SewBorderToSide","SewSideElements","ChangeElemNodes","GetLastCreatedNodes",
       "GetLastCreatedElems",
       "MirrorMakeMesh","MirrorObjectMakeMesh","TranslateMakeMesh",
-      "TranslateObjectMakeMesh","RotateMakeMesh","RotateObjectMakeMesh","MakeBoundaryMesh"
+      "TranslateObjectMakeMesh","RotateMakeMesh","RotateObjectMakeMesh","MakeBoundaryMesh",
+      "MakeBoundaryElements"
       ,"" }; // <- mark of the end
     sameMethods.Insert( names );
   }
@@ -1649,6 +1669,16 @@ Handle(_pyHypothesis) _pyHypothesis::NewHypothesis( const Handle(_pyCommand)& th
     hyp = new _pyLayerDistributionHypo( theCreationCmd, "Get3DHypothesis" );
     hyp->SetConvMethodAndType( "LayerDistribution", "RadialPrism_3D");
   }
+  // Cartesian 3D ---------
+  else if ( hypType == "Cartesian_3D" ) {
+    algo->SetConvMethodAndType( "BodyFitted", hypType.ToCString());
+  }
+  else if ( hypType == "CartesianParameters3D" ) {
+    hyp = new _pyComplexParamHypo( theCreationCmd );
+    hyp->SetConvMethodAndType( "SetGrid", "Cartesian_3D");
+    for ( int iArg = 0; iArg < 4; ++iArg )
+      hyp->myArgs.Append("[]");
+  }
 
   return algo->IsValid() ? algo : hyp;
 }
@@ -1819,12 +1849,44 @@ void _pyHypothesis::Assign( const Handle(_pyHypothesis)& theOther,
 //================================================================================
 /*!
  * \brief Remember hypothesis parameter values
 * \param theCommand - The called hypothesis method
+ * \param theCommand - The called hypothesis method
  */
 //================================================================================
 
 void _pyComplexParamHypo::Process( const Handle(_pyCommand)& theCommand)
 {
+  if ( GetAlgoType() == "Cartesian_3D" )
+  {
+    // CartesianParameters3D hyp
+
+    if ( theCommand->GetMethod() == "SetSizeThreshold" )
+    {
+      myArgs( 4 ) = theCommand->GetArg( 1 );
+      myArgCommands.push_back( theCommand );
+      return;
+    }
+    if ( theCommand->GetMethod() == "SetGrid" ||
+         theCommand->GetMethod() == "SetGridSpacing" )
+    {
+      TCollection_AsciiString axis = theCommand->GetArg( theCommand->GetNbArgs() );
+      int iArg = 1 + ( axis.Value(1) - '0' );
+      if ( theCommand->GetMethod() == "SetGrid" )
+      {
+        myArgs( iArg ) = theCommand->GetArg( 1 );
+      }
+      else
+      {
+        myArgs( iArg ) = "[ ";
+        myArgs( iArg ) += theCommand->GetArg( 1 );
+        myArgs( iArg ) += ", ";
+        myArgs( iArg ) += theCommand->GetArg( 2 );
+        myArgs( iArg ) += "]";
+      }
+      myArgCommands.push_back( theCommand );
+      return;
+    }
+  }
+
   if( theCommand->GetMethod() == "SetLength" )
   {
     // NOW it becomes OBSOLETE
@@ -2772,6 +2834,14 @@ void _pyGroup::Process( const Handle(_pyCommand)& theCommand)
     // set new name of a filter
     filter->Process( makeGroupCmd );
   }
+  else if ( theCommand->GetMethod() == "SetFilter" )
+  {
+    // set new name of a filter
+    _pyID filterID = theCommand->GetArg(1);
+    Handle(_pyObject) filter = theGen->FindObject( filterID );
+    if ( !filter.IsNull() )
+      filter->Process( theCommand );
+  }
 }
 
 //================================================================================
index b4dfd6b82d1a1ad4be47a350bd2b5bcac59ca87d..57bb00ebe8692a580f634ce0928b9a452c0f32fd 100644 (file)
@@ -467,7 +467,7 @@ DEFINE_STANDARD_HANDLE (_pyGroup, _pyObject);
 
 // -------------------------------------------------------------------------------------
 /*!
- * \brief A filter
+ * \brief A filter sets a human readable name to self
  */
 // -------------------------------------------------------------------------------------
 class _pyFilter:  public _pyObject
index 680d724eb25d810e87ab77d13f9275d807c74472..87d8767586d566da682185f93ea28e846bdb1993 100644 (file)
@@ -708,20 +708,28 @@ namespace {
     const TCollection_AsciiString allowedChars =
       "qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM0987654321_";
     bool isValidName = true;
-    int p=1; // replace not allowed chars with underscore
+    int nbUnderscore = 0;
+    int p=1; // replace not allowed chars by underscore
     while (p <= aName.Length() &&
            (p = aName.FirstLocationNotInSet(allowedChars, p, aName.Length())))
     {
       if ( p == 1 || p == aName.Length() || aName.Value(p-1) == '_')
         aName.Remove( p, 1 ); // remove double _ and from the start and the end
       else
-        aName.SetValue(p, '_');
+        aName.SetValue(p, '_'), nbUnderscore++;
       isValidName = false;
     }
     if ( aName.IsIntegerValue() ) { // aName must not start with a digit
       aName.Insert( 1, 'a' );
       isValidName = false;
     }
+    // shorten names like CartesianParameters3D_400_400_400_1000000_1
+    if ( aName.Length() > 20 && nbUnderscore > 2 )
+    {
+      p = aName.Location( "_", 20, aName.Length());
+      if ( p > 1 )
+        aName.Trunc( p-1 );
+    }
     return isValidName;
   }
 }
index 9a562756a3a7ce0a31c3fbcb95e830cde6a3859a..fe51eac073a890124681924732cabf88f7aeb93d 100644 (file)
@@ -297,7 +297,7 @@ SMESH_Gen_i::SMESH_Gen_i( CORBA::ORB_ptr            orb,
     SALOME::Session_var session = SALOME::Session::_narrow( obj ) ;
     if ( !session->_is_nil() )
     {
-      CORBA::String_var s_host = session->getHostname();
+      CORBA::String_var str_host = session->getHostname();
       CORBA::Long        s_pid = session->getPID();
       string my_host = Kernel_Utils::GetHostname();
 #ifdef WNT
@@ -305,7 +305,7 @@ SMESH_Gen_i::SMESH_Gen_i( CORBA::ORB_ptr            orb,
 #else
       long    my_pid = (long) getpid();
 #endif
-      SetEmbeddedMode( s_pid == my_pid && my_host == s_host.in() );
+      SetEmbeddedMode( s_pid == my_pid && my_host == str_host.in() );
     }
   }
 }
index 2399b77fe9f96b81563d62aee204b9fdf4d53eca..8aa34cd9aaddc0a1aa12b8734fc0d62c79d07902 100644 (file)
@@ -582,8 +582,12 @@ void SMESH_GroupBase_i::SetColor(const SALOMEDS::Color& color)
   if (aGroupDS)
   {
     Quantity_Color aQColor( color.R, color.G, color.B, Quantity_TOC_RGB );
-    aGroupDS->SetColor(aQColor);
-    TPythonDump()<<_this()<<".SetColor( SALOMEDS.Color( "<<color.R<<", "<<color.G<<", "<<color.B<<" ))";
+    Quantity_Color oldColor = aGroupDS->GetColor();
+    if ( oldColor != aQColor )
+    {
+      aGroupDS->SetColor(aQColor);
+      TPythonDump()<<_this()<<".SetColor( SALOMEDS.Color( "<<color.R<<", "<<color.G<<", "<<color.B<<" ))";
+    }
   }
 }
 
index 94273a2e07a485b3160ea4c9124cd11fe6b16c6d..bb38829be5b10ca5597978bf1611c9e5f3d6fc37 100644 (file)
@@ -5673,6 +5673,7 @@ CORBA::Boolean SMESH_MeshEditor_i::Make2DMeshFrom3D()
 
 CORBA::Boolean SMESH_MeshEditor_i::DoubleNodesOnGroupBoundaries( const SMESH::ListOfGroups& theDomains,
                                                                  CORBA::Boolean createJointElems )
+  throw (SALOME::SALOME_Exception)
 {
   initData();
 
@@ -5686,8 +5687,10 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodesOnGroupBoundaries( const SMESH::Li
   for ( int i = 0, n = theDomains.length(); i < n; i++ )
   {
     SMESH::SMESH_GroupBase_var aGrp = theDomains[ i ];
-    if ( !CORBA::is_nil( aGrp ) && ( aGrp->GetType() != SMESH::NODE ) )
+    if ( !CORBA::is_nil( aGrp ) /*&& ( aGrp->GetType() != SMESH::NODE )*/ )
     {
+      if ( aGrp->GetType() != SMESH::VOLUME )
+        THROW_SALOME_CORBA_EXCEPTION("Not a volume group", SALOME::BAD_PARAM);
       TIDSortedElemSet domain;
       domain.clear();
       domains.push_back(domain);
index 8400080714220830c35e549df04e54c71c99c49e..4efded98b7d0f0c4efef042876d58bb06f17da18 100644 (file)
@@ -713,7 +713,8 @@ public:
    * @return TRUE if operation has been completed successfully, FALSE otherwise
    */
   CORBA::Boolean DoubleNodesOnGroupBoundaries( const SMESH::ListOfGroups& theDomains,
-                                               CORBA::Boolean createJointElems );
+                                               CORBA::Boolean createJointElems )
+    throw (SALOME::SALOME_Exception);
   /*!
    * \brief Double nodes on some external faces and create flat elements.
    * Flat elements are mainly used by some types of mechanic calculations.
index 8bc116f05f2e1b439d20c4805b95aeefb1d41b98..fc513201a3b8ac86f05fb866b3e451f363602a74 100644 (file)
@@ -2549,7 +2549,7 @@ void SMESH_Mesh_i::PrepareForWriting (const char* file, bool overwrite)
 }
 
 string SMESH_Mesh_i::PrepareMeshNameAndGroups(const char* file,
-                                             CORBA::Boolean overwrite)
+                                              CORBA::Boolean overwrite)
 {
   // Perform Export
   PrepareForWriting(file, overwrite);
@@ -2595,7 +2595,7 @@ void SMESH_Mesh_i::ExportToMEDX (const char* file,
   throw(SALOME::SALOME_Exception)
 {
   Unexpect aCatch(SALOME_SalomeException);
-  string aMeshName = PrepareMeshNameAndGroups(file, true);
+  string aMeshName = PrepareMeshNameAndGroups(file, overwrite);
   TPythonDump() << _this() << ".ExportToMEDX( r'"
                 << file << "', " << auto_groups << ", " << theVersion << ", " << overwrite << " )";
 
index 006b1cc28be3c10b06e29ef1857ef54534016d95..57539c77a130f8886bbca4c4a264d55579f40fbd 100644 (file)
@@ -19,7 +19,7 @@
 
 include $(top_srcdir)/adm_local/unix/make_common_starter.am
 
-salomepypkgdir = $(salomepythondir)/salome/smesh
+salomepypkgdir = $(smeshpypkgdir)
 salomepypkg_PYTHON = \
        __init__.py        \
        smeshstudytools.py
index 54adbb7d268202b77cf5772f6356ee595e92459a..59fa4f88ef530a9e48d8b996a11d298050dced63 100644 (file)
@@ -1712,6 +1712,23 @@ class Mesh:
         TreatHypoStatus( status, hyp_name, geom_name, isAlgo )
         return status
 
+    ## Return True if an algorithm of hypothesis is assigned to a given shape
+    #  @param hyp a hypothesis to check
+    #  @param geom a subhape of mesh geometry
+    #  @return True of False
+    #  @ingroup l2_hypotheses
+    def IsUsedHypothesis(self, hyp, geom):
+        if not hyp or not geom:
+            return False
+        if isinstance( hyp, Mesh_Algorithm ):
+            hyp = hyp.GetAlgorithm()
+            pass
+        hyps = self.GetHypothesisList(geom)
+        for h in hyps:
+            if h.GetId() == hyp.GetId():
+                return True
+        return False
+
     ## Unassigns a hypothesis
     #  @param hyp a hypothesis to unassign
     #  @param geom a subshape of mesh geometry
@@ -4589,9 +4606,14 @@ class Mesh_Algorithm:
                 if isinstance( arg, geompyDC.GEOM._objref_GEOM_Object ):
                     argStr = arg.GetStudyEntry()
                     if not argStr: argStr = "GEOM_Obj_%s", arg.GetEntry()
+                if len( argStr ) > 10:
+                    argStr = argStr[:7]+"..."
+                    if argStr[0] == '[': argStr += ']'
                 a = a + s + argStr
                 s = ","
                 pass
+            if len(a) > 50:
+                a = a[:47]+"..."
             self.mesh.smeshpyD.SetName(hypo, hyp + a)
             pass
         geomName=""
@@ -4638,7 +4660,7 @@ class Mesh_Algorithm:
 
     ## Transform a list of ether edges or tuples (edge 1st_vertex_of_edge)
     #  into a list acceptable to SetReversedEdges() of some 1D hypotheses
-    #  @ingroupl3_hypos_1dhyps
+    #  @ingroup l3_hypos_1dhyps
     def ReversedEdgeIndices(self, reverseList):
         resList = []
         geompy = self.mesh.geompyD
@@ -5180,7 +5202,7 @@ class Mesh_Triangle(Mesh_Algorithm):
     ## Sets topology usage way.
     # @param way defines how mesh conformity is assured <ul>
     # <li>FromCAD - mesh conformity is assured by conformity of a shape</li>
-    # <li>PreProcess or PreProcessPlus - by pre-processing a CAD model</li></ul>
+    # <li>PreProcess or PreProcessPlus - by pre-processing a CAD model</li>
     # <li>PreCAD - by pre-processing with PreCAD a CAD model</li></ul>
     #  @ingroup l3_hypos_blsurf
     def SetTopology(self, way):
@@ -6524,52 +6546,48 @@ class Mesh_Cartesian_3D(Mesh_Algorithm):
 
     def __init__(self, mesh, geom=0):
         self.Create(mesh, geom, "Cartesian_3D")
+        self.hyp = None
         return
 
     ## Defines "Body Fitting parameters" hypothesis
-    #  @param xCoords coordinates of grid nodes along the X asix
-    #  @param yCoords coordinates of grid nodes along the Y asix
-    #  @param zCoords coordinates of grid nodes along the Z asix
-    #  @param sizeThreshold size (> 1.0) defines a minimal size of a polyhedron so that
-    #         a polyhedron of size less than hexSize/sizeThreshold is not created
-    #  @param UseExisting if ==true - searches for the existing hypothesis created with
-    #                     the same parameters, else (default) - creates a new one
-    def SetGrid(self, xCoords, yCoords, zCoords, sizeThreshold, UseExisting=False):
-        hyp = self.Hypothesis("CartesianParameters3D", [xCoords, yCoords, zCoords, sizeThreshold],
-                              UseExisting=UseExisting, CompareMethod=self._compareHyp)
-        hyp.SetGrid(xCoords, 0 )
-        hyp.SetGrid(yCoords, 1 )
-        hyp.SetGrid(zCoords, 2 )
-        hyp.SetSizeThreshold( sizeThreshold )
-        return hyp
-
-    ## Defines "Body Fitting parameters" hypothesis
-    #  @param xSpaceFuns functions f(t) defining spacing value at given point on X axis.
-    #         Parameter t of \axSpaceFuns is a position [0.,1.] withing bounding box of
-    #         the shape to mesh or withing an interval defined by internal points
-    #  @param ySpaceFuns functions f(t) defining spacing value at given point on Y axis.
-    #  @param zSpaceFuns functions f(t) defining spacing value at given point on Z axis.
-    #  @param xInternalPoints points (0.,1.) dividing a grid into parts along X direction.
-    #         Number of \axInternalPoints must be one less than number of \axSpaceFuns
-    #  @param yInternalPoints points (0.,1.) dividing a grid into parts along Y direction.
-    #  @param zInternalPoints points (0.,1.) dividing a grid into parts along Z direction.
-    #  @param sizeThreshold size (> 1.0) defines a minimal size of a polyhedron so that
+    #  @param xGridDef is definition of the grid along the X asix.
+    #  It can be in either of two following forms:
+    #  - Explicit coordinates of nodes, e.g. [-1.5, 0.0, 3.1] or range( -100,200,10)
+    #  - Functions f(t) defining grid spacing at each point on grid axis. If there are
+    #    several functions, they must be accompanied by relative coordinates of
+    #    points dividing the whole shape into ranges where the functions apply; points
+    #    coodrinates should vary within (0.0, 1.0) range. Parameter \a t of the spacing
+    #    function f(t) varies from 0.0 to 1.0 witin a shape range. 
+    #    Examples:
+    #    - "10.5" - defines a grid with a constant spacing
+    #    - [["1", "1+10*t", "11"] [0.1, 0.6]] - defines different spacing in 3 ranges.
+    #  @param yGridDef defines the grid along the Y asix the same way as \a xGridDef does
+    #  @param zGridDef defines the grid along the Z asix the same way as \a xGridDef does
+    #  @param sizeThreshold (> 1.0) defines a minimal size of a polyhedron so that
     #         a polyhedron of size less than hexSize/sizeThreshold is not created
     #  @param UseExisting if ==true - searches for the existing hypothesis created with
     #                     the same parameters, else (default) - creates a new one
-    def SetSpacing(self,
-                   xSpaceFuns, ySpaceFuns, zSpaceFuns,
-                   xInternalPoints, yInternalPoints, zInternalPoints,
-                   sizeThreshold, UseExisting=False):
-        hyp = self.Hypothesis("CartesianParameters3D",
-                              [xSpaceFuns, ySpaceFuns, zSpaceFuns, \
-                               xInternalPoints, yInternalPoints, zInternalPoints],
-                              UseExisting=UseExisting, CompareMethod=self._compareHyp)
-        hyp.SetGridSpacing(xSpaceFuns, xInternalPoints, 0)
-        hyp.SetGridSpacing(ySpaceFuns, yInternalPoints, 1)
-        hyp.SetGridSpacing(zSpaceFuns, zInternalPoints, 2)
-        hyp.SetSizeThreshold( sizeThreshold )
-        return hyp
+    def SetGrid(self, xGridDef, yGridDef, zGridDef, sizeThreshold=4.0, UseExisting=False):
+        if not self.hyp:
+            self.hyp = self.Hypothesis("CartesianParameters3D",
+                                       [xGridDef, yGridDef, zGridDef, sizeThreshold],
+                                       UseExisting=UseExisting, CompareMethod=self._compareHyp)
+        if not self.mesh.IsUsedHypothesis( self.hyp, self.geom ):
+            self.mesh.AddHypothesis( self.hyp, self.geom )
+
+        for axis, gridDef in enumerate( [xGridDef, yGridDef, zGridDef]):
+            if not gridDef: raise ValueError, "Empty grid definition"
+            if isinstance( gridDef, str ):
+                self.hyp.SetGridSpacing( [gridDef], [], axis )
+            elif isinstance( gridDef[0], str ):
+                self.hyp.SetGridSpacing( gridDef, [], axis )
+            elif isinstance( gridDef[0], int ) or \
+                 isinstance( gridDef[0], float ):
+                self.hyp.SetGrid(gridDef, axis )
+            else:
+                self.hyp.SetGridSpacing( gridDef[0], gridDef[1], axis )
+        self.hyp.SetSizeThreshold( sizeThreshold )
+        return self.hyp
 
     def _compareHyp(self,hyp,args):
         # not implemented yet
index b685243a6c8b5dc212e0868891ec975c46e6699e..9fb64deb3d8cc955496f01cf0fabb59e16c45dd8 100644 (file)
@@ -315,7 +315,7 @@ namespace
       bool IsCorner() const { return _node; }
     };
     // --------------------------------------------------------------------------------
-    struct _Link // link connection two _Node's
+    struct _Link // link connecting two _Node's
     {
       _Node* _nodes[2];
       vector< _Node>  _intNodes; // _Node's at GridLine intersections
index ceb29fa71f0e67e7e93b76e5bc025194eafb13fd..5cd250767111cb4872d6033a0cf3adf286717774 100644 (file)
@@ -261,13 +261,26 @@ namespace
    */
   //================================================================================
 
-  bool beginsAtSide( const _FaceGrid& sideGrid1, const _FaceGrid& sideGrid2 )
+  bool beginsAtSide( const _FaceGrid&     sideGrid1,
+                     const _FaceGrid&     sideGrid2,
+                     SMESH_ProxyMesh::Ptr proxymesh )
   {
-    const SMDS_MeshNode* n00 = (sideGrid1._u2nodesMap.begin()->second)[0];
     const TNodeColumn& col0  = sideGrid2._u2nodesMap.begin()->second;
     const TNodeColumn& col1  = sideGrid2._u2nodesMap.rbegin()->second;
-    return ( n00 == col0.front() || n00 == col0.back() ||
-             n00 == col1.front() || n00 == col1.back() );
+    const SMDS_MeshNode* n00 = col0.front();
+    const SMDS_MeshNode* n01 = col0.back();
+    const SMDS_MeshNode* n10 = col1.front();
+    const SMDS_MeshNode* n11 = col1.back();
+    const SMDS_MeshNode* n = (sideGrid1._u2nodesMap.begin()->second)[0];
+    if ( proxymesh )
+    {
+      n00 = proxymesh->GetProxyNode( n00 );
+      n10 = proxymesh->GetProxyNode( n10 );
+      n01 = proxymesh->GetProxyNode( n01 );
+      n11 = proxymesh->GetProxyNode( n11 );
+      n   = proxymesh->GetProxyNode( n );
+    }
+    return ( n == n00 || n == n01 || n == n10 || n == n11 );
   }
 }
 
@@ -433,12 +446,12 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh &         aMesh,
 
   // Orient loaded grids of cube sides along axis of the unitary cube coord system
   bool isReverse[6];
-  isReverse[B_BOTTOM] = beginsAtSide( aCubeSide[B_BOTTOM], aCubeSide[B_RIGHT ] );
-  isReverse[B_TOP   ] = beginsAtSide( aCubeSide[B_TOP   ], aCubeSide[B_RIGHT ] );
-  isReverse[B_FRONT ] = beginsAtSide( aCubeSide[B_FRONT ], aCubeSide[B_RIGHT ] );
-  isReverse[B_BACK  ] = beginsAtSide( aCubeSide[B_BACK  ], aCubeSide[B_RIGHT ] );
-  isReverse[B_LEFT  ] = beginsAtSide( aCubeSide[B_LEFT  ], aCubeSide[B_BACK  ] );
-  isReverse[B_RIGHT ] = beginsAtSide( aCubeSide[B_RIGHT ], aCubeSide[B_BACK  ] );
+  isReverse[B_BOTTOM] = beginsAtSide( aCubeSide[B_BOTTOM], aCubeSide[B_RIGHT ], proxymesh );
+  isReverse[B_TOP   ] = beginsAtSide( aCubeSide[B_TOP   ], aCubeSide[B_RIGHT ], proxymesh );
+  isReverse[B_FRONT ] = beginsAtSide( aCubeSide[B_FRONT ], aCubeSide[B_RIGHT ], proxymesh );
+  isReverse[B_BACK  ] = beginsAtSide( aCubeSide[B_BACK  ], aCubeSide[B_RIGHT ], proxymesh );
+  isReverse[B_LEFT  ] = beginsAtSide( aCubeSide[B_LEFT  ], aCubeSide[B_BACK  ], proxymesh );
+  isReverse[B_RIGHT ] = beginsAtSide( aCubeSide[B_RIGHT ], aCubeSide[B_BACK  ], proxymesh );
   for ( int i = 0; i < 6; ++i )
   {
     aCubeSide[i]._columns.resize( aCubeSide[i]._u2nodesMap.size() );
index 4af40d8d562af01613db22c77dc1966ea148c8e9..5e963a02d96401edf200001bed5df2819f07ccd8 100644 (file)
@@ -26,7 +26,7 @@
 //
 #include "StdMeshers_ImportSource.hxx"
 
-#include "SMESHDS_GroupBase.hxx"
+#include "SMESHDS_GroupOnGeom.hxx"
 #include "SMESHDS_Mesh.hxx"
 #include "SMESH_Algo.hxx"
 #include "SMESH_Gen.hxx"
@@ -258,6 +258,51 @@ std::vector<SMESH_Mesh*> StdMeshers_ImportSource1D::GetSourceMeshes() const
   return meshes;
 }
 
+//================================================================================
+/*!
+ * \brief Return submeshes whose events affect the target mesh
+ */
+//================================================================================
+
+std::vector<SMESH_subMesh*>
+StdMeshers_ImportSource1D::GetSourceSubMeshes(const SMESH_Mesh* srcMesh) const
+{
+  if ( !srcMesh->HasShapeToMesh() )
+    return vector<SMESH_subMesh*>(1, srcMesh->GetSubMeshContaining(1));
+
+  set<int> shapeIDs;
+  const vector<SMESH_Group*>& groups = GetGroups();
+  const SMESHDS_Mesh * srcMeshDS = srcMesh->GetMeshDS();
+  for ( size_t i = 0; i < groups.size(); ++i )
+  {
+    SMESHDS_GroupBase * grDS = groups[i]->GetGroupDS();
+    if ( grDS->GetMesh() != srcMeshDS )
+      continue;
+    if ( SMESHDS_GroupOnGeom* gog = dynamic_cast<SMESHDS_GroupOnGeom*>( grDS ))
+    {
+      shapeIDs.insert( srcMeshDS->ShapeToIndex( gog->GetShape() ));
+    }
+    else
+    {
+      SMDS_ElemIteratorPtr elIt = grDS->GetElements();
+      while ( elIt->more() )
+        shapeIDs.insert( elIt->next()->getshapeId() );
+    }
+  }
+  if ( !shapeIDs.empty() && *shapeIDs.begin() < 1 )
+  {
+    shapeIDs.erase( shapeIDs.begin() );
+    shapeIDs.insert( 1 );
+  }
+
+  vector<SMESH_subMesh*> smVec( shapeIDs.size());
+  set<int>::iterator sID = shapeIDs.begin();
+  for ( int i = 0; sID != shapeIDs.end(); ++sID, ++i )
+    smVec[i] = srcMesh->GetSubMeshContaining( *sID );
+
+  return smVec;
+}
+
 //=============================================================================
 /*!
  * Save _toCopyMesh and _toCopyGroups to a stream
index 61b3b1ed5d8fbf2ddc7c62d5c09414f5b6446fc9..1f87da44cd1e16e9eeea99f434fea19da4c82805 100644 (file)
@@ -37,6 +37,7 @@
 
 class SMESH_Group;
 class SMESHDS_Mesh;
+class SMESH_subMesh;
 
 //==============================================================================
 /*!
@@ -69,6 +70,7 @@ class STDMESHERS_EXPORT StdMeshers_ImportSource1D : public SMESH_Hypothesis
                                              const SMESHDS_Mesh& tgtMesh);
 
   std::vector<SMESH_Mesh*> GetSourceMeshes() const;
+  std::vector<SMESH_subMesh*> GetSourceSubMeshes(const SMESH_Mesh* srcMesh) const;
 
 private:
 
index 1fcd7d56005734a87b5bc40cc50601a08a198020..9fc541c600035775fc5f689f7fc93f0312a667b4 100644 (file)
@@ -303,14 +303,16 @@ namespace // INTERNAL STUFF
     // set listener to hear events of the submesh computed by "Import" algo
     importSub->SetEventListener( get(), new _ListenerData(srcHyp), importSub );
 
-    // set a listener to hear events of the source mesh
+    // set listeners to hear events of the source mesh
     SMESH_subMesh* smToNotify = importSub;
-    SMESH_subMesh* smToListen = srcMesh->GetSubMeshContaining(1);
-    SMESH_subMeshEventListenerData* data = new _ListenerData(srcHyp, LISTEN_SRC_MESH);
-    data->mySubMeshes.push_back( smToNotify );
-    importSub->SetEventListener( get(), data, smToListen );
-
-    // remeber the submesh importSub and its sub-submeshes
+    vector<SMESH_subMesh*> smToListen = srcHyp->GetSourceSubMeshes( srcMesh );
+    for ( size_t i = 0; i < smToListen.size(); ++i )
+    {
+      SMESH_subMeshEventListenerData* data = new _ListenerData(srcHyp, LISTEN_SRC_MESH);
+      data->mySubMeshes.push_back( smToNotify );
+      importSub->SetEventListener( get(), data, smToListen[i] );
+    }
+    // remember the submesh importSub and its sub-submeshes
     _ImportData* iData = _Listener::getImportData( srcMesh, importSub->GetFather());
     iData->trackHypParams( importSub, srcHyp );
     iData->addComputed( importSub );
@@ -370,11 +372,11 @@ namespace // INTERNAL STUFF
           // clear the rest submeshes
           if ( !d->_computedSubM.empty() )
           {
-            set< SMESH_subMesh*, _SubLess> subs;
-            subs.swap( d->_computedSubM ); // avoid recursion via events
-            while ( !subs.empty() )
+            d->_computedSubM.clear();
+            set< SMESH_subMesh*, _SubLess>::iterator sub = d->_subM.begin();
+            for ( ; sub != d->_subM.end(); ++sub )
             {
-              SMESH_subMesh* subM = *subs.begin(); subs.erase( subs.begin() );
+              SMESH_subMesh* subM = *sub;
               _ListenerData* hypData = (_ListenerData*) subM->GetEventListenerData( get() );
               if ( hypData )
                 d->removeGroups( sm, hypData->_srcHyp );
index 0d70042c86983d07adbe75a477725dff88c6776f..151926415fb5de5b57d312af62301607b0c192f0 100644 (file)
@@ -1689,16 +1689,17 @@ bool StdMeshers_PrismAsBlock::GetLayersTransformation(vector<gp_Trsf> & trsf) co
     for ( int iE = 0; iE < nbEdgesInWires.front(); ++iE, ++edgeIt )
     {
       if ( BRep_Tool::Degenerated( *edgeIt )) continue;
-      const TParam2ColumnMap& u2colMap =
+      const TParam2ColumnMap* u2colMap =
         GetParam2ColumnMap( myHelper->GetMeshDS()->ShapeToIndex( *edgeIt ), isReverse );
+      if ( !u2colMap ) return false;
       isReverse = ( edgeIt->Orientation() == TopAbs_REVERSED );
-      double f = u2colMap.begin()->first, l = u2colMap.rbegin()->first;
+      double f = u2colMap->begin()->first, l = u2colMap->rbegin()->first;
       if ( isReverse ) swap ( f, l );
       const int nbCol = 5;
       for ( int i = 0; i < nbCol; ++i )
       {
         double u = f + i/double(nbCol) * ( l - f );
-        const TNodeColumn* col = & getColumn( u2colMap, u )->second;
+        const TNodeColumn* col = & getColumn( u2colMap, u )->second;
         if ( columns.empty() || col != columns.back() )
           columns.push_back( col );
       }
index 953bb9aef7cfac35a8477080c6973c5e04ba019f..608cfba700d02927eccbde2d00d680db78e1ce64 100644 (file)
@@ -148,15 +148,18 @@ public:
    * \brief Return TParam2ColumnMap for a base edge
     * \param baseEdgeID - base edge SMESHDS Index
     * \param isReverse - columns in-block orientation
-    * \retval const TParam2ColumnMap& - map
+    * \retval const TParam2ColumnMap* - map
    */
-  const TParam2ColumnMap& GetParam2ColumnMap(const int baseEdgeID,
+  const TParam2ColumnMap* GetParam2ColumnMap(const int baseEdgeID,
                                              bool &    isReverse) const
   {
-    std::pair< TParam2ColumnMap*, bool > col_frw =
-      myShapeIndex2ColumnMap.find( baseEdgeID )->second;
+    std::map< int, std::pair< TParam2ColumnMap*, bool > >::const_iterator i_mo =
+      myShapeIndex2ColumnMap.find( baseEdgeID );
+    if ( i_mo == myShapeIndex2ColumnMap.end() ) return 0;
+
+    const std::pair< TParam2ColumnMap*, bool >& col_frw = i_mo->second;
     isReverse = !col_frw.second;
-    return col_frw.first;
+    return col_frw.first;
   }
 
   /*!
index bedf3692c919b69afaf01d0475e0fcf914d2cfaa..f075e0f03cf184bccff10bffec39c6e427a8001e 100644 (file)
@@ -691,7 +691,7 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh &     theMesh,
           list<double>::iterator u = theParams.begin(), uEnd = theParams.end();
           for ( ; u != uEnd; ++u )
           {
-            GCPnts_AbscissaPoint Discret( theC3d, (*u) * lenFactor, f );
+            GCPnts_AbscissaPoint Discret( theC3d, ((*u)-f) * lenFactor, f );
             if ( Discret.IsDone() )
               *u = Discret.Parameter();
           }
index 912815839ed30849fe91ffc7359330af4a0450cc..4952afab6744a71819f491aafc9bd27e586749c6 100644 (file)
 #include "SMESHDS_Hypothesis.hxx"
 #include "SMESH_Algo.hxx"
 #include "SMESH_ComputeError.hxx"
+#include "SMESH_ControlsDef.hxx"
 #include "SMESH_Gen.hxx"
 #include "SMESH_Group.hxx"
 #include "SMESH_Mesh.hxx"
 #include "SMESH_MesherHelper.hxx"
+#include "SMESH_ProxyMesh.hxx"
 #include "SMESH_subMesh.hxx"
 #include "SMESH_subMeshEventListener.hxx"
-#include "SMESH_ProxyMesh.hxx"
 
 #include "utilities.h"
 
+#include <BRepAdaptor_Curve2d.hxx>
 #include <BRep_Tool.hxx>
 #include <Bnd_B2d.hxx>
 #include <Bnd_B3d.hxx>
@@ -56,6 +58,8 @@
 #include <Geom_Line.hxx>
 #include <Geom_TrimmedCurve.hxx>
 #include <Precision.hxx>
+#include <Standard_ErrorHandler.hxx>
+#include <TColStd_Array1OfReal.hxx>
 #include <TopExp.hxx>
 #include <TopExp_Explorer.hxx>
 #include <TopTools_IndexedMapOfShape.hxx>
@@ -67,7 +71,6 @@
 #include <gp_Ax1.hxx>
 #include <gp_Vec.hxx>
 #include <gp_XY.hxx>
-#include <gp_XYZ.hxx>
 
 #include <list>
 #include <string>
@@ -224,17 +227,22 @@ namespace VISCOUS
                              - M[0][2]*M[1][1]*M[2][0]);
       return determinant > 1e-100;
     }
-    bool IsForward(const gp_XY&        tgtUV,
-                   const TopoDS_Face&  face,
-                   SMESH_MesherHelper& helper,
-                   const double        refSign) const
+    bool IsForward(const gp_XY&         tgtUV,
+                   const SMDS_MeshNode* smoothedNode,
+                   const TopoDS_Face&   face,
+                   SMESH_MesherHelper&  helper,
+                   const double         refSign) const
     {
-      gp_XY prevUV = helper.GetNodeUV( face, _nPrev );
-      gp_XY nextUV = helper.GetNodeUV( face, _nNext );
+      gp_XY prevUV = helper.GetNodeUV( face, _nPrev, smoothedNode );
+      gp_XY nextUV = helper.GetNodeUV( face, _nNext, smoothedNode );
       gp_Vec2d v1( tgtUV, prevUV ), v2( tgtUV, nextUV );
       double d = v1 ^ v2;
       return d*refSign > 1e-100;
     }
+    bool IsNeighbour(const _Simplex& other) const
+    {
+      return _nPrev == other._nNext || _nNext == other._nPrev;
+    }
   };
   //--------------------------------------------------------------------------------
   /*!
@@ -411,6 +419,7 @@ namespace VISCOUS
                 Handle(Geom_Surface)& surface,
                 SMESH_MesherHelper&   helper,
                 const double          refSign,
+                bool                  isCentroidal,
                 bool                  set3D);
   };
   //--------------------------------------------------------------------------------
@@ -444,7 +453,8 @@ namespace VISCOUS
                            _SolidData&           data);
     void getSimplices( const SMDS_MeshNode* node, vector<_Simplex>& simplices,
                        const set<TGeomID>& ingnoreShapes,
-                       const _SolidData* dataToCheckOri = 0);
+                       const _SolidData*   dataToCheckOri = 0,
+                       const bool          toSort = false);
     bool sortEdges( _SolidData&                    data,
                     vector< vector<_LayerEdge*> >& edgesByGeom);
     void limitStepSize( _SolidData&             data,
@@ -465,6 +475,7 @@ namespace VISCOUS
     bool prepareEdgeToShrink( _LayerEdge& edge, const TopoDS_Face& F,
                               SMESH_MesherHelper& helper,
                               const SMESHDS_SubMesh* faceSubMesh );
+    void fixBadFaces(const TopoDS_Face& F, SMESH_MesherHelper& helper);
     bool addBoundaryElements();
 
     bool error( const string& text, int solidID=-1 );
@@ -726,6 +737,67 @@ namespace
     }
     return dir;
   }
+  //================================================================================
+  /*!
+   * \brief Returns true if a FACE is bound by a concave EDGE
+   */
+  //================================================================================
+
+  bool isConcave( const TopoDS_Face& F, SMESH_MesherHelper& helper )
+  {
+    gp_Vec2d drv1, drv2;
+    gp_Pnt2d p;
+    TopExp_Explorer eExp( F.Oriented( TopAbs_FORWARD ), TopAbs_EDGE );
+    for ( ; eExp.More(); eExp.Next() )
+    {
+      const TopoDS_Edge& E = TopoDS::Edge( eExp.Current() );
+      if ( BRep_Tool::Degenerated( E )) continue;
+      // check if 2D curve is concave
+      BRepAdaptor_Curve2d curve( E, F );
+      const int nbIntervals = curve.NbIntervals( GeomAbs_C2 );
+      TColStd_Array1OfReal intervals(1, nbIntervals + 1 );
+      curve.Intervals( intervals, GeomAbs_C2 );
+      bool isConvex = true;
+      for ( int i = 1; i <= nbIntervals && isConvex; ++i )
+      {
+        double u1 = intervals( i );
+        double u2 = intervals( i+1 );
+        curve.D2( 0.5*( u1+u2 ), p, drv1, drv2 );
+        double cross = drv2 ^ drv1;
+        if ( E.Orientation() == TopAbs_REVERSED )
+          cross = -cross;
+        isConvex = ( cross < 1e-9 );
+      }
+      // check if concavity is strong enough to care about it
+      //const double maxAngle = 5 * Standard_PI180;
+      if ( !isConvex )
+      {
+        //cout << "Concave FACE " << helper.GetMeshDS()->ShapeToIndex( F ) << endl;
+        return true;
+        // map< double, const SMDS_MeshNode* > u2nodes;
+        // if ( !SMESH_Algo::GetSortedNodesOnEdge( helper.GetMeshDS(), E,
+        //                                         /*ignoreMedium=*/true, u2nodes))
+        //   continue;
+        // map< double, const SMDS_MeshNode* >::iterator u2n = u2nodes.begin();
+        // gp_Pnt2d uvPrev = helper.GetNodeUV( F, u2n->second );
+        // double    uPrev = u2n->first;
+        // for ( ++u2n; u2n != u2nodes.end(); ++u2n )
+        // {
+        //   gp_Pnt2d uv = helper.GetNodeUV( F, u2n->second );
+        //   gp_Vec2d segmentDir( uvPrev, uv );
+        //   curve.D1( uPrev, p, drv1 );
+        //   try {
+        //     if ( fabs( segmentDir.Angle( drv1 )) > maxAngle )
+        //       return true;
+        //   }
+        //   catch ( ... ) {}
+        //   uvPrev = uv;
+        //   uPrev = u2n->first;
+        // }
+      }
+    }
+    return false;
+  }
   //--------------------------------------------------------------------------------
   // DEBUG. Dump intermediate node positions into a python script
 #ifdef __myDEBUG
@@ -737,31 +809,38 @@ namespace
       py = new ofstream(fname);
       *py << "from smesh import *" << endl
           << "meshSO = GetCurrentStudy().FindObjectID('0:1:2:3')" << endl
-          << "mesh = Mesh( meshSO.GetObject()._narrow( SMESH.SMESH_Mesh ))"<<endl;
+          << "mesh = Mesh( meshSO.GetObject() )"<<endl;
     }
-    ~PyDump() {
-      *py << "mesh.MakeGroup('Prisms of viscous layers',VOLUME,FT_ElemGeomType,'=',Geom_PENTA)"
-          <<endl; delete py; py=0;
+    void Finish() {
+      if (py)
+        *py << "mesh.MakeGroup('Viscous Prisms',VOLUME,FT_ElemGeomType,'=',Geom_PENTA)"<<endl;
+      delete py; py=0;
     }
+    ~PyDump() { Finish(); }
   };
 #define dumpFunction(f) { _dumpFunction(f, __LINE__);}
 #define dumpMove(n)     { _dumpMove(n, __LINE__);}
 #define dumpCmd(txt)    { _dumpCmd(txt, __LINE__);}
   void _dumpFunction(const string& fun, int ln)
-  { *py<< "def "<<fun<<"(): # "<< ln <<endl; cout<<fun<<"()"<<endl;}
+  { if (py) *py<< "def "<<fun<<"(): # "<< ln <<endl; cout<<fun<<"()"<<endl;}
   void _dumpMove(const SMDS_MeshNode* n, int ln)
-  { *py<< "  mesh.MoveNode( "<<n->GetID()<< ", "<< n->X()
-       << ", "<<n->Y()<<", "<< n->Z()<< ")\t\t # "<< ln <<endl; }
+  { if (py) *py<< "  mesh.MoveNode( "<<n->GetID()<< ", "<< n->X()
+               << ", "<<n->Y()<<", "<< n->Z()<< ")\t\t # "<< ln <<endl; }
   void _dumpCmd(const string& txt, int ln)
-  { *py<< "  "<<txt<<" # "<< ln <<endl; }
+  { if (py) *py<< "  "<<txt<<" # "<< ln <<endl; }
   void dumpFunctionEnd()
-  { *py<< "  return"<< endl; }
+  { if (py) *py<< "  return"<< endl; }
+  void dumpChangeNodes( const SMDS_MeshElement* f )
+  { if (py) { *py<< "  mesh.ChangeElemNodes( " << f->GetID()<<", [";
+      for ( int i=1; i < f->NbNodes(); ++i ) *py << f->GetNode(i-1)->GetID()<<", ";
+      *py << f->GetNode( f->NbNodes()-1 )->GetID() << " ])"<< endl; }}
 #else
-  struct PyDump { PyDump() {} };
-  void dumpFunction(const string& fun ){}
-  void dumpFunctionEnd() {}
-  void dumpMove(const SMDS_MeshNode* n ){}
-  void dumpCmd(const string& txt){}
+  struct PyDump { void Finish() {} };
+#define dumpFunction(f) f
+#define dumpMove(n)
+#define dumpCmd(txt)
+#define dumpFunctionEnd()
+#define dumpChangeNodes(f)
 #endif
 }
 
@@ -905,6 +984,7 @@ SMESH_ComputeErrorPtr _ViscousBuilder::Compute(SMESH_Mesh&         theMesh,
   addBoundaryElements();
 
   makeGroupOfLE(); // debug
+  debugDump.Finish();
 
   return _error;
 }
@@ -1067,9 +1147,14 @@ bool _ViscousBuilder::findFacesWithLayers()
       TopoDS_Vertex VV[2];
       TopExp::Vertices( TopoDS::Edge( getMeshDS()->IndexToShape( edgeID )),VV[0],VV[1]);
       if ( noShrinkVertices.Contains( VV[0] ) || noShrinkVertices.Contains( VV[1] ))
+      {
+        _sdVec[i]._noShrinkFaces.insert( getMeshDS()->ShapeToIndex( e2f->second ));
         _sdVec[i]._shrinkShape2Shape.erase( e2f++ );
+      }
       else
+      {
         e2f++;
+      }
     }
   }
       
@@ -1104,7 +1189,25 @@ bool _ViscousBuilder::findFacesWithLayers()
       {
       case 1:
         {
-          _sdVec[i]._shrinkShape2Shape.insert( make_pair( vInd, facesWOL[0] )); break;
+          helper.SetSubShape( facesWOL[0] );
+          if ( helper.IsRealSeam( vInd )) // inflate along a seam edge?
+          {
+            TopoDS_Shape seamEdge;
+            PShapeIteratorPtr eIt = helper.GetAncestors(vertex, *_mesh, TopAbs_EDGE);
+            while ( eIt->more() && seamEdge.IsNull() )
+            {
+              const TopoDS_Shape* e = eIt->next();
+              if ( helper.IsRealSeam( *e ) )
+                seamEdge = *e;
+            }
+            if ( !seamEdge.IsNull() )
+            {
+              _sdVec[i]._shrinkShape2Shape.insert( make_pair( vInd, seamEdge ));
+              break;
+            }
+          }
+          _sdVec[i]._shrinkShape2Shape.insert( make_pair( vInd, facesWOL[0] ));
+          break;
         }
       case 2:
         {
@@ -1817,14 +1920,14 @@ void _LayerEdge::SetCosin( double cosin )
 void _ViscousBuilder::getSimplices( const SMDS_MeshNode* node,
                                     vector<_Simplex>&    simplices,
                                     const set<TGeomID>&  ingnoreShapes,
-                                    const _SolidData*    dataToCheckOri)
+                                    const _SolidData*    dataToCheckOri,
+                                    const bool           toSort)
 {
-  SMESH_MeshEditor editor( _mesh );
   SMDS_ElemIteratorPtr fIt = node->GetInverseElementIterator(SMDSAbs_Face);
   while ( fIt->more() )
   {
     const SMDS_MeshElement* f = fIt->next();
-    const TGeomID shapeInd = editor.FindShape( f );
+    const TGeomID shapeInd = f->getshapeId();
     if ( ingnoreShapes.count( shapeInd )) continue;
     const int nbNodes = f->NbCornerNodes();
     int srcInd = f->GetNodeIndex( node );
@@ -1834,7 +1937,25 @@ void _ViscousBuilder::getSimplices( const SMDS_MeshNode* node,
       std::swap( nPrev, nNext );
     simplices.push_back( _Simplex( nPrev, nNext ));
   }
-  simplices.resize( simplices.size() );
+
+  if ( toSort )
+  {
+    vector<_Simplex> sortedSimplices( simplices.size() );
+    sortedSimplices[0] = simplices[0];
+    int nbFound = 0;
+    for ( size_t i = 1; i < simplices.size(); ++i )
+    {
+      for ( size_t j = 1; j < simplices.size(); ++j )
+        if ( sortedSimplices[i-1]._nNext == simplices[j]._nPrev )
+        {
+          sortedSimplices[i] = simplices[j];
+          nbFound++;
+          break;
+        }
+    }
+    if ( nbFound == simplices.size() - 1 )
+      simplices.swap( sortedSimplices );
+  }
 }
 
 //================================================================================
@@ -2053,10 +2174,12 @@ bool _ViscousBuilder::smoothAndCheck(_SolidData& data,
     TGeomID sInd = data._edges[ iBeg ]->_nodes[0]->getshapeId();
 
     if ( data._edges[ iBeg ]->IsOnEdge() )
-    { // try a simple solution on an analytic EDGE
+    { 
+      dumpFunction(SMESH_Comment("smooth")<<data._index << "_Ed"<<sInd <<"_InfStep"<<nbSteps);
+
+      // try a simple solution on an analytic EDGE
       if ( !smoothAnalyticEdge( data, iBeg, iEnd, surface, F, helper ))
       {
-        dumpFunction(SMESH_Comment("smooth")<<data._index << "_Ed"<<sInd <<"_InfStep"<<nbSteps);
         // smooth on EDGE's
         int step = 0;
         do {
@@ -2069,9 +2192,8 @@ bool _ViscousBuilder::smoothAndCheck(_SolidData& data,
         }
         while ( moved && step++ < 5 );
         //cout << " NB STEPS: " << step << endl;
-
-        dumpFunctionEnd();
       }
+      dumpFunctionEnd();
     }
     else
     {
@@ -2327,21 +2449,35 @@ bool _ViscousBuilder::smoothAnalyticEdge( _SolidData&           data,
         data._edges[i]->_pos.back() = newPos;
         SMDS_MeshNode* tgtNode = const_cast<SMDS_MeshNode*>( data._edges[i]->_nodes.back() );
         tgtNode->setXYZ( newPos.X(), newPos.Y(), newPos.Z() );
+        dumpMove( tgtNode );
       }
     }
     else
     {
       gp_XY uv0 = helper.GetNodeUV( F, data._edges[iFrom]->_2neibors->_nodes[0]);
       gp_XY uv1 = helper.GetNodeUV( F, data._edges[iTo-1]->_2neibors->_nodes[1]);
+      if ( data._edges[iFrom]->_2neibors->_nodes[0] ==
+           data._edges[iTo-1]->_2neibors->_nodes[1] ) // closed edge
+      {
+        int iPeriodic = helper.GetPeriodicIndex();
+        if ( iPeriodic == 1 || iPeriodic == 2 )
+        {
+          uv1.SetCoord( iPeriodic, helper.GetOtherParam( uv1.Coord( iPeriodic )));
+          if ( uv0.Coord( iPeriodic ) > uv1.Coord( iPeriodic ))
+            std::swap( uv0, uv1 );
+        }
+      }
+      const gp_XY rangeUV = uv1 - uv0;
       for ( int i = iFrom; i < iTo; ++i )
       {
         double r = len[i-iFrom] / len.back();
-        gp_XY  newUV = uv0 * ( 1. - r ) + uv1 * r;
+        gp_XY newUV = uv0 + r * rangeUV;
         data._edges[i]->_pos.back().SetCoord( newUV.X(), newUV.Y(), 0 );
 
         gp_Pnt newPos = surface->Value( newUV.X(), newUV.Y() );
         SMDS_MeshNode* tgtNode = const_cast<SMDS_MeshNode*>( data._edges[i]->_nodes.back() );
         tgtNode->setXYZ( newPos.X(), newPos.Y(), newPos.Z() );
+        dumpMove( tgtNode );
 
         SMDS_FacePosition* pos = static_cast<SMDS_FacePosition*>( tgtNode->GetPosition() );
         pos->SetUParameter( newUV.X() );
@@ -2388,6 +2524,7 @@ bool _ViscousBuilder::smoothAnalyticEdge( _SolidData&           data,
         gp_Pnt newPos = surface->Value( newUV.X(), newUV.Y() );
         SMDS_MeshNode* tgtNode = const_cast<SMDS_MeshNode*>( data._edges[i]->_nodes.back() );
         tgtNode->setXYZ( newPos.X(), newPos.Y(), newPos.Z() );
+        dumpMove( tgtNode );
 
         SMDS_FacePosition* pos = static_cast<SMDS_FacePosition*>( tgtNode->GetPosition() );
         pos->SetUParameter( newUV.X() );
@@ -3329,7 +3466,6 @@ bool _ViscousBuilder::shrink()
     _SolidData&     data = *f2sd->second;
     TNode2Edge&   n2eMap = data._n2eMap;
     const TopoDS_Face& F = TopoDS::Face( getMeshDS()->IndexToShape( f2sd->first ));
-    const bool   reverse = ( data._reversedFaceIds.count( f2sd->first ));
 
     Handle(Geom_Surface) surface = BRep_Tool::Surface(F);
 
@@ -3357,12 +3493,15 @@ bool _ViscousBuilder::shrink()
     // Find out face orientation
     double refSign = 1;
     const set<TGeomID> ignoreShapes;
+    bool isOkUV;
     if ( !smoothNodes.empty() )
     {
-      gp_XY uv = helper.GetNodeUV( F, smoothNodes[0] );
       vector<_Simplex> simplices;
       getSimplices( smoothNodes[0], simplices, ignoreShapes );
-      if ( simplices[0].IsForward(uv, F, helper,refSign) != (!reverse))
+      helper.GetNodeUV( F, simplices[0]._nPrev, 0, &isOkUV ); // fix UV of silpmex nodes
+      helper.GetNodeUV( F, simplices[0]._nNext, 0, &isOkUV );
+      gp_XY uv = helper.GetNodeUV( F, smoothNodes[0], 0, &isOkUV );
+      if ( !simplices[0].IsForward(uv, smoothNodes[0], F, helper,refSign) )
         refSign = -1;
     }
 
@@ -3410,8 +3549,10 @@ bool _ViscousBuilder::shrink()
       }
     }
 
+    // find out if a FACE is concave
+    const bool isConcaveFace = isConcave( F, helper );
+
     // Create _SmoothNode's on face F
-    bool isOkUV;
     vector< _SmoothNode > nodesToSmooth( smoothNodes.size() );
     {
       dumpFunction(SMESH_Comment("beforeShrinkFace")<<f2sd->first); // debug
@@ -3420,7 +3561,7 @@ bool _ViscousBuilder::shrink()
         const SMDS_MeshNode* n = smoothNodes[i];
         nodesToSmooth[ i ]._node = n;
         // src nodes must be replaced by tgt nodes to have tgt nodes in _simplices
-        getSimplices( n, nodesToSmooth[ i ]._simplices, ignoreShapes );
+        getSimplices( n, nodesToSmooth[ i ]._simplices, ignoreShapes, NULL, isConcaveFace );
         // fix up incorrect uv of nodes on the FACE
         helper.GetNodeUV( F, n, 0, &isOkUV);
         dumpMove( n );
@@ -3465,8 +3606,6 @@ bool _ViscousBuilder::shrink()
         shrinked |= lEdges[i]->SetNewLength2d( surface,F,helper );
       }
       dumpFunctionEnd();
-      if ( !shrinked )
-        break;
 
       // Move nodes on EDGE's
       set< _Shrinker1D* >::iterator shr = eShri1D.begin();
@@ -3487,7 +3626,8 @@ bool _ViscousBuilder::shrink()
         moved = false;
         for ( unsigned i = 0; i < nodesToSmooth.size(); ++i )
         {
-          moved |= nodesToSmooth[i].Smooth( badNb,surface,helper,refSign,/*set3D=*/false );
+          moved |= nodesToSmooth[i].Smooth( badNb,surface,helper,refSign,
+                                            /*isCentroidal=*/isConcaveFace,/*set3D=*/false );
         }
         if ( badNb < oldBadNb )
           nbNoImpSteps = 0;
@@ -3517,17 +3657,20 @@ bool _ViscousBuilder::shrink()
         highQuality = ( *nbNodesSet.begin() == 4 );
       }
     }
-    for ( int st = highQuality ? 8 : 3; st; --st )
+    if ( !highQuality && isConcaveFace )
+      fixBadFaces( F, helper ); // fix narrow faces by swaping diagonals
+    for ( int st = highQuality ? 10 : 3; st; --st )
     {
       dumpFunction(SMESH_Comment("shrinkFace")<<f2sd->first<<"_st"<<++smooStep); // debug
       for ( unsigned i = 0; i < nodesToSmooth.size(); ++i )
-        nodesToSmooth[i].Smooth( badNb,surface,helper,refSign,/*set3D=*/st==1 );
+        nodesToSmooth[i].Smooth( badNb,surface,helper,refSign,
+                                 /*isCentroidal=*/isConcaveFace,/*set3D=*/st==1 );
       dumpFunctionEnd();
     }
     // Set an event listener to clear FACE sub-mesh together with SOLID sub-mesh
     _SrinkShapeListener::ToClearSubMeshWithSolid( sm, data._solid );
 
-  }// loop on FACES to srink mesh on
+  } // loop on FACES to srink mesh on
 
 
   // Replace source nodes by target nodes in shrinked mesh edges
@@ -3713,6 +3856,124 @@ bool _ViscousBuilder::prepareEdgeToShrink( _LayerEdge&            edge,
 //   return true;
 }
 
+//================================================================================
+/*!
+ * \brief Try to fix triangles with high aspect ratio by swaping diagonals
+ */
+//================================================================================
+
+void _ViscousBuilder::fixBadFaces(const TopoDS_Face& F, SMESH_MesherHelper& helper)
+{
+  SMESH::Controls::AspectRatio qualifier;
+  SMESH::Controls::TSequenceOfXYZ points(3), points1(3), points2(3);
+  const double maxAspectRatio = 4.;
+
+  // find bad triangles
+
+  vector< const SMDS_MeshElement* > badTrias;
+  vector< double >                  badAspects;
+  SMESHDS_SubMesh* sm = helper.GetMeshDS()->MeshElements( F );
+  SMDS_ElemIteratorPtr fIt = sm->GetElements();
+  while ( fIt->more() )
+  {
+    const SMDS_MeshElement * f = fIt->next();
+    if ( f->NbCornerNodes() != 3 ) continue;
+    for ( int iP = 0; iP < 3; ++iP ) points(iP+1) = SMESH_TNodeXYZ( f->GetNode(iP));
+    double aspect = qualifier.GetValue( points );
+    if ( aspect > maxAspectRatio )
+    {
+      badTrias.push_back( f );
+      badAspects.push_back( aspect );
+    }
+  }
+  if ( badTrias.empty() )
+    return;
+
+  // find couples of faces to swap diagonal
+
+  typedef pair < const SMDS_MeshElement* , const SMDS_MeshElement* > T2Trias;
+  vector< T2Trias > triaCouples; 
+
+  TIDSortedElemSet involvedFaces, emptySet;
+  for ( size_t iTia = 0; iTia < badTrias.size(); ++iTia )
+  {
+    T2Trias trias    [3];
+    double  aspRatio [3];
+    int i1, i2, i3;
+
+    involvedFaces.insert( badTrias[iTia] );
+    for ( int iP = 0; iP < 3; ++iP )
+      points(iP+1) = SMESH_TNodeXYZ( badTrias[iTia]->GetNode(iP));
+
+    // find triangles adjacent to badTrias[iTia] with better aspect ratio after diag-swaping
+    int bestCouple = -1;
+    for ( int iSide = 0; iSide < 3; ++iSide )
+    {
+      const SMDS_MeshNode* n1 = badTrias[iTia]->GetNode( iSide );
+      const SMDS_MeshNode* n2 = badTrias[iTia]->GetNode(( iSide+1 ) % 3 );
+      trias [iSide].first  = badTrias[iTia];
+      trias [iSide].second = SMESH_MeshEditor::FindFaceInSet( n1, n2, emptySet, involvedFaces,
+                                                              & i1, & i2 );
+      if ( ! trias[iSide].second || trias[iSide].second->NbCornerNodes() != 3 )
+        continue;
+
+      // aspect ratio of an adjacent tria
+      for ( int iP = 0; iP < 3; ++iP )
+        points2(iP+1) = SMESH_TNodeXYZ( trias[iSide].second->GetNode(iP));
+      double aspectInit = qualifier.GetValue( points2 );
+
+      // arrange nodes as after diag-swaping
+      if ( helper.WrapIndex( i1+1, 3 ) == i2 )
+        i3 = helper.WrapIndex( i1-1, 3 );
+      else
+        i3 = helper.WrapIndex( i1+1, 3 );
+      points1 = points;
+      points1( 1+ iSide ) = points2( 1+ i3 );
+      points2( 1+ i2    ) = points1( 1+ ( iSide+2 ) % 3 );
+
+      // aspect ratio after diag-swaping
+      aspRatio[ iSide ] = qualifier.GetValue( points1 ) + qualifier.GetValue( points2 );
+      if ( aspRatio[ iSide ] > aspectInit + badAspects[ iTia ] )
+        continue;
+
+      if ( bestCouple < 0 || aspRatio[ bestCouple ] > aspRatio[ iSide ] )
+        bestCouple = iSide;
+    }
+
+    if ( bestCouple >= 0 )
+    {
+      triaCouples.push_back( trias[bestCouple] );
+      involvedFaces.insert ( trias[bestCouple].second );
+    }
+    else
+    {
+      involvedFaces.erase( badTrias[iTia] );
+    }
+  }
+  if ( triaCouples.empty() )
+    return;
+
+  // swap diagonals
+
+  SMESH_MeshEditor editor( helper.GetMesh() );
+  dumpFunction(SMESH_Comment("beforeSwapDiagonals_F")<<helper.GetSubShapeID());
+  for ( size_t i = 0; i < triaCouples.size(); ++i )
+  {
+    dumpChangeNodes( triaCouples[i].first );
+    dumpChangeNodes( triaCouples[i].second );
+    editor.InverseDiag( triaCouples[i].first, triaCouples[i].second );
+  }
+  dumpFunctionEnd();
+
+  // just for debug dump resulting triangles
+  dumpFunction(SMESH_Comment("swapDiagonals_F")<<helper.GetSubShapeID());
+  for ( size_t i = 0; i < triaCouples.size(); ++i )
+  {
+    dumpChangeNodes( triaCouples[i].first );
+    dumpChangeNodes( triaCouples[i].second );
+  }
+}
+
 //================================================================================
 /*!
  * \brief Move target node to it's final position on the FACE during shrinking
@@ -3806,7 +4067,7 @@ bool _LayerEdge::SetNewLength2d( Handle(Geom_Surface)& surface,
 
 //================================================================================
 /*!
- * \brief Perform laplacian smooth on the FACE
+ * \brief Perform smooth on the FACE
  *  \retval bool - true if the node has been moved
  */
 //================================================================================
@@ -3815,28 +4076,72 @@ bool _SmoothNode::Smooth(int&                  badNb,
                          Handle(Geom_Surface)& surface,
                          SMESH_MesherHelper&   helper,
                          const double          refSign,
+                         bool                  isCentroidal,
                          bool                  set3D)
 {
   const TopoDS_Face& face = TopoDS::Face( helper.GetSubShape() );
 
+  // get uv of surrounding nodes
+  vector<gp_XY> uv( _simplices.size() );
+  for ( size_t i = 0; i < _simplices.size(); ++i )
+    uv[i] = helper.GetNodeUV( face, _simplices[i]._nPrev, _node );
+
   // compute new UV for the node
   gp_XY newPos (0,0);
-  for ( unsigned i = 0; i < _simplices.size(); ++i )
-    newPos += helper.GetNodeUV( face, _simplices[i]._nPrev );
-  newPos /= _simplices.size();
+  if ( isCentroidal && _simplices.size() > 3 )
+  {
+    // average centers of diagonals wieghted with their reciprocal lengths
+    if ( _simplices.size() == 4 )
+    {
+      double w1 = 1. / ( uv[2]-uv[0] ).SquareModulus();
+      double w2 = 1. / ( uv[3]-uv[1] ).SquareModulus();
+      newPos = ( w1 * ( uv[2]+uv[0] ) + w2 * ( uv[3]+uv[1] )) / ( w1+w2 ) / 2;
+    }
+    else
+    {
+      double sumWeight = 0;
+      int nb = _simplices.size() == 4 ? 2 : _simplices.size();
+      for ( int i = 0; i < nb; ++i )
+      {
+        int iFrom = i + 2;
+        int iTo   = i + _simplices.size() - 1;
+        for ( int j = iFrom; j < iTo; ++j )
+        {
+          int i2 = SMESH_MesherHelper::WrapIndex( j, _simplices.size() );
+          double w = 1. / ( uv[i]-uv[i2] ).SquareModulus();
+          sumWeight += w;
+          newPos += w * ( uv[i]+uv[i2] );
+        }
+      }
+      newPos /= 2 * sumWeight;
+    }
+  }
+  else
+  {
+    // Laplacian smooth
+    isCentroidal = false;
+    for ( size_t i = 0; i < _simplices.size(); ++i )
+      newPos += uv[i];
+    newPos /= _simplices.size();
+  }
 
   // count quality metrics (orientation) of triangles around the node
   int nbOkBefore = 0;
   gp_XY tgtUV = helper.GetNodeUV( face, _node );
   for ( unsigned i = 0; i < _simplices.size(); ++i )
-    nbOkBefore += _simplices[i].IsForward( tgtUV, face, helper, refSign );
+    nbOkBefore += _simplices[i].IsForward( tgtUV, _node, face, helper, refSign );
 
   int nbOkAfter = 0;
   for ( unsigned i = 0; i < _simplices.size(); ++i )
-    nbOkAfter += _simplices[i].IsForward( newPos, face, helper, refSign );
+    nbOkAfter += _simplices[i].IsForward( newPos, _node, face, helper, refSign );
 
   if ( nbOkAfter < nbOkBefore )
+  {
+    // if ( isCentroidal )
+    //   return Smooth( badNb, surface, helper, refSign, !isCentroidal, set3D );
+    badNb += _simplices.size() - nbOkBefore;
     return false;
+  }
 
   SMDS_FacePosition* pos = static_cast<SMDS_FacePosition*>( _node->GetPosition() );
   pos->SetUParameter( newPos.X() );
index 1a54a450286fae374d008ff0117edcb1dd3ec194..e161c9ae26006dd977336d933c9b8dada7817b8b 100644 (file)
@@ -688,3 +688,7 @@ QString StdMeshersGUI_CartesianParamCreator::storeParams() const
   return "";
 }
 
+QString StdMeshersGUI_CartesianParamCreator::helpPage() const
+{
+  return "cartesian_algo_page.html#cartesian_hyp_anchor";
+}
index a35608f88b97ee7d45475fa9e2b6d187509b5be8..7654f26acee9e0ae46b14e8b80307d5dfebe4331 100644 (file)
@@ -125,7 +125,8 @@ public:
   StdMeshersGUI_CartesianParamCreator( const QString& aHypType );
   virtual ~StdMeshersGUI_CartesianParamCreator();
 
-  virtual bool checkParams( QString& ) const;
+  virtual bool    checkParams( QString& ) const;
+  virtual QString helpPage() const;
 
 protected:
   virtual QFrame*  buildFrame();
index 8a5d055b5c3903ffaea224a18d142d7cec021729..8564f23235cef79232fbee546d857c930001467b 100644 (file)
     </message>
     <message>
         <source>SMESH_FACES_WO_LAYERS</source>
-        <translation>Faces without layers</translation>
+        <translation>Faces without layers
+(inlets and oulets)</translation>
     </message>
     <message>
         <source>SMESH_MAX_LENGTH_TITLE</source>
index 1f2374414fc22fa92026b89ef3c4fd4d4e692ac7..9c9352a4eaf7a9248c91ed93f7bc4437d51d1051 100755 (executable)
         <source>SMESH_MAX_LENGTH_HYPOTHESIS</source>
         <translation>Longueur maximale</translation>
     </message>
+    <message>
+        <source>SMESH_CARTESIAN_PARAMS_HYPOTHESIS</source>
+        <translation>Paramètres de Body Fitting</translation>
+    </message>
     <message>
         <source>SMESH_USE_PREESTIMATED_LENGTH</source>
         <translation>Utiliser la longueur pré-estimée</translation>
     </message>
     <message>
         <source>SMESH_STRETCH_FACTOR</source>
-        <translation>Facteur d'échelle</translation>
+        <translation>Facteur d&apos;échelle</translation>
     </message>
     <message>
         <source>SMESH_FACES_WO_LAYERS</source>
-        <translation>Faces sans couche limite</translation>
+        <translation>Faces sans couche limite
+(entrées et sorties)</translation>
     </message>
     <message>
         <source>SMESH_MAX_LENGTH_TITLE</source>
         <translation>Construction de l&apos;hypothèse</translation>
     </message>
+    <message>
+        <source>SMESH_CARTESIAN_PARAMS_TITLE</source>
+        <translation>Construction de l&apos;hypothèse</translation>
+    </message>
     <message>
         <source>SMESH_MAX_ELEMENT_AREA_HYPOTHESIS</source>
         <translation>Aire maximale d&apos;une maille</translation>
         <translation>Editer</translation>
     </message>
 </context>
+<context>
+    <name>StdMeshersGUI_CartesianParamCreator</name>
+    <message>
+        <source>THRESHOLD</source>
+        <translation>Seuil</translation>
+    </message>
+    <message>
+        <source>AXIS_X</source>
+        <translation>Axe X</translation>
+    </message>
+    <message>
+        <source>AXIS_Y</source>
+        <translation>Axe Y</translation>
+    </message>
+    <message>
+        <source>AXIS_Z</source>
+        <translation>Axe Z</translation>
+    </message>
+</context>
+<context>
+    <name>StdMeshersGUI::GridAxisTab</name>
+    <message>
+        <source>GRID_DEF_MODE</source>
+        <translation>Mode de définition</translation>
+    </message>
+    <message>
+        <source>SPACING</source>
+        <translation>Espacement</translation>
+    </message>
+    <message>
+        <source>INSERT</source>
+        <translation>Insérer</translation>
+    </message>
+    <message>
+        <source>COORD_STEP</source>
+        <translation>Pas</translation>
+    </message>
+</context>
 </TS>
index 92083da94305bd73dcd461ab1da1304c8ea3d124..96b92e3cf60bcf3fe50a9e94ea33391371f35e99 100644 (file)
@@ -25,6 +25,4 @@
 #
 include $(top_srcdir)/adm_local/unix/make_common_starter.am
 
-SUBDIRS = MeshCut
-
-DIST_SUBDIRS =         MeshCut
+SUBDIRS = MeshCut padder
index 62a1d8a4eb3487526816b1e4e34dd2e0e1676ad2..c1cecffd9f5296ea9c94bcd433041b59f924ef8e 100644 (file)
@@ -45,11 +45,15 @@ MeshCut_LDFLAGS =  $(MED2_LIBS) $(HDF5_LIBS)
 
 
 UIPY_FILES =  MeshCutDialog.py
-BUILT_SOURCES = $(UIPY_FILES)
-bin_SCRIPTS = $(UIPY_FILES) meshcut_plugin.py
-clean-local:
-       rm -f $(UIPY_FILES)
-EXTRA_DIST += MeshCutDialog.ui meshcut_plugin.py
+
+if SMESH_ENABLE_GUI
+  dist_salomescript_SCRIPTS   = meshcut_plugin.py
+  nodist_salomescript_SCRIPTS = $(UIPY_FILES)
+endif
+
+CLEANFILES = $(UIPY_FILES)
+
+EXTRA_DIST += $(UIPY_FILES:%.py=%.ui)
 
 %.py : %.ui
-       pyuic4 $< -o $@
+       $(PYUIC) $< -o $@
diff --git a/src/Tools/padder/Makefile.am b/src/Tools/padder/Makefile.am
new file mode 100644 (file)
index 0000000..6f16234
--- /dev/null
@@ -0,0 +1,3 @@
+SUBDIRS = meshjob spadderpy unittests resources doc
+
+EXTRA_DIST = README.txt
diff --git a/src/Tools/padder/README.txt b/src/Tools/padder/README.txt
new file mode 100644 (file)
index 0000000..2ecebb3
--- /dev/null
@@ -0,0 +1,38 @@
+
+
+PADDER overview
+---------------
+
+PADDER is an algorithm that creates a set of particules called a "discrete mesh".
+The particules are characterized by a location in space and a weight that can be considered
+as the radius of a sphere whose center is the location of the particule.
+
+Discrete meshes are typically used to modelize civil components in rapid dynamic
+computation problems (seisms, chocs). These components consists in concrete parts
+embedding steal bares for reinforcement. These parts are input to the algorithm
+as standard finite elements meshes. The cells of theses meshes drive the location
+and sizing of particules.
+
+In the med representation, a discrete mesh is described as MED_BALL elements.
+A MED_BALL element is defined by a location and a radius. 
+
+PADDER plugin
+-------------
+
+This directory provides SMESH with a SALOME plugin that can be used to define
+and then run a PADDER execution. The inputs are the FE meshes that describe
+the concrete parts and steal bares parts. The output is a discrete mesh
+containing MED_BALL elements.
+
+A graphical interface is used to drive the user for data input and computation
+supervision (the algorithm may last more than an hour long), and finally the publication
+of the resulting mesh (when succeed) in the SALOME study.
+
+Technically speaking, the PADDER plugin consists in:
+
+* a SALOME component MESHJOB that do the computation job (wrapper to the padder executable program)
+* a graphical interface composed of two dialog windows
+* a configuration mechanism (data file and read function), to define
+  the computation resource (a SALOME resource + the software configuration of the padder executable
+  program on this resource)
+* an integration file (salomeplugin.py)
diff --git a/src/Tools/padder/doc/Makefile.am b/src/Tools/padder/doc/Makefile.am
new file mode 100755 (executable)
index 0000000..fa2d6f8
--- /dev/null
@@ -0,0 +1,39 @@
+# Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+#  Author : Guillaume Boulant (EDF/R&D)
+
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+EXTRA_DIST += images input
+
+#
+# The simplest way to extend the documentation of SMESH with the
+# documentation for PADDER is to add path to the padder documentation
+# in the SMESH gui documentation (see the doxyfile).
+#
+
+# For test purpose, we let the user generate a local dosygen
+# documentation including only the local pages  
+#
+test_docs: doxyfile 
+       echo "===========================================" ; \
+       echo "Generating PADDER documentation" ;             \
+       echo "===========================================" ; \
+       $(DOXYGEN) doxyfile ;
diff --git a/src/Tools/padder/doc/doxyfile.in b/src/Tools/padder/doc/doxyfile.in
new file mode 100755 (executable)
index 0000000..8f2aa2a
--- /dev/null
@@ -0,0 +1,77 @@
+# Copyright (C) 2007-2011  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
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME      = "SALOME Mesh User's Guide"
+OUTPUT_DIRECTORY  = .
+CREATE_SUBDIRS   = NO
+OUTPUT_LANGUAGE   = English
+TAB_SIZE          = 5
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET             = NO
+WARNINGS          = YES
+
+#---------------------------------------------------------------------------
+#Input related options
+#---------------------------------------------------------------------------
+INPUT             = @srcdir@/input               
+FILE_PATTERNS     = *.doc
+EXCLUDE           = 
+IMAGE_PATH        = @srcdir@/images
+EXAMPLE_PATH      = @top_srcdir@/src/SMESH_SWIG
+
+#---------------------------------------------------------------------------
+#HTML related options
+#---------------------------------------------------------------------------
+GENERATE_HTML     = YES
+HTML_OUTPUT       = .
+HTML_HEADER       = @top_builddir@/doc/salome/gui/SMESH/static/header.html
+HTML_FOOTER       = @top_srcdir@/doc/salome/gui/SMESH/static/footer.html
+HTML_STYLESHEET   = @top_srcdir@/doc/salome/gui/SMESH/static/doxygen.css
+TOC_EXPAND        = YES
+DISABLE_INDEX     = NO
+GENERATE_TREEVIEW = YES
+TREEVIEW_WIDTH    = 300
+
+#---------------------------------------------------------------------------
+#SORT related options
+#---------------------------------------------------------------------------
+SORT_GROUP_NAMES = NO
+
+
+#---------------------------------------------------------------------------
+#LaTeX related option
+#---------------------------------------------------------------------------
+GENERATE_LATEX    = NO
+EXTRA_PACKAGES    = amsmath
+
+#---------------------------------------------------------------------------
+#RTF related options
+#---------------------------------------------------------------------------
+GENERATE_RTF      = NO
+
+SEARCHENGINE      = YES
diff --git a/src/Tools/padder/doc/images/SMESH_spadder_end.png b/src/Tools/padder/doc/images/SMESH_spadder_end.png
new file mode 100644 (file)
index 0000000..12e2b7c
Binary files /dev/null and b/src/Tools/padder/doc/images/SMESH_spadder_end.png differ
diff --git a/src/Tools/padder/doc/images/SMESH_spadder_inputdialog_concrete.png b/src/Tools/padder/doc/images/SMESH_spadder_inputdialog_concrete.png
new file mode 100644 (file)
index 0000000..ed0a8a7
Binary files /dev/null and b/src/Tools/padder/doc/images/SMESH_spadder_inputdialog_concrete.png differ
diff --git a/src/Tools/padder/doc/images/SMESH_spadder_inputdialog_start.png b/src/Tools/padder/doc/images/SMESH_spadder_inputdialog_start.png
new file mode 100644 (file)
index 0000000..8725d71
Binary files /dev/null and b/src/Tools/padder/doc/images/SMESH_spadder_inputdialog_start.png differ
diff --git a/src/Tools/padder/doc/images/SMESH_spadder_inputdialog_steelbar.png b/src/Tools/padder/doc/images/SMESH_spadder_inputdialog_steelbar.png
new file mode 100644 (file)
index 0000000..8e692dc
Binary files /dev/null and b/src/Tools/padder/doc/images/SMESH_spadder_inputdialog_steelbar.png differ
diff --git a/src/Tools/padder/doc/images/SMESH_spadder_menu.png b/src/Tools/padder/doc/images/SMESH_spadder_menu.png
new file mode 100644 (file)
index 0000000..e891406
Binary files /dev/null and b/src/Tools/padder/doc/images/SMESH_spadder_menu.png differ
diff --git a/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_finished.png b/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_finished.png
new file mode 100644 (file)
index 0000000..e29cf56
Binary files /dev/null and b/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_finished.png differ
diff --git a/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_ready.png b/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_ready.png
new file mode 100644 (file)
index 0000000..f86790b
Binary files /dev/null and b/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_ready.png differ
diff --git a/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_running.png b/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_running.png
new file mode 100644 (file)
index 0000000..b3c9ef1
Binary files /dev/null and b/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_running.png differ
diff --git a/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_published.png b/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_published.png
new file mode 100644 (file)
index 0000000..19e1ae7
Binary files /dev/null and b/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_published.png differ
diff --git a/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_start.png b/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_start.png
new file mode 100644 (file)
index 0000000..45ba1a0
Binary files /dev/null and b/src/Tools/padder/doc/images/SMESH_spadder_plugindialog_start.png differ
diff --git a/src/Tools/padder/doc/images/SMESH_spadder_start.png b/src/Tools/padder/doc/images/SMESH_spadder_start.png
new file mode 100644 (file)
index 0000000..160da9d
Binary files /dev/null and b/src/Tools/padder/doc/images/SMESH_spadder_start.png differ
diff --git a/src/Tools/padder/doc/input/padder_userguide.doc b/src/Tools/padder/doc/input/padder_userguide.doc
new file mode 100644 (file)
index 0000000..d92f85e
--- /dev/null
@@ -0,0 +1,139 @@
+/*!
+
+\page padder_userguide_page Use the padder SMESH Plugin
+
+-# \ref S1_PADDER
+-# \ref S2_PADDER
+-# \ref S3_PADDER
+
+\section S1_PADDER The PADDER Algorithm
+
+PADDER is an algorithm that creates a set of particules called a "discrete mesh".
+The particules are characterized by a location in space and a weight that can be considered
+as the radius of a sphere whose center is the location of the particule.
+
+Discrete meshes are typically used to modelize civil components in rapid dynamic
+computation problems (seisms, chocs). These components consists in concrete parts
+embedding steal bares for reinforcement. These parts are input to the algorithm
+as standard finite elements meshes. The cells of theses meshes drive the location
+and sizing of particules.
+
+In the med representation, a discrete mesh is described as MED_BALL elements.
+A MED_BALL element is defined by a location and a radius.
+
+\section S2_PADDER The PADDER SALOME plugin
+
+The PADDER algoritm is integrated in the module SMESH as a SALOME
+plugin. This section illustrates how to use this plugin to create a
+discrete mesh.
+
+In this example, we suppose that two standard meshes (Finite Elements
+Meshes) have been created and publish in the study to modelize the
+concrete part (here with the name "concrete") and the steal bars part
+(here with the name "ferrail"):
+
+\image html SMESH_spadder_start.png
+
+The PADDER plugin can be invoked from the SMESH plugins menu, as
+illustrated on the figure below:
+
+\image html SMESH_spadder_menu.png
+
+When you clic on the "PADDER mesher" item, the graphical interface of
+the PADDER plugin appears:
+
+\image html SMESH_spadder_plugindialog_start.png
+
+This interface invites you to specify input data by pressing the button
+"Input". This command opens the Input dialog box to specify the list
+of meshes and the type of the selected meshes (to be choosen between
+"concrete" or "steelbar" using the combobox on the right side of the
+input line):
+
+\image html SMESH_spadder_inputdialog_start.png
+
+In the figure below, the mesh with name "concrete" has been selected
+in the study and added in the list of input file as a "concrete
+mesh". You have to input the mesh in the dialog using the rounded
+arrow icon, then specify a group name (the name of the group of
+MED_BALL created for this mesh in the resulting mesh), and finnaly
+clic on the "Add" icon:
+
+\image html SMESH_spadder_inputdialog_concrete.png
+
+Then, the mesh with name "ferrail" is selected and added to the list
+as a "steelbar mesh":
+
+\image html SMESH_spadder_inputdialog_steelbar.png
+
+The input dialog box can be validated toreturn to the main plugin
+interface. The "Compute" button is now enable, indicating that the
+problem is ready to be computed:
+
+\image html SMESH_spadder_plugindialog_compute_ready.png
+
+The command "Compute" start the job. The progression can be requested
+using the command "Refresh". In the figure below, the job is still
+running:
+
+\image html SMESH_spadder_plugindialog_compute_running.png
+
+Finally, the job is finished and the result is ready to be published
+in the SALOME study:
+
+\image html SMESH_spadder_plugindialog_compute_finished.png
+
+Clic on the command "Publish" to explicitly import the resulting med
+file in SMESH and published the resulting mesh in the SALOME study:
+
+\image html SMESH_spadder_plugindialog_published.png
+
+Note that this mesh contains one group for each of the input mesh. A
+group with the name specified in the input dialog has been defined for
+the set of MED_BALL created from the corresponding input mesh:
+
+\image html SMESH_spadder_end.png
+
+\section S3_PADDER Configuring the plugin
+
+The configuration of the plugin consists in specifying the location of
+the padder executable program for each of the SALOME resource (at
+least for the localhost resource). This specification is done in the
+file padder.cfg, located in the plugin installation folder
+(i.e. <SMESH_ROOT_DIR>/plugins):
+
+\code
+# This section specify the configurations to be used respectively for
+# the local execution and the remote execution. The value for 'local'
+# and 'remote' keys must be the name of a configuration section in
+# this file. The default key must specify a value between "local" or
+# "remote" to indicate the user preference. 
+[resources]
+local   = localhost
+remote  = nepal
+
+[preferences]
+defaultres = local
+
+# The following sections defines the available configurations.
+# The name of the section can be choosen arbitrary. But the value of
+# the resname key MUST be the name of a SALOME resource defined in the
+# catalog of resources (CatalogResources.xml).
+
+# For each section:
+# - resname : the name of the SALOME resource to be used in this configuration
+# - binpath : the path to the padder executable program on this resource
+# - envpath : the path to the environment file on this resource
+[localhost]
+resname = localhost
+binpath = /home/.programs/salome/workspace/V6_4_BR/SMESH/install/share/salome/resources/smesh/padderexe/padder.exe
+envpath = /home/.programs/salome/workspace/V6_4_BR/SMESH/install/share/salome/resources/smesh/padderexe/envPadder.sh
+
+[nepal]
+resname = nepal@nepal
+binpath = /usr/local/bin/padder.exe
+envpath = /usr/local/share/envPadder.sh
+\endcode
+
+*/
+
diff --git a/src/Tools/padder/meshjob/Makefile.am b/src/Tools/padder/meshjob/Makefile.am
new file mode 100644 (file)
index 0000000..26bf6ee
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS = idl impl
diff --git a/src/Tools/padder/meshjob/idl/MESHJOB.idl b/src/Tools/padder/meshjob/idl/MESHJOB.idl
new file mode 100644 (file)
index 0000000..dc42318
--- /dev/null
@@ -0,0 +1,126 @@
+//  Copyright (C) 2011  CEA/DEN, EDF R&D
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// Authors : Guillaume Boulant (EDF) - 31/01/2011
+
+#ifndef _MESHJOB_IDL_
+#define _MESHJOB_IDL_
+
+#include "SALOME_Exception.idl"
+#include "SALOME_Component.idl"
+
+//
+// This interface is used for mesh job submission from within the
+// SALOME plugin for PADDER.
+//
+module MESHJOB
+{
+
+  //
+  // Structure to transmit the parameters requiered for the job to run
+  // the executable program on the target resource. See configure
+  // service.
+  //
+  struct ConfigParameter {
+    string resname; // The name of the SALOME resource to be used
+    string binpath; // The path of the executable program on this resource
+    string envpath; // The path of the environment file on this resource
+  };
+
+  //
+  // This set of specification defines the data structure used to
+  // initialize a job on a specific resource, then supervise the job
+  // and finally retrieve the result data.
+  //
+
+  // This defines the set of temporary folders used by the jobmanager
+  // when executing a job (may depends on the job).
+  struct MeshJobPaths
+  {
+    string local_inputdir;
+    string local_resultdir;
+    string remote_workdir;
+  };
+
+  // This defines the possible types for a job parameter
+  enum FileType {MED_CONCRETE, MED_STEELBAR};
+
+  // This defines a single parameter for the job initialization (a med file)
+  struct MeshJobParameter
+  {
+    string file_name;
+    FileType file_type;
+    string group_name;
+  };
+  
+  // This defines a set of parameters for the job initialization
+  typedef sequence<MESHJOB::MeshJobParameter> MeshJobParameterList;
+
+  // This defines the result data of a job 
+  struct MeshJobResults
+  {
+    string results_dirname;
+    string outputmesh_filename;
+    string status;
+  };
+
+  // This defines the possible states of a job
+  enum MeshJobState {CREATED, IN_PROCESS, QUEUED, RUNNING, PAUSED, FINISHED, ERROR};
+
+  //
+  // This interface defines the computation services of the component
+  //
+
+  interface MeshJobManager: Engines::EngineComponent
+  {
+
+     /*! Add a resource configuration, identified by the string
+         configId and characterized by the parameters in
+         configParameter */
+    boolean configure(in string configId, in MESHJOB::ConfigParameter configParameter)
+      raises (SALOME::SALOME_Exception);
+
+    /*! Initialize a smesh computation job and return the job identifier */
+    long    initialize(in MESHJOB::MeshJobParameterList meshJobParameterList, in string configId)
+      raises (SALOME::SALOME_Exception);
+
+    /*! Submit the job execution and return true if submission is OK */
+    boolean start(in long jobId)
+      raises (SALOME::SALOME_Exception);
+
+    /*! Request the launch manager for the state of the specified job */
+    string getState(in long jobId)
+      raises (SALOME::SALOME_Exception);
+
+    /*! Request the launch manager for downloading the results */
+    MeshJobResults finalize(in long jobid)
+      raises (SALOME::SALOME_Exception);
+
+    /*! Clean all data associated to this job and remove the job from the launch manager */
+    boolean clean(in long jobId)
+      raises (SALOME::SALOME_Exception);
+
+    /*! Returns the set of temporary folders used by the job instance */
+    MeshJobPaths getPaths(in long jobId)
+      raises (SALOME::SALOME_Exception);
+
+  };
+
+};
+
+#endif // _MESHJOB_IDL_
diff --git a/src/Tools/padder/meshjob/idl/Makefile.am b/src/Tools/padder/meshjob/idl/Makefile.am
new file mode 100644 (file)
index 0000000..1f6ae9a
--- /dev/null
@@ -0,0 +1,86 @@
+# Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+# This Makefile is responsible of generating the client and server
+# implementation of IDL interfaces for both C++ and python usage.
+# The building process of the C++ files is in charge of each source
+# package and then is not manage here.
+#
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+BUILT_SOURCES = MESHJOBSK.cc
+IDL_FILES = MESHJOB.idl
+
+# For test purpose, we add a little component:
+BUILT_SOURCES += SPADDERPluginTestSK.cc
+IDL_FILES += SPADDERPluginTest.idl
+
+salomeidl_DATA = $(IDL_FILES) 
+
+lib_LTLIBRARIES = libSalomeIDLSPADDER.la
+libSalomeIDLSPADDER_la_SOURCES      =
+nodist_libSalomeIDLSPADDER_la_SOURCES = $(BUILT_SOURCES)
+nodist_salomeinclude_HEADERS= $(IDL_FILES:%idl=%hh)
+
+OMNIORB_CXXFLAGS=@OMNIORB_CXXFLAGS@ @OMNIORB_INCLUDES@
+OMNIORB_LIBS=@OMNIORB_LIBS@
+
+libSalomeIDLSPADDER_la_CXXFLAGS = \
+       $(KERNEL_CXXFLAGS) \
+       $(OMNIORB_CXXFLAGS) \
+       -I.
+
+libSalomeIDLSPADDER_la_LIBADD     = \
+       $(KERNEL_LDFLAGS) -lSalomeIDLKernel \
+       $(OMNIORB_LIBS)
+
+
+# These variables defines the building process of CORBA files
+IDLCXXFLAGS = \
+        -bcxx -I. \
+       @OMNIORB_IDLCXXFLAGS@ \
+        -I$(KERNEL_ROOT_DIR)/idl/salome
+
+IDLPYFLAGS  = \
+       -I. \
+       @OMNIORB_IDLPYFLAGS@ \
+        -I$(KERNEL_ROOT_DIR)/idl/salome
+
+##########################################################
+SUFFIXES = .idl .hh SK.cc
+
+%SK.cc %.hh : %.idl
+       $(OMNIORB_IDL) $(IDLCXXFLAGS) $<
+
+%_idl.py : %.idl
+       $(OMNIORB_IDL) $(IDLPYFLAGS)  $<
+
+CLEANFILES = *.hh *SK.cc *.py *.hxx *.cxx
+
+EXTRA_DIST += $(IDL_FILES)
+
+install-data-local: $(IDL_FILES)
+       $(INSTALL) -d  $(DESTDIR)$(salomepythondir)
+       ls $^ | while read file; do \
+       $(OMNIORB_IDL) $(IDLPYFLAGS) -C$(DESTDIR)$(salomepythondir) $$file ; \
+       done
+
+uninstall-local:
+       rm -rf $(DESTDIR)$(salomepythondir)/*
+
diff --git a/src/Tools/padder/meshjob/idl/SPADDERPluginTest.idl b/src/Tools/padder/meshjob/idl/SPADDERPluginTest.idl
new file mode 100644 (file)
index 0000000..6f04f01
--- /dev/null
@@ -0,0 +1,46 @@
+//  Copyright (C) 2011  CEA/DEN, EDF R&D
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// Authors : Guillaume Boulant (EDF) - 31/01/2011
+
+#ifndef _SPADDERPLUGINTEST_IDL_
+#define _SPADDERPLUGINTEST_IDL_
+
+#include "SALOME_Exception.idl"
+#include "SALOME_Component.idl"
+
+module SPADDERPluginTest {
+
+  //
+  // ========================================================================
+  // Thi module defines an interface provided for testing the usage
+  // of SPADDERPlugin components and underlying classes from within a
+  // C++ unit test running in a SALOME container (easy to run from a
+  // python client)..
+  // ========================================================================
+  //
+
+  interface SPADDERPluginTester: Engines::EngineComponent
+  {
+    void demo(in double a,in double b,out double c) raises (SALOME::SALOME_Exception);
+    boolean testkernel() raises (SALOME::SALOME_Exception);
+    boolean testsmesh(in long studyId) raises (SALOME::SALOME_Exception);
+  };
+};
+
+#endif // _SPADDERPLUGINTEST_IDL_
diff --git a/src/Tools/padder/meshjob/impl/Makefile.am b/src/Tools/padder/meshjob/impl/Makefile.am
new file mode 100644 (file)
index 0000000..a1cc701
--- /dev/null
@@ -0,0 +1,71 @@
+
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+AM_CFLAGS=$(SALOME_INCLUDES) -fexceptions
+
+lib_LTLIBRARIES= libMeshJobManagerEngine.la
+
+salomeinclude_HEADERS= \
+       MeshJobManager_i.hxx
+
+
+# =============================================================
+# Definition of MeshJobManagerEngine construction
+# =============================================================
+libMeshJobManagerEngine_la_SOURCES  = \
+       MeshJobManager_i.cxx
+
+LIBXML_LIBS=@LIBXML_LIBS@
+KERNEL_CXXFLAGS=@KERNEL_CXXFLAGS@
+
+libMeshJobManagerEngine_la_CXXFLAGS = \
+       -I$(top_builddir)/src/Tools/padder/meshjob/idl $(KERNEL_CXXFLAGS) \
+       @CORBA_CXXFLAGS@ @CORBA_INCLUDES@ @LIBXML_INCLUDES@
+
+libMeshJobManagerEngine_la_FFLAGS = -fexceptions
+libMeshJobManagerEngine_la_LDFLAGS   = \
+       $(top_builddir)/src/Tools/padder/meshjob/idl/libSalomeIDLSPADDER.la \
+       @KERNEL_LDFLAGS@ -lSalomeContainer -lSalomeKernelHelpers -lSalomeLifeCycleCORBA \
+       @LIBXML_LIBS@
+
+# =============================================================
+# Definition of the SPADDERPluginTester engine construction
+# =============================================================
+lib_LTLIBRARIES += libSPADDERPluginTesterEngine.la
+
+libSPADDERPluginTesterEngine_la_SOURCES  = \
+       SPADDERPluginTester_i.hxx \
+        SPADDERPluginTester_i.cxx
+
+nodist_libSPADDERPluginTesterEngine_la_SOURCES =
+
+libSPADDERPluginTesterEngine_la_CXXFLAGS = \
+       -I$(top_builddir)/src/Tools/padder/meshjob/idl $(KERNEL_CXXFLAGS) \
+       @CORBA_CXXFLAGS@ @CORBA_INCLUDES@ @LIBXML_INCLUDES@
+
+libSPADDERPluginTesterEngine_la_FFLAGS = -fexceptions
+libSPADDERPluginTesterEngine_la_LIBADD = \
+       $(top_builddir)/src/Tools/padder/meshjob/idl/libSalomeIDLSPADDER.la \
+       @KERNEL_LDFLAGS@ -lSalomeContainer -lSalomeKernelHelpers \
+       @LIBXML_LIBS@
+
+
+# For testing SMESH
+#
+libSPADDERPluginTesterEngine_la_CXXFLAGS += \
+       @GEOM_CXXFLAGS@ @MED_CXXFLAGS@ \
+       -I$(top_builddir)/idl \
+       -I$(top_srcdir)/src/SMESH \
+       -I$(top_srcdir)/src/SMESH_I \
+       -I$(top_srcdir)/src/SMESHDS \
+       -I$(top_srcdir)/src/SMDS \
+       -I$(top_srcdir)/src/SMESHUtils \
+       $(VTK_INCLUDES) $(CAS_CPPFLAGS) $(BOOST_CPPFLAGS)
+
+libSPADDERPluginTesterEngine_la_LIBADD += \
+       $(top_builddir)/src/SMESH/libSMESHimpl.la \
+       $(top_builddir)/src/SMESH_I/libSMESHEngine.la \
+       $(top_builddir)/src/SMESHDS/libSMESHDS.la \
+       $(top_builddir)/src/SMDS/libSMDS.la \
+       $(top_builddir)/src/SMESHUtils/libSMESHUtils.la
+
diff --git a/src/Tools/padder/meshjob/impl/MeshJobManager_i.cxx b/src/Tools/padder/meshjob/impl/MeshJobManager_i.cxx
new file mode 100644 (file)
index 0000000..beb25fd
--- /dev/null
@@ -0,0 +1,621 @@
+//  Copyright (C) 2011  EDF R&D
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// Authors : Guillaume Boulant (EDF) - 01/03/2011
+#ifdef WIN32
+#include <winsock2.h>
+#include <windows.h> 
+#else
+#include <sys/time.h>
+#endif
+
+#include "MeshJobManager_i.hxx"
+
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SALOME_Exception)
+
+
+#include "Basics_Utils.hxx"         // For standard logging
+#undef LOG
+#include "SALOME_KernelServices.hxx"   // For CORBA logging
+#undef LOG
+
+#define LOG STDLOG
+
+//
+// ====================================================================
+// General purpose helper functions (to put elsewhere at least)
+// ====================================================================
+//
+
+/*!
+ * This function must be used to associate a datetime tag to a job
+ */
+
+#ifndef WIN32
+static long timetag() {
+  timeval tv;
+  gettimeofday(&tv,0);
+  long tag = tv.tv_usec + tv.tv_sec*1000000;
+  return tag;
+}
+#endif
+
+/*!
+ * This function returns true if the string text starts with the string
+ * token.
+ */
+static bool myStartsWith(const std::string& text,const std::string& token){     
+  if(text.length() < token.length())
+    return false;
+  return (text.compare(0, token.length(), token) == 0);
+}
+
+//
+// ====================================================================
+// Constructor/Destructor
+// ====================================================================
+//
+MeshJobManager_i::MeshJobManager_i(CORBA::ORB_ptr orb,
+                                   PortableServer::POA_ptr poa,
+                                   PortableServer::ObjectId * contId,
+                                   const char *instanceName,
+                                   const char *interfaceName)
+  : Engines_Component_i(orb, poa, contId, instanceName, interfaceName)
+{
+  LOG("Activating MESHJOB::MeshJobManager object");
+  _thisObj = this ;
+  _id = _poa->activate_object(_thisObj);
+
+  _salomeLauncher   = KERNEL::getSalomeLauncher();
+  if(CORBA::is_nil(_salomeLauncher)){
+    LOG("The SALOME launcher can't be reached ==> STOP");
+    throw KERNEL::createSalomeException("SALOME launcher can't be reached");
+  }
+
+  _resourcesManager = KERNEL::getResourcesManager();
+  if(CORBA::is_nil(_resourcesManager)){
+    LOG("The SALOME resource manager can't be reached ==> STOP");
+    throw KERNEL::createSalomeException("The SALOME resource manager can't be reached");
+  }
+}
+
+MeshJobManager_i::~MeshJobManager_i() {
+  LOG("MeshJobManager_i::~MeshJobManager_i()");
+}
+
+//
+// ====================================================================
+// Helper functions to deals with the local and remote file systems
+// ====================================================================
+//
+#include <fstream>     // to get the file streams
+#ifdef WNT             
+#include <stdlib.h>    // to get _splitpath
+#include <direct.h>    // to get _mkdir
+#else
+#include <unistd.h>    // to get basename
+#include <sys/stat.h>  // to get mkdir
+#include <sys/types.h> // to get mkdir options
+#endif
+
+#include <stdlib.h>    // to get system and getenv
+
+static std::string OUTPUTFILE("output.med");
+static std::string DATAFILE("data.txt");
+static std::string SCRIPTFILE("padder.sh");
+static std::string SEPARATOR(" ");
+
+static std::string USER(getenv("USER"));
+static std::string LOCAL_INPUTDIR("/tmp/spadder.local.inputdir."+USER);
+static std::string LOCAL_RESULTDIR("/tmp/spadder.local.resultdir."+USER);
+static std::string REMOTE_WORKDIR("/tmp/spadder.remote.workdir."+USER);
+
+/*!
+ * This function creates the padder text input file containing the
+ * input data (list of filenames and groupnames) and returns the path
+ * of the created file. This function is the one that knows the format
+ * of the padder input file. If the input file format changes, then
+ * this function (and only this one) should be updated.
+ */
+const char * MeshJobManager_i::_writeDataFile(std::vector<MESHJOB::MeshJobParameter> listConcreteMesh,
+                                              std::vector<MESHJOB::MeshJobParameter> listSteelBarMesh) {
+#ifdef WIN32
+  _mkdir(LOCAL_INPUTDIR.c_str());
+#else
+  mkdir(LOCAL_INPUTDIR.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
+#endif
+
+  // Make it static so that it's allocated once (constant name)
+  static std::string * dataFilename = new std::string(LOCAL_INPUTDIR+"/"+DATAFILE);
+  std::ofstream dataFile(dataFilename->c_str());
+  
+  // We first specify the concrete mesh data (filename and groupname)
+  std::string line;
+#ifdef WIN32
+  char fname[ _MAX_FNAME ];
+  _splitpath( listConcreteMesh[0].file_name, NULL, NULL, fname, NULL );
+  char* bname = &fname[0];
+#else
+  char* bname = basename(listConcreteMesh[0].file_name);
+#endif
+  line = std::string(bname) + " " + std::string(listConcreteMesh[0].group_name);
+  dataFile << line.c_str() << std::endl;
+  // Note that we use here the basename because the files are supposed
+  // to be copied in the REMOTE_WORKDIR for execution.
+  
+  // The, we can specify the steelbar mesh data, starting by the
+  // number of meshes
+  int nbSteelBarMesh=listSteelBarMesh.size();
+  line = std::string("nbSteelbarMesh") + SEPARATOR + ToString(nbSteelBarMesh);
+  dataFile << line.c_str() << std::endl;
+  for (int i=0; i<nbSteelBarMesh; i++) {
+#ifdef WIN32
+        char fname[ _MAX_FNAME ];
+        _splitpath( listSteelBarMesh[i].file_name, NULL, NULL, fname, NULL );
+        char* bname = &fname[0];
+#else
+        char* bname = basename(listSteelBarMesh[i].file_name);
+#endif
+    line = std::string(bname) + " " + std::string(listSteelBarMesh[i].group_name);
+    dataFile << line.c_str() << std::endl;
+  }
+  
+  // Finally, we conclude with the name of the output file
+  line = OUTPUTFILE;
+  dataFile << line.c_str() << std::endl;
+  dataFile.close();
+  return dataFilename->c_str();  
+}
+
+/*!
+ * This function creates a shell script that runs padder whith the
+ * specified data file, and returns the path of the created script
+ * file. The config id is used to retrieve the path to the binary file
+ * and other required files.
+ */
+const char* MeshJobManager_i::_writeScriptFile(const char * dataFileName, const char * configId) {
+#ifdef WIN32
+  _mkdir(LOCAL_INPUTDIR.c_str());
+#else
+  mkdir(LOCAL_INPUTDIR.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
+#endif
+
+  // Make it static so that it's allocated once (constant name)
+  static std::string * scriptFilename = new std::string(LOCAL_INPUTDIR+"/"+SCRIPTFILE);
+
+  char * binpath = _configMap[configId].binpath;
+  char * envpath = _configMap[configId].envpath;
+
+#ifdef WIN32
+        char fname[ _MAX_FNAME ];
+        _splitpath( dataFileName, NULL, NULL, fname, NULL );
+        const char* bname = &fname[0];
+#else
+        const char* bname = basename(dataFileName);
+#endif
+
+
+  std::ofstream script(scriptFilename->c_str());
+  script << "#!/bin/sh"                                   << std::endl;
+  script << "here=$(dirname $0)"                          << std::endl;
+  script << ". " << envpath                               << std::endl;
+  script << binpath << " $here/" << bname                 << std::endl;
+  // Note that we use the basename of the datafile because all data
+  // files are supposed to have been copied in the REMOTE_WORKDIR.
+  script.close();
+  return scriptFilename->c_str();
+}
+
+//
+// ====================================================================
+// Functions to initialize and supervise the mesh computation job
+// ====================================================================
+//
+bool MeshJobManager_i::configure(const char *configId,
+                                 const MESHJOB::ConfigParameter & configParameter)
+{
+  beginService("MeshJobManager_i::configure");
+  
+  _configMap[configId] = configParameter;
+
+  LOG("Adding configuration for " << configId);
+  LOG("- binpath = " << _configMap[configId].binpath);
+  LOG("- envpath = " << _configMap[configId].envpath);
+
+  endService("MeshJobManager_i::configure");
+  return true;
+}
+
+long MeshJobManager_i::JOBID_UNDEFINED = -1;
+
+/*! Initialize a smesh computation job and return the job identifier */
+CORBA::Long MeshJobManager_i::initialize(const MESHJOB::MeshJobParameterList & meshJobParameterList,
+                                         const char * configId)
+{
+  beginService("MeshJobManager_i::initialize");
+
+  //
+  // We first analyse the CORBA sequence to store data in C++ vectors
+  //
+  std::vector<MESHJOB::MeshJobParameter> listConcreteMesh;
+  std::vector<MESHJOB::MeshJobParameter> listSteelBarMesh;
+  for(CORBA::ULong i=0; i<meshJobParameterList.length(); i++) {
+    MESHJOB::MeshJobParameter currentMesh = meshJobParameterList[i];
+    switch ( currentMesh.file_type ) {
+    case MESHJOB::MED_CONCRETE:
+      listConcreteMesh.push_back(currentMesh);
+      break;
+    case MESHJOB::MED_STEELBAR:
+      listSteelBarMesh.push_back(currentMesh);
+      break;
+    default:
+      LOG("The type of the file is not recognized");
+      return JOBID_UNDEFINED;
+    }
+  }
+  
+  if ( listConcreteMesh.size() != 1 ) {
+    // Not consistent with the specification
+    LOG("You specify more than one concrete mesh");
+    return JOBID_UNDEFINED;
+  }
+  
+  LOG("Nb. concrete mesh = " << listConcreteMesh.size());
+  LOG("Nb. steelbar mesh = " << listSteelBarMesh.size());
+
+  // We initiate here a datetime to tag the files and folder
+  // associated to this job.
+#ifdef WIN32
+  DWORD jobDatetimeTag = timeGetTime();
+#else
+  long jobDatetimeTag = timetag();
+#endif
+  // And a MESHJOB::MeshJobPaths structure to hold the directories
+  // where to find data
+  MESHJOB::MeshJobPaths * jobPaths = new MESHJOB::MeshJobPaths();
+  jobPaths->local_inputdir  = LOCAL_INPUTDIR.c_str();
+  jobPaths->local_resultdir = (LOCAL_RESULTDIR + "." + ToString(jobDatetimeTag)).c_str();
+  jobPaths->remote_workdir  = (REMOTE_WORKDIR + "." + ToString(jobDatetimeTag)).c_str();  
+
+  //
+  // Then, we have to create the padder input data file. This input
+  // data is a text file containing the list of file names and group
+  // names.
+  //
+  const char * dataFilename = this->_writeDataFile(listConcreteMesh, listSteelBarMesh);
+  LOG("dataFilename = " << dataFilename);
+  const char * scriptFilename = this->_writeScriptFile(dataFilename, configId);
+  LOG("scriptFilename = " << scriptFilename);
+
+  //
+  // Then, the following instructions consists in preparing the job
+  // parameters to request the SALOME launcher for creating a new
+  // job.
+  //
+  Engines::JobParameters_var jobParameters = new Engines::JobParameters;
+  jobParameters->job_type = CORBA::string_dup("command");
+  // CAUTION: the job_file must be a single filename specifying a
+  // self-consistent script to be executed without any argument on the
+  // remote host.
+  jobParameters->job_file = CORBA::string_dup(scriptFilename);
+
+  //
+  // Specification of the working spaces:
+  //
+  // - local_directory: can be used to specify where to find the input
+  //   files on the local resource. It's optionnal if you specify the
+  //   absolute path name of input files.
+  //
+  // - result_directory: must be used to specify where to download the
+  //   output files on the local resources
+  //
+  // - work_directory: must be used to specify the remote directory
+  //   where to put all the stuff to run the job. Note that the job
+  //   will be executed from within this directory, i.e. a change
+  //   directory toward this working directory is done by the batch
+  //   system before running the specified job script.
+  //
+  jobParameters->local_directory  = CORBA::string_dup("");
+  jobParameters->result_directory = CORBA::string_dup(jobPaths->local_resultdir);
+  jobParameters->work_directory   = CORBA::string_dup(jobPaths->remote_workdir);
+
+  // We specify the input files that are required to execute the
+  // job_file. If basenames are specified, then the files are supposed
+  // to be located in local_directory.
+  int nbFiles = listSteelBarMesh.size()+2;
+  // The number of input file is: 
+  //   (nb. of steelbar meshfile)
+  // + (1 concrete meshfile)
+  // + (1 padder input file)
+  // = nb steelbar meshfile + 2
+  jobParameters->in_files.length(nbFiles);
+  jobParameters->in_files[0] = CORBA::string_dup(listConcreteMesh[0].file_name);
+  for (int i=0; i<listSteelBarMesh.size(); i++) {
+    jobParameters->in_files[1+i] = CORBA::string_dup(listSteelBarMesh[i].file_name);
+  }
+  jobParameters->in_files[1+listSteelBarMesh.size()] = CORBA::string_dup(dataFilename);
+  // Note that all these input files will be copied in the
+  // REMOTE_WORKDIR on the remote host
+  
+  // Then, we have to specify the existance of an output
+  // filenames. The path is supposed to be a path on the remote
+  // resource, i.e. where the job is executed.
+  jobParameters->out_files.length(1);
+  std::string outputfile_name = std::string(jobPaths->remote_workdir)+"/"+OUTPUTFILE;
+  jobParameters->out_files[0] = CORBA::string_dup(outputfile_name.c_str());
+
+  // CAUTION: the maximum duration has to be set with a format like "hh:mm"
+  jobParameters->maximum_duration = CORBA::string_dup("01:00");
+  jobParameters->queue = CORBA::string_dup("");
+
+  // Setting resource and additionnal properties (if needed)
+  // The resource parameters can be initiated from scratch, for
+  // example by specifying the values in hard coding:
+  // >>>
+  //jobParameters->resource_required.name = CORBA::string_dup("localhost");
+  //jobParameters->resource_required.hostname = CORBA::string_dup("localhost");
+  //jobParameters->resource_required.mem_mb = 1024 * 10;
+  //jobParameters->resource_required.nb_proc = 1;
+  // <<<
+  // But it's better to initiate these parameters from a resource
+  // definition known by the resource manager. This ensures that the
+  // resource will be available:
+  //const char * resourceName = "localhost";
+  //const char * resourceName = "boulant@claui2p1";
+  //const char * resourceName = "nepal@nepal";
+  const char * resourceName = _configMap[configId].resname;
+  Engines::ResourceDefinition * resourceDefinition = _resourcesManager->GetResourceDefinition(resourceName);
+  // CAUTION: This resource should have been defined in the
+  // CatalogResource.xml associated to the SALOME application.
+  //
+  // Then, the values can be used to initiate the resource parameters
+  // of the job:
+  jobParameters->resource_required.name     = CORBA::string_dup(resourceDefinition->name.in());
+  // CAUTION: the additionnal two following parameters MUST be
+  // specified explicitly, because they are not provided by the
+  // resource definition:
+  jobParameters->resource_required.mem_mb   = resourceDefinition->mem_mb;
+  jobParameters->resource_required.nb_proc  = resourceDefinition->nb_proc_per_node;
+  // CAUTION: the parameter mem_mb specifies the maximum memory value
+  // that could be allocated for executing the job. This takes into
+  // account not only the data that could be loaded by the batch
+  // process but also the linked dynamic library.
+  //
+  // A possible problem, for exemple in the case where you use the ssh
+  // emulation of a batch system, is to get an error message as below
+  // when libBatch try to run the ssh command:
+  //
+  // ## /usr/bin/ssh: error while loading shared libraries: libcrypto.so.0.9.8: failed
+  // ## to map segment from shared object: Cannot allocate memory
+  //
+  // In this exemple, the mem_mb was set to 1MB, value that is not
+  // sufficient to load the dynamic libraries linked to the ssh
+  // executable (libcrypto.so in the error message).
+  //
+  // So, even in the case of a simple test shell script, you should
+  // set this value at least to a standard threshold as 500MB
+
+  int jobId = JOBID_UNDEFINED;
+  try {
+    jobId = _salomeLauncher->createJob(jobParameters);
+    // We register the datetime tag of this job
+    _jobDateTimeMap[jobId]=jobDatetimeTag;
+    _jobPathsMap[jobId] = jobPaths;
+  }
+  catch (const SALOME::SALOME_Exception & ex) {
+    LOG("SALOME Exception in createJob !" <<ex.details.text.in());
+    //LOG(ex.details.text.in());
+    return JOBID_UNDEFINED;
+  }
+  catch (const CORBA::SystemException& ex) {
+    LOG("Receive SALOME System Exception: "<<ex);
+    LOG("Check SALOME servers...");
+    return JOBID_UNDEFINED;
+  }
+  
+  endService("MeshJobManager_i::initialize");
+  return jobId;
+}
+
+/*! Submit the job execution and return true if submission is OK */
+bool MeshJobManager_i::start(CORBA::Long jobId) {
+  beginService("MeshJobManager_i::start");
+
+  try {
+    _salomeLauncher->launchJob(jobId);
+  }
+  catch (const SALOME::SALOME_Exception & ex) {
+    LOG("SALOME Exception in createJob !" <<ex.details.text.in());
+    //LOG(ex.details.text.in());
+    return false;
+  }
+  catch (const CORBA::SystemException& ex) {
+    LOG("Receive SALOME System Exception: "<<ex);
+    LOG("Check SALOME servers...");
+    return false;
+  }
+
+  endService("MeshJobManager_i::initialize");
+  return true;
+}
+
+/*! Request the launch manager for the state of the specified job */
+char* MeshJobManager_i::getState(CORBA::Long jobId) {
+  beginService("MeshJobManager_i::getState");
+
+  std::string state;
+  try
+  {
+    state = _salomeLauncher->getJobState(jobId);
+  }
+  catch (const SALOME::SALOME_Exception & ex)
+  {
+    LOG("SALOME Exception in getJobState !");
+    state = ex.details.text;
+  }
+  catch (const CORBA::SystemException& ex)
+  {
+    LOG("Receive SALOME System Exception: " << ex);
+    state="SALOME System Exception - see logs";
+  }
+  LOG("jobId="<<ToString(jobId)<<" state="<<state);
+  endService("MeshJobManager_i::getState");
+  return CORBA::string_dup(state.c_str());
+}
+
+MESHJOB::MeshJobPaths * MeshJobManager_i::getPaths(CORBA::Long jobId) {
+
+  MESHJOB::MeshJobPaths * jobPaths = _jobPathsMap[jobId];
+  if ( jobPaths == NULL ) {
+    LOG("You request the working paths for an undefined job (jobId="<<ToString(jobId)<<")");
+    return NULL; // Maybe raise an exception?
+  }
+  return jobPaths;
+}
+
+
+MESHJOB::MeshJobResults * MeshJobManager_i::finalize(CORBA::Long jobId) {
+  beginService("MeshJobManager_i::getResults");
+  MESHJOB::MeshJobResults * result = new MESHJOB::MeshJobResults();
+
+  MESHJOB::MeshJobPaths * jobPaths = this->getPaths(jobId);
+  std::string local_resultdir(jobPaths->local_resultdir);
+  result->results_dirname = local_resultdir.c_str();  
+  try
+  {
+    _salomeLauncher->getJobResults(jobId, local_resultdir.c_str());
+    // __BUG__: to prevent from a bug of the MED driver (SALOME
+    // 5.1.5), we change the basename of the output file to force the
+    // complete reloading of data by the med driver.
+    long jobDatetimeTag = _jobDateTimeMap[jobId];
+    std::string outputFileName = "output"+ToString(jobDatetimeTag)+".med";
+    rename((local_resultdir+"/"+OUTPUTFILE).c_str(), (local_resultdir+"/"+outputFileName).c_str());
+
+    result->outputmesh_filename = outputFileName.c_str();
+    result->status = "OK";
+ }
+  catch (const SALOME::SALOME_Exception & ex)
+  {
+    LOG("SALOME Exception in getResults !");
+    result->status = "SALOME Exception in getResults !";
+  }
+  catch (const CORBA::SystemException& ex)
+  {
+    LOG("Receive CORBA System Exception: " << ex);
+    result->status = "Receive CORBA System Exception: see log";
+  }
+  endService("MeshJobManager_i::getResults");
+  return result;
+}
+
+
+/*! Clean all data associated to this job and remove the job from the launch manager */
+bool MeshJobManager_i::clean(CORBA::Long jobId) {
+  beginService("MeshJobManager_i::clean");
+  
+  // __GBO__ WORK IN PROGRESS: we just clean the temporary local
+  // directories. The remote working directories are tag with the
+  // execution datetime and the we prevent the task from conflict
+  // with files of another task.
+  MESHJOB::MeshJobPaths * jobPaths = this->getPaths(jobId);
+  if ( jobPaths == NULL ) return false;
+
+  // WARN: !!!!!
+  // For safety reason (and prevent from bug that could erase the
+  // filesystem), we cancel the operation in the case where the
+  // directories to delete are not in the /tmp folder.
+  std::string shell_command("rm -rf ");
+  std::string inputdir(jobPaths->local_inputdir);
+  std::string resultdir(jobPaths->local_resultdir);
+  if ( !myStartsWith(inputdir,"/tmp/") )  {
+    LOG("WRN: The directory "<<inputdir<<" is not in /tmp. NO DELETE is done");
+  } else {
+    shell_command+=inputdir+" ";
+  }
+  if ( !myStartsWith(resultdir,"/tmp/"))  {
+    LOG("WRN: The directory "<<resultdir<<" is not in /tmp. NO DELETE is done");
+  } else {
+    shell_command+=resultdir;
+  }
+
+  LOG("DBG: clean shell command = "<<shell_command);
+
+  bool cleanOk = false;
+  int error = system(shell_command.c_str());
+  if (error == 0) cleanOk = true;
+
+  endService("MeshJobManager_i::clean");
+  return cleanOk;
+}
+
+
+std::vector<std::string> * MeshJobManager_i::_getResourceNames() {
+
+  //
+  // These part is just to control the available resources
+  //
+  Engines::ResourceParameters params;
+  KERNEL::getLifeCycleCORBA()->preSet(params);
+
+  Engines::ResourceList * resourceList = _resourcesManager->GetFittingResources(params);
+  Engines::ResourceDefinition * resourceDefinition = NULL;
+  LOG("### resource list:");
+  std::vector<std::string>* resourceNames = new std::vector<std::string>();
+  if (resourceList) {
+    for (int i = 0; i < resourceList->length(); i++) {
+      const char* aResourceName = (*resourceList)[i];
+      resourceNames->push_back(std::string(aResourceName));
+      LOG("resource["<<i<<"] = "<<aResourceName);
+      resourceDefinition = _resourcesManager->GetResourceDefinition(aResourceName);
+      LOG("protocol["<<i<<"] = "<<resourceDefinition->protocol);
+    }
+  }
+
+  // Note: a ResourceDefinition is used to create a batch configuration
+  // in the Launcher. This operation is done at Launcher startup from
+  // the configuration file CatalogResources.xml provided by the
+  // SALOME application.
+  // In the code instructions, you just have to choose a resource
+  // configuration by its name and then define the ResourceParameters
+  // that specify additionnal properties for a specific job submission
+  // (use the attribute resource_required of the JobParameters).
+
+  return resourceNames;
+}
+
+
+//
+// ==========================================================================
+// Factory services
+// ==========================================================================
+//
+extern "C"
+{
+  PortableServer::ObjectId * MeshJobManagerEngine_factory( CORBA::ORB_ptr orb,
+                                                           PortableServer::POA_ptr poa,
+                                                           PortableServer::ObjectId * contId,
+                                                           const char *instanceName,
+                                                           const char *interfaceName)
+  {
+    LOG("PortableServer::ObjectId * MeshJobManagerEngine_factory()");
+    MeshJobManager_i * myEngine = new MeshJobManager_i(orb, poa, contId, instanceName, interfaceName);
+    return myEngine->getId() ;
+  }
+}
diff --git a/src/Tools/padder/meshjob/impl/MeshJobManager_i.hxx b/src/Tools/padder/meshjob/impl/MeshJobManager_i.hxx
new file mode 100644 (file)
index 0000000..a452066
--- /dev/null
@@ -0,0 +1,81 @@
+//  Copyright (C) 2011  EDF R&D
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// Authors : Guillaume Boulant (EDF) - 01/03/2011
+
+#ifndef _MESHJOBMANAGER_HXX_
+#define _MESHJOBMANAGER_HXX_
+
+// include the stubs generating from MESHJOB.idl
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(MESHJOB)
+#include CORBA_SERVER_HEADER(SALOME_Component)
+#include "SALOME_Component_i.hxx"
+
+#include "SALOME_Launcher.hxx"
+#include <vector>
+#include <string>
+#include <map>
+
+class MeshJobManager_i: public virtual POA_MESHJOB::MeshJobManager,
+                        public Engines_Component_i
+{
+public:
+  MeshJobManager_i(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa,
+                   PortableServer::ObjectId * contId,
+                   const char *instanceName, const char *interfaceName);
+  ~MeshJobManager_i();
+
+  bool           configure  (const char *configId,
+                            const MESHJOB::ConfigParameter & configParameter);
+  CORBA::Long    initialize (const MESHJOB::MeshJobParameterList & meshJobParameterList,
+                            const char *configId);
+  bool           start      (CORBA::Long jobId);
+  char*          getState   (CORBA::Long jobId);
+  MESHJOB::MeshJobResults * finalize(CORBA::Long jobId);
+  MESHJOB::MeshJobPaths *   getPaths(CORBA::Long jobId);
+  bool           clean      (CORBA::Long jobId);
+
+  static long JOBID_UNDEFINED;
+
+private:
+  Engines::SalomeLauncher_var   _salomeLauncher;
+  Engines::ResourcesManager_var _resourcesManager;
+  
+  // This maps the config identifier to the config parameters. A
+  // config is a resource with additionnal data specifying the
+  // location of the binary program to be executed by the task
+  std::map<std::string, MESHJOB::ConfigParameter> _configMap;
+
+  // This maps a job identifier to its associated datetime tag. When
+  // a job is created during the initialize function, a datetime tag
+  // is associated to this job and can be used to characterized files
+  // and directories associated to this job.
+  std::map<long, long> _jobDateTimeMap;
+  std::map<long, MESHJOB::MeshJobPaths*> _jobPathsMap;
+
+  const char* _writeDataFile   (std::vector<MESHJOB::MeshJobParameter> listConcreteMesh,
+                                std::vector<MESHJOB::MeshJobParameter> listSteelBarMesh);
+  const char* _writeScriptFile (const char * dataFileName, const char * configId);
+
+  std::vector<std::string> * _getResourceNames();
+
+};
+
+#endif
+
diff --git a/src/Tools/padder/meshjob/impl/SPADDERPluginTester_i.cxx b/src/Tools/padder/meshjob/impl/SPADDERPluginTester_i.cxx
new file mode 100644 (file)
index 0000000..3bfa98b
--- /dev/null
@@ -0,0 +1,155 @@
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+
+#include "SPADDERPluginTester_i.hxx"
+
+#include <SALOME_NamingService.hxx>
+#include <Utils_SALOME_Exception.hxx>
+
+// For standard logging
+#include "Basics_Utils.hxx"
+
+//
+// ==========================================================================
+// Implementation of the SPADDER component interface
+// ==========================================================================
+//
+using namespace std;
+
+/*!
+ * Constructor for component "SPADDER" instance
+ */
+SPADDERPluginTester_i::SPADDERPluginTester_i(CORBA::ORB_ptr orb,
+                                            PortableServer::POA_ptr poa,
+                                            PortableServer::ObjectId * contId,
+                                            const char *instanceName,
+                                            const char *interfaceName)
+  : Engines_Component_i(orb, poa, contId, instanceName, interfaceName)
+{
+  LOG("Activating SPADDERPluginTester_i::SPADDERPluginTester object");
+  _thisObj = this ;
+  _id = _poa->activate_object(_thisObj);
+}
+
+//! Destructor for component "SPADDER" instance
+SPADDERPluginTester_i::~SPADDERPluginTester_i()
+{
+  std::cerr << "SPADDERPluginTester destruction" << std::endl;
+}
+
+/*!
+ * This test is just to check the component SPADDER.
+ */
+void SPADDERPluginTester_i::demo(CORBA::Double a,CORBA::Double b,CORBA::Double& c)
+{
+  beginService("SPADDERPluginTester_i::demo");
+  try {
+    //BODY
+    
+    std::cerr << "a: " << a << std::endl;
+    std::cerr << "b: " << b << std::endl;
+    c=a+b;
+    std::cerr << "c: " << c << std::endl;
+    
+  }
+  catch ( const SALOME_Exception & ex) {
+    SALOME::ExceptionStruct es;
+    es.text=CORBA::string_dup(ex.what());
+    es.type=SALOME::INTERNAL_ERROR;
+    throw SALOME::SALOME_Exception(es);
+  }
+  catch ( const SALOME::SALOME_Exception & ex) {
+    throw;
+  }
+  catch (...) {
+    std::cerr << "unknown exception" << std::endl;
+    SALOME::ExceptionStruct es;
+    es.text=CORBA::string_dup(" unknown exception");
+    es.type=SALOME::INTERNAL_ERROR;
+    throw SALOME::SALOME_Exception(es);
+  }
+  endService("SPADDERPluginTester_i::demo");
+}
+
+#ifdef LOG
+#undef LOG
+#endif
+
+#include <SALOME_KernelServices.hxx>
+#include "SALOME_Launcher.hxx"
+bool SPADDERPluginTester_i::testkernel()
+{
+  beginService("SPADDERPluginTester_i::testplugin");
+
+  Engines::SalomeLauncher_ptr salomeLauncher = KERNEL::getSalomeLauncher();
+
+  endService("SPADDERPluginTester_i::testplugin");
+  return true;
+}
+
+
+#include <SMESH_Gen_i.hxx>
+#include <SMESH_Gen.hxx>
+#include <SALOMEconfig.h>
+#include CORBA_CLIENT_HEADER(SALOMEDS)
+
+#include <utilities.h>
+
+/*!
+ * This test checks the constructor of the basic classes of the SMESH
+ * plugin for PADDER.
+ */
+bool SPADDERPluginTester_i::testsmesh(CORBA::Long studyId)
+{
+  beginService("SPADDERPluginTester_i::testsmesh");
+
+  // Resolve the SMESH engine and the SALOME study
+  // _WARN_ The SMESH engine should have been loaded first
+  SMESH_Gen_i* smeshGen_i = SMESH_Gen_i::GetSMESHGen();
+  CORBA::Object_var anObject = smeshGen_i->GetNS()->Resolve("/myStudyManager");
+  SALOMEDS::StudyManager_var aStudyMgr = SALOMEDS::StudyManager::_narrow(anObject);
+  SALOMEDS::Study_var myStudy = aStudyMgr->GetStudyByID(studyId);
+
+  //
+  // _MEM_ CAUTION: SMESH_Gen define a data structure for local usage
+  // while SMESH_Gen_i is the implementation of the SMESH_Gen IDL
+  // interface.
+  //
+
+  endService("SPADDERPluginTester_i::testsmesh");
+  return true;
+}
+
+//
+// ==========================================================================
+// Factory services
+// ==========================================================================
+//
+extern "C"
+{
+  PortableServer::ObjectId * SPADDERPluginTesterEngine_factory( CORBA::ORB_ptr orb,
+                                                               PortableServer::POA_ptr poa,
+                                                               PortableServer::ObjectId * contId,
+                                                               const char *instanceName,
+                                                               const char *interfaceName)
+  {
+    MESSAGE("PortableServer::ObjectId * SPADDERPluginTesterEngine_factory()");
+    SPADDERPluginTester_i * myEngine = new SPADDERPluginTester_i(orb, poa, contId, instanceName, interfaceName);
+    return myEngine->getId() ;
+  }
+}
diff --git a/src/Tools/padder/meshjob/impl/SPADDERPluginTester_i.hxx b/src/Tools/padder/meshjob/impl/SPADDERPluginTester_i.hxx
new file mode 100644 (file)
index 0000000..85a02a9
--- /dev/null
@@ -0,0 +1,47 @@
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// Authors : Guillaume Boulant (EDF) - 01/02/2011
+
+#ifndef _SPADDER_PLUGINTESTER_HXX_
+#define _SPADDER_PLUGINTESTER_HXX_
+
+// include the stubs generating from SPADDERPluginTest.idl
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SPADDERPluginTest)
+#include <SALOME_Component.hh>
+#include "SALOME_Component_i.hxx"
+
+class SPADDERPluginTester_i:
+  public virtual POA_SPADDERPluginTest::SPADDERPluginTester,
+  public Engines_Component_i
+{
+public:
+  SPADDERPluginTester_i(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa,
+                       PortableServer::ObjectId * contId,
+                       const char *instanceName, const char *interfaceName);
+  virtual ~SPADDERPluginTester_i();
+  
+  void demo(CORBA::Double a,CORBA::Double b,CORBA::Double& c);
+  bool testkernel();
+  bool testsmesh(CORBA::Long studyId);
+
+};
+
+#endif
+
diff --git a/src/Tools/padder/meshjob/impl/testhelper.hxx b/src/Tools/padder/meshjob/impl/testhelper.hxx
new file mode 100644 (file)
index 0000000..76e2332
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef __TESTHELPER_HXX__
+#define __TESTHELPER_HXX__
+
+// >>>
+// WARN: this file is DEPRECATED and/or should be used for test
+// purpose only. The PADDER configuration is now read in a
+// configuration file (padder.cfg).
+// <<<
+
+#include <stdlib.h> // Standard C include (for getenv)
+#include <unistd.h>
+#include <string>
+
+/*!
+ * This function returns the module SMESH installation root directory
+ * as a string.
+ */
+static std::string SMESH_ROOT_DIR() {
+  static std::string * smesh_root_dir;
+  if ( smesh_root_dir == NULL ) {
+    char * SMESH_ROOT_DIR = getenv("SMESH_ROOT_DIR");
+    if ( SMESH_ROOT_DIR == NULL ) {
+      smesh_root_dir = new std::string("<path_undefined>");
+    }
+    else {
+      smesh_root_dir = new std::string(SMESH_ROOT_DIR);
+    }
+  }
+  return *smesh_root_dir;
+}
+
+/*! Relative path of the directory containing data and exe for tests */
+static std::string PADDEREXE_RPATH("/share/salome/resources/smesh/padderexe");
+/*! Absolute path of the directory containing data and exe for tests */
+static std::string PADDEREXE_APATH(SMESH_ROOT_DIR()+PADDEREXE_RPATH);
+/*! Absolute path of the exe shell script for tests */
+static std::string PADDEREXE_SCRIPT_FILENAME(PADDEREXE_APATH+"/padder.sh");
+
+
+static int testssh_using_system() {
+  const char * cmd = "/usr/bin/ssh claui2p1 -l boulant 'cd /tmp && ./runCommand_padder_Mon_Feb_28_14_28_36_2011.sh'";
+  int result = system(cmd);
+  return result;
+}
+
+#endif // __TESTHELPER_HXX__
diff --git a/src/Tools/padder/resources/Makefile.am b/src/Tools/padder/resources/Makefile.am
new file mode 100644 (file)
index 0000000..b17082e
--- /dev/null
@@ -0,0 +1,7 @@
+
+SUBDIRS = appligen padderexe
+
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+mysalomeresdir=$(salomeresdir)
+dist_mysalomeres_DATA = SPADDERCatalog.xml
diff --git a/src/Tools/padder/resources/SPADDERCatalog.xml b/src/Tools/padder/resources/SPADDERCatalog.xml
new file mode 100644 (file)
index 0000000..4e4cafe
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version='1.0' encoding='us-ascii' ?>
+
+<!-- XML component catalog -->
+
+<begin-catalog>
+    <path-prefix-list></path-prefix-list>
+    <type-list></type-list>
+    <component-list>
+        <component>
+            <component-name>MeshJobManager</component-name>
+        </component>
+        <component>
+            <component-name>SPADDERPluginTester</component-name>
+        </component>
+    </component-list>
+</begin-catalog>
diff --git a/src/Tools/padder/resources/appligen/CatalogResources.xml b/src/Tools/padder/resources/appligen/CatalogResources.xml
new file mode 100644 (file)
index 0000000..4900b5f
--- /dev/null
@@ -0,0 +1,21 @@
+<!DOCTYPE ResourcesCatalog>
+<resources>
+
+   <!-- Generic configuration that should works on every workstation -->
+   <machine name="localhost" hostname="localhost"
+            protocol="ssh" batch="ssh_batch"
+            memInMB="500" CPUFreqMHz="0" nbOfNodes="1" nbOfProcPerNode="1"/>
+
+   <!-- Specific configuration that only works on my workstation (needs ssh authentification) -->
+   <machine name="boulant@claui2p1" 
+            hostname="claui2p1" userName="boulant"
+            protocol="ssh" batch="ssh_batch"
+            memInMB="500" CPUFreqMHz="0" nbOfNodes="1" nbOfProcPerNode="1"/>
+
+   <!-- Specific configuration that only works for nepal team (needs ssh authentification) -->
+   <machine name="nepal@nepal" 
+            hostname="nepal" userName="nepal"
+            protocol="ssh" batch="ssh_batch"
+            memInMB="500" CPUFreqMHz="0" nbOfNodes="1" nbOfProcPerNode="1"/>
+
+</resources>
diff --git a/src/Tools/padder/resources/appligen/Makefile.am b/src/Tools/padder/resources/appligen/Makefile.am
new file mode 100644 (file)
index 0000000..91f408c
--- /dev/null
@@ -0,0 +1,39 @@
+#  Copyright (C) 2011  CEA/DEN, EDF R&D
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+#  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+appligendir = $(salomeresdir)/appligen
+
+dist_appligen_DATA=            \
+       appli-splashscreen.jpg \
+       SalomeApp.xml          \
+       CatalogResources.xml
+
+nodist_appligen_DATA=          \
+       envappli.sh            \
+       config_appli.xml
+
+nodist_appligen_SCRIPTS= \
+       appligen.sh
+
+envappli.sh:
+       $(srcdir)/genenv.sh envappli.sh
+
+EXTRA_DIST += README.txt genenv.sh
+CLEANFILES  = envappli.sh
diff --git a/src/Tools/padder/resources/appligen/README.txt b/src/Tools/padder/resources/appligen/README.txt
new file mode 100644 (file)
index 0000000..6fb376c
--- /dev/null
@@ -0,0 +1,24 @@
+This package defines a build procedure that creates a
+set of files ready to use to generate a SALOME application
+embedding this module.
+
+The files are created in the directory:
+
+  <installdir>/share/salome/resources/<module_name>/appligen
+
+Where <installdir> is the installation directory of the module.
+
+To generate a SALOME application, just change directory to go
+where you want to install the SALOME application and type the
+following command in a standard shell (the SALOME environment
+is not required, all paths are "hard" coded in the script):
+
+  $ <installdir>/share/salome/resources/<module_name>/appligen/appligen.sh 
+
+This script generates an application in a directory ./appli.
+Then type the following command to run a SALOME application
+embedding your module:
+
+  $ ./appli/runAppli -k
+
+
diff --git a/src/Tools/padder/resources/appligen/SalomeApp.xml b/src/Tools/padder/resources/appligen/SalomeApp.xml
new file mode 100644 (file)
index 0000000..87ca362
--- /dev/null
@@ -0,0 +1,40 @@
+<document>
+  <section name="launch">
+    <!-- SALOME launching parameters -->
+    <parameter name="gui"        value="yes"/>
+    <parameter name="splash"     value="yes"/>
+    <parameter name="file"       value="no"/>
+    <parameter name="key"        value="no"/>
+    <parameter name="interp"     value="no"/>
+    <parameter name="logger"     value="no"/>
+    <parameter name="xterm"      value="no"/>
+    <parameter name="portkill"   value="no"/>
+    <parameter name="killall"    value="no"/>
+    <parameter name="noexcepthandler"  value="no"/>
+    <parameter name="modules"    value="KERNEL,MED,GUI,GEOM,SMESH,JOBMANAGER,VISU,YACS"/>
+    <parameter name="pyModules"  value=""/>
+    <parameter name="embedded"   value="SalomeAppEngine,study,cppContainer,registry,moduleCatalog"/>
+    <parameter name="standalone" value="pyContainer"/>
+  </section>
+  <section name="SMESH">
+    <parameter name="plugins" value="NETGENPlugin,GHS3DPlugin,BLSURFPlugin"/>
+  </section>
+  <section name="splash" >
+    <!-- Splash screen settings. This only works when using a SALOME application, -->
+    <!-- where the file appli-splashscreen.jpg has been copy into. -->
+    <parameter name="image"             value="${SMESH_ROOT_DIR}/share/salome/resources/smesh/appligen/appli-splashscreen.jpg" />
+    <parameter name="constant_info"     value="%A [ %V ]" />
+    <parameter name="text_colors"       value="#eeeeff|#555555" />
+    <parameter name="hide_on_click"     value="no" />
+    <parameter name="show_progress"     value="yes" />
+    <parameter name="show_message"      value="yes" />
+    <parameter name="show_percents"     value="yes" />
+    <parameter name="margin"            value="40" />
+    <parameter name="progress_width"    value="20" />
+    <parameter name="progress_flags"    value="bottom,left_to_right" />
+    <parameter name="opacity"           value="0.70" />
+    <parameter name="font"              value="Tahoma,12,normal" />
+    <parameter name="alignment"         value="top,left" />
+    <parameter name="progress_colors"   value="#3b3e5d|#d14949|v" />
+  </section>
+</document>
diff --git a/src/Tools/padder/resources/appligen/appli-splashscreen.jpg b/src/Tools/padder/resources/appligen/appli-splashscreen.jpg
new file mode 100644 (file)
index 0000000..45377b1
Binary files /dev/null and b/src/Tools/padder/resources/appligen/appli-splashscreen.jpg differ
diff --git a/src/Tools/padder/resources/appligen/appligen.sh.in b/src/Tools/padder/resources/appligen/appligen.sh.in
new file mode 100755 (executable)
index 0000000..8ce6821
--- /dev/null
@@ -0,0 +1,31 @@
+#!/bin/sh
+# 
+# This script installs or updates a SALOME application for testing the
+# PADDER plugin for SMESH. The application is installed in the
+# directory ./appli. The configuration file is supposed to be adapted
+# to your own environment (see config_appli.xml).
+#
+# To run this script, you should have first configure your
+# shell with the SALOME environment, i.e. source the files
+# prerequis.sh and envSalome.sh (or equivalent) that fit
+# your configuration. You can alternatively customize the env.sh file
+# to fit your SALOME environment and let the script do the job (see
+# source below).
+#
+# (gboulant - 3/2/2011)
+#
+
+here=$(dirname $0)
+
+#
+# Run the appli_gen.py
+#
+APPLIDIR="./appli"
+@KERNEL_ROOT_DIR@/bin/salome/appli_gen.py --prefix=$APPLIDIR --config=$here/config_appli.xml
+
+#
+# Copy customized configuration files in the application
+#
+cp $here/SalomeApp.xml $APPLIDIR/.
+cp $here/CatalogResources.xml $APPLIDIR/.
+cp @prefix@/plugins/envPlugins.sh $APPLIDIR/env.d/.
diff --git a/src/Tools/padder/resources/appligen/config_appli.xml.in b/src/Tools/padder/resources/appligen/config_appli.xml.in
new file mode 100644 (file)
index 0000000..2f77f06
--- /dev/null
@@ -0,0 +1,15 @@
+<application>
+<!-- The path should be the absolute path of installation of the file envappli.sh -->
+<prerequisites path="@prefix@/share/salome/resources/@MODULE_NAME@/appligen/envappli.sh"/>
+
+<modules>
+  <module name="KERNEL" path="@KERNEL_ROOT_DIR@"/>
+  <module name="MED" path="@MED_ROOT_DIR@"/>
+  <module name="GUI" path="@GUI_ROOT_DIR@"/>
+  <module name="GEOM" path="@GEOM_ROOT_DIR@"/>
+  <module name="SMESH" path="@prefix@"/>
+  <module name="BLSURFPLUGIN" gui="no" path="@BLSURFPLUGIN_ROOT_DIR@"/>
+  <module name="GHS3DPLUGIN" gui="no" path="@GHS3DPLUGIN_ROOT_DIR@"/>
+  <module name="NETGENPLUGIN" gui="no" path="@NETGENPLUGIN_ROOT_DIR@"/>
+</modules>
+</application>
diff --git a/src/Tools/padder/resources/appligen/genenv.sh b/src/Tools/padder/resources/appligen/genenv.sh
new file mode 100755 (executable)
index 0000000..0a77ddc
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+# This script creates a source file that defines a SALOME shell
+# environment. We assume here that the SALOME environment has been
+# previously set, so that the env command get all environment
+# variables required for building and executing SALOME. We talk
+# about third party software programs and libraries. The environment
+# variables defining SALOME module are exluded (i.e. *_ROOT_DIR)
+# because they are automatically set when generating a SALOME application..
+#
+# The argument is the filepath to be created.
+#
+
+if [ $# == 1 ]; then
+    ENVAPPLI_SH=$1
+else
+    ENVAPPLI_SH=envappli.sh
+fi
+
+function header {
+    echo "#"
+    echo "# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+    echo "# THIS FILE IS GENERATED from the shell environment used to build the SALOME module."
+    echo "# IT SHOULD NOT BE EDITED, it is generated for the need of the SALOME application   "
+    echo "# that embeds the module (for test purposes).                                       "
+    echo "# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+    echo "#"
+}
+header > $ENVAPPLI_SH
+env | grep -v -e PWD -e SalomeAppConfig -e _ROOT_DIR | while read f; do
+    key=$(echo $f | cut -d"=" -f1)
+    value=$(echo $f | cut -d"=" -f2-)
+
+    # if the key is a path (LD_LIBRARY_PATH, PATH and PYTHONPATH) then
+    # we must extends the variable.
+    if [ $key == "LD_LIBRARY_PATH" -o $key == "PATH" -o $key == "PYTHONPATH" ]; then
+        echo export $key=\"$value:\$$key\"
+    else
+        echo export $key=\"$value\"
+    fi
+done >> $ENVAPPLI_SH
diff --git a/src/Tools/padder/resources/padderexe/Makefile.am b/src/Tools/padder/resources/padderexe/Makefile.am
new file mode 100644 (file)
index 0000000..f3e8d9c
--- /dev/null
@@ -0,0 +1,44 @@
+#  Copyright (C) 2011 EDF R&D
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+#  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+# Author(s): Guillaume Boulant (23/03/2011)
+#
+
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+mysalomeresdir=$(salomeresdir)/padderexe
+
+version=med3
+notinstall_version=med2
+
+# We install the padder.exe program and the files required for testing
+# the execution from within the installation directory
+dist_mysalomeres_SCRIPTS =    \
+       $(version)/padder.exe \
+       padder.sh
+
+nodist_mysalomeres_SCRIPTS =         \
+       envPadder.sh
+
+dist_mysalomeres_DATA =         \
+       $(version)/data.txt     \
+       $(version)/concrete.med \
+       $(version)/ferraill.med
+
+NOT_USED_FILES = buildparticules.py particules.png
+EXTRA_DIST += $(notinstall_version) $(NOT_USED_FILES)
diff --git a/src/Tools/padder/resources/padderexe/buildparticules.py b/src/Tools/padder/resources/padderexe/buildparticules.py
new file mode 100755 (executable)
index 0000000..b3826b2
--- /dev/null
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+import geompy
+import salome
+salome.salome_init()
+theStudy = salome.myStudy
+geompy.init_geom(theStudy)
+
+filename="/home/gboulant/development/projets/salome/SPADDER/spadder/resources/padderexe/REF_spheres.dat.xyz"
+file=open(filename,'rb')
+
+import csv
+datalines = csv.reader(file, delimiter=' ')
+i=0
+for row in datalines:
+    x=float(row[0])
+    y=float(row[1])
+    z=float(row[2])
+    rayon=float(row[3])/2.
+
+    centre = geompy.MakeVertex(x, y, z)
+    particule = geompy.MakeSpherePntR(centre, rayon)
+    geompy.addToStudy( particule, 'p'+str(i) )
+    i+=1
diff --git a/src/Tools/padder/resources/padderexe/envPadder.sh.in b/src/Tools/padder/resources/padderexe/envPadder.sh.in
new file mode 100644 (file)
index 0000000..31c84a5
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/sh
+# This script defines the shell extension required for executing the
+# padder executable program on the localhost (for test purposes)
+
+MED_ROOT="@MED2HOME@"
+HDF_ROOT="@HDF5HOME@"
+CGAL_ROOT="/usr"
+export LD_LIBRARY_PATH="$MED_ROOT/lib:$HDF_ROOT/lib:$CGAL_ROOT/lib:$LD_LIBRARY_PATH"
diff --git a/src/Tools/padder/resources/padderexe/med2/REF_FinalEDMesh.med b/src/Tools/padder/resources/padderexe/med2/REF_FinalEDMesh.med
new file mode 100644 (file)
index 0000000..0072943
Binary files /dev/null and b/src/Tools/padder/resources/padderexe/med2/REF_FinalEDMesh.med differ
diff --git a/src/Tools/padder/resources/padderexe/med2/REF_spheres.dat.xyz b/src/Tools/padder/resources/padderexe/med2/REF_spheres.dat.xyz
new file mode 100644 (file)
index 0000000..d511c38
--- /dev/null
@@ -0,0 +1,4097 @@
+0.00782971 0.00837862 0.188345 0.00802045 1 0
+0.0154087 0.00912149 0.0068625 0.00705037 1 0
+0.00853443 0.191571 0.191485 0.00877202 1 0
+0.00831246 0.192152 0.00532739 0.00567024 1 0
+0.392373 0.0103119 0.19108 0.00782777 1 0
+0.382012 0.00642122 0.00627707 0.00662885 1 0
+0.393074 0.19203 0.194472 0.00590232 1 0
+0.387096 0.187644 0.0151337 0.0125061 1 0
+0.0107355 0.00843302 0.0669608 0.00880526 1 0
+0.0130229 0.0100937 0.135407 0.0113355 1 0
+0.0066941 0.0661207 0.191646 0.00802792 1 0
+0.0103253 0.133553 0.192494 0.00822172 1 0
+0.0101874 0.193228 0.0665758 0.00716313 1 0
+0.0128864 0.189676 0.134999 0.0115899 1 0
+0.00969349 0.0657247 0.00859538 0.00955034 1 0
+0.00859049 0.132642 0.00899122 0.00969975 1 0
+0.385203 0.00809838 0.0668407 0.00880575 1 0
+0.386131 0.0107039 0.135508 0.0115306 1 0
+0.393588 0.0665381 0.191132 0.00775488 1 0
+0.386598 0.134808 0.191052 0.0102175 1 0
+0.389949 0.190842 0.0653571 0.00998665 1 0
+0.389353 0.192011 0.133631 0.00881068 1 0
+0.392783 0.067271 0.00660849 0.00698802 1 0
+0.388304 0.134196 0.0104575 0.0117876 1 0
+0.078446 0.0111886 0.00562685 0.00698503 1 0
+0.15933 0.010178 0.0071953 0.00782222 1 0
+0.239408 0.0117814 0.00838242 0.00902724 1 0
+0.319266 0.0104094 0.0109799 0.0115214 1 0
+0.0801022 0.00839366 0.191955 0.009342 1 0
+0.158855 0.0101758 0.190771 0.00985613 1 0
+0.240059 0.008372 0.19268 0.00811281 1 0
+0.319477 0.00952385 0.189827 0.0109663 1 0
+0.080239 0.184554 0.0107232 0.0118692 1 0
+0.158896 0.189543 0.0104515 0.0111914 1 0
+0.239206 0.192295 0.0114336 0.00824166 1 0
+0.321165 0.189065 0.0198378 0.011684 1 0
+0.0784293 0.189358 0.189415 0.0114984 1 0
+0.158102 0.183775 0.186583 0.0140474 1 0
+0.240505 0.191585 0.192095 0.00878636 1 0
+0.320737 0.187137 0.173616 0.0136636 1 0
+0.0102439 0.0601788 0.110611 0.011165 1 0
+0.00632993 0.0606389 0.0501703 0.00699327 1 0
+0.00886816 0.118481 0.073089 0.00961398 1 0
+0.0084637 0.130613 0.129338 0.0092135 1 0
+0.390636 0.0614183 0.111012 0.010272 1 0
+0.391413 0.0615332 0.0505572 0.0092585 1 0
+0.392479 0.119396 0.0733079 0.00827305 1 0
+0.389389 0.131268 0.129331 0.0113393 1 0
+0.274388 0.0076649 0.0575634 0.00842627 1 0
+0.134941 0.00959236 0.0653354 0.0105187 1 0
+0.0651853 0.00803465 0.0661969 0.00886309 1 0
+0.110295 0.00934566 0.133492 0.010401 1 0
+0.185332 0.0137269 0.132579 0.0147265 1 0
+0.331786 0.0104332 0.0984378 0.0115849 1 0
+0.207876 0.0106516 0.0633744 0.0116242 1 0
+0.261527 0.00924836 0.126979 0.0103371 1 0
+0.274177 0.19319 0.0574857 0.00758089 1 0
+0.135692 0.189732 0.0648955 0.0112128 1 0
+0.0663 0.187677 0.0661222 0.0131058 1 0
+0.109855 0.18853 0.132715 0.0125194 1 0
+0.185773 0.18914 0.131535 0.0118814 1 0
+0.332133 0.189017 0.0978282 0.0121498 1 0
+0.207852 0.192331 0.0632991 0.00864703 1 0
+0.261572 0.192711 0.126344 0.00840316 1 0
+0.0697814 0.106226 0.00960134 0.0108828 1 0
+0.131623 0.0598217 0.0086532 0.00941678 1 0
+0.266788 0.0652192 0.0102618 0.0112281 1 0
+0.340609 0.0648565 0.00796636 0.00886868 1 0
+0.291252 0.132331 0.011155 0.0121409 1 0
+0.215098 0.131697 0.0133923 0.0143177 1 0
+0.19535 0.0639082 0.0075357 0.00848584 1 0
+0.141228 0.128178 0.0122679 0.0132652 1 0
+0.0684398 0.10719 0.184859 0.0147587 1 0
+0.131467 0.0598993 0.189562 0.0112022 1 0
+0.267697 0.0654378 0.191161 0.00979633 1 0
+0.340927 0.0652784 0.190301 0.0106229 1 0
+0.291838 0.133337 0.1901 0.0109407 1 0
+0.216095 0.132971 0.190766 0.0102258 1 0
+0.194717 0.0641122 0.187867 0.0130967 1 0
+0.141036 0.129092 0.188982 0.0120216 1 0
+0.0669682 0.0665113 0.0941136 0.0147587 1 0
+0.0833322 0.143862 0.12175 0.0147587 1 0
+0.189807 0.104641 0.118969 0.0147587 1 0
+0.344502 0.0601456 0.0998379 0.0141213 1 0
+0.274144 0.081421 0.098988 0.0147587 1 0
+0.329187 0.144678 0.0830052 0.0143816 1 0
+0.243586 0.146288 0.0866495 0.0147193 1 0
+0.132914 0.0731836 0.103217 0.0147587 1 0
+0.0428272 0.119038 0.052029 0.0119519 1 0
+0.261979 0.150932 0.146194 0.0117141 1 0
+0.102115 0.140291 0.0526524 0.0147587 1 0
+0.0340305 0.101951 0.155062 0.0129279 1 0
+0.357144 0.101091 0.153465 0.0134399 1 0
+0.187456 0.162108 0.0494275 0.0113731 1 0
+0.232702 0.0552718 0.0430421 0.0140424 1 0
+0.171625 0.0519527 0.049372 0.0140307 1 0
+0.369195 0.0892426 0.0427442 0.0106064 1 0
+0.282643 0.107185 0.149494 0.0143329 1 0
+0.301665 0.113049 0.0909966 0.0106702 1 0
+0.310165 0.138814 0.141503 0.0130046 1 0
+0.343165 0.122885 0.118235 0.0109302 1 0
+0.315644 0.0912562 0.126227 0.0126514 1 0
+0.324143 0.117021 0.176733 0.0108517 1 0
+0.241903 0.0991953 0.191196 0.00904411 1 0
+0.205529 0.0985492 0.193468 0.00687593 1 0
+0.231275 0.0648555 0.192248 0.00804733 1 0
+0.192501 0.0845542 0.159484 0.0113254 1 0
+0.203006 0.118545 0.159484 0.0112056 1 0
+0.228532 0.0851619 0.159484 0.0128027 1 0
+0.0076378 0.159507 0.0697794 0.00794379 1 0
+0.00797419 0.124577 0.101219 0.00825663 1 0
+0.00724401 0.165552 0.0978756 0.0074128 1 0
+0.0416661 0.137341 0.125342 0.0105815 1 0
+0.0416661 0.131346 0.0975119 0.0124504 1 0
+0.0416661 0.171931 0.0942084 0.0143232 1 0
+0.0327151 0.00826481 0.0665097 0.00864515 1 0
+0.0663095 0.0332556 0.0799531 0.00903774 1 0
+0.0334841 0.0332556 0.0803902 0.0122868 1 0
+0.0573668 0.0559547 0.065866 0.00791185 1 0
+0.0567081 0.0226991 0.0517055 0.00704303 1 0
+0.0238827 0.0226991 0.0521425 0.00900202 1 0
+0.342522 0.0625798 0.149919 0.0125448 1 0
+0.350823 0.0806185 0.126652 0.00858079 1 0
+0.348843 0.0830528 0.176733 0.00764718 1 0
+0.363749 0.071594 0.15777 0.00763325 1 0
+0.357428 0.051121 0.130956 0.008721 1 0
+0.355448 0.0535553 0.181037 0.00667593 1 0
+0.0681372 0.08677 0.147057 0.0141747 1 0
+0.0504993 0.0842312 0.124588 0.00972722 1 0
+0.0516683 0.10449 0.177531 0.00716934 1 0
+0.0399296 0.0726263 0.156605 0.00748802 1 0
+0.0563985 0.0549064 0.12613 0.00891438 1 0
+0.0575674 0.0751651 0.179073 0.00997186 1 0
+0.0329075 0.194096 0.0663952 0.00629114 1 0
+0.054239 0.159519 0.0589108 0.0106545 1 0
+0.0214136 0.159519 0.0593479 0.0115942 1 0
+0.0444173 0.141073 0.0412066 0.00615021 1 0
+0.0558291 0.181554 0.0480883 0.00684724 1 0
+0.0230037 0.181554 0.0485254 0.00865493 1 0
+0.305829 0.166343 0.00930025 0.00968747 1 0
+0.310165 0.138814 0.0415026 0.0115073 1 0
+0.294382 0.156927 0.0589093 0.0106354 1 0
+0.275359 0.151063 0.0174067 0.007417 1 0
+0.289788 0.184588 0.0174067 0.00953043 1 0
+0.00594911 0.0607854 0.0803628 0.0061939 1 0
+0.00479756 0.0897179 0.0617091 0.00502066 1 0
+0.00616272 0.0895967 0.0918222 0.00633686 1 0
+0.0334841 0.0926703 0.0836937 0.0109375 1 0
+0.0334841 0.0638087 0.072279 0.0100164 1 0
+0.0334841 0.0638137 0.10221 0.0086386 1 0
+0.38987 0.00500221 0.0329115 0.0052469 1 0
+0.393944 0.0306307 0.0587043 0.00630491 1 0
+0.381303 0.0482723 0.0447202 0.00584722 1 0
+0.381303 0.0177192 0.0528313 0.0073099 1 0
+0.100494 0.0834848 0.190271 0.00999289 1 0
+0.136589 0.094439 0.188634 0.0116715 1 0
+0.10535 0.11814 0.185976 0.0143114 1 0
+0.137312 0.100876 0.151609 0.013982 1 0
+0.132467 0.0667472 0.151609 0.0122049 1 0
+0.10111 0.0901062 0.151609 0.0133919 1 0
+0.196804 0.00564298 0.0979846 0.00597401 1 0
+0.234676 0.00734643 0.0952439 0.0075486 1 0
+0.223513 0.00751701 0.129666 0.00783969 1 0
+0.267589 0.0407105 0.112875 0.0108776 1 0
+0.241081 0.0407105 0.0814703 0.0138234 1 0
+0.230019 0.0407105 0.115571 0.0123786 1 0
+0.395052 0.090127 0.0918997 0.00512988 1 0
+0.394346 0.124977 0.101082 0.00594888 1 0
+0.394125 0.0960045 0.119809 0.00606523 1 0
+0.372251 0.0954827 0.114386 0.0118067 1 0
+0.372251 0.0894874 0.0865558 0.0106283 1 0
+0.372251 0.0606309 0.105072 0.00706064 1 0
+0.240956 0.194533 0.060616 0.00571904 1 0
+0.225802 0.173144 0.0753011 0.00853777 1 0
+0.258741 0.173144 0.0722814 0.00850498 1 0
+0.251581 0.157732 0.0607315 0.00735967 1 0
+0.233797 0.184588 0.049383 0.00834547 1 0
+0.266736 0.184588 0.0463634 0.00513679 1 0
+0.00936532 0.0328331 0.190733 0.00954134 1 0
+0.03956 0.0329435 0.190241 0.00993531 1 0
+0.0229144 0.0549841 0.179073 0.00828957 1 0
+0.223628 0.194435 0.129147 0.00587496 1 0
+0.25231 0.173144 0.106706 0.00865879 1 0
+0.214741 0.173144 0.109401 0.011377 1 0
+0.230868 0.156087 0.11999 0.00925117 1 0
+0.239592 0.182943 0.140046 0.00761219 1 0
+0.202023 0.182943 0.142742 0.00643796 1 0
+0.360114 0.190042 0.16695 0.0101415 1 0
+0.324593 0.172339 0.141503 0.0102159 1 0
+0.364593 0.172339 0.108169 0.0128744 1 0
+0.344574 0.149581 0.121034 0.010329 1 0
+0.37998 0.177242 0.146199 0.00823187 1 0
+0.0750501 0.153331 0.00691301 0.00725809 1 0
+0.0857105 0.12366 0.0263262 0.00879905 1 0
+0.0740611 0.1517 0.0415182 0.00806666 1 0
+0.0576568 0.135069 0.0151921 0.008488 1 0
+0.0630037 0.181554 0.0151921 0.00733111 1 0
+0.100334 0.00507726 0.0657085 0.00540601 1 0
+0.101348 0.0332556 0.0799218 0.0124732 1 0
+0.0888629 0.0482426 0.0678241 0.00969621 1 0
+0.0882042 0.0149869 0.0536635 0.00741779 1 0
+0.123242 0.0149869 0.0536322 0.00573819 1 0
+0.366088 0.00696468 0.116037 0.00721858 1 0
+0.366109 0.00552948 0.0824399 0.00579393 1 0
+0.338439 0.0300728 0.0991444 0.00767144 1 0
+0.372251 0.0300728 0.116586 0.0110535 1 0
+0.372251 0.0300728 0.0832523 0.0110382 1 0
+0.203006 0.118545 0.0594845 0.0120352 1 0
+0.211255 0.0799562 0.0810055 0.0125263 1 0
+0.224453 0.0938606 0.021521 0.0112369 1 0
+0.202163 0.0536123 0.046207 0.00768668 1 0
+0.180716 0.0782967 0.0841705 0.0111456 1 0
+0.193914 0.0922011 0.024686 0.0130531 1 0
+0.394528 0.0305532 0.122124 0.00575726 1 0
+0.385177 0.0516063 0.13619 0.00782689 1 0
+0.385177 0.0210482 0.147704 0.0073708 1 0
+0.0751502 0.105187 0.107932 0.0104693 1 0
+0.0763192 0.125446 0.160875 0.010952 1 0
+0.108123 0.108523 0.112484 0.0110378 1 0
+0.0999413 0.0698475 0.0986656 0.00836315 1 0
+0.165758 0.116605 0.159484 0.0121527 1 0
+0.160914 0.0824757 0.159484 0.013619 1 0
+0.161361 0.0889121 0.111093 0.00836142 1 0
+0.294009 0.0323892 0.189614 0.01061 1 0
+0.304296 0.0653391 0.191657 0.00865693 1 0
+0.330471 0.0324018 0.19251 0.00785154 1 0
+0.302412 0.0509357 0.177837 0.0115737 1 0
+0.26577 0.0512702 0.177837 0.00661967 1 0
+0.187851 0.15232 0.125561 0.0120432 1 0
+0.216697 0.125464 0.102809 0.00941345 1 0
+0.215521 0.154198 0.0680385 0.00864791 1 0
+0.188632 0.133375 0.0841982 0.0112806 1 0
+0.186676 0.181054 0.0907904 0.0113755 1 0
+0.257158 0.00634884 0.0286278 0.00661142 1 0
+0.24115 0.00797505 0.0605706 0.00822542 1 0
+0.223999 0.00751144 0.0314485 0.00773857 1 0
+0.22036 0.0276359 0.0534973 0.00800536 1 0
+0.253299 0.0276359 0.0504777 0.00881505 1 0
+0.0994942 0.063411 0.0470568 0.014322 1 0
+0.132467 0.0667472 0.0516087 0.0130026 1 0
+0.121836 0.0515788 0.072376 0.00981294 1 0
+0.121389 0.0451423 0.0207672 0.00695694 1 0
+0.199897 0.192878 0.195143 0.00502548 1 0
+0.213141 0.191335 0.165953 0.0089279 1 0
+0.17265 0.189447 0.165926 0.0108864 1 0
+0.2707 0.0735521 0.049494 0.0125585 1 0
+0.28673 0.0582431 0.0706498 0.00967816 1 0
+0.283286 0.0503742 0.0211558 0.00766029 1 0
+0.266009 0.0451685 0.0426768 0.00870186 1 0
+0.253423 0.0683464 0.071015 0.0092965 1 0
+0.249979 0.0604775 0.021521 0.0070212 1 0
+0.227566 0.166162 0.00927722 0.00964504 1 0
+0.23789 0.150813 0.0174067 0.0083311 1 0
+0.249788 0.184588 0.0174067 0.00630637 1 0
+0.20183 0.147279 0.0247137 0.00805173 1 0
+0.21747 0.0316523 0.190068 0.010193 1 0
+0.229739 0.0506625 0.177837 0.0108254 1 0
+0.186798 0.0522662 0.181595 0.00590615 1 0
+0.231976 0.0930308 0.108978 0.011216 1 0
+0.245174 0.106935 0.049494 0.00991656 1 0
+0.258865 0.113855 0.0928188 0.00909479 1 0
+0.229895 0.139369 0.0433248 0.0114901 1 0
+0.309323 0.0707833 0.099413 0.00918863 1 0
+0.30326 0.0407105 0.0987195 0.0125128 1 0
+0.269214 0.0591391 0.127331 0.00909719 1 0
+0.304393 0.0485014 0.127756 0.0125593 1 0
+0.298329 0.0184286 0.127063 0.0120348 1 0
+0.342522 0.0625798 0.049919 0.0125044 1 0
+0.353554 0.047792 0.069417 0.00851466 1 0
+0.351574 0.0502263 0.019498 0.00671085 1 0
+0.365901 0.0623405 0.0408701 0.00679192 1 0
+0.356848 0.0746941 0.0712911 0.0085842 1 0
+0.354868 0.0771284 0.0213721 0.00710973 1 0
+0.393665 0.0612623 0.0805882 0.00656835 1 0
+0.372251 0.0606259 0.0751412 0.00928767 1 0
+0.00800775 0.00481281 0.0330032 0.00501284 1 0
+0.00493794 0.0302994 0.058471 0.0051964 1 0
+0.0238827 0.0532522 0.0440314 0.0064865 1 0
+0.388819 0.00982632 0.167372 0.0110774 1 0
+0.359782 0.0103331 0.167339 0.0105166 1 0
+0.360202 0.00555297 0.194979 0.00521289 1 0
+0.307343 0.0732175 0.149494 0.0100654 1 0
+0.297242 0.00716979 0.112559 0.0074196 1 0
+0.262658 0.0184286 0.141219 0.00586963 1 0
+0.252783 0.14861 0.116422 0.00781161 1 0
+0.261506 0.175466 0.136478 0.00659803 1 0
+0.240065 0.158409 0.149762 0.00585704 1 0
+0.280059 0.00504557 0.194484 0.00529663 1 0
+0.291028 0.0109082 0.163718 0.0111851 1 0
+0.250706 0.00816308 0.163779 0.0085333 1 0
+0.251026 0.191692 0.163287 0.00868018 1 0
+0.0742247 0.0530447 0.190726 0.00951869 1 0
+0.105992 0.0295004 0.189733 0.0105254 1 0
+0.121557 0.0494515 0.179666 0.00632887 1 0
+0.0902001 0.0728104 0.179666 0.0112387 1 0
+0.0400163 0.189738 0.166964 0.0104471 1 0
+0.0416661 0.171931 0.127542 0.0126428 1 0
+0.0611786 0.149062 0.142927 0.00777122 1 0
+0.0195125 0.177131 0.148718 0.00844259 1 0
+0.280463 0.194149 0.194111 0.00609663 1 0
+0.30581 0.166488 0.193747 0.00663919 1 0
+0.265709 0.166873 0.191652 0.00860795 1 0
+0.276561 0.141941 0.173097 0.00797356 1 0
+0.118638 0.186606 0.187079 0.0130349 1 0
+0.149567 0.165601 0.18603 0.0143514 1 0
+0.110778 0.164928 0.189958 0.0102913 1 0
+0.112521 0.136216 0.160875 0.0123521 1 0
+0.168005 0.0965757 0.192944 0.00723432 1 0
+0.178652 0.13081 0.193931 0.00640298 1 0
+0.332251 0.0300728 0.149919 0.0103012 1 0
+0.325711 0.00860382 0.149657 0.00892666 1 0
+0.0548977 0.0927747 0.0730713 0.00893812 1 0
+0.0214136 0.118934 0.0626514 0.00597593 1 0
+0.0214136 0.0900721 0.0512367 0.00900762 1 0
+0.321909 0.0476054 0.0710748 0.0096664 1 0
+0.319929 0.0500397 0.0211558 0.00827911 1 0
+0.267936 0.00808185 0.0922081 0.00836643 1 0
+0.27402 0.0407105 0.0784506 0.0113994 1 0
+0.370562 0.0994924 0.193807 0.00632978 1 0
+0.378572 0.117212 0.176733 0.00887554 1 0
+0.378572 0.0838791 0.176733 0.00900273 1 0
+0.0170152 0.0815337 0.132684 0.00868612 1 0
+0.0229144 0.0522088 0.134226 0.00857542 1 0
+0.00714838 0.192871 0.0328516 0.00736289 1 0
+0.0329743 0.189293 0.0327432 0.0108652 1 0
+0.0230037 0.181554 0.0151921 0.00829238 1 0
+0.280033 0.194371 0.00546809 0.00575251 1 0
+0.265391 0.166364 0.00786568 0.00811157 1 0
+0.336844 0.102412 0.0914216 0.0109427 1 0
+0.364593 0.137749 0.10597 0.0106918 1 0
+0.378572 0.115956 0.1412 0.00720476 1 0
+0.160389 0.00646817 0.0988948 0.0067168 1 0
+0.17157 0.00638728 0.0645314 0.00668162 1 0
+0.189822 0.0259764 0.0566623 0.00813572 1 0
+0.17876 0.0259764 0.0907627 0.0123462 1 0
+0.153676 0.0259764 0.057551 0.00815413 1 0
+0.147479 0.00853593 0.0323513 0.00887264 1 0
+0.183736 0.00755407 0.0314761 0.0077984 1 0
+0.378572 0.0811038 0.131886 0.00909792 1 0
+0.00591154 0.132048 0.1648 0.00629393 1 0
+0.0195125 0.142541 0.146519 0.0071908 1 0
+0.0195125 0.143797 0.182052 0.00712555 1 0
+0.0365277 0.128106 0.159583 0.00666505 1 0
+0.0170152 0.116386 0.141999 0.00646397 1 0
+0.0170152 0.117642 0.177531 0.00806451 1 0
+0.370844 0.0324118 0.191016 0.00912187 1 0
+0.134768 0.188691 0.166564 0.0115827 1 0
+0.148015 0.19024 0.132253 0.0100692 1 0
+0.134614 0.171931 0.126952 0.0146729 1 0
+0.097124 0.171931 0.127505 0.00794981 1 0
+0.392841 0.0977101 0.0250466 0.00727379 1 0
+0.394032 0.126426 0.0363921 0.00628753 1 0
+0.384597 0.104036 0.058009 0.00656267 1 0
+0.384597 0.0751744 0.0465943 0.00530318 1 0
+0.384597 0.111288 0.0213721 0.00858782 1 0
+0.390129 0.167151 0.0101153 0.0100334 1 0
+0.360693 0.166517 0.0106686 0.0108482 1 0
+0.361679 0.190338 0.013115 0.00979974 1 0
+0.364593 0.139006 0.0415026 0.0137119 1 0
+0.325829 0.188443 0.149303 0.0118787 1 0
+0.366315 0.193143 0.115659 0.00709951 1 0
+0.330781 0.172339 0.0907281 0.00719079 1 0
+0.393701 0.16717 0.194106 0.00622614 1 0
+0.389212 0.189767 0.166773 0.0104671 1 0
+0.37998 0.143909 0.179532 0.00763044 1 0
+0.119432 0.00577778 0.0058474 0.00598998 1 0
+0.107374 0.00697596 0.0325843 0.00717186 1 0
+0.0953788 0.0149869 0.0207672 0.00746824 1 0
+0.392788 0.0332226 0.193286 0.00688538 1 0
+0.385177 0.0543815 0.181037 0.00675563 1 0
+0.13657 0.124252 0.12036 0.0141879 1 0
+0.227045 0.070749 0.137322 0.0133981 1 0
+0.165758 0.116605 0.0594845 0.010786 1 0
+0.137312 0.100876 0.0516087 0.0146835 1 0
+0.117515 0.106738 0.0779349 0.0111866 1 0
+0.145961 0.122466 0.0858107 0.0144476 1 0
+0.121912 0.13443 0.0263262 0.00836417 1 0
+0.303644 0.0655245 0.00637762 0.0067013 1 0
+0.307343 0.0732175 0.049494 0.0112366 1 0
+0.0898928 0.0528545 0.0188092 0.0112597 1 0
+0.100339 0.0835407 0.00719202 0.00745889 1 0
+0.0681372 0.08677 0.0470568 0.0128114 1 0
+0.0845416 0.103401 0.073383 0.011455 1 0
+0.117068 0.100301 0.0263262 0.0125396 1 0
+0.227947 0.166669 0.192156 0.00820954 1 0
+0.239091 0.141691 0.173097 0.00912766 1 0
+0.217177 0.149168 0.176665 0.00718058 1 0
+0.359991 0.00561588 0.00622086 0.00588961 1 0
+0.330111 0.0325816 0.00548694 0.00583707 1 0
+0.370436 0.0326136 0.00785919 0.00799892 1 0
+0.187721 0.166242 0.0085089 0.00875112 1 0
+0.17892 0.13031 0.0061861 0.00650468 1 0
+0.150608 0.164404 0.0088986 0.00927567 1 0
+0.164583 0.145339 0.0247137 0.0094048 1 0
+0.163348 0.0622665 0.195283 0.0049871 1 0
+0.184104 0.0723527 0.14108 0.0098866 1 0
+0.155211 0.0501878 0.181595 0.00782231 1 0
+0.0323044 0.00983341 0.0328972 0.00998101 1 0
+0.286387 0.145483 0.0848274 0.0107116 1 0
+0.295583 0.147805 0.114599 0.0115574 1 0
+0.268062 0.116176 0.122591 0.0106126 1 0
+0.286606 0.0175326 0.0501124 0.00575424 1 0
+0.393607 0.159806 0.0697236 0.00670458 1 0
+0.392433 0.165936 0.0977602 0.00773155 1 0
+0.364593 0.131754 0.0781394 0.00950111 1 0
+0.364593 0.172339 0.0748359 0.0114168 1 0
+0.370471 0.0987242 0.00887783 0.00900479 1 0
+0.334864 0.104846 0.0415026 0.0144509 1 0
+0.349191 0.11696 0.0628747 0.00991734 1 0
+0.391274 0.191165 0.0995132 0.00895533 1 0
+0.394266 0.165746 0.131262 0.0061074 1 0
+0.212893 0.00607632 0.166473 0.00634648 1 0
+0.225089 0.0184286 0.143914 0.0112197 1 0
+0.0100767 0.166711 0.0104198 0.0102409 1 0
+0.0401862 0.166512 0.0109898 0.0111838 1 0
+0.0402255 0.193994 0.00591644 0.00621158 1 0
+0.0230037 0.148221 0.0151921 0.00783265 1 0
+0.381303 0.0510526 0.019498 0.00780039 1 0
+0.384597 0.0779546 0.0213721 0.00716514 1 0
+0.00795073 0.100327 0.191944 0.00820322 1 0
+0.00729948 0.0984007 0.164901 0.00747012 1 0
+0.0170152 0.0843089 0.177531 0.00831272 1 0
+0.309658 0.0175326 0.0211558 0.00733963 1 0
+0.144786 0.1512 0.0510399 0.0110181 1 0
+0.0398287 0.0100308 0.167135 0.0102105 1 0
+0.0956244 0.00846175 0.166819 0.00882322 1 0
+0.0553841 0.00785993 0.133774 0.00819954 1 0
+0.0783722 0.0216507 0.145704 0.0102551 1 0
+0.0229144 0.0216507 0.14574 0.00846962 1 0
+0.122004 0.0558879 0.131275 0.00867966 1 0
+0.0125628 0.192161 0.168294 0.00802027 1 0
+0.37998 0.142652 0.143999 0.00692701 1 0
+0.234711 0.192608 0.0948239 0.00758701 1 0
+0.267805 0.192014 0.0920019 0.00827455 1 0
+0.141191 0.0409633 0.0454532 0.00814838 1 0
+0.303395 0.00577704 0.0780608 0.00607367 1 0
+0.315845 0.0175326 0.0703813 0.00924845 1 0
+0.00557333 0.165517 0.131393 0.00595387 1 0
+0.134321 0.0365918 0.0844737 0.0102843 1 0
+0.15227 0.0625682 0.0762948 0.00870398 1 0
+0.00610125 0.1259 0.0362767 0.00640747 1 0
+0.0214136 0.126186 0.0260145 0.00861099 1 0
+0.203979 0.135263 0.13615 0.00946628 1 0
+0.0541656 0.130645 0.182052 0.00832584 1 0
+0.0586813 0.122907 0.138406 0.00909749 1 0
+0.0733752 0.190249 0.0328107 0.0100889 1 0
+0.0838829 0.170146 0.0592225 0.00889822 1 0
+0.253452 0.132342 0.00666335 0.00698182 1 0
+0.267364 0.139619 0.0433248 0.0124672 1 0
+0.122838 0.00676448 0.099532 0.00706562 1 0
+0.088942 0.0332556 0.113687 0.0111015 1 0
+0.121915 0.0365918 0.118239 0.010264 1 0
+0.120406 0.00711212 0.193704 0.00641037 1 0
+0.135269 0.00862405 0.166962 0.00889347 1 0
+0.111005 0.0192961 0.146296 0.00582169 1 0
+0.297338 0.00779496 0.0287033 0.00808652 1 0
+0.325794 0.00845973 0.0487937 0.00864908 1 0
+0.187851 0.0523203 0.125561 0.0131926 1 0
+0.182148 0.0200324 0.147672 0.00640389 1 0
+0.10101 0.193895 0.065773 0.00643011 1 0
+0.0885172 0.194105 0.0997932 0.00613151 1 0
+0.123113 0.194109 0.099166 0.00619423 1 0
+0.0744915 0.171931 0.0937713 0.0101514 1 0
+0.10953 0.171931 0.09374 0.0118815 1 0
+0.13666 0.0941074 0.00611892 0.00642099 1 0
+0.156667 0.0902607 0.024686 0.0119912 1 0
+0.303258 0.19412 0.0778613 0.00617833 1 0
+0.297043 0.193387 0.112406 0.00685793 1 0
+0.29511 0.172339 0.104884 0.0122603 1 0
+0.301542 0.172339 0.0704592 0.00991179 1 0
+0.145949 0.0298672 0.194806 0.00545143 1 0
+0.169201 0.0200324 0.181595 0.00717934 1 0
+0.0346919 0.119789 0.0059911 0.0062676 1 0
+0.0560667 0.113033 0.0260145 0.00745023 1 0
+0.39462 0.0641305 0.0251582 0.00571618 1 0
+0.358552 0.127788 0.156265 0.00671995 1 0
+0.22384 0.19136 0.0315576 0.00886931 1 0
+0.197737 0.181054 0.05669 0.00568653 1 0
+0.31648 0.0993063 0.190149 0.010111 1 0
+0.196881 0.194663 0.0976769 0.00566597 1 0
+0.0927236 0.142077 0.0872012 0.00896175 1 0
+0.325551 0.143717 0.179532 0.0103648 1 0
+0.293068 0.0329148 0.00869786 0.00893395 1 0
+0.145887 0.0300695 0.00590849 0.0061642 1 0
+0.163592 0.0622743 0.00591676 0.00618727 1 0
+0.177744 0.0321437 0.00757873 0.00778291 1 0
+0.18341 0.0582102 0.024686 0.00701536 1 0
+0.151823 0.0561318 0.024686 0.00798044 1 0
+0.148058 0.190384 0.0324284 0.00993649 1 0
+0.171705 0.193063 0.0644836 0.0072308 1 0
+0.183703 0.191741 0.0316221 0.00850022 1 0
+0.161592 0.181054 0.0575787 0.00827033 1 0
+0.0334841 0.0332556 0.113723 0.0127761 1 0
+0.177315 0.0318544 0.193179 0.00702079 1 0
+0.00742114 0.00649798 0.100794 0.00672344 1 0
+0.0327225 0.00713169 0.100056 0.00728828 1 0
+0.00670312 0.0301976 0.122088 0.00698302 1 0
+0.360594 0.166754 0.190849 0.00932946 1 0
+0.360458 0.194671 0.1947 0.00561391 1 0
+0.187984 0.166822 0.189677 0.0105794 1 0
+0.0890311 0.0525517 0.126723 0.0104433 1 0
+0.279526 0.0994358 0.191957 0.00838132 1 0
+0.2707 0.0735521 0.149494 0.0128078 1 0
+0.395059 0.132156 0.164748 0.00532758 1 0
+0.0630797 0.13145 0.0868896 0.010546 1 0
+0.297324 0.192975 0.0285702 0.00731488 1 0
+0.256988 0.193627 0.0285966 0.00663241 1 0
+0.159405 0.0365918 0.117685 0.0118586 1 0
+0.148494 0.0192961 0.145743 0.0110561 1 0
+0.155658 0.0566242 0.133204 0.0102794 1 0
+0.347491 0.0177192 0.0687235 0.00944119 1 0
+0.253944 0.133117 0.19163 0.00868888 1 0
+0.160668 0.192288 0.0983666 0.00794803 1 0
+0.162767 0.15232 0.0923495 0.011823 1 0
+0.118921 0.170146 0.0591912 0.00871951 1 0
+0.393862 0.0306371 0.0888131 0.00630879 1 0
+0.0342825 0.0868882 0.194405 0.00582405 1 0
+0.0724711 0.129665 0.0523407 0.00787313 1 0
+0.0114266 0.193846 0.10058 0.00631329 1 0
+0.00798199 0.0330447 0.00607383 0.00636767 1 0
+0.0238827 0.0560324 0.0188092 0.00805161 1 0
+0.225893 0.127786 0.132581 0.011245 1 0
+0.0878774 0.00698675 0.0995188 0.00723216 1 0
+0.359861 0.0100027 0.0325919 0.0101839 1 0
+0.00634885 0.0635272 0.15549 0.00666141 1 0
+0.198913 0.0523203 0.0914608 0.0110048 1 0
+0.316316 0.0979592 0.0127506 0.0129877 1 0
+0.279109 0.0990261 0.00597457 0.00631869 1 0
+0.282643 0.107185 0.049494 0.0141105 1 0
+0.0948512 0.190047 0.166682 0.0103369 1 0
+0.0557363 0.192315 0.133729 0.0080218 1 0
+0.345858 0.133694 0.191225 0.00911709 1 0
+0.291379 0.188532 0.163401 0.0117574 1 0
+0.147955 0.00690015 0.132871 0.00722402 1 0
+0.392977 0.0637462 0.155599 0.00734253 1 0
+0.205744 0.0981554 0.00574847 0.0060839 1 0
+0.213949 0.0598698 0.021521 0.00722832 1 0
+0.119829 0.194369 0.00555227 0.00581835 1 0
+0.110214 0.164362 0.00948955 0.00975918 1 0
+0.241564 0.0986453 0.00619258 0.0064188 1 0
+0.231155 0.0649184 0.00722361 0.00752111 1 0
+0.072516 0.00571679 0.032973 0.00607668 1 0
+0.0398795 0.0325987 0.0100453 0.0102223 1 0
+0.0749134 0.0529824 0.0074804 0.00770916 1 0
+0.034637 0.0863996 0.00611601 0.00636006 1 0
+0.0585358 0.0762134 0.0188092 0.00941862 1 0
+0.0452963 0.0822181 0.0448237 0.00939987 1 0
+0.0328906 0.192731 0.1 0.0074275 1 0
+0.00681689 0.00655054 0.166864 0.00687372 1 0
+0.00498748 0.0997191 0.00470913 0.00492065 1 0
+0.00722114 0.0969544 0.024775 0.00732295 1 0
+0.0214136 0.0928524 0.0260145 0.0106683 1 0
+0.00611892 0.0301864 0.0885671 0.00629176 1 0
+0.00549623 0.0956741 0.119829 0.00569037 1 0
+0.0334841 0.0986656 0.111524 0.0123951 1 0
+0.0742482 0.153988 0.191585 0.0087894 1 0
+0.346052 0.132703 0.0081435 0.00845818 1 0
+0.172624 0.00676555 0.166485 0.00710748 1 0
+0.105188 0.117628 0.00615975 0.0064399 1 0
+0.10855 0.190097 0.0325934 0.0101185 1 0
+0.168432 0.096057 0.00759595 0.00777318 1 0
+0.10551 0.0300778 0.00791612 0.00819381 1 0
+0.253178 0.0328009 0.00693181 0.00723025 1 0
+0.217325 0.0321298 0.00770683 0.00796454 1 0
+0.199642 0.193449 0.00648802 0.00669564 1 0
+0.19968 0.0060719 0.193867 0.00628404 1 0
+0.245174 0.106935 0.149494 0.0121355 1 0
+0.360308 0.190453 0.0326889 0.00972258 1 0
+0.326158 0.191821 0.0485561 0.00837765 1 0
+0.366278 0.195066 0.0822926 0.0051992 1 0
+0.392933 0.100219 0.00558497 0.00577655 1 0
+0.0342897 0.120289 0.194417 0.00586501 1 0
+0.0109856 0.167283 0.18869 0.0111292 1 0
+0.0394183 0.167057 0.191843 0.00833159 1 0
+0.390892 0.190956 0.0327244 0.0093067 1 0
+0.253763 0.0323933 0.190427 0.00989013 1 0
+0.279981 0.00552827 0.00540814 0.00558839 1 0
+0.390994 0.0986796 0.165026 0.00917001 1 0
+0.199351 0.00925291 0.00631537 0.00641028 1 0
+0.339858 0.0978656 0.116162 0.0143915 1 0
+0.291051 0.0839952 0.134791 0.0143838 1 0
+0.0230061 0.123341 0.115559 0.014715 1 0
+0.0519932 0.0216838 0.0700086 0.0118849 1 0
+0.0659504 0.0385772 0.0588947 0.0126856 1 0
+0.0384246 0.0355656 0.0575836 0.0111628 1 0
+0.0413681 0.0154344 0.0520067 0.00993293 1 0
+0.355919 0.0796688 0.144359 0.00987007 1 0
+0.353269 0.0664527 0.133592 0.00738205 1 0
+0.352004 0.0664607 0.170429 0.0103816 1 0
+0.359379 0.058104 0.157686 0.00654738 1 0
+0.0439492 0.0842267 0.143609 0.0103898 1 0
+0.0555715 0.0700535 0.136294 0.00934517 1 0
+0.0493466 0.0863296 0.163824 0.0106386 1 0
+0.0534492 0.0726907 0.152056 0.00677646 1 0
+0.0386384 0.178144 0.0651692 0.0144339 1 0
+0.0476738 0.170827 0.0475964 0.00663684 1 0
+0.0327376 0.19314 0.0513751 0.00696728 1 0
+0.308907 0.158592 0.0460618 0.0088282 1 0
+0.0166338 0.0802439 0.0709789 0.0135577 1 0
+0.0185188 0.0796215 0.097997 0.0135333 1 0
+0.017346 0.0603505 0.0840744 0.0102698 1 0
+0.385086 0.0340574 0.0498343 0.00972602 1 0
+0.388393 0.106695 0.102392 0.0116154 1 0
+0.38536 0.0845969 0.101285 0.00968738 1 0
+0.387865 0.0846269 0.118425 0.00763409 1 0
+0.387009 0.093955 0.0898924 0.00514799 1 0
+0.241671 0.181504 0.0670229 0.0112165 1 0
+0.226608 0.172233 0.0583028 0.00850386 1 0
+0.255964 0.172978 0.0541895 0.00979963 1 0
+0.249612 0.189723 0.0511142 0.00837173 1 0
+0.022717 0.0142507 0.190427 0.00962286 1 0
+0.0407331 0.0149915 0.192019 0.00699943 1 0
+0.235776 0.18609 0.115207 0.0139961 1 0
+0.248867 0.166126 0.126089 0.0122412 1 0
+0.22212 0.171399 0.131059 0.0115699 1 0
+0.229005 0.186785 0.133425 0.0054521 1 0
+0.0851153 0.146493 0.022762 0.0143185 1 0
+0.0669041 0.130177 0.0330515 0.0122099 1 0
+0.063305 0.151289 0.0168905 0.00877187 1 0
+0.0815405 0.0205122 0.0716063 0.012504 1 0
+0.0780966 0.038364 0.0727091 0.00571037 1 0
+0.0957399 0.0321352 0.0575695 0.010599 1 0
+0.105371 0.0143381 0.0549332 0.0098079 1 0
+0.353367 0.0167339 0.0905831 0.0132159 1 0
+0.385155 0.0166265 0.0999075 0.0139561 1 0
+0.210662 0.0770846 0.015566 0.0112815 1 0
+0.389953 0.0388172 0.108549 0.0102772 1 0
+0.374346 0.0517042 0.120709 0.011067 1 0
+0.370621 0.037495 0.137735 0.0114201 1 0
+0.390558 0.0348163 0.13853 0.00953474 1 0
+0.0614848 0.104058 0.127071 0.013075 1 0
+0.0841309 0.110185 0.141854 0.0146546 1 0
+0.313814 0.0452291 0.190212 0.00980316 1 0
+0.292761 0.0517713 0.19146 0.00875362 1 0
+0.21056 0.154445 0.121274 0.0111641 1 0
+0.206882 0.165797 0.0859801 0.014397 1 0
+0.185081 0.158987 0.101408 0.0131654 1 0
+0.240847 0.0199757 0.0656529 0.0122568 1 0
+0.106587 0.047547 0.0623922 0.00885443 1 0
+0.103367 0.0560932 0.0794102 0.0104592 1 0
+0.116016 0.0593138 0.0591628 0.00656649 1 0
+0.117395 0.0483294 0.048068 0.00910673 1 0
+0.191796 0.19261 0.178099 0.00739796 1 0
+0.190262 0.1898 0.155824 0.010507 1 0
+0.202655 0.189878 0.185887 0.00756968 1 0
+0.284667 0.0527579 0.0492684 0.0124918 1 0
+0.267685 0.0562034 0.0643551 0.0104832 1 0
+0.252363 0.0623362 0.0534503 0.00929825 1 0
+0.217215 0.109656 0.118837 0.0131045 1 0
+0.320736 0.0555155 0.0908827 0.0116948 1 0
+0.292623 0.0664634 0.113613 0.013154 1 0
+0.288493 0.0359165 0.11613 0.0108148 1 0
+0.306189 0.0324051 0.116388 0.00722874 1 0
+0.361999 0.0517455 0.0533655 0.0100488 1 0
+0.35477 0.0616834 0.0642386 0.00636022 1 0
+0.353108 0.0627607 0.0302231 0.00985696 1 0
+0.357697 0.0745456 0.0429063 0.00805419 1 0
+0.388473 0.0786088 0.0762144 0.0115309 1 0
+0.371176 0.0763511 0.0756446 0.00648226 1 0
+0.384953 0.0606811 0.0905716 0.0106986 1 0
+0.0133713 0.0395707 0.0482004 0.0112632 1 0
+0.377054 0.00985857 0.185869 0.00990833 1 0
+0.358234 0.00751157 0.184997 0.00687113 1 0
+0.322977 0.0666139 0.132647 0.0138483 1 0
+0.290648 0.0596014 0.144794 0.0119843 1 0
+0.318269 0.0522183 0.156885 0.0147333 1 0
+0.298642 0.0225801 0.107366 0.00809767 1 0
+0.275372 0.0400522 0.134644 0.0122502 1 0
+0.277295 0.0139269 0.111945 0.0142065 1 0
+0.243332 0.158549 0.107592 0.00849985 1 0
+0.242569 0.143772 0.132518 0.0118557 1 0
+0.250115 0.170904 0.148051 0.0102692 1 0
+0.270953 0.0113225 0.178894 0.0113339 1 0
+0.29312 0.0104373 0.185275 0.010733 1 0
+0.231865 0.191675 0.150453 0.0083346 1 0
+0.0363854 0.187793 0.145368 0.0117962 1 0
+0.037714 0.16799 0.147599 0.00817705 1 0
+0.286593 0.17804 0.189411 0.0105941 1 0
+0.293143 0.15599 0.186423 0.0120585 1 0
+0.264356 0.185135 0.187138 0.0121549 1 0
+0.164858 0.117047 0.185871 0.0144117 1 0
+0.177516 0.0986111 0.17122 0.0123366 1 0
+0.184805 0.120304 0.171268 0.0105479 1 0
+0.311233 0.0306946 0.142974 0.0118427 1 0
+0.304212 0.0102483 0.147532 0.0102694 1 0
+0.318374 0.0131916 0.133019 0.00952195 1 0
+0.0386367 0.0873516 0.0632239 0.0108306 1 0
+0.0346314 0.0785248 0.0759995 0.005206 1 0
+0.0129629 0.103031 0.0634684 0.0107145 1 0
+0.337932 0.040181 0.0586026 0.0119534 1 0
+0.32304 0.0510643 0.0458029 0.0104974 1 0
+0.250929 0.00828934 0.0790767 0.00830518 1 0
+0.279563 0.033216 0.0976184 0.0099148 1 0
+0.259255 0.0237673 0.0795199 0.0110999 1 0
+0.387591 0.0867004 0.191347 0.00868954 1 0
+0.380134 0.100613 0.182544 0.00878057 1 0
+0.363045 0.0756534 0.186215 0.0109639 1 0
+0.391256 0.0917194 0.178525 0.00601633 1 0
+0.0314241 0.0759766 0.119374 0.0117015 1 0
+0.029587 0.0691096 0.140595 0.0106787 1 0
+0.0388408 0.0552642 0.118268 0.0103264 1 0
+0.0157146 0.193858 0.0469593 0.00617142 1 0
+0.277481 0.181533 0.00721478 0.00724873 1 0
+0.271742 0.191377 0.0181054 0.00864813 1 0
+0.357203 0.0992801 0.0980791 0.010705 1 0
+0.346708 0.113725 0.102435 0.00767388 1 0
+0.363235 0.116484 0.111255 0.0112617 1 0
+0.36471 0.092865 0.133798 0.00918174 1 0
+0.179094 0.00946046 0.0850337 0.0094677 1 0
+0.199891 0.0155986 0.0842305 0.0120848 1 0
+0.172 0.021775 0.0668766 0.0128311 1 0
+0.161145 0.0142864 0.0849849 0.00957009 1 0
+0.16531 0.0124429 0.0443094 0.0124479 1 0
+0.0225446 0.0474814 0.0663094 0.0105236 1 0
+0.0363874 0.056185 0.0541821 0.00983428 1 0
+0.365501 0.08116 0.123471 0.00644773 1 0
+0.385763 0.0960578 0.128605 0.00781636 1 0
+0.0139599 0.147592 0.164164 0.0119845 1 0
+0.0193222 0.126877 0.155769 0.0110009 1 0
+0.0212865 0.132071 0.173446 0.00752773 1 0
+0.00730761 0.117082 0.165563 0.00740949 1 0
+0.355834 0.0185177 0.191414 0.00859597 1 0
+0.348607 0.0383027 0.189035 0.0111529 1 0
+0.132639 0.191841 0.11779 0.00827679 1 0
+0.131246 0.18865 0.14727 0.0116651 1 0
+0.116957 0.175433 0.141497 0.00846987 1 0
+0.393127 0.106986 0.048055 0.0069068 1 0
+0.386686 0.0899624 0.0516342 0.00902786 1 0
+0.394727 0.112683 0.030698 0.00538644 1 0
+0.387084 0.104472 0.0346597 0.00655158 1 0
+0.345148 0.184789 0.0466062 0.0120454 1 0
+0.356736 0.19091 0.0990343 0.0093597 1 0
+0.127682 0.00939457 0.0200367 0.00940051 1 0
+0.132097 0.0106245 0.0400132 0.0108593 1 0
+0.114843 0.0126578 0.0419875 0.00632081 1 0
+0.116248 0.014684 0.0122303 0.00542048 1 0
+0.170733 0.133505 0.170743 0.00875461 1 0
+0.218872 0.06169 0.160269 0.0125913 1 0
+0.246232 0.0513181 0.190082 0.0100493 1 0
+0.143967 0.127614 0.0582512 0.0136594 1 0
+0.301316 0.0589064 0.0296002 0.0140002 1 0
+0.305269 0.053935 0.0508793 0.00820659 1 0
+0.306264 0.0475953 0.00980291 0.00981875 1 0
+0.0837573 0.0439635 0.0525451 0.00697184 1 0
+0.0834765 0.0514769 0.0414608 0.00642183 1 0
+0.076722 0.0672725 0.0328524 0.0127936 1 0
+0.0658256 0.110332 0.0584587 0.013466 1 0
+0.0942477 0.102218 0.0133943 0.0136546 1 0
+0.225715 0.148708 0.162646 0.00924061 1 0
+0.221432 0.176832 0.188792 0.00785824 1 0
+0.348751 0.0206444 0.0108774 0.0108922 1 0
+0.354084 0.00754641 0.0149245 0.00773943 1 0
+0.16887 0.150891 0.0104275 0.0104412 1 0
+0.184389 0.138255 0.0194275 0.0122844 1 0
+0.170477 0.0770973 0.185021 0.0141745 1 0
+0.179787 0.0643972 0.161671 0.0126068 1 0
+0.178077 0.0813081 0.167517 0.00536716 1 0
+0.171908 0.0530528 0.187151 0.0100066 1 0
+0.0215599 0.00758453 0.0470124 0.00758974 1 0
+0.295725 0.0372936 0.0668884 0.013429 1 0
+0.257832 0.038671 0.0651608 0.00964449 1 0
+0.375459 0.123248 0.09362 0.0112366 1 0
+0.378156 0.157402 0.0583142 0.0146607 1 0
+0.361717 0.112088 0.0437565 0.0134527 1 0
+0.354214 0.0947525 0.0274061 0.0115302 1 0
+0.343699 0.127706 0.046363 0.0105342 1 0
+0.375771 0.093816 0.0209501 0.0109917 1 0
+0.387431 0.179191 0.116619 0.012603 1 0
+0.38242 0.153218 0.1108 0.0133994 1 0
+0.378499 0.187674 0.094636 0.0118575 1 0
+0.231756 0.00691231 0.151275 0.00691899 1 0
+0.241288 0.00968751 0.13274 0.0100394 1 0
+0.224111 0.0114066 0.159899 0.00626691 1 0
+0.0229603 0.185685 0.00743012 0.00747811 1 0
+0.037411 0.185073 0.00917614 0.00771211 1 0
+0.0152978 0.169501 0.00788204 0.0080064 1 0
+0.365584 0.0584976 0.015229 0.0101092 1 0
+0.377674 0.064919 0.0295789 0.00972316 1 0
+0.371345 0.0763962 0.0124227 0.00890194 1 0
+0.00607016 0.113737 0.183234 0.00610793 1 0
+0.0177482 0.106556 0.166576 0.00753866 1 0
+0.0173924 0.101126 0.188401 0.0116203 1 0
+0.320855 0.0376444 0.0116917 0.00734364 1 0
+0.165208 0.137354 0.0720785 0.0134923 1 0
+0.144079 0.135267 0.0312902 0.014367 1 0
+0.165475 0.13543 0.0466744 0.011986 1 0
+0.0745623 0.00883203 0.149173 0.00893237 1 0
+0.0535073 0.0116626 0.173585 0.00612253 1 0
+0.130865 0.0425638 0.145565 0.0127738 1 0
+0.0174239 0.190396 0.172379 0.00967554 1 0
+0.0419233 0.185353 0.185353 0.0108033 1 0
+0.36587 0.143274 0.129383 0.0133985 1 0
+0.38734 0.15923 0.145213 0.0112514 1 0
+0.250941 0.192171 0.0787188 0.00784625 1 0
+0.240426 0.178773 0.0903638 0.0123165 1 0
+0.26236 0.182441 0.0879309 0.0100541 1 0
+0.115378 0.0852737 0.0465421 0.0127064 1 0
+0.135265 0.0258461 0.0546071 0.0104916 1 0
+0.289878 0.0375387 0.0857934 0.00636108 1 0
+0.294878 0.0501245 0.0832888 0.00741146 1 0
+0.296897 0.0125443 0.0631942 0.0116219 1 0
+0.0319177 0.15258 0.137429 0.0111748 1 0
+0.0461303 0.13768 0.146997 0.011531 1 0
+0.0124959 0.159635 0.144886 0.0107932 1 0
+0.121417 0.0316553 0.0691049 0.0103816 1 0
+0.142505 0.0474971 0.0650048 0.0125079 1 0
+0.136531 0.0567854 0.0846523 0.0100307 1 0
+0.00947917 0.146002 0.0490215 0.00949669 1 0
+0.0189339 0.126393 0.0464796 0.0120048 1 0
+0.0138137 0.140396 0.0740045 0.0136698 1 0
+0.211644 0.133981 0.118885 0.00946723 1 0
+0.203399 0.154344 0.1416 0.0103861 1 0
+0.37496 0.0650114 0.17113 0.0110079 1 0
+0.368208 0.0574165 0.187213 0.00801593 1 0
+0.0599565 0.140497 0.16553 0.0117625 1 0
+0.0649543 0.135088 0.147747 0.00748528 1 0
+0.0507607 0.119256 0.166314 0.0113964 1 0
+0.0611788 0.126711 0.156142 0.00496128 1 0
+0.071849 0.165862 0.0484098 0.00783746 1 0
+0.232227 0.15496 0.0381257 0.0051099 1 0
+0.26539 0.153878 0.0308856 0.00655751 1 0
+0.254226 0.148364 0.010579 0.00954279 1 0
+0.0872335 0.0210381 0.0948407 0.0114235 1 0
+0.105355 0.0511996 0.109046 0.0136553 1 0
+0.116522 0.0454841 0.0897557 0.00935573 1 0
+0.1186 0.0229352 0.0978742 0.0144792 1 0
+0.114751 0.0094733 0.178 0.00947644 1 0
+0.124719 0.0129115 0.190021 0.00698671 1 0
+0.307064 0.0130512 0.042066 0.0118309 1 0
+0.31323 0.00918472 0.0581303 0.00580519 1 0
+0.211591 0.0479259 0.138481 0.0141896 1 0
+0.192181 0.0566818 0.146392 0.00852602 1 0
+0.106678 0.190419 0.0861648 0.00958831 1 0
+0.0908359 0.178847 0.108707 0.0130443 1 0
+0.111001 0.188553 0.106954 0.00940378 1 0
+0.0909946 0.179291 0.086244 0.00942362 1 0
+0.134588 0.0840325 0.0312592 0.0118727 1 0
+0.12406 0.109313 0.00937685 0.00950764 1 0
+0.152886 0.0799858 0.0459999 0.0119702 1 0
+0.162111 0.101123 0.0443798 0.0111489 1 0
+0.367244 0.0678647 0.0600582 0.00817559 1 0
+0.379698 0.0622769 0.0475206 0.00852458 1 0
+0.382411 0.0656188 0.0628647 0.00741194 1 0
+0.00530947 0.148284 0.152208 0.00533782 1 0
+0.288341 0.189851 0.092671 0.0101512 1 0
+0.309853 0.189503 0.10137 0.0106376 1 0
+0.302921 0.179146 0.0872126 0.00822421 1 0
+0.296218 0.186488 0.0765203 0.00637589 1 0
+0.12987 0.0269885 0.191541 0.00851021 1 0
+0.155532 0.0360994 0.188404 0.00782845 1 0
+0.0410591 0.123946 0.0199892 0.0120594 1 0
+0.0498383 0.139312 0.0286472 0.00764205 1 0
+0.031696 0.141924 0.030251 0.01066 1 0
+0.0422405 0.140611 0.0091657 0.00922523 1 0
+0.322469 0.0178805 0.146835 0.00563141 1 0
+0.353699 0.0281999 0.149582 0.011231 1 0
+0.393307 0.0473753 0.0129008 0.0067172 1 0
+0.39101 0.0521887 0.0335625 0.00922384 1 0
+0.387535 0.0310431 0.0114009 0.00871386 1 0
+0.352823 0.136375 0.117279 0.00568851 1 0
+0.371019 0.129497 0.146528 0.00919033 1 0
+0.23975 0.193302 0.0389499 0.00670009 1 0
+0.21322 0.183876 0.0473552 0.012344 1 0
+0.290996 0.0840484 0.162816 0.0136415 1 0
+0.325332 0.0739599 0.153491 0.00837755 1 0
+0.216003 0.193165 0.107949 0.00683835 1 0
+0.208824 0.186868 0.0957084 0.0088923 1 0
+0.0847779 0.120989 0.0918488 0.0140475 1 0
+0.345015 0.130383 0.172191 0.0143434 1 0
+0.312653 0.0320914 0.00504478 0.00513512 1 0
+0.160375 0.0435024 0.012158 0.0121629 1 0
+0.167644 0.0655224 0.0186183 0.0113927 1 0
+0.153084 0.0234026 0.0132979 0.00819621 1 0
+0.165403 0.190889 0.0441825 0.00911561 1 0
+0.180966 0.183623 0.0569599 0.011283 1 0
+0.0703895 0.0374811 0.129595 0.0136996 1 0
+0.0388652 0.0422696 0.134182 0.0102187 1 0
+0.392038 0.0743685 0.0348702 0.00826804 1 0
+0.196846 0.143226 0.0628502 0.0136246 1 0
+0.013777 0.012867 0.0881742 0.0129082 1 0
+0.0326336 0.0202219 0.096746 0.00864434 1 0
+0.0196705 0.0323884 0.0967388 0.00913384 1 0
+0.0212244 0.0499256 0.104219 0.00999515 1 0
+0.0168423 0.0335269 0.131134 0.0113103 1 0
+0.36748 0.185207 0.190326 0.00919273 1 0
+0.352104 0.181131 0.189058 0.00676397 1 0
+0.356398 0.190294 0.182063 0.00553682 1 0
+0.189141 0.142776 0.181993 0.0147268 1 0
+0.209487 0.139272 0.155345 0.0109017 1 0
+0.0562426 0.155027 0.00555774 0.005627 1 0
+0.107317 0.0430345 0.132072 0.0108538 1 0
+0.296461 0.0860378 0.187312 0.0126963 1 0
+0.277728 0.103706 0.177365 0.0141811 1 0
+0.299084 0.0636102 0.162844 0.00833912 1 0
+0.385162 0.120121 0.157934 0.0112558 1 0
+0.37038 0.132965 0.168166 0.0108392 1 0
+0.385632 0.140025 0.158284 0.00865763 1 0
+0.0482981 0.19129 0.0831739 0.00916622 1 0
+0.0612524 0.15544 0.0821634 0.0139729 1 0
+0.0367202 0.15469 0.0757918 0.0113843 1 0
+0.161624 0.0198379 0.103776 0.0100296 1 0
+0.15685 0.0402778 0.0923543 0.0138665 1 0
+0.15098 0.0378477 0.137264 0.00949224 1 0
+0.149986 0.0504614 0.149848 0.0083531 1 0
+0.169736 0.0424577 0.135879 0.00987065 1 0
+0.345062 0.0342228 0.0782216 0.00975469 1 0
+0.33098 0.0194967 0.0588677 0.00986929 1 0
+0.327716 0.0304708 0.0735557 0.00859503 1 0
+0.246079 0.154124 0.191715 0.00829122 1 0
+0.257018 0.141833 0.182154 0.0109571 1 0
+0.0909553 0.0358688 0.131503 0.00701734 1 0
+0.0721281 0.060405 0.134812 0.00987482 1 0
+0.129253 0.179824 0.102862 0.0112379 1 0
+0.164382 0.176216 0.10136 0.0137664 1 0
+0.140089 0.149112 0.0760627 0.0145271 1 0
+0.140634 0.172744 0.0614462 0.013265 1 0
+0.180291 0.151694 0.0809075 0.00911506 1 0
+0.386181 0.0416112 0.0904011 0.00841162 1 0
+0.0516717 0.0525541 0.184848 0.0140982 1 0
+0.0722764 0.0624285 0.179007 0.00948518 1 0
+0.0348474 0.0734227 0.181379 0.0129312 1 0
+0.0506055 0.100507 0.0440875 0.00965794 1 0
+0.0706543 0.0913602 0.0671509 0.00795337 1 0
+0.0816734 0.117759 0.0433435 0.00965938 1 0
+0.0483573 0.188757 0.112117 0.0111442 1 0
+0.00970976 0.0470906 0.0128571 0.00973229 1 0
+0.0123456 0.0550317 0.0325287 0.00990198 1 0
+0.00980577 0.0280851 0.0111555 0.00741917 1 0
+0.2282 0.155122 0.0560451 0.00882879 1 0
+0.213943 0.16944 0.0663647 0.00676659 1 0
+0.232681 0.136413 0.112038 0.0120468 1 0
+0.243686 0.114589 0.120711 0.0138871 1 0
+0.0564921 0.0924674 0.105065 0.0122932 1 0
+0.0498239 0.190957 0.0181107 0.00905355 1 0
+0.238506 0.150955 0.00679354 0.00687541 1 0
+0.106056 0.00804251 0.0861211 0.0080478 1 0
+0.0994817 0.0132035 0.11266 0.0115751 1 0
+0.142361 0.143467 0.102546 0.0126466 1 0
+0.346896 0.0103949 0.0502715 0.0104187 1 0
+0.337578 0.00615697 0.0647539 0.00632648 1 0
+0.365415 0.0149719 0.0720151 0.008988 1 0
+0.0131234 0.045257 0.15088 0.0119557 1 0
+0.0127507 0.0623101 0.141517 0.00750223 1 0
+0.304444 0.185815 0.0513571 0.0136452 1 0
+0.281936 0.176296 0.0604795 0.0124403 1 0
+0.179508 0.0471838 0.102471 0.0118902 1 0
+0.178001 0.0538737 0.0770514 0.0144384 1 0
+0.187521 0.0410831 0.0886018 0.00525026 1 0
+0.174998 0.0847604 0.0147851 0.00955679 1 0
+0.290064 0.084341 0.0344495 0.0142315 1 0
+0.290002 0.0844431 0.0611749 0.0124942 1 0
+0.376134 0.0463674 0.191537 0.00625324 1 0
+0.0513784 0.191572 0.152027 0.00853012 1 0
+0.0678098 0.176773 0.12328 0.0142848 1 0
+0.344998 0.153703 0.184615 0.0120791 1 0
+0.362316 0.140492 0.185516 0.00972086 1 0
+0.18804 0.169771 0.146387 0.0119031 1 0
+0.308172 0.180009 0.1575 0.00797814 1 0
+0.308458 0.182891 0.125762 0.0146732 1 0
+0.323046 0.0647415 0.0612375 0.0101253 1 0
+0.314683 0.0935818 0.0994618 0.0142316 1 0
+0.30898 0.0979252 0.0495522 0.0135253 1 0
+0.347456 0.0862242 0.0563558 0.0124924 1 0
+0.139757 0.0240381 0.124471 0.0124244 1 0
+0.119083 0.0265038 0.135206 0.00967716 1 0
+0.131047 0.00950555 0.13885 0.00995462 1 0
+0.390467 0.0463886 0.154038 0.00872832 1 0
+0.379006 0.0613228 0.150385 0.0104481 1 0
+0.382075 0.0448445 0.00657943 0.00658226 1 0
+0.22257 0.14715 0.140927 0.0101008 1 0
+0.283228 0.192355 0.18211 0.00772919 1 0
+0.251721 0.184881 0.157569 0.00671726 1 0
+0.272656 0.0531788 0.149365 0.0076595 1 0
+0.209222 0.0940953 0.0136833 0.00589358 1 0
+0.199062 0.0655167 0.031442 0.0115316 1 0
+0.193577 0.0745342 0.0173387 0.00608358 1 0
+0.132108 0.179284 0.00894548 0.0089664 1 0
+0.139169 0.152455 0.0124863 0.0115774 1 0
+0.226438 0.0840168 0.00791548 0.00792328 1 0
+0.231146 0.0678308 0.0205716 0.0117466 1 0
+0.242263 0.0852114 0.0147031 0.00970349 1 0
+0.151372 0.0795723 0.192909 0.00712179 1 0
+0.0541621 0.009468 0.0191585 0.00949259 1 0
+0.0663788 0.0137363 0.0309331 0.00688294 1 0
+0.0387704 0.0148417 0.0112337 0.00865432 1 0
+0.353335 0.0998197 0.0757791 0.0119344 1 0
+0.362165 0.119893 0.187596 0.010984 1 0
+0.0728923 0.0772205 0.190884 0.00967805 1 0
+0.288715 0.00701357 0.0926238 0.00701559 1 0
+0.0506495 0.0549668 0.0138225 0.0138284 1 0
+0.0708841 0.0519034 0.0203875 0.00783806 1 0
+0.0365921 0.0763735 0.0199077 0.0125531 1 0
+0.365386 0.0868869 0.0713017 0.00630041 1 0
+0.054346 0.0732162 0.0601268 0.0105279 1 0
+0.05443 0.0886831 0.0309235 0.00844493 1 0
+0.057257 0.0690964 0.0416356 0.00863903 1 0
+0.364393 0.0328048 0.0626499 0.0111804 1 0
+0.262206 0.12561 0.144205 0.0136869 1 0
+0.0690483 0.193069 0.111205 0.00699695 1 0
+0.0517508 0.17195 0.111857 0.00600386 1 0
+0.0317408 0.00808948 0.183343 0.00727501 1 0
+0.0448126 0.132295 0.0726416 0.012636 1 0
+0.0105125 0.0861309 0.00983185 0.0100961 1 0
+0.0124964 0.104975 0.0414812 0.0109114 1 0
+0.00883058 0.0853637 0.0392147 0.00906131 1 0
+0.0142786 0.1082 0.011511 0.0115812 1 0
+0.0377934 0.0960012 0.182614 0.00987213 1 0
+0.0166288 0.068417 0.167964 0.0102407 1 0
+0.306593 0.0605586 0.0743283 0.0106548 1 0
+0.0219073 0.0146401 0.00836378 0.00841415 1 0
+0.00810007 0.0434991 0.0724525 0.00811193 1 0
+0.0221052 0.0452536 0.0887114 0.00622461 1 0
+0.0164182 0.0888751 0.117519 0.0081728 1 0
+0.0358909 0.0913123 0.129594 0.00726122 1 0
+0.0149256 0.101493 0.132387 0.0113841 1 0
+0.0064834 0.0180904 0.106134 0.00649126 1 0
+0.327023 0.0779322 0.11252 0.00959491 1 0
+0.0792518 0.136865 0.0706925 0.0129743 1 0
+0.0720758 0.152592 0.0579455 0.00850425 1 0
+0.0861308 0.159992 0.0801141 0.0114014 1 0
+0.103346 0.171842 0.0714987 0.0112036 1 0
+0.3503 0.125144 0.0244213 0.0125217 1 0
+0.154271 0.00658848 0.154326 0.00659142 1 0
+0.145609 0.0129631 0.162101 0.00672077 1 0
+0.105485 0.124246 0.0203198 0.0118756 1 0
+0.385248 0.0794694 0.158897 0.0105453 1 0
+0.372667 0.0773341 0.146586 0.0071862 1 0
+0.343365 0.0431501 0.146365 0.00722527 1 0
+0.063767 0.142112 0.0487261 0.00773984 1 0
+0.0938688 0.184927 0.0594656 0.00894189 1 0
+0.152705 0.0619648 0.0546286 0.00801086 1 0
+0.39375 0.146995 0.0492081 0.00626239 1 0
+0.383045 0.130686 0.0581556 0.0124989 1 0
+0.167215 0.0563811 0.117252 0.00942078 1 0
+0.171844 0.0640991 0.131713 0.0076115 1 0
+0.152281 0.0794524 0.0082892 0.00831509 1 0
+0.175193 0.0796253 0.0358228 0.0120995 1 0
+0.140635 0.090329 0.0145581 0.00697231 1 0
+0.286716 0.16251 0.0756719 0.00862372 1 0
+0.248275 0.0833534 0.144199 0.0122316 1 0
+0.126338 0.0206836 0.00730592 0.00730955 1 0
+0.0404216 0.100268 0.0163574 0.0119049 1 0
+0.0378094 0.0911662 0.0329799 0.00722532 1 0
+0.235829 0.0443444 0.0110074 0.0110097 1 0
+0.248735 0.0314925 0.0141296 0.00612448 1 0
+0.208742 0.178494 0.0101585 0.0101662 1 0
+0.196251 0.189903 0.0181036 0.0101298 1 0
+0.0887479 0.0103276 0.0365731 0.0103767 1 0
+0.0975155 0.00563253 0.0489598 0.0056578 1 0
+0.0158431 0.106378 0.0939756 0.0136557 1 0
+0.0502105 0.113761 0.109082 0.0102676 1 0
+0.0436462 0.104431 0.0946859 0.00809977 1 0
+0.202061 0.187687 0.0791138 0.00904632 1 0
+0.201503 0.0132524 0.0433349 0.0106019 1 0
+0.191637 0.0115332 0.178539 0.0115424 1 0
+0.204607 0.0138582 0.167907 0.00543025 1 0
+0.194779 0.0189619 0.192232 0.00777998 1 0
+0.168729 0.189848 0.0818483 0.010209 1 0
+0.129854 0.190782 0.0210644 0.00923197 1 0
+0.26258 0.110366 0.161066 0.00904576 1 0
+0.262803 0.106419 0.146864 0.00569588 1 0
+0.36782 0.188057 0.0582292 0.0121309 1 0
+0.363468 0.18552 0.0857521 0.00573485 1 0
+0.355917 0.173687 0.0582736 0.00732894 1 0
+0.14095 0.00809392 0.111729 0.00810161 1 0
+0.139403 0.0520251 0.158761 0.00557152 1 0
+0.391256 0.0859491 0.00909444 0.00878231 1 0
+0.388958 0.10046 0.0129862 0.00578511 1 0
+0.229216 0.108846 0.136684 0.00841708 1 0
+0.252786 0.0911588 0.168619 0.0137994 1 0
+0.0620011 0.109176 0.0885769 0.0118184 1 0
+0.341706 0.111231 0.188779 0.0112243 1 0
+0.035336 0.135001 0.185697 0.0113418 1 0
+0.0334853 0.114705 0.182273 0.00932439 1 0
+0.0245974 0.185509 0.191853 0.00818761 1 0
+0.204741 0.0577915 0.0675464 0.0142103 1 0
+0.206424 0.179996 0.192712 0.00729287 1 0
+0.370418 0.00789946 0.0151283 0.00793645 1 0
+0.297334 0.10541 0.0705256 0.0116052 1 0
+0.289761 0.133647 0.0548894 0.0134367 1 0
+0.26159 0.111988 0.191384 0.00862492 1 0
+0.378576 0.0868718 0.00681008 0.00500929 1 0
+0.0298629 0.0738766 0.05118 0.00925954 1 0
+0.197723 0.039046 0.0100464 0.01024 1 0
+0.273033 0.0212788 0.192444 0.00756068 1 0
+0.271806 0.0218552 0.0091431 0.00915288 1 0
+0.282277 0.0111852 0.0121297 0.00665603 1 0
+0.0912619 0.1637 0.00873324 0.00896896 1 0
+0.187463 0.109838 0.010696 0.0107031 1 0
+0.211959 0.150836 0.0463463 0.0100119 1 0
+0.276616 0.00726373 0.0208333 0.00726634 1 0
+0.269059 0.00801338 0.0365432 0.00799643 1 0
+0.350892 0.112417 0.0889808 0.00647615 1 0
+0.382318 0.104857 0.167515 0.00698831 1 0
+0.391578 0.112555 0.1718 0.00579373 1 0
+0.0383565 0.118252 0.13661 0.0118309 1 0
+0.347168 0.106342 0.0103183 0.0103355 1 0
+0.0531425 0.147131 0.189814 0.0101934 1 0
+0.0600396 0.165464 0.190941 0.00934447 1 0
+0.154216 0.190864 0.116273 0.00922074 1 0
+0.179424 0.193204 0.0949906 0.00683883 1 0
+0.212951 0.124659 0.145298 0.00716684 1 0
+0.204603 0.0185068 0.00721977 0.0072496 1 0
+0.188898 0.0204287 0.0133955 0.00869768 1 0
+0.390733 0.0440608 0.0726776 0.00928055 1 0
+0.375987 0.0444276 0.0718798 0.00765274 1 0
+0.369288 0.114453 0.0681617 0.0110147 1 0
+0.0346381 0.104006 0.194264 0.0058219 1 0
+0.276533 0.149359 0.0667189 0.0102655 1 0
+0.215694 0.192892 0.0133808 0.00725409 1 0
+0.240383 0.0400749 0.0586261 0.00904036 1 0
+0.0898222 0.0384868 0.00728664 0.00748467 1 0
+0.0845856 0.0737115 0.0110843 0.0113386 1 0
+0.315825 0.189883 0.0295578 0.0104679 1 0
+0.37166 0.193887 0.0984797 0.00613497 1 0
+0.0122528 0.0828442 0.152275 0.0115181 1 0
+0.0158326 0.0667114 0.152824 0.00501628 1 0
+0.227332 0.0458339 0.193588 0.00644537 1 0
+0.0277894 0.19127 0.0808528 0.00878933 1 0
+0.392151 0.0865789 0.141861 0.00786235 1 0
+0.168763 0.151455 0.190798 0.0092146 1 0
+0.204381 0.00966975 0.0216306 0.00967165 1 0
+0.0243094 0.150481 0.0968196 0.013393 1 0
+0.0336358 0.0203736 0.0661439 0.00692063 1 0
+0.361559 0.0637907 0.145559 0.00702253 1 0
+0.0619236 0.074084 0.16276 0.00694743 1 0
+0.0382627 0.160366 0.0558773 0.00562937 1 0
+0.0275376 0.0718734 0.0836242 0.00512013 1 0
+0.228784 0.0149795 0.112927 0.0135174 1 0
+0.395161 0.0898583 0.106136 0.00496068 1 0
+0.25985 0.18758 0.0639603 0.00819434 1 0
+0.0299818 0.0347722 0.183721 0.0061519 1 0
+0.21549 0.186948 0.122246 0.00749354 1 0
+0.361217 0.177099 0.150076 0.0109281 1 0
+0.067308 0.149657 0.0302269 0.00524767 1 0
+0.0991941 0.0200913 0.0677805 0.00556428 1 0
+0.367458 0.0270138 0.0999109 0.00656395 1 0
+0.382911 0.0385284 0.126089 0.00554315 1 0
+0.15259 0.102064 0.170509 0.0103504 1 0
+0.204226 0.159285 0.105587 0.00643247 1 0
+0.106211 0.0611613 0.0650592 0.00502375 1 0
+0.200173 0.191619 0.170332 0.00501194 1 0
+0.271079 0.0587953 0.0365451 0.00707767 1 0
+0.311446 0.0565969 0.10969 0.0084572 1 0
+0.375804 0.0736045 0.0865151 0.00564715 1 0
+0.374788 0.00974941 0.169654 0.00494595 1 0
+0.307617 0.0594108 0.141521 0.0052979 1 0
+0.282294 0.0255418 0.127101 0.00550773 1 0
+0.270122 0.0111254 0.154309 0.0114169 1 0
+0.278578 0.161938 0.192902 0.00495567 1 0
+0.185316 0.109793 0.154663 0.00911126 1 0
+0.293049 0.024156 0.145083 0.00759668 1 0
+0.0265287 0.096412 0.0693108 0.00547116 1 0
+0.241683 0.0191683 0.0860944 0.0082177 1 0
+0.368118 0.0918938 0.184249 0.00616362 1 0
+0.0420928 0.0663928 0.129828 0.00604567 1 0
+0.272006 0.172145 0.0138445 0.00574495 1 0
+0.358694 0.104248 0.124013 0.00698951 1 0
+0.172924 0.0295833 0.0470859 0.00846439 1 0
+0.0390121 0.0491533 0.0682909 0.00614668 1 0
+0.375885 0.0784083 0.117374 0.00590407 1 0
+0.129273 0.172145 0.145903 0.00501788 1 0
+0.391118 0.093988 0.0385701 0.00534297 1 0
+0.105125 0.00750422 0.0121776 0.0078184 1 0
+0.245577 0.0643043 0.163627 0.0144505 1 0
+0.133484 0.113119 0.0700113 0.00774841 1 0
+0.292684 0.0677731 0.0443244 0.00523317 1 0
+0.0766266 0.0592614 0.0541753 0.00998487 1 0
+0.0920868 0.096747 0.0403876 0.0139767 1 0
+0.355631 0.0369208 0.00910917 0.00678582 1 0
+0.187383 0.152005 0.00844206 0.00556809 1 0
+0.18167 0.0620785 0.179408 0.00537936 1 0
+0.0159403 0.00601645 0.0343362 0.00609946 1 0
+0.273759 0.040202 0.0598429 0.00721707 1 0
+0.383771 0.152815 0.084718 0.0127205 1 0
+0.365547 0.1106 0.0219998 0.00868864 1 0
+0.382057 0.169898 0.0993032 0.0068623 1 0
+0.381343 0.0643481 0.0134882 0.00679037 1 0
+0.0639149 0.00754483 0.168317 0.00764772 1 0
+0.0255336 0.192066 0.158187 0.00553389 1 0
+0.373082 0.165629 0.128448 0.0101101 1 0
+0.252547 0.191844 0.100086 0.00835748 1 0
+0.0965972 0.0845669 0.0638608 0.0128504 1 0
+0.14744 0.0175978 0.0433787 0.00617132 1 0
+0.284139 0.0201847 0.081076 0.0116354 1 0
+0.0265165 0.16914 0.138529 0.00627887 1 0
+0.137475 0.0306754 0.0699326 0.00572817 1 0
+0.0227494 0.144802 0.0482607 0.00688008 1 0
+0.379247 0.0677962 0.188607 0.00720059 1 0
+0.261495 0.142099 0.0245236 0.00738447 1 0
+0.106169 0.0378184 0.09608 0.00499535 1 0
+0.310725 0.0197461 0.0571708 0.00509167 1 0
+0.19151 0.0413327 0.142497 0.00732389 1 0
+0.139872 0.105686 0.0266184 0.0108939 1 0
+0.373959 0.0564584 0.0614421 0.00513291 1 0
+0.146353 0.0271243 0.18695 0.00509141 1 0
+0.0298808 0.136673 0.014959 0.0056102 1 0
+0.340704 0.0146383 0.141235 0.00932259 1 0
+0.366728 0.120761 0.130942 0.00918468 1 0
+0.221367 0.186752 0.102372 0.00531139 1 0
+0.0996498 0.0980634 0.092229 0.0132821 1 0
+0.170107 0.0277319 0.0112926 0.00509826 1 0
+0.168886 0.177023 0.0442298 0.0074665 1 0
+0.0497445 0.0241692 0.132148 0.0109974 1 0
+0.389449 0.0608805 0.0214952 0.00511992 1 0
+0.188863 0.129071 0.0421877 0.012663 1 0
+0.168 0.0388015 0.189779 0.00500258 1 0
+0.0361613 0.0111184 0.0808431 0.0100163 1 0
+0.0330297 0.027338 0.131563 0.00602515 1 0
+0.380836 0.174758 0.191983 0.00805852 1 0
+0.191985 0.140342 0.160274 0.0073124 1 0
+0.0475619 0.155101 0.0135935 0.00636649 1 0
+0.089078 0.0771357 0.130195 0.0143848 1 0
+0.386624 0.131859 0.169841 0.00552843 1 0
+0.163404 0.0272597 0.139457 0.00697779 1 0
+0.317549 0.0334651 0.0588785 0.00950924 1 0
+0.251437 0.157781 0.182183 0.00593932 1 0
+0.0862738 0.0444398 0.144012 0.00885247 1 0
+0.144082 0.165439 0.105567 0.0095987 1 0
+0.162451 0.163006 0.0706732 0.0123462 1 0
+0.377191 0.0348654 0.0993471 0.00595367 1 0
+0.0292483 0.0558257 0.19181 0.00845751 1 0
+0.0731428 0.104323 0.0409557 0.00643389 1 0
+0.0198718 0.17265 0.11226 0.0139851 1 0
+0.236318 0.163423 0.0677451 0.00765444 1 0
+0.229331 0.119425 0.108368 0.00565285 1 0
+0.0618705 0.108585 0.148216 0.00855224 1 0
+0.0472707 0.190341 0.0339418 0.00579053 1 0
+0.252217 0.157224 0.00623357 0.00624238 1 0
+0.0962091 0.0159385 0.081255 0.00563935 1 0
+0.00817874 0.0253714 0.146558 0.0083663 1 0
+0.291538 0.171609 0.0445923 0.00670552 1 0
+0.192874 0.0346911 0.0760032 0.00985719 1 0
+0.186361 0.103634 0.0473216 0.0134073 1 0
+0.0741433 0.188066 0.14553 0.0114578 1 0
+0.337023 0.158487 0.194499 0.00550687 1 0
+0.314179 0.0840405 0.072824 0.014068 1 0
+0.133116 0.0246177 0.141414 0.00578305 1 0
+0.394011 0.0446063 0.149989 0.00599448 1 0
+0.37493 0.0385825 0.0159213 0.0066536 1 0
+0.22654 0.143138 0.126695 0.00520927 1 0
+0.268222 0.192866 0.175692 0.00715241 1 0
+0.283563 0.0645575 0.16196 0.00723602 1 0
+0.212596 0.0829564 0.0372903 0.0113053 1 0
+0.123976 0.161412 0.0117908 0.00607324 1 0
+0.162715 0.0962505 0.18281 0.00660952 1 0
+0.0501585 0.00739969 0.0403256 0.00761423 1 0
+0.338479 0.102953 0.0632961 0.00772136 1 0
+0.210651 0.0578669 0.112459 0.0136824 1 0
+0.0662949 0.0647975 0.151469 0.0083119 1 0
+0.289129 0.0209543 0.0975938 0.00563666 1 0
+0.031921 0.0468844 0.0111795 0.00631896 1 0
+0.374995 0.0812476 0.0630345 0.00757385 1 0
+0.240684 0.182445 0.153056 0.00545292 1 0
+0.052213 0.0903392 0.0549818 0.00533031 1 0
+0.371036 0.0137309 0.0852819 0.00547397 1 0
+0.286823 0.129083 0.131978 0.0140184 1 0
+0.063446 0.182761 0.102616 0.0076676 1 0
+0.020394 0.00826111 0.173178 0.00829914 1 0
+0.0312729 0.139892 0.0824798 0.00574432 1 0
+0.00863994 0.083511 0.0249144 0.00519484 1 0
+0.0488243 0.0851716 0.190139 0.00732035 1 0
+0.021921 0.0320327 0.0063651 0.00619372 1 0
+0.0320102 0.0409486 0.0967865 0.0058844 1 0
+0.319167 0.0835592 0.143631 0.00670174 1 0
+0.0782541 0.146147 0.0872911 0.00606958 1 0
+0.225196 0.0554171 0.125535 0.00602916 1 0
+0.128068 0.159785 0.0950072 0.0103182 1 0
+0.335086 0.144369 0.0208107 0.0122591 1 0
+0.309413 0.0449647 0.0811385 0.00659358 1 0
+0.139213 0.00758794 0.153068 0.00558374 1 0
+0.112588 0.0974011 0.00905504 0.00553724 1 0
+0.354749 0.0447492 0.15183 0.00550329 1 0
+0.0586951 0.146078 0.0365589 0.00602574 1 0
+0.250268 0.0762195 0.0341256 0.0131473 1 0
+0.0961069 0.193018 0.0469953 0.00699127 1 0
+0.144597 0.0535251 0.0484729 0.00521266 1 0
+0.383755 0.143112 0.0443475 0.00609051 1 0
+0.177372 0.0558999 0.142282 0.0068624 1 0
+0.149436 0.0717535 0.0217132 0.00809978 1 0
+0.0869359 0.175095 0.0724519 0.00555306 1 0
+0.279529 0.172596 0.089291 0.00978439 1 0
+0.250355 0.0597187 0.137615 0.0123911 1 0
+0.119589 0.0328563 0.0105656 0.00746041 1 0
+0.133067 0.163118 0.0460139 0.006435 1 0
+0.230063 0.025654 0.00788834 0.00633899 1 0
+0.0355784 0.114217 0.101586 0.00617914 1 0
+0.217434 0.184185 0.0825201 0.00708441 1 0
+0.335162 0.0848649 0.0984859 0.0080474 1 0
+0.113069 0.114581 0.144575 0.0147412 1 0
+0.174078 0.166055 0.0859442 0.00708755 1 0
+0.274922 0.125237 0.164978 0.0106713 1 0
+0.346199 0.184401 0.0697786 0.0111541 1 0
+0.142237 0.0228484 0.102594 0.00962491 1 0
+0.14345 0.0678292 0.0349685 0.00696443 1 0
+0.394852 0.0819298 0.0230254 0.00518911 1 0
+0.232323 0.0944074 0.142046 0.0072955 1 0
+0.044562 0.116355 0.0848029 0.00741468 1 0
+0.353889 0.109415 0.17346 0.00846082 1 0
+0.0355702 0.125228 0.171647 0.00577467 1 0
+0.0219492 0.169303 0.194138 0.00592133 1 0
+0.189144 0.0431386 0.0602557 0.00839812 1 0
+0.210267 0.167803 0.187758 0.00653748 1 0
+0.371833 0.0125051 0.0272674 0.00523647 1 0
+0.235904 0.0268693 0.129898 0.00839309 1 0
+0.00800912 0.0936409 0.106956 0.00614546 1 0
+0.152239 0.0664404 0.148093 0.00787896 1 0
+0.0727944 0.116542 0.0759453 0.00635603 1 0
+0.256759 0.110831 0.177046 0.00796748 1 0
+0.0171044 0.142267 0.0374209 0.00560163 1 0
+0.388409 0.15406 0.161688 0.00604898 1 0
+0.212628 0.0445981 0.0184521 0.00840461 1 0
+0.287804 0.0212483 0.00898011 0.00524894 1 0
+0.103648 0.142195 0.00915061 0.00918398 1 0
+0.0249615 0.0944006 0.00999414 0.00581314 1 0
+0.17413 0.101717 0.0223372 0.0090261 1 0
+0.221216 0.134036 0.0650604 0.0125142 1 0
+0.204726 0.070397 0.144764 0.0101323 1 0
+0.283783 0.00667192 0.0360334 0.00686949 1 0
+0.307041 0.163873 0.140303 0.00930808 1 0
+0.372003 0.107226 0.0994053 0.00614495 1 0
+0.0436736 0.10863 0.12283 0.00579659 1 0
+0.34477 0.108323 0.0249005 0.00519196 1 0
+0.0377104 0.15348 0.184693 0.00731607 1 0
+0.121077 0.183774 0.11724 0.0057677 1 0
+0.185975 0.191251 0.0741351 0.00816562 1 0
+0.229029 0.132523 0.15296 0.00991017 1 0
+0.190654 0.0233533 0.00723081 0.00727075 1 0
+0.36508 0.126326 0.0566512 0.0060488 1 0
+0.118158 0.188182 0.158422 0.00502799 1 0
+0.0271665 0.103701 0.1749 0.00535086 1 0
+0.279837 0.149124 0.0515643 0.00524692 1 0
+0.207288 0.192364 0.0321903 0.00772377 1 0
+0.23098 0.0647793 0.0732639 0.0135387 1 0
+0.214176 0.0155511 0.163247 0.00500672 1 0
+0.0209887 0.072175 0.0348169 0.00943272 1 0
+0.0305213 0.134868 0.138194 0.00660834 1 0
+0.0777922 0.0430145 0.0142222 0.0049973 1 0
+0.250382 0.186598 0.0369264 0.00617653 1 0
+0.369015 0.0664313 0.1323 0.00841746 1 0
+0.163825 0.0656479 0.0972373 0.0128942 1 0
+0.0139643 0.101756 0.151244 0.00749925 1 0
+0.105723 0.0334557 0.118016 0.00623026 1 0
+0.0242189 0.0717604 0.155129 0.00504056 1 0
+0.244405 0.0437342 0.178231 0.00539913 1 0
+0.0868532 0.0275435 0.013115 0.00530271 1 0
+0.238417 0.118837 0.138676 0.00530997 1 0
+0.248809 0.0411882 0.0203365 0.00538804 1 0
+0.271743 0.164873 0.0723046 0.00690452 1 0
+0.259549 0.0164941 0.0393869 0.00505907 1 0
+0.0336293 0.184633 0.106557 0.00512952 1 0
+0.0961337 0.069566 0.0259228 0.00794518 1 0
+0.261421 0.0946635 0.0449094 0.0109537 1 0
+0.16721 0.147574 0.178979 0.0079243 1 0
+0.162571 0.0175805 0.15751 0.00737101 1 0
+0.0681521 0.156908 0.15673 0.00858295 1 0
+0.371311 0.188827 0.17645 0.0056506 1 0
+0.382051 0.0326958 0.0660182 0.00679611 1 0
+0.370883 0.097932 0.0722141 0.00607098 1 0
+0.189375 0.0100781 0.0223039 0.00496697 1 0
+0.293977 0.128725 0.155733 0.0107931 1 0
+0.294931 0.106278 0.116439 0.0147434 1 0
+0.319684 0.118009 0.126407 0.0144058 1 0
+0.333114 0.100453 0.142545 0.0129627 1 0
+0.233056 0.0821008 0.185284 0.0135691 1 0
+0.222491 0.107745 0.186574 0.0136897 1 0
+0.205985 0.0856081 0.180974 0.0140664 1 0
+0.209378 0.0980333 0.160304 0.0102888 1 0
+0.0183493 0.171206 0.088728 0.00963997 1 0
+0.0138642 0.130553 0.0946587 0.0092099 1 0
+0.00880729 0.14103 0.109349 0.00910086 1 0
+0.0455904 0.15159 0.109242 0.0112735 1 0
+0.0248175 0.0292809 0.0651985 0.00564902 1 0
+0.051736 0.0417432 0.0745267 0.00867866 1 0
+0.34206 0.0568584 0.130516 0.00768926 1 0
+0.351697 0.0751907 0.157835 0.00494477 1 0
+0.0670896 0.0864491 0.169068 0.00786377 1 0
+0.0512748 0.0963263 0.151133 0.0056313 1 0
+0.0507137 0.0645705 0.163841 0.00779486 1 0
+0.0223355 0.190893 0.0607357 0.00673162 1 0
+0.0467381 0.191243 0.0507055 0.00669401 1 0
+0.299576 0.14876 0.0144156 0.008239 1 0
+0.323826 0.152206 0.0430153 0.00768271 1 0
+0.00617829 0.0719664 0.0851172 0.00587751 1 0
+0.00679986 0.0963776 0.0785689 0.00696181 1 0
+0.0420936 0.072806 0.0881394 0.0101486 1 0
+0.392841 0.0130103 0.0241736 0.00733186 1 0
+0.392432 0.0186516 0.0607261 0.00636687 1 0
+0.374975 0.0243043 0.043706 0.00560077 1 0
+0.0871383 0.0936887 0.187415 0.0112409 1 0
+0.142323 0.107156 0.187424 0.0100812 1 0
+0.145518 0.0811453 0.142775 0.0091413 1 0
+0.215674 0.0140729 0.108765 0.0140781 1 0
+0.222644 0.016739 0.0890476 0.011201 1 0
+0.249043 0.0290925 0.103992 0.0127402 1 0
+0.393134 0.1016 0.0826434 0.00716053 1 0
+0.366581 0.0771724 0.102847 0.0105666 1 0
+0.22542 0.187068 0.0617098 0.00676333 1 0
+0.245887 0.16773 0.0766569 0.00611283 1 0
+0.0157395 0.037729 0.189653 0.0105725 1 0
+0.0536306 0.0208592 0.191866 0.00717096 1 0
+0.214248 0.187878 0.137434 0.00777375 1 0
+0.231408 0.167212 0.109112 0.00631698 1 0
+0.370209 0.186792 0.131924 0.0115277 1 0
+0.348265 0.188219 0.175274 0.00525853 1 0
+0.357703 0.16075 0.122765 0.00699528 1 0
+0.348719 0.169077 0.156321 0.00518334 1 0
+0.0777636 0.163008 0.0142156 0.00567678 1 0
+0.0703331 0.140071 0.0105286 0.00591555 1 0
+0.107597 0.0123506 0.0706847 0.00622383 1 0
+0.0858999 0.00550219 0.062506 0.00576121 1 0
+0.369151 0.00818008 0.0940423 0.00506689 1 0
+0.380448 0.0115654 0.123048 0.0101947 1 0
+0.361218 0.00529068 0.0991335 0.00545717 1 0
+0.21127 0.107896 0.037595 0.0136718 1 0
+0.19285 0.098723 0.0741582 0.0146363 1 0
+0.208754 0.0675954 0.0481468 0.00789315 1 0
+0.190332 0.0714759 0.0516261 0.0112526 1 0
+0.386695 0.0279839 0.124866 0.0057263 1 0
+0.391511 0.0471853 0.123585 0.00691367 1 0
+0.362912 0.0409177 0.12372 0.00493753 1 0
+0.0819763 0.098613 0.165435 0.0117008 1 0
+0.0732932 0.088342 0.117281 0.00888556 1 0
+0.0762444 0.12042 0.121165 0.00973858 1 0
+0.109151 0.0843392 0.112748 0.0131693 1 0
+0.157145 0.101235 0.154726 0.00609758 1 0
+0.156414 0.0947529 0.141875 0.00831439 1 0
+0.141156 0.0819152 0.157509 0.0062447 1 0
+0.311691 0.0225125 0.189756 0.0105256 1 0
+0.277398 0.0425153 0.191083 0.00918601 1 0
+0.31954 0.0655847 0.185438 0.0122109 1 0
+0.199689 0.169705 0.103668 0.00509297 1 0
+0.202364 0.140992 0.101095 0.011787 1 0
+0.222034 0.150856 0.0986253 0.010356 1 0
+0.195383 0.149282 0.0816558 0.00618624 1 0
+0.234882 0.00824154 0.0210247 0.00850376 1 0
+0.227894 0.00967124 0.0485354 0.00981243 1 0
+0.119952 0.0603646 0.0313592 0.0116434 1 0
+0.0929176 0.0649489 0.0678022 0.00749513 1 0
+0.119362 0.0624182 0.0864577 0.00812881 1 0
+0.103313 0.0438392 0.0487169 0.00568792 1 0
+0.189872 0.191278 0.190833 0.00620737 1 0
+0.218556 0.191504 0.183794 0.0088616 1 0
+0.256878 0.0572496 0.0376613 0.00725023 1 0
+0.272126 0.0751648 0.0726282 0.0106756 1 0
+0.251638 0.0481765 0.0465315 0.00647808 1 0
+0.226605 0.183384 0.0126504 0.0076126 1 0
+0.22612 0.155581 0.0104955 0.00612659 1 0
+0.225868 0.00918519 0.182376 0.00962794 1 0
+0.217444 0.0456945 0.187116 0.00535896 1 0
+0.216067 0.126527 0.0469773 0.00773177 1 0
+0.225386 0.109266 0.0975421 0.00970786 1 0
+0.243769 0.106338 0.0993678 0.00899614 1 0
+0.227952 0.126064 0.0859668 0.0108525 1 0
+0.316443 0.042169 0.113368 0.00724812 1 0
+0.326654 0.0517949 0.108777 0.00751662 1 0
+0.301954 0.0583803 0.0999651 0.00524896 1 0
+0.29274 0.0347683 0.132402 0.0060409 1 0
+0.343566 0.0597269 0.018211 0.005781 1 0
+0.352622 0.0502169 0.0402065 0.00618205 1 0
+0.369643 0.0714826 0.0475044 0.00510766 1 0
+0.394229 0.0737736 0.0944807 0.0059695 1 0
+0.394376 0.0620919 0.0670473 0.00591046 1 0
+0.394948 0.0939468 0.076593 0.00516962 1 0
+0.367544 0.0646222 0.0903772 0.00715182 1 0
+0.00818188 0.0126094 0.0228858 0.00838371 1 0
+0.0147844 0.0120618 0.0580327 0.00618432 1 0
+0.31466 0.0730897 0.166658 0.00859344 1 0
+0.319997 0.0525574 0.119828 0.00540728 1 0
+0.300218 0.0662144 0.131142 0.0059512 1 0
+0.282304 0.0498985 0.104559 0.00836055 1 0
+0.251758 0.18354 0.132704 0.00661005 1 0
+0.256939 0.160326 0.111173 0.00568273 1 0
+0.247454 0.15754 0.141038 0.00505592 1 0
+0.236481 0.165237 0.140116 0.00649243 1 0
+0.249384 0.00719792 0.180125 0.00758229 1 0
+0.285711 0.0124466 0.191211 0.0059783 1 0
+0.21456 0.186543 0.153079 0.00793122 1 0
+0.226593 0.180792 0.150642 0.00562627 1 0
+0.083875 0.0293033 0.189486 0.0110144 1 0
+0.0897915 0.0688272 0.191879 0.00823789 1 0
+0.106315 0.053566 0.188127 0.0119741 1 0
+0.111229 0.0439213 0.176073 0.00592557 1 0
+0.0550361 0.190197 0.174822 0.00669825 1 0
+0.0652126 0.164537 0.14202 0.00824646 1 0
+0.267189 0.18792 0.191085 0.00915243 1 0
+0.301131 0.171959 0.186846 0.00580245 1 0
+0.275044 0.14871 0.191894 0.00855422 1 0
+0.0975724 0.182156 0.191598 0.00897754 1 0
+0.117908 0.145176 0.184706 0.0136715 1 0
+0.10357 0.157952 0.149551 0.01374 1 0
+0.202562 0.121477 0.182416 0.0104515 1 0
+0.186167 0.0940157 0.190579 0.00955469 1 0
+0.185097 0.109625 0.185197 0.00700597 1 0
+0.193167 0.106857 0.167044 0.00584006 1 0
+0.325806 0.0498837 0.176862 0.00674515 1 0
+0.327219 0.0434707 0.135695 0.009877 1 0
+0.306853 0.00505278 0.129738 0.00514724 1 0
+0.284301 0.00970246 0.141233 0.00973076 1 0
+0.279911 0.024517 0.14259 0.00577992 1 0
+0.0139161 0.0761074 0.0511881 0.00684258 1 0
+0.0193503 0.0978804 0.0773104 0.00537681 1 0
+0.0312895 0.104381 0.0594031 0.008106 1 0
+0.338556 0.0576895 0.071032 0.00952752 1 0
+0.345385 0.0400912 0.0418604 0.00637311 1 0
+0.259771 0.012368 0.0639415 0.00821059 1 0
+0.234281 0.00979121 0.078925 0.00571495 1 0
+0.261934 0.0151467 0.0961373 0.00781128 1 0
+0.259949 0.0384556 0.0902831 0.00712307 1 0
+0.391538 0.0733979 0.181127 0.00823926 1 0
+0.386642 0.103587 0.194456 0.0057173 1 0
+0.353589 0.0933042 0.189377 0.00930854 1 0
+0.368799 0.0965009 0.17087 0.00800324 1 0
+0.0172555 0.065784 0.127555 0.00757448 1 0
+0.0482225 0.0691234 0.119297 0.00644119 1 0
+0.0294276 0.0847632 0.137985 0.00519188 1 0
+0.0442468 0.0580953 0.140519 0.00765787 1 0
+0.0114241 0.186249 0.0561499 0.0059827 1 0
+0.262791 0.180463 0.0104332 0.00712933 1 0
+0.294967 0.180725 0.00756748 0.00765309 1 0
+0.285215 0.168706 0.0109914 0.00819881 1 0
+0.381007 0.113507 0.121441 0.00943741 1 0
+0.356667 0.0880347 0.110332 0.00593489 1 0
+0.351332 0.127097 0.103414 0.00650858 1 0
+0.361994 0.107448 0.135957 0.00580829 1 0
+0.155172 0.0084073 0.0683292 0.00890522 1 0
+0.188438 0.012146 0.0976326 0.00587874 1 0
+0.188594 0.00995718 0.0690544 0.00765734 1 0
+0.164749 0.0103023 0.0215641 0.0106028 1 0
+0.148297 0.0125693 0.0549953 0.00651599 1 0
+0.181856 0.00865314 0.0566887 0.00648529 1 0
+0.18013 0.0188051 0.0511475 0.00512225 1 0
+0.0135713 0.0284825 0.0616517 0.00617028 1 0
+0.0168143 0.0550432 0.0534702 0.00544081 1 0
+0.0409675 0.0512215 0.0813284 0.00719788 1 0
+0.0315788 0.0446527 0.0458322 0.00519363 1 0
+0.385172 0.0707297 0.121669 0.00688846 1 0
+0.374496 0.103002 0.129779 0.00547061 1 0
+0.36727 0.0697245 0.118015 0.00634524 1 0
+0.00772959 0.129551 0.178176 0.00705005 1 0
+0.00816046 0.138058 0.150509 0.00565004 1 0
+0.0289621 0.137907 0.164141 0.00587197 1 0
+0.0308662 0.118011 0.16402 0.00573116 1 0
+0.369926 0.0178553 0.192356 0.00551679 1 0
+0.340425 0.0223486 0.192848 0.00726053 1 0
+0.11975 0.194485 0.158475 0.00575396 1 0
+0.123894 0.160886 0.143244 0.00774069 1 0
+0.38433 0.118675 0.0362219 0.00799993 1 0
+0.383284 0.102965 0.0460323 0.00553318 1 0
+0.375325 0.156401 0.0123866 0.00920127 1 0
+0.357718 0.185092 0.00968631 0.00792417 1 0
+0.347141 0.186821 0.121368 0.0135055 1 0
+0.326057 0.18231 0.153424 0.00539424 1 0
+0.350309 0.194901 0.11039 0.0056395 1 0
+0.346212 0.166812 0.115758 0.00776566 1 0
+0.386697 0.192126 0.181588 0.00799521 1 0
+0.391156 0.161996 0.18664 0.00904983 1 0
+0.390692 0.174385 0.154308 0.00550439 1 0
+0.0981993 0.0080985 0.00848544 0.00689311 1 0
+0.130053 0.00832591 0.00885153 0.00577159 1 0
+0.394383 0.0239477 0.190847 0.00572692 1 0
+0.134318 0.12667 0.172249 0.0140221 1 0
+0.120571 0.140802 0.136533 0.0136934 1 0
+0.153977 0.137668 0.159255 0.0119829 1 0
+0.238908 0.0637111 0.182828 0.00588483 1 0
+0.217927 0.0660372 0.181256 0.00886203 1 0
+0.213215 0.0882626 0.14329 0.00970245 1 0
+0.23219 0.049967 0.161982 0.00523379 1 0
+0.150521 0.116093 0.0410209 0.0080791 1 0
+0.171537 0.113958 0.0821499 0.0127537 1 0
+0.14791 0.109908 0.0683858 0.00711928 1 0
+0.119181 0.11991 0.0577099 0.0123017 1 0
+0.280074 0.0657231 0.0256561 0.00865399 1 0
+0.315154 0.0634001 0.0129531 0.00810922 1 0
+0.284546 0.0676017 0.0591255 0.00532716 1 0
+0.287665 0.0444101 0.0328449 0.00617395 1 0
+0.103511 0.0542246 0.0293572 0.00602015 1 0
+0.0695044 0.04998 0.0409961 0.00763791 1 0
+0.0777995 0.108209 0.0272184 0.0085827 1 0
+0.105089 0.0831391 0.0281576 0.00846905 1 0
+0.085815 0.0790746 0.0487101 0.00653949 1 0
+0.0968583 0.116976 0.0358279 0.00730169 1 0
+0.23678 0.180027 0.189891 0.00785738 1 0
+0.227769 0.143544 0.185132 0.00749987 1 0
+0.374033 0.01768 0.00744475 0.0059995 1 0
+0.339686 0.00677261 0.00975196 0.00758317 1 0
+0.345282 0.0433209 0.00911013 0.00944693 1 0
+0.172435 0.170777 0.00790899 0.0071469 1 0
+0.164953 0.130355 0.0128714 0.00969678 1 0
+0.158948 0.0614367 0.187529 0.00543337 1 0
+0.189978 0.0716632 0.177366 0.00746771 1 0
+0.178238 0.0797084 0.15281 0.00515117 1 0
+0.165762 0.0528525 0.170612 0.00763925 1 0
+0.0212608 0.0094604 0.0249075 0.00532478 1 0
+0.0403634 0.0072238 0.0517658 0.00747519 1 0
+0.272598 0.106078 0.104539 0.0105631 1 0
+0.287075 0.128572 0.101641 0.0131448 1 0
+0.267112 0.132629 0.0860788 0.01249 1 0
+0.268691 0.137384 0.115787 0.0116689 1 0
+0.27002 0.0257179 0.0636094 0.00820884 1 0
+0.273264 0.0592573 0.0810021 0.00733734 1 0
+0.28318 0.0354773 0.0531312 0.00527753 1 0
+0.389817 0.174931 0.080054 0.0106338 1 0
+0.384445 0.132558 0.0788915 0.00836827 1 0
+0.378701 0.139814 0.0972384 0.00602715 1 0
+0.368813 0.141861 0.0898128 0.00650638 1 0
+0.375492 0.110279 0.0315041 0.00507147 1 0
+0.357443 0.0867631 0.00909228 0.00870971 1 0
+0.375897 0.17125 0.088069 0.00602091 1 0
+0.393984 0.161636 0.116134 0.00619005 1 0
+0.373611 0.161616 0.0966576 0.00525879 1 0
+0.238039 0.00638372 0.171919 0.00666163 1 0
+0.216858 0.00703131 0.152268 0.00513398 1 0
+0.248589 0.00675868 0.148564 0.00687499 1 0
+0.250447 0.0211514 0.146636 0.00776452 1 0
+0.0113154 0.182689 0.00817339 0.00538843 1 0
+0.0238939 0.157768 0.00645951 0.00671657 1 0
+0.0526952 0.185282 0.00720097 0.00766273 1 0
+0.352161 0.0664096 0.0153645 0.00547242 1 0
+0.366475 0.0528956 0.0311387 0.00678152 1 0
+0.365266 0.0710618 0.0239861 0.00520902 1 0
+0.00559995 0.0871335 0.18492 0.00598431 1 0
+0.0112576 0.123259 0.187933 0.00508419 1 0
+0.00679544 0.114603 0.150888 0.00721419 1 0
+0.331843 0.0232473 0.0106033 0.00564219 1 0
+0.332571 0.0501213 0.0120277 0.00731454 1 0
+0.163805 0.12126 0.0301393 0.0098536 1 0
+0.183228 0.124309 0.0663082 0.00949033 1 0
+0.16112 0.149977 0.0571642 0.00646968 1 0
+0.0363436 0.00966209 0.145313 0.0101949 1 0
+0.0688378 0.00717589 0.182349 0.00732408 1 0
+0.0901335 0.00996526 0.15139 0.00727241 1 0
+0.0971279 0.0886962 0.172203 0.0076308 1 0
+0.123389 0.0696746 0.17629 0.0142557 1 0
+0.124882 0.0519842 0.162996 0.00792356 1 0
+0.0127854 0.18895 0.187874 0.0060405 1 0
+0.0175302 0.185317 0.159172 0.0049817 1 0
+0.0525532 0.194899 0.185444 0.00556042 1 0
+0.293887 0.136954 0.174997 0.0101556 1 0
+0.292423 0.15219 0.135484 0.0100152 1 0
+0.282663 0.14629 0.152378 0.0103683 1 0
+0.38584 0.172299 0.134702 0.0055863 1 0
+0.382557 0.152871 0.130059 0.00586379 1 0
+0.357948 0.153628 0.110573 0.00712653 1 0
+0.370099 0.157471 0.142381 0.00630911 1 0
+0.231197 0.192268 0.0787137 0.0079133 1 0
+0.255548 0.165874 0.0866424 0.00790485 1 0
+0.104601 0.0696791 0.0710747 0.0055276 1 0
+0.121347 0.0793999 0.0725771 0.0138937 1 0
+0.107036 0.102437 0.0568728 0.00899351 1 0
+0.283468 0.0231189 0.0642061 0.005501 1 0
+0.302915 0.0162019 0.0810346 0.00755809 1 0
+0.0142963 0.174362 0.133416 0.00796007 1 0
+0.0146243 0.145628 0.132304 0.00815538 1 0
+0.0505912 0.153131 0.131263 0.00849822 1 0
+0.0272526 0.160361 0.151105 0.00523692 1 0
+0.13311 0.0181588 0.0707926 0.00755563 1 0
+0.127461 0.0404578 0.0564505 0.00617569 1 0
+0.151748 0.0383447 0.0530821 0.00513729 1 0
+0.00679267 0.169096 0.0536077 0.00703579 1 0
+0.00651555 0.128824 0.0595809 0.00620981 1 0
+0.199676 0.173535 0.126518 0.0114282 1 0
+0.355852 0.0615542 0.189935 0.00529508 1 0
+0.363794 0.0772269 0.169744 0.00559938 1 0
+0.0653017 0.125566 0.174107 0.00626643 1 0
+0.0706548 0.124027 0.145934 0.00508993 1 0
+0.0437616 0.136513 0.163371 0.00505446 1 0
+0.0403833 0.118787 0.153449 0.00513884 1 0
+0.0668814 0.177731 0.0527361 0.00573733 1 0
+0.0839827 0.158633 0.0492808 0.00631288 1 0
+0.244283 0.130233 0.0206647 0.0134639 1 0
+0.248042 0.142193 0.0542112 0.00985963 1 0
+0.127496 0.0235248 0.0806035 0.00495716 1 0
+0.112549 0.0236483 0.117163 0.00574903 1 0
+0.102698 0.0328561 0.104551 0.00541704 1 0
+0.121179 0.0419633 0.103427 0.00550955 1 0
+0.0949815 0.00750083 0.183421 0.00782525 1 0
+0.134652 0.00614998 0.184862 0.00637881 1 0
+0.116839 0.0088601 0.154427 0.00920183 1 0
+0.31655 0.00700799 0.0248976 0.00751269 1 0
+0.290853 0.00645499 0.0473027 0.00643783 1 0
+0.198169 0.0451707 0.154014 0.00652276 1 0
+0.202753 0.0641795 0.129688 0.00629429 1 0
+0.231726 0.0501635 0.148392 0.00836477 1 0
+0.0806751 0.186693 0.0947945 0.00588621 1 0
+0.0980923 0.193862 0.114456 0.00659301 1 0
+0.0927057 0.166659 0.0945026 0.00576554 1 0
+0.131037 0.0979195 0.0154893 0.00529982 1 0
+0.119759 0.0958302 0.0614018 0.00604038 1 0
+0.117254 0.105551 0.0450691 0.00692544 1 0
+0.180049 0.0968475 0.0963658 0.0110648 1 0
+0.147055 0.0681246 0.0888777 0.00600637 1 0
+0.165325 0.0730319 0.0647813 0.0116055 1 0
+0.356389 0.0605846 0.0771528 0.00670138 1 0
+0.0090253 0.146891 0.178321 0.00943242 1 0
+0.00766876 0.177799 0.147082 0.00803472 1 0
+0.284654 0.182165 0.0777849 0.00603437 1 0
+0.317912 0.188593 0.0821801 0.010196 1 0
+0.31526 0.170622 0.0967369 0.00954165 1 0
+0.157011 0.0204114 0.191012 0.00814343 1 0
+0.0246857 0.126178 0.0110075 0.00674863 1 0
+0.0583965 0.11981 0.0136165 0.00686965 1 0
+0.0423734 0.131397 0.0355498 0.00524297 1 0
+0.359164 0.0155869 0.1297 0.0124649 1 0
+0.346991 0.00989893 0.149958 0.00993081 1 0
+0.335926 0.0173156 0.11971 0.0128885 1 0
+0.351904 0.0330754 0.118387 0.00959278 1 0
+0.394389 0.0194257 0.0160663 0.00555908 1 0
+0.379919 0.129378 0.133306 0.00674795 1 0
+0.343983 0.13786 0.10791 0.00727759 1 0
+0.353387 0.128435 0.141138 0.00927701 1 0
+0.360604 0.139797 0.147167 0.0054718 1 0
+0.210437 0.166175 0.0492754 0.00567761 1 0
+0.333137 0.0762092 0.17059 0.0105529 1 0
+0.304235 0.104976 0.172225 0.0128493 1 0
+0.335688 0.0988857 0.167769 0.0124404 1 0
+0.202789 0.187561 0.113687 0.00783417 1 0
+0.216769 0.19414 0.0854304 0.0061718 1 0
+0.226591 0.167311 0.0969075 0.00680436 1 0
+0.0790982 0.1003 0.091185 0.00741713 1 0
+0.0916304 0.108721 0.10674 0.00642763 1 0
+0.124019 0.099056 0.0987964 0.0119762 1 0
+0.099967 0.113614 0.0782024 0.00766243 1 0
+0.322068 0.132654 0.161504 0.0110719 1 0
+0.328964 0.137853 0.116072 0.00981602 1 0
+0.347629 0.119456 0.153756 0.00724557 1 0
+0.343041 0.14108 0.150765 0.00968606 1 0
+0.308067 0.0305676 0.014255 0.00749486 1 0
+0.288222 0.0486479 0.00726165 0.00755659 1 0
+0.322953 0.0477624 0.00519321 0.00532254 1 0
+0.163145 0.0244185 0.00512858 0.00531505 1 0
+0.143503 0.0521922 0.0141325 0.00602348 1 0
+0.176407 0.0560466 0.00779385 0.00804853 1 0
+0.171945 0.0484305 0.027348 0.00827547 1 0
+0.170499 0.19428 0.0274052 0.00537 1 0
+0.156708 0.193111 0.0620835 0.0071917 1 0
+0.185673 0.194117 0.0511677 0.00612124 1 0
+0.0331075 0.0116814 0.124277 0.0112441 1 0
+0.0663881 0.017704 0.134001 0.00695376 1 0
+0.0509858 0.0401183 0.121398 0.00752897 1 0
+0.0536159 0.0388033 0.139584 0.00586791 1 0
+0.377357 0.0513898 0.0351915 0.00492737 1 0
+0.379201 0.0777361 0.037615 0.00548177 1 0
+0.205056 0.128243 0.0246036 0.0112558 1 0
+0.194766 0.119397 0.0757122 0.00618427 1 0
+0.181175 0.145115 0.0499636 0.00675236 1 0
+0.148696 0.0473235 0.193751 0.00638771 1 0
+0.1805 0.0491506 0.19158 0.00866147 1 0
+0.0218087 0.0143186 0.108466 0.00836723 1 0
+0.0478675 0.0219623 0.0896958 0.00823181 1 0
+0.0512223 0.0421287 0.0966569 0.0133643 1 0
+0.0207695 0.021881 0.119874 0.00535858 1 0
+0.0215509 0.0467649 0.120322 0.00641871 1 0
+0.0360928 0.0484112 0.104878 0.00496479 1 0
+0.0326386 0.0525415 0.145065 0.00598976 1 0
+0.381427 0.190418 0.194281 0.00586092 1 0
+0.373734 0.16649 0.18837 0.00498055 1 0
+0.205452 0.154565 0.177984 0.00579418 1 0
+0.194448 0.131231 0.149231 0.00721404 1 0
+0.0229852 0.137984 0.00566485 0.00616599 1 0
+0.0607551 0.169837 0.00924403 0.00965325 1 0
+0.0609532 0.142705 0.00515321 0.00524266 1 0
+0.0845293 0.0785676 0.161161 0.00895357 1 0
+0.0760292 0.0631132 0.116189 0.00934452 1 0
+0.109096 0.0662653 0.125401 0.0088934 1 0
+0.0992344 0.0589427 0.143979 0.0105978 1 0
+0.273636 0.0785978 0.180015 0.0113957 1 0
+0.31771 0.0863584 0.178826 0.00966627 1 0
+0.29521 0.110289 0.191138 0.00918946 1 0
+0.381769 0.130907 0.179692 0.00549505 1 0
+0.384951 0.132232 0.147066 0.00501827 1 0
+0.368263 0.120297 0.157834 0.00564419 1 0
+0.372344 0.141301 0.154623 0.00518439 1 0
+0.015366 0.18067 0.0718755 0.00991698 1 0
+0.0571934 0.17713 0.0784465 0.00840477 1 0
+0.0608721 0.163181 0.103517 0.00874349 1 0
+0.0402299 0.146705 0.0580912 0.00834893 1 0
+0.254209 0.193453 0.0136025 0.00692331 1 0
+0.293146 0.193828 0.00583723 0.00565197 1 0
+0.273439 0.190697 0.0328814 0.00943147 1 0
+0.148158 0.0224957 0.0751162 0.0086904 1 0
+0.169855 0.0328631 0.104474 0.00539417 1 0
+0.161211 0.0397703 0.0704683 0.00845554 1 0
+0.14024 0.0469873 0.122983 0.010578 1 0
+0.336735 0.0202872 0.0803728 0.00662079 1 0
+0.331173 0.0418264 0.0836408 0.00698085 1 0
+0.248925 0.170773 0.189235 0.0074251 1 0
+0.262339 0.153703 0.191569 0.00510053 1 0
+0.228363 0.152946 0.194167 0.00555304 1 0
+0.253545 0.153824 0.172184 0.00501869 1 0
+0.085673 0.0219495 0.128863 0.00810289 1 0
+0.0787165 0.0476022 0.114194 0.00652346 1 0
+0.0980547 0.0314382 0.144821 0.00871123 1 0
+0.0709612 0.0486933 0.147475 0.00741279 1 0
+0.146003 0.180965 0.107392 0.00615155 1 0
+0.151935 0.175908 0.116585 0.00590186 1 0
+0.131311 0.156841 0.111757 0.006995 1 0
+0.156763 0.164613 0.0522469 0.00700493 1 0
+0.166162 0.131633 0.0940256 0.00920817 1 0
+0.169708 0.159475 0.0531444 0.00695105 1 0
+0.391928 0.014103 0.0938668 0.00815456 1 0
+0.391359 0.0211293 0.117583 0.00530946 1 0
+0.375048 0.0429505 0.106888 0.00530811 1 0
+0.0461391 0.0699646 0.193821 0.00627914 1 0
+0.0622147 0.0345418 0.191454 0.00898645 1 0
+0.0593306 0.0684257 0.192418 0.00508167 1 0
+0.0397629 0.0590945 0.170099 0.00595525 1 0
+0.0661161 0.112209 0.0346864 0.00584907 1 0
+0.0797103 0.0967227 0.0580186 0.00598094 1 0
+0.0568741 0.114675 0.041708 0.00601682 1 0
+0.0822935 0.121589 0.0590197 0.00649001 1 0
+0.0084868 0.184703 0.0965632 0.0086322 1 0
+0.00581197 0.179899 0.124047 0.00594827 1 0
+0.0193344 0.15123 0.117751 0.00813427 1 0
+0.0373418 0.165335 0.111805 0.00496009 1 0
+0.0069464 0.0203693 0.00957193 0.00729029 1 0
+0.0114912 0.0644476 0.0186047 0.00692857 1 0
+0.23016 0.15093 0.070759 0.00659564 1 0
+0.239476 0.169123 0.048159 0.00817471 1 0
+0.216925 0.162977 0.0570597 0.00494897 1 0
+0.256492 0.108796 0.106756 0.00592031 1 0
+0.239834 0.122034 0.101258 0.0072955 1 0
+0.250444 0.134166 0.118395 0.00695265 1 0
+0.0669046 0.0202201 0.0606514 0.00578 1 0
+0.0667976 0.109972 0.163301 0.00737749 1 0
+0.0647391 0.0862293 0.128114 0.00507807 1 0
+0.0730489 0.126344 0.135373 0.0059837 1 0
+0.0487948 0.104113 0.14207 0.00657197 1 0
+0.028089 0.193995 0.0135611 0.00631276 1 0
+0.0674378 0.193956 0.0187955 0.00627478 1 0
+0.0560479 0.192898 0.040999 0.00736616 1 0
+0.262174 0.14737 0.00768132 0.00782649 1 0
+0.110871 0.0181432 0.0802059 0.00539194 1 0
+0.0877005 0.00667963 0.0836161 0.00686255 1 0
+0.104632 0.00847264 0.10825 0.00872388 1 0
+0.0824788 0.0353326 0.0842433 0.00699519 1 0
+0.14732 0.10401 0.105935 0.0128921 1 0
+0.131004 0.0929942 0.120441 0.0115619 1 0
+0.124891 0.124973 0.0770648 0.00850322 1 0
+0.367253 0.00909377 0.0543428 0.00926423 1 0
+0.341448 0.00752611 0.0337154 0.00700713 1 0
+0.353185 0.00671947 0.0658624 0.00679685 1 0
+0.360068 0.0192233 0.0458931 0.00610856 1 0
+0.00526509 0.0409069 0.136276 0.00535184 1 0
+0.00810634 0.0521513 0.169336 0.00845315 1 0
+0.00898223 0.0516547 0.135279 0.00540738 1 0
+0.0272917 0.0344396 0.154164 0.00617013 1 0
+0.28683 0.192156 0.0542309 0.00529478 1 0
+0.306074 0.167622 0.0566469 0.00537123 1 0
+0.19755 0.0334298 0.0932068 0.00801512 1 0
+0.189077 0.0691788 0.103897 0.0121385 1 0
+0.191992 0.113584 0.0278815 0.0086521 1 0
+0.162067 0.106234 0.0287016 0.00534139 1 0
+0.179901 0.11 0.0638109 0.00541145 1 0
+0.17278 0.0881559 0.0541978 0.00830241 1 0
+0.288755 0.0755487 0.0109192 0.0110888 1 0
+0.308569 0.0795913 0.0189497 0.01037 1 0
+0.296556 0.0983438 0.0125803 0.0125357 1 0
+0.383772 0.0259801 0.193385 0.00537695 1 0
+0.386942 0.0526887 0.193606 0.00647137 1 0
+0.365199 0.047121 0.19492 0.0052279 1 0
+0.0519969 0.181546 0.139662 0.00596041 1 0
+0.073405 0.189449 0.169333 0.0107301 1 0
+0.0877081 0.173817 0.141113 0.00870525 1 0
+0.341047 0.169722 0.193253 0.00654535 1 0
+0.330376 0.150117 0.192594 0.00496002 1 0
+0.114133 0.161206 0.130073 0.00865552 1 0
+0.303032 0.188236 0.140302 0.0117671 1 0
+0.315833 0.195507 0.114557 0.00504126 1 0
+0.284501 0.189967 0.127885 0.0104032 1 0
+0.312477 0.161431 0.113936 0.0101568 1 0
+0.327634 0.0793802 0.0481969 0.0100093 1 0
+0.324448 0.0752109 0.0906867 0.0083484 1 0
+0.31356 0.104172 0.0805245 0.00749451 1 0
+0.327746 0.101416 0.0747659 0.00806205 1 0
+0.121771 0.0134248 0.122837 0.00852373 1 0
+0.159631 0.0150029 0.128638 0.00980085 1 0
+0.392511 0.0522317 0.169404 0.00783913 1 0
+0.395162 0.0501463 0.134408 0.00498903 1 0
+0.272107 0.170806 0.116229 0.013434 1 0
+0.281281 0.155885 0.101404 0.0095132 1 0
+0.266574 0.153585 0.107595 0.00660862 1 0
+0.264709 0.153674 0.119585 0.00552586 1 0
+0.38681 0.0562555 0.00638283 0.00528748 1 0
+0.365455 0.0437473 0.0107899 0.00529517 1 0
+0.210022 0.123308 0.12934 0.00556125 1 0
+0.250494 0.193287 0.180336 0.00706519 1 0
+0.258499 0.192009 0.147804 0.00855534 1 0
+0.281498 0.0581577 0.178437 0.0105608 1 0
+0.303242 0.0692587 0.176297 0.00683264 1 0
+0.279185 0.0677835 0.134067 0.00571929 1 0
+0.283695 0.0478234 0.161373 0.00950883 1 0
+0.201343 0.0885042 0.00865546 0.00499766 1 0
+0.217247 0.0657974 0.0338116 0.00681007 1 0
+0.184647 0.0707221 0.0238142 0.00558769 1 0
+0.109721 0.184804 0.00937792 0.00961705 1 0
+0.329991 0.0107204 0.0287114 0.0058961 1 0
+0.324986 0.00709674 0.065553 0.00544047 1 0
+0.320655 0.0241156 0.0465631 0.00626207 1 0
+0.246404 0.0691349 0.00781767 0.00828671 1 0
+0.222941 0.103933 0.0111598 0.011335 1 0
+0.216109 0.0696221 0.00799544 0.00826141 1 0
+0.157528 0.0899447 0.191168 0.00507421 1 0
+0.155537 0.100229 0.191591 0.00540953 1 0
+0.177525 0.0943671 0.150699 0.00861897 1 0
+0.0348592 0.00813347 0.015002 0.00828149 1 0
+0.0512365 0.0192255 0.0153088 0.00517423 1 0
+0.342655 0.0798171 0.0361204 0.00926937 1 0
+0.3391 0.0812289 0.0784261 0.0116296 1 0
+0.338672 0.111785 0.0750774 0.00700406 1 0
+0.330466 0.129438 0.187166 0.00655636 1 0
+0.361513 0.120336 0.171651 0.00498052 1 0
+0.205291 0.0302313 0.114125 0.0145174 1 0
+0.20977 0.0267413 0.0944394 0.00597039 1 0
+0.205971 0.0681862 0.0953955 0.00680038 1 0
+0.233346 0.0592739 0.0989024 0.0127908 1 0
+0.0729556 0.0741033 0.169157 0.00580497 1 0
+0.0687666 0.0753065 0.130455 0.00601045 1 0
+0.0846709 0.0567052 0.156714 0.00887761 1 0
+0.0667951 0.0521266 0.1623 0.00836534 1 0
+0.29608 0.0149178 0.0917873 0.00524784 1 0
+0.283962 0.0466343 0.0910075 0.00567696 1 0
+0.0622957 0.0349496 0.0106501 0.0110784 1 0
+0.0495625 0.0756888 0.00622606 0.00642553 1 0
+0.386469 0.0770333 0.0583167 0.00552774 1 0
+0.387526 0.0946109 0.0661314 0.00621954 1 0
+0.362512 0.0757967 0.0849561 0.00624904 1 0
+0.241755 0.185676 0.178927 0.00544206 1 0
+0.234978 0.173823 0.150145 0.00528781 1 0
+0.0631754 0.100075 0.0342654 0.00630015 1 0
+0.0490861 0.10025 0.0597905 0.00612054 1 0
+0.0448321 0.0676857 0.0483798 0.00556852 1 0
+0.357979 0.0272896 0.0764568 0.00501178 1 0
+0.278958 0.131248 0.150856 0.00519829 1 0
+0.280979 0.110705 0.130202 0.00534803 1 0
+0.302751 0.12933 0.116301 0.00833201 1 0
+0.27393 0.140098 0.141054 0.00521546 1 0
+0.0373405 0.191358 0.126653 0.00727957 1 0
+0.0677841 0.191625 0.0901428 0.00869273 1 0
+0.0844209 0.191969 0.124443 0.00855905 1 0
+0.0775465 0.162201 0.109099 0.0082593 1 0
+0.0207555 0.0053754 0.188771 0.00547368 1 0
+0.0455209 0.00928189 0.181845 0.00561126 1 0
+0.0245158 0.167059 0.0749526 0.00601204 1 0
+0.0568859 0.143012 0.0981434 0.00673649 1 0
+0.0311157 0.142002 0.0668341 0.00512793 1 0
+0.00911201 0.111889 0.0105822 0.00952419 1 0
+0.0289019 0.0987202 0.0405127 0.00667252 1 0
+0.0153248 0.0709797 0.185047 0.00708259 1 0
+0.0468106 0.0975161 0.194603 0.00576613 1 0
+0.0330428 0.088288 0.168913 0.00655303 1 0
+0.0319882 0.0658179 0.164622 0.00569154 1 0
+0.327932 0.0661663 0.0347492 0.00884639 1 0
+0.325235 0.0611186 0.0757851 0.00502571 1 0
+0.301791 0.0719827 0.0647257 0.00502249 1 0
+0.140444 0.0208043 0.00857616 0.00554489 1 0
+0.13206 0.0531746 0.0191259 0.00650001 1 0
+0.0227459 0.0405526 0.0137735 0.00512675 1 0
+0.0139517 0.0311413 0.0791735 0.00739728 1 0
+0.00812655 0.0462816 0.0920372 0.00831147 1 0
+0.0100434 0.0603263 0.0679059 0.00747143 1 0
+0.0330852 0.0595645 0.0875891 0.00587617 1 0
+0.01453 0.0759006 0.120222 0.00521403 1 0
+0.0151535 0.103402 0.114357 0.0067483 1 0
+0.0287214 0.0951057 0.139099 0.00523436 1 0
+0.0133948 0.0273098 0.111089 0.00733124 1 0
+0.00839056 0.0392552 0.105564 0.00674924 1 0
+0.0335484 0.0517292 0.0957753 0.00505228 1 0
+0.321536 0.0865347 0.161924 0.00723207 1 0
+0.336144 0.0797876 0.125265 0.00618701 1 0
+0.306447 0.0747709 0.124501 0.0063047 1 0
+0.338491 0.0802498 0.140048 0.00809261 1 0
+0.0724714 0.172504 0.0723751 0.00867382 1 0
+0.077077 0.155879 0.0945479 0.00612652 1 0
+0.0603146 0.142855 0.064314 0.00788684 1 0
+0.0873398 0.153674 0.0624092 0.00743584 1 0
+0.0837064 0.168728 0.18948 0.00889523 1 0
+0.0796081 0.136161 0.182522 0.013425 1 0
+0.0984236 0.143756 0.174245 0.00848882 1 0
+0.090862 0.139998 0.157997 0.00982194 1 0
+0.120833 0.0169722 0.0755527 0.00566548 1 0
+0.0890771 0.0475762 0.0844198 0.00691428 1 0
+0.111386 0.0351207 0.0575203 0.0053293 1 0
+0.220659 0.0305815 0.129607 0.00729992 1 0
+0.20806 0.0804905 0.123909 0.0118058 1 0
+0.238003 0.061297 0.120152 0.00905688 1 0
+0.233536 0.0524825 0.134068 0.00625855 1 0
+0.246734 0.133539 0.040288 0.00658618 1 0
+0.261156 0.116553 0.0379597 0.0120144 1 0
+0.253954 0.128533 0.0491202 0.00587193 1 0
+0.0659653 0.0123689 0.0890542 0.0122615 1 0
+0.0753169 0.0123982 0.113778 0.0125732 1 0
+0.0701547 0.0311356 0.0969636 0.00853032 1 0
+0.124168 0.167553 0.0768115 0.00984731 1 0
+0.154698 0.126665 0.106738 0.00861596 1 0
+0.114986 0.142254 0.0860121 0.0133329 1 0
+0.346007 0.153192 0.00795461 0.00800824 1 0
+0.318942 0.148861 0.0113152 0.0115475 1 0
+0.318348 0.0348712 0.0863439 0.00785672 1 0
+0.303844 0.0561051 0.0899067 0.0052354 1 0
+0.313022 0.0358319 0.074224 0.00541661 1 0
+0.152268 0.0076484 0.173852 0.00786869 1 0
+0.13011 0.0144056 0.154271 0.00585279 1 0
+0.165082 0.0119672 0.144377 0.00713006 1 0
+0.0871026 0.125344 0.0093217 0.0096307 1 0
+0.122601 0.0934845 0.0107429 0.00534686 1 0
+0.390935 0.0680353 0.16854 0.00545651 1 0
+0.391784 0.0660705 0.137733 0.0081494 1 0
+0.368876 0.0851037 0.157602 0.00681751 1 0
+0.3435 0.0532953 0.184997 0.0059137 1 0
+0.0678451 0.116635 0.0213229 0.00572971 1 0
+0.0831903 0.134643 0.0428236 0.0073013 1 0
+0.315142 0.019002 0.154585 0.00509271 1 0
+0.318834 0.0287574 0.124498 0.0082297 1 0
+0.331325 0.0384706 0.118156 0.00881685 1 0
+0.257485 0.0774816 0.0149607 0.00737033 1 0
+0.243986 0.105343 0.0208968 0.0114293 1 0
+0.250893 0.0810976 0.056506 0.00976706 1 0
+0.241362 0.071397 0.0497077 0.00543699 1 0
+0.0951764 0.190812 0.0352198 0.005069 1 0
+0.105909 0.1918 0.0552695 0.0055431 1 0
+0.0838705 0.19237 0.0559887 0.00778471 1 0
+0.0909871 0.168167 0.046449 0.00585127 1 0
+0.138129 0.0547823 0.0314965 0.00737256 1 0
+0.133008 0.0625234 0.0701167 0.00598886 1 0
+0.131467 0.0487513 0.0499509 0.0050972 1 0
+0.392729 0.17308 0.0543232 0.00762244 1 0
+0.390069 0.140352 0.0309828 0.00894587 1 0
+0.392483 0.144524 0.0675016 0.00668198 1 0
+0.365541 0.139541 0.0628607 0.00767386 1 0
+0.181917 0.072989 0.122854 0.00848093 1 0
+0.151607 0.0618207 0.010758 0.00684657 1 0
+0.170956 0.0743141 0.00515087 0.00535107 1 0
+0.151276 0.100927 0.0089466 0.00913301 1 0
+0.159422 0.0740842 0.0305408 0.00543141 1 0
+0.115667 0.180416 0.0794904 0.0058022 1 0
+0.0994465 0.155809 0.0923839 0.00718233 1 0
+0.0999845 0.154006 0.0694851 0.00705776 1 0
+0.273075 0.179113 0.0764238 0.0060175 1 0
+0.273414 0.182999 0.100381 0.00660443 1 0
+0.294461 0.167567 0.0871492 0.00611654 1 0
+0.267046 0.169424 0.0821706 0.00493232 1 0
+0.263157 0.0743531 0.166745 0.00603747 1 0
+0.236311 0.0883744 0.127816 0.00866709 1 0
+0.262038 0.0760561 0.129225 0.00937597 1 0
+0.260806 0.0583165 0.152129 0.00554879 1 0
+0.127913 0.0401208 0.0105813 0.0108419 1 0
+0.139949 0.188361 0.0447094 0.00963688 1 0
+0.156756 0.175254 0.0466356 0.00502514 1 0
+0.0182403 0.0775134 0.0207589 0.00585374 1 0
+0.049628 0.0861852 0.0125484 0.00534557 1 0
+0.0386586 0.104817 0.0341019 0.00649825 1 0
+0.0504136 0.0672162 0.0286269 0.00617965 1 0
+0.241949 0.0263184 0.0058993 0.00573091 1 0
+0.252068 0.0556234 0.00921361 0.00637274 1 0
+0.22369 0.0526726 0.0183509 0.0052916 1 0
+0.232494 0.0511763 0.0241064 0.00533218 1 0
+0.19112 0.181137 0.00602503 0.00537962 1 0
+0.202486 0.159753 0.0127104 0.00927223 1 0
+0.0752446 0.00953644 0.0199405 0.00785062 1 0
+0.0762035 0.00765303 0.0478329 0.00785765 1 0
+0.0933209 0.00532339 0.0221773 0.00561959 1 0
+0.103481 0.0147954 0.0398048 0.00544491 1 0
+0.0277912 0.120626 0.096511 0.00511143 1 0
+0.0426447 0.126149 0.114312 0.00516252 1 0
+0.196674 0.18675 0.102437 0.0049966 1 0
+0.211756 0.1794 0.0726919 0.00523377 1 0
+0.223498 0.175543 0.0884482 0.00502362 1 0
+0.200843 0.175993 0.0680288 0.00711302 1 0
+0.342708 0.0784478 0.109096 0.0064675 1 0
+0.301046 0.0851749 0.11395 0.00736852 1 0
+0.326322 0.112953 0.104599 0.00894385 1 0
+0.33831 0.112264 0.129564 0.00533993 1 0
+0.146632 0.119854 0.155857 0.00758345 1 0
+0.113839 0.124127 0.123163 0.00871534 1 0
+0.147431 0.104285 0.128928 0.0101026 1 0
+0.130699 0.107509 0.132492 0.00730589 1 0
+0.110278 0.121507 0.179754 0.0116856 1 0
+0.0956274 0.122005 0.158534 0.00879957 1 0
+0.119865 0.0920174 0.138423 0.00961322 1 0
+0.219451 0.0418365 0.0510078 0.00644042 1 0
+0.173338 0.00866538 0.177793 0.00550045 1 0
+0.211117 0.00543773 0.18246 0.00561183 1 0
+0.187216 0.00837054 0.155071 0.00872445 1 0
+0.1664 0.17484 0.0827415 0.00501124 1 0
+0.177999 0.143392 0.0931468 0.00585077 1 0
+0.109717 0.192946 0.0137512 0.00724742 1 0
+0.14143 0.184762 0.0195865 0.00684492 1 0
+0.122259 0.190175 0.0476535 0.0102463 1 0
+0.0667361 0.169401 0.0599992 0.00531496 1 0
+0.082868 0.146826 0.0508342 0.00564837 1 0
+0.0552552 0.154891 0.0433447 0.00561681 1 0
+0.310689 0.151778 0.181469 0.00665367 1 0
+0.330094 0.152012 0.136954 0.0113277 1 0
+0.345349 0.156333 0.145413 0.00664196 1 0
+0.251394 0.126454 0.166924 0.0114056 1 0
+0.267385 0.108622 0.136848 0.00553662 1 0
+0.263938 0.13864 0.160479 0.00723252 1 0
+0.360484 0.188651 0.0759512 0.00497759 1 0
+0.331221 0.188418 0.0363829 0.00560804 1 0
+0.331933 0.192602 0.0717644 0.00779763 1 0
+0.347752 0.165414 0.0682079 0.00796147 1 0
+0.136251 0.00928 0.0920064 0.00859638 1 0
+0.129956 0.0161276 0.112292 0.00509584 1 0
+0.152579 0.0159942 0.115424 0.00520984 1 0
+0.136703 0.036157 0.110096 0.00662378 1 0
+0.100961 0.00493377 0.154156 0.00544695 1 0
+0.13546 0.0669218 0.0237618 0.0068288 1 0
+0.142736 0.0815677 0.0644031 0.00910591 1 0
+0.155592 0.0620349 0.0396216 0.00727139 1 0
+0.23071 0.0941707 0.0424577 0.0106171 1 0
+0.231904 0.080267 0.0565854 0.00924055 1 0
+0.136849 0.055555 0.169806 0.00630133 1 0
+0.13647 0.0580592 0.135486 0.00654245 1 0
+0.150866 0.0539106 0.165846 0.00803573 1 0
+0.394575 0.07269 0.0171423 0.0055546 1 0
+0.39486 0.110574 0.0118853 0.00550496 1 0
+0.387951 0.0869387 0.0294716 0.00538716 1 0
+0.254035 0.0737726 0.183436 0.00907811 1 0
+0.227242 0.108008 0.16302 0.0103512 1 0
+0.22171 0.101723 0.147955 0.0068841 1 0
+0.246732 0.0983579 0.13288 0.00662683 1 0
+0.0335488 0.109202 0.0863888 0.00581296 1 0
+0.0513091 0.0948092 0.0875527 0.00611939 1 0
+0.05679 0.122306 0.0980262 0.00517686 1 0
+0.052778 0.114593 0.0733525 0.00678807 1 0
+0.377528 0.112721 0.191255 0.00636142 1 0
+0.323421 0.118747 0.192828 0.00747939 1 0
+0.0202821 0.127857 0.185543 0.00532221 1 0
+0.0456882 0.121297 0.189231 0.00619298 1 0
+0.0278125 0.163137 0.185644 0.00614243 1 0
+0.0407269 0.184969 0.19302 0.00713734 1 0
+0.202317 0.0380069 0.0635513 0.0061186 1 0
+0.196048 0.0690914 0.0860807 0.00683945 1 0
+0.214552 0.0556608 0.0504908 0.00558046 1 0
+0.187018 0.0565114 0.0598651 0.00514824 1 0
+0.192447 0.179866 0.191769 0.00552928 1 0
+0.382976 0.00933654 0.00800821 0.00624409 1 0
+0.379462 0.00880123 0.0393308 0.00900867 1 0
+0.228739 0.0357554 0.140074 0.00689897 1 0
+0.253924 0.0245816 0.129793 0.00977247 1 0
+0.254756 0.0552683 0.117164 0.0089968 1 0
+0.244956 0.0366762 0.141704 0.00942559 1 0
+0.284401 0.126071 0.0301732 0.0129644 1 0
+0.280462 0.111896 0.0848258 0.0114435 1 0
+0.294088 0.127276 0.0774395 0.0103921 1 0
+0.280271 0.135028 0.0733615 0.0059669 1 0
+0.00563921 0.0823402 0.11215 0.00596405 1 0
+0.00684844 0.11187 0.11031 0.0057838 1 0
+0.0379734 0.0850477 0.0989356 0.00668566 1 0
+0.148048 0.0673697 0.16165 0.00634128 1 0
+0.16632 0.0802059 0.13652 0.0100819 1 0
+0.153832 0.0715793 0.136283 0.00509827 1 0
+0.164782 0.0570918 0.149821 0.00786055 1 0
+0.0708317 0.0947185 0.0813214 0.00661075 1 0
+0.0669437 0.121838 0.0984773 0.00499761 1 0
+0.0644455 0.124797 0.0716368 0.00615064 1 0
+0.090339 0.120408 0.0696529 0.00689617 1 0
+0.262019 0.0920942 0.188904 0.00850721 1 0
+0.266705 0.121891 0.180648 0.00733623 1 0
+0.243492 0.119364 0.185346 0.00985739 1 0
+0.265228 0.0970171 0.153937 0.00631729 1 0
+0.386732 0.186006 0.0490056 0.0075897 1 0
+0.391645 0.153252 0.0174181 0.00874731 1 0
+0.0164142 0.169571 0.0469836 0.00510672 1 0
+0.0162801 0.146559 0.0269116 0.00578039 1 0
+0.0336765 0.137425 0.0465965 0.00640884 1 0
+0.0352034 0.153494 0.042736 0.00671905 1 0
+0.393189 0.145792 0.170589 0.00703241 1 0
+0.393971 0.175462 0.142844 0.00637997 1 0
+0.393145 0.142807 0.143542 0.006247 1 0
+0.378366 0.151838 0.156955 0.00527381 1 0
+0.381775 0.0767982 0.00497851 0.00506417 1 0
+0.384389 0.110274 0.00625307 0.00656743 1 0
+0.0501918 0.0651677 0.0751153 0.00698474 1 0
+0.0522839 0.0587165 0.0514569 0.00649157 1 0
+0.217106 0.0220904 0.0114196 0.00546845 1 0
+0.20051 0.0538623 0.0172405 0.0068967 1 0
+0.222733 0.0473342 0.0279354 0.00572104 1 0
+0.261327 0.0222179 0.186737 0.00551997 1 0
+0.300809 0.0175195 0.00825984 0.0083 1 0
+0.278985 0.0387736 0.00632486 0.00651096 1 0
+0.0868131 0.14207 0.00723754 0.00730909 1 0
+0.111635 0.139991 0.0197633 0.00503765 1 0
+0.103829 0.139937 0.0308627 0.00710114 1 0
+0.0486418 0.113671 0.00631207 0.00680382 1 0
+0.0276864 0.110959 0.0271024 0.00789287 1 0
+0.189698 0.0844834 0.00680689 0.00718779 1 0
+0.165699 0.11211 0.0107286 0.00868968 1 0
+0.213054 0.136856 0.0377959 0.00641269 1 0
+0.205379 0.128465 0.0764922 0.00779672 1 0
+0.210352 0.14347 0.0803363 0.00847115 1 0
+0.19583 0.147316 0.0427877 0.00687583 1 0
+0.203294 0.0652706 0.173102 0.00790694 1 0
+0.195976 0.0856479 0.140561 0.00794527 1 0
+0.198447 0.0571985 0.161029 0.00740396 1 0
+0.271409 0.00778163 0.00978963 0.0049704 1 0
+0.294126 0.00627609 0.01453 0.00645502 1 0
+0.28841 0.183894 0.158858 0.00510762 1 0
+0.269919 0.183373 0.131083 0.00614539 1 0
+0.29785 0.164485 0.122122 0.00688027 1 0
+0.377503 0.106226 0.0875702 0.00694416 1 0
+0.386703 0.127112 0.110159 0.00913205 1 0
+0.357162 0.124419 0.0912405 0.00725182 1 0
+0.0095061 0.116134 0.0277109 0.0070637 1 0
+0.00773396 0.0931842 0.051083 0.0050224 1 0
+0.00649546 0.115939 0.0538062 0.00667849 1 0
+0.0282208 0.110772 0.0450519 0.00622384 1 0
+0.394226 0.100204 0.186616 0.00590458 1 0
+0.390406 0.111207 0.183462 0.0060037 1 0
+0.371822 0.111796 0.16477 0.00589004 1 0
+0.320528 0.0880744 0.0322957 0.00945677 1 0
+0.298506 0.108633 0.0320131 0.00953935 1 0
+0.27853 0.09926 0.0699264 0.00818781 1 0
+0.31458 0.122673 0.0613605 0.0144611 1 0
+0.0293974 0.107606 0.126394 0.00543034 1 0
+0.0588922 0.124193 0.121338 0.00801985 1 0
+0.0424652 0.102032 0.131962 0.00553475 1 0
+0.364571 0.122046 0.00864333 0.0089966 1 0
+0.327554 0.121654 0.0148372 0.0124066 1 0
+0.333016 0.124314 0.0330948 0.00683507 1 0
+0.105421 0.0127092 0.192345 0.00790702 1 0
+0.137771 0.0134939 0.193549 0.00659779 1 0
+0.122142 0.0399081 0.190873 0.00657837 1 0
+0.0360628 0.14824 0.195135 0.00498531 1 0
+0.0487747 0.130945 0.194461 0.00520711 1 0
+0.0114236 0.190122 0.0171162 0.00624084 1 0
+0.00719424 0.185625 0.043441 0.00751635 1 0
+0.150284 0.191552 0.11361 0.00847748 1 0
+0.113937 0.170589 0.114578 0.00946019 1 0
+0.157242 0.195396 0.0739888 0.004951 1 0
+0.187169 0.191199 0.104521 0.0057037 1 0
+0.191458 0.179219 0.0751372 0.00509441 1 0
+0.179449 0.177476 0.0741934 0.00707689 1 0
+0.220758 0.131729 0.172635 0.0110727 1 0
+0.235641 0.14715 0.150809 0.00628522 1 0
+0.174845 0.0173726 0.00679136 0.00715132 1 0
+0.389 0.0262074 0.0765676 0.00740518 1 0
+0.385725 0.0576259 0.0716836 0.00494275 1 0
+0.369562 0.0489367 0.0886258 0.00875958 1 0
+0.389473 0.125925 0.0240515 0.00707116 1 0
+0.384935 0.114117 0.0640126 0.00517591 1 0
+0.358025 0.129177 0.065102 0.00532288 1 0
+0.380652 0.114116 0.0493804 0.00640348 1 0
+0.0925978 0.185847 0.176284 0.00817487 1 0
+0.103581 0.173693 0.138901 0.00526595 1 0
+0.169338 0.185191 0.144271 0.0124284 1 0
+0.190417 0.142733 0.141853 0.00703344 1 0
+0.0145455 0.0827114 0.192269 0.00671582 1 0
+0.0201515 0.118411 0.19059 0.00538755 1 0
+0.0447295 0.10804 0.190066 0.00589401 1 0
+0.372658 0.186009 0.0342008 0.00586944 1 0
+0.341111 0.193211 0.0297643 0.00725038 1 0
+0.291381 0.145337 0.0695375 0.00537388 1 0
+0.262009 0.149087 0.0586692 0.0063418 1 0
+0.272672 0.157725 0.0471531 0.00678475 1 0
+0.177522 0.191702 0.0151077 0.00871947 1 0
+0.195951 0.192488 0.042442 0.0075691 1 0
+0.223972 0.0441119 0.066088 0.00943428 1 0
+0.216549 0.0621694 0.0881533 0.00736065 1 0
+0.248009 0.0605968 0.0849173 0.00751538 1 0
+0.222064 0.056697 0.058959 0.005155 1 0
+0.204322 0.00865878 0.149084 0.00905007 1 0
+0.0179466 0.0646345 0.0477057 0.00580657 1 0
+0.0279603 0.0870887 0.0391257 0.00507917 1 0
+0.0583118 0.138382 0.13237 0.0075169 1 0
+0.0310013 0.14362 0.151161 0.00524737 1 0
+0.0781885 0.0332649 0.0108671 0.00532103 1 0
+0.0690375 0.0649554 0.0147177 0.00651158 1 0
+0.104554 0.0463637 0.00797568 0.00810448 1 0
+0.291221 0.19255 0.0657017 0.00699412 1 0
+0.314641 0.193615 0.0665849 0.00653856 1 0
+0.322512 0.174957 0.0655721 0.0117791 1 0
+0.246221 0.191961 0.0279806 0.00505252 1 0
+0.26026 0.192866 0.0414315 0.0063595 1 0
+0.226439 0.194878 0.0503368 0.0053088 1 0
+0.381734 0.0627377 0.129848 0.00505232 1 0
+0.359458 0.0626474 0.123117 0.00536539 1 0
+0.368474 0.0544648 0.140028 0.00583783 1 0
+0.371952 0.186986 0.0786659 0.00541608 1 0
+0.373149 0.188049 0.110842 0.00521248 1 0
+0.348782 0.174456 0.0904933 0.0109357 1 0
+0.370339 0.0202183 0.145735 0.00762078 1 0
+0.353047 0.036823 0.134046 0.00654898 1 0
+0.173665 0.0688826 0.112392 0.00546214 1 0
+0.00601937 0.0813715 0.168923 0.00635341 1 0
+0.00602729 0.0869847 0.136085 0.00609493 1 0
+0.0184638 0.0953948 0.160977 0.0049687 1 0
+0.0871605 0.0551548 0.11149 0.00512355 1 0
+0.121243 0.0613418 0.116861 0.00674977 1 0
+0.0104101 0.0605892 0.180056 0.00544866 1 0
+0.0264487 0.0799943 0.162158 0.00601263 1 0
+0.0255322 0.0594446 0.155259 0.00734574 1 0
+0.236368 0.0362734 0.192409 0.00762552 1 0
+0.220529 0.0553839 0.190136 0.00524858 1 0
+0.251545 0.0452632 0.169149 0.00625398 1 0
+0.258667 0.0495091 0.076911 0.0063627 1 0
+0.0844778 0.0171772 0.0142944 0.00539746 1 0
+0.104986 0.0472937 0.020959 0.00496815 1 0
+0.234017 0.123122 0.165273 0.00636487 1 0
+0.215883 0.114482 0.137351 0.00607392 1 0
+0.255968 0.107054 0.134688 0.00618773 1 0
+0.242199 0.129011 0.143615 0.00661564 1 0
+0.254621 0.0204878 0.0150463 0.0063895 1 0
+0.260334 0.046401 0.00768789 0.00812479 1 0
+0.247893 0.0462226 0.0316245 0.00700558 1 0
+0.221421 0.134262 0.0282345 0.00655456 1 0
+0.180824 0.0228593 0.187996 0.00638733 1 0
+0.213041 0.0133159 0.19237 0.00780685 1 0
+0.194998 0.0338827 0.189502 0.0106018 1 0
+0.272619 0.189084 0.0698362 0.00594189 1 0
+0.302616 0.154225 0.0769161 0.00934855 1 0
+0.264127 0.154008 0.0797161 0.00829343 1 0
+0.269698 0.168629 0.0506287 0.0050404 1 0
+0.254899 0.0132178 0.0246547 0.00566253 1 0
+0.262937 0.0114562 0.0492763 0.00654525 1 0
+0.0232101 0.185494 0.094236 0.00642635 1 0
+0.0189702 0.190582 0.104327 0.00564361 1 0
+0.394705 0.0831134 0.171396 0.0056949 1 0
+0.384951 0.0759243 0.143572 0.00518763 1 0
+0.391195 0.109337 0.137347 0.00919292 1 0
+0.377732 0.0936121 0.147022 0.00939294 1 0
+0.0611988 0.0576605 0.0342762 0.00552004 1 0
+0.132409 0.152308 0.0376554 0.00724506 1 0
+0.257384 0.0913827 0.0213397 0.00792487 1 0
+0.273538 0.105342 0.0198757 0.0126039 1 0
+0.249536 0.115752 0.00706078 0.00712634 1 0
+0.273484 0.0906132 0.0559532 0.00589563 1 0
+0.00905115 0.0140949 0.160302 0.00928439 1 0
+0.195107 0.12811 0.194695 0.00562069 1 0
+0.170111 0.136759 0.187004 0.00585134 1 0
+0.17994 0.131085 0.156562 0.00832547 1 0
+0.164357 0.0123431 0.173025 0.00531164 1 0
+0.17351 0.0145689 0.152659 0.00496858 1 0
+0.0701793 0.171675 0.188997 0.00495742 1 0
+0.0748005 0.143099 0.15452 0.00690164 1 0
+0.374541 0.189631 0.155372 0.00811457 1 0
+0.380585 0.0188822 0.0672238 0.00714736 1 0
+0.382836 0.0435632 0.061077 0.00516762 1 0
+0.364107 0.0429161 0.0770429 0.00538829 1 0
+0.37229 0.041059 0.0512871 0.00493193 1 0
+0.355692 0.0860349 0.0875009 0.00631317 1 0
+0.349618 0.116454 0.0780361 0.00525851 1 0
+0.364768 0.0981785 0.0596607 0.00789483 1 0
+0.179002 0.0116066 0.0194827 0.00589101 1 0
+0.216723 0.0137037 0.0181508 0.00529219 1 0
+0.198619 0.00990967 0.0413414 0.0101715 1 0
+0.186634 0.0338454 0.044727 0.00608557 1 0
+0.4 0.03 0.03 0.01 2 0
+0 0.03 0.03 0.01 2 0
+0.4 0.03 0.17 0.01 2 0
+0 0.03 0.17 0.01 2 0
+0.4 0.17 0.03 0.01 2 0
+0 0.17 0.03 0.01 2 0
+0.4 0.17 0.17 0.01 2 0
+0 0.17 0.17 0.01 2 0
+0.02 0.03 0.03 0.01 2 0
+0.04 0.03 0.03 0.01 2 0
+0.06 0.03 0.03 0.01 2 0
+0.08 0.03 0.03 0.01 2 0
+0.1 0.03 0.03 0.01 2 0
+0.12 0.03 0.03 0.01 2 0
+0.14 0.03 0.03 0.01 2 0
+0.16 0.03 0.03 0.01 2 0
+0.18 0.03 0.03 0.01 2 0
+0.2 0.03 0.03 0.01 2 0
+0.22 0.03 0.03 0.01 2 0
+0.24 0.03 0.03 0.01 2 0
+0.26 0.03 0.03 0.01 2 0
+0.28 0.03 0.03 0.01 2 0
+0.3 0.03 0.03 0.01 2 0
+0.32 0.03 0.03 0.01 2 0
+0.34 0.03 0.03 0.01 2 0
+0.36 0.03 0.03 0.01 2 0
+0.38 0.03 0.03 0.01 2 0
+0.02 0.03 0.17 0.01 2 0
+0.04 0.03 0.17 0.01 2 0
+0.06 0.03 0.17 0.01 2 0
+0.08 0.03 0.17 0.01 2 0
+0.1 0.03 0.17 0.01 2 0
+0.12 0.03 0.17 0.01 2 0
+0.14 0.03 0.17 0.01 2 0
+0.16 0.03 0.17 0.01 2 0
+0.18 0.03 0.17 0.01 2 0
+0.2 0.03 0.17 0.01 2 0
+0.22 0.03 0.17 0.01 2 0
+0.24 0.03 0.17 0.01 2 0
+0.26 0.03 0.17 0.01 2 0
+0.28 0.03 0.17 0.01 2 0
+0.3 0.03 0.17 0.01 2 0
+0.32 0.03 0.17 0.01 2 0
+0.34 0.03 0.17 0.01 2 0
+0.36 0.03 0.17 0.01 2 0
+0.38 0.03 0.17 0.01 2 0
+0.02 0.17 0.03 0.01 2 0
+0.04 0.17 0.03 0.01 2 0
+0.06 0.17 0.03 0.01 2 0
+0.08 0.17 0.03 0.01 2 0
+0.1 0.17 0.03 0.01 2 0
+0.12 0.17 0.03 0.01 2 0
+0.14 0.17 0.03 0.01 2 0
+0.16 0.17 0.03 0.01 2 0
+0.18 0.17 0.03 0.01 2 0
+0.2 0.17 0.03 0.01 2 0
+0.22 0.17 0.03 0.01 2 0
+0.24 0.17 0.03 0.01 2 0
+0.26 0.17 0.03 0.01 2 0
+0.28 0.17 0.03 0.01 2 0
+0.3 0.17 0.03 0.01 2 0
+0.32 0.17 0.03 0.01 2 0
+0.34 0.17 0.03 0.01 2 0
+0.36 0.17 0.03 0.01 2 0
+0.38 0.17 0.03 0.01 2 0
+0.02 0.17 0.17 0.01 2 0
+0.04 0.17 0.17 0.01 2 0
+0.06 0.17 0.17 0.01 2 0
+0.08 0.17 0.17 0.01 2 0
+0.1 0.17 0.17 0.01 2 0
+0.12 0.17 0.17 0.01 2 0
+0.14 0.17 0.17 0.01 2 0
+0.16 0.17 0.17 0.01 2 0
+0.18 0.17 0.17 0.01 2 0
+0.2 0.17 0.17 0.01 2 0
+0.22 0.17 0.17 0.01 2 0
+0.24 0.17 0.17 0.01 2 0
+0.26 0.17 0.17 0.01 2 0
+0.28 0.17 0.17 0.01 2 0
+0.3 0.17 0.17 0.01 2 0
+0.32 0.17 0.17 0.01 2 0
+0.34 0.17 0.17 0.01 2 0
+0.36 0.17 0.17 0.01 2 0
+0.38 0.17 0.17 0.01 2 0
+0.347522 0.0798775 0.189345 0.00542525 1 0
+0.0978862 0.0443223 0.157324 0.00881265 1 0
+0.392662 0.0990343 0.149296 0.00665244 1 0
+0.27 0.186275 0.156019 0.00669684 1 0
+0.356951 0.162534 0.138065 0.00842663 1 0
+0.282853 0.0239922 0.154694 0.00641626 1 0
+0.03 0.152792 0.169299 0.005642 1 0
+0.102813 0.149965 0.130103 0.0072981 1 0
+0.246362 0.124006 0.0878291 0.00776572 1 0
+0.134712 0.0782273 0.00486166 0.00518048 1 0
+0.145202 0.0420336 0.160607 0.00612731 1 0
+0.1331 0.191055 0.13096 0.00492461 1 0
+0.178568 0.0439534 0.0151785 0.00628492 1 0
+0.0369389 0.0587979 0.0362255 0.00831987 1 0
+0.324462 0.104118 0.060766 0.00656953 1 0
+0.242014 0.156239 0.0521801 0.00555918 1 0
+0.347445 0.0793337 0.0940084 0.00614759 1 0
+0.176037 0.0328676 0.119084 0.00524276 1 0
+0.203878 0.107329 0.173163 0.00650472 1 0
+0.275532 0.0453966 0.0313616 0.00608947 1 0
+0.26178 0.155021 0.0948649 0.00706965 1 0
+0.39 0.158236 0.172488 0.00563869 1 0
+0.105644 0.0790286 0.176016 0.00580547 1 0
+0.20005 0.0366356 0.0493124 0.0083647 1 0
+0.0185075 0.160973 0.130327 0.00501499 1 0
+0.300174 0.155686 0.0955826 0.00747518 1 0
+0.113642 0.0321054 0.151243 0.00816062 1 0
+0.0507885 0.15975 0.145708 0.00739224 1 0
+0.271194 0.0350138 0.151904 0.00620918 1 0
+0.201468 0.195442 0.130678 0.00505288 1 0
+0.188726 0.172934 0.0671716 0.0054132 1 0
+0.370376 0.156378 0.178879 0.00812185 1 0
+0.212651 0.051505 0.0344394 0.00698105 1 0
+0.0728915 0.0702816 0.0670054 0.00733578 1 0
+0.27 0.0222001 0.0413285 0.00700511 1 0
+0.209838 0.078913 0.158632 0.00692605 1 0
+0.0313396 0.169454 0.0453461 0.00637858 1 0
+0.380556 0.0338425 0.153157 0.00728474 1 0
+0.327886 0.154734 0.118663 0.00729678 1 0
+0.35 0.157495 0.0225033 0.00747683 1 0
+0.0649327 0.050875 0.110639 0.00808269 1 0
+0.152733 0.0857879 0.179473 0.00634748 1 0
+0.288763 0.147693 0.0341985 0.0094579 1 0
+0.11 0.0433635 0.0307431 0.00670737 1 0
+0.361312 0.0139639 0.152203 0.00512422 1 0
+0.220006 0.095739 0.171783 0.00552227 1 0
+0.339671 0.181996 0.18433 0.00656595 1 0
+0.267395 0.194784 0.109548 0.00565878 1 0
+0.308662 0.0124479 0.173343 0.00896394 1 0
+0.253811 0.0926573 0.109213 0.0106235 1 0
+0.392837 0.123744 0.178331 0.00689455 1 0
+0.220257 0.0991966 0.0646123 0.0143061 1 0
+0.149942 0.0119581 0.0950768 0.00568721 1 0
+0.021108 0.192638 0.0225377 0.00513947 1 0
+0.202093 0.121861 0.111158 0.00779051 1 0
+0.364844 0.0434614 0.0223083 0.00624303 1 0
+0.0816671 0.141038 0.0995708 0.00766147 1 0
+0.356446 0.160479 0.0471579 0.00994152 1 0
+0.0450777 0.18198 0.0420726 0.0054801 1 0
+0.359875 0.0893131 0.177108 0.00504329 1 0
+0.0983642 0.130066 0.170333 0.00574947 1 0
+0.0337275 0.0454853 0.184088 0.00520309 1 0
+0.260472 0.183642 0.0225082 0.00557063 1 0
+0.320423 0.153275 0.0290202 0.00675951 1 0
+0.142201 0.152845 0.144419 0.0122891 1 0
+0.236239 0.12794 0.17545 0.00511185 1 0
+0.253457 0.0513097 0.0973065 0.00889881 1 0
+0.292661 0.0883479 0.0835194 0.0103442 1 0
+0.29 0.019008 0.0211345 0.00730379 1 0
+0.206797 0.109716 0.0158543 0.00644442 1 0
+0.00485992 0.157468 0.0570503 0.00495699 1 0
+0.151719 0.0532074 0.109485 0.00820095 1 0
+0.207828 0.170978 0.14269 0.00686123 1 0
+0.207725 0.0420149 0.179824 0.00733632 1 0
+0.270731 0.14459 0.099749 0.0060311 1 0
+0.184316 0.122176 0.187476 0.00577481 1 0
+0.140387 0.0445274 0.0230222 0.00612092 1 0
+0.160369 0.1527 0.0415237 0.00674556 1 0
+0.300792 0.147145 0.15994 0.00929333 1 0
+0.0525256 0.0915602 0.179181 0.00589334 1 0
+0.129693 0.175565 0.0426627 0.00688964 1 0
+0.299318 0.0291523 0.0845295 0.00620838 1 0
+0.00962742 0.0170789 0.119014 0.00614714 1 0
+0.26608 0.0134887 0.0245473 0.0055224 1 0
+0.359626 0.145645 0.018462 0.00831556 1 0
+0.264127 0.048321 0.0226428 0.00742254 1 0
+0.296538 0.081742 0.100029 0.00744197 1 0
+0.345111 0.0473617 0.172251 0.00823776 1 0
+0.0868119 0.108331 0.0569456 0.00585534 1 0
+0.174245 0.131957 0.0322579 0.00524247 1 0
+0.12388 0.118941 0.0234175 0.00751806 1 0
+0.334458 0.0902555 0.188535 0.0100815 1 0
+0.195442 0.0683869 0.120811 0.00520101 1 0
+0.33765 0.0317681 0.0132248 0.00499725 1 0
+0.0139264 0.0661681 0.057607 0.00498931 1 0
+0.366444 0.176412 0.0907763 0.00508473 1 0
+0.251406 0.18165 0.175613 0.00552709 1 0
+0.0480855 0.0204338 0.179939 0.00598943 1 0
+0.342488 0.0409397 0.10765 0.00671023 1 0
+0.172764 0.118587 0.043688 0.00660758 1 0
+0.33 0.0380642 0.179743 0.0061229 1 0
+0.177923 0.116745 0.0232329 0.00649864 1 0
+0.0434834 0.147828 0.0215313 0.0051462 1 0
+0.130758 0.0473001 0.0975034 0.00695327 1 0
+0.272865 0.0192001 0.132966 0.00589323 1 0
+0.265019 0.150946 0.168352 0.00741564 1 0
+0.24418 0.0141703 0.0369479 0.00778553 1 0
+0.336748 0.170515 0.077577 0.0071526 1 0
+0.184562 0.178649 0.112849 0.00958207 1 0
+0.362317 0.110098 0.0861787 0.00522559 1 0
+0.157402 0.116345 0.119616 0.00810692 1 0
+0.208746 0.0329015 0.0825929 0.00742124 1 0
+0.0497274 0.0591842 0.0861661 0.00559058 1 0
+0.01 0.0185565 0.177554 0.00697095 1 0
+0.0728359 0.0892859 0.0249654 0.00991388 1 0
+0.00664008 0.149212 0.0165518 0.00717416 1 0
+0.214491 0.0193724 0.180289 0.00578476 1 0
+0.277068 0.191227 0.0809189 0.00619127 1 0
+0.0424533 0.104161 0.0716172 0.00799191 1 0
+0.31 0.0402308 0.0232237 0.00582996 1 0
+0.27754 0.184929 0.172891 0.00540447 1 0
+0.252694 0.158786 0.0735484 0.00554851 1 0
+0.3085 0.0988447 0.149485 0.0110854 1 0
+0.146358 0.0654075 0.176887 0.00852953 1 0
+0.15028 0.0850435 0.124902 0.0097613 1 0
+0.331544 0.04829 0.19056 0.00819168 1 0
+0.351251 0.101156 0.135048 0.00589803 1 0
+0.186782 0.165407 0.083592 0.00584857 1 0
+0.325097 0.166509 0.185233 0.00643767 1 0
+0.0918322 0.180427 0.0413606 0.00745013 1 0
+0.160433 0.0312632 0.152793 0.00725904 1 0
+0.17575 0.0105614 0.189975 0.00706232 1 0
+0.11 0.0178155 0.165291 0.00645094 1 0
+0.209597 0.178443 0.177733 0.00493965 1 0
+0.0474925 0.152649 0.157478 0.00674388 1 0
+0.0970484 0.187071 0.0748803 0.00561971 1 0
+0.127766 0.16398 0.184554 0.00756034 1 0
+0.138599 0.0762437 0.189021 0.00663846 1 0
+0.091639 0.0976758 0.118241 0.00951811 1 0
+0.37809 0.0472335 0.165234 0.0079822 1 0
+0.09 0.155653 0.166236 0.0078889 1 0
+0.222052 0.0741071 0.101548 0.00603959 1 0
+0.360558 0.156651 0.0895007 0.0104342 1 0
+0.0209121 0.156322 0.178298 0.00574117 1 0
+0.275085 0.0433949 0.176447 0.00565728 1 0
+0.132939 0.151075 0.159076 0.00513916 1 0
+0.338449 0.0869435 0.0180735 0.00838531 1 0
+0.255873 0.0180861 0.178487 0.00519845 1 0
+0.19 0.178801 0.0412054 0.0074073 1 0
+0.24197 0.150359 0.0663884 0.00600992 1 0
+0.366987 0.0483655 0.151525 0.00651083 1 0
+0.258204 0.0950625 0.0787748 0.0143746 1 0
+0.313156 0.0696813 0.0855558 0.00515003 1 0
+0.0224121 0.161022 0.017894 0.00526373 1 0
+0.378217 0.181987 0.0709204 0.0053618 1 0
+0.336389 0.151644 0.165116 0.00933514 1 0
+0.265528 0.039234 0.181998 0.00611775 1 0
+0.0774819 0.181246 0.0528093 0.0054311 1 0
+0.366662 0.0219018 0.158378 0.00565348 1 0
+0.159721 0.0359766 0.0451912 0.00632694 1 0
+0.153264 0.142666 0.0149768 0.00576333 1 0
+0.267688 0.0789297 0.0281816 0.00545798 1 0
+0.359133 0.041135 0.10209 0.00997302 1 0
+0.27 0.156557 0.179664 0.00615902 1 0
+0.157162 0.0928317 0.0624114 0.00930508 1 0
+0.24382 0.0682745 0.191382 0.00498369 1 0
+0.030824 0.119874 0.0824092 0.00589828 1 0
+0.0607368 0.0719771 0.121373 0.006561 1 0
+0.182555 0.0870453 0.131754 0.00758449 1 0
+0.249288 0.171861 0.00902276 0.00894261 1 0
+0.128277 0.140272 0.0478176 0.00904013 1 0
+0.39 0.0408851 0.179636 0.00764493 1 0
+0.344839 0.0246951 0.0561511 0.00517938 1 0
+0.374681 0.124486 0.022 0.00793192 1 0
+0.172293 0.0940976 0.0800211 0.00723459 1 0
+0.189986 0.15199 0.152309 0.0069387 1 0
+0.0808306 0.0847432 0.0775252 0.00801434 1 0
+0.35 0.0244296 0.180218 0.00534406 1 0
+0.29128 0.068629 0.089716 0.00854914 1 0
+0.370536 0.00948985 0.15318 0.00517375 1 0
+0.138975 0.029358 0.0148715 0.0051768 1 0
+0.229972 0.163942 0.156787 0.0076274 1 0
+0.0458068 0.0745883 0.105977 0.00800304 1 0
+0.387971 0.13337 0.0972578 0.005263 1 0
+0.267418 0.123144 0.103298 0.00717081 1 0
+0.289479 0.116327 0.166929 0.00597564 1 0
+0.0076274 0.0163704 0.0386944 0.00763753 1 0
+0.168509 0.182954 0.0239459 0.006639 1 0
+0.15 0.176936 0.0391289 0.00521332 1 0
+0.37 0.158822 0.0381978 0.00639058 1 0
+0.393535 0.192952 0.0828301 0.0070797 1 0
+0.220561 0.152147 0.0267704 0.0081512 1 0
+0.0723325 0.16431 0.182063 0.00538414 1 0
+0.334911 0.0744686 0.0606515 0.00522857 1 0
+0.235834 0.026813 0.0458702 0.00671452 1 0
+0.195435 0.0170165 0.162842 0.00551265 1 0
+0.269892 0.0607274 0.109486 0.00883171 1 0
+0.343501 0.0709899 0.0209709 0.0057976 1 0
+0.222355 0.0915619 0.123518 0.00627954 1 0
+0.14512 0.0672658 0.124313 0.00713699 1 0
+0.0789361 0.0122478 0.165528 0.00833777 1 0
+0.303859 0.120825 0.105216 0.00568384 1 0
+0.0668885 0.187978 0.0470427 0.0057157 1 0
+0.0474666 0.176518 0.156891 0.00643413 1 0
+0.0546208 0.00894538 0.0542628 0.00499468 1 0
+0.163881 0.165255 0.0156245 0.00562792 1 0
+0.264941 0.0352942 0.0524973 0.00526542 1 0
+0.0682807 0.131748 0.126804 0.00521273 1 0
+0.31 0.0414694 0.0383149 0.00734023 1 0
+0.293551 0.0411853 0.146535 0.00674033 1 0
+0.259371 0.101169 0.0300947 0.00535567 1 0
+0.0236936 0.19498 0.117863 0.00556218 1 0
+0.194553 0.0960323 0.00662746 0.00534121 1 0
+0.144031 0.00765253 0.0145084 0.00790903 1 0
+0.387286 0.0283025 0.183463 0.00540204 1 0
+0.190849 0.085665 0.042132 0.0058276 1 0
+0.337163 0.0493615 0.0297166 0.00957028 1 0
+0.0702921 0.0508055 0.0761078 0.00887061 1 0
+0.363204 0.079317 0.031058 0.00585507 1 0
+0.0239026 0.0171388 0.0732999 0.00558563 1 0
+0.31 0.171377 0.0410328 0.00495384 1 0
+0.242897 0.0431399 0.157876 0.00764433 1 0
+0.0232279 0.0625859 0.0569853 0.00499752 1 0
+0.308419 0.154837 0.0283139 0.00536722 1 0
+0.351596 0.0296902 0.0490809 0.00580207 1 0
+0.00724216 0.107479 0.173821 0.0052565 1 0
+0.320234 0.110807 0.157754 0.00760032 1 0
+0.10993 0.17569 0.0450187 0.00888243 1 0
+0.0556015 0.0166924 0.153296 0.0118053 1 0
+0.255539 0.0102831 0.109715 0.00796557 1 0
+0.146502 0.158052 0.0927089 0.00542645 1 0
+0.105747 0.0703886 0.184545 0.00523508 1 0
+0.32732 0.123906 0.044966 0.00633809 1 0
+0.167621 0.160837 0.179697 0.00536462 1 0
+0.156603 0.15324 0.169971 0.00710102 1 0
+0.308484 0.164311 0.181512 0.00539052 1 0
+0.0635922 0.181646 0.183508 0.00623565 1 0
+0.0488876 0.155546 0.17358 0.00734124 1 0
+0.05 0.161337 0.0228354 0.00504587 1 0
+0.333482 0.115593 0.0639115 0.00588445 1 0
+0.311958 0.0137062 0.111868 0.00852586 1 0
+0.07 0.0223539 0.18273 0.00591058 1 0
+0.00719179 0.070529 0.0416848 0.00606667 1 0
+0.101032 0.0195252 0.155612 0.00685467 1 0
+0.0254764 0.0434224 0.0366104 0.00593267 1 0
+0.0697503 0.14859 0.103677 0.00703194 1 0
+0.0853097 0.164886 0.121862 0.00635816 1 0
+0.261932 0.182529 0.103209 0.0052298 1 0
+0.287308 0.151721 0.168501 0.00726717 1 0
+0.0169782 0.15904 0.0805994 0.0050559 1 0
+0.14364 0.0674591 0.13787 0.0055179 1 0
+0.231317 0.120206 0.0514386 0.00936835 1 0
+0.0573314 0.122786 0.19436 0.00603971 1 0
+0.0281059 0.0184631 0.021398 0.00499663 1 0
+0.263591 0.0639061 0.174787 0.00656042 1 0
+0.0581201 0.184798 0.163389 0.00631669 1 0
+0.179217 0.044415 0.158281 0.00766895 1 0
+0.0731051 0.0881463 0.180648 0.00529527 1 0
+0.09 0.0359271 0.0194755 0.0049713 1 0
+0.23 0.157473 0.178684 0.0080108 1 0
+0.341498 0.194203 0.0117522 0.00650448 1 0
+0.391166 0.10602 0.0685237 0.0059928 1 0
+0.358029 0.0186959 0.108716 0.00560939 1 0
+0.329772 0.17071 0.121833 0.00909976 1 0
+0.335608 0.0574737 0.173582 0.0057023 1 0
+0.331246 0.159417 0.103862 0.0085865 1 0
+0.0563992 0.0102386 0.185024 0.00576244 1 0
+0.213145 0.0479381 0.170198 0.00519868 1 0
+0.0938822 0.161259 0.0546349 0.00524396 1 0
+0.264021 0.027745 0.0944503 0.00506959 1 0
+0.140928 0.0777212 0.176066 0.00495326 1 0
+0.161296 0.115551 0.0985767 0.00666958 1 0
+0.280353 0.130673 0.178957 0.00528118 1 0
+0.156516 0.136071 0.178792 0.00753372 1 0
+0.251158 0.0395676 0.121355 0.00764725 1 0
+0.326188 0.034959 0.0461858 0.00591718 1 0
+0.217008 0.055159 0.00923339 0.0062824 1 0
+0.24511 0.0178481 0.0217576 0.00554719 1 0
+0.192659 0.033758 0.130776 0.00667871 1 0
+0.134313 0.00674791 0.123773 0.00571604 1 0
+0.25894 0.00798155 0.142322 0.00527416 1 0
+0.0989189 0.138211 0.188624 0.00693057 1 0
+0.188807 0.154195 0.0314249 0.00814928 1 0
+0.0465999 0.0158036 0.0306726 0.00566998 1 0
+0.21 0.178166 0.16205 0.00516225 1 0
+0.103462 0.0747507 0.162656 0.00566988 1 0
+0.232491 0.186303 0.165265 0.00743411 1 0
+0.0948224 0.0458309 0.0355574 0.00719834 1 0
+0.137066 0.0453262 0.182442 0.00595659 1 0
+0.0606057 0.0509872 0.139644 0.00577137 1 0
+0.118997 0.0803134 0.0169132 0.00963772 1 0
+0.0648667 0.150087 0.129484 0.00620631 1 0
+0.13 0.168638 0.0183636 0.00540324 1 0
+0.328037 0.00816448 0.0789749 0.00836521 1 0
+0.261785 0.0674796 0.0860459 0.00765607 1 0
+0.265839 0.12281 0.0595413 0.0109387 1 0
+0.125226 0.108533 0.114202 0.00615113 1 0
+0.215342 0.155261 0.153166 0.0062645 1 0
+0.189995 0.0465725 0.0353405 0.00970266 1 0
+0.0885535 0.0561785 0.184883 0.00626981 1 0
+0.121939 0.169556 0.15395 0.00617321 1 0
+0.11 0.174743 0.0199283 0.00496436 1 0
+0.331276 0.142067 0.0574075 0.0114335 1 0
+0.0469555 0.0789318 0.0751397 0.00502226 1 0
+0.20313 0.095668 0.132944 0.0065325 1 0
+0.0264725 0.182658 0.163376 0.00525103 1 0
+0.0549236 0.0830398 0.0891248 0.0062925 1 0
+0.309388 0.0495779 0.0630322 0.00534495 1 0
+0.234442 0.182998 0.0358474 0.00529841 1 0
+0.206371 0.159944 0.0584285 0.00581264 1 0
+0.306901 0.125028 0.0251801 0.010106 1 0
+0.101812 0.0251804 0.129384 0.00802216 1 0
+0.369995 0.173609 0.181455 0.00562445 1 0
+0.349316 0.114621 0.138382 0.00538571 1 0
+0.330089 0.129989 0.143439 0.00887266 1 0
+0.115997 0.191979 0.0698904 0.00832214 1 0
+0.177899 0.0857562 0.112367 0.00852281 1 0
+0.072263 0.030518 0.111296 0.00596901 1 0
+0.352759 0.136596 0.0576396 0.00644424 1 0
+0.230748 0.0966892 0.17339 0.00538032 1 0
+0.0458287 0.0433015 0.158147 0.00874561 1 0
+0.0980732 0.171347 0.0552498 0.00569654 1 0
+0.305693 0.155839 0.127417 0.00593698 1 0
+0.335309 0.126327 0.0706772 0.00693509 1 0
+0.314188 0.143696 0.103088 0.0107034 1 0
+0.142819 0.173227 0.0858479 0.0112391 1 0
+0.31 0.0348089 0.180252 0.00510729 1 0
+0.15 0.0436508 0.0331577 0.00721381 1 0
+0.19796 0.0280548 0.148822 0.00873619 1 0
+0.287608 0.0440149 0.181191 0.00508972 1 0
+0.234242 0.0276053 0.0936894 0.00535566 1 0
+0.200447 0.0930969 0.0415927 0.00509391 1 0
+0.33 0.0395939 0.0215398 0.00504401 1 0
+0.108655 0.0741489 0.140021 0.00772278 1 0
+0.23 0.0336803 0.155098 0.00832 1 0
+0.05 0.0465513 0.0365519 0.0095876 1 0
+0.102633 0.158261 0.0806719 0.00520046 1 0
+0.30296 0.116641 0.142802 0.00871556 1 0
+0.146636 0.0086573 0.0811116 0.00646753 1 0
+0.248061 0.150212 0.159558 0.00759468 1 0
+0.0511742 0.126609 0.00468162 0.00493993 1 0
+0.160765 0.14026 0.105735 0.00630499 1 0
+0.203703 0.132457 0.169937 0.00620977 1 0
+0.287417 0.086656 0.114549 0.00635341 1 0
+0.0993595 0.191428 0.098834 0.00507766 1 0
+0.313624 0.145026 0.121706 0.00796975 1 0
+0.122538 0.15124 0.154183 0.00635657 1 0
+0.0604078 0.0152021 0.123458 0.00542286 1 0
+0.0223381 0.125728 0.135981 0.00585759 1 0
+0.315672 0.149159 0.0607302 0.00602484 1 0
+0.3332 0.164513 0.0123964 0.00965288 1 0
+0.37582 0.172889 0.0147571 0.00606757 1 0
+0.052553 0.0588091 0.110053 0.00604681 1 0
+0.140355 0.0965998 0.0802462 0.0122419 1 0
+0.0973348 0.00627142 0.0760289 0.00540746 1 0
+0.279178 0.0296219 0.185108 0.00513539 1 0
+0.00445371 0.0476518 0.120346 0.00494855 1 0
+0.0644919 0.191953 0.00716455 0.00588954 1 0
+0.0869399 0.0810823 0.10593 0.0102924 1 0
+0.340655 0.171237 0.140926 0.00589336 1 0
+0.237862 0.110315 0.0055321 0.00579299 1 0
+0.320733 0.173027 0.0827873 0.00563505 1 0
+0.144934 0.0258788 0.0882664 0.00526551 1 0
+0.101809 0.0163963 0.176675 0.00526074 1 0
+0.107666 0.0199858 0.0178321 0.00611792 1 0
+0.0498234 0.0372418 0.0210861 0.00511295 1 0
+0.110865 0.0949012 0.0684746 0.0052638 1 0
+0.38057 0.176806 0.0552643 0.00512958 1 0
+0.197033 0.114059 0.138863 0.0084076 1 0
+0.249194 0.109915 0.166191 0.00529529 1 0
+0.0862794 0.154898 0.17898 0.00540933 1 0
+0.27033 0.12531 0.0158457 0.00713187 1 0
+0.32917 0.0623616 0.0191554 0.00725251 1 0
+0.0834931 0.060607 0.0794537 0.00790831 1 0
+0.00791223 0.0940613 0.176638 0.00505783 1 0
+0.0787373 0.191473 0.104354 0.00497613 1 0
+0.354648 0.0809409 0.165555 0.00512381 1 0
+0.195343 0.0213989 0.0684254 0.00535459 1 0
+0.202165 0.116979 0.091119 0.011077 1 0
+0.183385 0.12038 0.10588 0.0066955 1 0
+0.100627 0.181147 0.150607 0.00892321 1 0
+0.184063 0.182109 0.0222756 0.00492635 1 0
+0.269945 0.0508076 0.0970386 0.00613515 1 0
+0.223061 0.0442632 0.164099 0.00573653 1 0
+0.379559 0.149125 0.1674 0.00558254 1 0
+0.166691 0.0981379 0.126571 0.0102523 1 0
+0.146453 0.178477 0.0102732 0.00546206 1 0
+0.250081 0.139208 0.105752 0.00666326 1 0
+0.0828624 0.049343 0.0991538 0.00917406 1 0
+0.114047 0.157075 0.0674288 0.00748147 1 0
+0.325864 0.0379841 0.102682 0.00760018 1 0
+0.0865448 0.0333339 0.154956 0.00674158 1 0
+0.179765 0.0194648 0.159028 0.00521305 1 0
+0.158754 0.0550893 0.0664386 0.00526478 1 0
+0.268519 0.0975019 0.126336 0.00843922 1 0
+0.0780719 0.0491939 0.0311838 0.00541201 1 0
+0.333234 0.187204 0.0596276 0.00554904 1 0
+0.209764 0.108087 0.146589 0.0067205 1 0
+0.184083 0.128664 0.130131 0.0123429 1 0
+0.286562 0.0698164 0.19439 0.0059234 1 0
+0.03 0.167223 0.158687 0.00535208 1 0
+0.0905275 0.0637841 0.115981 0.00517076 1 0
+0.0903216 0.0828469 0.0253702 0.00656234 1 0
+0.21 0.181115 0.0256308 0.00557701 1 0
+0.392997 0.123522 0.0881469 0.00713771 1 0
+0.27 0.177572 0.0390839 0.00548721 1 0
+0.341463 0.070823 0.130651 0.00521516 1 0
+0.0368654 0.0432709 0.0217789 0.00592252 1 0
+0.19 0.0188588 0.0323655 0.00515657 1 0
+0.11 0.0373125 0.019389 0.00609366 1 0
+0.102 0.0568128 0.166768 0.00737801 1 0
+0.37 0.16207 0.157379 0.0079496 1 0
+0.372113 0.105287 0.140051 0.00531965 1 0
+0.00599721 0.0650202 0.0947234 0.00597836 1 0
+0.24746 0.0529289 0.0668096 0.00629904 1 0
+0.0104065 0.136024 0.0294409 0.00654423 1 0
+0.231698 0.130363 0.18604 0.00628433 1 0
+0.29 0.0290446 0.044384 0.00754462 1 0
+0.028435 0.130973 0.0597217 0.00492464 1 0
+0.367429 0.109044 0.174486 0.00512261 1 0
+0.262766 0.0628471 0.0261988 0.00537886 1 0
+0.258736 0.100411 0.00488452 0.00494719 1 0
+0.321904 0.12017 0.085994 0.0113597 1 0
+0.262991 0.0494983 0.190873 0.00682598 1 0
+0.03 0.0189616 0.177748 0.00507591 1 0
+0.0587581 0.0997631 0.159554 0.00614663 1 0
+0.0638137 0.00656929 0.0414673 0.00611381 1 0
+0.11821 0.026267 0.0533042 0.00661779 1 0
+0.33 0.0415766 0.169184 0.005005 1 0
+0.345193 0.112954 0.163829 0.00498868 1 0
+0.392254 0.0472032 0.0473154 0.0054577 1 0
+0.0286494 0.11133 0.0760248 0.0049874 1 0
+0.27 0.0365696 0.0170355 0.00686145 1 0
+0.13948 0.0741076 0.165953 0.00537703 1 0
+0.152228 0.180271 0.0220904 0.00511481 1 0
+0.11 0.159652 0.175278 0.0053276 1 0
+0.130342 0.0749803 0.127891 0.00794283 1 0
+0.37 0.0455926 0.178018 0.007069 1 0
+0.174904 0.15232 0.159484 0.0097671 1 0
+0.258567 0.142183 0.0704392 0.00773136 1 0
+0.221933 0.0370084 0.0950801 0.00995903 1 0
+0.273527 0.0201031 0.0938819 0.00499655 1 0
+0.374264 0.12754 0.119256 0.00628468 1 0
+0.118483 0.012984 0.0645129 0.00630568 1 0
+0.241122 0.0152128 0.15513 0.00617623 1 0
+0.0291186 0.0337872 0.0429776 0.00617698 1 0
+0.333775 0.066065 0.0826432 0.00498637 1 0
+0.37 0.181074 0.0233665 0.00632907 1 0
+0.223202 0.18819 0.0923402 0.00498807 1 0
+0.346015 0.0269364 0.134661 0.00559914 1 0
+0.07 0.0416623 0.178629 0.00762019 1 0
+0.280236 0.0510122 0.119443 0.00670719 1 0
+0.261681 0.0470373 0.126408 0.005187 1 0
+0.307872 0.125585 0.172237 0.00807778 1 0
+0.37691 0.0493025 0.0547169 0.00512084 1 0
+0.199809 0.142591 0.11782 0.00520728 1 0
+0.290256 0.175235 0.122551 0.00533184 1 0
+0.359318 0.162337 0.0625626 0.00527138 1 0
+0.266254 0.130207 0.0276945 0.00581197 1 0
+0.216126 0.102205 0.136049 0.00568307 1 0
+0.305954 0.165733 0.085845 0.00559505 1 0
+0.194504 0.103429 0.179534 0.00548175 1 0
+0.0595778 0.17011 0.0454706 0.00547673 1 0
+0.120786 0.149805 0.0197906 0.00838019 1 0
+0.226249 0.0744244 0.115243 0.00828741 1 0
+0.229092 0.0811134 0.0322316 0.0060468 1 0
+0.0234179 0.155289 0.0264939 0.00512035 1 0
+0.0953025 0.0401542 0.182022 0.00642255 1 0
+0.24542 0.121912 0.0445354 0.0058618 1 0
+0.250948 0.153357 0.027401 0.00830815 1 0
+0.14512 0.0114577 0.184325 0.00537055 1 0
+0.229495 0.0740694 0.0408994 0.00512964 1 0
+0.245814 0.0900784 0.0454943 0.00532297 1 0
+0.3414 0.125404 0.0907135 0.00854917 1 0
+0.0809721 0.133603 0.142928 0.00715165 1 0
+0.01 0.0400683 0.175232 0.00512425 1 0
+0.175861 0.00960354 0.101807 0.0076149 1 0
+0.110409 0.0662879 0.0110968 0.00780684 1 0
+0.068644 0.126408 0.0158185 0.00551588 1 0
+0.341462 0.0416071 0.0919578 0.00625069 1 0
+0.237534 0.0419936 0.0999316 0.00501946 1 0
+0.0621255 0.0923219 0.0886774 0.0050362 1 0
+0.219184 0.0495255 0.0811933 0.00731089 1 0
+0.387963 0.0545049 0.0624941 0.00501702 1 0
+0.139508 0.0367064 0.0988393 0.00498963 1 0
+0.11 0.0189772 0.0326292 0.00511339 1 0
+0.266344 0.0950372 0.139461 0.00509116 1 0
+0.307471 0.185989 0.0714464 0.00500287 1 0
+0.181953 0.0950166 0.00545282 0.0055711 1 0
+0.118734 0.0115042 0.0312841 0.00512618 1 0
+0.15 0.160336 0.0231105 0.00551957 1 0
+0.22619 0.0202691 0.0185718 0.00623608 1 0
+0.276323 0.0724613 0.123032 0.00660369 1 0
+0.220569 0.076601 0.172806 0.00492155 1 0
+0.100232 0.131322 0.143208 0.00639902 1 0
+0.394782 0.0236983 0.13031 0.00492271 1 0
+0.382281 0.0185517 0.0169469 0.00592855 1 0
+0.22683 0.0322293 0.0166972 0.00511889 1 0
+0.0489981 0.170903 0.18261 0.0055178 1 0
+0.349467 0.075473 0.0104567 0.00518068 1 0
+0.139219 0.109415 0.0104712 0.00569116 1 0
+0.240757 0.104913 0.175124 0.00559638 1 0
+0.0937754 0.0174482 0.140284 0.00660599 1 0
+0.218027 0.187273 0.070854 0.00499785 1 0
+0.246405 0.0970869 0.0365274 0.00607323 1 0
+0.287901 0.18408 0.0332955 0.00647807 1 0
+0.376126 0.100972 0.0352068 0.00496434 1 0
+0.209984 0.155755 0.164863 0.00661049 1 0
+0.0273352 0.180617 0.179068 0.00577195 1 0
+0.175007 0.0219339 0.0183149 0.00505085 1 0
+0.0228989 0.0946957 0.170487 0.00554807 1 0
+0.0314103 0.0460342 0.165143 0.00751195 1 0
+0.370248 0.0450066 0.0410144 0.00626097 1 0
+0.27816 0.0123399 0.0452198 0.00530145 1 0
+0.39 0.176178 0.18115 0.00620133 1 0
+0.256466 0.186298 0.11359 0.00675823 1 0
+0.357651 0.140973 0.158994 0.00677486 1 0
+0.33 0.176801 0.161228 0.00494019 1 0
+0.28369 0.16306 0.0484567 0.00552614 1 0
+0.209807 0.0179606 0.135153 0.00640212 1 0
+0.374754 0.113029 0.0121099 0.00503982 1 0
+0.0743218 0.0220835 0.0127212 0.00599074 1 0
+0.18094 0.170539 0.128215 0.00762202 1 0
+0.09 0.0187735 0.176421 0.00634823 1 0
+0.05 0.181269 0.0284853 0.00514207 1 0
+0.382123 0.104338 0.155546 0.00499356 1 0
+0.32331 0.0201479 0.0853821 0.0060223 1 0
+0.21477 0.166049 0.0164699 0.00503424 1 0
+0.360868 0.0609557 0.111799 0.00616562 1 0
+0.18085 0.0321406 0.14269 0.00675333 1 0
+0.376028 0.1525 0.195405 0.00500279 1 0
+0.23225 0.024593 0.184328 0.00716327 1 0
+0.101793 0.10075 0.0728653 0.00600643 1 0
+0.12091 0.179599 0.0179687 0.00541848 1 0
+0.0640294 0.159891 0.0402461 0.00494685 1 0
+0.154054 0.185061 0.159621 0.00923332 1 0
+0.132175 0.0181216 0.17936 0.0067317 1 0
+0.23 0.180445 0.0248208 0.00535967 1 0
+0.11 0.15442 0.0350109 0.00917913 1 0
+0.156521 0.0697386 0.118669 0.00582222 1 0
+0.309131 0.137733 0.184422 0.00778363 1 0
+0.366573 0.021133 0.181724 0.00603386 1 0
+0.358072 0.127979 0.121924 0.005249 1 0
+0.12069 0.108055 0.166835 0.00967485 1 0
+0.35182 0.095704 0.174893 0.00547524 1 0
+0.27 0.167186 0.0407491 0.00494861 1 0
+0.13 0.0433101 0.031196 0.00669101 1 0
+0.0081316 0.173136 0.0422839 0.00506157 1 0
+0.122184 0.140332 0.0098268 0.00543885 1 0
+0.0236819 0.0581298 0.119657 0.0051633 1 0
+0.07 0.0351198 0.155468 0.00836856 1 0
+0.10544 0.111304 0.04461 0.00622339 1 0
+0.31127 0.0701473 0.114328 0.0058661 1 0
+0.354215 0.0480357 0.0842499 0.00633501 1 0
+0.0804859 0.0484113 0.171363 0.0068126 1 0
+0.172237 0.115855 0.106807 0.00537165 1 0
+0.0455084 0.160394 0.0412336 0.00577368 1 0
+0.202462 0.0695508 0.160314 0.00511081 1 0
+0.127363 0.189716 0.0842867 0.00989146 1 0
+0.0967372 0.10246 0.175354 0.00649448 1 0
+0.29834 0.054986 0.0621569 0.00507099 1 0
+0.339449 0.0122872 0.0219697 0.00582351 1 0
+0.339266 0.172422 0.0589719 0.00640596 1 0
+0.33 0.0206983 0.181778 0.00636567 1 0
+0.266732 0.100053 0.0608677 0.00607784 1 0
+0.380859 0.0514983 0.1034 0.00560041 1 0
+0.335886 0.0528022 0.0844396 0.00499071 1 0
+0.35 0.0212422 0.0391845 0.00539966 1 0
+0.381987 0.173518 0.0456676 0.00511331 1 0
+0.271273 0.161918 0.0586698 0.00555117 1 0
+0.0925863 0.183631 0.132173 0.00543901 1 0
+0.258335 0.12838 0.125804 0.00532049 1 0
+0.332545 0.139745 0.1934 0.00566671 1 0
+0.269576 0.0853788 0.0088008 0.00833053 1 0
+0.230941 0.017388 0.16918 0.00554991 1 0
+0.339962 0.0828962 0.156992 0.00606685 1 0
+0.289594 0.099299 0.0979231 0.0057516 1 0
+0.140955 0.193737 0.0954806 0.00640935 1 0
+0.118922 0.195137 0.118187 0.00530406 1 0
+0.0591231 0.0998853 0.0219789 0.00663882 1 0
+0.319005 0.15718 0.158883 0.00699831 1 0
+0.127877 0.155594 0.057736 0.00769139 1 0
+0.318294 0.16287 0.129378 0.0064074 1 0
+0.36565 0.0218976 0.0162911 0.00645217 1 0
+0.00566143 0.076938 0.179819 0.00541591 1 0
+0.293948 0.0438732 0.017724 0.00529041 1 0
+0.0624557 0.0779759 0.0326174 0.00502421 1 0
+0.376266 0.00748401 0.0779648 0.00547678 1 0
+0.0682995 0.172801 0.154954 0.00740985 1 0
+0.0594805 0.127945 0.0586856 0.00525666 1 0
+0.347452 0.0663356 0.119742 0.0069306 1 0
+0.184045 0.0231649 0.0428077 0.00507048 1 0
+0.316409 0.118177 0.0351041 0.0052505 1 0
+0.351999 0.141379 0.092419 0.00731385 1 0
+0.09 0.0212043 0.159808 0.00506732 1 0
+0.0585221 0.017857 0.0399701 0.00578099 1 0
+0.155197 0.00481838 0.142725 0.00492107 1 0
+0.30678 0.0953303 0.0300757 0.00624598 1 0
+0.393444 0.136023 0.0439173 0.00510526 1 0
+0.125353 0.0507762 0.110233 0.00638261 1 0
+0.351042 0.145311 0.0675031 0.00682948 1 0
+0.254195 0.0381235 0.0413503 0.00511698 1 0
+0.01 0.180899 0.0322408 0.00495998 1 0
+0.0483639 0.0473283 0.0625009 0.00500291 1 0
+0.194708 0.0966212 0.170253 0.00499734 1 0
+0.187264 0.183601 0.170186 0.00542055 1 0
+0.222129 0.115037 0.148178 0.00643828 1 0
+0.0430709 0.0295178 0.149118 0.0066055 1 0
+0.128507 0.0100832 0.0801202 0.00561299 1 0
+0.233596 0.122146 0.0371903 0.00519093 1 0
+0.0971237 0.130173 0.0772085 0.00719146 1 0
+0.00891847 0.0214366 0.052843 0.00603167 1 0
+0.333253 0.0299159 0.0869719 0.00556045 1 0
+0.139007 0.146844 0.179856 0.00804221 1 0
+0.0889269 0.120896 0.17275 0.0069551 1 0
+0.076424 0.0383375 0.0433011 0.00610034 1 0
+0.115177 0.0947907 0.177942 0.00848365 1 0
+0.0519639 0.0337147 0.182047 0.00495052 1 0
+0.280811 0.147314 0.124882 0.00644796 1 0
+0.175351 0.0993935 0.0629356 0.00616285 1 0
+0.232532 0.140507 0.00982939 0.00553772 1 0
+0.3443 0.0707592 0.0655399 0.00521791 1 0
+0.148259 0.169095 0.147212 0.005276 1 0
+0.0806145 0.0696028 0.148441 0.00697314 1 0
+0.377057 0.0938253 0.0614691 0.00526754 1 0
+0.176727 0.163044 0.0167244 0.00534095 1 0
+0.3747 0.183974 0.167391 0.00517088 1 0
+0.116467 0.129337 0.00737408 0.00584774 1 0
+0.265312 0.0469076 0.162889 0.00895888 1 0
+0.210312 0.136884 0.0516481 0.0050044 1 0
+0.382313 0.188611 0.0781563 0.00508364 1 0
+0.256426 0.156039 0.0443755 0.00729046 1 0
+0.110251 0.153492 0.110863 0.00841988 1 0
+0.153164 0.18907 0.0510826 0.00505197 1 0
+0.135832 0.105832 0.171815 0.00641906 1 0
+0.215764 0.0305541 0.0723022 0.00525438 1 0
+0.310033 0.142274 0.171375 0.00606043 1 0
+0.15 0.164059 0.0410785 0.00606329 1 0
+0.372926 0.0870483 0.194764 0.00526985 1 0
+0.277151 0.166751 0.184336 0.00497332 1 0
+0.233981 0.116093 0.174304 0.00507903 1 0
+0.170618 0.0208526 0.19461 0.00533624 1 0
+0.31 0.176127 0.0200096 0.00540617 1 0
+0.101048 0.0762601 0.0845436 0.00718604 1 0
+0.0542891 0.0249088 0.109028 0.00805957 1 0
+0.124952 0.117632 0.0917484 0.00791336 1 0
+0.347463 0.0241088 0.106902 0.00563985 1 0
+0.0329361 0.150373 0.120633 0.00579599 1 0
+0.0245338 0.0119199 0.158341 0.00647275 1 0
+0.172233 0.146717 0.0576079 0.00512017 1 0
+0.0883143 0.156751 0.100443 0.00659294 1 0
+0.214205 0.160449 0.179897 0.00492494 1 0
+0.135415 0.0877608 0.169698 0.00815181 1 0
+0.170844 0.0282051 0.128725 0.00611538 1 0
+0.153428 0.110489 0.144807 0.00597814 1 0
+0.193851 0.0220132 0.0994787 0.00552583 1 0
+0.323255 0.167198 0.0474381 0.00795909 1 0
+0.179707 0.164925 0.0747548 0.005482 1 0
+0.0511664 0.13624 0.0541774 0.00719237 1 0
+0.338068 0.176277 0.153188 0.00581013 1 0
+0.364839 0.0856002 0.0571979 0.00492247 1 0
+0.245009 0.190734 0.148366 0.00500709 1 0
+0.208114 0.0832033 0.0596652 0.00637513 1 0
+0.295831 0.116129 0.0184326 0.0056183 1 0
+0.34496 0.165245 0.132476 0.00507771 1 0
+0.0531677 0.18774 0.096376 0.00534642 1 0
+0.382862 0.132041 0.0397941 0.00514877 1 0
+0.322868 0.132797 0.0297669 0.00680391 1 0
+0.345811 0.139817 0.0350729 0.00615701 1 0
+0.0995122 0.174468 0.0147702 0.00587915 1 0
+0.24042 0.0930751 0.0560819 0.0061489 1 0
+0.35639 0.0526969 0.14479 0.00524043 1 0
+0.288497 0.168296 0.150794 0.0110711 1 0
+0.337262 0.163029 0.0517847 0.00558953 1 0
+0.261944 0.0256295 0.116649 0.00566127 1 0
+0.251957 0.095516 0.0101884 0.0049549 1 0
+0.0698836 0.0221234 0.0433974 0.00682977 1 0
+0.0137647 0.149326 0.195047 0.00556836 1 0
+0.250432 0.074121 0.109003 0.00821935 1 0
+0.179564 0.047218 0.171751 0.006094 1 0
+0.0331699 0.0224626 0.0413483 0.00523962 1 0
+0.329789 0.137961 0.0388322 0.00571604 1 0
+0.249914 0.140583 0.151655 0.00499878 1 0
+0.319055 0.0264271 0.106152 0.0062552 1 0
+0.0386856 0.0573807 0.156485 0.00602484 1 0
+0.35 0.177304 0.0190771 0.00651221 1 0
+0.255732 0.0438077 0.179543 0.00496818 1 0
+0.23 0.01902 0.0359562 0.00600114 1 0
+0.29 0.0182661 0.035311 0.00630612 1 0
+0.190535 0.0462154 0.167995 0.00554567 1 0
+0.226768 0.173457 0.0439585 0.00508207 1 0
+0.195773 0.086384 0.0930442 0.00811178 1 0
+0.25161 0.0879304 0.126099 0.0067339 1 0
+0.244441 0.0160123 0.172747 0.00493063 1 0
+0.043296 0.151548 0.0918601 0.00625959 1 0
+0.307593 0.0272495 0.0769788 0.0051061 1 0
+0.00725937 0.181249 0.160883 0.00619715 1 0
+0.175231 0.00533157 0.147991 0.00552298 1 0
+0.0631338 0.0584774 0.0477833 0.00496594 1 0
+0.0472304 0.0284223 0.0444217 0.00620969 1 0
+0.0937202 0.0200306 0.00855072 0.00585216 1 0
+0.00876345 0.191816 0.153383 0.00684825 1 0
+0.317627 0.0683682 0.0252238 0.00535805 1 0
+0.0717525 0.130556 0.107098 0.00817232 1 0
+0.146068 0.0287704 0.0437635 0.00509176 1 0
+0.274603 0.0963645 0.03542 0.00537813 1 0
+0.190315 0.0552909 0.0503652 0.00498143 1 0
+0.34227 0.0424943 0.128558 0.00680922 1 0
+0.224546 0.0717756 0.0894152 0.0052022 1 0
+0.16485 0.144163 0.116683 0.00601526 1 0
+0.31 0.0264071 0.159299 0.00508062 1 0
+0.337475 0.0525507 0.117738 0.00655369 1 0
+0.223739 0.0170824 0.0614024 0.00560669 1 0
+0.299231 0.0440644 0.161454 0.00647538 1 0
+0.0335832 0.0789404 0.0370472 0.00503675 1 0
+0.167133 0.07712 0.119504 0.00701539 1 0
+0.222646 0.152381 0.0815839 0.00666112 1 0
+0.256102 0.122997 0.109313 0.00494815 1 0
+0.217144 0.136513 0.0915481 0.0051836 1 0
+0.248134 0.0112451 0.0967474 0.00654313 1 0
+0.13 0.024322 0.0192746 0.00572495 1 0
+0.269567 0.00820065 0.0760283 0.00789579 1 0
+0.221619 0.0680395 0.0552225 0.00679536 1 0
+0.33895 0.13243 0.132953 0.00507055 1 0
+0.119456 0.0226494 0.183848 0.00514542 1 0
+0.31 0.16474 0.156743 0.00495294 1 0
+0.333612 0.104095 0.0213189 0.0057855 1 0
+0.157879 0.174185 0.130036 0.00890416 1 0
+0.300888 0.122424 0.0414241 0.00732578 1 0
+0.365243 0.103443 0.182958 0.00526612 1 0
+0.052821 0.0599626 0.150999 0.00601089 1 0
+0.389875 0.0408276 0.0233581 0.00608927 1 0
+0.00600313 0.18337 0.178389 0.00501887 1 0
+0.34897 0.111007 0.128003 0.00550693 1 0
+0.294398 0.161156 0.0182559 0.00573325 1 0
+0.181712 0.0226184 0.108846 0.00628206 1 0
+0.232003 0.0810735 0.0908776 0.00680589 1 0
+0.192502 0.0130733 0.0573592 0.00506112 1 0
+0.0286125 0.0500802 0.0806136 0.00523027 1 0
+0.0493994 0.121428 0.149163 0.00518747 1 0
+0.08476 0.158288 0.0380256 0.00497445 1 0
+0.0951523 0.159668 0.111227 0.0065057 1 0
+0.112207 0.191503 0.168551 0.00718012 1 0
+0.114836 0.191245 0.149378 0.00508199 1 0
+0.0904455 0.160321 0.133842 0.00686734 1 0
+0.118465 0.0969585 0.152407 0.00528396 1 0
+0.325616 0.136625 0.131179 0.00570646 1 0
+0.170373 0.171284 0.0552724 0.00506681 1 0
+0.279831 0.0253967 0.0541884 0.00539711 1 0
+0.204186 0.100462 0.0951556 0.00604524 1 0
+0.241027 0.140553 0.188586 0.00632563 1 0
+0.01 0.0305452 0.158786 0.00503532 1 0
+0.154831 0.106833 0.0213084 0.00502078 1 0
+0.356808 0.00512252 0.0769753 0.00500051 1 0
+0.148342 0.0586842 0.18959 0.0057163 1 0
+0.171288 0.0323468 0.182402 0.00533673 1 0
+0.277129 0.149936 0.137827 0.00562111 1 0
+0.172076 0.136966 0.111224 0.00555198 1 0
+0.285579 0.118203 0.066372 0.00625782 1 0
+0.0164121 0.194575 0.0894871 0.00544476 1 0
+0.375279 0.142649 0.0228584 0.00808403 1 0
+0.15 0.0391444 0.176967 0.00523655 1 0
+0.154845 0.0844059 0.0919995 0.00855174 1 0
+0.114847 0.0530955 0.17119 0.00507901 1 0
+0.161215 0.0463565 0.158803 0.00658422 1 0
+0.244294 0.0749789 0.127429 0.00693151 1 0
+0.201621 0.169863 0.056274 0.00539321 1 0
+0.115581 0.0706966 0.056733 0.00508092 1 0
+0.106464 0.112311 0.0671209 0.00524916 1 0
+0.291234 0.0553339 0.0958209 0.00526472 1 0
+0.316176 0.00764799 0.0855426 0.0052024 1 0
+0.275018 0.050031 0.0102281 0.0060469 1 0
+0.150034 0.0206415 0.178561 0.0061308 1 0
+0.263767 0.191992 0.0760477 0.00525599 1 0
+0.130293 0.116906 0.0351914 0.00604257 1 0
+0.186688 0.0872507 0.0579731 0.0061373 1 0
+0.230104 0.106871 0.03155 0.00613509 1 0
+0.173996 0.0709171 0.0506331 0.00512285 1 0
+0.0207845 0.0177262 0.0390978 0.0052981 1 0
+0.0211481 0.0258574 0.0156478 0.00498216 1 0
+0.332627 0.115789 0.15882 0.00579958 1 0
+0.263268 0.157899 0.0664981 0.00551224 1 0
+0.337952 0.0433085 0.15956 0.006886 1 0
+0.34815 0.131308 0.0763117 0.00704923 1 0
+0.115767 0.0923186 0.0853965 0.00514234 1 0
+0.39 0.0189152 0.0358037 0.00601733 1 0
+0.136347 0.131356 0.149812 0.00898847 1 0
+0.34661 0.147226 0.136929 0.00586783 1 0
+0.295703 0.0581534 0.0112684 0.00518624 1 0
+0.0870268 0.00678368 0.0133139 0.00534889 1 0
+0.047278 0.0610762 0.0980137 0.0060369 1 0
+0.178609 0.136398 0.0584243 0.0056634 1 0
+0.202349 0.1576 0.189478 0.00649183 1 0
+0.270943 0.132336 0.191526 0.00832911 1 0
+0.110306 0.122519 0.0741579 0.00656935 1 0
+0.114864 0.0526981 0.143973 0.00623323 1 0
+0.293011 0.0684381 0.183414 0.00565701 1 0
+0.274135 0.0932081 0.160943 0.00563774 1 0
+0.303815 0.140585 0.0694233 0.00626015 1 0
+0.302754 0.191723 0.0147281 0.00550898 1 0
+0.127051 0.00535971 0.111888 0.0055462 1 0
+0.16405 0.0356627 0.0568418 0.00542532 1 0
+0.216114 0.15051 0.19106 0.00731595 1 0
+0.0585163 0.0784101 0.193673 0.00501427 1 0
+0.164093 0.159871 0.117253 0.00903389 1 0
+0.171427 0.150318 0.145285 0.00498805 1 0
+0.01 0.178751 0.0212145 0.00593001 1 0
+0.126596 0.135693 0.0659915 0.00700331 1 0
+0.142394 0.0700104 0.010219 0.00549211 1 0
+0.28283 0.0597229 0.012684 0.00496416 1 0
+0.346125 0.065843 0.0811333 0.00549911 1 0
+0.0192994 0.155884 0.0432481 0.00504566 1 0
+0.0620351 0.177468 0.141743 0.00507261 1 0
+0.395852 0.0603702 0.179532 0.00498008 1 0
+0.196962 0.184654 0.0324529 0.0051657 1 0
+0.279714 0.0566011 0.19426 0.005438 1 0
+0.33 0.0204775 0.0218146 0.00605239 1 0
+0.166458 0.103195 0.147391 0.00591854 1 0
+0.0617074 0.043718 0.0241343 0.00501687 1 0
+0.193501 0.0107412 0.111082 0.00846357 1 0
+0.196351 0.0464952 0.106671 0.00548262 1 0
+0.075906 0.0671244 0.160934 0.00537679 1 0
+0.309361 0.00933187 0.0990245 0.0052889 1 0
+0.0627181 0.0634413 0.168156 0.00501112 1 0
+0.046994 0.112873 0.0364355 0.00532616 1 0
+0.183407 0.0707565 0.00836969 0.00530652 1 0
+0.232014 0.188669 0.181532 0.00507663 1 0
+0.0555723 0.144624 0.121058 0.00569052 1 0
+0.0343206 0.0954366 0.0503161 0.0050001 1 0
+0.0290338 0.173999 0.187396 0.00492787 1 0
+0.309574 0.0839854 0.160007 0.00514783 1 0
+0.0969705 0.169712 0.184873 0.00518084 1 0
+0.0658485 0.150003 0.179707 0.0062944 1 0
+0.108433 0.119435 0.163223 0.00507743 1 0
+0.206247 0.0766513 0.105902 0.0066949 1 0
+0.0864436 0.0643843 0.103629 0.00657068 1 0
+0.182244 0.133136 0.104595 0.00617659 1 0
+0.0471952 0.00624242 0.0945309 0.00649479 1 0
+0.0527607 0.0109981 0.11591 0.00611499 1 0
+0.10993 0.119343 0.0931493 0.0072709 1 0
+0.103207 0.0969803 0.129359 0.00654085 1 0
+0.170271 0.0187429 0.167282 0.00512471 1 0
+0.164726 0.0409384 0.179983 0.00554499 1 0
+0.326465 0.0283705 0.135593 0.00524226 1 0
+0.140623 0.0711734 0.0772951 0.00581126 1 0
+0.0850976 0.191205 0.0768463 0.00685597 1 0
+0.09 0.183533 0.0269557 0.00709967 1 0
+0.375296 0.139669 0.0715155 0.00536797 1 0
+0.156343 0.119418 0.0174718 0.00496351 1 0
+0.201745 0.155548 0.03555 0.00549744 1 0
+0.283227 0.187762 0.109832 0.00782879 1 0
+0.0651253 0.0846026 0.00611225 0.00671016 1 0
+0.165103 0.164994 0.0433823 0.00517184 1 0
+0.230469 0.142552 0.0262646 0.00565048 1 0
+0.0644654 0.0126289 0.0524089 0.00567865 1 0
+0.193453 0.160545 0.0700145 0.00542249 1 0
+0.169417 0.181557 0.0684874 0.00516442 1 0
+0.334088 0.127733 0.102483 0.00550088 1 0
+0.0956108 0.121131 0.123297 0.00975789 1 0
+0.123709 0.127416 0.188492 0.00539229 1 0
+0.0979571 0.108096 0.156332 0.00547353 1 0
+0.251707 0.016391 0.19019 0.00624543 1 0
+0.0661633 0.179022 0.041344 0.00492435 1 0
+0.355416 0.193746 0.0841065 0.00589224 1 0
+0.347893 0.18288 0.0297822 0.00510758 1 0
+0.136844 0.0199226 0.083017 0.00534729 1 0
+0.39235 0.147579 0.183273 0.00580378 1 0
+0.01 0.0411491 0.0267012 0.00533574 1 0
+0.0588663 0.13177 0.102265 0.00539944 1 0
+0.0978903 0.11469 0.0541935 0.00643746 1 0
+0.308283 0.122379 0.18741 0.00743573 1 0
+0.381485 0.00477065 0.0532761 0.0053672 1 0
+0.274681 0.123917 0.0450574 0.00494249 1 0
+0.274508 0.141622 0.0266256 0.00580575 1 0
+0.170151 0.0674314 0.143951 0.00518518 1 0
+0.158682 0.0638484 0.15911 0.0051452 1 0
+0.378616 0.181401 0.180389 0.00548654 1 0
+0.0459767 0.150753 0.0466611 0.00506987 1 0
+0.0454381 0.151814 0.0341858 0.00532984 1 0
+0.188361 0.0534292 0.0140177 0.00568027 1 0
+0.217714 0.125165 0.0343887 0.00503698 1 0
+0.110836 0.126499 0.0383373 0.00694862 1 0
+0.096231 0.130024 0.0342919 0.0058512 1 0
+0.201951 0.139456 0.0361176 0.00511319 1 0
+0.191894 0.0976474 0.14744 0.00647568 1 0
+0.35 0.171579 0.181703 0.00547433 1 0
+0.30885 0.0795745 0.0344666 0.00514951 1 0
+0.296265 0.116872 0.0586386 0.00494227 1 0
+0.314284 0.103333 0.0673027 0.00555231 1 0
+0.092611 0.0159843 0.19321 0.0053434 1 0
+0.13 0.0210197 0.163043 0.00513412 1 0
+0.027443 0.148809 0.189908 0.00511117 1 0
+0.121856 0.159182 0.118894 0.00508099 1 0
+0.156883 0.181267 0.0743892 0.0062106 1 0
+0.363206 0.0564425 0.0982633 0.00501058 1 0
+0.00889184 0.161165 0.0418842 0.00670472 1 0
+0.39 0.156352 0.032948 0.00717421 1 0
+0.196193 0.191986 0.0554252 0.00542604 1 0
+0.212932 0.0369344 0.0594619 0.00530686 1 0
+0.246057 0.0820164 0.0902824 0.00684233 1 0
+0.262212 0.194978 0.0528194 0.005386 1 0
+0.349212 0.161169 0.102484 0.00696689 1 0
+0.0212278 0.053785 0.165676 0.00526682 1 0
+0.25 0.0222123 0.160308 0.00595556 1 0
+0.13 0.0338003 0.0415081 0.00571234 1 0
+0.251398 0.0134418 0.052878 0.00555353 1 0
+0.283035 0.0380155 0.017362 0.00527007 1 0
+0.256399 0.00663239 0.0405731 0.00536133 1 0
+0.277872 0.0151422 0.0301644 0.00501034 1 0
+0.29 0.0331873 0.156387 0.00535195 1 0
+0.310051 0.159968 0.0644506 0.00626058 1 0
+0.23 0.0400195 0.0252136 0.00494321 1 0
+0.00597915 0.192857 0.113782 0.00614966 1 0
+0.26478 0.0856209 0.0621084 0.0058759 1 0
+0.170888 0.0249568 0.149919 0.00528423 1 0
+0.0862489 0.178614 0.156334 0.00675943 1 0
+0.0765856 0.148868 0.166939 0.00690831 1 0
+0.0769549 0.152726 0.14279 0.00842565 1 0
+0.374428 0.101105 0.0515387 0.00506034 1 0
+0.208821 0.0315649 0.0177298 0.00519243 1 0
+0.213451 0.0158765 0.0324657 0.00576198 1 0
+0.2004 0.0441061 0.0243762 0.00519107 1 0
+0.21 0.0282458 0.0431743 0.00602494 1 0
+0.258037 0.0375442 0.0171449 0.00503405 1 0
+0.13 0.0397069 0.163478 0.00538679 1 0
+0.341736 0.0212705 0.157989 0.00494933 1 0
+0.33 0.0107095 0.169753 0.00926678 1 0
+0.39 0.0244424 0.159316 0.00565326 1 0
+0.123273 0.184883 0.0328546 0.00550323 1 0
+0.0582003 0.154851 0.0294708 0.00526422 1 0
+0.0687158 0.163556 0.0197289 0.0049326 1 0
+0.343047 0.152234 0.0418529 0.00666205 1 0
+0.260138 0.181753 0.0392608 0.00496383 1 0
+0.323838 0.181046 0.0401489 0.00548408 1 0
+0.39 0.17758 0.03934 0.00564262 1 0
+0.0114031 0.169948 0.157271 0.00536005 1 0
+0.105449 0.182977 0.175277 0.00503166 1 0
+0.181274 0.184416 0.182946 0.0067919 1 0
+0.17 0.174714 0.158959 0.00562471 1 0
+0.243437 0.155565 0.17436 0.0054662 1 0
+0.198594 0.177974 0.183018 0.00533083 1 0
+0.357939 0.155902 0.154586 0.00588195 1 0
+0.0678736 0.0194877 0.193962 0.00587428 1 0
+0.261094 0.031613 0.143196 0.00641111 1 0
+0.0544616 0.0115973 0.103615 0.00631154 1 0
+0.300243 0.18462 0.180876 0.00679718 1 0
+0.381482 0.00919082 0.15216 0.00582408 1 0
+0.3597 0.172902 0.127903 0.00513018 1 0
+0.27607 0.152288 0.115059 0.00497727 1 0
+0.33 0.165643 0.156947 0.00701088 1 0
+0.168644 0.0373118 0.1599 0.00517157 1 0
+0.110805 0.0247741 0.0426208 0.00646617 1 0
+0.277394 0.0310717 0.04549 0.00527087 1 0
+0.370097 0.00686026 0.142097 0.00622595 1 0
+0.10914 0.070801 0.0234014 0.00536059 1 0
+0.062817 0.0164829 0.177108 0.00493717 1 0
+0.340361 0.121672 0.136124 0.00623336 1 0
+0.177069 0.166193 0.116547 0.00541707 1 0
+0.0717111 0.0222557 0.159741 0.00529445 1 0
+0.173048 0.126401 0.105637 0.00526965 1 0
+0.370588 0.141092 0.00823424 0.00735295 1 0
+0.311732 0.112762 0.10386 0.00566651 1 0
+0.224861 0.0108757 0.0111513 0.00580825 1 0
+0.282403 0.0378644 0.150256 0.00501103 1 0
+0.183624 0.0128695 0.0433923 0.00525007 1 0
+0.342352 0.149326 0.0994858 0.00704412 1 0
+0.23 0.164717 0.0399481 0.00506231 1 0
+0.342001 0.179746 0.00588706 0.0062753 1 0
+0.198251 0.0879786 0.0521409 0.00683441 1 0
+0.0955366 0.15961 0.122925 0.00519878 1 0
+0.00593014 0.161319 0.084341 0.00603019 1 0
+0.18029 0.154792 0.145996 0.00496599 1 0
+0.0281417 0.143236 0.173569 0.0049881 1 0
+0.352748 0.152499 0.0343066 0.00563147 1 0
+0.260024 0.10054 0.0972566 0.00498755 1 0
+0.159265 0.0614676 0.177132 0.00496797 1 0
+0.273013 0.066809 0.168266 0.00526 1 0
+0.0961053 0.158912 0.0425576 0.00541757 1 0
+0.38805 0.112274 0.0864649 0.00526447 1 0
+0.264119 0.0605599 0.0966643 0.00523095 1 0
+0.329591 0.159137 0.176464 0.00586786 1 0
+0.0730028 0.0412287 0.106009 0.00531919 1 0
+0.264012 0.178833 0.14807 0.00573042 1 0
+0.263282 0.135521 0.013621 0.00547357 1 0
+0.0967876 0.145384 0.10407 0.00751144 1 0
+0.230225 0.160641 0.0228926 0.00528607 1 0
+0.325794 0.0266551 0.0951936 0.00597996 1 0
+0.149199 0.0800426 0.0786346 0.00659869 1 0
+0.238664 0.165512 0.184353 0.00509723 1 0
+0.21 0.0406293 0.1602 0.00757887 1 0
+0.187799 0.0417546 0.177593 0.00538602 1 0
+0.0331917 0.0228511 0.156774 0.0065044 1 0
+0.216288 0.0735893 0.0648644 0.00554062 1 0
+0.19795 0.00662434 0.163804 0.00522254 1 0
+0.332126 0.00415627 0.0198734 0.0051572 1 0
+0.205507 0.0201568 0.158537 0.00588187 1 0
+0.170897 0.173902 0.120927 0.00523435 1 0
+0.248516 0.014429 0.120122 0.005256 1 0
+0.0361242 0.15799 0.157262 0.00581867 1 0
+0.138548 0.147702 0.123506 0.00907352 1 0
+0.149799 0.0372451 0.151687 0.00499184 1 0
+0.177965 0.159118 0.180328 0.00514079 1 0
+0.392538 0.0189895 0.180817 0.00561277 1 0
+0.382243 0.101195 0.0750976 0.00609491 1 0
+0.0836357 0.0219441 0.00512935 0.00496743 1 0
+0.33 0.161926 0.0377196 0.00499244 1 0
+0.336211 0.177032 0.132754 0.00506622 1 0
+0.0532224 0.134385 0.114407 0.0055477 1 0
+0.276116 0.156167 0.163396 0.0058125 1 0
+0.0348003 0.115308 0.0677341 0.00607577 1 0
+0.0440233 0.146143 0.166868 0.00519442 1 0
+0.120917 0.0561351 0.0994865 0.00526409 1 0
+0.256449 0.107859 0.061902 0.00687425 1 0
+0.171845 0.0215487 0.117558 0.00692348 1 0
+0.255654 0.161876 0.0169731 0.00532026 1 0
+0.144031 0.154944 0.170114 0.00558662 1 0
+0.145005 0.0179794 0.0223569 0.00509841 1 0
+0.128038 0.0977233 0.174511 0.00514635 1 0
+0.201338 0.0257893 0.133051 0.00532102 1 0
+0.166681 0.100641 0.0706421 0.00550443 1 0
+0.12131 0.166423 0.0453309 0.00579703 1 0
+0.0658001 0.154509 0.11645 0.00642682 1 0
+0.0572581 0.165887 0.155183 0.0056194 1 0
+0.187662 0.191443 0.00509992 0.00542144 1 0
+0.0944134 0.0383697 0.0973631 0.0068424 1 0
+0.318418 0.111156 0.144915 0.00537137 1 0
+0.286851 0.123289 0.175289 0.00521646 1 0
+0.161594 0.113297 0.134391 0.00755107 1 0
+0.18948 0.156254 0.0181854 0.00526632 1 0
+0.177931 0.155843 0.0650242 0.00562178 1 0
+0.100584 0.0462843 0.173604 0.00525411 1 0
+0.169914 0.139955 0.1501 0.00653871 1 0
+0.263616 0.116388 0.0769037 0.00648812 1 0
+0.31668 0.128179 0.105431 0.00518582 1 0
+0.100492 0.0735251 0.0144766 0.00492659 1 0
+0.132923 0.17577 0.18249 0.00547233 1 0
+0.34078 0.0083426 0.186336 0.00818907 1 0
+0.29936 0.142034 0.0951274 0.00620868 1 0
+0.269367 0.0277092 0.18182 0.00525473 1 0
+0.325954 0.0773823 0.00821037 0.00871461 1 0
+0.385832 0.013629 0.080827 0.0053703 1 0
+0.271175 0.194405 0.138624 0.00629957 1 0
+0.176297 0.1553 0.0249634 0.00597416 1 0
+0.367395 0.155817 0.0259312 0.00650447 1 0
+0.242305 0.045509 0.129572 0.00581364 1 0
+0.170596 0.167333 0.189563 0.00681678 1 0
+0.143312 0.0364464 0.184318 0.0050612 1 0
+0.0838401 0.0723796 0.0732097 0.00542222 1 0
+0.164174 0.164756 0.146673 0.00878473 1 0
+0.343979 0.0134402 0.16495 0.00576487 1 0
+0.296169 0.0723779 0.0760541 0.00519839 1 0
+0.343016 0.131144 0.0620836 0.00527033 1 0
+0.176588 0.144532 0.0358948 0.0059744 1 0
+0.257508 0.0394345 0.133334 0.00567279 1 0
+0.0289996 0.142579 0.113386 0.00555155 1 0
+0.11092 0.182559 0.0602423 0.00608611 1 0
+0.0607705 0.0760141 0.076644 0.00607164 1 0
+0.16066 0.0425497 0.147777 0.00509363 1 0
+0.0715801 0.0833763 0.104049 0.00535127 1 0
+0.15 0.170787 0.157919 0.00570278 1 0
+0.327064 0.164185 0.0820805 0.00526258 1 0
+0.317055 0.15458 0.171205 0.00574498 1 0
+0.347806 0.153938 0.0778674 0.00703853 1 0
+0.293947 0.171232 0.133718 0.00556929 1 0
+0.156684 0.149419 0.111223 0.00512589 1 0
+0.252732 0.131396 0.0968162 0.00549874 1 0
+0.01425 0.0215658 0.0708055 0.00532287 1 0
+0.0763223 0.156665 0.176082 0.00511058 1 0
+0.124446 0.127437 0.039473 0.00674084 1 0
+0.359546 0.118236 0.0804413 0.00511047 1 0
+0.0887918 0.0346958 0.0417275 0.00539093 1 0
+0.177854 0.108789 0.142292 0.00537027 1 0
+0.0968535 0.0707884 0.111793 0.00515489 1 0
+0.302334 0.145584 0.0277289 0.00572278 1 0
+0.3148 0.0091965 0.159974 0.00610153 1 0
+0.0650404 0.077735 0.111273 0.00583579 1 0
+0.35 0.157852 0.167876 0.00587751 1 0
+0.0687925 0.0473 0.0986019 0.00505409 1 0
+0.351393 0.00584318 0.10956 0.00633544 1 0
+0.250902 0.0661362 0.0970678 0.00614813 1 0
+0.199256 0.151144 0.160893 0.00572317 1 0
+0.081642 0.174244 0.0457985 0.00526858 1 0
+0.21976 0.170596 0.149192 0.00673337 1 0
+0.310973 0.131476 0.0090823 0.00770685 1 0
+0.171225 0.0350769 0.148616 0.00492495 1 0
+0.0422254 0.0146582 0.108313 0.00714824 1 0
+0.25391 0.150461 0.103458 0.00533219 1 0
+0.328306 0.142198 0.15002 0.00511059 1 0
+0.382755 0.00781137 0.0192031 0.00505643 1 0
+0.127577 0.145161 0.167248 0.0062849 1 0
+0.0600214 0.130019 0.0487371 0.0049201 1 0
+0.110918 0.0619143 0.156475 0.00676531 1 0
+0.293273 0.158535 0.00771861 0.00518306 1 0
+0.1195 0.145898 0.0623842 0.0059389 1 0
+0.109317 0.0465481 0.165315 0.00531158 1 0
+0.315361 0.10605 0.0312039 0.007184 1 0
+0.0817801 0.153306 0.155881 0.00553843 1 0
+0.0487354 0.0470424 0.0517937 0.005316 1 0
+0.37 0.0372783 0.160129 0.0058242 1 0
+0.0778138 0.0743938 0.0561003 0.00531565 1 0
+0.346521 0.143338 0.049699 0.00569743 1 0
+0.307383 0.11418 0.156362 0.00575875 1 0
+0.277046 0.158534 0.144477 0.00524865 1 0
+0.13 0.0361391 0.180559 0.00578534 1 0
+0.206529 0.0269038 0.0694898 0.00506644 1 0
+0.358316 0.0430172 0.177113 0.00492916 1 0
+0.00654987 0.0696918 0.0295163 0.00614741 1 0
+0.0899527 0.0570072 0.172679 0.00604206 1 0
+0.202863 0.180004 0.154309 0.00552596 1 0
+0.148523 0.177151 0.140333 0.00532119 1 0
+0.13307 0.0630071 0.121302 0.00599325 1 0
+0.0780002 0.0448977 0.160222 0.00513026 1 0
+0.238688 0.0248954 0.150031 0.0050339 1 0
+0.33353 0.0754906 0.0249002 0.00582627 1 0
+0.256402 0.0357335 0.152655 0.00492271 1 0
+0.234174 0.0957673 0.0900119 0.00807268 1 0
+0.192198 0.127593 0.100147 0.00505887 1 0
+0.00825974 0.126987 0.0225671 0.00501073 1 0
+0.13 0.174395 0.159837 0.00492019 1 0
+0.367878 0.149816 0.162361 0.00544743 1 0
+0.274419 0.0773807 0.019342 0.00563982 1 0
+0.262616 0.0135154 0.193305 0.00545901 1 0
+0.306531 0.148053 0.0546813 0.00499252 1 0
+0.0517323 0.176959 0.0189973 0.00510163 1 0
+0.237788 0.0894483 0.0749374 0.00714378 1 0
+0.0893069 0.189382 0.152218 0.00516745 1 0
+0.0323866 0.126165 0.0357112 0.00522841 1 0
+0.314882 0.0714174 0.0349756 0.00500877 1 0
+0.33603 0.1587 0.0660504 0.00571842 1 0
+0.108816 0.151105 0.169317 0.00516 1 0
+0.364708 0.051628 0.167371 0.00626463 1 0
+0.100349 0.108523 0.130208 0.0053807 1 0
+0.170666 0.0892365 0.068069 0.0057705 1 0
+0.0999165 0.142379 0.0745268 0.00561466 1 0
+0.0597816 0.185221 0.027062 0.0055033 1 0
+0.238633 0.179517 0.0175771 0.005709 1 0
+0.107246 0.085266 0.131911 0.00559302 1 0
+0.0861326 0.0451846 0.187098 0.00520339 1 0
+0.0637139 0.192531 0.157391 0.00495527 1 0
+0.267139 0.069563 0.0327794 0.00499077 1 0
+0.0864614 0.191535 0.0401115 0.0049512 1 0
+0.0237336 0.120119 0.0736767 0.00535296 1 0
+0.211425 0.00508826 0.0340575 0.00523903 1 0
+0.0575627 0.0483748 0.151254 0.00577812 1 0
+0.243244 0.0831797 0.102024 0.00528776 1 0
+0.261577 0.0796649 0.114792 0.00550874 1 0
+0.103909 0.0607845 0.0205837 0.00494194 1 0
+0.227431 0.195448 0.0180965 0.00494513 1 0
+0.29699 0.120724 0.180025 0.00600489 1 0
+0.122431 0.0146929 0.166487 0.00531487 1 0
+0.356335 0.0460945 0.0299408 0.00548702 1 0
+0.25 0.165995 0.040633 0.0051361 1 0
+0.245868 0.116582 0.0693421 0.00872676 1 0
+0.215962 0.117685 0.0750916 0.0073751 1 0
+0.0934349 0.0583919 0.0966913 0.00495829 1 0
+0.359399 0.151389 0.059909 0.00510121 1 0
+0.259602 0.143109 0.0989046 0.00502089 1 0
+0.0356892 0.0457494 0.032632 0.00527195 1 0
+0.180834 0.0330256 0.1308 0.0051692 1 0
+0.0631825 0.193286 0.183238 0.00541475 1 0
+0.343546 0.167816 0.0445428 0.00512738 1 0
+0.239506 0.0748118 0.116467 0.00503154 1 0
+0.365153 0.133028 0.0180349 0.0054654 1 0
+0.214868 0.00513958 0.006055 0.00538041 1 0
+0.0779447 0.00933514 0.133271 0.00725011 1 0
+0.37 0.171148 0.0439746 0.00681272 1 0
+0.106816 0.139283 0.119261 0.00843925 1 0
+0.394734 0.0786798 0.128928 0.00549414 1 0
+0.096486 0.153221 0.187963 0.00829006 1 0
+0.17 0.156997 0.0352682 0.00551604 1 0
+0.0556346 0.033688 0.15095 0.0053515 1 0
+0.226596 0.0350846 0.043546 0.00590146 1 0
+0.0777909 0.165915 0.148506 0.00597243 1 0
+0.340627 0.165863 0.150643 0.00521091 1 0
+0.393511 0.111386 0.0591638 0.00504775 1 0
+0.324017 0.170214 0.108676 0.00527019 1 0
+0.278548 0.116772 0.191291 0.00493263 1 0
+0.208638 0.131575 0.0885691 0.00509302 1 0
+0.24394 0.127435 0.0543049 0.00545812 1 0
+0.233082 0.0215367 0.159692 0.00502445 1 0
+0.0802463 0.0952664 0.128303 0.00587113 1 0
+0.35373 0.142419 0.0794802 0.00578166 1 0
+0.332804 0.119654 0.0538804 0.00495888 1 0
+0.14254 0.0523675 0.0987686 0.00593462 1 0
+0.238221 0.0238557 0.0159596 0.005277 1 0
+0.276343 0.155965 0.0355368 0.00552434 1 0
+0.389898 0.166025 0.0423102 0.00628806 1 0
+0.20734 0.0934415 0.107873 0.00881958 1 0
+0.113326 0.0465527 0.155473 0.00531565 1 0
+0.287784 0.152427 0.0201663 0.0053834 1 0
+0.19 0.174441 0.0195105 0.00515748 1 0
+0.0933412 0.0662663 0.0868433 0.0056423 1 0
+0.0535527 0.170707 0.140558 0.00502638 1 0
+0.056345 0.0447936 0.167543 0.00543527 1 0
+0.319714 0.173203 0.0138602 0.00532904 1 0
+0.318993 0.159075 0.14688 0.00515332 1 0
+0.132172 0.073621 0.0140572 0.00541312 1 0
+0.186738 0.0355362 0.152613 0.00527402 1 0
+0.354687 0.148664 0.144741 0.00546032 1 0
+0.143956 0.0873215 0.111676 0.00507434 1 0
+0.33 0.0263341 0.0406133 0.00503598 1 0
+0.239281 0.184703 0.0268573 0.00494154 1 0
+0.317241 0.121443 0.147915 0.0054086 1 0
+0.0155774 0.155562 0.0334974 0.00539621 1 0
+0.0467048 0.164738 0.157204 0.0051868 1 0
+0.0907433 0.128642 0.136023 0.00580039 1 0
+0.226558 0.0050429 0.0680593 0.00546214 1 0
+0.160818 0.101567 0.0900302 0.00542622 1 0
+0.0578329 0.0527018 0.0826996 0.00535188 1 0
+0.190631 0.0849595 0.120363 0.00498892 1 0
+0.0855674 0.0739422 0.0906115 0.00557382 1 0
+0.079236 0.0838242 0.173243 0.00524543 1 0
+0.317096 0.134697 0.0196558 0.00492943 1 0
+0.22179 0.164076 0.0472665 0.005254 1 0
+0.035521 0.024448 0.141908 0.00500036 1 0
+0.121423 0.153796 0.0454467 0.00630561 1 0
+0.243375 0.157456 0.0401662 0.0056814 1 0
+0.216065 0.156221 0.0151389 0.00496757 1 0
+0.288644 0.161478 0.0391054 0.00517417 1 0
+0.305165 0.129215 0.093237 0.00602047 1 0
+0.326572 0.0931579 0.0556699 0.0057005 1 0
+0.142905 0.188128 0.00832213 0.00500349 1 0
+0.303122 0.183253 0.0234914 0.0050918 1 0
+0.0513195 0.131298 0.0421085 0.00585023 1 0
+0.137058 0.141451 0.159999 0.00536984 1 0
+0.257599 0.0941042 0.134262 0.00512517 1 0
+0.19656 0.0472216 0.181399 0.0050835 1 0
+0.133371 0.0855867 0.135726 0.00558747 1 0
+0.297211 0.148201 0.0460843 0.00513294 1 0
+0.27 0.18092 0.166627 0.00518641 1 0
+0.117472 0.0642168 0.142115 0.00572231 1 0
+0.37979 0.152412 0.0390155 0.0053394 1 0
+0.21 0.0393582 0.0384033 0.00606831 1 0
+0.227068 0.0301736 0.0720983 0.00605722 1 0
+0.341191 0.0251477 0.0454776 0.00610949 1 0
+0.364764 0.147722 0.152537 0.00496601 1 0
+0.331248 0.0630576 0.114729 0.00602514 1 0
+0.187503 0.160421 0.160779 0.00526709 1 0
+0.0607547 0.036431 0.111339 0.00504444 1 0
+0.0249341 0.140233 0.059008 0.00500066 1 0
+0.277753 0.0891442 0.0799665 0.00500209 1 0
+0.241637 0.138237 0.158558 0.00502118 1 0
+0.107164 0.192643 0.156784 0.00567281 1 0
+0.121535 0.112179 0.124726 0.00558203 1 0
+0.12679 0.109329 0.188589 0.00564646 1 0
+0.192212 0.116073 0.195068 0.00500692 1 0
+0.176887 0.14295 0.103954 0.00502218 1 0
+0.200576 0.118743 0.0119407 0.00519626 1 0
+0.179161 0.124561 0.0950849 0.00562769 1 0
+0.101414 0.125129 0.0662452 0.00561635 1 0
+0.252938 0.0644826 0.194418 0.00534798 1 0
+0.241464 0.0230279 0.194617 0.00567851 1 0
+0.14585 0.154364 0.0333299 0.0049201 1 0
+0.13 0.162097 0.15985 0.00629393 1 0
+0.374508 0.0444107 0.028399 0.00521957 1 0
+0.163322 0.111215 0.109167 0.00495191 1 0
+0.325752 0.186974 0.117146 0.00507565 1 0
+0.235053 0.112389 0.0399197 0.0050449 1 0
+0.310614 0.134246 0.0798435 0.00715402 1 0
+0.337052 0.175091 0.108946 0.00633609 1 0
+0.258904 0.122522 0.0117143 0.00533354 1 0
+0.119023 0.128715 0.105223 0.0094116 1 0
+0.0621116 0.0146283 0.00623177 0.00653622 1 0
+0.0110308 0.159897 0.123493 0.00517159 1 0
+0.106056 0.161993 0.0567978 0.00669773 1 0
+0.319037 0.128427 0.186393 0.00494375 1 0
+0.0707372 0.138259 0.1358 0.00492486 1 0
+0.0951466 0.0410084 0.194366 0.00577235 1 0
+0.215184 0.0511051 0.0949013 0.00567067 1 0
+0.152345 0.15892 0.128689 0.00738893 1 0
+0.116686 0.0767524 0.0309955 0.00507058 1 0
+0.208835 0.142381 0.170932 0.00500633 1 0
+0.0834147 0.087441 0.0911852 0.00614729 1 0
+0.113349 0.0109536 0.0221073 0.00516509 1 0
+0.00816041 0.155564 0.108356 0.00548171 1 0
+0.0962057 0.0661762 0.15883 0.0061964 1 0
+0.327568 0.116904 0.148792 0.00548791 1 0
+0.164068 0.082941 0.0800338 0.00662652 1 0
+0.244047 0.0375086 0.0431852 0.00521327 1 0
+0.141397 0.176393 0.154309 0.00518206 1 0
+0.178245 0.168578 0.0633801 0.00529997 1 0
+0.160227 0.051309 0.0342094 0.00494937 1 0
+0.170286 0.124796 0.116129 0.00569779 1 0
+0.203984 0.106266 0.184599 0.0049814 1 0
+0.325401 0.161488 0.0918087 0.00496851 1 0
+0.306247 0.00665273 0.089148 0.00540779 1 0
+0.316238 0.015265 0.0931219 0.0055432 1 0
+0.240079 0.145881 0.0296839 0.00507972 1 0
+0.32467 0.132036 0.0980336 0.00576958 1 0
+0.157623 0.132844 0.122606 0.00866231 1 0
+0.169955 0.15008 0.108074 0.00561139 1 0
+0.194824 0.187497 0.0649106 0.00515682 1 0
+0.239326 0.0150519 0.181313 0.00509233 1 0
+0.318191 0.159187 0.0564939 0.00514918 1 0
+0.0792881 0.016866 0.180201 0.00517011 1 0
+0.260323 0.0685592 0.11658 0.00542457 1 0
+0.239286 0.106852 0.0810619 0.00706377 1 0
+0.334289 0.0982624 0.0122789 0.00499393 1 0
+0.226025 0.118987 0.0279885 0.00713664 1 0
+0.344845 0.189664 0.0855549 0.00553181 1 0
+0.253551 0.0766101 0.0827654 0.00506928 1 0
+0.345822 0.188583 0.154599 0.00880407 1 0
+0.0827703 0.0235384 0.0445821 0.00618839 1 0
+0.333985 0.040954 0.0412785 0.00507434 1 0
+0.278721 0.0594964 0.0952742 0.00546562 1 0
+0.019205 0.0449667 0.0239296 0.00500779 1 0
+0.149741 0.117969 0.0247541 0.00497227 1 0
+0.148458 0.0655767 0.112763 0.00500424 1 0
+0.185581 0.113329 0.0951075 0.00636539 1 0
+0.314931 0.172481 0.184316 0.00538804 1 0
+0.151307 0.191604 0.0841679 0.00742714 1 0
+0.215391 0.0778268 0.0526149 0.00509487 1 0
+0.116938 0.0537562 0.0111887 0.00632439 1 0
+0.123704 0.145119 0.105583 0.0063281 1 0
+0.349979 0.189299 0.0221952 0.00504719 1 0
+0.373207 0.0786809 0.0262685 0.00511944 1 0
+0.119987 0.0826799 0.127211 0.00497848 1 0
+0.119432 0.0344412 0.044668 0.00533614 1 0
+0.125114 0.0259125 0.148706 0.00512049 1 0
+0.0491786 0.102561 0.165362 0.00540046 1 0
+0.187451 0.00754914 0.195216 0.00498253 1 0
+0.0993061 0.0379254 0.016514 0.00499695 1 0
+0.134012 0.118456 0.140878 0.00687643 1 0
+0.274864 0.191863 0.165327 0.00519948 1 0
+0.338764 0.184065 0.0196136 0.00661261 1 0
+0.30909 0.155887 0.1521 0.00508481 1 0
+0.281038 0.179616 0.0434301 0.00495262 1 0
+0.284824 0.0573723 0.0853284 0.00514923 1 0
+0.152 0.0776878 0.110776 0.0062575 1 0
+0.352751 0.0402944 0.0504634 0.00495409 1 0
+0.06202 0.039623 0.0415275 0.00515143 1 0
+0.253638 0.0493509 0.152362 0.00593247 1 0
+0.17658 0.177998 0.016944 0.00513947 1 0
+0.315916 0.152921 0.0712626 0.00516184 1 0
+0.222567 0.157874 0.0384202 0.00498412 1 0
+0.178055 0.0404681 0.180863 0.00497207 1 0
+0.0640356 0.136959 0.117493 0.00598804 1 0
+0.269722 0.170038 0.152649 0.00571176 1 0
+0.252802 0.16212 0.0986709 0.00499185 1 0
+0.209844 0.0545797 0.177965 0.00554082 1 0
+0.13029 0.0507768 0.0401549 0.00497506 1 0
+0.366953 0.146216 0.0774128 0.00517086 1 0
+0.371563 0.0342949 0.0441009 0.00496373 1 0
+0.27 0.178611 0.0224494 0.00494871 1 0
+0.26675 0.138843 0.061017 0.00518781 1 0
+0.114366 0.178677 0.155083 0.0057361 1 0
+0.221864 0.0366978 0.0793678 0.00501016 1 0
+0.207612 0.0444648 0.193214 0.00627639 1 0
+0.271776 0.149236 0.0896579 0.00512745 1 0
+0.121741 0.14519 0.0354793 0.00576319 1 0
+0.262546 0.0115259 0.0141798 0.00560513 1 0
+0.300685 0.155898 0.0352115 0.00504962 1 0
+0.174803 0.111176 0.0338426 0.00552079 1 0
+0.104673 0.128424 0.132813 0.00527037 1 0
+0.315444 0.160233 0.189164 0.00572812 1 0
+0.251209 0.129378 0.074338 0.00601193 1 0
+0.190451 0.192302 0.115137 0.00546215 1 0
+0.249307 0.185526 0.00612246 0.00502701 1 0
+0.203934 0.0225659 0.18315 0.0051549 1 0
+0.302241 0.100337 0.134276 0.00542858 1 0
+0.347415 0.0902788 0.136673 0.00554412 1 0
+0.0795558 0.105547 0.122701 0.00494732 1 0
+0.301311 0.0235448 0.154751 0.00513585 1 0
+0.114762 0.0984224 0.124566 0.00605229 1 0
+0.0258172 0.13008 0.0854701 0.00587416 1 0
+0.192188 0.0787302 0.129962 0.00526632 1 0
+0.24031 0.16392 0.0162384 0.00504816 1 0
+0.173767 0.182968 0.0343716 0.00503739 1 0
+0.187492 0.121202 0.145904 0.00543631 1 0
+0.121307 0.0911066 0.163532 0.00760362 1 0
+0.306121 0.039887 0.0508405 0.00586732 1 0
+0.0313969 0.187535 0.116287 0.00526618 1 0
+0.205244 0.0530181 0.00474848 0.00533448 1 0
+0.318555 0.0988328 0.162645 0.00544252 1 0
+0.384049 0.150213 0.18977 0.00506271 1 0
+0.35882 0.0705367 0.0071012 0.00591425 1 0
+0.374241 0.107337 0.150027 0.0050843 1 0
+0.0585332 0.133693 0.194195 0.00493436 1 0
+0.0855199 0.118215 0.184505 0.0055736 1 0
+0.158235 0.138137 0.19419 0.00609273 1 0
+0.122416 0.07642 0.139554 0.0062318 1 0
+0.00479918 0.192651 0.081544 0.00545332 1 0
+0.27634 0.123768 0.072765 0.00597458 1 0
+0.0486482 0.0469649 0.145052 0.00514093 1 0
+0.19 0.0254881 0.159743 0.00501905 1 0
+0.37864 0.120691 0.00630193 0.00533048 1 0
+0.25 0.162741 0.161173 0.0051858 1 0
+0.0566476 0.069124 0.110854 0.00507997 1 0
+0.0116925 0.0406675 0.11733 0.0050623 1 0
+0.315558 0.141102 0.0689741 0.00550287 1 0
+0.180223 0.0123022 0.113459 0.00511602 1 0
+0.273171 0.138287 0.0113356 0.00504578 1 0
+0.26461 0.0518817 0.0868252 0.00543732 1 0
+0.229094 0.159702 0.0881235 0.00508333 1 0
+0.26882 0.0938501 0.113402 0.00500452 1 0
+0.349178 0.0540905 0.119842 0.00543585 1 0
+0.0760557 0.0196645 0.0539054 0.00560242 1 0
+0.242801 0.116421 0.034328 0.00532604 1 0
+0.313923 0.155856 0.0894238 0.00559722 1 0
+0.195836 0.105589 0.190249 0.00495681 1 0
+0.0559161 0.179048 0.149599 0.00500992 1 0
+0.252497 0.141266 0.0333844 0.00527091 1 0
+0.0868643 0.111262 0.116764 0.0049587 1 0
+0.350233 0.0345982 0.092011 0.00497733 1 0
+0.09 0.0412077 0.171813 0.00512945 1 0
+0.155742 0.155361 0.0307641 0.00526499 1 0
+0.15503 0.153165 0.0171135 0.00496063 1 0
+0.275704 0.0855324 0.120332 0.0067578 1 0
+0.102093 0.142054 0.139593 0.00507751 1 0
+0.239529 0.0907062 0.0290642 0.00558211 1 0
+0.206284 0.164971 0.15529 0.00676775 1 0
+0.033003 0.0442111 0.152608 0.00525452 1 0
+0.0275063 0.0428424 0.176527 0.0049388 1 0
+0.35862 0.149303 0.170872 0.00662706 1 0
+0.07 0.0215284 0.0227742 0.00496596 1 0
+0.115516 0.132417 0.0702031 0.00529467 1 0
+0.366673 0.153534 0.191388 0.00523087 1 0
+0.0213304 0.141411 0.194224 0.00541128 1 0
+0.106137 0.148663 0.0220844 0.00548936 1 0
+0.295259 0.0650414 0.0597985 0.0057072 1 0
+0.116732 0.150019 0.00547719 0.0057373 1 0
+0.298718 0.00847115 0.0998693 0.00542173 1 0
+0.103477 0.0980706 0.184761 0.00544981 1 0
+0.380526 0.154388 0.0254918 0.00504119 1 0
+0.270214 0.0877797 0.0223453 0.00543992 1 0
+0.314709 0.146188 0.157199 0.00492299 1 0
+0.0183423 0.184847 0.028443 0.00502048 1 0
+0.0872812 0.109532 0.177678 0.00554028 1 0
+0.104323 0.10894 0.166694 0.00671663 1 0
+0.310986 0.115453 0.0435155 0.0051215 1 0
+0.261494 0.0451588 0.14497 0.00564139 1 0
+0.214052 0.0206624 0.0755293 0.00529037 1 0
+0.106893 0.081013 0.0946225 0.00539707 1 0
+0.298594 0.155871 0.148747 0.00506892 1 0
+0.2684 0.0265539 0.125613 0.00542403 1 0
+0.271924 0.155568 0.128731 0.00627654 1 0
+0.190981 0.0881231 0.1063 0.00609074 1 0
+0.317668 0.162075 0.0759067 0.00525105 1 0
+0.161501 0.138712 0.135025 0.00560976 1 0
+0.275306 0.11263 0.0685627 0.0056332 1 0
+0.224296 0.141754 0.0863415 0.00509894 1 0
+0.162671 0.187559 0.127827 0.00547326 1 0
+0.215382 0.0994359 0.0865149 0.00813389 1 0
+0.175097 0.141131 0.121027 0.00551912 1 0
+0.142482 0.0456714 0.17182 0.00515071 1 0
+0.0871426 0.193219 0.0885682 0.00521211 1 0
+0.1382 0.120316 0.0420877 0.00498942 1 0
+0.182786 0.0783669 0.0664189 0.0067264 1 0
+0.139911 0.136595 0.136115 0.00610351 1 0
+0.153271 0.127392 0.136792 0.00714609 1 0
+0.134296 0.0259236 0.153496 0.00523579 1 0
+0.177675 0.144073 0.138335 0.00625251 1 0
+0.307612 0.0216726 0.0937214 0.00521856 1 0
+0.23 0.179957 0.176114 0.0053792 1 0
+0.190162 0.128682 0.112774 0.00604757 1 0
+0.0763513 0.183133 0.0817355 0.00601091 1 0
+0.202471 0.162916 0.0429757 0.0049886 1 0
+0.059156 0.0903555 0.0147954 0.00529511 1 0
+0.0774759 0.0907105 0.00848086 0.0064719 1 0
+0.104679 0.12904 0.107042 0.00505079 1 0
+0.156928 0.0667936 0.168618 0.00496171 1 0
+0.109435 0.114802 0.0340654 0.00526307 1 0
+0.202898 0.0988148 0.144118 0.00507812 1 0
+0.247038 0.0932036 0.0948382 0.00527664 1 0
+0.25441 0.0812233 0.0986122 0.00498023 1 0
+0.207974 0.0236615 0.0530072 0.00501154 1 0
+0.216544 0.0188464 0.0440366 0.0054604 1 0
+0.347109 0.15848 0.157316 0.00508872 1 0
+0.275296 0.175117 0.141214 0.00660876 1 0
+0.00496755 0.1067 0.119988 0.00513157 1 0
+0.297911 0.040944 0.040722 0.00499771 1 0
+0.159434 0.0956141 0.0793437 0.00573121 1 0
+0.283499 0.191069 0.14746 0.0062051 1 0
+0.0369525 0.147064 0.159164 0.00530303 1 0
+0.22607 0.161718 0.14422 0.00523933 1 0
+0.108679 0.0368119 0.0413441 0.00582451 1 0
+0.160892 0.158663 0.1593 0.00561418 1 0
+0.117058 0.136609 0.0401125 0.0050545 1 0
+0.307358 0.147503 0.0894396 0.00502678 1 0
+0.245616 0.147308 0.0379248 0.0049501 1 0
+0.392621 0.0111457 0.151269 0.00552043 1 0
+0.236105 0.110368 0.0613037 0.00536382 1 0
+0.245302 0.0805854 0.0785322 0.0050188 1 0
+0.0652638 0.0836976 0.083807 0.00535354 1 0
+0.32297 0.0769884 0.0234433 0.00493859 1 0
+0.0138609 0.156448 0.0232398 0.0050417 1 0
+0.360794 0.0355947 0.0448732 0.00591051 1 0
+0.178974 0.0989185 0.137006 0.00588317 1 0
+0.175662 0.152784 0.0430227 0.00496919 1 0
+0.0770389 0.0916468 0.0998569 0.00500567 1 0
+0.130172 0.156197 0.173118 0.0064809 1 0
+0.357743 0.0473451 0.116656 0.00592238 1 0
+0.195747 0.0966667 0.101135 0.00497218 1 0
+0.00530248 0.149842 0.121771 0.00585836 1 0
+0.306338 0.116316 0.00953368 0.00781098 1 0
+0.244299 0.0236894 0.182913 0.00500193 1 0
+0.215106 0.0280928 0.153081 0.00542675 1 0
+0.361435 0.15433 0.070999 0.00655125 1 0
+0.0932397 0.190976 0.141447 0.00640936 1 0
+0.153466 0.0468423 0.0457411 0.00518046 1 0
+0.191824 0.0385899 0.160921 0.00493513 1 0
+0.115354 0.154888 0.0550774 0.00509607 1 0
+0.0862296 0.163467 0.155967 0.00555456 1 0
+0.328104 0.185124 0.128874 0.00534291 1 0
+0.34386 0.153777 0.0544861 0.00600231 1 0
+0.162034 0.132633 0.144444 0.00561354 1 0
+0.360377 0.177149 0.0473056 0.00500698 1 0
+0.236277 0.19483 0.0243622 0.00525474 1 0
+0.118413 0.11688 0.0402421 0.0054435 1 0
+0.305835 0.155644 0.170986 0.00552785 1 0
+0.129544 0.141282 0.114632 0.00510482 1 0
+0.376786 0.018156 0.156706 0.00527047 1 0
+0.147745 0.185436 0.146696 0.00515421 1 0
+0.272266 0.15953 0.0903589 0.00520212 1 0
+0.22723 0.104227 0.0822697 0.00533343 1 0
+0.385255 0.175893 0.0649707 0.00515363 1 0
+0.23857 0.129915 0.0724236 0.00678225 1 0
+0.0351287 0.115887 0.0370834 0.00515281 1 0
+0.23379 0.0768889 0.102961 0.00529133 1 0
+0.311395 0.182793 0.00742186 0.00531421 1 0
+0.35 0.0342712 0.0193649 0.00502089 1 0
+0.163462 0.0941723 0.0980868 0.00582487 1 0
+0.220885 0.0883698 0.0979634 0.0050954 1 0
+0.381986 0.112109 0.0779516 0.00518927 1 0
+0.349757 0.149435 0.160687 0.00492043 1 0
+0.163168 0.149353 0.150924 0.00505876 1 0
+0.320919 0.180746 0.109715 0.00575719 1 0
+0.335675 0.0176508 0.0384298 0.00556491 1 0
+0.126986 0.115883 0.105086 0.00569101 1 0
+0.325076 0.0168704 0.0376704 0.0050906 1 0
+0.145427 0.117636 0.136501 0.00537628 1 0
+0.236591 0.177699 0.00704534 0.00517186 1 0
+0.149068 0.155496 0.116311 0.00586574 1 0
+0.155506 0.124715 0.148408 0.00498151 1 0
+0.170478 0.112538 0.118343 0.00557105 1 0
+0.25196 0.095997 0.0590623 0.00538771 1 0
+0.363179 0.151149 0.00658791 0.00524601 1 0
+0.333096 0.138546 0.101435 0.0054084 1 0
+0.0678159 0.156327 0.170413 0.0051171 1 0
+0.110907 0.0718823 0.0908004 0.00528436 1 0
+0.0145692 0.194365 0.0779644 0.0050922 1 0
+0.0956187 0.0132816 0.129183 0.00509384 1 0
+0.165112 0.161259 0.132262 0.00607402 1 0
+0.209558 0.0908923 0.0945273 0.00494699 1 0
+0.251909 0.00908388 0.014914 0.00533323 1 0
+0.261593 0.118391 0.0209312 0.00511847 1 0
+0.196188 0.0813525 0.0631632 0.00502461 1 0
+0.0258493 0.18743 0.124911 0.00498865 1 0
+0.360149 0.042735 0.161188 0.00548699 1 0
+0.35 0.0403613 0.161944 0.004963 1 0
+0.309527 0.124847 0.154487 0.00528182 1 0
+0.244683 0.101301 0.0655127 0.0055659 1 0
+0.325279 0.155186 0.066466 0.00559949 1 0
+0.226617 0.195266 0.00806071 0.00512528 1 0
+0.169953 0.0999186 0.108535 0.00504286 1 0
+0.137916 0.186472 0.184189 0.0064584 1 0
+0.0972162 0.134765 0.110854 0.00509749 1 0
+0.303273 0.0299333 0.0454584 0.00580123 1 0
+0.279745 0.0864832 0.0184272 0.0049462 1 0
+0.116074 0.0774425 0.154193 0.00638064 1 0
+0.248656 0.176256 0.0414543 0.00524495 1 0
+0.11719 0.0834206 0.0961585 0.00528837 1 0
+0.229539 0.118874 0.0684492 0.00511033 1 0
+0.173123 0.195374 0.111901 0.00501602 1 0
+0.136327 0.0396209 0.195201 0.0051349 1 0
+0.158862 0.147049 0.127001 0.00625819 1 0
+0.0991766 0.0235319 0.0445431 0.00538577 1 0
+0.201657 0.0487937 0.17149 0.00500199 1 0
+0.312662 0.0232805 0.0848822 0.00508772 1 0
+0.35945 0.135313 0.00927028 0.00523795 1 0
+0.104058 0.068495 0.17199 0.00518088 1 0
+0.037409 0.146655 0.174523 0.00493557 1 0
+0.148805 0.153965 0.160534 0.0051623 1 0
+0.328463 0.160841 0.0579076 0.00514102 1 0
+0.0221549 0.157353 0.194761 0.00500206 1 0
+0.322146 0.13593 0.192839 0.00542503 1 0
+0.286297 0.149768 0.00908993 0.00610423 1 0
+0.280655 0.166453 0.133761 0.00601319 1 0
+0.169994 0.185952 0.11743 0.00584323 1 0
+0.132045 0.045301 0.172359 0.00530653 1 0
+0.0777551 0.161616 0.131273 0.00552788 1 0
+0.199873 0.172401 0.0460262 0.00510947 1 0
+0.272171 0.0594096 0.160745 0.00532387 1 0
+0.165046 0.00600323 0.109875 0.00521884 1 0
+0.142337 0.0812874 0.0878795 0.00498215 1 0
+0.0924792 0.0732765 0.150215 0.00557322 1 0
+0.056255 0.16237 0.117474 0.00507203 1 0
+0.175249 0.16002 0.136546 0.00500027 1 0
+0.155973 0.175395 0.149447 0.00493138 1 0
+0.118544 0.152403 0.165247 0.00546414 1 0
+0.343404 0.159514 0.0899321 0.00495426 1 0
+0.128004 0.141325 0.154959 0.0049926 1 0
+0.244713 0.0307325 0.155689 0.00508441 1 0
+0.181902 0.141143 0.112709 0.00522801 1 0
+0.307729 0.138997 0.0192935 0.00507574 1 0
+0.331633 0.0900834 0.00664554 0.00528612 1 0
+0.216766 0.0824641 0.108869 0.00568365 1 0
+0.211694 0.10536 0.101931 0.00519168 1 0
+0.179299 0.0286834 0.154585 0.00503082 1 0
+0.00631072 0.147677 0.0345265 0.00543485 1 0
+0.332261 0.0910282 0.0655754 0.00591895 1 0
+0.326055 0.0639492 0.104676 0.00532498 1 0
+0.104297 0.0712327 0.152123 0.0049905 1 0
+0.337664 0.118813 0.146655 0.00500696 1 0
+0.16796 0.0880324 0.0899783 0.00520396 1 0
+0.151126 0.144095 0.117993 0.0051249 1 0
+0.167151 0.122918 0.127015 0.00578551 1 0
+0.347149 0.181876 0.140827 0.00657185 1 0
+0.353949 0.191197 0.140731 0.00496706 1 0
+0.28435 0.189917 0.0435792 0.00586862 1 0
+0.222213 0.0143369 0.0721368 0.00557794 1 0
+0.279042 0.0945755 0.11326 0.00519755 1 0
+0.210267 0.0545971 0.188648 0.00515023 1 0
+0.317678 0.147377 0.193662 0.00621996 1 0
+0.250707 0.128303 0.0628843 0.00550307 1 0
+0.0200183 0.12112 0.083305 0.00501581 1 0
+0.177239 0.118432 0.146594 0.00520612 1 0
+0.111327 0.0824235 0.166339 0.00591941 1 0
+0.155479 0.146328 0.186009 0.0050508 1 0
+0.0919961 0.140076 0.142581 0.00563671 1 0
+0.269316 0.144037 0.131719 0.00560771 1 0
+0.150699 0.139069 0.133101 0.00536768 1 0
+0.209042 0.108432 0.0794174 0.00496219 1 0
+0.216699 0.112429 0.0861932 0.00492981 1 0
+0.101038 0.133943 0.0973033 0.00644403 1 0
+0.0966487 0.120678 0.107036 0.00523101 1 0
+0.202327 0.02737 0.0603728 0.0049831 1 0
+0.193253 0.0784818 0.0730075 0.00564155 1 0
+0.0868005 0.12796 0.110006 0.00531148 1 0
+0.238097 0.139762 0.0654122 0.00531521 1 0
+0.154478 0.00735788 0.109484 0.00544259 1 0
+0.103283 0.128144 0.0876139 0.0050692 1 0
+0.270558 0.16535 0.0986312 0.00505513 1 0
+0.157723 0.105315 0.0744188 0.00528203 1 0
+0.169762 0.151644 0.135452 0.00507249 1 0
+0.125053 0.149402 0.11914 0.00521138 1 0
+0.268898 0.165729 0.134488 0.00578782 1 0
+0.170716 0.13527 0.138964 0.00498681 1 0
+0.171308 0.127188 0.14667 0.00536928 1 0
+0.277086 0.157709 0.00506657 0.00534523 1 0
+0.1712 0.00837622 0.119438 0.00530001 1 0
+0.355425 0.144238 0.00571681 0.00517774 1 0
+0.166652 0.083414 0.0995339 0.00524142 1 0
+0.119505 0.139675 0.114664 0.00506236 1 0
+0.204039 0.110165 0.106515 0.00494264 1 0
+0.39225 0.188542 0.150983 0.00565893 1 0
+0.148649 0.136782 0.143078 0.00506248 1 0
+0.22953 0.112953 0.0768692 0.0051831 1 0
+0.0694713 0.0871968 0.0941546 0.00546271 1 0
+0.259241 0.149048 0.128677 0.00604828 1 0
+0.170321 0.17059 0.134922 0.00493746 1 0
+0.275538 0.146728 0.00487594 0.00536114 1 0
+0.169881 0.149538 0.125133 0.00519197 1 0
+0.159116 0.151902 0.139595 0.00532538 1 0
+0.165307 0.125014 0.137586 0.00514797 1 0
+0.187238 0.105113 0.140191 0.00492454 1 0
+0.0980079 0.195089 0.151294 0.00527918 1 0
+0.0896188 0.149924 0.139441 0.00497002 1 0
+0.109522 0.139505 0.105479 0.0049669 1 0
+0.168901 0.107365 0.101898 0.00498716 1 0
+0.0467424 0.143688 0.176425 0.00504098 1 0
+0.258472 0.137915 0.130327 0.00523309 1 0
+0.264116 0.173093 0.0996929 0.00507272 1 0
+0.175687 0.0787602 0.0994242 0.00492242 1 0
+0.190441 0.0686624 0.0757399 0.00493151 1 0
diff --git a/src/Tools/padder/resources/padderexe/med2/concrete.med b/src/Tools/padder/resources/padderexe/med2/concrete.med
new file mode 100644 (file)
index 0000000..3b39b27
Binary files /dev/null and b/src/Tools/padder/resources/padderexe/med2/concrete.med differ
diff --git a/src/Tools/padder/resources/padderexe/med2/data.txt b/src/Tools/padder/resources/padderexe/med2/data.txt
new file mode 100644 (file)
index 0000000..f7a6b44
--- /dev/null
@@ -0,0 +1,5 @@
+concrete.med concrete
+nbSteelFiles 2
+ferrtran.med ferrtran
+ferraill.med ferraill
+output.med
diff --git a/src/Tools/padder/resources/padderexe/med2/ferraill.med b/src/Tools/padder/resources/padderexe/med2/ferraill.med
new file mode 100644 (file)
index 0000000..79cda88
Binary files /dev/null and b/src/Tools/padder/resources/padderexe/med2/ferraill.med differ
diff --git a/src/Tools/padder/resources/padderexe/med2/ferrtran.med b/src/Tools/padder/resources/padderexe/med2/ferrtran.med
new file mode 100644 (file)
index 0000000..0a86670
Binary files /dev/null and b/src/Tools/padder/resources/padderexe/med2/ferrtran.med differ
diff --git a/src/Tools/padder/resources/padderexe/med2/padder.exe b/src/Tools/padder/resources/padderexe/med2/padder.exe
new file mode 100755 (executable)
index 0000000..8591550
Binary files /dev/null and b/src/Tools/padder/resources/padderexe/med2/padder.exe differ
diff --git a/src/Tools/padder/resources/padderexe/med3/concrete.med b/src/Tools/padder/resources/padderexe/med3/concrete.med
new file mode 100644 (file)
index 0000000..3b39b27
Binary files /dev/null and b/src/Tools/padder/resources/padderexe/med3/concrete.med differ
diff --git a/src/Tools/padder/resources/padderexe/med3/data.txt b/src/Tools/padder/resources/padderexe/med3/data.txt
new file mode 100644 (file)
index 0000000..04cabc7
--- /dev/null
@@ -0,0 +1,4 @@
+concrete.med concrete
+nbSteelbarMesh= 1
+ferraill.med ferraill
+FinalEDMesh.med
diff --git a/src/Tools/padder/resources/padderexe/med3/ferraill.med b/src/Tools/padder/resources/padderexe/med3/ferraill.med
new file mode 100644 (file)
index 0000000..79cda88
Binary files /dev/null and b/src/Tools/padder/resources/padderexe/med3/ferraill.med differ
diff --git a/src/Tools/padder/resources/padderexe/med3/padder.exe b/src/Tools/padder/resources/padderexe/med3/padder.exe
new file mode 100755 (executable)
index 0000000..3eca741
Binary files /dev/null and b/src/Tools/padder/resources/padderexe/med3/padder.exe differ
diff --git a/src/Tools/padder/resources/padderexe/padder.sh b/src/Tools/padder/resources/padderexe/padder.sh
new file mode 100755 (executable)
index 0000000..dae9ea4
--- /dev/null
@@ -0,0 +1,15 @@
+#!/bin/sh
+# This script emulates the launcher script that will be generated by
+# the padder SALOME component and give as the "job file" to the SALOME
+# launcher to execute the padder job.
+# The script is supposed to be executed where the data are located.
+
+here=$(dirname $0)
+
+# >>> This part should be written by the component
+binpath=$here/padder.exe
+envpath=$here/envPadder.sh
+# <<<
+
+. $envpath
+$binpath $here/data.txt
diff --git a/src/Tools/padder/resources/padderexe/particules.png b/src/Tools/padder/resources/padderexe/particules.png
new file mode 100644 (file)
index 0000000..a1b97ec
Binary files /dev/null and b/src/Tools/padder/resources/padderexe/particules.png differ
diff --git a/src/Tools/padder/spadderpy/Makefile.am b/src/Tools/padder/spadderpy/Makefile.am
new file mode 100644 (file)
index 0000000..68ec6d8
--- /dev/null
@@ -0,0 +1,17 @@
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+SUBDIRS = 
+
+if SMESH_ENABLE_GUI
+SUBDIRS += gui plugin
+endif
+
+DIST_SUBDIRS = gui plugin
+
+spadderpydir=$(smeshpypkgdir)/spadder
+spadderpy_PYTHON = \
+       __init__.py \
+       configreader.py
+
+salomeplugins_DATA = \
+       padder.cfg
diff --git a/src/Tools/padder/spadderpy/__init__.py b/src/Tools/padder/spadderpy/__init__.py
new file mode 100644 (file)
index 0000000..a134daf
--- /dev/null
@@ -0,0 +1,93 @@
+#  Copyright (C) 2011 EDF R&D
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+#  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+# Author(s): Guillaume Boulant (23/03/2011)
+#
+
+# TODO: put all this stuff in the unitests package
+
+import os
+def getRootDir():
+    '''
+    This returns the root directory where the module SPADDER is
+    installed. All test files are looked up from this location.
+    '''
+    return os.environ['SMESH_ROOT_DIR']
+
+def getTestDataDir():
+    '''
+    This function gives the absolute path to the directory containing
+    the data files for test (realistic med files).
+    '''
+    datadir=os.path.join(getRootDir(),"share/salome/resources/smesh/padderexe")
+    return datadir
+
+import MESHJOB # to get the enum constant values
+from MESHJOB import MeshJobParameter, MeshJobParameterList
+
+DEFAULT_CONCRETE_FILENAME=os.path.join(getTestDataDir(),'concrete.med')
+DEFAULT_STEELBAR_LISTFILENAME=[
+    os.path.join(getTestDataDir(),'ferraill.med')
+    ]
+
+def getMeshJobParameterList(concrete_filename=DEFAULT_CONCRETE_FILENAME,
+                            steelbar_listfilename=DEFAULT_STEELBAR_LISTFILENAME):
+    '''
+    This helper function creates a complete set of parameters (a
+    MeshJobParameterList) for a simple test case, i.e. a case with a
+    concrete filename and a single steelbar filename.
+    '''
+    # Note that a CORBA sequence (MeshJobParameterList) is mapped on a
+    # simple list in python
+    meshJobParameterList = []
+    # We can add some parameters
+    param = MeshJobParameter(
+        file_name  = concrete_filename,
+        file_type  = MESHJOB.MED_CONCRETE,
+        group_name = "concrete")
+    meshJobParameterList.append(param)
+
+    for steelbar_filename in steelbar_listfilename:
+        param = MeshJobParameter(
+            file_name  = steelbar_filename,
+            file_type  = MESHJOB.MED_STEELBAR,
+            group_name = "steelbar")
+        meshJobParameterList.append(param)
+
+    return meshJobParameterList
+
+
+def getSpadderCatalogFilename():
+    filename=os.path.join(getRootDir(),"share/salome/resources/smesh/SPADDERCatalog.xml")
+    return filename
+
+def loadSpadderCatalog():
+    import salome
+    salome.salome_init()
+    obj = salome.naming_service.Resolve('Kernel/ModulCatalog')
+    import SALOME_ModuleCatalog
+    catalog = obj._narrow(SALOME_ModuleCatalog.ModuleCatalog)
+    if not catalog:
+        raise RuntimeError, "Can't accesss module catalog"
+
+    filename = getSpadderCatalogFilename()
+    catalog.ImportXmlCatalogFile(filename)
+
+    from salome.kernel import services
+    print "The list of SALOME components is now:" 
+    print services.getComponentList()
diff --git a/src/Tools/padder/spadderpy/configreader.py b/src/Tools/padder/spadderpy/configreader.py
new file mode 100644 (file)
index 0000000..9fc13cd
--- /dev/null
@@ -0,0 +1,132 @@
+# -*- coding: iso-8859-1 -*-
+#  Copyright (C) 2011 EDF R&D
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+#  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+# Author(s): Guillaume Boulant (23/03/2011)
+#
+
+import sys, os
+import ConfigParser
+from MESHJOB import ConfigParameter
+from salome.kernel.uiexception import AdminException, UiException
+
+from salome_pluginsmanager import PLUGIN_PATH_PATTERN
+CONFIG_RELPATH  = os.path.join(PLUGIN_PATH_PATTERN,'smesh')
+CONFIG_FILENAME = "padder.cfg"
+TYPE_LOCAL   = 'local'
+TYPE_REMOTE  = 'remote'
+TYPES=[TYPE_LOCAL, TYPE_REMOTE]
+
+class ConfigReader:
+    def __init__(self):
+        # The first step is to look for the config file. This file
+        # is supposed to be located in the same directory than the
+        # padder plugin. Then, we have to scan the directories
+        # specified in the SALOME plugins path.
+        self.__configFilename = None
+        try:
+            smeshpath=os.environ["SMESH_ROOT_DIR"]
+        except KeyError, ex:
+            raise AdminException("You should define the variable SALOME_PLUGINS_PATH")
+
+        pluginspath = os.path.join(smeshpath,CONFIG_RELPATH)
+        filename    = os.path.join(pluginspath,CONFIG_FILENAME)
+        if os.path.exists(filename):
+            self.__configFilename = filename
+        else:
+            msg = "The configuration file %s can't be found in the SMESH plugins path %s"
+            raise AdminException(msg%(CONFIG_FILENAME,pluginspath))
+
+        print "The configuration file is : %s"%self.__configFilename
+        self.__configparser = ConfigParser.RawConfigParser()
+        try:
+            self.__configparser.read(self.__configFilename)
+        except ConfigParser.ParsingError, ex:
+            raise AdminException(ex.message)
+
+    def getLocalConfig(self):
+        return self.__getConfig(TYPE_LOCAL)
+    
+    def getRemoteConfig(self):
+        return self.__getConfig(TYPE_REMOTE)
+
+    def getDefaultConfig(self):
+        defaultType = self.__getDefaultType()
+        return self.__getConfig(defaultType)
+        
+    def __getConfig(self, type=TYPE_LOCAL):
+        configName = self.__configparser.get('resources', type)
+        resname = self.__configparser.get(configName, 'resname')
+        binpath = self.__configparser.get(configName, 'binpath')
+        envpath = self.__configparser.get(configName, 'envpath')
+        config = ConfigParameter(resname, binpath, envpath)
+        config.resname = resname
+        return config
+
+    def __getDefaultType(self):
+        '''This returns the default type read in the config file ([resources], default)'''
+        defaultType = self.__configparser.get('preferences', 'defaultres')
+        if defaultType not in TYPES:
+            return TYPE_LOCAL
+        return defaultType
+
+#
+# =========================================================================
+# Test runner
+# =========================================================================
+#
+def TEST_getDefaultConfig():
+    try:
+        configReader = ConfigReader()
+        defaultConfig = configReader.getDefaultConfig()
+        print defaultConfig.resname
+        print defaultConfig.binpath
+        print defaultConfig.envpath
+    except Exception, ex:
+        sys.stderr.write('ERROR: %s\n' % str(ex))
+        return False
+    
+    return True
+
+def TEST_getDefaultConfig_withError():
+    global CONFIG_FILENAME
+    CONFIG_FILENAME = "toto.cfg"
+    try:
+        configReader = ConfigReader()
+        defaultConfig = configReader.getDefaultConfig()
+    except UiException, err:
+        print 'ERROR: %s' % str(err)
+        return True
+    
+    return False
+
+
+from salome.kernel import unittester
+moduleName = "configreader"
+
+def testsuite():
+    unittester.run(moduleName, "TEST_getDefaultConfig")
+    unittester.run(moduleName, "TEST_getDefaultConfig_withError")
+    
+if __name__ == "__main__":
+    import os, sys
+    pluginspath=os.environ["SALOME_PLUGINS_PATH"]
+    for path in pluginspath.split(":"):
+        sys.path.insert(0,path)
+    
+    testsuite()
diff --git a/src/Tools/padder/spadderpy/gui/Makefile.am b/src/Tools/padder/spadderpy/gui/Makefile.am
new file mode 100644 (file)
index 0000000..441333e
--- /dev/null
@@ -0,0 +1,41 @@
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+#
+# Files that compose the spadder graphical interface used by the
+# plugin. They are installed in the spadder python package, under the
+# sub-package plugins.
+#
+spadderpydir=$(smeshpypkgdir)/spadder/gui
+dist_spadderpy_PYTHON = \
+       __init__.py \
+       plugindialog.py \
+       inputdialog.py \
+       inputdata.py
+
+PYUIC_FILES = \
+       plugindialog_ui.py \
+       inputframe_ui.py
+
+nodist_spadderpy_PYTHON = $(PYUIC_FILES)
+CLEANFILES = $(PYUIC_FILES)
+
+dist_spadderpy_DATA= \
+       parameters.png \
+       input.png \
+       select.png \
+       compute.png \
+       refresh.png \
+       publish.png \
+       clear.png \
+       addinput.png \
+       deleteinput.png \
+       concrete.png \
+       steelbar.png
+
+%_ui.py:%.ui
+       $(PYUIC) -x $< -o $@
+
+%_rc.py:%.qrc
+       $(PYRCC) $< -o $@
+
+EXTRA_DIST += $(PYUIC_FILES:%_ui.py=%.ui)
diff --git a/src/Tools/padder/spadderpy/gui/__init__.py b/src/Tools/padder/spadderpy/gui/__init__.py
new file mode 100644 (file)
index 0000000..e509526
--- /dev/null
@@ -0,0 +1,20 @@
+#  Copyright (C) 2011 EDF R&D
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+#  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+# Author(s): Guillaume Boulant (23/03/2011)
+#
diff --git a/src/Tools/padder/spadderpy/gui/addinput.png b/src/Tools/padder/spadderpy/gui/addinput.png
new file mode 100644 (file)
index 0000000..408b6b4
Binary files /dev/null and b/src/Tools/padder/spadderpy/gui/addinput.png differ
diff --git a/src/Tools/padder/spadderpy/gui/clear.png b/src/Tools/padder/spadderpy/gui/clear.png
new file mode 100644 (file)
index 0000000..642001b
Binary files /dev/null and b/src/Tools/padder/spadderpy/gui/clear.png differ
diff --git a/src/Tools/padder/spadderpy/gui/compute.png b/src/Tools/padder/spadderpy/gui/compute.png
new file mode 100644 (file)
index 0000000..37c77a5
Binary files /dev/null and b/src/Tools/padder/spadderpy/gui/compute.png differ
diff --git a/src/Tools/padder/spadderpy/gui/concrete.png b/src/Tools/padder/spadderpy/gui/concrete.png
new file mode 100644 (file)
index 0000000..33af046
Binary files /dev/null and b/src/Tools/padder/spadderpy/gui/concrete.png differ
diff --git a/src/Tools/padder/spadderpy/gui/deleteinput.png b/src/Tools/padder/spadderpy/gui/deleteinput.png
new file mode 100644 (file)
index 0000000..86c3e36
Binary files /dev/null and b/src/Tools/padder/spadderpy/gui/deleteinput.png differ
diff --git a/src/Tools/padder/spadderpy/gui/input.png b/src/Tools/padder/spadderpy/gui/input.png
new file mode 100644 (file)
index 0000000..a8a67db
Binary files /dev/null and b/src/Tools/padder/spadderpy/gui/input.png differ
diff --git a/src/Tools/padder/spadderpy/gui/inputdata.py b/src/Tools/padder/spadderpy/gui/inputdata.py
new file mode 100644 (file)
index 0000000..ab2f933
--- /dev/null
@@ -0,0 +1,79 @@
+# -*- coding: iso-8859-1 -*-
+#  Copyright (C) 2011 EDF R&D
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+# -* Makefile *- 
+#
+# Author : Guillaume Boulant (EDF)
+#
+
+from salome.kernel.enumerate import Enumerate
+from salome.kernel.datamodeler import DataModeler, TypeString, TypeInteger
+
+# __MEM__: Note that this module does not depend on the SPADDER
+# component on purpose (we could have use a derived structure of
+# SPADDER_ORB.MeshJobParameter). This choice is made to ease the test
+# and development of the gui part of the plugin. If this data
+# structure becomes too important, we could make another arrangement
+# and use directly a SPADDER_ORB.MeshJobParameter.
+
+class InputData(DataModeler):
+    MESHTYPES=Enumerate([
+        'CONCRETE',
+        'STEELBAR'
+        ])
+
+    def __init__(self):
+        DataModeler.__init__(self)
+        self.addAttribute(
+            name  = "meshObject",
+            void  = True
+            )
+        self.addAttribute(
+            name  = "meshName",
+            type  = TypeString,
+            range = None
+            )
+        self.addAttribute(
+            name  = "meshType",
+            type  = TypeInteger,
+            range = self.MESHTYPES.listvalues()
+            )
+        self.addAttribute(
+            name  = "groupName",
+            type  = TypeString,
+            range = None
+            )
+
+#
+# ==============================================================================
+# Basic use cases and unit tests
+# ==============================================================================
+#
+def TEST_getName():
+    testdata = InputData()
+    testdata.meshName   = "myMesh"
+    testdata.meshObject = None
+    testdata.meshType   = InputData.MESHTYPES.CONCRETE
+    if testdata.meshName != "myMesh" :
+        return False
+    return True
+
+if __name__ == "__main__":
+    from salome.kernel.unittester import run
+    run("inputdata","TEST_getName")
diff --git a/src/Tools/padder/spadderpy/gui/inputdialog.py b/src/Tools/padder/spadderpy/gui/inputdialog.py
new file mode 100644 (file)
index 0000000..51659f5
--- /dev/null
@@ -0,0 +1,378 @@
+# -*- coding: iso-8859-1 -*-
+#  Copyright (C) 2011 EDF R&D
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+# -* Makefile *- 
+#
+# Author : Guillaume Boulant (EDF)
+#
+
+import os
+
+import salome
+from salome.kernel import studyedit
+from salome.gui.genericdialog import GenericDialog
+from salome.gui import helper as guihelper
+from salome.smesh.smeshstudytools import SMeshStudyTools
+
+from omniORB import CORBA
+
+from PyQt4.QtCore import QObject, SIGNAL, SLOT
+from PyQt4.QtGui import QIcon, QStandardItemModel, QStandardItem, QMessageBox
+
+from inputframe_ui import Ui_InputFrame
+from inputdata import InputData
+
+DEBUG_MODE=True
+GROUPNAME_MAXLENGTH=8
+
+class InputDialog(GenericDialog):
+
+    TBL_HEADER_LABEL=["Input Mesh", "Output group name"]
+
+    def __init__(self, parent=None, name="InputDialog", modal=0):
+        """
+        This initializes a dialog windows to define the input data of
+        the plugin function. The input data consist in a list of
+        meshes characterizes each by a name, a pointer to the smesh
+        servant object, a type and a group name (see data model in the
+        inputdata.py).
+        """
+        GenericDialog.__init__(self, parent, name, modal)
+        # Set up the user interface from Designer.
+        self.__ui = Ui_InputFrame()
+        # BE CAREFULL HERE, the ui form is NOT drawn in the global
+        # dialog (already containing some generic widgets) but in the
+        # center panel created in the GenericDialog as a void
+        # container for the form. The InputFrame form is supposed
+        # here to create only the widgets to be placed in the center
+        # panel. Then, the setupUi function of this form draws itself
+        # in the specified panel, i.e. the panel returned by
+        # self.getPanel().
+        self.__ui.setupUi(self.getPanel())
+
+        self.setWindowTitle("Specification of input files")
+
+        # The icon are supposed to be located in the plugin folder,
+        # i.e. in the same folder than this python module file
+        iconfolder=os.path.dirname(os.path.abspath(__file__))
+        icon = QIcon()
+        icon.addFile(os.path.join(iconfolder,"select.png"))
+        self.__ui.btnSmeshObject.setIcon(icon)
+        icon = QIcon()
+        icon.addFile(os.path.join(iconfolder,"addinput.png"))
+        self.__ui.btnAddInput.setIcon(icon)
+        icon = QIcon()
+        icon.addFile(os.path.join(iconfolder,"deleteinput.png"))
+        self.__ui.btnDeleteInput.setIcon(icon)
+
+        # We specify here the items in the combo box (even if already
+        # defined in the designer) so that we can be sure of the item
+        # indexation.
+        self.MESHTYPE_ICONS = {}
+        meshTypeIndex = InputData.MESHTYPES.CONCRETE
+        self.__ui.cmbMeshType.setItemText(meshTypeIndex, "Béton")
+        icon = QIcon()
+        icon.addFile(os.path.join(iconfolder,"concrete.png"))
+        self.__ui.cmbMeshType.setItemIcon(meshTypeIndex, icon)
+        self.MESHTYPE_ICONS[meshTypeIndex] = icon
+
+        meshTypeIndex = InputData.MESHTYPES.STEELBAR
+        self.__ui.cmbMeshType.setItemText(meshTypeIndex, "Acier")
+        icon = QIcon()
+        icon.addFile(os.path.join(iconfolder,"steelbar.png"))
+        self.__ui.cmbMeshType.setItemIcon(meshTypeIndex, icon)
+        self.MESHTYPE_ICONS[meshTypeIndex] = icon
+        
+        # The click on btnSmeshObject (signal clicked() emitted by the
+        # button btnSmeshObject) is connected to the slot
+        # onSelectSmeshObject, etc ...
+        self.connect(self.__ui.btnSmeshObject, SIGNAL('clicked()'), self.onSelectSmeshObject )
+        self.connect(self.__ui.btnAddInput,    SIGNAL('clicked()'), self.onAddInput )
+        self.connect(self.__ui.btnDeleteInput, SIGNAL('clicked()'), self.onDeleteInput )
+
+        # Set up the model of the Qt table list
+        self.__inputModel = QStandardItemModel(0,2)
+        self.__inputModel.setHorizontalHeaderLabels(InputDialog.TBL_HEADER_LABEL)
+        self.__ui.tblListInput.setModel(self.__inputModel)
+        self.__ui.tblListInput.verticalHeader().hide()
+        self.__ui.tblListInput.horizontalHeader().setStretchLastSection(True)
+        # Note that the type is not display explicitly in the Qt table
+        # because it is specified using an icon on the text of the
+        # name item. 
+
+        # Note that PADDER does not support group name longer than 8
+        # characters. We apply then this limit in the gui field.
+        self.__ui.txtGroupName.setMaxLength(GROUPNAME_MAXLENGTH)
+
+        self.clear()
+
+        self.smeshStudyTool = SMeshStudyTools()
+
+    def clear(self):
+        """
+        This function clears the data gui area and associated values.
+        """
+        self.__ui.txtSmeshObject.setText("")
+        self.__ui.txtGroupName.setText("")
+        self.__inputModel.clear()
+        self.__inputModel.setHorizontalHeaderLabels(InputDialog.TBL_HEADER_LABEL)
+        if not DEBUG_MODE:
+            self.__ui.txtSmeshObject.setEnabled(False)
+            self.__ui.btnAddInput.setEnabled(False)
+        self.__selectedMesh = None
+        self.__dictInputData = {}
+        self.__nbConcreteMesh = 0
+        self.__nbSteelbarMesh = 0
+
+    def accept(self):
+        """
+        This function is the slot connected to the button OK
+        """
+        # The dialog is raised in a non modal mode to get
+        # interactivity with the parents windows. Then we have to emit
+        # a signal to warn the parent observer that the dialog has
+        # been validated so that it can process the event
+        GenericDialog.accept(self)
+        if self.wasOk():
+            self.emit(SIGNAL('inputValidated()'))
+
+    def onSelectSmeshObject(self):
+        '''
+        This function is the slot connected on the mesh selection
+        button. It memorizes the selected mesh and put its name in the
+        text field of the dialog box.
+        '''
+        mySObject, myEntry = guihelper.getSObjectSelected()
+        if CORBA.is_nil(mySObject):
+            self.__ui.txtSmeshObject.setText("You must choose a mesh")
+            self.__ui.txtGroupName.setText("")
+            self.__ui.txtSmeshObject.setEnabled(False)
+            self.__ui.btnAddInput.setEnabled(False)
+            self.__selectedMesh = None
+            return
+
+        self.smeshStudyTool.updateStudy(studyedit.getActiveStudyId())
+        self.__selectedMesh = self.smeshStudyTool.getMeshObjectFromSObject(mySObject)
+        if CORBA.is_nil(self.__selectedMesh):
+            self.__ui.txtSmeshObject.setText("The selected object is not a mesh")
+            self.__ui.txtGroupName.setText("")
+            self.__ui.txtSmeshObject.setEnabled(False)
+            self.__ui.btnAddInput.setEnabled(False)
+            self.__selectedMesh = None
+            return
+        myName = mySObject.GetName()
+        self.__ui.txtSmeshObject.setText(myName)
+        self.__ui.txtSmeshObject.setEnabled(True)
+        self.__ui.btnAddInput.setEnabled(True)
+
+        # We can suggest a default group name from the mesh name
+        self.__ui.txtGroupName.setText(myName)
+
+    def onAddInput(self):
+        """
+        This function is the slot connected to the Add button. It
+        creates a new entry in the list of input data, or updates this
+        entry if it already exists.
+        """
+        meshName   = str(self.__ui.txtSmeshObject.text().trimmed())
+        meshObject = self.__selectedMesh
+        meshType   = self.__ui.cmbMeshType.currentIndex()
+        groupName  = str(self.__ui.txtGroupName.text().trimmed())
+
+        self.__addInputInGui(meshName, meshObject, meshType, groupName)
+        self.__addInputInMap(meshName, meshObject, meshType, groupName)
+
+    def __addInputInGui(self, meshName, meshObject, meshType, groupName):
+        """
+        This function adds an entry with the specified data int the
+        GUI table (for data visualization purpose).
+        """
+        # The mesh name is used as the key index in the model. We have
+        # to check first if this item already exists in the list.
+        tblItems = self.__inputModel.findItems(meshName)
+        row = self.__inputModel.rowCount()
+        if not tblItems:
+            tblItems = []
+            tblItems.append(QStandardItem()) # input mesh name
+            tblItems.append(QStandardItem()) # output group name
+        else:
+            row = tblItems[0].index().row()
+            tblItems.append(self.__inputModel.item(row,1))
+
+        tblItems[0].setText(meshName)
+        tblItems[0].setIcon(self.MESHTYPE_ICONS[meshType])
+        tblItems[1].setText(groupName)
+        self.__inputModel.setItem(row,0,tblItems[0])
+        self.__inputModel.setItem(row,1,tblItems[1])
+        self.__ui.tblListInput.setCurrentIndex(tblItems[0].index())
+
+    def __addInputInMap(self, meshName, meshObject, meshType, groupName):
+        """
+        This function adds an entry with the specified data in the
+        internal map (for data management purpose).
+        """
+        # if the entry already exists, we remove it to replace by a
+        # new one
+        if self.__dictInputData.has_key(meshName):
+            self.__delInputFromMap(meshName)
+        
+        inputData = InputData()
+        inputData.meshName   = meshName
+        inputData.meshObject = meshObject
+        inputData.meshType   = meshType
+        inputData.groupName  = groupName
+        # The key of the map is the mesh name
+        self.__dictInputData[meshName] = inputData
+        if inputData.meshType == InputData.MESHTYPES.CONCRETE:
+            self.__nbConcreteMesh += 1
+        else:
+            self.__nbSteelbarMesh += 1
+
+        print inputData
+        print "meshType = ",inputData.meshType
+        print "nb concrete mesh ",self.__nbConcreteMesh
+        print "nb steelbar mesh ",self.__nbSteelbarMesh
+            
+
+    def onDeleteInput(self):
+        """
+        This function is the slot connected to the Delete button. It
+        remove from the data list the entry selected in the Qt table.
+        """
+        selectedIdx = self.__ui.tblListInput.selectedIndexes()
+        if selectedIdx:
+            row  = selectedIdx[0].row()
+            tblItem  = self.__inputModel.item(row,0)
+            meshName = str(tblItem.text())
+            self.__inputModel.takeRow(row)
+            # Don't forget to remove this entry from the mesh object
+            # internal dictionnary
+            self.__delInputFromMap(meshName)
+
+    def __delInputFromMap(self, meshName):
+        """
+        This function removes the specified entry from the internal
+        map (for data management purpose) 
+        """
+        inputData = self.__dictInputData.pop(meshName)
+        if inputData.meshType == InputData.MESHTYPES.CONCRETE:
+            self.__nbConcreteMesh -= 1
+        else:
+            self.__nbSteelbarMesh -= 1
+
+        print inputData
+        print "nb concrete mesh ",self.__nbConcreteMesh
+        print "nb steelbar mesh ",self.__nbSteelbarMesh
+
+
+    def setData(self, listInputData=[]):
+        """
+        This function fills the dialog widgets with values provided by
+        the specified data list.
+        """
+        self.clear()
+        for inputData in listInputData:
+
+            meshName   = inputData.meshName
+            meshObject = inputData.meshObject
+            meshType   = inputData.meshType
+            groupName  = inputData.groupName
+            
+            self.__addInputInGui(meshName, meshObject, meshType, groupName)
+            self.__addInputInMap(meshName, meshObject, meshType, groupName)
+
+            if not DEBUG_MODE:
+                self.onSelectSmeshObject()
+
+    def getData(self):
+        """
+        This function returns a list of InputData that corresponds to
+        the data in the dialog widgets of the current dialog.
+        """
+        # Note that the values() function returns a copy of the list
+        # of values.
+        return self.__dictInputData.values()
+        
+    def checkData(self):
+        """
+        This function checks if the data are valid, from the dialog
+        window point of view.
+        """
+        if self.__nbConcreteMesh < 1:
+            self.checkDataMessage = "You must define at least one CONCRETE mesh"
+            return False        
+        if self.__nbConcreteMesh > 1:
+            self.checkDataMessage  = "You define multiple CONCRETE meshes."
+            self.checkDataMessage += "You should verify first that your version of PADDER support this configuration."
+            # just warn the user, but don't block
+            QMessageBox.information(self, "Info", self.checkDataMessage)
+            return True
+        if self.__nbSteelbarMesh < 1:
+            self.checkDataMessage = "You must define at least one STEELBAR mesh"
+            return False
+        return True
+
+
+# ==============================================================================
+# Basic use case
+# ==============================================================================
+#
+def TEST_InputDialog():
+    import sys
+    from PyQt4.QtCore import QObject, SIGNAL, SLOT
+    from PyQt4.QtGui import QApplication
+    app = QApplication(sys.argv)
+    QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+
+    dlg=InputDialog()
+    dlg.displayAndWait()
+    if dlg.wasOk():
+        print "OK has been pressed"
+
+def TEST_InputDialog_setData():
+    import sys
+    from PyQt4.QtCore import QObject, SIGNAL, SLOT
+    from PyQt4.QtGui import QApplication
+    app = QApplication(sys.argv)
+    QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+
+    dlg=InputDialog()
+
+    from inputdata import InputData
+    inputData = InputData()
+    inputData.meshName   = "myMesh"
+    inputData.meshObject = None
+    inputData.meshType   = InputData.MESHTYPES.CONCRETE
+    inputData.groupName  = "myGroup"
+    listInputData = []
+    listInputData.append(inputData)
+    
+    dlg.setData2(listInputData)
+    
+    dlg.displayAndWait()
+    if dlg.wasOk():
+        print "OK has been pressed"
+        outputListInputData = dlg.getData2()
+        print outputListInputData
+
+
+if __name__ == "__main__":
+    #TEST_InputDialog()
+    TEST_InputDialog_setData()
+
diff --git a/src/Tools/padder/spadderpy/gui/inputframe.ui b/src/Tools/padder/spadderpy/gui/inputframe.ui
new file mode 100644 (file)
index 0000000..9f98eb9
--- /dev/null
@@ -0,0 +1,204 @@
+<ui version="4.0" >
+ <class>InputFrame</class>
+ <widget class="QDialog" name="InputFrame" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>509</width>
+    <height>307</height>
+   </rect>
+  </property>
+  <property name="windowTitle" >
+   <string>Input parameters</string>
+  </property>
+  <layout class="QHBoxLayout" >
+   <property name="margin" >
+    <number>9</number>
+   </property>
+   <property name="spacing" >
+    <number>6</number>
+   </property>
+   <item>
+    <layout class="QVBoxLayout" >
+     <property name="margin" >
+      <number>0</number>
+     </property>
+     <property name="spacing" >
+      <number>6</number>
+     </property>
+     <item>
+      <widget class="QLabel" name="lblSmeshObject" >
+       <property name="text" >
+        <string>Input MESH / Output group name / Type :</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" >
+       <property name="margin" >
+        <number>0</number>
+       </property>
+       <property name="spacing" >
+        <number>6</number>
+       </property>
+       <item>
+        <layout class="QVBoxLayout" >
+         <property name="margin" >
+          <number>0</number>
+         </property>
+         <property name="spacing" >
+          <number>6</number>
+         </property>
+         <item>
+          <layout class="QHBoxLayout" >
+           <property name="margin" >
+            <number>0</number>
+           </property>
+           <property name="spacing" >
+            <number>6</number>
+           </property>
+           <item>
+            <layout class="QHBoxLayout" >
+             <property name="margin" >
+              <number>0</number>
+             </property>
+             <property name="spacing" >
+              <number>6</number>
+             </property>
+             <item>
+              <widget class="QPushButton" name="btnSmeshObject" >
+               <property name="sizePolicy" >
+                <sizepolicy>
+                 <hsizetype>0</hsizetype>
+                 <vsizetype>0</vsizetype>
+                 <horstretch>0</horstretch>
+                 <verstretch>0</verstretch>
+                </sizepolicy>
+               </property>
+               <property name="maximumSize" >
+                <size>
+                 <width>31</width>
+                 <height>16777215</height>
+                </size>
+               </property>
+               <property name="text" >
+                <string/>
+               </property>
+               <property name="icon" >
+                <iconset>select.png</iconset>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QLineEdit" name="txtSmeshObject" >
+               <property name="toolTip" >
+                <string comment="Select the input mesh in the object browser" />
+               </property>
+              </widget>
+             </item>
+            </layout>
+           </item>
+           <item>
+            <widget class="Line" name="line" >
+             <property name="orientation" >
+              <enum>Qt::Vertical</enum>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QLineEdit" name="txtGroupName" >
+             <property name="toolTip" >
+              <string comment="Specify the name of the associated group in the output mesh" />
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="Line" name="line_2" >
+             <property name="orientation" >
+              <enum>Qt::Vertical</enum>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QComboBox" name="cmbMeshType" >
+             <property name="toolTip" >
+              <string comment="Select the type of the mesh" />
+             </property>
+             <item>
+              <property name="text" >
+               <string>Béton</string>
+              </property>
+              <property name="icon" >
+               <iconset>concrete.png</iconset>
+              </property>
+             </item>
+             <item>
+              <property name="text" >
+               <string>Acier</string>
+              </property>
+              <property name="icon" >
+               <iconset>steelbar.png</iconset>
+              </property>
+             </item>
+            </widget>
+           </item>
+          </layout>
+         </item>
+         <item>
+          <widget class="QTableView" name="tblListInput" />
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QVBoxLayout" >
+         <property name="margin" >
+          <number>0</number>
+         </property>
+         <property name="spacing" >
+          <number>6</number>
+         </property>
+         <item>
+          <widget class="QPushButton" name="btnAddInput" >
+           <property name="text" >
+            <string/>
+           </property>
+           <property name="icon" >
+            <iconset>addinput.png</iconset>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="btnDeleteInput" >
+           <property name="text" >
+            <string/>
+           </property>
+           <property name="icon" >
+            <iconset>deleteinput.png</iconset>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer>
+           <property name="orientation" >
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeHint" >
+            <size>
+             <width>20</width>
+             <height>40</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/Tools/padder/spadderpy/gui/parameters.png b/src/Tools/padder/spadderpy/gui/parameters.png
new file mode 100644 (file)
index 0000000..a8a67db
Binary files /dev/null and b/src/Tools/padder/spadderpy/gui/parameters.png differ
diff --git a/src/Tools/padder/spadderpy/gui/plugindialog.py b/src/Tools/padder/spadderpy/gui/plugindialog.py
new file mode 100644 (file)
index 0000000..26a2d7c
--- /dev/null
@@ -0,0 +1,405 @@
+# -*- coding: iso-8859-1 -*-
+#  Copyright (C) 2011 EDF R&D
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+# -* Makefile *- 
+#
+# Author : Guillaume Boulant (EDF)
+#
+
+from PyQt4.QtGui import QDialog, QIcon
+from PyQt4.QtCore import QObject, SIGNAL, SLOT, Qt
+
+from plugindialog_ui import Ui_PluginDialog
+from inputdialog import InputDialog
+from inputdata import InputData
+# __GBO__: uncomment this line and comment the previous one to use the
+# demo input dialog instead of the real one.
+#from demoinputdialog import InputDialog
+
+import os
+import salome
+from salome.kernel import studyedit
+from salome.kernel.uiexception import AdminException
+
+from omniORB import CORBA
+import SMESH
+import smesh
+import MESHJOB
+
+gui_states = ["CAN_SELECT", "CAN_COMPUTE", "CAN_REFRESH", "CAN_PUBLISH"]
+
+run_states = ["CREATED", "IN_PROCESS", "QUEUED", "RUNNING", "PAUSED"];
+end_states = ["FINISHED", "ERROR"]
+all_states = run_states+end_states;
+
+# The SALOME launcher resource is specified by its name as defined in
+# the file CatalogResources.xml (see root directory of the
+# application). We could have a check box in the dialog to specify
+# wether we want a local execution or a remote one.
+resource_name = "localhost"
+from salome.smesh.spadder.configreader import ConfigReader
+
+
+class PluginDialog(QDialog):
+
+    def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+        QDialog.__init__(self,parent)
+        # Set up the user interface from Designer.
+        self.__ui = Ui_PluginDialog()
+        self.__ui.setupUi(self)
+
+        # The default display strategy is to use a separate dialog box
+        # to select the input data.
+        self.viewInputFrame(False)
+
+        # The icon are supposed to be located in the plugin folder,
+        # i.e. in the same folder than this python module file
+        iconfolder=os.path.dirname(os.path.abspath(__file__))
+        icon = QIcon()
+        icon.addFile(os.path.join(iconfolder,"input.png"))
+        self.__ui.btnInput.setIcon(icon)
+        icon = QIcon()
+        icon.addFile(os.path.join(iconfolder,"compute.png"))
+        self.__ui.btnCompute.setIcon(icon)
+        icon = QIcon()
+        icon.addFile(os.path.join(iconfolder,"refresh.png"))
+        self.__ui.btnRefresh.setIcon(icon)
+        icon = QIcon()
+        icon.addFile(os.path.join(iconfolder,"publish.png"))
+        self.__ui.btnPublish.setIcon(icon)
+        icon = QIcon()
+        icon.addFile(os.path.join(iconfolder,"clear.png"))
+        self.__ui.btnClear.setIcon(icon)
+
+        # Then, we can connect the slot to there associated button event
+        self.connect(self.__ui.btnInput,       SIGNAL('clicked()'), self.onInput )
+        self.connect(self.__ui.btnCompute,     SIGNAL('clicked()'), self.onCompute )
+        self.connect(self.__ui.btnRefresh,     SIGNAL('clicked()'), self.onRefresh )
+        self.connect(self.__ui.btnPublish,     SIGNAL('clicked()'), self.onPublish )
+        self.connect(self.__ui.btnClear,       SIGNAL('clicked()'), self.onClear )
+
+        self.clear()
+
+        self.setupJobManager()
+        
+
+    def setupJobManager(self):
+        '''
+        This function configures the jobmanager by transmiting the
+        parameters required for a local execution and a remote
+        execution. The choice between "local" and "remote" is done at
+        the initialize step, by specifing the name of the resource to
+        be used.
+        '''
+        # We first 
+        
+        configReader = ConfigReader()
+        config = configReader.getLocalConfig()
+        configId = config.resname
+        self.__getJobManager().configure(configId, config)
+        # Note that the resname parameter is used as the key identifier of
+        # the configuration in the job manager. As is, there can be then
+        # only one configuration for each machine defined in the resources
+        # catalog (no need to have further, I thing)
+        config = configReader.getRemoteConfig()
+        configId = config.resname
+        self.__getJobManager().configure(configId, config)
+
+        # We specify the default configuration identifier as the
+        # resource name of the default configuration
+        self.__configId = configReader.getDefaultConfig().resname
+
+
+    def viewInputFrame(self, view=True):
+        # By default, the top input frame is visible and the input
+        # button is not visible.
+        if view is False:
+            self.__ui.frameInput.setVisible(False)
+            self.__ui.btnInput.setVisible(True)
+            # We create the input dialog that will be displayed when
+            # button input is pressed:
+            self.__inputDialog = InputDialog(self)
+            # The window is kept on the top to ease the selection of
+            # items in the object browser:
+            self.__inputDialog.setWindowFlags(
+                self.__inputDialog.windowFlags() | Qt.WindowStaysOnTopHint)
+            # The signal inputValidated emited from inputDialog is
+            # connected to the slot function onProcessInput:
+            self.connect(self.__inputDialog, SIGNAL('inputValidated()'), self.onProcessInput)
+            
+        else:
+            self.__ui.frameInput.setVisible(True)
+            self.__ui.btnInput.setVisible(False)
+            # This case is NOT IMPLEMENTED YET (not really). It could
+            # be used to draw the input frame directly in the frame
+            # frameInput of this dialog box.
+
+    def getInputFrame(self):
+        return self.__ui.frameInput
+        
+    def __setGuiState(self,states=["CAN_SELECT"]):
+        if "CAN_SELECT" in states:
+            self.__ui.btnInput.setEnabled(True)
+        else:
+            self.__ui.btnInput.setEnabled(False)
+            
+        if "CAN_COMPUTE" in states:
+            self.__ui.btnCompute.setEnabled(True)
+        else:
+            self.__ui.btnCompute.setEnabled(False)
+
+        if "CAN_REFRESH" in states:
+            self.__ui.btnRefresh.setEnabled(True)
+        else:
+            self.__ui.btnRefresh.setEnabled(False)
+
+        if "CAN_PUBLISH" in states:
+            self.__ui.btnPublish.setEnabled(True)
+        else:
+            self.__ui.btnPublish.setEnabled(False)
+
+    def __getJobManager(self):
+        """
+        This function requests a pointer to the MeshJobManager
+        servant. Note that the component is loaded on first demand,
+        and then the reference is recycled.
+        """
+        if self.__dict__.has_key("__jobManager") and self.__jobManager is not None:
+            return self.__jobManager
+
+        # WARN: we first have to update the SALOME components catalog
+        # with the SPADDER components (because they are not defined in
+        # the SMESH catalog, and then they are not in the default
+        # catalog)
+        from salome.smesh import spadder
+        spadder.loadSpadderCatalog()
+        # Then we can load the MeshJobManager component
+        component=salome.lcc.FindOrLoadComponent("FactoryServer","MeshJobManager")
+        if component is None:
+            msg="ERR: the SALOME component MeshJobManager can't be reached"
+            self.__log(msg)
+            raise AdminException(msg)
+
+        self.__jobManager = component
+        return self.__jobManager
+
+    def __log(self, message):
+        """
+        This function prints the specified message in the log area
+        """ 
+        self.__ui.txtLog.append(message)
+
+    def __exportMesh(self, meshName, meshObject):
+        '''
+        This function exports the specified mesh object to a med
+        file whose name (basepath) is built from the specified mesh
+        name. This returns the filename.
+        '''
+        filename=str("/tmp/padder_inputfile_"+meshName+".med")
+        meshObject.ExportToMEDX( filename, 0, SMESH.MED_V2_2, 1 )
+        return filename
+
+    def clear(self):
+        """
+        This function clears the log area and the states of the buttons
+        """
+        self.__listInputData = []
+        self.__ui.txtLog.clear()
+        self.__setGuiState(["CAN_SELECT"])
+        self.__isRunning = False
+        self.__ui.lblStatusBar.setText("Ready")
+
+    def update(self):
+        '''
+        This function can be used to programmatically force the
+        refresh of the dialog box, the job state in particular.
+        '''
+        if self.__isRunning:
+            self.onRefresh()
+
+    def onInput(self):
+        '''
+        This function is the slot connected to the Input button
+        (signal clicked()). It opens the dialog window to input
+        data. The dialog is opened in a window modal mode so that the
+        SALOME study objects can be selected. In conterpart, this
+        class must listen to signals emitted by the child dialog
+        windows to process the validation event (see the slot
+        onProcessInput which is connected to this event).
+        '''
+        self.__inputDialog.setData(self.__listInputData)
+        self.__inputDialog.open()
+
+    def onProcessInput(self):
+        """
+        This function is the slot connected to the signal
+        inputValidated(), emit by the input dialog window when it's
+        validated, i.e. OK is pressed and data are valid.
+        """
+        # The processing simply consists in requesting the input data
+        # from the dialog window.
+        self.__listInputData = self.__inputDialog.getData()
+        self.__ui.lblStatusBar.setText("Input data OK")
+        self.__log("INF: Press \"Compute\" to start the job")
+        self.__setGuiState(["CAN_SELECT", "CAN_COMPUTE"])
+        
+    def onCompute(self):
+        '''
+        This function is the slot connected to the Compute button. It
+        initializes a mesh computation job and start it using the
+        SALOME launcher.  
+        '''
+        # We first have to create the list of parameters for the
+        # initialize function. For that, we have to create the files
+        # from the mesh objects:
+        meshJobParameterList=[]
+        concreteIndex=0
+        for inputData in self.__listInputData:
+            # For each input data, we have to create a
+            # MeshJobParameter and add it to the list.
+            filename  = self.__exportMesh(inputData.meshName, inputData.meshObject)
+            if inputData.meshType == InputData.MESHTYPES.CONCRETE:
+                filetype = MESHJOB.MED_CONCRETE
+            else:
+                filetype = MESHJOB.MED_STEELBAR
+
+            parameter = MESHJOB.MeshJobParameter(
+                file_name  = filename,
+                file_type  = filetype,
+                group_name = inputData.groupName)
+            meshJobParameterList.append(parameter)
+
+        jobManager = self.__getJobManager()
+        self.__jobid = jobManager.initialize(meshJobParameterList, self.__configId)
+        if self.__jobid < 0:
+            self.__log("ERR: the job can't be initialized")
+            return
+        self.__log("INF: the job has been initialized with jobid = "+str(self.__jobid))
+        
+        startOk = jobManager.start(self.__jobid)
+        if not startOk:
+            self.__log("ERR: the job with jobid = "+str(self.__jobid)+" can't be started")
+            return
+        self.__log("INF: the job "+str(self.__jobid)+" has been started")
+        self.__ui.lblStatusBar.setText("Submission OK")
+        self.__setGuiState(["CAN_REFRESH"])
+        self.__isRunning = True
+
+    def onRefresh(self):
+        """
+        This function is the slot connected on the Refresh button. It
+        requests the mesh job manager to get the state of the job and
+        display it in the log area.
+        """
+        jobManager = self.__getJobManager()
+        state = jobManager.getState(self.__jobid)
+        self.__log("INF: job state = "+str(state))
+        self.__ui.lblStatusBar.setText("")
+        if state in run_states:
+            return
+
+        self.__isRunning = False
+        if state == "FINISHED":
+            self.__setGuiState(["CAN_PUBLISH"])
+        else:
+            self.__setGuiState(["CAN_SELECT"])
+
+
+    def onPublish(self):
+        """
+        This function is the slot connected on the Publish button. It
+        requests the mesh job manager to download the results data
+        from the computation resource host and load the med file in
+        the SALOME study. 
+        """
+        jobManager = self.__getJobManager()
+        state = jobManager.getState(self.__jobid)
+        if state in run_states:
+            self.__log("WRN: jobid = "+str(self.__jobid)+" is not finished (state="+str(state)+")")
+            return
+
+        if state not in end_states:
+            self.__log("ERR: jobid = "+str(self.__jobid)+" ended abnormally with state="+str(state))
+            return
+
+        meshJobResults = jobManager.finalize(self.__jobid)
+        if state == "ERROR":
+            self.__log("ERR: jobid = "+str(self.__jobid)+" ended with error: "+meshJobResults.status)
+            return
+
+        logsdirname = os.path.join(meshJobResults.results_dirname, "logs")
+        self.__log("INF:  jobid="+str(self.__jobid)+" ended normally   : "+meshJobResults.status)
+        self.__log("INF:  jobid="+str(self.__jobid)+" see log files in : "+logsdirname)
+
+        medfilename = os.path.join(meshJobResults.results_dirname,
+                                   meshJobResults.outputmesh_filename)
+
+        smesh.SetCurrentStudy(studyedit.getActiveStudy())
+        ([outputMesh], status) = smesh.CreateMeshesFromMED(medfilename)
+
+        # By convention, the name of the output mesh in the study is
+        # build from a constant string 'padder' and the session jobid
+        meshname = 'padder_'+str(self.__jobid)
+        smesh.SetName(outputMesh.GetMesh(), meshname)
+        if salome.sg.hasDesktop():
+            salome.sg.updateObjBrowser(0)
+
+        self.__ui.lblStatusBar.setText("Publication OK")
+        self.__setGuiState(["CAN_SELECT"])
+
+    def onClear(self):
+        """
+        This function is the slot connected on the Clear button. It
+        erases data in the dialog box and cancel the current job if
+        one is running.
+        """
+        self.clear()
+        
+
+
+__dialog=None
+def getDialog():
+    """
+    This function returns a singleton instance of the plugin dialog. 
+    """
+    global __dialog
+    if __dialog is None:
+        __dialog = PluginDialog()
+    return __dialog
+
+#
+# ==============================================================================
+# Basic use cases and unit test functions
+# ==============================================================================
+#
+def TEST_PluginDialog():
+    import sys
+    from PyQt4.QtGui import QApplication
+    from PyQt4.QtCore import QObject, SIGNAL, SLOT
+    app = QApplication(sys.argv)
+    QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+
+    dlg=PluginDialog()
+    dlg.exec_()
+
+if __name__ == "__main__":
+    TEST_PluginDialog()
+
+        
+
diff --git a/src/Tools/padder/spadderpy/gui/plugindialog.ui b/src/Tools/padder/spadderpy/gui/plugindialog.ui
new file mode 100644 (file)
index 0000000..c6af08f
--- /dev/null
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PluginDialog</class>
+ <widget class="QDialog" name="PluginDialog">
+  <property name="enabled">
+   <bool>true</bool>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>649</width>
+    <height>367</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Create a mesh with PADDER</string>
+  </property>
+  <layout class="QHBoxLayout">
+   <property name="spacing">
+    <number>6</number>
+   </property>
+   <property name="margin">
+    <number>9</number>
+   </property>
+   <item>
+    <layout class="QVBoxLayout">
+     <property name="spacing">
+      <number>6</number>
+     </property>
+     <property name="margin">
+      <number>0</number>
+     </property>
+     <item>
+      <widget class="QFrame" name="frameInput">
+       <property name="frameShadow">
+        <enum>QFrame::Raised</enum>
+       </property>
+       <property name="lineWidth">
+        <number>1</number>
+       </property>
+       <property name="midLineWidth">
+        <number>0</number>
+       </property>
+       <layout class="QHBoxLayout">
+        <property name="spacing">
+         <number>6</number>
+        </property>
+        <property name="margin">
+         <number>9</number>
+        </property>
+       </layout>
+      </widget>
+     </item>
+     <item>
+      <layout class="QHBoxLayout">
+       <property name="spacing">
+        <number>6</number>
+       </property>
+       <property name="margin">
+        <number>0</number>
+       </property>
+       <item>
+        <widget class="QTextEdit" name="txtLog"/>
+       </item>
+       <item>
+        <layout class="QVBoxLayout">
+         <property name="spacing">
+          <number>6</number>
+         </property>
+         <property name="margin">
+          <number>0</number>
+         </property>
+         <item>
+          <widget class="QPushButton" name="btnInput">
+           <property name="text">
+            <string>Input</string>
+           </property>
+           <property name="icon">
+            <iconset>
+             <normaloff>parameters.png</normaloff>parameters.png</iconset>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="btnCompute">
+           <property name="text">
+            <string>Compute</string>
+           </property>
+           <property name="icon">
+            <iconset>
+             <normaloff>compute.png</normaloff>compute.png</iconset>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="btnRefresh">
+           <property name="text">
+            <string>Refresh</string>
+           </property>
+           <property name="icon">
+            <iconset>
+             <normaloff>refresh.png</normaloff>refresh.png</iconset>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="btnPublish">
+           <property name="text">
+            <string>Publish</string>
+           </property>
+           <property name="icon">
+            <iconset>
+             <normaloff>publish.png</normaloff>publish.png</iconset>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer>
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>75</width>
+             <height>101</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="btnClear">
+           <property name="text">
+            <string>Clear</string>
+           </property>
+           <property name="icon">
+            <iconset>
+             <normaloff>clear.png</normaloff>clear.png</iconset>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QLabel" name="lblStatusBar">
+       <property name="enabled">
+        <bool>true</bool>
+       </property>
+       <property name="frameShape">
+        <enum>QFrame::StyledPanel</enum>
+       </property>
+       <property name="frameShadow">
+        <enum>QFrame::Sunken</enum>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/Tools/padder/spadderpy/gui/publish.png b/src/Tools/padder/spadderpy/gui/publish.png
new file mode 100644 (file)
index 0000000..bfe8802
Binary files /dev/null and b/src/Tools/padder/spadderpy/gui/publish.png differ
diff --git a/src/Tools/padder/spadderpy/gui/refresh.png b/src/Tools/padder/spadderpy/gui/refresh.png
new file mode 100644 (file)
index 0000000..2683e98
Binary files /dev/null and b/src/Tools/padder/spadderpy/gui/refresh.png differ
diff --git a/src/Tools/padder/spadderpy/gui/select.png b/src/Tools/padder/spadderpy/gui/select.png
new file mode 100644 (file)
index 0000000..8eea6a9
Binary files /dev/null and b/src/Tools/padder/spadderpy/gui/select.png differ
diff --git a/src/Tools/padder/spadderpy/gui/steelbar.png b/src/Tools/padder/spadderpy/gui/steelbar.png
new file mode 100644 (file)
index 0000000..ce27fe3
Binary files /dev/null and b/src/Tools/padder/spadderpy/gui/steelbar.png differ
diff --git a/src/Tools/padder/spadderpy/padder.cfg.in b/src/Tools/padder/spadderpy/padder.cfg.in
new file mode 100644 (file)
index 0000000..9a8f5e1
--- /dev/null
@@ -0,0 +1,35 @@
+# This section specify the configurations to be used respectively for
+# the local execution and the remote execution. The value for 'local'
+# and 'remote' keys must be the name of a configuration section in
+# this file. The default key must specify a value between "local" or
+# "remote" to indicate the user preference. 
+[resources]
+local   = localhost
+remote  = nepal
+
+[preferences]
+defaultres = local
+
+# The following sections defines the available configurations.
+# The name of the section can be choosen arbitrary. But the value of
+# the resname key MUST be the name of a SALOME resource defined in the
+# catalog of resources (CatalogResources.xml).
+
+# For each section:
+# - resname : the name of the SALOME resource to be used in this configuration
+# - binpath : the path to the padder executable program on this resource
+# - envpath : the path to the environment file on this resource
+[localhost]
+resname = localhost
+binpath = @prefix@/share/salome/resources/smesh/padderexe/padder.exe
+envpath = @prefix@/share/salome/resources/smesh/padderexe/envPadder.sh
+
+[venus]
+resname = gboulant@venus
+binpath = /usr/local/bin/padder.exe
+envpath = /usr/local/share/envPadder.sh
+
+[nepal]
+resname = nepal@nepal
+binpath = /usr/local/bin/padder.exe
+envpath = /usr/local/share/envPadder.sh
diff --git a/src/Tools/padder/spadderpy/plugin/Makefile.am b/src/Tools/padder/spadderpy/plugin/Makefile.am
new file mode 100644 (file)
index 0000000..543204a
--- /dev/null
@@ -0,0 +1,14 @@
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+#
+# Files that strictly concern the SALOME plugins registration and
+# configuration. They are installed in a dedicated folder named
+# plugins and created in the root installation directory.
+#
+salomeplugins_PYTHON = \
+       smesh_plugins.py
+
+#salomeplugins_DATA = \
+#      envPlugins.sh
+
+
diff --git a/src/Tools/padder/spadderpy/plugin/envPlugins.sh.in b/src/Tools/padder/spadderpy/plugin/envPlugins.sh.in
new file mode 100644 (file)
index 0000000..a90477d
--- /dev/null
@@ -0,0 +1,3 @@
+SPADDER_PLUGINS_PATH=@prefix@/plugins
+export SALOME_PLUGINS_PATH=$SALOME_PLUGINS_PATH:$SPADDER_PLUGINS_PATH
+
diff --git a/src/Tools/padder/spadderpy/plugin/smesh_plugins.py b/src/Tools/padder/spadderpy/plugin/smesh_plugins.py
new file mode 100755 (executable)
index 0000000..9f79eab
--- /dev/null
@@ -0,0 +1,44 @@
+# -*- coding: iso-8859-1 -*-
+#  Copyright (C) 2011 EDF R&D
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+# -* Makefile *- 
+#
+# Author : Guillaume Boulant (EDF) 
+#
+import salome_pluginsmanager
+
+
+def runSpadderPlugin(context):
+    from salome.smesh.spadder.gui import plugindialog
+    from salome.kernel.uiexception import UiException
+    try:
+        dialog=plugindialog.getDialog()
+    except UiException, err:
+        from PyQt4.QtGui import QMessageBox
+        QMessageBox.critical(None,"An error occurs during PADDER configuration",
+                             err.getUIMessage())
+        return
+    
+    dialog.update()    
+    dialog.show()
+
+salome_pluginsmanager.AddFunction('PADDER mesher',
+                                  'Create a mesh with PADDER',
+                                  runSpadderPlugin)
+
diff --git a/src/Tools/padder/unittests/Makefile.am b/src/Tools/padder/unittests/Makefile.am
new file mode 100644 (file)
index 0000000..af90482
--- /dev/null
@@ -0,0 +1,12 @@
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+spadderpydir=$(smeshpypkgdir)/spadder/unittests
+
+spadderpy_PYTHON =                     \
+       __init__.py                    \
+       usecase_meshJobManager.py      \
+       usecase_spadderPluginTester.py
+
+spadderbindir=$(bindir)/spadder
+spadderbin_SCRIPTS = \
+       autotest.sh
diff --git a/src/Tools/padder/unittests/__init__.py b/src/Tools/padder/unittests/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/Tools/padder/unittests/autotest.sh.in b/src/Tools/padder/unittests/autotest.sh.in
new file mode 100644 (file)
index 0000000..c5a9cf7
--- /dev/null
@@ -0,0 +1,63 @@
+#!/bin/bash
+#  Copyright (C) 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
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+# -* Makefile *- 
+#
+# Author : Guillaume Boulant (EDF) 
+#
+
+
+# This script should be executed in a SALOME shell session,
+# for example the shell obtained from the command runSession
+# provided by the SALOME application.
+
+# This list contains the filenames where test suites are to be
+# executed. The path are defined relative to the PYTHON installation
+# directory of the SALOME module.
+listfiles="\
+    configreader.py \
+    unittests/test_meshJobManager.py \
+    gui/inputdata.py"
+
+INSTALL_DIR=@prefix@
+PYTHON_DIR=$INSTALL_DIR/lib/python@PYTHON_VERSION@/site-packages/salome
+PYTHONPATH=$PYTHON_DIR:$PYTHONPATH
+export PYTHONPATH
+
+stderr=2
+while getopts 'ql' OPTION
+do
+    case $OPTION in
+       q) stderr=1 ;;
+       l) for f in $listfiles; do echo $f; done; exit 0;;
+       ?) printf "Usage: %s: [-q] [-l]\n" $(basename $0) >&2; exit 2;;
+    esac
+done
+shift $(($OPTIND - 1))
+
+here=$(pwd)
+package_path="salome/smesh/spadder"
+cd $PYTHON_DIR
+for file in $listfiles; do
+    # Uncomment this line (and comment the next one) to display
+    # the start line of a test and not only the result:
+    python $package_path/$file 2>&$stderr | grep '^\[TEST'
+    #python $package_path/$file $filter | grep '^\[TEST' | grep -v 'test in progress'
+done
+cd $here
diff --git a/src/Tools/padder/unittests/usecase_meshJobManager.py b/src/Tools/padder/unittests/usecase_meshJobManager.py
new file mode 100644 (file)
index 0000000..9b6011b
--- /dev/null
@@ -0,0 +1,100 @@
+# -*- coding: iso-8859-1 -*-
+#  Copyright (C) 2011 EDF R&D
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+#  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+# Author(s): Guillaume Boulant (23/03/2011)
+#
+
+# This script illustrates the standard use case of the component
+# MeshJobManager from within a SALOME script.
+
+
+#
+# Preparing the configuration parameters
+#
+import os
+from salome.smesh import spadder
+pathpadderexe=os.path.join(spadder.getTestDataDir(),"padder.exe")
+pathpadderenv=os.path.join(spadder.getTestDataDir(),"envPadder.sh")
+file_concrete=os.path.join(spadder.getTestDataDir(),"concrete.med")
+file_steelbar=os.path.join(spadder.getTestDataDir(),"ferraill.med")
+
+import salome
+import MESHJOB
+
+#
+# Setup the configuration in the component. When first have to load
+# the catalog of SPADDER components, then load the component
+# MeshJobManager, and finally configure this component.
+#
+from salome.smesh import spadder
+spadder.loadSpadderCatalog()
+
+salome.salome_init()
+component = salome.lcc.FindOrLoadComponent("FactoryServer","MeshJobManager")
+config = MESHJOB.ConfigParameter(resname="localhost",
+                                 binpath=pathpadderexe,
+                                 envpath=pathpadderenv)
+component.configure("localhost",config)
+
+#
+# Prepare the job parameters and initialize the job
+#
+meshJobParameterList = []
+param = MESHJOB.MeshJobParameter(file_name=file_concrete,
+                                 file_type=MESHJOB.MED_CONCRETE,
+                                 group_name="concrete")
+meshJobParameterList.append(param)
+
+param = MESHJOB.MeshJobParameter(file_name=file_steelbar,
+                                 file_type=MESHJOB.MED_STEELBAR,
+                                 group_name="steelbar")
+meshJobParameterList.append(param)
+jobid = component.initialize(meshJobParameterList, "localhost")
+
+#
+# Start the execution of the job identified by its job id.
+#
+component.start(jobid)
+
+
+#
+# This part illustrates how you can follow the execution of the job.
+#
+run_states = ["CREATED", "IN_PROCESS", "QUEUED", "RUNNING", "PAUSED"];
+end_states = ["FINISHED", "ERROR"]
+all_states = run_states+end_states;
+
+ended  = False
+nbiter = 0
+import time
+while not ended:
+    state = component.getState(jobid)
+    print "MeshJobManager ["+str(nbiter)+"] : state = "+str(state)
+    if state not in run_states:
+        ended=True
+    time.sleep(0.5)
+    nbiter+=1
+        
+if state not in end_states:
+    print "ERR: jobid = "+str(jobid)+" ended abnormally with state="+str(state)
+else:
+    print "OK:  jobid = "+str(jobid)+" ended with state="+str(state)
+    meshJobResults = component.finalize(jobid)
+    print meshJobResults
+    print "You will find the results files in the directory:\n%s"%meshJobResults.results_dirname
diff --git a/src/Tools/padder/unittests/usecase_spadderPluginTester.py b/src/Tools/padder/unittests/usecase_spadderPluginTester.py
new file mode 100644 (file)
index 0000000..f21348d
--- /dev/null
@@ -0,0 +1,51 @@
+# -*- coding: iso-8859-1 -*-
+#  Copyright (C) 2011 EDF R&D
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+#  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+# Author(s): Guillaume Boulant (23/03/2011)
+#
+
+# This script illustrates the standard use case of the component
+# SPADDERPluginTester from within a SALOME script. This component is
+# dedicated to test purpose only
+
+import salome
+import SPADDERPluginTest
+
+# We first have to update the SALOME components list by loading the
+# SPADDER catalog (load on demand only) 
+from salome.smesh import spadder
+spadder.loadSpadderCatalog()
+
+# Basic test
+print "Basic tests"
+c=salome.lcc.FindOrLoadComponent("FactoryServer","SPADDERPluginTester")
+z=c.demo(2.,3.)
+
+# Test of usage of KERNEL services from the test component
+print "Test of usage of KERNEL services from the test component"
+c.testkernel()
+
+# Test of usage of SMESH engine from the test component
+# WARN: the SMESH engine must be loaded first
+print "Test of usage of SMESH engine from the test component"
+import SMESH
+salome.lcc.FindOrLoadComponent("FactoryServer","SMESH")
+c.testsmesh(salome.myStudyId)
+
+print "Test completed : OK"