Salome HOME
53539: 0D Element
authoreap <eap@opencascade.com>
Wed, 24 Aug 2016 14:04:22 +0000 (17:04 +0300)
committereap <eap@opencascade.com>
Wed, 24 Aug 2016 14:04:22 +0000 (17:04 +0300)
1) Extract SMESHUtils/SMESH_ControlPnt.* from Hexotic
2) Minor doc changes
3) fix  53539: 0D Element (SMDS_MeshCell.hxx, SMESHGUI_AddMeshElementDlg.cxx)
4) Regressions
- bugs_06/G9 ( SMESH_DumpPython.cxx, SMESH_PythonDump.hxx )
- bugs_13/N8 ( StdMeshers_Regular_1D.cxx )

24 files changed:
doc/salome/examples/modifying_meshes_ex01.py
doc/salome/examples/modifying_meshes_ex02.py
doc/salome/examples/modifying_meshes_ex03.py
doc/salome/examples/modifying_meshes_ex09.py
doc/salome/examples/modifying_meshes_ex10.py
doc/salome/examples/modifying_meshes_ex15.py
doc/salome/gui/SMESH/input/display_mode.doc
doc/salome/gui/SMESH/input/importing_exporting_meshes.doc
doc/salome/gui/SMESH/input/mesh_preferences.doc
doc/salome/gui/SMESH/input/tui_modifying_meshes.doc
doc/salome/gui/SMESH/input/viewing_meshes_overview.doc
src/DriverGMF/DriverGMF_Write.cxx
src/DriverGMF/DriverGMF_Write.hxx
src/SMDS/SMDS_MeshCell.hxx
src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx
src/SMESHUtils/CMakeLists.txt
src/SMESHUtils/SMESH_ControlPnt.cxx [new file with mode: 0644]
src/SMESHUtils/SMESH_ControlPnt.hxx [new file with mode: 0644]
src/SMESH_I/SMESH_DumpPython.cxx
src/SMESH_I/SMESH_PythonDump.hxx
src/SMESH_SWIG/smeshBuilder.py
src/StdMeshers/StdMeshers_MEFISTO_2D.cxx
src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.cxx
src/StdMeshers/StdMeshers_Regular_1D.cxx

index 434cc1a7e85471d358a52af4cf9320826ef01c32..0ef07aa7af0eae18dea177cb23309eeff9bb3345 100644 (file)
@@ -1,16 +1,10 @@
 # Add Node
 
-
 import salome
 salome.salome_init()
-import GEOM
-from salome.geom import geomBuilder
-geompy = geomBuilder.New(salome.myStudy)
 
-import SMESH, SALOMEDS
 from salome.smesh import smeshBuilder
 smesh =  smeshBuilder.New(salome.myStudy)
-import salome_notebook
 
 
 mesh = smesh.Mesh()
index 563295c5450e461562a32196d5815c15ce89f1fe..7948ed3dc1e74dae7bd4048aec0da124e53266bf 100644 (file)
@@ -1,16 +1,10 @@
 # Add 0D Element
 
-
 import salome
 salome.salome_init()
-import GEOM
-from salome.geom import geomBuilder
-geompy = geomBuilder.New(salome.myStudy)
 
-import SMESH, SALOMEDS
 from salome.smesh import smeshBuilder
 smesh =  smeshBuilder.New(salome.myStudy)
-import salome_notebook
 
 
 mesh = smesh.Mesh()
index beefe20ce8dd1984fb789650bbe412a1af43589a..0c6bc61dd1a24aa4381e53cd51cf5d5677c82ed5 100644 (file)
@@ -3,14 +3,13 @@
 
 import salome
 salome.salome_init()
-import GEOM
+
 from salome.geom import geomBuilder
 geompy = geomBuilder.New(salome.myStudy)
 
 import SMESH, SALOMEDS
 from salome.smesh import smeshBuilder
 smesh =  smeshBuilder.New(salome.myStudy)
-import salome_notebook
 
 
 # create a geometry
index 476ebbbdccec2c29493247d94277535eda9ccf1e..cba753e5180ece3f77867687451900c05aecbb5e 100644 (file)
@@ -4,14 +4,10 @@ import math
 
 import salome
 salome.salome_init()
-import GEOM
-from salome.geom import geomBuilder
-geompy = geomBuilder.New(salome.myStudy)
 
 import SMESH, SALOMEDS
 from salome.smesh import smeshBuilder
 smesh =  smeshBuilder.New(salome.myStudy)
-import salome_notebook
 
 
 # create an empty mesh structure
index 894fe9d4cf2b2b99269019e994343f2594077c2c..26607e7402bca28e0ad2fb49f047c9d9a4f75842 100644 (file)
@@ -3,14 +3,9 @@
 
 import salome
 salome.salome_init()
-import GEOM
-from salome.geom import geomBuilder
-geompy = geomBuilder.New(salome.myStudy)
 
-import SMESH, SALOMEDS
 from salome.smesh import smeshBuilder
 smesh =  smeshBuilder.New(salome.myStudy)
-import salome_notebook
 
 import math
 
@@ -50,18 +45,19 @@ for i in range(5):
     pass
 
 # Create a polyhedral volume (12-hedron with pentagonal faces)
