From 73770b22b2d4057be8e6fa3371513415de73f9d0 Mon Sep 17 00:00:00 2001 From: ouv Date: Thu, 14 Oct 2010 11:08:31 +0000 Subject: [PATCH] 0020946: EDF 1466 SMESH: Add a new control criteria: Max element length --- doc/salome/gui/SMESH/images/image42.png | Bin 0 -> 857 bytes doc/salome/gui/SMESH/images/image43.png | Bin 0 -> 965 bytes .../SMESH/images/max_element_length_2d.png | Bin 0 -> 17544 bytes .../SMESH/images/max_element_length_3d.png | Bin 0 -> 17960 bytes .../SMESH/input/about_quality_controls.doc | 34 +-- doc/salome/gui/SMESH/input/area.doc | 3 +- doc/salome/gui/SMESH/input/aspect_ratio.doc | 4 +- .../gui/SMESH/input/aspect_ratio_3d.doc | 4 +- doc/salome/gui/SMESH/input/length_2d.doc | 4 +- .../gui/SMESH/input/max_element_length_2d.doc | 29 +++ .../gui/SMESH/input/max_element_length_3d.doc | 30 +++ doc/salome/gui/SMESH/input/minimum_angle.doc | 3 +- .../SMESH/input/selection_filter_library.doc | 10 + doc/salome/gui/SMESH/input/skew.doc | 3 +- doc/salome/gui/SMESH/input/taper.doc | 4 +- doc/salome/gui/SMESH/input/tui_filters.doc | 40 +++ .../gui/SMESH/input/tui_quality_controls.doc | 66 +++++ doc/salome/gui/SMESH/input/volume.doc | 4 +- doc/salome/gui/SMESH/input/warping.doc | 4 +- idl/SMESH_Filter.idl | 6 + resources/Makefile.am | 2 + resources/mesh_max_element_length_2d.png | Bin 0 -> 857 bytes resources/mesh_max_element_length_3d.png | Bin 0 -> 965 bytes src/Controls/SMESHControls.cxx | 2 + src/Controls/SMESH_Controls.cxx | 244 +++++++++++++++++- src/Controls/SMESH_ControlsDef.hxx | 24 ++ src/OBJECT/SMESH_Actor.cxx | 16 ++ src/OBJECT/SMESH_Actor.h | 3 +- src/SMESHGUI/SMESHGUI.cxx | 184 +++++++------ src/SMESHGUI/SMESHGUI_FilterDlg.cxx | 20 +- src/SMESHGUI/SMESHGUI_Selection.cxx | 2 + src/SMESHGUI/SMESH_images.ts | 8 + src/SMESHGUI/SMESH_msg_en.ts | 56 ++++ src/SMESH_I/SMESH_DumpPython.cxx | 2 + src/SMESH_I/SMESH_Filter_i.cxx | 58 +++++ src/SMESH_I/SMESH_Filter_i.hxx | 28 ++ src/SMESH_SWIG/SMESH_controls.py | 12 + src/SMESH_SWIG/smeshDC.py | 15 ++ 38 files changed, 805 insertions(+), 119 deletions(-) create mode 100755 doc/salome/gui/SMESH/images/image42.png create mode 100755 doc/salome/gui/SMESH/images/image43.png create mode 100755 doc/salome/gui/SMESH/images/max_element_length_2d.png create mode 100755 doc/salome/gui/SMESH/images/max_element_length_3d.png create mode 100644 doc/salome/gui/SMESH/input/max_element_length_2d.doc create mode 100644 doc/salome/gui/SMESH/input/max_element_length_3d.doc create mode 100755 resources/mesh_max_element_length_2d.png create mode 100755 resources/mesh_max_element_length_3d.png diff --git a/doc/salome/gui/SMESH/images/image42.png b/doc/salome/gui/SMESH/images/image42.png new file mode 100755 index 0000000000000000000000000000000000000000..d0120fa1ede5f2785da08336bfa85689607c8d9d GIT binary patch literal 857 zcmV-f1E&0mP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;&q+i>;4wDVIRNfJ{J{9CArAN&bQyOcrGSfFQDgb#hQa*=6x!u9?Xpr*tB5 zoSvR;+pekFgWa0!dJ%HSgD+Kw$LIavy(f$@d`pvjWBdMrVqsyySeAulS(M9VaaO?m z{JaT*fP;ermX?-;9Yql-n(7KSFi|09cwi_FZ- z0A%eT2pAh1!}C0KuVAjgg6m^F`zZH+t6+s;ut*dCR0;WL{S7VE`Te*P2kE0 z(_5%+zE6PSD<~Ynj(~S9SYBSHbgPGKHe0AxtM`B%phm0JVqjpv z%+1Xi*L49p9mg@iqii;79LM=e&!7Ke9LF)Uv$FFDTS zcX!v^cypL%UhgQl2iHYNCPQ5l~JTAv;ngsYg4RqYY jGXlRHliGjF1^9OWjdNV6x1YOp00000NkvXXu0mjfRrhtP literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/images/image43.png b/doc/salome/gui/SMESH/images/image43.png new file mode 100755 index 0000000000000000000000000000000000000000..7b6b895a1d83a5d1393a3af60c2a8fbe4a7c0433 GIT binary patch literal 965 zcmV;$13LVPP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZq>)?Vof(C zC13~yM`(&}M6`?8O1r2b5?W%XNEbp2VxZt!QX&$v4B03F#ejC@!laF5bcQ5;kQp+R z(#*Vj-+OcKJucqIq$PIcfy@7LIsDJp|6ET*_&+TN;CbF-kF&G0S(LfCIqzu%larIu zYPIlvpVie>FL#(zS63JLe4cu}&I5TzzyShu0U#J4L{NP6uBNxQmqw!jFp&GN$h*6{ z7-RVJ*QJ<5!1H1h0c+#4zkh~Wt%flM;7w0N9xM5QyeI$M{RZd2xeh^UBJsPm!iysV z{PshcBgc>OTHnJpU_A#gH8myO-Q9Se$KM-YWMl^kQ_@?v&Ju{>!VhyadhZ((jScwB>l2U524i>pin4KsZ>y^iPnlh15gJxasW{jv9q&- zbB^s_zRgNHtYoF$pi-$|ttAXKQ50a>oeaAGs?{o=&zHG$=_{OrD_6#{UX@B?T)P$@ zYlZ9Azr#7l`1m-+v~kYz@!97)3IQ<2aQb9~2ux3pptVkjM;IL)<>t*bZru2hnVFM_ zIFwR^VTf}U=WIIRj# zn0~*Pp`oFfEW_BbjdPO7#SsKL>(#`>XNWj1Uw$2>nwh^+O{}$~96%uxc3obPKYqH0 zF%GR;Xzde4ai2WT!#Rhw24f=nj*U~kvqThyEG~YUt?TCIW+_`eLDOzqe19LMngl^i zDB_Y0k&LjpFKF#^R=lwkGA!2b>aM@J*Ey`lN)00000NkvXXu0mjfoe{Pk literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/images/max_element_length_2d.png b/doc/salome/gui/SMESH/images/max_element_length_2d.png new file mode 100755 index 0000000000000000000000000000000000000000..d19c80e7fd7b3a84a325c7e558fff417aa45b002 GIT binary patch literal 17544 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 -
  • \ref free_nodes_page "Free nodes"
  • - - -1D mesh quality controls: -
      -
    • \subpage free_borders_page "Free borders"
    • -
    • \subpage borders_at_multi_connection_page "Borders at multi-connection"
    • -
    • \subpage length_page "Length"
    • -
    - -2D mesh quality controls: +Node quality controls:
    • \subpage free_nodes_page "Free nodes"
    • +
    + +Edge quality controls: +
    • \subpage free_edges_page "Free edges"
    • +
    • \subpage free_borders_page "Free borders"
    • +
    • \subpage length_page "Length"
    • +
    • \subpage borders_at_multi_connection_page "Borders at multi-connection"
    • +
    + +Face quality controls: +
      +
    • \subpage free_faces_page "Free faces"
    • \subpage length_2d_page "Length 2D"
    • \subpage borders_at_multi_connection_2d_page "Borders at multi-connection 2D"
    • \subpage area_page "Area"
    • @@ -39,13 +40,14 @@ There are 0D, 1D, 2D and 3D quality controls.
    • \subpage minimum_angle_page "Minimum angle"
    • \subpage warping_page "Warping"
    • \subpage skew_page "Skew"
    • +
    • \subpage max_element_length_2d_page "Max element length 2D"
    -3D mesh quality controls: +Volume quality controls:
    • \subpage aspect_ratio_3d_page "Aspect ratio 3D"
    • \subpage volume_page "Volume"
    • -
    • \subpage free_faces_page "Free faces"
    • +
    • \subpage max_element_length_3d_page "Max element length 3D"
    */ diff --git a/doc/salome/gui/SMESH/input/area.doc b/doc/salome/gui/SMESH/input/area.doc index bef0c0f8a..f650a3fd6 100644 --- a/doc/salome/gui/SMESH/input/area.doc +++ b/doc/salome/gui/SMESH/input/area.doc @@ -11,7 +11,8 @@ quadrangles).
    1. Display your mesh in the viewer.
    2. -
    3. Choose Controls > Area or click "Area" button. +
    4. Choose Controls > Face Controls > Area or click +"Area" button. \image html image35.png
      "Area" button
      diff --git a/doc/salome/gui/SMESH/input/aspect_ratio.doc b/doc/salome/gui/SMESH/input/aspect_ratio.doc index 5e1f31673..c6c3dbdee 100644 --- a/doc/salome/gui/SMESH/input/aspect_ratio.doc +++ b/doc/salome/gui/SMESH/input/aspect_ratio.doc @@ -24,8 +24,8 @@ nodes is calculated by the formula:
      1. Display your mesh in the viewer.
      2. -
      3. Choose Controls > Aspect Ratio or click "Aspect -Ratio" button in the toolbar. +
      4. Choose Controls > Face Controls > Aspect Ratio or click +"Aspect Ratio" button in the toolbar. \image html image37.png
        "Aspect Ratio" button
        diff --git a/doc/salome/gui/SMESH/input/aspect_ratio_3d.doc b/doc/salome/gui/SMESH/input/aspect_ratio_3d.doc index 751e41102..6e8b70808 100644 --- a/doc/salome/gui/SMESH/input/aspect_ratio_3d.doc +++ b/doc/salome/gui/SMESH/input/aspect_ratio_3d.doc @@ -21,8 +21,8 @@ by the formula:
        1. Display your mesh in the viewer.
        2. -
        3. Choose Controls > Aspect Ratio 3D or click "Aspect Ratio 3D" -button of the toolbar. +
        4. Choose Controls > Volume Controls > Aspect Ratio 3D or click +"Aspect Ratio 3D" button of the toolbar. \image html image144.png
          "Aspect Ratio 3D" button
          diff --git a/doc/salome/gui/SMESH/input/length_2d.doc b/doc/salome/gui/SMESH/input/length_2d.doc index def8afa95..4ed5b69e6 100644 --- a/doc/salome/gui/SMESH/input/length_2d.doc +++ b/doc/salome/gui/SMESH/input/length_2d.doc @@ -10,8 +10,8 @@ of your mesh.
          1. Display your mesh in the viewer.
          2. -
          3. Choose Controls > Length 2D or click "Length 2D" -button in the toolbar. +
          4. Choose Controls > Face Controls > Length 2D or click +"Length 2D" button in the toolbar. \image html image34.png
            "Length 2D" button
            diff --git a/doc/salome/gui/SMESH/input/max_element_length_2d.doc b/doc/salome/gui/SMESH/input/max_element_length_2d.doc new file mode 100644 index 000000000..0c062f872 --- /dev/null +++ b/doc/salome/gui/SMESH/input/max_element_length_2d.doc @@ -0,0 +1,29 @@ +/*! + +\page max_element_length_2d_page Max Element Length 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. + +To apply the Max Element Length 2D quality criterion to your mesh: +
              +
            1. Display your mesh in the viewer.
            2. + +
            3. Choose Controls > Face Controls > Max Element Length 2D or click +"Max Element Length 2D" button in the toolbar. + +\image html image42.png +
              "Max Element Length 2D" button
              + +Your mesh will be displayed in the viewer with its elements colored according to the +applied mesh quality control criterion: + +\image html max_element_length_2d.png +
            4. +
            + +
            See Also a sample TUI Script of a +\ref tui_max_element_length_2d "Max Element Length 2D quality control" operation. + +*/ \ No newline at end of file diff --git a/doc/salome/gui/SMESH/input/max_element_length_3d.doc b/doc/salome/gui/SMESH/input/max_element_length_3d.doc new file mode 100644 index 000000000..287c3f24c --- /dev/null +++ b/doc/salome/gui/SMESH/input/max_element_length_3d.doc @@ -0,0 +1,30 @@ +/*! + +\page max_element_length_3d_page Max Element Length 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. + +To apply the Max Element Length 3D quality criterion to your mesh: +
              +
            1. Display your mesh in the viewer.
            2. + +
            3. Choose Controls > Volume Controls > Max Element Length 3D or click +"Max Element Length 3D" button in the toolbar. + +\image html image43.png +
              "Max Element Length 3D" button
              + +Your mesh will be displayed in the viewer with its elements colored according to the +applied mesh quality control criterion: + +\image html max_element_length_3d.png +
            4. +
            + +
            See Also a sample TUI Script of a +\ref tui_max_element_length_3d "Max Element Length 3D quality control" operation. + +*/ \ No newline at end of file diff --git a/doc/salome/gui/SMESH/input/minimum_angle.doc b/doc/salome/gui/SMESH/input/minimum_angle.doc index af631b0ec..4236d6562 100644 --- a/doc/salome/gui/SMESH/input/minimum_angle.doc +++ b/doc/salome/gui/SMESH/input/minimum_angle.doc @@ -10,7 +10,8 @@ element (triangle or quadrangle).
            1. Display your mesh in the viewer.
            2. -
            3. Choose Controls > Minimum angle or click "Minimum Angle" button. +
            4. Choose Controls > Face Controls > Minimum angle or click +"Minimum Angle" button. \image html image38.png
              "Minimum Angle" button
              diff --git a/doc/salome/gui/SMESH/input/selection_filter_library.doc b/doc/salome/gui/SMESH/input/selection_filter_library.doc index 94dd3844c..ab88e0eda 100644 --- a/doc/salome/gui/SMESH/input/selection_filter_library.doc +++ b/doc/salome/gui/SMESH/input/selection_filter_library.doc @@ -156,6 +156,11 @@ See also a length, which is more, less or equal (within a given Tolerance) to the predefined Threshold Value. See also a \ref length_2d_page "Length 2D quality control". +
            5. +Max Element Length 2D selects triangles and quadrangles combining of the edges and +diagonals with a value of length, which is more, less or equal +(within a given Tolerance) to the predefined Threshold Value. See also a +\ref max_element_length_2d_page "Max Element Length 2D quality control".
            6. @@ -169,6 +174,11 @@ Additional criteria to select mesh Volumes are the following: \ref volume_page "Volume quality control"), which is more, less or equal (within a given Tolerance) to the predefined Threshold Value.
            7. +Max Element Length 3D selects 3D mesh elements combining of the edges and +diagonals with a value of length, which is more, less or equal +(within a given Tolerance) to the predefined Threshold Value. See also a +\ref max_element_length_3d_page "Max Element Length 3D quality control". +
            8. Bad oriented volume selects mesh volumes, which are incorrectly oriented from the point of view of MED convention.
            9. diff --git a/doc/salome/gui/SMESH/input/skew.doc b/doc/salome/gui/SMESH/input/skew.doc index 5235b4ddd..036c70d83 100644 --- a/doc/salome/gui/SMESH/input/skew.doc +++ b/doc/salome/gui/SMESH/input/skew.doc @@ -14,7 +14,8 @@ criterion can be applied to elements composed of 4 and 3 nodes
              1. Display your mesh in the viewer.
              2. -
              3. Choose Controls > Skew or click "Skew" button of the toolbar. +
              4. Choose Controls > Face Controls > Skew or click +"Skew" button of the toolbar. \image html image40.png
                "Skew" button
                diff --git a/doc/salome/gui/SMESH/input/taper.doc b/doc/salome/gui/SMESH/input/taper.doc index d2c4dd2b4..86472eabe 100644 --- a/doc/salome/gui/SMESH/input/taper.doc +++ b/doc/salome/gui/SMESH/input/taper.doc @@ -13,8 +13,8 @@ for elements consisting of 4 nodes.
                1. Display your mesh in the viewer.
                2. -
                3. Choose Controls > Taper or click "Taper" button in -the toolbar. +
                4. Choose Controls > Face Controls > Taper or click +"Taper" button in the toolbar. \image html image36.png
                  "Taper" button
                  diff --git a/doc/salome/gui/SMESH/input/tui_filters.doc b/doc/salome/gui/SMESH/input/tui_filters.doc index ad6dd5929..df8b13992 100755 --- a/doc/salome/gui/SMESH/input/tui_filters.doc +++ b/doc/salome/gui/SMESH/input/tui_filters.doc @@ -337,6 +337,46 @@ print "Number of faces with maximum edge length > 14:", len(ids) \sa \ref tui_length_2d +\section filter_max_element_length_2d Max Element Length 2D + +Filter 2D mesh elements (faces) corresponding to the maximum length +value of its edges and diagonals: +- element type should be \a smesh.FACE +- functor type should be \a smesh.FT_MaxElementLength2D +- threshold is floating point value (edge/diagonal length) + +\code +# create mesh +from SMESH_mechanic import * +# get all faces that have elements with length > 10 +filter = smesh.GetFilter(smesh.FACE, smesh.FT_MaxElementLength2D, smesh.FT_MoreThan, 10) +ids = mesh.GetIdsFromFilter(filter) +print "Number of faces with maximum element length > 10:", len(ids) +\endcode + +\sa \ref tui_max_element_length_2d + +\section filter_max_element_length_3d Max Element Length 3D + +Filter 3D mesh elements (volumes) corresponding to the maximum length +value of its edges and diagonals: +- element type should be \a smesh.VOLUME +- functor type should be \a smesh.FT_MaxElementLength3D +- threshold is floating point value (edge/diagonal length) + +\code +# create mesh with volumes +from SMESH_mechanic import * +mesh.Tetrahedron( algo=smesh.NETGEN ) +mesh.Compute() +# get all volumes that have elements with length > 10 +filter = smesh.GetFilter(smesh.VOLUME, smesh.FT_MaxElementLength3D, smesh.FT_MoreThan, 10) +ids = mesh.GetIdsFromFilter(filter) +print "Number of volumes with maximum element length > 10:", len(ids) +\endcode + +\sa \ref tui_max_element_length_3d + \section filter_belong_to_geom Belong to Geom Filter mesh entities (nodes or elements) which all nodes lie on the diff --git a/doc/salome/gui/SMESH/input/tui_quality_controls.doc b/doc/salome/gui/SMESH/input/tui_quality_controls.doc index 740c42247..acbf89198 100644 --- a/doc/salome/gui/SMESH/input/tui_quality_controls.doc +++ b/doc/salome/gui/SMESH/input/tui_quality_controls.doc @@ -603,6 +603,39 @@ aGroup.Add(anIds) salome.sg.updateObjBrowser(1) \endcode +\section tui_max_element_length_2d Max Element Length 2D + +\code +import SMESH_mechanic + +smesh = SMESH_mechanic.smesh +mesh = SMESH_mechanic.mesh +salome = SMESH_mechanic.salome + +# Criterion : MAX ELEMENT LENGTH 2D > 10 +mel_2d_margin = 10 + +aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_MaxElementLength2D, smesh.FT_MoreThan, mel_2d_margin) + +anIds = mesh.GetIdsFromFilter(aFilter) + +# print the result +print "Criterion: Max Element Length 2D Ratio > ", mel_2d_margin, " Nb = ", len(anIds) +j = 1 +for i in range(len(anIds)): + if j > 20: j = 1; print "" + print anIds[i], + j = j + 1 + pass +print "" + +# create a group +aGroup = mesh.CreateEmptyGroup(smesh.FACE, "Max Element Length 2D > " + `mel_2d_margin`) +aGroup.Add(anIds) + +salome.sg.updateObjBrowser(1) +\endcode + \section tui_aspect_ratio_3d Aspect Ratio 3D \code @@ -672,4 +705,37 @@ aGroup.Add(anIds) salome.sg.updateObjBrowser(1) \endcode +\section tui_max_element_length_3d Max Element Length 3D + +\code +import SMESH_mechanic_tetra + +smesh = SMESH_mechanic_tetra.smesh +mesh = SMESH_mechanic_tetra.mesh +salome = SMESH_mechanic_tetra.salome + +# Criterion : MAX ELEMENT LENGTH 3D > 10 +mel_3d_margin = 10 + +aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_MaxElementLength3D, smesh.FT_MoreThan, mel_3d_margin) + +anIds = mesh.GetIdsFromFilter(aFilter) + +# print the result +print "Criterion: Max Element Length 3D Ratio > ", mel_3d_margin, " Nb = ", len(anIds) +j = 1 +for i in range(len(anIds)): + if j > 20: j = 1; print "" + print anIds[i], + j = j + 1 + pass +print "" + +# create a group +aGroup = mesh.CreateEmptyGroup(smesh.FACE, "Max Element Length 3D > " + `mel_3d_margin`) +aGroup.Add(anIds) + +salome.sg.updateObjBrowser(1) +\endcode + */ diff --git a/doc/salome/gui/SMESH/input/volume.doc b/doc/salome/gui/SMESH/input/volume.doc index ba99c193e..4d74fcbf0 100644 --- a/doc/salome/gui/SMESH/input/volume.doc +++ b/doc/salome/gui/SMESH/input/volume.doc @@ -9,8 +9,8 @@
                  1. Display your mesh in the viewer.
                  2. -
                  3. Choose Controls > Volume or click "Volume" button -in the toolbar. +
                  4. Choose Controls > Volume Controls > Volume or click +"Volume" button in the toolbar. \image html image145.png
                    "Volume" button
                    diff --git a/doc/salome/gui/SMESH/input/warping.doc b/doc/salome/gui/SMESH/input/warping.doc index 83bfaa3ac..86ba0c905 100644 --- a/doc/salome/gui/SMESH/input/warping.doc +++ b/doc/salome/gui/SMESH/input/warping.doc @@ -24,8 +24,8 @@ projection height ?h? to the half edge length ?l?.
                    1. Display your mesh in the viewer.
                    2. -
                    3. Choose Controls > Warping Angle or click "Warping angle" -button of the toolbar. +
                    4. Choose Controls > Face Controls > Warping Angle or click +"Warping angle" button of the toolbar. \image html image39.png
                      "Warping angle" button
                      diff --git a/idl/SMESH_Filter.idl b/idl/SMESH_Filter.idl index d65ed3b46..50526cf03 100644 --- a/idl/SMESH_Filter.idl +++ b/idl/SMESH_Filter.idl @@ -47,6 +47,8 @@ module SMESH FT_Skew, FT_Area, FT_Volume3D, + FT_MaxElementLength2D, + FT_MaxElementLength3D, FT_FreeBorders, FT_FreeEdges, FT_FreeNodes, @@ -121,6 +123,8 @@ module SMESH interface Skew : NumericalFunctor{}; interface Area : NumericalFunctor{}; interface Volume3D : NumericalFunctor{}; + interface MaxElementLength2D : NumericalFunctor{}; + interface MaxElementLength3D : NumericalFunctor{}; interface Length : NumericalFunctor{}; interface Length2D : NumericalFunctor { @@ -463,6 +467,8 @@ module SMESH Skew CreateSkew(); Area CreateArea(); Volume3D CreateVolume3D(); + MaxElementLength2D CreateMaxElementLength2D(); + MaxElementLength3D CreateMaxElementLength3D(); Length CreateLength(); Length2D CreateLength2D(); MultiConnection CreateMultiConnection(); diff --git a/resources/Makefile.am b/resources/Makefile.am index ed3f5aff7..d90cc400b 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -57,6 +57,8 @@ dist_salomeres_DATA = \ mesh_free_edges.png \ mesh_free_edges_2d.png \ mesh_free_nodes.png \ + mesh_max_element_length_2d.png \ + mesh_max_element_length_3d.png \ mesh_multi_edges.png \ mesh_multi_edges_2d.png \ mesh_line_n.png \ diff --git a/resources/mesh_max_element_length_2d.png b/resources/mesh_max_element_length_2d.png new file mode 100755 index 0000000000000000000000000000000000000000..d0120fa1ede5f2785da08336bfa85689607c8d9d GIT binary patch literal 857 zcmV-f1E&0mP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;&q+i>;4wDVIRNfJ{J{9CArAN&bQyOcrGSfFQDgb#hQa*=6x!u9?Xpr*tB5 zoSvR;+pekFgWa0!dJ%HSgD+Kw$LIavy(f$@d`pvjWBdMrVqsyySeAulS(M9VaaO?m z{JaT*fP;ermX?-;9Yql-n(7KSFi|09cwi_FZ- z0A%eT2pAh1!}C0KuVAjgg6m^F`zZH+t6+s;ut*dCR0;WL{S7VE`Te*P2kE0 z(_5%+zE6PSD<~Ynj(~S9SYBSHbgPGKHe0AxtM`B%phm0JVqjpv z%+1Xi*L49p9mg@iqii;79LM=e&!7Ke9LF)Uv$FFDTS zcX!v^cypL%UhgQl2iHYNCPQ5l~JTAv;ngsYg4RqYY jGXlRHliGjF1^9OWjdNV6x1YOp00000NkvXXu0mjfRrhtP literal 0 HcmV?d00001 diff --git a/resources/mesh_max_element_length_3d.png b/resources/mesh_max_element_length_3d.png new file mode 100755 index 0000000000000000000000000000000000000000..7b6b895a1d83a5d1393a3af60c2a8fbe4a7c0433 GIT binary patch literal 965 zcmV;$13LVPP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZq>)?Vof(C zC13~yM`(&}M6`?8O1r2b5?W%XNEbp2VxZt!QX&$v4B03F#ejC@!laF5bcQ5;kQp+R z(#*Vj-+OcKJucqIq$PIcfy@7LIsDJp|6ET*_&+TN;CbF-kF&G0S(LfCIqzu%larIu zYPIlvpVie>FL#(zS63JLe4cu}&I5TzzyShu0U#J4L{NP6uBNxQmqw!jFp&GN$h*6{ z7-RVJ*QJ<5!1H1h0c+#4zkh~Wt%flM;7w0N9xM5QyeI$M{RZd2xeh^UBJsPm!iysV z{PshcBgc>OTHnJpU_A#gH8myO-Q9Se$KM-YWMl^kQ_@?v&Ju{>!VhyadhZ((jScwB>l2U524i>pin4KsZ>y^iPnlh15gJxasW{jv9q&- zbB^s_zRgNHtYoF$pi-$|ttAXKQ50a>oeaAGs?{o=&zHG$=_{OrD_6#{UX@B?T)P$@ zYlZ9Azr#7l`1m-+v~kYz@!97)3IQ<2aQb9~2ux3pptVkjM;IL)<>t*bZru2hnVFM_ zIFwR^VTf}U=WIIRj# zn0~*Pp`oFfEW_BbjdPO7#SsKL>(#`>XNWj1Uw$2>nwh^+O{}$~96%uxc3obPKYqH0 zF%GR;Xzde4ai2WT!#Rhw24f=nj*U~kvqThyEG~YUt?TCIW+_`eLDOzqe19LMngl^i zDB_Y0k&LjpFKF#^R=lwkGA!2b>aM@J*Ey`lN)00000NkvXXu0mjfoe{Pk literal 0 HcmV?d00001 diff --git a/src/Controls/SMESHControls.cxx b/src/Controls/SMESHControls.cxx index a2ad1e688..d42072f1b 100644 --- a/src/Controls/SMESHControls.cxx +++ b/src/Controls/SMESHControls.cxx @@ -31,6 +31,8 @@ int main(int argc, char** argv) new Taper(); new Skew(); new Area(); + new MaxElementLength2D(); + new MaxElementLength3D(); new Length(); // new Length2D(); new MultiConnection(); diff --git a/src/Controls/SMESH_Controls.cxx b/src/Controls/SMESH_Controls.cxx index 8f18f6605..3c079736b 100644 --- a/src/Controls/SMESH_Controls.cxx +++ b/src/Controls/SMESH_Controls.cxx @@ -370,6 +370,246 @@ SMDSAbs_ElementType Volume::GetType() const } +/* + Class : MaxElementLength2D + Description : Functor calculating maximum length of 2D element +*/ + +double MaxElementLength2D::GetValue( long theElementId ) +{ + TSequenceOfXYZ P; + if( GetPoints( theElementId, P ) ) { + double aVal = 0; + const SMDS_MeshElement* aElem = myMesh->FindElement( theElementId ); + SMDSAbs_ElementType aType = aElem->GetType(); + int len = P.size(); + switch( aType ) { + case SMDSAbs_Face: + if( len == 3 ) { // triangles + double L1 = getDistance(P( 1 ),P( 2 )); + double L2 = getDistance(P( 2 ),P( 3 )); + double L3 = getDistance(P( 3 ),P( 1 )); + aVal = Max(L1,Max(L2,L3)); + break; + } + else if( len == 4 ) { // quadrangles + double L1 = getDistance(P( 1 ),P( 2 )); + double L2 = getDistance(P( 2 ),P( 3 )); + double L3 = getDistance(P( 3 ),P( 4 )); + double L4 = getDistance(P( 4 ),P( 1 )); + double D1 = getDistance(P( 1 ),P( 3 )); + double D2 = getDistance(P( 2 ),P( 4 )); + aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(D1,D2)); + break; + } + else if( len == 6 ) { // quadratic triangles + double L1 = getDistance(P( 1 ),P( 2 )) + getDistance(P( 2 ),P( 3 )); + double L2 = getDistance(P( 3 ),P( 4 )) + getDistance(P( 4 ),P( 5 )); + double L3 = getDistance(P( 5 ),P( 6 )) + getDistance(P( 6 ),P( 1 )); + aVal = Max(L1,Max(L2,L3)); + break; + } + else if( len == 8 ) { // quadratic quadrangles + double L1 = getDistance(P( 1 ),P( 2 )) + getDistance(P( 2 ),P( 3 )); + double L2 = getDistance(P( 3 ),P( 4 )) + getDistance(P( 4 ),P( 5 )); + double L3 = getDistance(P( 5 ),P( 6 )) + getDistance(P( 6 ),P( 7 )); + double L4 = getDistance(P( 7 ),P( 8 )) + getDistance(P( 8 ),P( 1 )); + double D1 = getDistance(P( 1 ),P( 5 )); + double D2 = getDistance(P( 3 ),P( 7 )); + aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(D1,D2)); + break; + } + } + + if( myPrecision >= 0 ) + { + double prec = pow( 10., (double)myPrecision ); + aVal = floor( aVal * prec + 0.5 ) / prec; + } + return aVal; + } + return 0.; +} + +double MaxElementLength2D::GetBadRate( double Value, int /*nbNodes*/ ) const +{ + return Value; +} + +SMDSAbs_ElementType MaxElementLength2D::GetType() const +{ + return SMDSAbs_Face; +} + +/* + Class : MaxElementLength3D + Description : Functor calculating maximum length of 3D element +*/ + +double MaxElementLength3D::GetValue( long theElementId ) +{ + TSequenceOfXYZ P; + if( GetPoints( theElementId, P ) ) { + double aVal = 0; + const SMDS_MeshElement* aElem = myMesh->FindElement( theElementId ); + SMDSAbs_ElementType aType = aElem->GetType(); + int len = P.size(); + switch( aType ) { + case SMDSAbs_Volume: + if( len == 4 ) { // tetras + double L1 = getDistance(P( 1 ),P( 2 )); + double L2 = getDistance(P( 2 ),P( 3 )); + double L3 = getDistance(P( 3 ),P( 1 )); + double L4 = getDistance(P( 1 ),P( 4 )); + double L5 = getDistance(P( 2 ),P( 4 )); + double L6 = getDistance(P( 3 ),P( 4 )); + aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(L5,L6)); + break; + } + else if( len == 5 ) { // pyramids + double L1 = getDistance(P( 1 ),P( 2 )); + double L2 = getDistance(P( 2 ),P( 3 )); + double L3 = getDistance(P( 3 ),P( 4 )); + double L4 = getDistance(P( 4 ),P( 1 )); + double L5 = getDistance(P( 1 ),P( 5 )); + double L6 = getDistance(P( 2 ),P( 5 )); + double L7 = getDistance(P( 3 ),P( 5 )); + double L8 = getDistance(P( 4 ),P( 5 )); + aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(L5,L6)); + aVal = Max(aVal,Max(L7,L8)); + break; + } + else if( len == 6 ) { // pentas + double L1 = getDistance(P( 1 ),P( 2 )); + double L2 = getDistance(P( 2 ),P( 3 )); + double L3 = getDistance(P( 3 ),P( 1 )); + double L4 = getDistance(P( 4 ),P( 5 )); + double L5 = getDistance(P( 5 ),P( 6 )); + double L6 = getDistance(P( 6 ),P( 4 )); + double L7 = getDistance(P( 1 ),P( 4 )); + double L8 = getDistance(P( 2 ),P( 5 )); + double L9 = getDistance(P( 3 ),P( 6 )); + aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(L5,L6)); + aVal = Max(aVal,Max(Max(L7,L8),L9)); + break; + } + else if( len == 8 ) { // hexas + double L1 = getDistance(P( 1 ),P( 2 )); + double L2 = getDistance(P( 2 ),P( 3 )); + double L3 = getDistance(P( 3 ),P( 4 )); + double L4 = getDistance(P( 4 ),P( 1 )); + double L5 = getDistance(P( 5 ),P( 6 )); + double L6 = getDistance(P( 6 ),P( 7 )); + double L7 = getDistance(P( 7 ),P( 8 )); + double L8 = getDistance(P( 8 ),P( 5 )); + double L9 = getDistance(P( 1 ),P( 5 )); + double L10= getDistance(P( 2 ),P( 6 )); + double L11= getDistance(P( 3 ),P( 7 )); + double L12= getDistance(P( 4 ),P( 8 )); + double D1 = getDistance(P( 1 ),P( 7 )); + double D2 = getDistance(P( 2 ),P( 8 )); + double D3 = getDistance(P( 3 ),P( 5 )); + double D4 = getDistance(P( 4 ),P( 6 )); + aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(L5,L6)); + aVal = Max(aVal,Max(Max(L7,L8),Max(L9,L10))); + aVal = Max(aVal,Max(L11,L12)); + aVal = Max(aVal,Max(Max(D1,D2),Max(D3,D4))); + break; + } + else if( len == 10 ) { // quadratic tetras + double L1 = getDistance(P( 1 ),P( 5 )) + getDistance(P( 5 ),P( 2 )); + double L2 = getDistance(P( 2 ),P( 6 )) + getDistance(P( 6 ),P( 3 )); + double L3 = getDistance(P( 3 ),P( 7 )) + getDistance(P( 7 ),P( 1 )); + double L4 = getDistance(P( 1 ),P( 8 )) + getDistance(P( 8 ),P( 4 )); + double L5 = getDistance(P( 2 ),P( 9 )) + getDistance(P( 9 ),P( 4 )); + double L6 = getDistance(P( 3 ),P( 10 )) + getDistance(P( 10 ),P( 4 )); + aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(L5,L6)); + break; + } + else if( len == 13 ) { // quadratic pyramids + double L1 = getDistance(P( 1 ),P( 6 )) + getDistance(P( 6 ),P( 2 )); + double L2 = getDistance(P( 2 ),P( 7 )) + getDistance(P( 7 ),P( 3 )); + double L3 = getDistance(P( 3 ),P( 8 )) + getDistance(P( 8 ),P( 4 )); + double L4 = getDistance(P( 4 ),P( 9 )) + getDistance(P( 9 ),P( 1 )); + double L5 = getDistance(P( 1 ),P( 10 )) + getDistance(P( 10 ),P( 5 )); + double L6 = getDistance(P( 2 ),P( 11 )) + getDistance(P( 11 ),P( 5 )); + double L7 = getDistance(P( 3 ),P( 12 )) + getDistance(P( 12 ),P( 5 )); + double L8 = getDistance(P( 4 ),P( 13 )) + getDistance(P( 13 ),P( 5 )); + aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(L5,L6)); + aVal = Max(aVal,Max(L7,L8)); + break; + } + else if( len == 15 ) { // quadratic pentas + double L1 = getDistance(P( 1 ),P( 7 )) + getDistance(P( 7 ),P( 2 )); + double L2 = getDistance(P( 2 ),P( 8 )) + getDistance(P( 8 ),P( 3 )); + double L3 = getDistance(P( 3 ),P( 9 )) + getDistance(P( 9 ),P( 1 )); + double L4 = getDistance(P( 4 ),P( 10 )) + getDistance(P( 10 ),P( 5 )); + double L5 = getDistance(P( 5 ),P( 11 )) + getDistance(P( 11 ),P( 6 )); + double L6 = getDistance(P( 6 ),P( 12 )) + getDistance(P( 12 ),P( 4 )); + double L7 = getDistance(P( 1 ),P( 13 )) + getDistance(P( 13 ),P( 4 )); + double L8 = getDistance(P( 2 ),P( 14 )) + getDistance(P( 14 ),P( 5 )); + double L9 = getDistance(P( 3 ),P( 15 )) + getDistance(P( 15 ),P( 6 )); + aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(L5,L6)); + aVal = Max(aVal,Max(Max(L7,L8),L9)); + break; + } + else if( len == 20 ) { // quadratic hexas + double L1 = getDistance(P( 1 ),P( 9 )) + getDistance(P( 9 ),P( 2 )); + double L2 = getDistance(P( 2 ),P( 10 )) + getDistance(P( 10 ),P( 3 )); + double L3 = getDistance(P( 3 ),P( 11 )) + getDistance(P( 11 ),P( 4 )); + double L4 = getDistance(P( 4 ),P( 12 )) + getDistance(P( 12 ),P( 1 )); + double L5 = getDistance(P( 5 ),P( 13 )) + getDistance(P( 13 ),P( 6 )); + double L6 = getDistance(P( 6 ),P( 14 )) + getDistance(P( 14 ),P( 7 )); + double L7 = getDistance(P( 7 ),P( 15 )) + getDistance(P( 15 ),P( 8 )); + double L8 = getDistance(P( 8 ),P( 16 )) + getDistance(P( 16 ),P( 5 )); + double L9 = getDistance(P( 1 ),P( 17 )) + getDistance(P( 17 ),P( 5 )); + double L10= getDistance(P( 2 ),P( 18 )) + getDistance(P( 18 ),P( 6 )); + double L11= getDistance(P( 3 ),P( 19 )) + getDistance(P( 19 ),P( 7 )); + double L12= getDistance(P( 4 ),P( 20 )) + getDistance(P( 20 ),P( 8 )); + double D1 = getDistance(P( 1 ),P( 7 )); + double D2 = getDistance(P( 2 ),P( 8 )); + double D3 = getDistance(P( 3 ),P( 5 )); + double D4 = getDistance(P( 4 ),P( 6 )); + aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(L5,L6)); + aVal = Max(aVal,Max(Max(L7,L8),Max(L9,L10))); + aVal = Max(aVal,Max(L11,L12)); + aVal = Max(aVal,Max(Max(D1,D2),Max(D3,D4))); + break; + } + else if( len > 1 && aElem->IsPoly() ) { // polys + // get the maximum distance between all pairs of nodes + for( int i = 1; i <= len; i++ ) { + for( int j = 1; j <= len; j++ ) { + if( j > i ) { // optimization of the loop + double D = getDistance( P(i), P(j) ); + aVal = Max( aVal, D ); + } + } + } + } + } + + if( myPrecision >= 0 ) + { + double prec = pow( 10., (double)myPrecision ); + aVal = floor( aVal * prec + 0.5 ) / prec; + } + return aVal; + } + return 0.; +} + +double MaxElementLength3D::GetBadRate( double Value, int /*nbNodes*/ ) const +{ + return Value; +} + +SMDSAbs_ElementType MaxElementLength3D::GetType() const +{ + return SMDSAbs_Volume; +} + + /* Class : MinimumAngle Description : Functor for calculation of minimum angle @@ -1198,7 +1438,7 @@ double Length2D::GetValue( long theElementId) else if (len == 5){ // piramids double L1 = getDistance(P( 1 ),P( 2 )); double L2 = getDistance(P( 2 ),P( 3 )); - double L3 = getDistance(P( 3 ),P( 1 )); + double L3 = getDistance(P( 3 ),P( 4 )); double L4 = getDistance(P( 4 ),P( 1 )); double L5 = getDistance(P( 1 ),P( 5 )); double L6 = getDistance(P( 2 ),P( 5 )); @@ -1258,7 +1498,7 @@ double Length2D::GetValue( long theElementId) else if (len == 13){ // quadratic piramids double L1 = getDistance(P( 1 ),P( 6 )) + getDistance(P( 6 ),P( 2 )); double L2 = getDistance(P( 2 ),P( 7 )) + getDistance(P( 7 ),P( 3 )); - double L3 = getDistance(P( 3 ),P( 8 )) + getDistance(P( 8 ),P( 1 )); + double L3 = getDistance(P( 3 ),P( 8 )) + getDistance(P( 8 ),P( 4 )); double L4 = getDistance(P( 4 ),P( 9 )) + getDistance(P( 9 ),P( 1 )); double L5 = getDistance(P( 1 ),P( 10 )) + getDistance(P( 10 ),P( 5 )); double L6 = getDistance(P( 2 ),P( 11 )) + getDistance(P( 11 ),P( 5 )); diff --git a/src/Controls/SMESH_ControlsDef.hxx b/src/Controls/SMESH_ControlsDef.hxx index 2b7bffeba..aba178ece 100644 --- a/src/Controls/SMESH_ControlsDef.hxx +++ b/src/Controls/SMESH_ControlsDef.hxx @@ -159,6 +159,30 @@ namespace SMESH{ }; + /* + Class : MaxElementLength2D + Description : Functor calculating maximum length of 2D element + */ + class SMESHCONTROLS_EXPORT MaxElementLength2D: public virtual NumericalFunctor{ + public: + virtual double GetValue( long theElementId ); + virtual double GetBadRate( double Value, int nbNodes ) const; + virtual SMDSAbs_ElementType GetType() const; + }; + + + /* + Class : MaxElementLength3D + Description : Functor calculating maximum length of 3D element + */ + class SMESHCONTROLS_EXPORT MaxElementLength3D: public virtual NumericalFunctor{ + public: + virtual double GetValue( long theElementId ); + virtual double GetBadRate( double Value, int nbNodes ) const; + virtual SMDSAbs_ElementType GetType() const; + }; + + /* Class : SMESH_MinimumAngle Description : Functor for calculation of minimum angle diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx index 8f5c5bae6..97bf66e85 100644 --- a/src/OBJECT/SMESH_Actor.cxx +++ b/src/OBJECT/SMESH_Actor.cxx @@ -801,6 +801,22 @@ SetControlMode(eControl theMode, myControlActor = my3DActor; break; } + case eMaxElementLength2D: + { + SMESH::Controls::MaxElementLength2D* aControl = new SMESH::Controls::MaxElementLength2D(); + aControl->SetPrecision( myControlsPrecision ); + aFunctor.reset( aControl ); + myControlActor = my2DActor; + break; + } + case eMaxElementLength3D: + { + SMESH::Controls::MaxElementLength3D* aControl = new SMESH::Controls::MaxElementLength3D(); + aControl->SetPrecision( myControlsPrecision ); + aFunctor.reset( aControl ); + myControlActor = my3DActor; + break; + } case eMinimumAngle: { SMESH::Controls::MinimumAngle* aControl = new SMESH::Controls::MinimumAngle(); diff --git a/src/OBJECT/SMESH_Actor.h b/src/OBJECT/SMESH_Actor.h index bb4e2fb68..9e53f5ac6 100644 --- a/src/OBJECT/SMESH_Actor.h +++ b/src/OBJECT/SMESH_Actor.h @@ -115,7 +115,8 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor enum eControl{eNone, eLength, eLength2D, eFreeBorders, eFreeEdges, eFreeNodes, eFreeFaces, eMultiConnection, eArea, eTaper, eAspectRatio, - eMinimumAngle, eWarping, eSkew, eAspectRatio3D, eMultiConnection2D, eVolume3D}; + eMinimumAngle, eWarping, eSkew, eAspectRatio3D, eMultiConnection2D, eVolume3D, + eMaxElementLength2D, eMaxElementLength3D}; virtual void SetControlMode(eControl theMode) = 0; virtual eControl GetControlMode() = 0; diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index c0a9ba9be..e21f33a97 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -1062,6 +1062,14 @@ aTitle = QObject::tr( "FREE_FACES" ); aControl = SMESH_Actor::eFreeFaces; break; + case 6022: + aTitle = QObject::tr( "MAX_ELEMENT_LENGTH_2D" ); + aControl = SMESH_Actor::eMaxElementLength2D; + break; + case 6023: + aTitle = QObject::tr( "MAX_ELEMENT_LENGTH_3D" ); + aControl = SMESH_Actor::eMaxElementLength3D; + break; } anActor->SetControlMode(aControl); anActor->GetScalarBarActor()->SetTitle(aTitle.toLatin1().data()); @@ -2812,6 +2820,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case 6005: case 6009: case 6021: + case 6022: + case 6023: if ( vtkwnd ) { LightApp_SelectionMgr* mgr = selectionMgr(); @@ -3042,6 +3052,8 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( 6001, "LENGTH", "ICON_LENGTH", 0, true ); createSMESHAction( 6002, "FREE_EDGE", "ICON_FREE_EDGE", 0, true ); createSMESHAction( 6021, "FREE_FACES", "ICON_FREE_FACES", 0, true ); + createSMESHAction( 6022, "MAX_ELEMENT_LENGTH_2D", "ICON_MAX_ELEMENT_LENGTH_2D", 0, true ); + createSMESHAction( 6023, "MAX_ELEMENT_LENGTH_3D", "ICON_MAX_ELEMENT_LENGTH_3D", 0, true ); createSMESHAction( 6003, "FREE_BORDER", "ICON_FREE_EDGE_2D", 0, true ); createSMESHAction( 6004, "CONNECTION", "ICON_CONNECTION", 0, true ); createSMESHAction( 6005, "FREE_NODE", "ICON_FREE_NODE", 0, true ); @@ -3147,6 +3159,10 @@ void SMESHGUI::initialize( CAM_Application* app ) int importId = createMenu( tr( "MEN_IMPORT" ), fileId, -1, 10 ), exportId = createMenu( tr( "MEN_EXPORT" ), fileId, -1, 10 ), + nodeId = createMenu( tr( "MEN_NODE_CTRL" ), ctrlId, -1, 10 ), + edgeId = createMenu( tr( "MEN_EDGE_CTRL" ), ctrlId, -1, 10 ), + faceId = createMenu( tr( "MEN_FACE_CTRL" ), ctrlId, -1, 10 ), + volumeId = createMenu( tr( "MEN_VOLUME_CTRL" ), ctrlId, -1, 10 ), addId = createMenu( tr( "MEN_ADD" ), modifyId, 402 ), removeId = createMenu( tr( "MEN_REMOVE" ), modifyId, 403 ), renumId = createMenu( tr( "MEN_RENUM" ), modifyId, 404 ), @@ -3197,25 +3213,24 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( 904, meshId, -1 ); createMenu( separator(), meshId, -1 ); - createMenu( 6003, ctrlId, -1 ); - createMenu( 6001, ctrlId, -1 ); - createMenu( 6004, ctrlId, -1 ); - createMenu( separator(), ctrlId, -1 ); - createMenu( 6005, ctrlId, -1 ); - createMenu( 6002, ctrlId, -1 ); - createMenu( 6018, ctrlId, -1 ); - createMenu( 6019, ctrlId, -1 ); - createMenu( 6011, ctrlId, -1 ); - createMenu( 6012, ctrlId, -1 ); - createMenu( 6013, ctrlId, -1 ); - createMenu( 6014, ctrlId, -1 ); - createMenu( 6015, ctrlId, -1 ); - createMenu( 6016, ctrlId, -1 ); - createMenu( separator(), ctrlId, -1 ); - createMenu( 6017, ctrlId, -1 ); - createMenu( 6009, ctrlId, -1 ); - createMenu( 6021, ctrlId, -1 ); - createMenu( separator(), ctrlId, -1 ); + createMenu( 6005, nodeId, -1 ); + createMenu( 6002, edgeId, -1 ); + createMenu( 6003, edgeId, -1 ); + createMenu( 6001, edgeId, -1 ); + createMenu( 6004, edgeId, -1 ); + createMenu( 6021, faceId, -1 ); + createMenu( 6018, faceId, -1 ); + createMenu( 6019, faceId, -1 ); + createMenu( 6011, faceId, -1 ); + createMenu( 6012, faceId, -1 ); + createMenu( 6013, faceId, -1 ); + createMenu( 6014, faceId, -1 ); + createMenu( 6015, faceId, -1 ); + createMenu( 6016, faceId, -1 ); + createMenu( 6022, faceId, -1 ); + createMenu( 6017, volumeId, -1 ); + createMenu( 6009, volumeId, -1 ); + createMenu( 6023, volumeId, -1 ); createMenu( 4000, addId, -1 ); createMenu( 4009, addId, -1 ); @@ -3299,12 +3314,14 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( 904, meshTb ); createTool( separator(), meshTb ); - createTool( 6001, ctrlTb ); + createTool( 6005, ctrlTb ); + createTool( separator(), ctrlTb ); + createTool( 6002, ctrlTb ); createTool( 6003, ctrlTb ); + createTool( 6001, ctrlTb ); createTool( 6004, ctrlTb ); createTool( separator(), ctrlTb ); - createTool( 6005, ctrlTb ); - createTool( 6002, ctrlTb ); + createTool( 6021, ctrlTb ); createTool( 6018, ctrlTb ); createTool( 6019, ctrlTb ); createTool( 6011, ctrlTb ); @@ -3313,10 +3330,11 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( 6014, ctrlTb ); createTool( 6015, ctrlTb ); createTool( 6016, ctrlTb ); + createTool( 6022, ctrlTb ); createTool( separator(), ctrlTb ); createTool( 6017, ctrlTb ); createTool( 6009, ctrlTb ); - createTool( 6021, ctrlTb ); + createTool( 6023, ctrlTb ); createTool( separator(), ctrlTb ); createTool( 4000, addRemTb ); @@ -3601,75 +3619,87 @@ void SMESHGUI::initialize( CAM_Application* app ) popupMgr()->insert( separator(), anId, -1 ); - popupMgr()->insert( action( 6003 ), anId, -1 ); // FREE_BORDER - popupMgr()->setRule( action( 6003 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule ); - popupMgr()->setRule( action( 6003 ), "controlMode = 'eFreeBorders'", QtxPopupMgr::ToggleRule ); + int aSubId = popupMgr()->insert( tr( "MEN_NODE_CTRL" ), anId, -1 ); // NODE CONTROLS - popupMgr()->insert( action( 6001 ), anId, -1 ); // LENGTH - popupMgr()->setRule( action( 6001 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule ); - popupMgr()->setRule( action( 6001 ), "controlMode = 'eLength'", QtxPopupMgr::ToggleRule ); - - popupMgr()->insert( action( 6004 ), anId, -1 ); // CONNECTION - popupMgr()->setRule( action( 6004 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule ); - popupMgr()->setRule( action( 6004 ), "controlMode = 'eMultiConnection'", QtxPopupMgr::ToggleRule ); - - popupMgr()->insert( separator(), anId, -1 ); - - popupMgr()->insert( action( 6005 ), anId, -1 ); // FREE_NODE + popupMgr()->insert( action( 6005 ), aSubId, -1 ); // FREE_NODE popupMgr()->setRule( action( 6005 ), aMeshInVtkHasNodes, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6005 ), "controlMode = 'eFreeNodes'", QtxPopupMgr::ToggleRule ); - popupMgr()->insert( action( 6002 ), anId, -1 ); // FREE_EDGE + aSubId = popupMgr()->insert( tr( "MEN_EDGE_CTRL" ), anId, -1 ); // EDGE CONTROLS + + popupMgr()->insert( action( 6002 ), aSubId, -1 ); // FREE_EDGE popupMgr()->setRule( action( 6002 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6002 ), "controlMode = 'eFreeEdges'", QtxPopupMgr::ToggleRule ); - popupMgr()->insert( action( 6018 ), anId, -1 ); // LENGTH_2D - popupMgr()->setRule( action( 6018 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); - popupMgr()->setRule( action( 6018 ), "controlMode = 'eLength2D'", QtxPopupMgr::ToggleRule ); + popupMgr()->insert( action( 6003 ), aSubId, -1 ); // FREE_BORDER + popupMgr()->setRule( action( 6003 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6003 ), "controlMode = 'eFreeBorders'", QtxPopupMgr::ToggleRule ); - popupMgr()->insert( action( 6019 ), anId, -1 ); // CONNECTION_2D - popupMgr()->setRule( action( 6019 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); - popupMgr()->setRule( action( 6019 ), "controlMode = 'eMultiConnection2D'", QtxPopupMgr::ToggleRule ); + popupMgr()->insert( action( 6001 ), aSubId, -1 ); // LENGTH + popupMgr()->setRule( action( 6001 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6001 ), "controlMode = 'eLength'", QtxPopupMgr::ToggleRule ); - popupMgr()->insert( action( 6011 ), anId, -1 ); // AREA - popupMgr()->setRule( action( 6011 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); - popupMgr()->setRule( action( 6011 ), "controlMode = 'eArea'", QtxPopupMgr::ToggleRule ); + popupMgr()->insert( action( 6004 ), aSubId, -1 ); // CONNECTION + popupMgr()->setRule( action( 6004 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6004 ), "controlMode = 'eMultiConnection'", QtxPopupMgr::ToggleRule ); - popupMgr()->insert( action( 6012 ), anId, -1 ); // TAPER - popupMgr()->setRule( action( 6012 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); - popupMgr()->setRule( action( 6012 ), "controlMode = 'eTaper'", QtxPopupMgr::ToggleRule ); + aSubId = popupMgr()->insert( tr( "MEN_FACE_CTRL" ), anId, -1 ); // FACE CONTROLS - popupMgr()->insert( action( 6013 ), anId, -1 ); // ASPECT - popupMgr()->setRule( action( 6013 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); - popupMgr()->setRule( action( 6013 ), "controlMode = 'eAspectRatio'", QtxPopupMgr::ToggleRule ); - - popupMgr()->insert( action( 6014 ), anId, -1 ); // MIN_ANG - popupMgr()->setRule( action( 6014 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); - popupMgr()->setRule( action( 6014 ), "controlMode = 'eMinimumAngle'", QtxPopupMgr::ToggleRule ); - - popupMgr()->insert( action( 6015 ), anId, -1 ); // WARP - popupMgr()->setRule( action( 6015 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); - popupMgr()->setRule( action( 6015 ), "controlMode = 'eWarping'", QtxPopupMgr::ToggleRule ); - - popupMgr()->insert( action( 6016 ), anId, -1 ); // SKEW - popupMgr()->setRule( action( 6016 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); - popupMgr()->setRule( action( 6016 ), "controlMode = 'eSkew'", QtxPopupMgr::ToggleRule ); - - popupMgr()->insert( separator(), anId, -1 ); - - popupMgr()->insert( action( 6017 ), anId, -1 ); // ASPECT_3D - popupMgr()->setRule( action( 6017 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule ); - popupMgr()->setRule( action( 6017 ), "controlMode = 'eAspectRatio3D'", QtxPopupMgr::ToggleRule ); - - popupMgr()->insert ( action( 6009 ), anId, -1 ); // VOLUME_3D - popupMgr()->setRule( action( 6009 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule ); - popupMgr()->setRule( action( 6009 ), "controlMode = 'eVolume3D'", QtxPopupMgr::ToggleRule ); - - popupMgr()->insert( action( 6021 ), anId, -1 ); // FREE_FACE + popupMgr()->insert( action( 6021 ), aSubId, -1 ); // FREE_FACE popupMgr()->setRule( action( 6021 ), aMeshInVtkHasFaces /*aMeshInVtkHasVolumes*/, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( 6021 ), "controlMode = 'eFreeFaces'", QtxPopupMgr::ToggleRule ); + popupMgr()->insert( action( 6018 ), aSubId, -1 ); // LENGTH_2D + popupMgr()->setRule( action( 6018 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6018 ), "controlMode = 'eLength2D'", QtxPopupMgr::ToggleRule ); + + popupMgr()->insert( action( 6019 ), aSubId, -1 ); // CONNECTION_2D + popupMgr()->setRule( action( 6019 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6019 ), "controlMode = 'eMultiConnection2D'", QtxPopupMgr::ToggleRule ); + + popupMgr()->insert( action( 6011 ), aSubId, -1 ); // AREA + popupMgr()->setRule( action( 6011 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6011 ), "controlMode = 'eArea'", QtxPopupMgr::ToggleRule ); + + popupMgr()->insert( action( 6012 ), aSubId, -1 ); // TAPER + popupMgr()->setRule( action( 6012 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6012 ), "controlMode = 'eTaper'", QtxPopupMgr::ToggleRule ); + + popupMgr()->insert( action( 6013 ), aSubId, -1 ); // ASPECT + popupMgr()->setRule( action( 6013 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6013 ), "controlMode = 'eAspectRatio'", QtxPopupMgr::ToggleRule ); + + popupMgr()->insert( action( 6014 ), aSubId, -1 ); // MIN_ANG + popupMgr()->setRule( action( 6014 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6014 ), "controlMode = 'eMinimumAngle'", QtxPopupMgr::ToggleRule ); + + popupMgr()->insert( action( 6015 ), aSubId, -1 ); // WARP + popupMgr()->setRule( action( 6015 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6015 ), "controlMode = 'eWarping'", QtxPopupMgr::ToggleRule ); + + popupMgr()->insert( action( 6016 ), aSubId, -1 ); // SKEW + popupMgr()->setRule( action( 6016 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6016 ), "controlMode = 'eSkew'", QtxPopupMgr::ToggleRule ); + + popupMgr()->insert( action( 6022 ), aSubId, -1 ); // MAX_ELEMENT_LENGTH_2D + popupMgr()->setRule( action( 6022 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6022 ), "controlMode = 'eMaxElementLength2D'", QtxPopupMgr::ToggleRule ); + + aSubId = popupMgr()->insert( tr( "MEN_VOLUME_CTRL" ), anId, -1 ); // VOLUME CONTROLS + + popupMgr()->insert( action( 6017 ), aSubId, -1 ); // ASPECT_3D + popupMgr()->setRule( action( 6017 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6017 ), "controlMode = 'eAspectRatio3D'", QtxPopupMgr::ToggleRule ); + + popupMgr()->insert ( action( 6009 ), aSubId, -1 ); // VOLUME_3D + popupMgr()->setRule( action( 6009 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6009 ), "controlMode = 'eVolume3D'", QtxPopupMgr::ToggleRule ); + + popupMgr()->insert( action( 6023 ), aSubId, -1 ); // MAX_ELEMENT_LENGTH_3D + popupMgr()->setRule( action( 6023 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( 6023 ), "controlMode = 'eMaxElementLength3D'", QtxPopupMgr::ToggleRule ); + popupMgr()->insert( separator(), anId, -1 ); popupMgr()->insert( action( 201 ), anId, -1 ); // SCALAR_BAR_PROP diff --git a/src/SMESHGUI/SMESHGUI_FilterDlg.cxx b/src/SMESHGUI/SMESHGUI_FilterDlg.cxx index 2ae183e74..bf1e387ea 100755 --- a/src/SMESHGUI/SMESHGUI_FilterDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_FilterDlg.cxx @@ -1363,6 +1363,8 @@ const char* SMESHGUI_FilterTable::getPrecision( const int aType ) retval = "len_tol_precision"; break; case SMESH::FT_Length: case SMESH::FT_Length2D: + case SMESH::FT_MaxElementLength2D: + case SMESH::FT_MaxElementLength3D: retval = "length_precision"; break; case SMESH::FT_Volume3D: retval = "vol_precision"; break; @@ -1776,6 +1778,7 @@ const QMap& SMESHGUI_FilterTable::getCriteria (const int theType) aCriteria[ SMESH::FT_Taper ] = tr("TAPER"); aCriteria[ SMESH::FT_Skew ] = tr("SKEW"); aCriteria[ SMESH::FT_Area ] = tr("AREA"); + aCriteria[ SMESH::FT_MaxElementLength2D ] = tr("MAX_ELEMENT_LENGTH_2D"); aCriteria[ SMESH::FT_FreeEdges ] = tr("FREE_EDGES"); aCriteria[ SMESH::FT_RangeOfIds ] = tr("RANGE_OF_IDS"); aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM"); @@ -1797,14 +1800,15 @@ const QMap& SMESHGUI_FilterTable::getCriteria (const int theType) static QMap aCriteria; if (aCriteria.isEmpty()) { - aCriteria[ SMESH::FT_AspectRatio3D ] = tr("ASPECT_RATIO_3D"); - aCriteria[ SMESH::FT_RangeOfIds ] = tr("RANGE_OF_IDS"); - aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM"); - aCriteria[ SMESH::FT_LyingOnGeom ] = tr("LYING_ON_GEOM"); - aCriteria[ SMESH::FT_BadOrientedVolume ] = tr("BAD_ORIENTED_VOLUME"); - aCriteria[ SMESH::FT_Volume3D ] = tr("VOLUME_3D"); - aCriteria[ SMESH::FT_LinearOrQuadratic ] = tr("LINEAR"); - aCriteria[ SMESH::FT_GroupColor ] = tr("GROUP_COLOR"); + aCriteria[ SMESH::FT_AspectRatio3D ] = tr("ASPECT_RATIO_3D"); + aCriteria[ SMESH::FT_RangeOfIds ] = tr("RANGE_OF_IDS"); + aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM"); + aCriteria[ SMESH::FT_LyingOnGeom ] = tr("LYING_ON_GEOM"); + aCriteria[ SMESH::FT_BadOrientedVolume ] = tr("BAD_ORIENTED_VOLUME"); + aCriteria[ SMESH::FT_Volume3D ] = tr("VOLUME_3D"); + aCriteria[ SMESH::FT_MaxElementLength3D ] = tr("MAX_ELEMENT_LENGTH_3D"); + aCriteria[ SMESH::FT_LinearOrQuadratic ] = tr("LINEAR"); + aCriteria[ SMESH::FT_GroupColor ] = tr("GROUP_COLOR"); aCriteria[ SMESH::FT_ElemGeomType ] = tr("GEOM_TYPE"); } return aCriteria; diff --git a/src/SMESHGUI/SMESHGUI_Selection.cxx b/src/SMESHGUI/SMESHGUI_Selection.cxx index 887cdea08..15ca322b5 100644 --- a/src/SMESHGUI/SMESHGUI_Selection.cxx +++ b/src/SMESHGUI/SMESHGUI_Selection.cxx @@ -271,6 +271,8 @@ QString SMESHGUI_Selection::controlMode( int ind ) const case SMESH_Actor::eMultiConnection2D: return "eMultiConnection2D"; case SMESH_Actor::eArea: return "eArea"; case SMESH_Actor::eVolume3D: return "eVolume3D"; + case SMESH_Actor::eMaxElementLength2D: return "eMaxElementLength2D"; + case SMESH_Actor::eMaxElementLength3D: return "eMaxElementLength3D"; case SMESH_Actor::eTaper: return "eTaper"; case SMESH_Actor::eAspectRatio: return "eAspectRatio"; case SMESH_Actor::eAspectRatio3D: return "eAspectRatio3D"; diff --git a/src/SMESHGUI/SMESH_images.ts b/src/SMESHGUI/SMESH_images.ts index c22f4e96e..8028ea25b 100644 --- a/src/SMESHGUI/SMESH_images.ts +++ b/src/SMESHGUI/SMESH_images.ts @@ -289,6 +289,14 @@ ICON_MAP mesh_pattern.png + + ICON_MAX_ELEMENT_LENGTH_2D + mesh_max_element_length_2d.png + + + ICON_MAX_ELEMENT_LENGTH_3D + mesh_max_element_length_3d.png + ICON_OBJBROWSER_SMESH mesh.png diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index 4a3a32e3f..ef56941d2 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -107,6 +107,14 @@ LOCAL_ALGO Local + + MAX_ELEMENT_LENGTH_2D + Max Element Length 2D + + + MAX_ELEMENT_LENGTH_3D + Max Element Length 3D + MEN_ADD Add @@ -207,6 +215,22 @@ MEN_CTRL Controls + + MEN_NODE_CTRL + Node Controls + + + MEN_EDGE_CTRL + Edge Controls + + + MEN_FACE_CTRL + Face Controls + + + MEN_VOLUME_CTRL + Volume Controls + MEN_CUT Cutting of Quadrangles @@ -387,6 +411,14 @@ MEN_MAP Pattern Mapping + + MEN_MAX_ELEMENT_LENGTH_2D + Max Element Length 2D + + + MEN_MAX_ELEMENT_LENGTH_3D + Max Element Length 3D + MEN_MED MED file @@ -2344,6 +2376,14 @@ Consider saving your work before application crash STB_MAP Pattern mapping + + STB_MAX_ELEMENT_LENGTH_2D + Max Element Length 2D + + + STB_MAX_ELEMENT_LENGTH_3D + Max Element Length 3D + STB_MED Import MED file @@ -2864,6 +2904,14 @@ Consider saving your work before application crash TOP_MAP Pattern mapping + + TOP_MAX_ELEMENT_LENGTH_2D + Max Element Length 2D + + + TOP_MAX_ELEMENT_LENGTH_3D + Max Element Length 3D + TOP_MED Import MED file @@ -4204,6 +4252,14 @@ Please enter correct value and try again LYING_ON_GEOM Lying on Geom + + MAX_ELEMENT_LENGTH_2D + Max Element Length 2D + + + MAX_ELEMENT_LENGTH_3D + Max Element Length 3D + MINIMUM_ANGLE Minimum angle diff --git a/src/SMESH_I/SMESH_DumpPython.cxx b/src/SMESH_I/SMESH_DumpPython.cxx index 91aaa656e..44a848a35 100644 --- a/src/SMESH_I/SMESH_DumpPython.cxx +++ b/src/SMESH_I/SMESH_DumpPython.cxx @@ -274,6 +274,8 @@ namespace SMESH case FT_Skew: myStream<< "aSkew"; break; case FT_Area: myStream<< "aArea"; break; case FT_Volume3D: myStream<< "aVolume3D"; break; + case FT_MaxElementLength2D:myStream<< "aMaxElementLength2D";break; + case FT_MaxElementLength3D:myStream<< "aMaxElementLength3D";break; case FT_FreeBorders: myStream<< "aFreeBorders"; break; case FT_FreeEdges: myStream<< "aFreeEdges"; break; case FT_FreeNodes: myStream<< "aFreeNodes"; break; diff --git a/src/SMESH_I/SMESH_Filter_i.cxx b/src/SMESH_I/SMESH_Filter_i.cxx index c878c2db0..4410a2d24 100644 --- a/src/SMESH_I/SMESH_Filter_i.cxx +++ b/src/SMESH_I/SMESH_Filter_i.cxx @@ -760,6 +760,36 @@ FunctorType Volume3D_i::GetFunctorType() return SMESH::FT_Volume3D; } +/* + Class : MaxElementLength2D_i + Description : Functor for calculating maximum length of 2D element +*/ +MaxElementLength2D_i::MaxElementLength2D_i() +{ + myNumericalFunctorPtr.reset( new Controls::MaxElementLength2D() ); + myFunctorPtr = myNumericalFunctorPtr; +} + +FunctorType MaxElementLength2D_i::GetFunctorType() +{ + return SMESH::FT_MaxElementLength2D; +} + +/* + Class : MaxElementLength3D_i + Description : Functor for calculating maximum length of 3D element +*/ +MaxElementLength3D_i::MaxElementLength3D_i() +{ + myNumericalFunctorPtr.reset( new Controls::MaxElementLength3D() ); + myFunctorPtr = myNumericalFunctorPtr; +} + +FunctorType MaxElementLength3D_i::GetFunctorType() +{ + return SMESH::FT_MaxElementLength3D; +} + /* Class : Length_i Description : Functor for calculating length off edge @@ -1817,6 +1847,24 @@ Volume3D_ptr FilterManager_i::CreateVolume3D() } +MaxElementLength2D_ptr FilterManager_i::CreateMaxElementLength2D() +{ + SMESH::MaxElementLength2D_i* aServant = new SMESH::MaxElementLength2D_i(); + SMESH::MaxElementLength2D_var anObj = aServant->_this(); + TPythonDump()<_this(); + TPythonDump()<CreateVolume3D(); break; + case SMESH::FT_MaxElementLength2D: + aFunctor = aFilterMgr->CreateMaxElementLength2D(); + break; + case SMESH::FT_MaxElementLength3D: + aFunctor = aFilterMgr->CreateMaxElementLength3D(); + break; // Predicates @@ -2817,6 +2871,8 @@ static inline LDOMString toString( CORBA::Long theType ) case FT_Skew : return "Skew"; case FT_Area : return "Area"; case FT_Volume3D : return "Volume3D"; + case FT_MaxElementLength2D: return "Max element length 2D"; + case FT_MaxElementLength3D: return "Max element length 3D"; case FT_BelongToGeom : return "Belong to Geom"; case FT_BelongToPlane : return "Belong to Plane"; case FT_BelongToCylinder: return "Belong to Cylinder"; @@ -2859,6 +2915,8 @@ static inline SMESH::FunctorType toFunctorType( const LDOMString& theStr ) else if ( theStr.equals( "Skew" ) ) return FT_Skew; else if ( theStr.equals( "Area" ) ) return FT_Area; else if ( theStr.equals( "Volume3D" ) ) return FT_Volume3D; + else if ( theStr.equals( "Max element length 2D" ) ) return FT_MaxElementLength2D; + else if ( theStr.equals( "Max element length 3D" ) ) return FT_MaxElementLength3D; else if ( theStr.equals( "Belong to Geom" ) ) return FT_BelongToGeom; else if ( theStr.equals( "Belong to Plane" ) ) return FT_BelongToPlane; else if ( theStr.equals( "Belong to Cylinder" ) ) return FT_BelongToCylinder; diff --git a/src/SMESH_I/SMESH_Filter_i.hxx b/src/SMESH_I/SMESH_Filter_i.hxx index 91fa638b7..accb90035 100644 --- a/src/SMESH_I/SMESH_Filter_i.hxx +++ b/src/SMESH_I/SMESH_Filter_i.hxx @@ -271,6 +271,32 @@ namespace SMESH }; + /* + Class : MaxElementLength2D_i + Description : Functor for calculating maximum length of 2D element + */ + class SMESH_I_EXPORT MaxElementLength2D_i: public virtual POA_SMESH::MaxElementLength2D, + public virtual NumericalFunctor_i + { + public: + MaxElementLength2D_i(); + FunctorType GetFunctorType(); + }; + + + /* + Class : MaxElementLength3D_i + Description : Functor for calculating maximum length of 3D element + */ + class SMESH_I_EXPORT MaxElementLength3D_i: public virtual POA_SMESH::MaxElementLength3D, + public virtual NumericalFunctor_i + { + public: + MaxElementLength3D_i(); + FunctorType GetFunctorType(); + }; + + /* Class : Length_i Description : Functor for calculating length of edge @@ -891,6 +917,8 @@ namespace SMESH Skew_ptr CreateSkew(); Area_ptr CreateArea(); Volume3D_ptr CreateVolume3D(); + MaxElementLength2D_ptr CreateMaxElementLength2D(); + MaxElementLength3D_ptr CreateMaxElementLength3D(); Length_ptr CreateLength(); Length2D_ptr CreateLength2D(); MultiConnection_ptr CreateMultiConnection(); diff --git a/src/SMESH_SWIG/SMESH_controls.py b/src/SMESH_SWIG/SMESH_controls.py index 43c1b5874..8cde5ac61 100644 --- a/src/SMESH_SWIG/SMESH_controls.py +++ b/src/SMESH_SWIG/SMESH_controls.py @@ -128,4 +128,16 @@ print "Criterion: Borders at multi-connections = 2 Nb = ", len( anIds ) #print anIds[ i ] +# Criterion : Max Element Length 2D > 10 + +# create group +aGroup = mesh.MakeGroup("Max Element Length 2D > 10", smesh.FACE, smesh.FT_MaxElementLength2D, smesh.FT_MoreThan, 10 ) + +# print result +anIds = aGroup.GetIDs() +print "Criterion: Max Element Length 2D > 10 Nb = ", len( anIds ) +#for i in range( len( anIds ) ): + #print anIds[ i ] + + salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/smeshDC.py b/src/SMESH_SWIG/smeshDC.py index 7fcb7e101..10b0bf163 100644 --- a/src/SMESH_SWIG/smeshDC.py +++ b/src/SMESH_SWIG/smeshDC.py @@ -866,6 +866,10 @@ class smeshDC(SMESH._objref_SMESH_Gen): return aFilterMgr.CreateArea() elif theCriterion == FT_Volume3D: return aFilterMgr.CreateVolume3D() + elif theCriterion == FT_MaxElementLength2D: + return aFilterMgr.CreateMaxElementLength2D() + elif theCriterion == FT_MaxElementLength3D: + return aFilterMgr.CreateMaxElementLength3D() elif theCriterion == FT_MultiConnection: return aFilterMgr.CreateMultiConnection() elif theCriterion == FT_MultiConnection2D: @@ -3823,6 +3827,17 @@ class Mesh: def GetVolume(self, elemId): return self._valueFromFunctor(SMESH.FT_Volume3D, elemId) + ## Get maximum element length. + # @param elemId mesh element ID + # @return element's maximum length value + # @ingroup l1_measurements + def GetMaxElementLength(self, elemId): + if self.GetElementType(elemId, True) == SMESH.VOLUME: + ftype = SMESH.FT_MaxElementLength3D + else: + ftype = SMESH.FT_MaxElementLength2D + return self._valueFromFunctor(ftype, elemId) + ## Get aspect ratio of 2D or 3D element. # @param elemId mesh element ID # @return element's aspect ratio value