EXTRA_DIST += \
build_configure \
clean_configure \
+ build_cmake \
+ build_cmake.bat \
LICENCE
dist-hook:
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
# 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
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
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
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 \
# source path
#
SUBDIRS = salome docutils
+#SUBDIRS = salome
usr_docs:
(cd salome && $(MAKE) $(AM_MAKEFLAGS) usr_docs)
# 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.
#---------------------------------------------------------------------------
#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
#---------------------------------------------------------------------------
<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"
<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"
<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.
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>
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
--- /dev/null
+/*!
+
+\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".
+
+*/
\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"
<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>
</ul>
</ul>
-*/
\ No newline at end of file
+*/
\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
<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
<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>
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
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
\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.
\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>
\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>
\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:
<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>
\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>
<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.
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.
-
*/
<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
\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>
<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
+*/
\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>
<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
+*/
\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 a 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>
\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:
- \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
\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 a set of mesh nodes;
+- \em Elements: select a 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
\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
<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>
additional information on the selected object: mesh, sub-mesh or
group.
-For mesh object, the following information is shown:
+For a mesh object, the following information is shown:
- Name
- Type: based on geomerty, imported, standalone
- Shape (if mesh is based on geometry)
<center><em>"Additional Info" page, mesh information</em></center>
<br>
-For sub-mesh object, the following information is shown:
+For a sub-mesh object, the following information is shown:
- Name
- Parent mesh
- Shape
<center><em>"Additional Info" page, sub-mesh information</em></center>
<br>
-For group object, the following information is shown:
+For a group object, the following information is shown:
- Name
- Parent mesh
- Type: standalone, group on geometry, group on filter
<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.
\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
\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
<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
+*/
<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.
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
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".
\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".
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
--- /dev/null
+/*!
+
+\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
+
+*/
\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.
<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>
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>
#
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
+++ /dev/null
-<!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>
-
-</body>
-</html>
* \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.
#libMEFISTO2D_la_LDFLAGS += -lg2c
#endif
+OBSOLETE_FILES = areteideale.f
+
+EXTRA_DIST += $(OBSOLETE_FILES)
SMESH_PreviewActorsCollection.h \
SMESH_ExtractGeometry.h \
SMESH_FaceOrientationFilter.h \
- SMESH_ScalarBarActor.h
+ SMESH_ScalarBarActor.h \
+ SMESH_NodeLabelActor.h \
+ SMESH_CellLabelActor.h
# Libraries targets
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) \
#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>
SMESH_ActorDef::SMESH_ActorDef()
{
- if(MYDEBUG) MESSAGE("SMESH_ActorDef - "<<this);
+ if(MYDEBUG) MESSAGE("SMESH_ActorDef - "<<this);
+ myBaseActor = SMESH_DeviceActor::New();
myTimeStamp = vtkTimeStamp::New();
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);
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);
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);
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);
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();
//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();
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);
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();
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;
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);
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);
}
my3DExtActor->VisibilityOff();
myScalarBarActor->VisibilityOff();
- myPointLabels->VisibilityOff();
- myCellsLabels->VisibilityOff();
if(GetVisibility()){
if(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
}
bool SMESH_ActorDef::GetPointRepresentation(){
- return myIsPointsVisible || myIsPointsLabeled;
+ return myIsPointsVisible || myNodeActor->GetPointsLabeled();
}
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;
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);
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);
}
myCippingPlaneCont.push_back(thePlane);
if(!IsImplicitFunctionUsed())
SetImplicitFunctionUsed(true);
+ myNodeActor->UpdateLabels();
}
return myCippingPlaneCont.size();
}
myImplicitBoolean->GetFunction()->Modified(); // VTK bug
myCippingPlaneCont.clear();
SetImplicitFunctionUsed(false);
+ myNodeActor->UpdateLabels();
}
vtkIdType
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
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();
vtkProperty* myNodeProp;
SMESH_DeviceActor* myBaseActor;
- SMESH_DeviceActor* myNodeActor;
+ SMESH_NodeLabelActor* myNodeActor;
SMESH_DeviceActor* myPickableActor;
vtkProperty* myHighlightProp;
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;
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;
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;
--- /dev/null
+// 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();
+}
--- /dev/null
+// 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
SMESH_DeviceActor
::SetFacesOriented(bool theIsFacesOriented)
{
- if ( vtkDataSet* aDataSet = myPassFilter[ 1 ]->GetOutput() )
+ if ( vtkDataSet* aDataSet = myTransformFilter->GetOutput() )
{
myIsFacesOriented = theIsFacesOriented;
if( theIsFacesOriented )
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
--- /dev/null
+// 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();
+}
--- /dev/null
+// 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
{
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 ];
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]);
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++ ){
}
}
+
aConnectivity->InsertNextCell( anIdList );
aCellTypesArray->InsertNextValue( getCellType( aType, anElem->IsPoly(), aNbNodes ) );
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;
}
+++ /dev/null
-/*=========================================================================
-
- 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;
-}
+++ /dev/null
-/*=========================================================================
-
- 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
{
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]);
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;
}
const bool includeSelf = true;
const bool complexShapeFirst = true;
+ const int globalAlgoDim = 100;
SMESH_subMeshIteratorPtr smIt;
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 ));
}
}
// 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
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;
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;
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;
//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);
}
//=======================================================================
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);
};
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;
};
while ( anItr->more() )
aNewGrpDS->Add( (anItr->next())->GetID() );
+ // set color
+ aNewGrpDS->SetColor( anOldGrpDS->GetColor() );
+
// remove old group
delete anOldGrp;
#include <gp_XY.hxx>
#include <gp_XYZ.hxx>
-#include <math.h>
+#include <cmath>
#include <map>
#include <set>
//=======================================================================
//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,
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() );
}
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 ))
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 );
// 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 };
}
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]);
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);
{
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 );
}
+ }
}
//================================================================================
// 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"
#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 ))
}
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
{
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 );
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 );
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" ),
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.
mySMESHGUI( theModule ),
mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
myType( theType ),
- myBusy( false )
+ myBusy( false ),
+ myIsEditCorners( false )
{
setModal( false );
setAttribute( Qt::WA_DeleteOnClose, true );
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 );
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" ),
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 );
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" ),
+++ /dev/null
-// 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();
- }
-}
+++ /dev/null
-// 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
+++ /dev/null
-// 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();
- }
-}
+++ /dev/null
-// 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
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 );
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" ),
+++ /dev/null
-// 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();
- }
-}
+++ /dev/null
-// 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
+++ /dev/null
-// 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();
- }
-}
+++ /dev/null
-// 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
<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>
<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>
<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>
<translation>Union de deux triangles</translation>
</message>
</context>
-<context>
- <name>SMESHGUI_WhatIsDlg</name>
- <message>
- <source>ENTITY_TYPE</source>
- <translation>Type d'élément </translation>
- </message>
- <message>
- <source>GRAVITY_CENTER</source>
- <translation>Centre de Gravité</translation>
- </message>
- <message>
- <source>CONNECTED_ELEMENTS</source>
- <translation>Connecté avec d'Eléments </translation>
- </message>
-</context>
<context>
<name>SMESHGUI_FileInfoDlg</name>
<message>
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 )
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" )
"SewBorderToSide","SewSideElements","ChangeElemNodes","GetLastCreatedNodes",
"GetLastCreatedElems",
"MirrorMakeMesh","MirrorObjectMakeMesh","TranslateMakeMesh",
- "TranslateObjectMakeMesh","RotateMakeMesh","RotateObjectMakeMesh","MakeBoundaryMesh"
+ "TranslateObjectMakeMesh","RotateMakeMesh","RotateObjectMakeMesh","MakeBoundaryMesh",
+ "MakeBoundaryElements"
,"" }; // <- mark of the end
sameMethods.Insert( names );
}
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;
}
//================================================================================
/*!
* \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
// 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 );
+ }
}
//================================================================================
// -------------------------------------------------------------------------------------
/*!
- * \brief A filter
+ * \brief A filter sets a human readable name to self
*/
// -------------------------------------------------------------------------------------
class _pyFilter: public _pyObject
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;
}
}
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
#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() );
}
}
}
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<<" ))";
+ }
}
}
CORBA::Boolean SMESH_MeshEditor_i::DoubleNodesOnGroupBoundaries( const SMESH::ListOfGroups& theDomains,
CORBA::Boolean createJointElems )
+ throw (SALOME::SALOME_Exception)
{
initData();
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);
* @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.
}
string SMESH_Mesh_i::PrepareMeshNameAndGroups(const char* file,
- CORBA::Boolean overwrite)
+ CORBA::Boolean overwrite)
{
// Perform Export
PrepareForWriting(file, overwrite);
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 << " )";
include $(top_srcdir)/adm_local/unix/make_common_starter.am
-salomepypkgdir = $(salomepythondir)/salome/smesh
+salomepypkgdir = $(smeshpypkgdir)
salomepypkg_PYTHON = \
__init__.py \
smeshstudytools.py
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
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=""
## 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
## 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):
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
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
*/
//================================================================================
- 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 );
}
}
// 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() );
//
#include "StdMeshers_ImportSource.hxx"
-#include "SMESHDS_GroupBase.hxx"
+#include "SMESHDS_GroupOnGeom.hxx"
#include "SMESHDS_Mesh.hxx"
#include "SMESH_Algo.hxx"
#include "SMESH_Gen.hxx"
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
class SMESH_Group;
class SMESHDS_Mesh;
+class SMESH_subMesh;
//==============================================================================
/*!
const SMESHDS_Mesh& tgtMesh);
std::vector<SMESH_Mesh*> GetSourceMeshes() const;
+ std::vector<SMESH_subMesh*> GetSourceSubMeshes(const SMESH_Mesh* srcMesh) const;
private:
// 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 );
// 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 );
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 );
}
* \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;
}
/*!
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();
}
#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>
#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>
#include <gp_Ax1.hxx>
#include <gp_Vec.hxx>
#include <gp_XY.hxx>
-#include <gp_XYZ.hxx>
#include <list>
#include <string>
- 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;
+ }
};
//--------------------------------------------------------------------------------
/*!
Handle(Geom_Surface)& surface,
SMESH_MesherHelper& helper,
const double refSign,
+ bool isCentroidal,
bool set3D);
};
//--------------------------------------------------------------------------------
_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,
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 );
}
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
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
}
addBoundaryElements();
makeGroupOfLE(); // debug
+ debugDump.Finish();
return _error;
}
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++;
+ }
}
}
{
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:
{
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 );
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 );
+ }
}
//================================================================================
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 {
}
while ( moved && step++ < 5 );
//cout << " NB STEPS: " << step << endl;
-
- dumpFunctionEnd();
}
+ dumpFunctionEnd();
}
else
{
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() );
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() );
_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);
// 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;
}
}
}
+ // 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
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 );
shrinked |= lEdges[i]->SetNewLength2d( surface,F,helper );
}
dumpFunctionEnd();
- if ( !shrinked )
- break;
// Move nodes on EDGE's
set< _Shrinker1D* >::iterator shr = eShri1D.begin();
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;
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
// 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
//================================================================================
/*!
- * \brief Perform laplacian smooth on the FACE
+ * \brief Perform smooth on the FACE
* \retval bool - true if the node has been moved
*/
//================================================================================
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() );
return "";
}
+QString StdMeshersGUI_CartesianParamCreator::helpPage() const
+{
+ return "cartesian_algo_page.html#cartesian_hyp_anchor";
+}
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();
</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>
<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'é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'hypothèse</translation>
</message>
+ <message>
+ <source>SMESH_CARTESIAN_PARAMS_TITLE</source>
+ <translation>Construction de l'hypothèse</translation>
+ </message>
<message>
<source>SMESH_MAX_ELEMENT_AREA_HYPOTHESIS</source>
<translation>Aire maximale d'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>
#
include $(top_srcdir)/adm_local/unix/make_common_starter.am
-SUBDIRS = MeshCut
-
-DIST_SUBDIRS = MeshCut
+SUBDIRS = MeshCut padder
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 $@
--- /dev/null
+SUBDIRS = meshjob spadderpy unittests resources doc
+
+EXTRA_DIST = README.txt
--- /dev/null
+
+
+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)
--- /dev/null
+# 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 ;
--- /dev/null
+# 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
--- /dev/null
+/*!
+
+\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
+
+*/
+
--- /dev/null
+SUBDIRS = idl impl
--- /dev/null
+// 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_
--- /dev/null
+# 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)/*
+
--- /dev/null
+// 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_
--- /dev/null
+
+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
+
--- /dev/null
+// 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() ;
+ }
+}
--- /dev/null
+// 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
+
--- /dev/null
+// 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() ;
+ }
+}
--- /dev/null
+// 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
+
--- /dev/null
+#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__
--- /dev/null
+
+SUBDIRS = appligen padderexe
+
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+mysalomeresdir=$(salomeresdir)
+dist_mysalomeres_DATA = SPADDERCatalog.xml
--- /dev/null
+<?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>
--- /dev/null
+<!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>
--- /dev/null
+# 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
--- /dev/null
+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
+
+
--- /dev/null
+<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>
--- /dev/null
+#!/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/.
--- /dev/null
+<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>
--- /dev/null
+#!/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
--- /dev/null
+# 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)
--- /dev/null
+#!/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
--- /dev/null
+#!/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"
--- /dev/null
+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
--- /dev/null
+concrete.med concrete
+nbSteelFiles 2
+ferrtran.med ferrtran
+ferraill.med ferraill
+output.med
--- /dev/null
+concrete.med concrete
+nbSteelbarMesh= 1
+ferraill.med ferraill
+FinalEDMesh.med
--- /dev/null
+#!/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
--- /dev/null
+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
--- /dev/null
+# 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()
--- /dev/null
+# -*- 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()
--- /dev/null
+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)
--- /dev/null
+# 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)
+#
--- /dev/null
+# -*- 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")
--- /dev/null
+# -*- 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()
+
--- /dev/null
+<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>
--- /dev/null
+# -*- 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()
+
+
+
--- /dev/null
+<?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>
--- /dev/null
+# 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
--- /dev/null
+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
+
+
--- /dev/null
+SPADDER_PLUGINS_PATH=@prefix@/plugins
+export SALOME_PLUGINS_PATH=$SALOME_PLUGINS_PATH:$SPADDER_PLUGINS_PATH
+
--- /dev/null
+# -*- 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)
+
--- /dev/null
+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
--- /dev/null
+#!/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
--- /dev/null
+# -*- 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
--- /dev/null
+# -*- 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"