-mesh.GetMeshEditor().AddPolyhedralVolume([dd[0], dd[1], dd[2], dd[3], dd[4],  # top
-                                          dd[0], cc[0], bb[1], cc[1], dd[1],  # -
-                                          dd[1], cc[1], bb[2], cc[2], dd[2],  # -
-                                          dd[2], cc[2], bb[3], cc[3], dd[3],  # - below top
-                                          dd[3], cc[3], bb[4], cc[4], dd[4],  # -
-                                          dd[4], cc[4], bb[0], cc[0], dd[0],  # -
-                                          aa[4], bb[4], cc[4], bb[0], aa[0],  # .
-                                          aa[3], bb[3], cc[3], bb[4], aa[4],  # .
-                                          aa[2], bb[2], cc[2], bb[3], aa[3],  # . above bottom
-                                          aa[1], bb[1], cc[1], bb[2], aa[2],  # .
-                                          aa[0], bb[0], cc[0], bb[1], aa[1],  # .
-                                          aa[0], aa[1], aa[2], aa[3], aa[4]], # bottom
-                                         [5,5,5,5,5,5,5,5,5,5,5,5])
-
-salome.sg.updateObjBrowser(1)
+mesh.AddPolyhedralVolume([dd[0], dd[1], dd[2], dd[3], dd[4],  # top
+                          dd[0], cc[0], bb[1], cc[1], dd[1],  # -
+                          dd[1], cc[1], bb[2], cc[2], dd[2],  # -
+                          dd[2], cc[2], bb[3], cc[3], dd[3],  # - below top
+                          dd[3], cc[3], bb[4], cc[4], dd[4],  # -
+                          dd[4], cc[4], bb[0], cc[0], dd[0],  # -
+                          aa[4], bb[4], cc[4], bb[0], aa[0],  # .
+                          aa[3], bb[3], cc[3], bb[4], aa[4],  # .
+                          aa[2], bb[2], cc[2], bb[3], aa[3],  # . above bottom
+                          aa[1], bb[1], cc[1], bb[2], aa[2],  # .
+                          aa[0], bb[0], cc[0], bb[1], aa[1],  # .
+                          aa[0], aa[1], aa[2], aa[3], aa[4]], # bottom
+                         [5,5,5,5,5,5,5,5,5,5,5,5])
+
+if salome.sg.hasDesktop():
+    salome.sg.updateObjBrowser(1)
index ae6d5eae77087c1052a026c7ef894f9730e712c8..5985c0844f45656b2d2b3ccdb465dc8f8b7ad5b0 100644 (file)
@@ -3,14 +3,13 @@
 
 import salome
 salome.salome_init()
-import GEOM
+
 from salome.geom import geomBuilder
 geompy = geomBuilder.New(salome.myStudy)
 
 import SMESH, SALOMEDS
 from salome.smesh import smeshBuilder
 smesh =  smeshBuilder.New(salome.myStudy)
-import salome_notebook
 
 
 box = geompy.MakeBoxDXDYDZ(200, 200, 200)
@@ -20,7 +19,7 @@ mesh.Segment().AutomaticLength(0.1)
 mesh.Quadrangle()
 mesh.Compute()
 
-# find node at (0,0,0)
+# find node at (0,0,0) which is located on a geom vertex
 node000 = None
 for vId in geompy.SubShapeAllIDs( box, geompy.ShapeType["VERTEX"]):
     if node000: break
@@ -36,7 +35,7 @@ for vId in geompy.SubShapeAllIDs( box, geompy.ShapeType["VERTEX"]):
 if not node000:
     raise "node000 not found"
 
-# find node000 using the tested function 
+# find node000 using a dedicated function 
 n = mesh.FindNodeClosestTo( -1,-1,-1 )
 if not n == node000:
     raise "FindNodeClosestTo() returns " + str( n ) + " != " + str( node000 )
index 6817d29f90b182cd654291b038971802974488b6..7e748d6034469f30027157e470e1ce627b118288 100644 (file)
@@ -2,7 +2,8 @@
 
 \page display_mode_page Display Mode
 
-\n By default your objects are represented as set in \b Preferences.
+\n By default your objects are represented as set in
+\ref mesh_preferences_page "Preferences".
 \n However, right-clicking on the mesh in the <b>Object Browser</b>,
 and selecting <b>Display Mode</b>, you can display your mesh as:
 
@@ -19,4 +20,4 @@ and selecting <b>Display Mode</b>, you can display your mesh as:
 
 \image html image55.gif Shrink
 
-*/
\ No newline at end of file
+*/
index 0cfb6d058942afc6634cb4f83e8b50a53e9d2697..a4a8d3ca2f1891aea8a9047c63465feed5221a38 100644 (file)
@@ -41,17 +41,20 @@ group as a whole mesh.
  If you try to export a group, the warning will be shown:
 \image html meshexportgroupwarning.png
 <ul>
-  <li><b>Don't show this warning anymore</b> check-box specifies show or
-  not the warning. If checked, the warning will not be shown anymore in 
-  the similar situation  </li>
+  <li><b>Don't show this warning anymore</b> check-box allows to
+    switch off the warning. You can re-activate the warning in 
+    \ref group_export_warning_pref "Preferences".</li>
 </ul>
 
  There are additional parameters available at export to MED and SAUV format files.
 <ul>
-  <li><b>Automatically create groups</b> check-box specifies whether to
+  <li>
+\anchor export_auto_groups
+  <b>Automatically create groups</b> check-box specifies whether to
   create groups of all mesh entities of available dimensions or
-  not. If checked, the created groups have names like "Group_On_All_Nodes",
-  "Group_On_All_Faces", etc.</li>
+  not. The created groups have names like "Group_On_All_Nodes",
+  "Group_On_All_Faces", etc. A default state of this check-box can be
+  set in \ref export_auto_groups_pref "Preferences". </li>
   <li><b>Automatically define space dimension</b> check-box specifies
   whether to define space dimension for export by mesh configuration
   or not. Usually the mesh is exported as a mesh in 3D space, just as
index 9a0d7994f114a2ed6dc0334a0fdc7ec14dd5fdda..79a268d0a0a00952b76dc38ed8e6f9adf1a27d90 100644 (file)
@@ -10,15 +10,15 @@ or in later sessions with this module according to the preferences.
 \image html pref21.png
 
 - <b>Automatic Update</b>
-  - If you toggle <b>Automatic Update</b> checkbox, the model in your
-    viewer will be automatically updated when you make changes in it, depending on
+  - <b>Automatic Update</b> - if activated, the mesh in your
+    viewer will be automatically updated after it's computation, depending on
     values of additional preferences specified below.
   - <b>Size limit (elements)</b> - allows specifying the maximum
     number of elements in the resulting mesh for which the automatic updating
     of the presentation is performed. This option affects only
-    <b>Compute</b> operation. Zero value means "no limit". Default value
-    is 500 000 mesh elements.
-  - <b>Incremental limit check</b> - when this control is switched on,
+    \ref compute_anchor "Compute" operation. Zero value means "no
+    limit". Default value is 500 000 mesh elements. 
+  - <b>Incremental limit check</b> - if activated,
     the mesh size limit check is not applied to the total number of
     elements in the resulting mesh, it is applied iteratively to each entity type
     in the following order: 0D elements, edges, faces, volumes, balls.
@@ -28,32 +28,40 @@ or in later sessions with this module according to the preferences.
     this type are shown, otherwise the user is warned that some entities are not shown.
 
 - <b>Quality Controls</b>
-  - If you toggle <b>Display entity</b>, both faces and edges of an
-    object will be displayed in the viewer by default.
-  - If you toggle <b>Use precision</b> checkbox, you can display numbers in
-    <b>Quality Control</b> diagrams at the necessary level of precision.
-  - <b>Number of digits after point</b> - defines precision for
-    <b>Quality Controls</b>. By default, numbers in <b>Quality Control</b>
-    diagrams are presented as integers.
-  - <b>Double nodes tolerance</b> defines the maximal distance between two
-    mesh nodes, at which they are considered coincident by <b>Double nodes</b>
-    quality control.
+  - <b>Display entity</b> - if activated, only currently
+    \ref quality_page "controlled" entities are displayed in the
+    viewer and other entities are temporarily hidden. For example if you
+    activate \ref length_page "Length" quality control, which controls
+    the length of mesh segments, then only mesh segments are
+    displayed and faces and volumes are hidden. 
+  - <b>Use precision</b> - if activated, all quality controls
+    will be computed at precision defined by <b>Number of digits after
+    point</b> - as integers by default.
+  - <b>Double nodes tolerance</b> - defines the maximal distance between two
+    mesh nodes, at which they are considered coincident by
+    \ref double_nodes_control_page "Double nodes" quality control.
 
 - <b>Display mode</b>
   - <b>Default display mode</b> - allows to set Wireframe, Shading, Nodes or Shrink
-  presentation mode as default.
+    \ref display_mode_page "presentation mode" as default.
 
+\anchor quadratic_2d_mode_pref
 - <b>Representation of the 2D quadratic elements</b>
-  - <b>Default mode of the 2D quadratic elements</b> combo-box - allows
-    to select lines or arcs for representation of quadratic elements as default.
+  - <b>Default mode of the 2D quadratic elements</b> - allows to
+    select either \a Lines or \a Arcs as a default
+    \ref quadratic_2d_mode "representation" of 1D and 2D
+    \ref adding_quadratic_elements_page "quadratic elements".
   - <b>Maximum Angle</b> - maximum deviation angle used by the
     application to build arcs.
 
 - <b>Mesh export</b>
-  - If you toggle <b>Automatically create groups for MED export</b> check-box,
-    this operation will be carried out automatically.
-  - <b>Show warning when exporting group</b> check-box - allows defining the 
-    behavior of the warning when exporting a group.
+\anchor export_auto_groups_pref
+  - <b>Automatically create groups for MED export</b> - defines a
+    default state of a corresponding check-box in \ref export_auto_groups
+    "MED Export" dialog.
+\anchor group_export_warning_pref
+  - <b>Show warning when exporting group</b> - if activated, a warning is
+    displayed when exporting a group.
 
 - <b>Mesh computation</b>
   - <b>Show a computation result notification</b> combo-box allows to
index 7d03522865467cf73c30e3e1178fa40acd9df22c..a8ca5c94161b5683197ea98080b5cb73ceb5a400 100644 (file)
 <h3>Removing Orphan Nodes</h3>
 \tui_script{modifying_meshes_ex13.py}
 
-<br>
-\section tui_renumbering_nodes_and_elements Renumbering Nodes and Elements
-\tui_script{modifying_meshes_ex14.py}
-
 <br>
 \section tui_moving_nodes Moving Nodes
 \tui_script{modifying_meshes_ex15.py}
index 2472c24fa5f02da5f6cee7a15102c728aaf548fc..5fbbadb8903b7fad008584c147a71a481aad3654 100644 (file)
@@ -36,9 +36,13 @@ viewer.</li>
 <li>\subpage display_mode_page "Display Mode" - allows to select between
 Wireframe, Shading and Nodes presentation.</li>
 <li>\subpage display_entity_page "Display Entity" - allows to display
-entities by types (Faces, Edges, Volumes etc.).</li>
+  entities by types (Faces, Edges, Volumes etc.).</li>
+\anchor quadratic_2d_mode
 <li><b>2D Quadratic</b> - allows to select between the representation
-of quadratic edges as broken <b>lines</b> or as <b>arcs</b></li>
+  of quadratic edges as broken \b lines or as \b arcs. A default
+  representation can be set in \ref quadratic_2d_mode_pref "Preferences".
+  Arc representation applies to 1D and 2D elements only.
+</li>
 <li><b>Orientation of faces</b> - shows vectors of orientation of
 faces of the selected mesh. The orientation vector is shown for each 2D mesh element 
 and for each free face of a 3D mesh element. the vector direction is calculated by 
index 7dc2a1fb9812adf36e4e944ceb9d30f8b7177b2c..27f1ce065ed78601161ebf50301f8e0c9feb8dc1 100644 (file)
@@ -34,6 +34,8 @@
 
 #include "utilities.h"
 
+using SMESHUtils::ControlPnt;
+
 extern "C"
 {
 #include "libmesh5.h"
@@ -80,29 +82,6 @@ extern "C"
   }}}}
   
 
-Control_Pnt::Control_Pnt(): gp_Pnt()
-{
-  size=0;
-}
-Control_Pnt::Control_Pnt( const gp_Pnt& aPnt, 
-                          double theSize): gp_Pnt( aPnt )
-{
-  size=theSize;
-}
-Control_Pnt::Control_Pnt(double theX, 
-                         double theY, 
-                         double theZ): gp_Pnt(theX, theY, theZ)
-{
-  size=0;
-}
-Control_Pnt::Control_Pnt(double theX, 
-                         double theY, 
-                         double theZ, 
-                         double theSize): gp_Pnt(theX, theY, theZ)
-{
-  size=theSize;
-}
-
 DriverGMF_Write::DriverGMF_Write():
   Driver_SMESHDS_Mesh(), _exportRequiredGroups( true )
 {
@@ -365,7 +344,7 @@ Driver_Mesh::Status DriverGMF_Write::Perform()
   return DRS_OK;
 }
 
-Driver_Mesh::Status DriverGMF_Write::PerformSizeMap( const std::vector<Control_Pnt>& points )
+Driver_Mesh::Status DriverGMF_Write::PerformSizeMap( const std::vector<ControlPnt>& points )
 {
 //   const int dim = 3, version = sizeof(long) == 4 ? 2 : 3;
   const int dim = 3, version = 2; // Version 3 not supported by mg-hexa
@@ -383,7 +362,7 @@ Driver_Mesh::Status DriverGMF_Write::PerformSizeMap( const std::vector<Control_P
   GmfSetKwd(solFileID, GmfSolAtVertices, pointsNumber, 1, TypTab);
   
   // Read the control points information from the vector and write it into the files
-  std::vector<Control_Pnt>::const_iterator points_it;
+  std::vector<ControlPnt>::const_iterator points_it;
   for (points_it = points.begin(); points_it != points.end(); points_it++ )
   {
     GmfSetLin( verticesFileID, GmfVertices, points_it->X(), points_it->Y(), points_it->Z(), 0 );
index cb2e6f12adc1894f9886da6a77a7171ff04b4bbb..74331512c400e53807146277a8c16171a97c7572 100644 (file)
 #include "Driver_SMESHDS_Mesh.h"
 #include "SMDSAbs_ElementType.hxx"
 #include "SMDS_ElemIterator.hxx"
-
-#include <gp_Pnt.hxx>
-
-/*!
- * \brief Class for storing control points for writing GMF size maps
- */
-class MESHDriverGMF_EXPORT Control_Pnt : public gp_Pnt
-{
-public:
-  Control_Pnt();
-  Control_Pnt(const gp_Pnt& aPnt, double theSize);
-  Control_Pnt(double x, double y, double z);
-  Control_Pnt(double x, double y, double z, double size);
-
-  double Size() const { return size; };
-  void SetSize( double theSize ) { size = theSize; };
-  
-private:
-  double size;
-};
+#include "SMESH_ControlPnt.hxx"
 
 /*!
  * \brief Driver Writing a mesh into a GMF file.
@@ -71,7 +52,7 @@ public:
   virtual Status Perform();
   
   // Size Maps
-  Status PerformSizeMap( const std::vector<Control_Pnt>& points );
+  Status PerformSizeMap( const std::vector<SMESHUtils::ControlPnt>& points );
   void SetSizeMapPrefix( std::string prefix )
   {
     myVerticesFile = prefix + ".mesh";
index 562de10a82bc29216812813d3fc35e0da3e6eb74..803f4862253f625ef4ce9d1efbda8e4df60fed9d 100644 (file)
@@ -53,7 +53,7 @@ public:
   template< class VECT > // interlacedIDs[i] = smdsIDs[ indices[ i ]]
     static void applyInterlace( const std::vector<int>& interlace, VECT & data)
   {
-    if ( interlace.empty() ) return;
+    if ( interlace.size() < data.size() ) return;
     VECT tmpData( data.size() );
     for ( size_t i = 0; i < data.size(); ++i )
       tmpData[i] = data[ interlace[i] ];
@@ -62,7 +62,7 @@ public:
   template< class VECT > // interlacedIDs[ indices[ i ]] = smdsIDs[i]
     static void applyInterlaceRev( const std::vector<int>& interlace, VECT & data)
   {
-    if ( interlace.empty() ) return;
+    if ( interlace.size() < data.size() ) return;
     VECT tmpData( data.size() );
     for ( size_t i = 0; i < data.size(); ++i )
       tmpData[ interlace[i] ] = data[i];
index 3994a40b06bb2ef31545089428711f4e5c7075c2..25bbd46e7c12d24af2e0db2541e6bb6c3d72ffe7 100644 (file)
@@ -919,7 +919,7 @@ void SMESHGUI_AddMeshElementDlg::displaySimulation()
     if (ReverseOrDulicate && ReverseOrDulicate->isChecked())
     {
       const std::vector<int>& i = SMDS_MeshCell::reverseSmdsOrder( myGeomType );
-      if ( i.empty() ) // polygon
+      if ( i.size() != anIds.size() ) // polygon
         std::reverse( anIds.begin(), anIds.end() );
       else
         SMDS_MeshCell::applyInterlace( i, anIds );
index eb68432294e94546fd6cc6d8ee34c7a45496752c..c1322fb3a0183d082391e33ff1dec100a01530a2 100644 (file)
@@ -65,6 +65,7 @@ SET(SMESHUtils_HEADERS
   SMESH_TryCatch.hxx
   SMESH_MeshAlgos.hxx
   SMESH_MAT2d.hxx
+  SMESH_ControlPnt.hxx
 )
 
 # --- sources ---
@@ -80,6 +81,7 @@ SET(SMESHUtils_SOURCES
   SMESH_MeshAlgos.cxx
   SMESH_MAT2d.cxx
   SMESH_FreeBorders.cxx
+  SMESH_ControlPnt.cxx
 )
 
 # --- rules ---
diff --git a/src/SMESHUtils/SMESH_ControlPnt.cxx b/src/SMESHUtils/SMESH_ControlPnt.cxx
new file mode 100644 (file)
index 0000000..906a7b5
--- /dev/null
@@ -0,0 +1,414 @@
+// Copyright (C) 2007-2016  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, or (at your option) any later version.
+//
+// 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 : Lioka RAZAFINDRAZAKA (CEA)
+
+#include "SMESH_ControlPnt.hxx"
+
+#include <BRepBndLib.hxx>
+#include <BRepMesh_IncrementalMesh.hxx>
+#include <BRep_Tool.hxx>
+#include <Bnd_Box.hxx>
+#include <GCPnts_UniformAbscissa.hxx>
+#include <GeomAdaptor_Curve.hxx>
+#include <Geom_Curve.hxx>
+#include <IntCurvesFace_Intersector.hxx>
+#include <Poly_Array1OfTriangle.hxx>
+#include <Poly_Triangle.hxx>
+#include <Poly_Triangulation.hxx>
+#include <Precision.hxx>
+#include <TColgp_Array1OfPnt.hxx>
+#include <TopExp_Explorer.hxx>
+#include <TopLoc_Location.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Edge.hxx>
+#include <TopoDS_Face.hxx>
+#include <TopoDS_Iterator.hxx>
+#include <TopoDS_Solid.hxx>
+#include <gp_Ax3.hxx>
+#include <gp_Dir.hxx>
+#include <gp_Lin.hxx>
+#include <gp_Trsf.hxx>
+#include <gp_Vec.hxx>
+
+#include <set>
+
+namespace SMESHUtils
+{
+  // Some functions for surface sampling
+  void subdivideTriangle( const gp_Pnt& p1,
+                          const gp_Pnt& p2,
+                          const gp_Pnt& p3,
+                          const double& theSize,
+                          std::vector<ControlPnt>& thePoints );
+
+  std::vector<gp_Pnt> computePointsForSplitting( const gp_Pnt& p1,
+                                                 const gp_Pnt& p2,
+                                                 const gp_Pnt& p3 );
+  gp_Pnt tangencyPoint(const gp_Pnt& p1,
+                       const gp_Pnt& p2,
+                       const gp_Pnt& Center);
+
+}
+
+//================================================================================
+/*!
+ * \brief Fills a vector of points from which a size map input file can be written
+ */
+//================================================================================
+
+void SMESHUtils::createControlPoints( const TopoDS_Shape&      theShape,
+                                      const double&            theSize,
+                                      std::vector<ControlPnt>& thePoints )
+{
+  if ( theShape.ShapeType() == TopAbs_VERTEX )
+  {
+    gp_Pnt aPnt = BRep_Tool::Pnt( TopoDS::Vertex(theShape) );
+    ControlPnt aControlPnt( aPnt, theSize );
+    thePoints.push_back( aControlPnt );
+  }
+  if ( theShape.ShapeType() == TopAbs_EDGE )
+  {
+    createPointsSampleFromEdge( TopoDS::Edge( theShape ), theSize, thePoints );
+  }
+  else if ( theShape.ShapeType() == TopAbs_WIRE )
+  {
+    TopExp_Explorer Ex;
+    for (Ex.Init(theShape,TopAbs_EDGE); Ex.More(); Ex.Next())
+    {
+      createPointsSampleFromEdge( TopoDS::Edge( Ex.Current() ), theSize, thePoints );
+    }
+  }
+  else if ( theShape.ShapeType() ==  TopAbs_FACE )
+  {
+    createPointsSampleFromFace( TopoDS::Face( theShape ), theSize, thePoints );
+  }
+  else if ( theShape.ShapeType() ==  TopAbs_SOLID )
+  {
+    createPointsSampleFromSolid( TopoDS::Solid( theShape ), theSize, thePoints );
+  }
+  else if ( theShape.ShapeType() == TopAbs_COMPOUND )
+  {
+    TopoDS_Iterator it( theShape );
+    for(; it.More(); it.Next())
+    {
+      createControlPoints( it.Value(), theSize, thePoints );
+    }
+  }
+}
+
+//================================================================================
+/*!
+ * \brief Fills a vector of points with point samples approximately
+ * \brief spaced with a given size
+ */
+//================================================================================
+
+void SMESHUtils::createPointsSampleFromEdge( const TopoDS_Edge&       theEdge,
+                                             const double&            theSize,
+                                             std::vector<ControlPnt>& thePoints )
+{
+  double step = theSize;
+  double first, last;
+  Handle( Geom_Curve ) aCurve = BRep_Tool::Curve( theEdge, first, last );
+  GeomAdaptor_Curve C ( aCurve );
+  GCPnts_UniformAbscissa DiscretisationAlgo(C, step , first, last, Precision::Confusion());
+  int nbPoints = DiscretisationAlgo.NbPoints();
+
+  ControlPnt aPnt;
+  aPnt.SetSize(theSize);
+
+  for ( int i = 1; i <= nbPoints; i++ )
+  {
+    double param = DiscretisationAlgo.Parameter( i );
+    aCurve->D0( param, aPnt );
+    thePoints.push_back( aPnt );
+  }
+}
+
+//================================================================================
+/*!
+ * \brief Fills a vector of points with point samples approximately
+ * \brief spaced with a given size
+ */
+//================================================================================
+
+void SMESHUtils::createPointsSampleFromFace( const TopoDS_Face&       theFace,
+                                             const double&            theSize,
+                                             std::vector<ControlPnt>& thePoints )
+{
+  BRepMesh_IncrementalMesh M(theFace, 0.01, Standard_True);
+  TopLoc_Location aLocation;
+
+  // Triangulate the face
+  Handle(Poly_Triangulation) aTri = BRep_Tool::Triangulation (theFace, aLocation);
+
+  // Get the transformation associated to the face location
+  gp_Trsf aTrsf = aLocation.Transformation();
+
+  // Get triangles
+  int nbTriangles = aTri->NbTriangles();
+  Poly_Array1OfTriangle triangles(1,nbTriangles);
+  triangles=aTri->Triangles();
+
+  // GetNodes
+  int nbNodes = aTri->NbNodes();
+  TColgp_Array1OfPnt nodes(1,nbNodes);
+  nodes = aTri->Nodes();
+
+  // Iterate on triangles and subdivide them
+  for(int i=1; i<=nbTriangles; i++)
+  {
+    Poly_Triangle aTriangle = triangles.Value(i);
+    gp_Pnt p1 = nodes.Value(aTriangle.Value(1));
+    gp_Pnt p2 = nodes.Value(aTriangle.Value(2));
+    gp_Pnt p3 = nodes.Value(aTriangle.Value(3));
+
+    p1.Transform(aTrsf);
+    p2.Transform(aTrsf);
+    p3.Transform(aTrsf);
+
+    subdivideTriangle(p1, p2, p3, theSize, thePoints);
+  }
+}
+
+//================================================================================
+/*!
+ * \brief Fills a vector of points with point samples approximately
+ * \brief spaced with a given size
+ */
+//================================================================================
+
+void SMESHUtils::createPointsSampleFromSolid( const TopoDS_Solid&      theSolid,
+                                              const double&            theSize,
+                                              std::vector<ControlPnt>& thePoints )
+{
+  // Compute the bounding box
+  double Xmin, Ymin, Zmin, Xmax, Ymax, Zmax;
+  Bnd_Box B;
+  BRepBndLib::Add(theSolid, B);
+  B.Get(Xmin, Ymin, Zmin, Xmax, Ymax, Zmax);
+
+  // Create the points
+  double step = theSize;
+
+  for ( double x=Xmin; x-Xmax<Precision::Confusion(); x=x+step )
+  {
+    for ( double y=Ymin; y-Ymax<Precision::Confusion(); y=y+step )
+    {
+      // Step1 : generate the Zmin -> Zmax line
+      gp_Pnt startPnt(x, y, Zmin);
+      gp_Pnt endPnt(x, y, Zmax);
+      gp_Vec aVec(startPnt, endPnt);
+      gp_Lin aLine(startPnt, aVec);
+      double endParam = Zmax - Zmin;
+
+      // Step2 : for each face of theSolid:
+      std::set<double> intersections;
+      std::set<double>::iterator it = intersections.begin();
+
+      TopExp_Explorer Ex;
+      for (Ex.Init(theSolid,TopAbs_FACE); Ex.More(); Ex.Next())
+      {
+        // check if there is an intersection
+        IntCurvesFace_Intersector anIntersector(TopoDS::Face(Ex.Current()), Precision::Confusion());
+        anIntersector.Perform(aLine, 0, endParam);
+
+        // get the intersection's parameter and store it
+        int nbPoints = anIntersector.NbPnt();
+        for(int i = 0 ; i < nbPoints ; i++ )
+        {
+          it = intersections.insert( it, anIntersector.WParameter(i+1) );
+        }
+      }
+      // Step3 : go through the line chunk by chunk
+      if ( intersections.begin() != intersections.end() )
+      {
+        std::set<double>::iterator intersectionsIterator=intersections.begin();
+        double first = *intersectionsIterator;
+        intersectionsIterator++;
+        bool innerPoints = true;
+        for ( ; intersectionsIterator!=intersections.end() ; intersectionsIterator++ )
+        {
+          double second = *intersectionsIterator;
+          if ( innerPoints )
+          {
+            // If the last chunk was outside of the shape or this is the first chunk
+            // add the points in the range [first, second] to the points vector
+            double localStep = (second -first) / ceil( (second - first) / step );
+            for ( double z = Zmin + first; z < Zmin + second; z = z + localStep )
+            {
+              thePoints.push_back(ControlPnt( x, y, z, theSize ));
+            }
+            thePoints.push_back(ControlPnt( x, y, Zmin + second, theSize ));
+          }
+          first = second;
+          innerPoints = !innerPoints;
+        }
+      }
+    }
+  }
+}
+
+//================================================================================
+/*!
+ * \brief Subdivides a triangle until it reaches a certain size (recursive function)
+ */
+//================================================================================
+
+void SMESHUtils::subdivideTriangle( const gp_Pnt& p1,
+                                    const gp_Pnt& p2,
+                                    const gp_Pnt& p3,
+                                    const double& theSize,
+                                    std::vector<ControlPnt>& thePoints)
+{
+  // Size threshold to stop subdividing
+  // This value ensures that two control points are distant no more than 2*theSize
+  // as shown below
+  //
+  // The greater distance D of the mass center M to each Edge is 1/3 * Median
+  // and Median < sqrt(3/4) * a  where a is the greater side (by using Apollonius' thorem).
+  // So D < 1/3 * sqrt(3/4) * a and if a < sqrt(3) * S then D < S/2
+  // and the distance between two mass centers of two neighbouring triangles
+  // sharing an edge is < 2 * 1/2 * S = S
+  // If the traingles share a Vertex and no Edge the distance of the mass centers
+  // to the Vertices is 2*D < S so the mass centers are distant of less than 2*S 
+
+  double threshold = sqrt( 3. ) * theSize;
+
+  if ( (p1.Distance(p2) > threshold ||
+        p2.Distance(p3) > threshold ||
+        p3.Distance(p1) > threshold))
+  {
+    std::vector<gp_Pnt> midPoints = computePointsForSplitting(p1, p2, p3);
+
+    subdivideTriangle( midPoints[0], midPoints[1], midPoints[2], theSize, thePoints );
+    subdivideTriangle( midPoints[0], p2, midPoints[1], theSize, thePoints );
+    subdivideTriangle( midPoints[2], midPoints[1], p3, theSize, thePoints );
+    subdivideTriangle( p1, midPoints[0], midPoints[2], theSize, thePoints );
+  }
+  else
+  {
+    double x = (p1.X() + p2.X() + p3.X()) / 3 ;
+    double y = (p1.Y() + p2.Y() + p3.Y()) / 3 ;
+    double z = (p1.Z() + p2.Z() + p3.Z()) / 3 ;
+
+    ControlPnt massCenter( x ,y ,z, theSize );
+    thePoints.push_back( massCenter );
+  }
+}
+
+//================================================================================
+/*!
+ * \brief Returns the appropriate points for splitting a triangle
+ * \brief the tangency points of the incircle are used in order to have mostly
+ * \brief well-shaped sub-triangles
+ */
+//================================================================================
+
+std::vector<gp_Pnt> SMESHUtils::computePointsForSplitting( const gp_Pnt& p1,
+                                                           const gp_Pnt& p2,
+                                                           const gp_Pnt& p3 )
+{
+  std::vector<gp_Pnt> midPoints;
+  //Change coordinates
+  gp_Trsf Trsf_1;            // Identity transformation
+  gp_Ax3 reference_system(gp::Origin(), gp::DZ(), gp::DX());   // OXY
+
+  gp_Vec Vx(p1, p3);
+  gp_Vec Vaux(p1, p2);
+  gp_Dir Dx(Vx);
+  gp_Dir Daux(Vaux);
+  gp_Dir Dz = Dx.Crossed(Daux);
+  gp_Ax3 current_system(p1, Dz, Dx);
+
+  Trsf_1.SetTransformation( reference_system, current_system );
+
+  gp_Pnt A = p1.Transformed(Trsf_1);
+  gp_Pnt B = p2.Transformed(Trsf_1);
+  gp_Pnt C = p3.Transformed(Trsf_1);
+
+  double a =  B.Distance(C) ;
+  double b =  A.Distance(C) ;
+  double c =  B.Distance(A) ;
+
+  // Incenter coordinates
+  // see http://mathworld.wolfram.com/Incenter.html
+  double Xi = ( b*B.X() + c*C.X() ) / ( a + b + c );
+  double Yi = ( b*B.Y() ) / ( a + b + c );
+  gp_Pnt Center(Xi, Yi, 0);
+
+  // Calculate the tangency points of the incircle
+  gp_Pnt T1 = tangencyPoint( A, B, Center);
+  gp_Pnt T2 = tangencyPoint( B, C, Center);
+  gp_Pnt T3 = tangencyPoint( C, A, Center);
+
+  gp_Pnt p1_2 = T1.Transformed(Trsf_1.Inverted());
+  gp_Pnt p2_3 = T2.Transformed(Trsf_1.Inverted());
+  gp_Pnt p3_1 = T3.Transformed(Trsf_1.Inverted());
+
+  midPoints.push_back(p1_2);
+  midPoints.push_back(p2_3);
+  midPoints.push_back(p3_1);
+
+  return midPoints;
+}
+
+//================================================================================
+/*!
+ * \brief Computes the tangency points of the circle of center Center with
+ * \brief the straight line (p1 p2)
+ */
+//================================================================================
+
+gp_Pnt SMESHUtils::tangencyPoint(const gp_Pnt& p1,
+                                 const gp_Pnt& p2,
+                                 const gp_Pnt& Center)
+{
+  double Xt = 0;
+  double Yt = 0;
+
+  // The tangency point is the intersection of the straight line (p1 p2)
+  // and the straight line (Center T) which is orthogonal to (p1 p2)
+  if ( fabs(p1.X() - p2.X()) <= Precision::Confusion() )
+  {
+    Xt=p1.X();     // T is on (p1 p2)
+    Yt=Center.Y(); // (Center T) is orthogonal to (p1 p2)
+  }
+  else if ( fabs(p1.Y() - p2.Y()) <= Precision::Confusion() )
+  {
+    Yt=p1.Y();     // T is on (p1 p2)
+    Xt=Center.X(); // (Center T) is orthogonal to (p1 p2)
+  }
+  else
+  {
+    // First straight line coefficients (equation y=a*x+b)
+    double a = (p2.Y() - p1.Y()) / (p2.X() - p1.X())  ;
+    double b = p1.Y() - a*p1.X();         // p1 is on this straight line
+
+    // Second straight line coefficients (equation y=c*x+d)
+    double c = -1 / a;                    // The 2 lines are orthogonal
+    double d = Center.Y() - c*Center.X(); // Center is on this straight line
+
+    Xt = (d - b) / (a - c);
+    Yt = a*Xt + b;
+  }
+
+  return gp_Pnt( Xt, Yt, 0 );
+}
diff --git a/src/SMESHUtils/SMESH_ControlPnt.hxx b/src/SMESHUtils/SMESH_ControlPnt.hxx
new file mode 100644 (file)
index 0000000..145baae
--- /dev/null
@@ -0,0 +1,76 @@
+// Copyright (C) 2007-2016  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, or (at your option) any later version.
+//
+// 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 : Lioka RAZAFINDRAZAKA (CEA)
+
+#ifndef SMESH_CONTROLPNT_H
+#define SMESH_CONTROLPNT_H
+
+#include "SMESH_Utils.hxx"
+
+#include <gp_Pnt.hxx>
+
+class TopoDS_Shape;
+class TopoDS_Edge ;
+class TopoDS_Face ;
+class TopoDS_Solid;
+
+#include <vector>
+
+namespace SMESHUtils
+{
+  /*!
+   * \brief Control point: coordinates and element size at these coordinates
+   */
+  struct SMESHUtils_EXPORT ControlPnt : public gp_Pnt
+  {
+    ControlPnt()
+      : gp_Pnt(), size(0) {}
+    ControlPnt( const gp_Pnt& aPnt, double theSize)
+      : gp_Pnt( aPnt ), size( theSize ) {}
+    ControlPnt(double theX,double theY,double theZ)
+      : gp_Pnt(theX, theY, theZ), size(0) {}
+    ControlPnt(double theX,double theY,double theZ, double theSize)
+      : gp_Pnt(theX, theY, theZ), size( theSize ) {}
+
+    double Size() const { return size; };
+    void SetSize( double theSize ) { size = theSize; };
+
+    double size;
+  };
+
+  // Functions to get sample point from shapes
+  void createControlPoints( const TopoDS_Shape&        theShape, 
+                            const double&              theSize, 
+                            std::vector< ControlPnt >& thePoints );
+
+  void createPointsSampleFromEdge( const TopoDS_Edge&       theEdge, 
+                                   const double&            theSize, 
+                                   std::vector<ControlPnt>& thePoints );
+
+  void createPointsSampleFromFace( const TopoDS_Face&       theFace, 
+                                   const double&            theSize, 
+                                   std::vector<ControlPnt>& thePoints );
+
+  void createPointsSampleFromSolid( const TopoDS_Solid&      theSolid, 
+                                    const double&            theSize, 
+                                    std::vector<ControlPnt>& thePoints );
+
+}
+#endif
index 540144b665031758707107dc0fbde57aa708f044..1beee9b4832cdd815eda785d02e1c004a73fda52 100644 (file)
@@ -53,10 +53,10 @@ namespace SMESH
   size_t TPythonDump::myCounter = 0;
   const char theNotPublishedObjectName[] = "__NOT__Published__Object__";
 
-  TVar::TVar(CORBA::Double value):myVals(1) { myVals[0] = SMESH_Comment(value); }
-  TVar::TVar(CORBA::Long   value):myVals(1) { myVals[0] = SMESH_Comment(value); }
-  TVar::TVar(CORBA::Short  value):myVals(1) { myVals[0] = SMESH_Comment(value); }
-  TVar::TVar(const SMESH::double_array& value):myVals(value.length())
+  TVar::TVar(CORBA::Double value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); }
+  TVar::TVar(CORBA::Long   value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); }
+  TVar::TVar(CORBA::Short  value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); }
+  TVar::TVar(const SMESH::double_array& value):myVals(value.length()), myIsList(true)
   {
     for ( size_t i = 0; i < value.length(); i++)
       myVals[i] = SMESH_Comment(value[i]);
@@ -93,7 +93,7 @@ namespace SMESH
   operator<<(const TVar& theVarValue)
   {
     const std::vector< int >& varIDs = SMESH_Gen_i::GetSMESHGen()->GetLastParamIndices();
-    if ( theVarValue.myVals.size() != 1 )
+    if ( theVarValue.myIsList )
     {
       myStream << "[ ";
       for ( size_t i = 1; i <= theVarValue.myVals.size(); ++i )
index 725ea1c49493ba4c45651064841ffa8aa626a681..8f1a7971512e0db8ee75d2663ea374f3bc932c22 100644 (file)
@@ -99,6 +99,7 @@ namespace SMESH
   struct SMESH_I_EXPORT TVar
   {
     std::vector< std::string > myVals;
+    bool                       myIsList;
     TVar(CORBA::Double value);
     TVar(CORBA::Long   value);
     TVar(CORBA::Short  value);
index b82bbf55d1b3ecebe185f6e62d58e8c3cc9dcd84..b24167ed2de44252d8d11f10e2e0ed42dac88db4 100644 (file)
@@ -4505,7 +4505,7 @@ class Mesh:
 
     ## Finds groups of ajacent nodes within Tolerance.
     #  @param Tolerance the value of tolerance
-    #  @param SubMeshOrGroup SubMesh or Group
+    #  @param SubMeshOrGroup SubMesh, Group or Filter
     #  @param exceptNodes list of either SubMeshes, Groups or node IDs to exclude from search
     #  @param SeparateCornerAndMediumNodes if @c True, in quadratic mesh puts
     #         corner and medium nodes in separate groups thus preventing
index 7ae149535504400bdcbb0ee387bddb4d9037dcab..4eb038550a5a77e4c06c6c29ea01a305bd662194 100644 (file)
@@ -82,7 +82,6 @@ using namespace std;
 StdMeshers_MEFISTO_2D::StdMeshers_MEFISTO_2D(int hypId, int studyId, SMESH_Gen * gen):
   SMESH_2D_Algo(hypId, studyId, gen)
 {
-  MESSAGE("StdMeshers_MEFISTO_2D::StdMeshers_MEFISTO_2D");
   _name = "MEFISTO_2D";
   _shapeType = (1 << TopAbs_FACE);
   _compatibleHypothesis.push_back("MaxElementArea");
@@ -104,7 +103,6 @@ StdMeshers_MEFISTO_2D::StdMeshers_MEFISTO_2D(int hypId, int studyId, SMESH_Gen *
 
 StdMeshers_MEFISTO_2D::~StdMeshers_MEFISTO_2D()
 {
-  MESSAGE("StdMeshers_MEFISTO_2D::~StdMeshers_MEFISTO_2D");
 }
 
 //=============================================================================
@@ -189,8 +187,6 @@ bool StdMeshers_MEFISTO_2D::CheckHypothesis
 
 bool StdMeshers_MEFISTO_2D::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape)
 {
-  MESSAGE("StdMeshers_MEFISTO_2D::Compute");
-
   TopoDS_Face F = TopoDS::Face(aShape.Oriented(TopAbs_FORWARD));
 
   // helper builds quadratic mesh if necessary
@@ -284,8 +280,6 @@ bool StdMeshers_MEFISTO_2D::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aSh
 
     if (ierr == 0)
     {
-      MESSAGE("... End Triangulation Generated Triangle Number " << nbt);
-      MESSAGE("                                    Node Number " << nbst);
       StoreResult(nbst, uvst, nbt, nust, mefistoToDS, scalex, scaley);
       isOk = true;
     }
@@ -313,8 +307,6 @@ bool StdMeshers_MEFISTO_2D::Evaluate(SMESH_Mesh & aMesh,
                                      const TopoDS_Shape & aShape,
                                      MapShapeNbElems& aResMap)
 {
-  MESSAGE("StdMeshers_MEFISTO_2D::Evaluate");
-
   TopoDS_Face F = TopoDS::Face(aShape.Oriented(TopAbs_FORWARD));
 
   double aLen = 0.0;
index ff3b4c871b94ac4c030cabd2ecc542c19af12b3f..ec3c297fcf8fe37280da30f10d2dc3f877e9592a 100644 (file)
@@ -306,6 +306,24 @@ namespace
       }
       deviation2sideInd.insert( make_pair( devia, iS ));
     }
+    double maxDevi = deviation2sideInd.rbegin()->first;
+    if ( maxDevi < 1e-7 && sides.size() == 3 )
+    {
+      // a triangle FACE; use a side with the most outstanding length as an elliptic one
+      deviation2sideInd.clear();
+      multimap< double, int > len2sideInd;
+      for ( size_t iS = 0; iS < sides.size(); ++iS )
+        len2sideInd.insert( make_pair( sides[iS]->Length(), iS ));
+
+      multimap< double, int >::iterator l2i = len2sideInd.begin();
+      double len0 = l2i->first;
+      double len1 = (++l2i)->first;
+      double len2 = (++l2i)->first;
+      if ( len1 - len0 > len2 - len1 )
+        deviation2sideInd.insert( make_pair( 0., len2sideInd.begin()->second ));
+      else
+        deviation2sideInd.insert( make_pair( 0., len2sideInd.rbegin()->second ));
+    }
 
     int iCirc = deviation2sideInd.rbegin()->second; 
     aCircSide = sides[ iCirc ];
index 4b0f11e21b619948fc2e02a241ba4ad474707ba4..1b2ba291f06a886ea4d02ef6b8d7fee14235eb00 100644 (file)
@@ -991,7 +991,9 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh &     theMesh,
   case FIXED_POINTS_1D:
   {
     const std::vector<double>& aPnts = _fpHyp->GetPoints();
-    const std::vector<int>&   nbsegs = _fpHyp->GetNbSegments();
+    std::vector<int>          nbsegs = _fpHyp->GetNbSegments();
+    if ( theReverse )
+      std::reverse( nbsegs.begin(), nbsegs.end() );
 
     // sort normalized params, taking into account theReverse
     TColStd_SequenceOfReal Params;
@@ -1146,7 +1148,7 @@ bool StdMeshers_Regular_1D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & t
   {
     list< double > params;
     bool reversed = false;
-    if ( theMesh.GetShapeToMesh().ShapeType() >= TopAbs_WIRE ) {
+    if ( theMesh.GetShapeToMesh().ShapeType() >= TopAbs_WIRE && _revEdgesIDs.empty() ) {
       // if the shape to mesh is WIRE or EDGE
       reversed = ( EE.Orientation() == TopAbs_REVERSED );
     }