From: vsr Date: Wed, 18 Dec 2013 15:08:18 +0000 (+0000) Subject: Merge from V7_3_BR branch 18/12/2013 X-Git-Tag: V7_4_0a1~115 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=2cd148d0668de3bfbeeceeb7df1995bb5b39475b;p=modules%2Fsmesh.git Merge from V7_3_BR branch 18/12/2013 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 46691a655..2f1abc23c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,7 @@ CMAKE_POLICY(SET CMP0003 NEW) STRING(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UC) SET(${PROJECT_NAME_UC}_MAJOR_VERSION 7) -SET(${PROJECT_NAME_UC}_MINOR_VERSION 2) +SET(${PROJECT_NAME_UC}_MINOR_VERSION 3) SET(${PROJECT_NAME_UC}_PATCH_VERSION 0) SET(${PROJECT_NAME_UC}_VERSION ${${PROJECT_NAME_UC}_MAJOR_VERSION}.${${PROJECT_NAME_UC}_MINOR_VERSION}.${${PROJECT_NAME_UC}_PATCH_VERSION}) diff --git a/doc/salome/gui/SMESH/input/1d_meshing_hypo.doc b/doc/salome/gui/SMESH/input/1d_meshing_hypo.doc index 5deb1344a..470fe0c4d 100644 --- a/doc/salome/gui/SMESH/input/1d_meshing_hypo.doc +++ b/doc/salome/gui/SMESH/input/1d_meshing_hypo.doc @@ -20,22 +20,21 @@

Adaptive hypothesis

Adaptive hypothesis allows to split edges into segments with a -length that depends on curvature of edges and faces and is limited -from up and down. In addition length of a segment depends on lengths -of adjacent segments (that can't differ more than twice) and on +length that depends on the curvature of edges and faces and is limited by Min. Size +and Max Size. The length of a segment also depends on the lengths +of adjacent segments (that can't differ more than twice) and on the distance to close geometrical entities (edges and faces) to avoid creation of narrow 2D elements. \image html adaptive1d.png -Min size parameter limits minimal segment size. Max size -parameter defines length of segments on stright edges. \b Deflection -parameter gives maximal distance of a segment from a curved edge. +- Min size parameter limits the minimal segment size. +- Max size parameter defines the length of segments on straight edges. +- \b Deflection parameter gives maximal distance of a segment from a curved edge. -\image html adaptive1d_sample_mesh.png "A geometry and a mesh generated on this geometry using Adaptive hypothesis and Netgen 2D algorithm - the size of mesh segments reflects size of geometrical features" +\image html adaptive1d_sample_mesh.png "Adaptive hypothesis and Netgen 2D algorithm - the size of mesh segments reflects the size of geometrical features" -See Also a \ref tui_1d_adaptive "sample TUI Script" that -creates the mesh of the above image. +See Also a \ref tui_1d_adaptive "sample TUI Script" that creates mesh of the above image.
\anchor arithmetic_1d_anchor diff --git a/doc/salome/gui/SMESH/input/2d_meshing_hypo.doc b/doc/salome/gui/SMESH/input/2d_meshing_hypo.doc index c5095b1bf..38efc810c 100644 --- a/doc/salome/gui/SMESH/input/2d_meshing_hypo.doc +++ b/doc/salome/gui/SMESH/input/2d_meshing_hypo.doc @@ -2,14 +2,10 @@ \page a2d_meshing_hypo_page 2D Meshing Hypotheses -
- +- \ref max_element_area_anchor "Max Element Area" +- \ref length_from_edges_anchor "Length from Edges" +- \ref hypo_quad_params_anchor "Quadrangle parameters" -
\anchor max_element_area_anchor

Max Element Area

@@ -25,10 +21,8 @@ which will compose the mesh of these faces. \image html max_el_area.png "In this example, Max. element area is very small compared to the 1D hypothesis" See Also a sample TUI Script of a -\ref tui_max_element_area "Maximum Element Area" hypothesis -operation. +\ref tui_max_element_area "Maximum Element Area" hypothesis operation. -
\anchor length_from_edges_anchor

Length from Edges

@@ -39,7 +33,6 @@ of a given face. See Also a sample TUI Script of a \ref tui_length_from_edges "Length from Edges" hypothesis operation. -
\anchor hypo_quad_params_anchor

Quadrangle parameters

@@ -72,37 +65,34 @@ shows the good (left) and the bad (right) results of meshing. segments on opposite sides to define the algorithm of transition between them. The following types are available: - + the transition area is located along the coarser meshed sides. +- Reduced type forces building only quadrangles and the transition + between the sides is made gradually, layer by layer. This type has + a limitation on the number of segments: one pair of opposite sides must have + the same number of segments, the other pair must have an even difference + between the numbers of segments on the sides. In addition, the number + of rows between sides with different discretization + should be enough for the transition. Following the fastest transition + pattern, three segments become one (see the image below), hence + the least number of face rows needed to reduce from Nmax segments + to Nmin segments is log3( Nmax / Nmin ). The number of + face rows is equal to the number of segments on each of equally + discretized sides. + \image html reduce_three_to_one.png "The fastest transition pattern: 3 to 1" See Also a sample TUI Script of a \ref tui_quadrangle_parameters "Quadrangle Parameters" hypothesis. diff --git a/doc/salome/gui/SMESH/input/clipping.doc b/doc/salome/gui/SMESH/input/clipping.doc index 6be9878e9..f28b88001 100644 --- a/doc/salome/gui/SMESH/input/clipping.doc +++ b/doc/salome/gui/SMESH/input/clipping.doc @@ -2,27 +2,26 @@ \page clipping_page Clipping -\n Using this menu you can create cross-section views (clipping planes) +\b Clipping allows creating cross-section views (clipping planes) of your mesh. -To start, click on the \em New button. +It is available as a sub-item in the context menu of an active mesh. -Now you must specify what mode of creating plane you want to choose: -absolute or relative. +To create a clipping plane, click on the \b New button in the dialog and choose how it is defined: by \b Absolute or \b Relative coordinates. -Absolute mode +Absolute Coordinates \image html Clipping_Absolute.png -- Base point - allows to define the coordinates of the base +- Base point - allows defining the coordinates of the base point for the clipping plane. - Reset - returns the base point to coordinate origin. -- Direction - allows to define the orientation of the +- Direction - allows defining the orientation of the clipping plane. - - Invert - allows to select which part of the object will be + - Invert - allows selecting, which part of the object will be removed and which will remain after clipping. Relative mode @@ -30,42 +29,34 @@ absolute or relative. \image html Clipping_Relative.png - \b Orientation ( ||X-Y, ||X-Z or ||Y-Z). + - \b Distance between the opposite extremities of the boundary box of selected objects, if it is set to 0.5 the boundary box is split in two halves. + - \b Rotation (in angle degrees) around X (Y to Z) and around Y (X to Z) (depending on the chosen Orientation) -The parameters of cross-section: - -List of meshes, sub-meshes and groups to which the cross-section will be applied. - -Select all button allows to select and deselect all available -objects at once. - -If the Show preview button is on, you can see the clipping plane -in the 3D Viewer. +\image html before_clipping_preview.png "The preview plane and the cut object" -\image html before_clipping.png "The plane and the cut object" +The other parameters are available in both modes : -Also there the possibility to interact directly with the clipping plane in 3D -view with mouse. User can change the parameters of clipping plane by dialog data -or by hand. +- OpenGL clipping check-box allows choosing OpenGL native clipping, which clips the whole presentation. If it is unchecked, the clipping is done on the dataset i.e. only the visibility of separate mesh cells is changed (see the examples). +- The List contains Meshes, sub-meshes and groups to which the cross-section will be applied. +- Select all check-box allows to selecting and deselecting all available objects at once. +- Show preview check-box shows the clipping plane in the 3D Viewer. +- Auto Apply check-box shows button is on, you can preview the +cross-section in the 3D Viewer. -\image html before_clipping_preview.png "The preview plane and the cut object" +It is also possible to interact with the clipping plane directly in 3D +view using the mouse. -If the Auto Apply button is on, you can preview the -cross-section in the 3D Viewer. +To get a new object from \b Clipping, click \b Apply. -Also, it is possible to specify the type of clipping: using dataset, -i.e. it only changes the visibility of separate mesh cells or alternative -clipping - an OpenGL native one, which clips overall presentation. -For choosing use OpenGL clipping checkbox. +Examples: \image html dataset_clipping.png "The cross-section using dataset" - \image html opengl_clipping.png "The OpenGL cross-section" -To get a new object from \b Clipping, click \b Apply. */ diff --git a/doc/salome/gui/SMESH/input/constructing_meshes.doc b/doc/salome/gui/SMESH/input/constructing_meshes.doc index 2255641b3..0671f8909 100644 --- a/doc/salome/gui/SMESH/input/constructing_meshes.doc +++ b/doc/salome/gui/SMESH/input/constructing_meshes.doc @@ -314,8 +314,8 @@ or/and hidden by other mesh elements. They can be seen after switching the mesh to Wireframe visualization mode or switching off the visualization of faces and volumes (if any). -Bad Mesh to Group button creates groups of the bad mesh entities, -thus allowing you for more comfortable analysis of these entities. +Bad Mesh to Group button creates groups of bad mesh entities +to facilitate their analysis. \image html show_bad_mesh.png Edges bounding a hole in the surface are shown in magenta using Show @@ -341,8 +341,8 @@ this, there exist two algorithms: Use existing edges and Use For example, you want to use standard algorithms to generate 1D and 3D meshes and to create 2D mesh by your python code. Then you
    -
  1. create a mesh object, assign an 1D algorithm,
  2. -
  3. invoke \b Compute command, which computes an 1D mesh,
  4. +
  5. create a mesh object, assign a 1D algorithm,
  6. +
  7. invoke \b Compute command, which computes a 1D mesh,
  8. assign Use existing faces and a 3D algorithm,
  9. run your python code, which creates a 2D mesh,
  10. invoke \b Compute command, which computes a 3D mesh.
  11. diff --git a/doc/salome/gui/SMESH/input/cutting_quadrangles.doc b/doc/salome/gui/SMESH/input/cutting_quadrangles.doc index 52b3b1ea6..222ea8379 100644 --- a/doc/salome/gui/SMESH/input/cutting_quadrangles.doc +++ b/doc/salome/gui/SMESH/input/cutting_quadrangles.doc @@ -2,13 +2,13 @@ \page cutting_quadrangles_page Cutting quadrangles -\n This operation allows cutting one or several quadrangle elements -into two or four triangles. +This operation allows cutting one or several quadrangle elements into two or four triangles. To cut quadrangles: -
      -
    1. Display a mesh, a 2D sub-mesh or a group of faces in the 3D viewer.
    2. -
    3. In the \b Modification menu select the Cutting of quadrangles item or + +1) Display a mesh, a 2D sub-mesh or a group of faces in the 3D viewer. + +2) In the \b Modification menu select the Cutting of quadrangles item or click "Cutting of quadrangles" button in the toolbar. \image html image82.png @@ -18,50 +18,27 @@ The following dialog box will appear: \image html a-cuttingofquadrangles.png -
        -
      • The main list contains the list of quadrangles selected for cutting. You can - click on an quadrangle in the 3D viewer and it will be highlighted (lock Shift - keyboard button to select several quadrangles). Click \b Add button and the ID of - this quadrangle will be added to the list. To remove a selected element or elements - from the list click \b Remove button. Sort list button allows to sort the - list of IDs. \b Filter button allows to apply a definite filter to the selection of - quadrangles.
      • -
      • Apply to all check box allows to cut all quadrangles of the selected mesh, - sub-mesh or group.
      • -
      • \b Preview provides a preview of cutting in the viewer. It is disabled for Cut - into 4 triangles as this cutting way implies no ambiguity.
      • -
      - -
        -
      • \b Criterion defines a cutting way. -
          -
        • Cut into 4 triangles selects cutting the quadrangle into four triangles by - inserting a new node at the center of quadrangle. The other options selects cutting - the quadrangle into two triangles by connecting nodes of either of the two diagonals. -
        • Use diagonal 1-3 and Use diagonal 2-4 allows to specify the - opposite corners which will be connected to form two new triangles.
        • -
        • Use numeric functor allows to choose a quality metric which will be - optimized when choosing a diagonal for cutting a quadrangle. -
            -
          • Minimum diagonal cuts by the shortest diagonal.
          • -
          • Aspect Ratio cuts by the diagonal splitting the quadrangle into - triangles with \ref aspect_ratio_page "Aspect Ratio" closer to 1.
          • -
          • Minimum Angle cuts by the diagonal splitting the quadrangle into - triangles with \ref minimum_angle_page "Minimum Angle" closer to 60 - degrees.
          • -
          • Skew cuts by the diagonal splitting the quadrangle into triangles - with \ref skew_page "Skew" closer to 0.0 degrees.
          • -
          -
        • -
        -
      • -
      • Select from allows to choose a sub-mesh or an existing group whose - quadrangle elements will be automatically added to the main list.
      • -
      -
    4. -
    5. Click the \b Apply or Apply and Close button to confirm the operation.
    6. -
    +- The main list contains the list of quadrangles selected for cutting. You can +click on a quadrangle in the 3D viewer and it will be highlighted (lock Shift +keyboard button to select several quadrangles): + - Click \b Add button and the ID of this quadrangle will be added to the list. + - To remove a selected element or elements from the list click \b Remove button. + - Sort list button allows sorting the list of IDs. + - \b Filter button allows applying a definite filter to the selection of quadrangles. +- Apply to all check box allows cutting all quadrangles of the selected mesh, sub-mesh or group. +- \b Preview provides a preview of cutting in the viewer. It is disabled for Cut into 4 triangles as this cutting way implies no ambiguity. +- \b Criterion defines the way of cutting: + - Cut into 4 triangles allows cutting a quadrangle into four triangles by inserting a new node at the center of the quadrangle. The other options allow cutting a quadrangle into two triangles by connecting the nodes of a diagonal. + - Use diagonal 1-3 and Use diagonal 2-4 allow specifying the opposite corners, which will be connected to form two new triangles. + - Use numeric functor allows selecting in the field below a quality metric, which will be optimized when choosing a diagonal for cutting a quadrangle: + - Minimum diagonal cuts by the shortest diagonal. + - Aspect Ratio cuts by the diagonal splitting the quadrangle into triangles with \ref aspect_ratio_page "Aspect Ratio" closer to 1 + - Minimum Angle cuts by the diagonal splitting the quadrangle into triangles with \ref minimum_angle_page "Minimum Angle" closer to 60 degrees. + - Skew cuts by the diagonal splitting the quadrangle into triangles with \ref skew_page "Skew" closer to 0.0 degrees. +- Select from allows choosing a sub-mesh or an existing group, whose quadrangle elements will be automatically added to the main list. + +3) Click the \b Apply or Apply and Close button to confirm the operation. \image html image52.jpg "The chosen quadrangular element" diff --git a/doc/salome/gui/SMESH/input/double_nodes_page.doc b/doc/salome/gui/SMESH/input/double_nodes_page.doc index 0c4c1eb2c..817a7e40a 100644 --- a/doc/salome/gui/SMESH/input/double_nodes_page.doc +++ b/doc/salome/gui/SMESH/input/double_nodes_page.doc @@ -2,8 +2,8 @@ \page double_nodes_page Duplicate Nodes or/and Elements -\n This operation allows to duplicate nodes or/and elements of your mesh. -Duplication of nodes can be useful to emulate a crack in the model. +\n This operation allows duplicating mesh nodes or/and elements, which can be useful to emulate a crack in the model. + Duplication consists in creation of mesh element "equal" to existing ones. To duplicate nodes or/and elements: @@ -31,9 +31,8 @@ Duplication consists in creation of mesh element "equal" to existing ones.
    \anchor mode_without_elem_anchor -

    Duplicate nodes only

    -In this mode the dialog looks like: +

    Duplicate nodes only

    \image html duplicate01.png @@ -42,28 +41,26 @@ Parameters to be defined in this mode:
  12. Group of nodes to duplicate (mandatory): these nodes will be duplicated.
  13. Group of elements to replace nodes with new ones - (optional): the new nodes will replace the nodes to - duplicate within these elements.
  14. + (optional): the new nodes will replace the duplicated nodes within these elements.
  15. Construct group with newly created nodes option - (checked by default): if checked - the group with just + (checked by default): if checked - the group with newly created nodes will be built.
  16. -A schema below explains the crack emulation using the node duplication. +A schema below illustrates how the crack is emulated using the node duplication. \image html crack_emulation_double_nodes.png "Crack emulation" This schema shows a virtual crack in a 2D mesh created using this duplication -mode. In this schema: -- Black balls are nodes to duplicate. +mode: +- Black balls are duplicated nodes. - Red balls are new nodes. - Elements to replace nodes with new ones are marked with green. -Note that in reality nodes to duplicate coincide with new nodes. - +Note that in the reality duplicated nodes coincide with new nodes.
    \anchor mode_with_elem_anchor -

    Duplicate nodes and border elements

    -In this mode the dialog looks like: + +

    Duplicate nodes and border elements

    \image html duplicate02.png @@ -77,10 +74,10 @@ Parameters to be defined in this mode: (mandatory): the new nodes will replace the nodes to duplicate within these elements.
  17. Construct group with newly created elements option - (checked by default): if checked - the group of just created + (checked by default): if checked - the group of newly created elements will be built.
  18. Construct group with newly created nodes option - (checked by default): if checked - the group of just + (checked by default): if checked - the group of newly created nodes will be built.
  19. @@ -89,15 +86,14 @@ with border elements. \image html crack_emulation_double_nodes_with_elems.png "Crack emulation" This schema shows a virtual crack in a 2D mesh created using this duplication mode. In this schema: -- Black segments are elements to duplicate (edges in 2D case). -- Black balls (except the lowest one) are nodes of elements to - duplicate that are duplicated. -- The lowest black ball is a node not to duplicate. -- Red balls are creates nodes. +- Black segments are duplicated elements (edges in 2D case). +- Black balls (except for the lowest one) are duplicated nodes of duplicated elements. +- The lowest black ball is the non-duplicated node. +- Red balls are newly created nodes. - Red segments are created elements (edges). - Elements to replace nodes with new ones are marked with green. -Note that in reality nodes to duplicate coincide with new nodes. +Note that in the reality nodes to duplicate coincide with new nodes.
    In a 3D case, where elements to duplicate are faces, the edges located at the "crack" (if any) are cloned automatically. @@ -106,24 +102,22 @@ located at the "crack" (if any) are cloned automatically. \anchor mode_elem_only_anchor

    Duplicate elements only

    -This mode just duplicates given elements, i.e. creates new elements on -the same nodes as the given elements. +This mode duplicates the given elements, i.e. creates new elements with the same nodes as the given elements. +
    -In this mode the dialog looks like: + \image html duplicate03.png -Parameters to be defined in this mode:
    • Group of elements to duplicate (mandatory): these elements will be duplicated.
    • Construct group with newly created elements option - (checked by default): if checked - the group of just created - elements will be built. A name of the created group starts from + (checked by default): if checked - the group of newly created + elements will be built. The name of the created group starts from "DoubleElements".
    -
    See Also a sample TUI Script of a \ref tui_duplicate_nodes "Duplicate nodes or/and elements" operation. diff --git a/doc/salome/gui/SMESH/input/extrusion_along_path.doc b/doc/salome/gui/SMESH/input/extrusion_along_path.doc index d58f9697f..4de60e535 100644 --- a/doc/salome/gui/SMESH/input/extrusion_along_path.doc +++ b/doc/salome/gui/SMESH/input/extrusion_along_path.doc @@ -1,8 +1,8 @@ /*! -\page extrusion_along_path_page Extrusion along a path +\page extrusion_along_path_page Extrusion along Path -\n In principle, Extrusion along a path works in the same way +\n In principle, Extrusion along Path works in the same way as \b Extrusion, the main difference is that we define not a vector, but a path of extrusion which must be a 1D mesh or 1D sub-mesh. To get an idea of how this algorithm works, examine several examples, @@ -69,7 +69,7 @@ mesh.
    The same, but using angles {45, -45, 45, -45, 45, -45, 45, -45}
    -
    To use Extrusion along a path: +
    To use Extrusion along Path:
    1. From the \b Modification menu choose the Extrusion along a path item or click "Extrusion along a path" button in the toolbar. @@ -88,25 +88,24 @@ The following dialog common for line and planar elements will appear:
    2. specify the IDs of the elements which will be extruded
        -
      • Select the whole mesh, submesh or group activating this -checkbox; or
      • -
      • choose mesh elements with the mouse in the 3D Viewer. It is +
      • Select the whole mesh, sub-mesh or group activating the corresponding check-box; or
      • +
      • Choose mesh elements with the mouse in the 3D Viewer. It is possible to select a whole area with a mouse frame; or
      • -
      • input the element IDs directly in ID Elements field. The selected elements will be highlighted in the +
      • Input the element IDs directly in ID Elements field. The selected elements will be highlighted in the viewer; or
      • apply Filters. Set filter button allows to apply a filter to the selection of elements. See more about filters in the \ref selection_filter_library_page "Selection filter library" page.
    3. -
    4. define the \b Path along which the elements will be extruded.
      +
    5. Define the \b Path along which the elements will be extruded.
      Path definition consists of several elements:
      • Mesh or submesh - 1D mesh or sub-mesh, along which proceeds the extrusion
      • Start node - the start node. It is used to define the direction of extrusion
    6. -
    7. activate Generate Groups checkbox if it is necessary to copy the groups of +
    8. Activate Generate Groups check-box if it is necessary to copy the groups of elements of the source mesh to the newly created one.
    9. @@ -119,9 +118,8 @@ curve. By default, the Base Point around which the elements are rotated i the mass center of the elements, however, you can specify any point as the Base Point and the elements will be rotated with respect to this point.
      - Note that it is the Base Point whos track exactly equals to the - path, and all the elements being extruded just keep their relative - position around the Base Point at each iteration. + Note that only the displacement of the Base Point exactly equals to the + path, and all other extruded elements simply keep their position relatively to the Base Point at each iteration.
    10. The elements can also be rotated around the path to get the resulting mesh in a helical fashion. You can set the values of angles at the diff --git a/doc/salome/gui/SMESH/input/importing_exporting_meshes.doc b/doc/salome/gui/SMESH/input/importing_exporting_meshes.doc index 6519aa16d..516981cd9 100644 --- a/doc/salome/gui/SMESH/input/importing_exporting_meshes.doc +++ b/doc/salome/gui/SMESH/input/importing_exporting_meshes.doc @@ -38,21 +38,20 @@ group as a whole mesh. \image html meshexportmesh.png -At export to MED and SAUV format files additional parameters are available. + There are additional parameters available at export to MED and SAUV format files.
      • Automatically create groups 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.
      • + "Group_On_All_Faces", etc.
      • Automatically define space dimension 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 - it is in Mesh module. The mesh can be exported as a mesh in lower - dimension in following cases, provided that this check-box is - checked. + it is in Mesh module. The mesh can be exported as a mesh of a lower + dimension in the following cases, provided that this check-box is checked:
          -
        • 1D: if all mesh nodes lie on OX coordinate axis.
        • -
        • 2D: if all mesh nodes lie on XOY coordinate plane.
        • +
        • 1D: if all mesh nodes lie on OX coordinate axis.
        • +
        • 2D: if all mesh nodes lie in XOY coordinate plane.
      diff --git a/doc/salome/gui/SMESH/input/index.doc b/doc/salome/gui/SMESH/input/index.doc index 917e540bd..9182f97be 100644 --- a/doc/salome/gui/SMESH/input/index.doc +++ b/doc/salome/gui/SMESH/input/index.doc @@ -6,7 +6,7 @@ \n \b MESH module of SALOME is destined for:
        -
      • \ref importing_exporting_meshes_page "import and export of meshes in different formats";
      • +
      • \ref importing_exporting_meshes_page "import and export of meshes in various formats";
      • \subpage about_meshes_page "meshing geometrical models" previously created or imported by the Geometry component;
      • \subpage viewing_meshes_overview_page "viewing created meshes" in @@ -18,22 +18,20 @@ allowing to highlight important elements; \subpage filters_page "Filters" functionality;
      • \subpage modifying_meshes_page "modifying meshes" with a vast array of dedicated operations;
      • -
      • different \subpage measurements_page "measurements" of the mesh objects; -
      • easily setting parameters via the variables predefined in -\subpage using_notebook_mesh_page "Salome notebook".
      • +
      • various \subpage measurements_page "measurements" of the mesh objects.
      -The possibility to sort the created sub-meshes or groups is detailed on -\subpage arranging_study_objects_page section. +It is possible to easily set parameters via the variables predefined in +\subpage using_notebook_mesh_page "Salome notebook". Mesh module preferences are described in the \subpage mesh_preferences_page section of SALOME Mesh Help. +Also, there is a possibility to \subpage arranging_study_objects_page "re-arrange sub-meshes and groups in the SALOME study". Almost all mesh module functionalities are accessible via \subpage smeshpy_interface_page "Mesh module Python interface". Other functions are available in salome.smesh python package. - \image html image7.jpg "Example of MESH module usage for engineering tasks" */ diff --git a/doc/salome/gui/SMESH/input/measurements.doc b/doc/salome/gui/SMESH/input/measurements.doc index 0787b7c20..bfedbe0c8 100644 --- a/doc/salome/gui/SMESH/input/measurements.doc +++ b/doc/salome/gui/SMESH/input/measurements.doc @@ -18,79 +18,72 @@ available, but this operation will be extended in the future to support other mesh objects - elements, meshes, sub-meshes and groups. To start Minimum Distance operation, select Minimum Distance -item from \b Measurements menu. +tab in \b Measurements dialog. \image html min_distance.png -In the dialog box choose the first target and the second target mode by +Choose the first and the second target by switching the corresponding radio buttons, then select the objects the distance between which is to be calculated (or input their IDs directly -in case of nodes/elements) and press \em Compute button. +in case of nodes/elements) and press \b Compute button. -The following types of targets are supported: -- \em Node: single mesh node; -- \em Element: single mesh element (not available in this version); -- \em Object: mesh, sub-mesh or group object (not available in this +The following targets are supported: +- \b Node: single mesh node; +- \b Element: single mesh element (not available in this version); +- \b Object: mesh, sub-mesh or group object (not available in this version); -- \em Origin: origin of the global co-ordinate system. +- \b Origin: origin of the global co-ordinate system. -The result will -be shown in the bottom area of the dialog box. In addition, a simple +The result will be shown in the bottom area of the dialog. In addition, a simple preview will be shown in the 3D viewer. \image html min_distance_preview.png \section bounding_box_anchor Bounding Box -This operation allows to calculate the bounding box of the selected +This operation allows calculating the bounding box of the selected object(s). To start Bounding Box operation, select Bounding Box -item from \b Measurements menu. +tab in \b Measurements dialog. \image html bnd_box.png -In the dialog box choose the required type of the object by switching the -corresponding radio button, select the object(s) and press \em Compute button. +Choose the required type of the object by switching the corresponding radio button, select the object(s) and press \em Compute button. The following types of input are available: -- \em Objects: select one or several mesh, sub-mesh or group objects; -- \em Nodes: select a set of mesh nodes; -- \em Elements: select a set of mesh elements. +- \b Objects: one or several mesh, sub-mesh or group objects; +- \b Nodes: a set of mesh nodes; +- \b Elements: a set of mesh elements. The result of calculation will be shown in the bottom area of the -dialog box. In addition, a simple preview will be shown in the 3D -viewer. +dialog. In addition, a simple preview will be shown in the 3D viewer. \image html bnd_box_preview.png \section basic_properties_anchor Basic Properties -This operation allows calculation of length, area or volume for the the selected -object: -- Length is calculated as a sum of length of all 1D elements; -- Area id a sum of area of all 2D elements -- Volume is a sum of volume of all 3D elements. +This operation provides calculation of length, area or volume for the the selected object: +- \b Length is calculated as a sum of lengths of all 1D elements; +- \b Area is a sum of areas of all 2D elements +- \b Volume is a sum of volumes of all 3D elements. -To start one of Basic Properties calculations, select Length, Area -or Volume item from Measurements - Basic Properties menu. +To start a Basic Properties calculation, select Length, Area or Volume item. \image html basic_props.png -In the dialog box select the required type of calculation (length, area or volume), select -the the object (mesh, sub-mesh or group) and press \em Compute button. +In the dialog box select the required type of calculation (length, area or volume) and the object (mesh, sub-mesh or group) and press \b Compute button. -The result of calculation will be shown in the bottom area of the -dialog box. +The result of calculation will be shown in the bottom area of the dialog. \note -- If mesh consists of 3D elements only, its "length" and "area" will be 0. -- As calculation result is a sum of length, area and volume of all mesh elements, - duplications are not taken into account; i.e. all duplicated elements +- If the mesh consists of 3D elements only, its "length" and "area" will be 0. +- As calculation result is a sum of lengths, areas and volumes of all mesh elements, the + duplication is not taken into account; i.e. all duplicated elements (elements built on the same set of nodes) will be included into the result. - Similarly, intersection of elements is not taken into account. -See Also a sample TUI Script of a +See Also a sample TUI Script of \ref tui_measurements_page "Measurement operations". */ diff --git a/doc/salome/gui/SMESH/input/mesh_infos.doc b/doc/salome/gui/SMESH/input/mesh_infos.doc index d446d2e9d..8ead995f0 100644 --- a/doc/salome/gui/SMESH/input/mesh_infos.doc +++ b/doc/salome/gui/SMESH/input/mesh_infos.doc @@ -124,12 +124,10 @@ preferences (zero value means no limit). \anchor mesh_quality_info_anchor

      Quality Information

      -The Quality Info tab page of the dialog box provides overal -mesh quality controls information on the selected object - mesh, -sub-mesh or mesh group: +The Quality Info tab provides overall information about mesh quality controls on the selected object - mesh, sub-mesh or mesh group: - Name; - Nodes information: - - Number of the free nodes; + - Number of free nodes; - Number of double nodes; - Edges information: - Number of double edges; @@ -145,21 +143,22 @@ sub-mesh or mesh group:
      \image html ctrlinfo.png "Quality Info" page
      -\note User can set "Double nodes tolerance" in the dialog for local change +\note It is possible to set "Double nodes tolerance" in the dialog for a local change or via the "Quality controls" in Mesh preferences. -\note For the perfomance reason, all quality control values for the big meshes are -computed only by demand. For this, the user should press the "compute" -button (see picture). Also, values are automatically computed if the number of the +\note For performance reasons, all quality control values for big meshes are +computed only by demand. For this, press the "compute" +button. Also, values are automatically computed if the number of nodes / elements does not exceed the "Automatic controls compute limit" set -via the "Mesh information" preferences (zero value means no limit). +via the "Mesh information" preferences (zero value means that there is no limit). The button \b "Dump" allows printing the information displayed in the dialog box to a .txt file. In case you get Mesh Information via a TUI script, the information is displayed in the Python Console. -See the \ref tui_viewing_mesh_infos "TUI Example". + +See the \ref tui_viewing_mesh_infos "TUI Example". */ diff --git a/doc/salome/gui/SMESH/input/mesh_preferences.doc b/doc/salome/gui/SMESH/input/mesh_preferences.doc index b93723a3e..02574d07d 100644 --- a/doc/salome/gui/SMESH/input/mesh_preferences.doc +++ b/doc/salome/gui/SMESH/input/mesh_preferences.doc @@ -11,22 +11,21 @@ later sessions with this module. - Automatic Update - If you toggle Automatic Update checkbox, the model in your - viewer automatically updated when you make changes in it, depending on + viewer will be automatically updated when you make changes in it, depending on values of additional preferences specified below. - - Size limit (elements) - allows to specify the maximum + - Size limit (elements) - 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 Compute operation. Zero value means "no limit". Default value is 500 000 mesh elements. - Incremental limit check - when this control is switched on, - check for mesh size limit will be applied not to total number of - elements in resulting mesh, but iteratively to each entity types - in the following order: 0D elements, edges, faces, volumes, balls; - at each step number of entities of given type will be added to the - total number of elements computed at previous step - if resulting - number of elements does not exceed size limit, the entities of - this type will be shown, otherwise user will be warned that some - entities are not shown. + 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. + At each step the number of entities of a certain type is added to the + total number of elements computed at the previous step - if the resulting + number of elements does not exceed the size limit, the entities of + this type are shown, otherwise the user is warned that some entities are not shown. - Quality Controls - If you toggle Display entity, both faces and edges of an @@ -68,40 +67,40 @@ later sessions with this module. information is shown: - Simple - as a plain text - Tree - in a tree-like form - - Automatic nodes compute limit - allows to define the size limit for the + - Automatic nodes compute limit - allows defining the size limit for the mesh groups for which the number of underlying nodes is calculated automatically. If the group size exceeds the value set in the preferences, the user will have to press \em Compute button explicitly. Zero value means "no limit". By default the value is set to 100 000 mesh elements. - - Automatic controls compute limit - allows to define the size limit for the + - Automatic controls compute limit - allows defining the size limit for the mesh elements for which the Aspect Ratio histogram is calculated automatically. If the mesh elements size exceeds the value set in the preferences, - the user will have to press \em Compute button explicitly. Zero value + it is possible to press \b Compute button explicitly to calculate the histogram . Zero value means "no limit". By default the value is set to 3 000 mesh elements. - Show details on groups in element information tab - when this option is switched off (default), only the names of groups, to which the node or element belongs, are shown in the \ref mesh_element_info_anchor "Info Tab" tab of "Mesh Information" dialog box. If this option is switched on, the detailed information on groups is shown. - - Dump base information - allows to dump base mesh information to the + - Dump base information - allows dumping base mesh information to the file, see \ref mesh_infos_page. - - Dump element information - allows to dump element information to the + - Dump element information - allows dumping element information to the file, see \ref mesh_infos_page. - - Dump additional information - allows to dump additional mesh + - Dump additional information - allows dumping additional mesh information to the file, see \ref mesh_infos_page. - - Dump controls information - allows to dump quality mesh + - Dump controls information - allows dumping quality mesh information to the file, see \ref mesh_infos_page. - Automatic Parameters - Ratio Bounding Box Diagonal / Max Size - this parameter is - used for automatic meshing: ratio between the bounding box of the + used for automatic meshing. This is the ratio between the bounding box of the meshed object and the Max Size of segments. - - Default Number of Segments - allows defining the default + - Default Number of Segments - defines the default number of segments on each edge. - Mesh loading - If No mesh loading from study file at hypothesis modification - checkbox is on, the mesh data will not be loaded from the study file + check-box is on, the mesh data will not be loaded from the study file when a hypothesis is modified. This allows saving time by omitting loading data of a large mesh that is planned to be recomputed with other parameters. diff --git a/doc/salome/gui/SMESH/input/mesh_through_point.doc b/doc/salome/gui/SMESH/input/mesh_through_point.doc index b84df8b1b..5f4166b38 100644 --- a/doc/salome/gui/SMESH/input/mesh_through_point.doc +++ b/doc/salome/gui/SMESH/input/mesh_through_point.doc @@ -21,13 +21,9 @@ The following dialog box shall appear:
    11. Enter the coordinates of the destination point.
    12. Check in Find closest to destination option or -select the necessary node manually (X, Y, Z, dX, dY, dZ fields allow -to see original coordinates and displacement of the node to move). -\b Preview check-box allows to see the results of the operation.
    13. -
    14. The Update Destination button is activated when Find -closest to destination option is unchecked. Click the Update -Destination button for update coordinates of the destination point -from original coordinates of the node to move.
    15. +select the necessary node manually (X, Y, Z, dX, dY, dZ fields show the original coordinates and displacement of the node to move). +\b Preview check-box shows the operation results. +
    16. Update Destination button is activated when Find closest to destination option is unchecked. Click Update Destination button to update the coordinates of the destination point.
    17. Click the \b Apply or Apply and Close button.
    diff --git a/doc/salome/gui/SMESH/input/selection_filter_library.doc b/doc/salome/gui/SMESH/input/selection_filter_library.doc index 583d7e773..c06fb6ec5 100644 --- a/doc/salome/gui/SMESH/input/selection_filter_library.doc +++ b/doc/salome/gui/SMESH/input/selection_filter_library.doc @@ -84,7 +84,7 @@ IDs. the color defined by the Threshold Value.
  20. Elements of a domain allows selection of entities belonging to -one domain of a mesh. The domain is a part of mesh not connected to +one domain of a mesh. The domain is mesh part not connected to other parts. Threshold Value locating any element of the domain can be either - node ID (that you can pick in the Viewer) or - geometrical vertex (that you can pick either in the Viewer or in the diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index cb23d2843..842b17750 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -658,7 +658,7 @@ bool SMESH_MeshEditor::InverseDiag (const SMDS_MeshElement * theTria1, // put nodes in array and find out indices of the same ones const SMDS_MeshNode* aNodes [6]; - int sameInd [] = { 0, 0, 0, 0, 0, 0 }; + int sameInd [] = { -1, -1, -1, -1, -1, -1 }; int i = 0; SMDS_ElemIteratorPtr it = theTria1->nodesIterator(); while ( it->more() ) { @@ -684,15 +684,15 @@ bool SMESH_MeshEditor::InverseDiag (const SMDS_MeshElement * theTria1, } // find indices of 1,2 and of A,B in theTria1 - int iA = 0, iB = 0, i1 = 0, i2 = 0; + int iA = -1, iB = 0, i1 = 0, i2 = 0; for ( i = 0; i < 6; i++ ) { - if ( sameInd [ i ] == 0 ) { + if ( sameInd [ i ] == -1 ) { if ( i < 3 ) i1 = i; else i2 = i; } else if (i < 3) { - if ( iA ) iB = i; - else iA = i; + if ( iA >= 0) iB = i; + else iA = i; } } // nodes 1 and 2 should not be the same @@ -5463,7 +5463,7 @@ SMESH_MeshEditor::MakeExtrElements(TIDSortedElemSet& theElements for( ; itPP != fullList.end(); itPP++) { aPPs.push_back( *itPP ); if ( theHasAngles && itAngles != theAngles.end() ) - aPPs.back().SetAngle( *itAngles ); + aPPs.back().SetAngle( *itAngles++ ); } TNodeOfNodeListMap mapNewNodes; diff --git a/src/SMESH/SMESH_MesherHelper.cxx b/src/SMESH/SMESH_MesherHelper.cxx index 75cbbeeff..b7d8759e9 100644 --- a/src/SMESH/SMESH_MesherHelper.cxx +++ b/src/SMESH/SMESH_MesherHelper.cxx @@ -2667,7 +2667,7 @@ double SMESH_MesherHelper::MaxTolerance( const TopoDS_Shape& shape ) * \return double - the angle (between -Pi and Pi), negative if the angle is concave, * 1e100 in case of failure * \waring Care about order of the EDGEs and their orientation to be as they are - * within the FACE! + * within the FACE! Don't pass degenerated EDGEs neither! */ //================================================================================ @@ -2682,18 +2682,35 @@ double SMESH_MesherHelper::GetAngle( const TopoDS_Edge & theE1, if ( !TopExp::CommonVertex( theE1, theE2, vCommon )) return angle; double f,l; - Handle(Geom2d_Curve) c2d1 = BRep_Tool::CurveOnSurface( theE1, theFace, f,l ); Handle(Geom_Curve) c1 = BRep_Tool::Curve( theE1, f,l ); Handle(Geom_Curve) c2 = BRep_Tool::Curve( theE2, f,l ); + Handle(Geom2d_Curve) c2d1 = BRep_Tool::CurveOnSurface( theE1, theFace, f,l ); Handle(Geom_Surface) surf = BRep_Tool::Surface( theFace ); double p1 = BRep_Tool::Parameter( vCommon, theE1 ); double p2 = BRep_Tool::Parameter( vCommon, theE2 ); if ( c1.IsNull() || c2.IsNull() ) return angle; - gp_Pnt2d uv = c2d1->Value( p1 ); + gp_XY uv = c2d1->Value( p1 ).XY(); gp_Vec du, dv; gp_Pnt p; surf->D1( uv.X(), uv.Y(), p, du, dv ); gp_Vec vec1, vec2, vecRef = du ^ dv; + int nbLoops = 0; + double p1tmp = p1; + while ( vecRef.SquareMagnitude() < std::numeric_limits::min() ) + { + double dp = ( l - f ) / 1000.; + p1tmp += dp * (( Abs( p1 - f ) > Abs( p1 - l )) ? +1. : -1.); + uv = c2d1->Value( p1tmp ).XY(); + surf->D1( uv.X(), uv.Y(), p, du, dv ); + vecRef = du ^ dv; + if ( ++nbLoops > 10 ) + { +#ifdef _DEBUG_ + cout << "SMESH_MesherHelper::GetAngle(): Captured in a sigularity" << endl; +#endif + return angle; + } + } if ( theFace.Orientation() == TopAbs_REVERSED ) vecRef.Reverse(); c1->D1( p1, p, vec1 ); diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 45b145d18..6fb58cea1 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -685,9 +685,9 @@ new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true ); fd->setWindowTitle( aTitle ); fd->setNameFilters( filters ); - fd->selectNameFilter(aDefaultFilter); - fd->SetChecked(0,toCreateGroups); - fd->SetChecked(1,toFindOutDim); + fd->selectNameFilter( aDefaultFilter ); + fd->SetChecked( toCreateGroups, 0 ); + fd->SetChecked( toFindOutDim, 1 ); if ( !anInitialPath.isEmpty() ) fd->setDirectory( anInitialPath ); fd->selectFile(aMeshName); diff --git a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx index ab2a0743f..929469024 100644 --- a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx @@ -113,7 +113,7 @@ namespace } namespace SMESH { - class TElementSimulation { + class TElementSimulationQuad { SalomeApp_Application* myApplication; SUIT_ViewWindow* myViewWindow; SVTK_ViewWindow* myVTKViewWindow; @@ -130,7 +130,7 @@ namespace SMESH SMESH_FaceOrientationFilter* myFaceOrientationFilter; public: - TElementSimulation (SalomeApp_Application* theApplication) + TElementSimulationQuad (SalomeApp_Application* theApplication) { myApplication = theApplication; SUIT_ViewManager* mgr = theApplication->activeViewManager(); @@ -230,7 +230,7 @@ namespace SMESH } - ~TElementSimulation() + ~TElementSimulationQuad() { if (FindVtkViewWindow(myApplication->activeViewManager(), myViewWindow)) { myVTKViewWindow->RemoveActor(myPreviewActor); @@ -344,7 +344,7 @@ SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theM SalomeApp_Application* anApp = dynamic_cast (SUIT_Session::session()->activeApplication()); - mySimulation = new SMESH::TElementSimulation (anApp); + mySimulation = new SMESH::TElementSimulationQuad (anApp); mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); QString anElementName; @@ -1039,7 +1039,7 @@ void SMESHGUI_AddQuadraticElementDlg::displaySimulation() { if ( IsValid() ) { - SMESH::TElementSimulation::TVTKIds anIds; + SMESH::TElementSimulationQuad::TVTKIds anIds; // Collect ids from the dialog int anID; diff --git a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.h b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.h index f6ba14d1e..fa5bb51ce 100644 --- a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.h +++ b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.h @@ -54,7 +54,7 @@ class LightApp_SelectionMgr; namespace SMESH { - struct TElementSimulation; + struct TElementSimulationQuad; } //================================================================================= @@ -92,7 +92,7 @@ private: SMESH::SMESH_Mesh_var myMesh; SMESH_Actor* myActor; - SMESH::TElementSimulation* mySimulation; + SMESH::TElementSimulationQuad* mySimulation; QString myEntry; GrpList myGroups; diff --git a/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx b/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx index 54d8663eb..836087663 100644 --- a/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx @@ -476,7 +476,6 @@ SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule, SVTK_ViewWindow SliderDistance = new QSlider( Qt::Horizontal, GroupParameters ); SliderDistance->setObjectName( "SliderDistance" ); - SliderDistance->setFocusPolicy( Qt::NoFocus ); SliderDistance->setMinimumSize( 300, 0 ); SliderDistance->setMinimum( 0 ); SliderDistance->setMaximum( 100 ); @@ -498,7 +497,6 @@ SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule, SVTK_ViewWindow SliderRotation1 = new QSlider( Qt::Horizontal, GroupParameters ); SliderRotation1->setObjectName( "SliderRotation1" ); - SliderRotation1->setFocusPolicy( Qt::NoFocus ); SliderRotation1->setMinimumSize( 300, 0 ); SliderRotation1->setMinimum( -180 ); SliderRotation1->setMaximum( 180 ); @@ -521,7 +519,6 @@ SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule, SVTK_ViewWindow SliderRotation2 = new QSlider( Qt::Horizontal, GroupParameters ); SliderRotation2->setObjectName( "SliderRotation2" ); - SliderRotation2->setFocusPolicy( Qt::NoFocus ); SliderRotation2->setMinimumSize( 300, 0 ); SliderRotation2->setMinimum( -180 ); SliderRotation2->setMaximum( 180 ); diff --git a/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx b/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx index f8dda6552..e99cf69b5 100644 --- a/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx @@ -198,6 +198,7 @@ namespace SMESH void Show( int subShapeID, GEOM::GEOM_Object_var aMainShape, bool only = false) { SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( SMESHGUI::GetSMESHGUI() ); + SUIT_ResourceMgr* resMgr = SMESH::GetResourceMgr( SMESHGUI::GetSMESHGUI() ); std::string mainEntry; if ( !aMainShape->_is_nil() ) mainEntry = aMainShape->GetStudyEntry(); @@ -226,8 +227,13 @@ namespace SMESH TopAbs_ShapeEnum type( aShape.ShapeType() >= TopAbs_WIRE ? TopAbs_EDGE : TopAbs_FACE ); for ( TopExp_Explorer exp( aShape, type ); exp.More(); exp.Next() ) { //checkTriangulation( exp.Current() ); - if ( GEOM_Actor* anActor = getActor( exp.Current() )) + if ( GEOM_Actor* anActor = getActor( exp.Current() ) ) { + int UNbIsos = resMgr->integerValue( "Geometry", "iso_number_u", 1); + int VNbIsos = resMgr->integerValue( "Geometry", "iso_number_v", 1); + int aNbIsos[2] = { UNbIsos ? UNbIsos : 1, VNbIsos ? VNbIsos : 1 }; + anActor->SetNbIsos( aNbIsos ); myShownActors.push_back( anActor ); + } } if ( type == TopAbs_FACE ) { for ( TopExp_Explorer exp( aShape, TopAbs_EDGE ); exp.More(); exp.Next() ) { diff --git a/src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx b/src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx index bf0074bab..d48e740f5 100755 --- a/src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx @@ -989,6 +989,7 @@ bool SMESHGUI_MultiEditDlg::onApply() updateButtons(); } + obj._retn(); // else myMesh is deleted by ~obj myBusy = false; return aResult; diff --git a/src/SMESHGUI/SMESHGUI_Selection.cxx b/src/SMESHGUI/SMESHGUI_Selection.cxx index 6e82d5b46..ea8bf0317 100644 --- a/src/SMESHGUI/SMESHGUI_Selection.cxx +++ b/src/SMESHGUI/SMESHGUI_Selection.cxx @@ -93,10 +93,16 @@ bool SMESHGUI_Selection::processOwner( const LightApp_DataOwner* ow ) { const LightApp_SVTKDataOwner* owner = dynamic_cast ( ow ); - if( owner ) + if( owner ) { myActors.append( dynamic_cast( owner->GetActor() ) ); - else + } + else if ( ow ) { // SVTK selection disabled + QString entry = ow->entry(); + myActors.append( SMESH::FindActorByEntry( entry.toStdString().c_str() )); + } + else { myActors.append( 0 ); + } return true; } @@ -107,31 +113,31 @@ bool SMESHGUI_Selection::processOwner( const LightApp_DataOwner* ow ) QVariant SMESHGUI_Selection::parameter( const int ind, const QString& p ) const { QVariant val; - if ( p=="client" ) val = QVariant( LightApp_Selection::parameter( p ) ); - else if ( p=="type" ) val = QVariant( myTypes[ind] ); - else if ( p=="elemTypes" ) val = QVariant( elemTypes( ind ) ); - else if ( p=="isAutoColor" ) val = QVariant( isAutoColor( ind ) ); - else if ( p=="numberOfNodes" ) val = QVariant( numberOfNodes( ind ) ); - else if ( p=="dim" ) val = QVariant( dim( ind ) ); - else if ( p=="labeledTypes" ) val = QVariant( labeledTypes( ind ) ); - else if ( p=="shrinkMode" ) val = QVariant( shrinkMode( ind ) ); - else if ( p=="entityMode" ) val = QVariant( entityMode( ind ) ); - else if ( p=="controlMode" ) val = QVariant( controlMode( ind ) ); - else if ( p=="isNumFunctor" ) val = QVariant( isNumFunctor( ind ) ); - else if ( p=="displayMode" ) val = QVariant( displayMode( ind ) ); - else if ( p=="isComputable" ) val = QVariant( isComputable( ind ) ); - else if ( p=="isPreComputable" ) val = QVariant( isPreComputable( ind ) ); - else if ( p=="hasReference" ) val = QVariant( hasReference( ind ) ); - else if ( p=="isImported" ) val = QVariant( isImported( ind ) ); + if ( p=="client" ) val = QVariant( LightApp_Selection::parameter( p ) ); + else if ( p=="type" ) val = QVariant( myTypes[ind] ); + else if ( p=="elemTypes" ) val = QVariant( elemTypes( ind ) ); + else if ( p=="isAutoColor" ) val = QVariant( isAutoColor( ind ) ); + else if ( p=="numberOfNodes" ) val = QVariant( numberOfNodes( ind ) ); + else if ( p=="dim" ) val = QVariant( dim( ind ) ); + else if ( p=="labeledTypes" ) val = QVariant( labeledTypes( ind ) ); + else if ( p=="shrinkMode" ) val = QVariant( shrinkMode( ind ) ); + else if ( p=="entityMode" ) val = QVariant( entityMode( ind ) ); + else if ( p=="controlMode" ) val = QVariant( controlMode( ind ) ); + else if ( p=="isNumFunctor" ) val = QVariant( isNumFunctor( ind ) ); + else if ( p=="displayMode" ) val = QVariant( displayMode( ind ) ); + else if ( p=="isComputable" ) val = QVariant( isComputable( ind ) ); + else if ( p=="isPreComputable" ) val = QVariant( isPreComputable( ind ) ); + else if ( p=="hasReference" ) val = QVariant( hasReference( ind ) ); + else if ( p=="isImported" ) val = QVariant( isImported( ind ) ); else if ( p=="facesOrientationMode" ) val = QVariant( facesOrientationMode( ind ) ); - else if ( p=="groupType" ) val = QVariant( groupType( ind ) ); - else if ( p=="quadratic2DMode") val = QVariant(quadratic2DMode(ind)); - else if ( p=="isDistributionVisible") val = QVariant(isDistributionVisible(ind)); - else if ( p=="hasChildren") val = QVariant(hasChildren(ind)); - else if ( p=="nbChildren") val = QVariant(nbChildren(ind)); - else if ( p=="isContainer") val = QVariant(isContainer(ind)); - - if( val.isValid() ) + else if ( p=="groupType" ) val = QVariant( groupType( ind ) ); + else if ( p=="quadratic2DMode") val = QVariant( quadratic2DMode( ind ) ); + else if ( p=="isDistributionVisible") val = QVariant( isDistributionVisible( ind ) ); + else if ( p=="hasChildren") val = QVariant( hasChildren( ind ) ); + else if ( p=="nbChildren") val = QVariant( nbChildren( ind ) ); + else if ( p=="isContainer") val = QVariant( isContainer( ind ) ); + + if ( val.isValid() ) return val; else return LightApp_Selection::parameter( ind, p ); @@ -163,10 +169,10 @@ QList SMESHGUI_Selection::elemTypes( int ind ) const TVisualObjPtr object = actor->GetObject(); if ( object ) { if ( object->GetNbEntities( SMDSAbs_0DElement )) types.append( "Elem0d" ); - if ( object->GetNbEntities( SMDSAbs_Ball )) types.append( "BallElem" ); - if ( object->GetNbEntities( SMDSAbs_Edge )) types.append( "Edge" ); - if ( object->GetNbEntities( SMDSAbs_Face )) types.append( "Face" ); - if ( object->GetNbEntities( SMDSAbs_Volume )) types.append( "Volume" ); + if ( object->GetNbEntities( SMDSAbs_Ball )) types.append( "BallElem" ); + if ( object->GetNbEntities( SMDSAbs_Edge )) types.append( "Edge" ); + if ( object->GetNbEntities( SMDSAbs_Face )) types.append( "Face" ); + if ( object->GetNbEntities( SMDSAbs_Volume )) types.append( "Volume" ); } } return types; @@ -183,7 +189,7 @@ QList SMESHGUI_Selection::labeledTypes( int ind ) const SMESH_Actor* actor = getActor( ind ); if ( actor ) { if ( actor->GetPointsLabeled()) types.append( "Point" ); - if ( actor->GetCellsLabeled()) types.append( "Cell" ); + if ( actor->GetCellsLabeled()) types.append( "Cell" ); } return types; } @@ -217,8 +223,8 @@ QString SMESHGUI_Selection::quadratic2DMode( int ind ) const SMESH_Actor* actor = getActor( ind ); if ( actor ) { switch( actor->GetQuadratic2DRepresentation() ) { - case SMESH_Actor::eLines: return "eLines"; - case SMESH_Actor::eArcs: return "eArcs"; + case SMESH_Actor::eLines: return "eLines"; + case SMESH_Actor::eArcs: return "eArcs"; default: break; } } @@ -244,9 +250,7 @@ QString SMESHGUI_Selection::shrinkMode( int ind ) const { SMESH_Actor* actor = getActor( ind ); if ( actor && actor->IsShrunkable() ) { - if ( actor->IsShrunk() ) - return "IsShrunk"; - return "IsNotShrunk"; + return actor->IsShrunk() ? "IsShrunk" : "IsNotShrunk"; } return "IsNotShrinkable"; } @@ -266,7 +270,7 @@ QList SMESHGUI_Selection::entityMode( int ind ) const if ( aMode & SMESH_Actor::eFaces ) types.append( "Face" ); if ( aMode & SMESH_Actor::eEdges ) types.append( "Edge" ); if ( aMode & SMESH_Actor::e0DElements ) types.append( "Elem0d" ); - if ( aMode & SMESH_Actor::eBallElem ) types.append( "BallElem" ); + if ( aMode & SMESH_Actor::eBallElem ) types.append( "BallElem" ); } return types; } @@ -352,9 +356,7 @@ QString SMESHGUI_Selection::facesOrientationMode( int ind ) const { SMESH_Actor* actor = getActor( ind ); if ( actor ) { - if ( actor->GetFacesOriented() ) - return "IsOriented"; - return "IsNotOriented"; + return actor->GetFacesOriented() ? "IsOriented" : "IsNotOriented"; } return "Unknown"; } @@ -371,9 +373,9 @@ bool SMESHGUI_Selection::isAutoColor( int ind ) const _PTR(SObject) sobj = SMESH::GetActiveStudyDocument()->FindObjectID( entry( ind ).toLatin1().data() ); CORBA::Object_var obj = SMESH::SObjectToObject( sobj, SMESH::GetActiveStudyDocument() ); - if ( ! CORBA::is_nil( obj )) { + if ( !CORBA::is_nil( obj ) ) { SMESH::SMESH_Mesh_var mesh = SMESH::SMESH_Mesh::_narrow( obj ); - if ( ! mesh->_is_nil() ) + if ( !CORBA::is_nil( mesh ) ) return mesh->GetAutoColor(); } } @@ -392,15 +394,15 @@ int SMESHGUI_Selection::numberOfNodes( int ind ) const _PTR(SObject) sobj = SMESH::GetActiveStudyDocument()->FindObjectID( entry( ind ).toLatin1().data() ); CORBA::Object_var obj = SMESH::SObjectToObject( sobj, SMESH::GetActiveStudyDocument() ); - if ( ! CORBA::is_nil( obj )) { + if ( !CORBA::is_nil( obj ) ) { SMESH::SMESH_Mesh_var mesh = SMESH::SMESH_Mesh::_narrow( obj ); - if ( ! mesh->_is_nil() ) + if ( !CORBA::is_nil( mesh ) ) return mesh->NbNodes(); SMESH::SMESH_subMesh_var aSubMeshObj = SMESH::SMESH_subMesh::_narrow( obj ); - if ( !aSubMeshObj->_is_nil() ) + if ( !CORBA::is_nil( aSubMeshObj ) ) return aSubMeshObj->GetNumberOfNodes(true); SMESH::SMESH_GroupBase_var aGroupObj = SMESH::SMESH_GroupBase::_narrow( obj ); - if ( !aGroupObj->_is_nil() ) + if ( !CORBA::is_nil( aGroupObj ) ) return aGroupObj->IsEmpty() ? 0 : 1; // aGroupObj->Size(); } } @@ -423,20 +425,21 @@ int SMESHGUI_Selection::dim( int ind ) const _PTR(SObject) sobj = SMESH::GetActiveStudyDocument()->FindObjectID( entry( ind ).toLatin1().data() ); CORBA::Object_var obj = SMESH::SObjectToObject( sobj, SMESH::GetActiveStudyDocument() ); - if ( ! CORBA::is_nil( obj )) { + if ( !CORBA::is_nil( obj ) ) { SMESH::SMESH_IDSource_var idSrc = SMESH::SMESH_IDSource::_narrow( obj ); - if ( ! idSrc->_is_nil() ) + if ( !CORBA::is_nil( idSrc ) ) { SMESH::array_of_ElementType_var types = idSrc->GetTypes(); - for ( int i = 0; i < types->length(); ++ i) + for ( int i = 0; i < types->length(); ++ i) { switch ( types[i] ) { case SMESH::EDGE : dim = std::max( dim, 1 ); break; case SMESH::FACE : dim = std::max( dim, 2 ); break; case SMESH::VOLUME: dim = std::max( dim, 3 ); break; case SMESH::ELEM0D: dim = std::max( dim, 0 ); break; case SMESH::BALL : dim = std::max( dim, 0 ); break; - default:; + default: break; } + } } } } @@ -452,36 +455,26 @@ QVariant SMESHGUI_Selection::isComputable( int ind ) const { if ( ind >= 0 && ind < myTypes.count() && myTypes[ind] != "Unknown" ) { -/* Handle(SALOME_InteractiveObject) io = - static_cast( myDataOwners[ ind ].get() )->IO(); - if ( !io.IsNull() ) { - SMESH::SMESH_Mesh_var mesh = SMESH::GetMeshByIO(io); // m,sm,gr->m - if ( !mesh->_is_nil() ) {*/ - _PTR(SObject) so = SMESH::GetActiveStudyDocument()->FindObjectID( entry( ind ).toLatin1().data() ); - //FindSObject( mesh ); - if ( so ) { - CORBA::Object_var obj = SMESH::SObjectToObject(so, SMESH::GetActiveStudyDocument()); - if(!CORBA::is_nil(obj)){ - SMESH::SMESH_Mesh_var mesh = SMESH::SMESH_Mesh::_narrow( obj ); - if (!mesh->_is_nil()){ - if(mesh->HasShapeToMesh()) { - GEOM::GEOM_Object_var shape = SMESH::GetShapeOnMeshOrSubMesh( so ); - return QVariant( !shape->_is_nil() ); - } - else - { - return QVariant(!mesh->NbFaces()==0); - } - } - else - { - GEOM::GEOM_Object_var shape = SMESH::GetShapeOnMeshOrSubMesh( so ); - return QVariant( !shape->_is_nil() ); - } - } + _PTR(SObject) so = SMESH::GetActiveStudyDocument()->FindObjectID( entry( ind ).toLatin1().data() ); + CORBA::Object_var obj = SMESH::SObjectToObject( so, SMESH::GetActiveStudyDocument() ); + if( !CORBA::is_nil( obj ) ) { + SMESH::SMESH_Mesh_var mesh = SMESH::SMESH_Mesh::_narrow( obj ); + if ( !CORBA::is_nil( mesh ) ) { + if ( mesh->HasShapeToMesh() ) { + GEOM::GEOM_Object_var shape = SMESH::GetShapeOnMeshOrSubMesh( so ); + return QVariant( !shape->_is_nil() ); + } + else + { + return QVariant( mesh->NbFaces() !=0 ); } -// } -// } + } + else + { + GEOM::GEOM_Object_var shape = SMESH::GetShapeOnMeshOrSubMesh( so ); + return QVariant( !shape->_is_nil() ); + } + } } return QVariant( false ); } @@ -522,10 +515,9 @@ QVariant SMESHGUI_Selection::isVisible( int ind ) const { if ( ind >= 0 && ind < myTypes.count() && myTypes[ind] != "Unknown" ) { - QString ent = entry( ind ); - SMESH_Actor* actor = SMESH::FindActorByEntry( ent.toLatin1().data() ); + SMESH_Actor* actor = SMESH::FindActorByEntry( entry( ind ).toLatin1().data() ); if ( actor && actor->hasIO() ) { - if(SVTK_ViewWindow* aViewWindow = SMESH::GetCurrentVtkView()) + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetCurrentVtkView() ) return QVariant( aViewWindow->isVisible( actor->getIO() ) ); } } @@ -542,7 +534,8 @@ bool SMESHGUI_Selection::hasChildren( int ind ) const if ( ind >= 0 ) { _PTR(SObject) sobj = SMESH::GetActiveStudyDocument()->FindObjectID( entry( ind ).toLatin1().data() ); - return SMESH::GetActiveStudyDocument()->GetUseCaseBuilder()->HasChildren( sobj ); + if ( sobj ) + return SMESH::GetActiveStudyDocument()->GetUseCaseBuilder()->HasChildren( sobj ); } return false; } @@ -558,9 +551,9 @@ int SMESHGUI_Selection::nbChildren( int ind ) const if ( ind >= 0 ) { _PTR(SObject) sobj = SMESH::GetActiveStudyDocument()->FindObjectID( entry( ind ).toLatin1().data() ); - if ( sobj->GetStudy()->GetUseCaseBuilder()->IsUseCaseNode( sobj ) ) { + if ( sobj && sobj->GetStudy()->GetUseCaseBuilder()->IsUseCaseNode( sobj ) ) { _PTR(UseCaseIterator) it = sobj->GetStudy()->GetUseCaseBuilder()->GetUseCaseIterator( sobj ); - for (it->Init(false); it->More(); it->Next()) nb++; + for ( it->Init( false ); it->More(); it->Next() ) nb++; } } return nb; @@ -583,72 +576,57 @@ bool SMESHGUI_Selection::isContainer( int ind ) const int SMESHGUI_Selection::type( const QString& entry, _PTR(Study) study ) { - _PTR(SObject) obj (study->FindObjectID(entry.toLatin1().data())); - if( !obj ) - return -1; - - _PTR(SObject) ref; - if( obj->ReferencedObject( ref ) ) - obj = ref; - - _PTR(SObject) objFather = obj->GetFather(); - _PTR(SComponent) objComponent = obj->GetFatherComponent(); - - if( objComponent->ComponentDataType()!="SMESH" ) - return -1; - - if( objComponent->GetIOR()==obj->GetIOR() ) - return SMESH::COMPONENT; - - int aLevel = obj->Depth() - objComponent->Depth(), - aFTag = objFather->Tag(), - anOTag = obj->Tag(), - res = -1; - - switch (aLevel) - { - case 1: - if (anOTag >= SMESH::Tag_FirstMeshRoot) - res = SMESH::MESH; - break; - case 2: - switch (aFTag) - { - case SMESH::Tag_HypothesisRoot: - res = SMESH::HYPOTHESIS; - break; - case SMESH::Tag_AlgorithmsRoot: - res = SMESH::ALGORITHM; - break; - } - break; - case 3: - switch (aFTag) - { - case SMESH::Tag_SubMeshOnVertex: - res = SMESH::SUBMESH_VERTEX; - break; - case SMESH::Tag_SubMeshOnEdge: - res = SMESH::SUBMESH_EDGE; - break; - case SMESH::Tag_SubMeshOnFace: - res = SMESH::SUBMESH_FACE; - break; - case SMESH::Tag_SubMeshOnSolid: - res = SMESH::SUBMESH_SOLID; - break; - case SMESH::Tag_SubMeshOnCompound: - res = SMESH::SUBMESH_COMPOUND; - break; - default: - if (aFTag >= SMESH::Tag_FirstGroup) - res = SMESH::GROUP; - else - res = SMESH::SUBMESH; + int res = -1; + _PTR(SObject) obj = study->FindObjectID( entry.toLatin1().data() ); + if ( obj ) { + _PTR(SObject) ref; + if ( obj->ReferencedObject( ref ) ) + obj = ref; + + _PTR(SObject) objFather = obj->GetFather(); + _PTR(SComponent) objComponent = obj->GetFatherComponent(); + + if ( objComponent->ComponentDataType() == "SMESH" ) { + if ( objComponent->GetIOR() == obj->GetIOR() ) { + res = SMESH::COMPONENT; + } + else { + int aLevel = obj->Depth() - objComponent->Depth(), + aFTag = objFather->Tag(), + anOTag = obj->Tag(); + + switch ( aLevel ) + { + case 1: + if ( anOTag >= SMESH::Tag_FirstMeshRoot ) + res = SMESH::MESH; + break; + case 2: + switch ( aFTag ) + { + case SMESH::Tag_HypothesisRoot: res = SMESH::HYPOTHESIS; break; + case SMESH::Tag_AlgorithmsRoot: res = SMESH::ALGORITHM; break; + default: break; + } + break; + case 3: + switch ( aFTag ) + { + case SMESH::Tag_SubMeshOnVertex: res = SMESH::SUBMESH_VERTEX; break; + case SMESH::Tag_SubMeshOnEdge: res = SMESH::SUBMESH_EDGE; break; + case SMESH::Tag_SubMeshOnFace: res = SMESH::SUBMESH_FACE; break; + case SMESH::Tag_SubMeshOnSolid: res = SMESH::SUBMESH_SOLID; break; + case SMESH::Tag_SubMeshOnCompound: res = SMESH::SUBMESH_COMPOUND; break; + default: + if ( aFTag >= SMESH::Tag_FirstGroup) res = SMESH::GROUP; + else res = SMESH::SUBMESH; + break; + } + break; + } + } } - break; } - return res; } @@ -659,45 +637,46 @@ int SMESHGUI_Selection::type( const QString& entry, _PTR(Study) study ) QString SMESHGUI_Selection::typeName( const int t ) { + QString res = "Unknown"; switch( t ) { case SMESH::HYPOTHESIS: - return "Hypothesis"; + res = "Hypothesis"; break; case SMESH::ALGORITHM: - return "Algorithm"; + res = "Algorithm"; break; case SMESH::MESH: - return "Mesh"; + res = "Mesh"; break; case SMESH::SUBMESH: - return "SubMesh"; + res = "SubMesh"; break; case SMESH::MESHorSUBMESH: - return "Mesh or submesh"; + res = "Mesh or submesh"; break; case SMESH::SUBMESH_VERTEX: - return "Mesh vertex"; + res = "Mesh vertex"; break; case SMESH::SUBMESH_EDGE: - return "Mesh edge"; + res = "Mesh edge"; break; case SMESH::SUBMESH_FACE: - return "Mesh face"; + res = "Mesh face"; break; case SMESH::SUBMESH_SOLID: - return "Mesh solid"; + res = "Mesh solid"; break; case SMESH::SUBMESH_COMPOUND: - return "Mesh compound"; + res = "Mesh compound"; break; case SMESH::GROUP: - return "Group"; + res = "Group"; break; case SMESH::COMPONENT: - return "Component"; + res = "Component"; break; default: - return "Unknown"; + break; } + return res; } bool SMESHGUI_Selection::isImported( const int ind ) const { - QString e = entry( ind ); - _PTR(SObject) SO = SMESH::GetActiveStudyDocument()->FindObjectID( e.toLatin1().constData() ); bool res = false; - if( SO ) + _PTR(SObject) sobj = SMESH::GetActiveStudyDocument()->FindObjectID( entry( ind ).toLatin1().constData() ); + if ( sobj ) { - SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( SMESH::SObjectToObject( SO ) ); + SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( SMESH::SObjectToObject( sobj ) ); if( !aMesh->_is_nil() ) { SMESH::MedFileInfo_var inf = aMesh->GetMEDFileInfo(); @@ -714,20 +693,17 @@ bool SMESHGUI_Selection::isImported( const int ind ) const QString SMESHGUI_Selection::groupType( int ind ) const { - QString e = entry( ind ); - _PTR(SObject) SO = SMESH::GetActiveStudyDocument()->FindObjectID( e.toLatin1().constData() ); - if( SO ) + _PTR(SObject) sobj = SMESH::GetActiveStudyDocument()->FindObjectID( entry( ind ).toLatin1().constData() ); + if ( sobj ) { - SMESH::SMESH_Group_var g = SMESH::SObjectToInterface( SO ); - if( !g->_is_nil() ) + SMESH::SMESH_Group_var g = SMESH::SObjectToInterface( sobj ); + if ( !CORBA::is_nil( g ) ) return "Group"; - - SMESH::SMESH_GroupOnGeom_var gog = SMESH::SObjectToInterface( SO ); - if( !gog->_is_nil() ) + SMESH::SMESH_GroupOnGeom_var gog = SMESH::SObjectToInterface( sobj ); + if( !CORBA::is_nil( gog ) ) return "GroupOnGeom"; - - SMESH::SMESH_GroupOnFilter_var gof = SMESH::SObjectToInterface(SO); - if ( !gof->_is_nil() ) + SMESH::SMESH_GroupOnFilter_var gof = SMESH::SObjectToInterface( sobj ); + if ( !CORBA::is_nil( gof ) ) return "GroupOnFilter"; } return ""; diff --git a/src/SMESHGUI/SMESH_msg_ja.ts b/src/SMESHGUI/SMESH_msg_ja.ts index ea21f0dc6..f5e88adb6 100644 --- a/src/SMESHGUI/SMESH_msg_ja.ts +++ b/src/SMESHGUI/SMESH_msg_ja.ts @@ -5,7 +5,7 @@ @default SMESH_EXPORT_MESH - メッシュをエクスポートします。 + メッシュのエクスポート MED_FILES_FILTER @@ -13,7 +13,7 @@ IDEAS_FILES_FILTER - ファイルのアイデア + IDEAS ファイル DAT_FILES_FILTER @@ -41,15 +41,15 @@ GMF_ASCII_FILES_FILTER - 組み換え ASCII ファイル + GMFアスキーファイル GMF_BINARY_FILES_FILTER - 組み換えバイナリ ファイル + GMFバイナリファイル STL_BIN_FILES_FILTER - バイナリの STL ファイル + STL バイナリ ファイル ALL_FILES_FILTER @@ -65,15 +65,15 @@ MIN_DIAG_ELEMENTS - 最小斜め + 最小の対角線 ASPECTRATIO_3D_ELEMENTS - レポートの 3 D を形成 + 3D要素のアスペクト比 ASPECTRATIO_ELEMENTS - レポート フォーム + アスペクト比 COL_ALGO_HEADER @@ -125,7 +125,7 @@ COMPERR_WARNING - COMPERR_WARNING + 警告 COMPERR_UNKNOWN @@ -139,9 +139,13 @@ COMPERR_NO_MESH_ON_SHAPE スロット図形に関連付けられている要素がないです。 + + COMPERR_BAD_PARMETERS + 無効な入力パラメータ + EDITERR_NO_MEDIUM_ON_GEOM - いくつか (マジェンタ色で表示されている) ノード環境歪んだ要素を避けるために places\n のジオメトリではありません。 + ノードが (マジェンタ色で図示) 環境によって歪んだ要素を避けるためにジオメトリに配置されません。 SMESH_GEOM @@ -217,11 +221,11 @@ MEN_ASPECT - アスペクト比 + レポート フォーム MEN_ASPECT_3D - アスペクト比 3D + レポートの 3 D を形成 MEN_AUTO_COLOR @@ -233,7 +237,7 @@ MEN_BUILD_COMPOUND - コンパウンドの作成 + アセンブリをビルド MEN_COPY_MESH @@ -249,7 +253,7 @@ MEN_COMPUTE - 計算 + 計算します。 MEN_PRECOMPUTE @@ -377,7 +381,7 @@ MEN_BALL - 粒子 + 要素粒子 MEN_BALLS @@ -429,7 +433,7 @@ MEN_EXPORT_GMF - 組み換えをエクスポートします。 + GMF形式でエクスポート MEN_EXPORT_SAUV @@ -445,7 +449,7 @@ MEN_EXTRUSION - 面の押出し + Extrusion MEN_EXTRUSION_ALONG @@ -453,7 +457,7 @@ MEN_FACES - フェース + Faces MEN_FILE @@ -465,7 +469,7 @@ TOP_REORIENT_2D - ベクトルによると顔をリダイレクトします。 + ベクトルによってフェースの向きを変える MEN_REORIENT_2D @@ -473,7 +477,7 @@ STB_REORIENT_2D - ベクトルによると顔をリダイレクトします。 + ベクトルによってフェースの向きを変える TOP_FIND_ELEM @@ -649,7 +653,7 @@ MEN_GMF - GMF file + GMFファイル MEN_IMPORT_SAUV @@ -661,7 +665,7 @@ MEN_MERGE - ノードを結合します。 + 節点の結合 MEN_MERGE_ELEMENTS @@ -713,43 +717,43 @@ MEN_BASIC_PROPERTIES - MEN_BASIC_PROPERTIES + 基本的なプロパティ MEN_MEASURE_LENGTH - MEN_MEASURE_LENGTH + 長さ STB_MEASURE_LENGTH - STB_MEASURE_LENGTH + 選択したオブジェクトのすべての 1 次元要素の長さの合計を計算します。 TOP_MEASURE_LENGTH - TOP_MEASURE_LENGTH + 長さ MEN_MEASURE_AREA - MEN_MEASURE_AREA + エリア STB_MEASURE_AREA - STB_MEASURE_AREA + 選択したオブジェクトのすべての 2D 要素の領域の合計を計算します。 TOP_MEASURE_AREA - TOP_MEASURE_AREA + エリア MEN_MEASURE_VOLUME - MEN_MEASURE_VOLUME + ボリューム STB_MEASURE_VOLUME - STB_MEASURE_VOLUME + 選択したオブジェクトのすべての 3 D 要素の量の合計を計算します。 TOP_MEASURE_VOLUME - TOP_MEASURE_VOLUME + ボリューム MEN_MOVE @@ -869,7 +873,7 @@ MEN_OVERALL_MESH_QUALITY - MEN_OVERALL_MESH_QUALITY + 全体的なメッシュの品質 MEN_DISTRIBUTION_CTRL @@ -893,7 +897,7 @@ MEN_REVOLUTION - 回転 + Revolution MEN_ROT @@ -945,7 +949,7 @@ MEN_SKEW - スキュー + 傾斜 MEN_SMOOTH @@ -953,7 +957,7 @@ MEN_STD_INFO - メッシュに関する情報 + 標準的なメッシュ情報 MEN_IMPORT_STL @@ -969,7 +973,7 @@ MEN_TAPER - コーン + Cone MEN_TETRA @@ -1053,11 +1057,11 @@ MEN_WHAT_IS - Whatis + メッシュ要素について MEN_WIRE - ワイヤー + Wires MEN_SPLIT_TO_TETRA @@ -1113,7 +1117,7 @@ MESH_STANDALONE_GRP_CHOSEN - ジオメトリにリンクして、グループを選択: %1。スタンドアロンのグループに変換しますか。 + ジオメトリにリンクされているグループが選択されている: %1。スタンドアロン アレイに変換しますか。 NODE_ID @@ -1137,7 +1141,7 @@ SMESHGUI_INVALID_PARAMETERS - 指定されたパラメーターが正しくありません。ください。 修正し、もう一度やり直してください。 + 指定されたパラメーターが正しくありません。を修正するおかげで、再度実行してください SMESH_ADD_ALGORITHM @@ -1181,23 +1185,23 @@ SMESH_ADD_HYPOTHESIS - 前提条件 + 詳細設定 SMESH_ADD_HYPOTHESIS_TITLE - 仮説の割り当て + 詳細設定の割り当て SMESH_ADD_HYP_WRN - "1%"が割り当てられた。しかし:。 + '%' は帰因させる、しかし: SMESH_ADD_OCTA - 6角柱を追加します。 + 6角柱の追加 SMESH_ADD_OCTA_TITLE - 6角柱を追加します。 + 6角柱の追加 SMESH_ADD_POLYGON @@ -1217,11 +1221,11 @@ SMESH_ADD_PYRAMID - ピラミッドを追加します。 + ピラミッドの追加 SMESH_ADD_PYRAMID_TITLE - ピラミッドを追加します。 + ピラミッドの追加 SMESH_ADD_QUADRANGLE @@ -1269,7 +1273,7 @@ SMESH_ADD_BIQUADRATIC_TRIANGLE_TITLE - SMESH_ADD_BIQUADRATIC_TRIANGLE_TITLE + バイカッド三角形を追加します。 SMESH_ADD_SUBMESH @@ -1277,11 +1281,11 @@ SMESH_ADD_TETRAS - 四面体を追加します。 + 四面体の追加 SMESH_ADD_TETRAS_TITLE - 四面体を追加します。 + 四面体の追加 SMESH_ADD_TO_GROUP @@ -1309,11 +1313,11 @@ SMESH_AUTO_DIM - SMESH_AUTO_DIM + 自動的に空間の寸法を定義します。 SMESH_REQUIRED_GROUPS - 必要なエンティティのグループを作成します。 + 必要な種類のグループを作成します。 SMESH_AVAILABLE @@ -1397,7 +1401,7 @@ SMESH_BUT_OK - Ok(&O) + わかりました(&O) SMESH_BUT_OVERWRITE @@ -1421,11 +1425,11 @@ SMESH_CANT_ADD_HYP - "1%"を割り当てることができません: + 「%1」を割り当てることができません。 SMESH_CANT_RM_HYP - "%1"の割り当て解除ができませんでした。 + Désassigner '%' にできません。 SMESH_CHECK_COLOR @@ -1457,7 +1461,7 @@ SMESH_CONTINUE_MESH_VISUALIZATION - メッシュ表示にはメモリ不足でアプリケーションがクラッシュした様です。\n表示を継続しますか? + システムは、アプリケーションをクラッシュさせることができますメッシュを表示するメモリが不足実行するようです。視聴続行しますか。 SMESH_COORDINATES @@ -1525,11 +1529,11 @@ SMESH_DRS_4 - ファイルが正しくない、データが不足しています。 + MED ファイルは下位の接続の要素を格納します。彼らは読まれていません。 SMESH_DRS_5 - SMESH_DRS_5 + ファイルが正しくない、データが不足しています。 SMESH_DRS_EMPTY @@ -1557,11 +1561,11 @@ SMESH_BALL_ELEM - 粒子 + 要素粒子 SMESH_BALL - 粒子 + 要素粒子 SMESH_BALLS @@ -1569,7 +1573,7 @@ SMESH_EDGE - エッジ + Edge SMESH_EDGES @@ -1621,35 +1625,35 @@ SMESH_EXPORT_FAILED - メッシュをエクスポートできませんでした。ディスク上の空き領域を確認します。 + メッシュをエクスポートすることができません。ディスクの空き領域を確認してください。 SMESH_EXPORT_MED_DUPLICATED_GRP - メッシュ"%1"の中に重複したグループの名前があります。エクスポートとそれらの名前変更をキャンセルすることができます。さもなければ結果ファイルの中にできるいくつかグループ名がstudyと一致しなくなります。続行しますか。 + 「%1」メッシュ内で重複するグループの名前です。エクスポートをキャンセルすることができ、名前の変更、結果の MED ファイル名に非グループの場合は研究の名前を一致しません。続行しますか。 SMESH_EXPORT_MED_DUPLICATED_MESH_NAMES - メッシュと同じ名前の選択であります。結果のファイルが正しくないことが可能です。続行しますか。 + 選択範囲内の同じ名前を持つメッシュがあります。結果のファイルが正しい可能性が。続行しますか。 SMESH_EXPORT_MED_V2_1 - メッシュ "%1" を MED 2.1に出力する際、多角形及び多面体要素があると失敗します。正しく出力できるよう MED 2.2をご使用ください。MED 2.1 へのエクスポートを実行しますか? + 多角形、多面体要素は正しいエクスポート用 MED 2.1 MED 2.2 にメッシュ '%' のエクスポートの場合省略されます。MED 2.1 をエクスポートしますか。 SMESH_EXPORT_MED_VERSION_COLLISION - ファイル"%1"のMED バージョンはわからない、もしくは選択したバージョンと一致しません。上書きしますか? + ファイル「%1」MED バージョンは知られていないか、選択したバージョンと一致しません。ファイルを上書きしますか。 SMESH_EXPORT_MED_MESH_NAMES_COLLISION - 選択したファイルはすでに次に示す名前のメッシュに含まれています。:\n %1\n\n結果ファイルは、正しくないかもしれません。 \nそれらのファイルを上書きしますか? + 選択したファイルには既に次の名を持つメッシュが含まれています: %1 結果ファイルが正しくない可能性があります。ファイルを上書きしますか。 EXPORT_NOT_SUPPORTED - 名前"%1"のメッシュを %2に出力します。\n%3 は無視されます \n続行しますか?。 + 名前 '%1' を %2 %3 とメッシュのエクスポートは無視されます。続行しますか。 SMESH_EXTRUSION - 押出し + Extrusion SMESH_EXTRUSION_TO_DISTANCE @@ -1661,11 +1665,11 @@ SMESH_FACE - フェース + Face SMESH_FACES - SMESH_FACES + Faces SMESH_FEATUREANGLE @@ -1677,7 +1681,7 @@ SMESH_FILE_EXISTS - ファイル"%1"は既に存在します。再書き込み、またはエクスポートするデータを追加しますか。 + ファイル"%1"は既に存在します。それを書き直すか、エクスポートされたデータを追加したいですか? SMESH_FONT_ARIAL @@ -1773,7 +1777,7 @@ SMESH_HYP_12 - ジオメトリ アルゴリズムと一致しません、アルゴリズムでサポートされているジオメトリのマニュアルを参照してください + ジオメトリは、アルゴリズムと一致しません、アルゴリズムでサポートされるジオメトリのマニュアルを参照してください SMESH_HYP_13 @@ -1861,7 +1865,7 @@ SMESH_LOGARITHMIC_SCALARBAR - SMESH_LOGARITHMIC_SCALARBAR + 対数 SMESH_MAKE_GROUPS @@ -1885,7 +1889,7 @@ SMESH_MEN_APPLIED_HYPOTHESIS - 前提条件の適用 + 詳細設定の適用 SMESH_MEN_COMPONENT @@ -1893,7 +1897,7 @@ SMESH_MEN_HYPOTHESIS - 前提条件 + 詳細設定 SMESH_MEN_SubMeshesOnCompound @@ -1981,7 +1985,7 @@ SMESH_MESHINFO_FACES - フェース + Faces SMESH_MESHINFO_HEXAS @@ -2117,7 +2121,7 @@ SMESH_OBJECT_HYPOTHESIS - 前提条件 + 詳細設定 SMESH_OBJECT_MESH @@ -2189,7 +2193,7 @@ SMESH_PLANE - 平面 + Plane SMESH_POINT @@ -2261,19 +2265,19 @@ PREF_GROUP_NUMBERING - PREF_GROUP_NUMBERING + 番号 PREF_NUMBERING_NODE - PREF_NUMBERING_NODE + ノード: 色 PREF_NUMBERING_ELEM - PREF_NUMBERING_ELEM + エッジ: 色 PREF_NUMBERING_FONT - PREF_NUMBERING_FONT + フォント SMESH_PREFERENCES_SCALARBAR @@ -2393,7 +2397,7 @@ MEN_BIQUADRATIC_QUADRANGLE - バイカッド四角 + ラグランジュ2次四角形 TOP_BIQUADRATIC_QUADRANGLE @@ -2405,23 +2409,23 @@ SMESH_BIQUADRATIC_TRIANGLE - SMESH_BIQUADRATIC_TRIANGLE + バイカッド三角形 SMESH_BIQUADRATIC_TRIANGLES - SMESH_BIQUADRATIC_TRIANGLES + バイカッド三角形 MEN_BIQUADRATIC_TRIANGLE - MEN_BIQUADRATIC_TRIANGLE + ラグランジュ2次三角形 TOP_BIQUADRATIC_TRIANGLE - TOP_BIQUADRATIC_TRIANGLE + バイカッド三角形 STB_BIQUADRATIC_TRIANGLE - STB_BIQUADRATIC_TRIANGLE + バイカッド三角形 SMESH_QUADRATIC_TETRAHEDRON @@ -2485,11 +2489,11 @@ SMESH_REVOLUTION - 公転 + Revolution SMESH_RM_HYP_WRN - "1%"は未割り当てです。しかし: + 「%1」が原因ではない、しかし: SMESH_ROTATION @@ -2629,7 +2633,7 @@ SMESH_VECTOR - ベクトル + Vector SMESH_VERTICAL @@ -2657,11 +2661,11 @@ SMESH_VISU_PROBLEM_MEMORY - SMESH_VISU_PROBLEM_MEMORY + メッシュの表示の原因で失敗おそらくメモリ不足 SMESH_VISU_PROBLEM_CLEAR - メッシュを表示できません、ためすべてのビジュアル データは削除されている、メッセージを表示する十分なメモリがクラッシュ、アプリケーション。アプリケーションがクラッシュする前に作業内容を保存します。 + メッシュ、メッセージを表示する十分なメモリを視覚化することは不可能したがってすべてのビジュアル データのため削除されているクラッシュ アプリケーションにありません。アプリケーションがクラッシュする前に作業内容を保存します。 SMESH_VOLUME @@ -2669,7 +2673,7 @@ SMESH_VOLUMES - SMESH_VOLUMES + ボリューム SMESH_WARNING @@ -2705,7 +2709,7 @@ SMESH_WRN_HYPOTHESIS_NOTEXIST - 仮説やアルゴリズムは存在しません。 + 詳細設定やアルゴリズムは存在しません。 SMESH_WRN_MISSING_PARAMETERS @@ -2733,11 +2737,11 @@ SMESH_WRN_SIZE_LIMIT_EXCEEDED - presentationは自動更新されておりません。: 新しいメッシュサイズ(%1 要素)は現在のサイズ制限(%2 要素)を越えております。メッシュモジュール設定を確認してください。 + プレゼンテーションが更新されていない最後に自動的に: メッシュ (%1 項目) の新しいサイズが現在のサイズ制限 (%2 要素) を超えています。メッシュのモジュール設定の制限を確認してください。 SMESH_WRN_SIZE_INC_LIMIT_EXCEEDED - SMESH_WRN_SIZE_INC_LIMIT_EXCEEDED + 新しいメッシュ サイズ (%1 項目) 自動更新 (%2 項目) の現在のサイズ制限を超えています。次の要素が表示されない: 3%。「エンティティの表示」メニューを使用して表示します。 SMESH_WRN_WARNING @@ -2829,7 +2833,7 @@ STB_COMPUTE - 計算 + 計算します。 STB_PRECOMPUTE @@ -2853,11 +2857,11 @@ STB_CONV_TO_QUAD - 二次メッシュの作成 + 2次要素の追加 STB_2D_FROM_3D - Border 要素を作成します。 + 境界要素の作成 STB_MESH_ORDER @@ -2925,7 +2929,7 @@ STB_0D_ON_ALL_NODES - 0 D 要素の要素ノードを + ノードに d の要素を作成します。 STB_ELEMS0D @@ -2941,7 +2945,7 @@ STB_EDGE - エッジを作成 + Edge STB_EDGES @@ -2977,7 +2981,7 @@ STB_EXPORT_GMF - 組み換えファイルにエクスポートします。 + 組み換えをエクスポートします。 STB_EXPORT_SAUV @@ -2993,7 +2997,7 @@ STB_EXTRUSION - 押し出しを作成 + Extrusion STB_EXTRUSION_ALONG @@ -3001,7 +3005,7 @@ STB_FACES - フェース + Faces STB_BARE_BORDER_VOLUME @@ -3009,7 +3013,7 @@ STB_BARE_BORDER_FACE - 顔の皮膚 1 d 要素が不足しています。 + むき出しの境界線をもつフェース STB_OVER_CONSTRAINED_VOLUME @@ -3065,7 +3069,7 @@ STB_MAP - 軸に目盛り付け + パターンマッピング STB_MAX_ELEMENT_LENGTH_2D @@ -3237,7 +3241,7 @@ STB_REVOLUTION - 公転を作成 + Revolution STB_ROT @@ -3293,7 +3297,7 @@ STB_TAPER - コーン + Cone STB_TETRA @@ -3305,7 +3309,7 @@ STB_SCALE - オブジェクトのサイズを変更 + スケーリング STB_DUPLICATE_NODES @@ -3365,59 +3369,59 @@ STB_WHAT_IS - Whatis + 要素またはメッシュ ノードについて STB_WIRE - ワイヤーを構築 + ワイヤー TAPER_ELEMENTS - コーン + Cone TB_ADD - TB_ADD + 要素追加ツールバー TB_ADDNON - TB_ADDNON + 非線形要素追加ツールバー TB_REM - TB_REM + 削除ツールバー TB_RENUMBER - TB_RENUMBER + 番号変更ツールバー TB_TRANSFORM - TB_TRANSFORM + 変換ツールバー TB_CTRL0D - TB_CTRL0D + 節点制御ツールバー TB_CTRL1D - TB_CTRL1D + エッジ 制御ツールバー TB_CTRL2D - TB_CTRL2D + 面制御ツールバー TB_CTRL3D - TB_CTRL3D + ボリューム 制御 ツールバー TB_MEASUREM - TB_MEASUREM + 測定ツールバー TB_DISP_MODE - 可視化モード バー + 表示モード バー TB_HYPO @@ -3425,23 +3429,23 @@ TB_MESH - メッシュのバー + メッシュ ツールバー TB_GROUP - TB_GROUP + グループツールバー TB_INFO - TB_INFO + 情報ツールバー TB_ADD1D - TB_ADD1D + メッシュのバー TB_MODIFY - 変更バー + 変更ツールバー TOP_ADV_INFO @@ -3489,7 +3493,7 @@ TOP_COMPUTE - 計算 + 計算します。 TOP_PRECOMPUTE @@ -3501,11 +3505,11 @@ TOP_CONNECTION - 境界線上の複数の接続 + 複数の面に属する TOP_CONNECTION_2D - 境界線上の複数の接続 2 D + 複数の面に属する 2D TOP_CONSTRUCT_GROUP @@ -3513,11 +3517,11 @@ TOP_CONV_TO_QUAD - 二次メッシュの作成 + 2次要素の追加 TOP_2D_FROM_3D - Border 要素を作成します。 + 境界要素の作成 TOP_MESH_ORDER @@ -3581,7 +3585,7 @@ TOP_0D_ON_ALL_NODES - 0 D 要素の要素ノードを + ノードに d の要素を作成します。 TOP_ELEM0D @@ -3593,7 +3597,7 @@ TOP_BALL - 粒子 + 要素粒子 TOP_BALLS @@ -3601,7 +3605,7 @@ TOP_EDGE - エッジを構築 + Edge TOP_EDGES @@ -3645,7 +3649,7 @@ TOP_EXTRUSION - 押し出しを作成 + Extrusion TOP_EXTRUSION_ALONG @@ -3653,7 +3657,7 @@ TOP_FACES - フェース + Faces TOP_BARE_BORDER_VOLUME @@ -3661,7 +3665,7 @@ TOP_BARE_BORDER_FACE - 顔の皮膚 1 d 要素が不足しています。 + むき出しの境界線をもつフェース TOP_OVER_CONSTRAINED_VOLUME @@ -3717,7 +3721,7 @@ TOP_MAP - 軸に目盛り付け + パターンマッピング TOP_MAX_ELEMENT_LENGTH_2D @@ -3753,7 +3757,7 @@ TOP_IMPORT_GMF - 組み換えファイルのインポート + 組み換えファイルをインポートします。 TOP_GMF @@ -3889,7 +3893,7 @@ TOP_REVOLUTION - 公転を作成 + Revolution TOP_ROT @@ -3945,7 +3949,7 @@ TOP_TAPER - コーン + Cone TOP_TETRA @@ -3957,7 +3961,7 @@ TOP_SCALE - サイズを変更 + スケーリング TOP_DUPLICATE_NODES @@ -4017,11 +4021,11 @@ TOP_WHAT_IS - Whatis + メッシュの要素に関する情報 TOP_WIRE - ワイヤーを構築 + Wires UNKNOWN_CONTROL @@ -4029,7 +4033,7 @@ UPDATE_DESTINATION - UPDATE_DESTINATION + 宛先を更新します。 VOLUME_3D_ELEMENTS @@ -4109,7 +4113,7 @@ FULL_RECOMPUTE_QUESTION - \n ワークフロー メッシュ、最後の完全計算後編集されて、\nceci は、正しい計算を防ぐことができます変更を拒否するには、全体のメッシュを再計算しますか?。 + メッシュは、最後の完全な計算後編集されています、これは正しい計算を防ぐことができます。変更を破棄するメッシュ全体を再計算しますか。 SMESH_PREF_vol_precision @@ -4117,7 +4121,7 @@ SMESH_PRECISION_HINT - メッシュモジュール設定の中の'%1'パラメータを用いて入力した値の精度を調整することができます。 + パラメーターの入力値の有効桁数を変更することは 'メッシュ モジュール プリファレンスの 1' %。 REMOVE_ORPHAN_NODES_QUESTION @@ -4153,23 +4157,23 @@ DEP_OBJECT - 選択したオブジェクトは、別のオブジェクトの作成に使用されました。 削除することはできません。 + 選択したオブジェクトは、新しいものの作成に使用されました。このファイルは削除できません。 SMESH_FREERAM - SMESH_FREERAM + Ram の空き容量 SMESH_GIGABYTE - SMESH_GIGABYTE + %1 GB MEN_SORT_CHILD_ITEMS - MEN_SORT_CHILD_ITEMS + 並べ替えの子供 STB_SORT_CHILD_ITEMS - STB_SORT_CHILD_ITEMS + 子アイテムを並べ替える @@ -4191,7 +4195,7 @@ SMESHGUI NOT_A_VTK_VIEWER - このコマンドは、VTK ウィンドウからのみです。VTK ウィンドウを開き、もう一度やり直してください。 + このコマンドは、VTK ウィンドウからのみ使用できます。VTK ウィンドウを開き、もう一度やり直してください。 PREF_AUTO_GROUPS @@ -4231,11 +4235,11 @@ PREF_INCREMENTAL_LIMIT - PREF_INCREMENTAL_LIMIT + 増分限度額の確認 PREF_BACKFACE - 背面の色 + カラー フロント バック PREF_VOLUME @@ -4243,7 +4247,7 @@ PREF_REVERSEDVOLUME - 逆ボリューム ・ カラー + ボリューム ・ カラーを反転します。 PREF_WIREFRAME @@ -4303,7 +4307,7 @@ PREF_PREVIEW_COLOR - PREF_PREVIEW_COLOR + プレビュー色 PREF_NOTIFY_MODE @@ -4335,23 +4339,23 @@ PREF_ELEM_INFO_GRP_DETAILS - PREF_ELEM_INFO_GRP_DETAILS + Dl 情報 page'element のグループの詳細を見る PREF_DUMP_BASE_INFO - PREF_DUMP_BASE_INFO + 基本情報の書き出し PREF_DUMP_ELEM_INFO - PREF_DUMP_ELEM_INFO + 要素情報の書き出し PREF_DUMP_ADD_INFO - PREF_DUMP_ADD_INFO + 追加情報の書き出し PREF_DUMP_CTRL_INFO - PREF_DUMP_CTRL_INFO + 品質情報の書き出し PREF_GPP_NODES_LIMIT @@ -4359,7 +4363,7 @@ PREF_CTRL_LIMIT - PREF_CTRL_LIMIT + 自動制御計算の制限 SMESH_PREF_GROUP_PRECISION @@ -4515,11 +4519,11 @@ PREF_WIDTH - 線の幅 + 線の太さ PREF_OUTLINE_WIDTH - アウトラインの幅 + アウトラインの太さ PREF_PREVIEW_CHUNK_SIZE @@ -4537,7 +4541,7 @@ SMESHGUI_Add0DElemsOnAllNodesDlg CAPTION - 0 D 要素の要素ノードを + ノードに d の要素を作成します。 OBJ_BTN @@ -4545,14 +4549,14 @@ NB_NEW_0D - %1 0 D 要素の作成 + 作成された %1 項目 d SMESHGUI_Add0DElemsOnAllNodesOp NB_NEW_0D - %1 0 D 要素の作成 + 作成された %1 項目 d @@ -4595,7 +4599,7 @@ SMESH_ADD_BIQUADRATIC_TRIANGLE - SMESH_ADD_BIQUADRATIC_TRIANGLE + バイカッド三角形を追加します。 SMESH_CORNER_NODES @@ -4626,7 +4630,7 @@ SMESHGUI_BuildCompoundDlg COMPOUND - コンパウンド + Compound COMPOUND_MESH @@ -4708,22 +4712,22 @@ GROUP_OF_BAD_MESH - GROUP_OF_BAD_MESH + グループに不正メッシュ SMESHGUI_ComputeDlg_QThreadQDialog CANCEL - CANCEL + キャンセル CANCELING - CANCELING + キャンセルしています. TITLE - TITLE + 計算 @@ -4746,14 +4750,14 @@ COMPUTE - 計算 + 計算します。 SMESHGUI_PrecomputeOp CLEAR_SUBMESH_QUESTION - 一時 sous-maillages は、選択したジオメトリのプレビューの操作を作成しています。すべてのこれらの sous maillages を削除しますか。 + 一時的なサブメッシュを作成されている、選択したジオメトリのプレビュー中に。これらのすべてのサブ メッシュを削除しますか。 SMESH_WRN_NOTHING_PREVIEW @@ -4761,14 +4765,14 @@ SMESH_REJECT_MESH_ORDER - Sous maillages の優先順位は、プレビューで変更されています。初期の優先度を復元しますか。 + サブメッシュの優先順位は、プレビュー時に変更されました。初期の優先度を復元しますか。 SMESHGUI_ConvToQuadDlg CAPTION - 二次要素への変換/二次要素からの変換 + 2次要素の追加 MEDIUMNDS @@ -4788,7 +4792,7 @@ RADIOBTN_3 - RADIOBTN_3 + Bi quadratique への変換します。 NON_CONFORM_WARNING @@ -4799,7 +4803,7 @@ SMESHGUI_ConvToQuadOp MESH_IS_NOT_SELECTED - 選択したメッシュはありません。メッシュを選択し、もう一度やり直してください。 + メッシュが選択されていないこのことを示すしてくださいもう一度やり直してください REF_IS_NULL @@ -4810,7 +4814,7 @@ SMESHGUI_CreatePatternDlg CAPTION - パターンの作成 + パターンマッピング DEFAULT_2D @@ -4822,11 +4826,11 @@ ERROR_OF_CREATION - 情報の有効性を確認するには、地上の作成中に内部エラーが発生しました + グラウンド チェック、情報の妥当性の作成中に内部エラーが発生 ERROR_OF_SAVING - フィルターのライブラリの保護でにエラーが発生しました。情報の有効性をチェックします。 + 地面の記録中に内部エラーが発生しました。ディスクの空き領域と、このファイルへの書き込み権限を確認してください。 ERR_LOADF_CANT_PROJECT @@ -4908,18 +4912,18 @@ TO_4_TRIA - TO_4_TRIA + 4 三角形にカットします。 SMESHGUI_DeleteGroupDlg CAPTION - 中身ごとグループの削除 + グループとその内容を削除します。 NO_SELECTED_GROUPS - 選択したグループがない、グループを選択し、もう一度やり直してください。 + あるなし選択したグループをグループを選択し、もう一度やり直してください SELECTED_GROUPS @@ -4950,11 +4954,11 @@ SHOW_NODES_IDS - SHOW_NODES_IDS + 二重ノード Id を表示します。 SHOW_ELEMS_IDS - SHOW_ELEMS_IDS + 二重要素の Id を表示します。 EXCLUDE_GROUPS @@ -4985,7 +4989,7 @@ EXTRUSION_ALONG_PATH - 経路に沿って押出し + 経路に沿って押し出し EXTR_BAD_STARTING_NODE @@ -5063,7 +5067,7 @@ SMESHGUI_FilterDlg BAD_SHAPE_NAME - 現在のstudyではジオメトリオブジェクト"%1"はありません、有効なオブジェクトを選択し、もう一度やり直してください。 + 本研究ではないオブジェクト ジオメトリ '%' がある、有効なオブジェクトを選択して、もう一度やり直してください。 CURRENT_DIALOG @@ -5103,23 +5107,23 @@ SHAPE_IS_NOT_A_CYLINDER - "%1" 円筒面選択ではない円筒サーフェスともう一度やり直してください + "%1"は、円筒面を選択していないが、円筒面ともう一度やり直してください。 SHAPE_IS_NOT_A_FACE - "%1" は面ではありません。\n面を選択してもう一度やり直してください。 + "%1"は、顔を選択していないが、顔ともう一度やり直してください。 SHAPE_IS_NOT_A_PLANE - "%1" は平面ではありません\n平面を選択し、もう一度やり直してください。 + "%1"は計画を選択していないが、平面ともう一度やり直してください。 FACE_ID_NOT_SELECTED - メッシュフェースが選択されていません。\nもう一度指定してやり直してください + 標準顔メッシュが選択されていません。それを入力し、もう一度やり直してください。 NOT_FACE_ID - "%1" では、顔、メッシュ内の有効な ID は一致しません。アドレスを選択し、もう一度やり直してください。 + '%' は、メッシュの側の任意の有効な ID と一致します。面を選択し、もう一度やり直してください。 SOURCE @@ -5150,7 +5154,7 @@ ASSIGN_NEW_NAME - ライブラリに既に"%1"追加フィルターに起因する"%2"の新しい名前名前フィルターが含まれています + ライブラリはすでにフィルターが含まれている名前 '%' で新しい名前 '%' は、追加のフィルターに起因します。 COPY_FROM_TLT @@ -5162,7 +5166,7 @@ EDGE - エッジ + Edge EDIT_LIB_TLT @@ -5174,39 +5178,39 @@ EMPTY_FILTER_NAME - フィルターの名前を空の空でない名前です。 + フィルター名を空が空でない名前を指定します。 ERROR_FILTER_NAME - フィルター名は一意ではない別の名前を入力 + フィルター名が一意でない別の名前を入力してください ERROR_LOAD - チェック ファイルをライブラリとそのプロパティの名前を読み込むことができません。 + ライブラリのチェック、ライブラリ ファイルおよびそのプロパティの名前をロードすることはできません。 ERROR_OF_ADDING - また、ライブラリに新しいフィルターの内部エラーが発生しました。情報の有効性をチェックします。 + 本屋で新しいフィルターのさらに内部エラーが発生しました。情報の有効性を確認します。 ERROR_OF_COPYING - 内部エラーをフィルターのコピーには、書店からが発生しました。情報の有効性をチェックします。 + 内部エラーが本屋からフィルターのコピーに発生しました。情報の有効性を確認します。 ERROR_OF_DELETING - 書店からフィルターを削除中に内部エラーが発生しました。情報の有効性をチェックします。 + 本屋からフィルターを削除すると内部エラーが発生しました。情報の有効性を確認します。 ERROR_OF_EDITING - ライブラリ内のフィルターの編集で内部エラーが発生しました。情報の有効性をチェックします。 + 本屋でフィルターの版で内部エラーが発生しました。情報の有効性を確認します。 ERROR_OF_SAVING - フィルターのライブラリの保護でにエラーが発生しました。情報の有効性をチェックします。 + フィルターのライブラリの保全にエラーが発生しました。情報の有効性を確認します。 FACE - 顔 + Face FILTER @@ -5341,11 +5345,11 @@ CONNECTED_ELEMS - CONNECTED_ELEMS + ドメインの要素 NUMBEROFNODESINELEMENT - NUMBEROFNODESINELEMENT + 要素内のノード数 COPY_FROM @@ -5373,11 +5377,11 @@ ERROR - しきい値が無効です \n 有効な値を入力し、もう一度やり直してください。 + しきい値が無効です。有効な値を入力し、もう一度やり直してください。 FACES - フェース + Faces FILTER @@ -5441,11 +5445,11 @@ MULTIEDGES_ERROR - 接続されている複数のしきい値値ありますに等しいないエッジ 1 正しい値を入力し、もう一度やり直してください + マルチ接続されたエッジのしきい値値を等しくすることはできません 1 に正しい値を入力して、もう一度やり直して GROUPCOLOR_ERROR - 識別できません、カラー グループの正しい値を入力して再試行してください。 + 識別できません、グループの色正しい値を入力やり直してください。 MULTI_BORDERS @@ -5477,7 +5481,7 @@ TAPER - テーパー + Cone THRESHOLD_VALUE @@ -5517,103 +5521,103 @@ ENTITY_TYPE_0 - ENTITY_TYPE_0 + POINT1 ENTITY_TYPE_1 - ENTITY_TYPE_1 + POINT1 ENTITY_TYPE_2 - ENTITY_TYPE_2 + SEG2 ENTITY_TYPE_3 - ENTITY_TYPE_3 + SEG3 ENTITY_TYPE_4 - ENTITY_TYPE_4 + TRIA3 ENTITY_TYPE_5 - ENTITY_TYPE_5 + TRIA6 ENTITY_TYPE_6 - ENTITY_TYPE_6 + QUAD4 ENTITY_TYPE_7 - ENTITY_TYPE_7 + QUAD8 ENTITY_TYPE_8 - ENTITY_TYPE_8 + QUAD9 ENTITY_TYPE_9 - ENTITY_TYPE_9 + TETRA4 ENTITY_TYPE_10 - ENTITY_TYPE_10 + TETRA10 ENTITY_TYPE_11 - ENTITY_TYPE_11 + PYRA5 ENTITY_TYPE_12 - ENTITY_TYPE_12 + PYRA13 ENTITY_TYPE_13 - ENTITY_TYPE_13 + PENTA6 ENTITY_TYPE_14 - ENTITY_TYPE_14 + PENTA15 ENTITY_TYPE_15 - ENTITY_TYPE_15 + HEXA8 ENTITY_TYPE_16 - ENTITY_TYPE_16 + HEXA20 ENTITY_TYPE_17 - ENTITY_TYPE_17 + HEXA27 ENTITY_TYPE_18 - ENTITY_TYPE_18 + OCTA12 ENTITY_TYPE_19 - ENTITY_TYPE_19 + ポリゴン ENTITY_TYPE_20 - ENTITY_TYPE_20 + POLYEDRE ENTITY_TYPE_21 - ENTITY_TYPE_21 + [なし] ENTITY_TYPE_22 - ENTITY_TYPE_22 + ボール ENTITY_TYPE_23 - ENTITY_TYPE_23 + QPOLYEDRE ENTITY_TYPE_24 - ENTITY_TYPE_24 + ボール GEOM_TYPE @@ -5625,7 +5629,7 @@ GEOM_TYPE_1 - エッジ + Edge GEOM_TYPE_2 @@ -5665,7 +5669,7 @@ GEOM_TYPE_11 - 粒子 + 要素粒子 @@ -5676,19 +5680,19 @@ DIFF_MESHES - グループ別のメッシュを有効な引数に対応して再度操作の引数が正しく示されない + グループ異なるメッシュを与える有効な引数に対応し、もう一度やり直してください、操作の引数が正しく示されていません。 DIFF_TYPES - グループの種類を有効な引数の要素を含む、やり直して操作の引数が正しく示されない + グループのさまざまな種類を与える有効な引数の要素を含めるし、もう一度やり直してください、操作の引数が正しく示されていません。 EMPTY_NAME - グループ名は無効な空でない名前で、もう一度やり直してください。 + グループの名前は有効な空でない名を指定し、もう一度やり直してください INCORRECT_ARGUMENTS - 操作の引数が表示されていないを入力してもう一度やり直してください + 操作の引数されていないそれらを入力し、もう一度やり直してください NAME @@ -5719,7 +5723,7 @@ SMESHGUI_GroupDlg SELECT_ALL - すべてを選択します。 + すべて選択します。 @@ -5745,11 +5749,11 @@ EDGE - エッジ + Edge FACE - 顔 + Face VOLUME @@ -5786,7 +5790,7 @@ CAPTION - 節点移動 + ノードを移動 DESTINATION @@ -5828,7 +5832,7 @@ CAPTION - 点から要素探索 + ポイントで要素を見つける CREATE_NEW_METHOD @@ -5891,7 +5895,7 @@ HYPOTHESES_SETS - 前提条件のセットを割り当てる + 詳細設定セットの割当て MESH @@ -5910,7 +5914,7 @@ EDIT_SUBMESH_QUESTION - Sous maillage はこの sous maillage を編集する選択したジオメトリに既に存在するか? + サブ メッシュは、選択したジオメトリに既に存在するこのサブ メッシュを編集したいですか? SUBMESH_NOT_ALLOWED @@ -5918,7 +5922,7 @@ GEOMETRY_OBJECT_IS_NOT_DEFINED - 幾何学的オブジェクトが設定されていないを入力して、もう一度やり直してください + 幾何学的オブジェクトが定義されてそれを言及し、もう一度やり直してください GEOMETRY_OBJECT_IS_NULL @@ -5942,7 +5946,7 @@ MESH_IS_NOT_DEFINED - メッシュが定義されていない指定、もう一度やり直してください + メッシュが定義されていないを指定し、もう一度やり直してくださいすることができます MESH_IS_NULL @@ -5950,15 +5954,15 @@ NAME_OF_MESH_IS_EMPTY - メッシュの名前が空である、有効な名前を指定して、やり直してください + メッシュの名前は空です有効な名前を入力し、もう一度やり直してください NAME_OF_SUBMESH_IS_EMPTY - Sous maillage の名前が空である、有効な名前を指定して、やり直してください + サブ メッシュの名前は空です有効な名前を入力し、もう一度やり直してください THERE_IS_NO_OBJECT_FOR_EDITING - 編集するオブジェクトはありません。メッシュまたは sous maillage を選択し、もう一度やり直してください。 + 編集するオブジェクトはありません。メッシュまたはサブメッシュを選択し、もう一度やり直してください。 @@ -5981,55 +5985,55 @@ ERROR_OF_LOADING - 地面をロードできませんでした。ファイルが壊れているか、他のタイプの理由が含まれていることは + 地面をロードできませんでした。ファイルが壊れているか、他の種類のパターンが含まれている可能性が高いです。 ERROR_OF_OPENING - ファイルを開くことはできません。かどうかを確認し、アクセス許可がある場合 + ファイルを開くことはできません。それが存在する場合、アクセス許可がある場合を確認してください。 ERROR_OF_READING - 接地のチェック、ファイルの内容をロードすることはできません。 + 地面のチェック、ファイルの内容をロードすることはできません。 ERR_READ_3D_COORD - 3 D の点の座標が [0, 1] の範囲外であるためにをロードすることはできません。 + 3D ポイントの座標は間隔 [0, 1] の外の地面をロードすることはできません。 ERR_READ_BAD_INDEX - 無効なポイントのインデックスが検出されましたが、地面を読み込むことができません。 + 無効なポイント インデックスが検出されました地面をロードすることはできません。 ERR_READ_BAD_KEY_POINT - ポイントの境界線に存在しないために読み込むことができません。 + 重要なポイント上にある罫線パターンをロードすることはできません。 ERR_READ_ELEM_POINTS - ポイント要素の数が無効であるためにをロードすることはできません。 + 要素の点の数が無効です理由をロードすることはできません。 ERR_READ_NB_POINTS - ファイル内のポイント数を読み取ることできないためにをロードすることはできません。 + ファイル内のポイントの番号を読み取ることはできません。 のでロードすることはできません。 ERR_READ_NO_ELEMS - 要素が含まれていないために読み込むことができません。 + 要素が含まれていないために、読み込みすることはできません。 ERR_READ_NO_KEYPOINT - 2D ポイント キーではないため、地面を読み込むことができません。 + 二次元パターンはしなかった地面をロードすることはできませんポイント キー ERR_READ_POINT_COORDS - ファイル内の点の座標を読み取ることできないためにをロードすることはできません。 + ファイル内の点の座標を読み取るすることはできません。 のでロードすることはできません。 ERR_READ_TOO_FEW_POINTS - 地面を読み込むことはできません。ファイルにあまりにも少ないです。 + 地面をロードすることはできません。ファイルにあまりにもいくつかのポイントがあります。 FACE - 顔 + Face LOAD_PATTERN @@ -6096,7 +6100,7 @@ SMESHGUI_MeshTab ADD_HYPOTHESIS - 前提条件を追加 + 詳細設定の追加項目 ALGORITHM @@ -6104,7 +6108,7 @@ HYPOTHESIS - 前提条件 + 詳細設定 NONE @@ -6376,7 +6380,7 @@ MAX_ASPECT_RATIO - 最大比 + 最大アスペクト比 METHOD @@ -6394,7 +6398,7 @@ SMESHGUI_UnionOfTrianglesDlg CAPTION - 三角形要素の結合 + 三角形の結合 MAXIMUM_ANGLE @@ -6405,7 +6409,7 @@ SMESHGUI_UnionOfTwoTrianglesDlg CAPTION - 2つの三角形要素を結合 + 2 つの三角形の結合 @@ -6454,6 +6458,10 @@ CLIP_PLANES 切断の計画 + + IS_OPENGL_CLIPPING + OpenGL クリッピング + MESHES_SUBMESHES_GROUPS メッシュ、サブメッシュ、グループ @@ -6508,12 +6516,36 @@ PLANE_NUM - 平面 #%1 + Plan# %1 NO_PLANES 計画の手順 + + ABSOLUTE + 絶対 + + + RELATIVE + 相対 + + + BASE_POINT + 基準点 + + + DIRECTION + 方向 + + + RESET + リセット + + + INVERT + 反転 + SMESHGUI_DuplicateNodesDlg @@ -6539,7 +6571,7 @@ DUPLICATION_ONLY_ELEMS - DUPLICATION_ONLY_ELEMS + 重複する要素のみ GROUP_ELEMS_TO_DUPLICATE @@ -6621,7 +6653,7 @@ WRONG_GROUPS - 次のグループ traités\nen は、incompatibles:\n%1 型のためでした。 + 次のグループを互換性のないタイプのため扱われなかった: %1 SMESH_ERR_NO_INPUT_MESH @@ -6656,7 +6688,7 @@ SMESHGUI_MeshInfo BASE_INFO - BASE_INFO + 基本情報 NAME_LAB @@ -6803,7 +6835,7 @@ CTRL_INFO - CTRL_INFO + 品質情報 NODE_MODE @@ -6815,15 +6847,15 @@ BUT_DUMP_MESH - BUT_DUMP_MESH + 書き出し(&D) TEXT_FILES - TEXT_FILES + テキスト ファイル (*.txt) SAVE_INFO - SAVE_INFO + 情報を保存します。 X_FROM_Y_ITEMS_SHOWN @@ -6834,7 +6866,7 @@ SMESHGUI_ElemInfo ELEM_INFO - ELEM_INFO + 要素情報 COORDINATES @@ -6878,11 +6910,11 @@ FACE - 顔 + Face FACES - フェース + Faces VOLUME @@ -6950,69 +6982,69 @@ BALL_DIAMETER - BALL_DIAMETER + 直径 GEOM_VERTEX - GEOM_VERTEX + Vertex GEOM_EDGE - GEOM_EDGE + Edge GEOM_FACE - GEOM_FACE + Face GEOM_SOLID - GEOM_SOLID + ソリッド GEOM_SHELL - GEOM_SHELL + シェル GEOM_SHAPE - GEOM_SHAPE + 形状 POSITION - POSITION + 位置 U_POSITION - U_POSITION + U V_POSITION - V_POSITION + V CONTROLS - CONTROLS + 品質コントロール SMESHGUI_TreeElemInfo SHOW_ITEM_INFO - SHOW_ITEM_INFO + 情報を表示します。 PROPERTY - PROPERTY + プロパティ VALUE - VALUE + 値 SMESHGUI_AddInfo ADDITIONAL_INFO - ADDITIONAL_INFO + 追加情報 NAME @@ -7032,7 +7064,7 @@ GROUPS_3 - フェース + Faces GROUPS_4 @@ -7060,7 +7092,7 @@ GROUP_ON_GEOMETRY - グループは、ジオメトリにリンク + ジオメトリ上のグループ GROUP_ON_FILTER @@ -7076,11 +7108,11 @@ EDGE - エッジ + Edge FACE - 顔 + Face VOLUME @@ -7116,7 +7148,7 @@ COMPUTE - 計算 + 計算します。 LOAD @@ -7144,7 +7176,7 @@ SUBMESHES_0 - アセンブリ + Compound SUBMESHES_2 @@ -7156,7 +7188,7 @@ SUBMESHES_4 - フェース + Face SUBMESHES_5 @@ -7175,90 +7207,90 @@ SMESHGUI_CtrlInfo CTRL_INFO - CTRL_INFO + 品質情報 NAME_LAB - NAME_LAB + 名前: VALUE - VALUE + 値 BUT_COMPUTE - BUT_COMPUTE + 計算 NODES_INFO - NODES_INFO + ノード情報: NUMBER_OF_THE_FREE_NODES - NUMBER_OF_THE_FREE_NODES + 空きノードの数 DOUBLE_NODES_TOLERANCE - DOUBLE_NODES_TOLERANCE + 重複節点の許容値 NUMBER_OF_THE_DOUBLE_NODES - NUMBER_OF_THE_DOUBLE_NODES + 重複節点の数 EDGES_INFO - EDGES_INFO + エッジ情報: NUMBER_OF_THE_DOUBLE_EDGES - NUMBER_OF_THE_DOUBLE_EDGES + 重複エッジの数 FACES_INFO - FACES_INFO + 顔情報: NUMBER_OF_THE_DOUBLE_FACES - NUMBER_OF_THE_DOUBLE_FACES + 重複面の数 ASPECT_RATIO_HISTOGRAM - ASPECT_RATIO_HISTOGRAM + アスペクト比のヒストグラム VOLUMES_INFO - VOLUMES_INFO + ボリューム情報: NUMBER_OF_THE_DOUBLE_VOLUMES - NUMBER_OF_THE_DOUBLE_VOLUMES + 重複ボリュームの数 NUMBER_OF_THE_OVER_CONSTRAINED - NUMBER_OF_THE_OVER_CONSTRAINED + 過剰制約の数 ASPECT_RATIO_3D_HISTOGRAM - ASPECT_RATIO_3D_HISTOGRAM + アスペクト比 3 D ヒストグラム SMESHGUI_CtrlInfoDlg CTRL_INFO - CTRL_INFO + 品質情報 BUT_DUMP_MESH - BUT_DUMP_MESH + 書き出し(&D) TEXT_FILES - TEXT_FILES + テキスト ファイル (*.txt) SAVE_INFO - SAVE_INFO + 情報を保存します。 @@ -7289,7 +7321,7 @@ COMPUTE - 計算 + 計算します。 RESULT @@ -7304,27 +7336,27 @@ SMESHGUI_BasicProperties PROPERTY - PROPERTY + プロパティ LENGTH - LENGTH + 長さ AREA - AREA + エリア VOLUME - VOLUME + ボリューム SOURCE_MESH_SUBMESH_GROUP - SOURCE_MESH_SUBMESH_GROUP + ソース メッシュ、サブメッシュ (グループ) COMPUTE - COMPUTE + 計算 @@ -7358,7 +7390,7 @@ BASIC_PROPERTIES - BASIC_PROPERTIES + 基本的なプロパティ @@ -7381,7 +7413,7 @@ COMPUTE - 計算 + 計算します。 RESULT @@ -7438,7 +7470,7 @@ FACE - 顔 + Face FACES @@ -7480,15 +7512,15 @@ NODES - ノード + 節点 EDGES - エッジ + エッジ/ワイヤ フレーム モード FACES - フェース + Faces VOLUMES @@ -7496,11 +7528,11 @@ OUTLINES - 概要 + Wires 0D_ELEMENTS - 0D要素 + 0D要素 BALLS @@ -7516,15 +7548,15 @@ WIDTH - 幅: + 厚さ: FACE_FRONT - フロント: + フロント: FACE_BACK - 戻る: + リア: VOLUME_NORMAL @@ -7532,7 +7564,7 @@ VOLUME_REVERSED - 元に戻します。 + 逆。 SIZE @@ -7548,7 +7580,7 @@ SHRINK - 縮小係数: + 減少係数: diff --git a/src/SMESH_I/SMESH_Filter_i.cxx b/src/SMESH_I/SMESH_Filter_i.cxx index 61d8faa5a..5ccc12bff 100644 --- a/src/SMESH_I/SMESH_Filter_i.cxx +++ b/src/SMESH_I/SMESH_Filter_i.cxx @@ -3067,8 +3067,8 @@ CORBA::Boolean Filter_i::SetCriteria( const SMESH::Filter::Criteria& theCriteria } SetPredicate( aResPredicate ); - - aResPredicate->UnRegister(); + if ( !aResPredicate->_is_nil() ) + aResPredicate->UnRegister(); return !aResPredicate->_is_nil(); } diff --git a/src/SMESH_I/SMESH_MeshEditor_i.cxx b/src/SMESH_I/SMESH_MeshEditor_i.cxx index 359b865e1..69bf34ec1 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.cxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.cxx @@ -227,22 +227,22 @@ namespace MeshEditor_I { } myMesh = mesh; myMeshPartIOR = meshPartIOR; - if ( SMESH_subMesh* myMainSubMesh = mesh->GetSubMeshContaining(1) ) { - const TDependsOnMap & subMeshes = myMainSubMesh->DependsOn(); - TDependsOnMap::const_iterator sm; - for (sm = subMeshes.begin(); sm != subMeshes.end(); sm++) - sm->second->SetEventListener( this, 0, sm->second ); + SMESH_subMesh* sm = mesh->GetSubMesh( mesh->GetShapeToMesh() ); + SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator( /*includeSelf=*/true ); + while ( smIt->more() ) + { + sm = smIt->next(); + sm->SetEventListener( this, 0, sm ); } } } //!< delete self from all submeshes void Unset(SMESH_Mesh* mesh) { - if ( SMESH_subMesh* myMainSubMesh = mesh->GetSubMeshContaining(1) ) { - const TDependsOnMap & subMeshes = myMainSubMesh->DependsOn(); - TDependsOnMap::const_iterator sm; - for (sm = subMeshes.begin(); sm != subMeshes.end(); sm++) - sm->second->DeleteEventListener( this ); + if ( SMESH_subMesh* sm = mesh->GetSubMeshContaining(1) ) { + SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator( /*includeSelf=*/true ); + while ( smIt->more() ) + smIt->next()->DeleteEventListener( this ); } myMesh = 0; } @@ -1747,7 +1747,7 @@ CORBA::Boolean SMESH_MeshEditor_i::TriToQuad (const SMESH::long_array & IDsOfE if ( !myIsPreviewMode ) { // Update Python script TPythonDump() << "isDone = " << this << ".TriToQuad( " - << IDsOfElements << ", " << aNumericalFunctor << ", " << TVar( MaxAngle ) << " )"; + << IDsOfElements << ", " << aNumericalFunctor << ", " << TVar( MaxAngle ) << " )"; } bool stat = getEditor().TriToQuad( *workElements, aCrit, MaxAngle ); @@ -1785,7 +1785,7 @@ CORBA::Boolean SMESH_MeshEditor_i::TriToQuadObject (SMESH::SMESH_IDSource_ptr // Update Python script aTPythonDump << "isDone = " << this << ".TriToQuadObject(" - << theObject << ", " << aNumericalFunctor << ", " << TVar( MaxAngle ) << " )"; + << theObject << ", " << aNumericalFunctor << ", " << TVar( MaxAngle ) << " )"; } return isDone; diff --git a/src/SMESH_SWIG/smesh.py b/src/SMESH_SWIG/smesh.py index ed09eab90..99ab3db11 100644 --- a/src/SMESH_SWIG/smesh.py +++ b/src/SMESH_SWIG/smesh.py @@ -32,9 +32,8 @@ import salome from salome import * -import GEOM -from salome.geom import geomBuilder -geompy = geomBuilder.New(salome.myStudy) +import geompy + import SMESH, SALOMEDS from salome.smesh import smeshBuilder @@ -60,7 +59,8 @@ for pluginName in os.environ[ "SMESH_MeshersList" ].split( ":" ): try: exec( "from salome.%s.%s import *" % (pluginName, pluginBuilderName)) except Exception, e: - print "Exception while loading %s: %s" % ( pluginBuilderName, e ) + from salome_utils import verbose + if verbose(): print "Exception while loading %s: %s" % ( pluginBuilderName, e ) continue exec( "from salome.%s import %s" % (pluginName, pluginBuilderName)) plugin = eval( pluginBuilderName ) diff --git a/src/SMESH_SWIG/smeshBuilder.py b/src/SMESH_SWIG/smeshBuilder.py index cbf8f5cba..5e68dc230 100644 --- a/src/SMESH_SWIG/smeshBuilder.py +++ b/src/SMESH_SWIG/smeshBuilder.py @@ -4655,7 +4655,8 @@ for pluginName in os.environ[ "SMESH_MeshersList" ].split( ":" ): try: exec( "from salome.%s.%s import *" % (pluginName, pluginBuilderName)) except Exception, e: - print "Exception while loading %s: %s" % ( pluginBuilderName, e ) + from salome_utils import verbose + if verbose(): print "Exception while loading %s: %s" % ( pluginBuilderName, e ) continue exec( "from salome.%s import %s" % (pluginName, pluginBuilderName)) plugin = eval( pluginBuilderName ) diff --git a/src/SMESH_SWIG_WITHIHM/CMakeLists.txt b/src/SMESH_SWIG_WITHIHM/CMakeLists.txt index 0a3e36414..d900626ef 100644 --- a/src/SMESH_SWIG_WITHIHM/CMakeLists.txt +++ b/src/SMESH_SWIG_WITHIHM/CMakeLists.txt @@ -95,6 +95,10 @@ SET(_swig_SCRIPTS SWIG_ADD_MODULE(libSMESH_Swig python ${SMESH_Swig_SOURCES}) SWIG_LINK_LIBRARIES(libSMESH_Swig ${_link_LIBRARIES}) +IF(WIN32) + SET_TARGET_PROPERTIES(_libSMESH_Swig PROPERTIES DEBUG_OUTPUT_NAME _libSMESH_Swig_d) +ENDIF(WIN32) + INSTALL(TARGETS _libSMESH_Swig DESTINATION ${SALOME_INSTALL_LIBS}) INSTALL(FILES ${SMESH_Swig_HEADERS} DESTINATION ${SALOME_INSTALL_HEADERS}) diff --git a/src/StdMeshers/StdMeshers_Adaptive1D.cxx b/src/StdMeshers/StdMeshers_Adaptive1D.cxx index dca26df0c..1d3d0f31a 100644 --- a/src/StdMeshers/StdMeshers_Adaptive1D.cxx +++ b/src/StdMeshers/StdMeshers_Adaptive1D.cxx @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -167,6 +168,37 @@ namespace // internal utils SegSizeTree* mySizeTree; }; + //================================================================================ + /*! + * \brief Segment of Poly_PolygonOnTriangulation + */ + struct Segment + { + gp_XYZ myPos, myDir; + double myLength; + + void Init( const gp_Pnt& p1, const gp_Pnt& p2 ) + { + myPos = p1.XYZ(); + myDir = p2.XYZ() - p1.XYZ(); + myLength = myDir.Modulus(); + if ( myLength > std::numeric_limits::min() ) + myDir /= myLength; + } + bool Distance( const gp_Pnt& P, double& dist ) const // returns length of normal projection + { + gp_XYZ p = P.XYZ(); + p.Subtract( myPos ); + double proj = p.Dot( myDir ); + if ( 0 < proj && proj < myLength ) + { + p.Cross( myDir ); + dist = p.Modulus(); + return true; + } + return false; + } + }; //================================================================================ /*! * \brief Data of triangle used to locate it in an octree and to find distance @@ -174,14 +206,17 @@ namespace // internal utils */ struct Triangle { - Bnd_B3d myBox; - bool myIsChecked; // to mark treated trias instead of using std::set + Bnd_B3d myBox; + bool myIsChecked; // to mark treated trias instead of using std::set + bool myHasNodeOnVertex; + Segment* mySegments[3]; // data for DistToProjection() - gp_XYZ myN0, myEdge1, myEdge2, myNorm, myPVec; - double myInvDet, myMaxSize2; + gp_XYZ myN0, myEdge1, myEdge2, myNorm, myPVec; + double myInvDet, myMaxSize2; void Init( const gp_Pnt& n1, const gp_Pnt& n2, const gp_Pnt& n3 ); bool DistToProjection( const gp_Pnt& p, double& dist ) const; + bool DistToSegment ( const gp_Pnt& p, double& dist ) const; }; //================================================================================ /*! @@ -197,6 +232,7 @@ namespace // internal utils struct TriaTreeData : public ElemTreeData { vector< Triangle > myTrias; + vector< Segment > mySegments; double myFaceTol; double myTriasDeflection; BBox myBBox; @@ -263,6 +299,28 @@ namespace // internal utils return bb; } }; + //================================================================================ + /*! + * \brief Link of two nodes + */ + struct NLink : public std::pair< int, int > + { + NLink( int n1, int n2 ) + { + if ( n1 < n2 ) + { + first = n1; + second = n2; + } + else + { + first = n2; + second = n1; + } + } + int N1() const { return first; } + int N2() const { return second; } + }; //================================================================================ /*! @@ -295,33 +353,82 @@ namespace // internal utils } for ( int i = myNodes->Lower(); i <= myNodes->Upper(); ++i ) myBBox.Add( myNodes->Value(i).XYZ() ); - } } + //================================================================================ + /*! + * \brief Prepare data for search of trinagles in GetMinDistInSphere() + */ + //================================================================================ + void TriaTreeData::PrepareToTriaSearch() { if ( !myTrias.empty() ) return; // already done if ( !myPolyTrias ) return; + // get all boundary links and nodes on VERTEXes + map< NLink, Segment* > linkToSegMap; + map< NLink, Segment* >::iterator l2s; + set< int > vertexNodes; + TopLoc_Location loc; + Handle(Poly_Triangulation) tr = BRep_Tool::Triangulation( mySurface.Face(), loc ); + if ( !tr.IsNull() ) + { + TopTools_IndexedMapOfShape edgeMap; + TopExp::MapShapes( mySurface.Face(), TopAbs_EDGE, edgeMap ); + for ( int iE = 1; iE <= edgeMap.Extent(); ++iE ) + { + const TopoDS_Edge& edge = TopoDS::Edge( edgeMap( iE )); + Handle(Poly_PolygonOnTriangulation) polygon = + BRep_Tool::PolygonOnTriangulation( edge, tr, loc ); + if ( polygon.IsNull() ) + continue; + const TColStd_Array1OfInteger& nodes = polygon->Nodes(); + for ( int i = nodes.Lower(); i < nodes.Upper(); ++i ) + linkToSegMap.insert( make_pair( NLink( nodes(i), nodes(i+1)), (Segment*)0 )); + vertexNodes.insert( nodes( nodes.Lower())); + vertexNodes.insert( nodes( nodes.Upper())); + } + // fill mySegments by boundary links + mySegments.resize( linkToSegMap.size() ); + int iS = 0; + for ( l2s = linkToSegMap.begin(); l2s != linkToSegMap.end(); ++l2s, ++iS ) + { + const NLink& link = (*l2s).first; + (*l2s).second = & mySegments[ iS ]; + mySegments[ iS ].Init( myNodes->Value( link.N1() ), + myNodes->Value( link.N2() )); + } + } + + // initialize myTrias myTrias.resize( myPolyTrias->Length() ); Standard_Integer n1,n2,n3; for ( int i = 1; i <= myPolyTrias->Upper(); ++i ) { + Triangle & t = myTrias[ i-1 ]; myPolyTrias->Value( i ).Get( n1,n2,n3 ); - myTrias[ i-1 ].Init( myNodes->Value( n1 ), - myNodes->Value( n2 ), - myNodes->Value( n3 )); + t.Init( myNodes->Value( n1 ), + myNodes->Value( n2 ), + myNodes->Value( n3 )); + int nbSeg = 0; + if (( l2s = linkToSegMap.find( NLink( n1, n2 ))) != linkToSegMap.end()) + t.mySegments[ nbSeg++ ] = l2s->second; + if (( l2s = linkToSegMap.find( NLink( n2, n3 ))) != linkToSegMap.end()) + t.mySegments[ nbSeg++ ] = l2s->second; + if (( l2s = linkToSegMap.find( NLink( n3, n1 ))) != linkToSegMap.end()) + t.mySegments[ nbSeg++ ] = l2s->second; + while ( nbSeg < 3 ) + t.mySegments[ nbSeg++ ] = NULL; + + t.myIsChecked = false; + t.myHasNodeOnVertex = ( vertexNodes.count( n1 ) || + vertexNodes.count( n2 ) || + vertexNodes.count( n3 )); } - myTree->FillIn(); - // TODO: mark triangles with nodes on VERTEXes to - // less frequently compare with avoidPnt in GetMinDistInSphere() - // - // Handle(Poly_PolygonOnTriangulation) polygon = - // BRep_Tool::PolygonOnTriangulation( edge, tr, loc ); - // if ( polygon.IsNull() || !pologon.HasParameters() ) - // continue; - // Handle(TColStd_Array1OfInteger) nodeIDs = polygon->Nodes(); + // fill the tree of triangles + myTree->FillIn(); } //================================================================================ @@ -347,10 +454,8 @@ namespace // internal utils isConstSize = false; } - typedef std::pair TLink; - TLink link; - map< TLink, double > lenOfDoneLink; - map< TLink, double >::iterator link2len; + map< NLink, double > lenOfDoneLink; + map< NLink, double >::iterator link2len; Standard_Integer n[4]; gp_Pnt p[4]; @@ -373,11 +478,7 @@ namespace // internal utils maxLinkLen = 0; for ( int j = 0; j < 3; ++j ) { - if ( n[j] < n[j+1] ) - link = TLink( n[j], n[j+1] ); - else - link = TLink( n[j+1], n[j] ); - link2len = lenOfDoneLink.insert( make_pair( link, -1. )).first; + link2len = lenOfDoneLink.insert( make_pair( NLink( n[j], n[j+1] ), -1. )).first; isDone[j] = !((*link2len).second < 0 ); a[j] = isDone[j] ? (*link2len).second : (*link2len).second = p[j].Distance( p[j+1] ); if ( isDone[j] ) @@ -430,10 +531,13 @@ namespace // internal utils { double minDist2 = 1e100; const double tol2 = myFaceTol * myFaceTol; + const double dMin2 = myTriasDeflection * myTriasDeflection; TriaTreeData* me = const_cast( this ); me->myFoundTriaIDs.clear(); myTree->GetElementsInSphere( p.XYZ(), radius, me->myFoundTriaIDs ); + if ( myFoundTriaIDs.empty() ) + return minDist2; Standard_Integer n[ 3 ]; for ( size_t i = 0; i < myFoundTriaIDs.size(); ++i ) @@ -444,19 +548,35 @@ namespace // internal utils t.myIsChecked = true; double d, minD2 = minDist2; - bool avoidTria = false; myPolyTrias->Value( myFoundTriaIDs[i]+1 ).Get( n[0],n[1],n[2] ); - for ( int i = 0; i < 3; ++i ) + if ( avoidPnt && t.myHasNodeOnVertex ) { - const gp_Pnt& pn = myNodes->Value(n[i]); - if ( avoidTria = ( avoidPnt && pn.SquareDistance(*avoidPnt) <= tol2 )) - break; - if ( !projectedOnly ) - minD2 = Min( minD2, pn.SquareDistance( p )); + bool avoidTria = false; + for ( int i = 0; i < 3; ++i ) + { + const gp_Pnt& pn = myNodes->Value(n[i]); + if ( avoidTria = ( pn.SquareDistance( *avoidPnt ) <= tol2 )) + break; + if ( !projectedOnly ) + minD2 = Min( minD2, pn.SquareDistance( p )); + } + if ( avoidTria ) + continue; + if (( projectedOnly || minD2 < t.myMaxSize2 ) && + ( t.DistToProjection( p, d ) || t.DistToSegment( p, d ))) + minD2 = Min( minD2, d*d ); + minDist2 = Min( minDist2, minD2 ); + } + else if ( projectedOnly ) + { + if ( t.DistToProjection( p, d ) && d*d > dMin2 ) + minDist2 = Min( minDist2, d*d ); } - if ( !avoidTria ) + else { - if ( minD2 < t.myMaxSize2 && t.DistToProjection( p, d )) + for ( int i = 0; i < 3; ++i ) + minD2 = Min( minD2, p.SquareDistance( myNodes->Value(n[i]) )); + if ( minD2 < t.myMaxSize2 && ( t.DistToProjection( p, d ) || t.DistToSegment( p, d ))) minD2 = Min( minD2, d*d ); minDist2 = Min( minDist2, minD2 ); } @@ -526,6 +646,31 @@ namespace // internal utils return true; } + //================================================================================ + /*! + * \brief Compute distance from a point to either of mySegments. Return false if the point + * is not projected on a segment + */ + //================================================================================ + + bool Triangle::DistToSegment( const gp_Pnt& p, double& dist ) const + { + dist = 1e100; + bool res = false; + double d; + for ( int i = 0; i < 3; ++i ) + { + if ( !mySegments[ i ]) + break; + if ( mySegments[ i ]->Distance( p, d )) + { + res = true; + dist = Min( dist, d ); + } + } + return res; + } + //================================================================================ /*! * \brief Consturct ElementBndBoxTree of Poly_Triangulation of a FACE @@ -993,7 +1138,7 @@ void AdaptiveAlgo::SetHypothesis( const StdMeshers_Adaptive1D* hyp ) bool AdaptiveAlgo::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & theShape) { - //*theProgress = 0.01; + // *theProgress = 0.01; if ( myHyp->GetMinSize() > myHyp->GetMaxSize() ) return error( "Bad parameters: min size > max size" ); @@ -1012,7 +1157,7 @@ bool AdaptiveAlgo::Compute(SMESH_Mesh & theMesh, IncrementalMesh im( theMesh.GetShapeToMesh(), myHyp->GetDeflection(), /*Relatif=*/false); box = im.GetBox(); } - //*theProgress = 0.3; + // *theProgress = 0.3; // holder of segment size at each point SegSizeTree sizeTree( box, grading, myHyp->GetMinSize(), myHyp->GetMaxSize() ); @@ -1160,19 +1305,24 @@ bool AdaptiveAlgo::Compute(SMESH_Mesh & theMesh, double distToFace = triaSearcher->GetMinDistInSphere( pIt1->myP, pIt1->mySegSize, isAdjFace, avoidPnt ); double allowedSize = Max( minSize, distToFace*( 1. + grading )); - if ( 1.1 * allowedSize < pIt1->mySegSize ) + if ( allowedSize < pIt1->mySegSize ) { - sizeDecreased = true; - sizeTree.SetSize( pIt1->myP, allowedSize ); // cout << "E " << theMesh.GetMeshDS()->ShapeToIndex( eData.Edge() ) - // << "\t SetSize " << allowedSize << " at " - // << pIt1->myP.X() <<", "<< pIt1->myP.Y()<<", "<myP.Z() << endl; - pIt2 = pIt1; - if ( --pIt2 != eData.myPoints.end() && pIt2->mySegSize > allowedSize ) - sizeTree.SetSize( eData.myC3d.Value( 0.6*pIt2->myU + 0.4*pIt1->myU ), allowedSize ); - pIt2 = pIt1; - if ( ++pIt2 != eData.myPoints.end() && pIt2->mySegSize > allowedSize ) - sizeTree.SetSize( eData.myC3d.Value( 0.6*pIt2->myU + 0.4*pIt1->myU ), allowedSize ); + // << "\t closure detected " << endl; + if ( 1.1 * allowedSize < pIt1->mySegSize ) + { + sizeDecreased = true; + sizeTree.SetSize( pIt1->myP, allowedSize ); + // cout << "E " << theMesh.GetMeshDS()->ShapeToIndex( eData.Edge() ) + // << "\t SetSize " << allowedSize << " at " + // << pIt1->myP.X() <<", "<< pIt1->myP.Y()<<", "<myP.Z() << endl; + pIt2 = pIt1; + if ( --pIt2 != eData.myPoints.end() && pIt2->mySegSize > allowedSize ) + sizeTree.SetSize( eData.myC3d.Value( 0.6*pIt2->myU + 0.4*pIt1->myU ), allowedSize ); + pIt2 = pIt1; + if ( ++pIt2 != eData.myPoints.end() && pIt2->mySegSize > allowedSize ) + sizeTree.SetSize( eData.myC3d.Value( 0.6*pIt2->myU + 0.4*pIt1->myU ), allowedSize ); + } pIt1->mySegSize = allowedSize; } ++pIt1; @@ -1193,7 +1343,7 @@ bool AdaptiveAlgo::Compute(SMESH_Mesh & theMesh, } // while ( sizeDecreased ) } // loop on myEdges - //*theProgress = 0.3 + 0.3 * iF / double( faceMap.Extent() ); + // *theProgress = 0.3 + 0.3 * iF / double( faceMap.Extent() ); } // loop on faceMap @@ -1220,11 +1370,12 @@ bool AdaptiveAlgo::makeSegments() { EdgeData& eData = myEdges[ iE ]; - // estimate roughly min segement size on the EDGE + // estimate roughly min segment size on the EDGE double edgeMinSize = myHyp->GetMaxSize(); EdgeData::TPntIter pIt1 = eData.myPoints.begin(); for ( ; pIt1 != eData.myPoints.end(); ++pIt1 ) - edgeMinSize = Min( edgeMinSize, mySizeTree->GetSize( pIt1->myP )); + edgeMinSize = Min( edgeMinSize, + Min( pIt1->mySegSize, mySizeTree->GetSize( pIt1->myP ))); const double f = eData.myC3d.FirstParameter(), l = eData.myC3d.LastParameter(); const double parLen = l - f; @@ -1234,6 +1385,7 @@ bool AdaptiveAlgo::makeSegments() // compute nb of segments bool toRecompute = true; double maxSegSize = 0; + size_t i = 1, segCount; //cout << "E " << theMesh.GetMeshDS()->ShapeToIndex( eData.Edge() ) << endl; while ( toRecompute ) // recompute if segment size at some point is less than edgeMinSize/nbDivSeg { @@ -1241,11 +1393,32 @@ bool AdaptiveAlgo::makeSegments() nbSegs[0] = 0; toRecompute = false; + // fill nbSegs with segment size stored in EdgeData::ProbePnt::mySegSize which can + // be less than size in mySizeTree + pIt1 = eData.myPoints.begin(); + EdgeData::ProbePnt* pp1 = &(*pIt1), *pp2; + for ( ++pIt1; pIt1 != eData.myPoints.end(); ++pIt1 ) + { + pp2 = &(*pIt1); + double size1 = Min( pp1->mySegSize, myHyp->GetMaxSize() ); + double size2 = Min( pp2->mySegSize, myHyp->GetMaxSize() ); + double r, u, du = pp2->myU - pp1->myU; + while(( u = f + parLen * i / nbDiv ) < pp2->myU ) + { + r = ( u - pp1->myU ) / du; + nbSegs[i] = (1-r) * size1 + r * size2; + ++i; + } + if ( i < nbSegs.size() ) + nbSegs[i] = size2; + pp1 = pp2; + } + // fill nbSegs with local nb of segments gp_Pnt p1 = eData.First().myP, p2, pDiv = p1; - for ( size_t i = 1, segCount = 1; i < nbSegs.size(); ++i ) + for ( i = 1, segCount = 1; i < nbSegs.size(); ++i ) { p2 = eData.myC3d.Value( f + parLen * i / nbDiv ); - double locSize = Min( mySizeTree->GetSize( p2 ), myHyp->GetMaxSize() ); + double locSize = Min( mySizeTree->GetSize( p2 ), nbSegs[i] ); double nb = p1.Distance( p2 ) / locSize; // if ( nbSegs.size() < 30 ) // cout << "locSize " << locSize << " nb " << nb << endl; @@ -1274,7 +1447,7 @@ bool AdaptiveAlgo::makeSegments() fact = ++nbSegFinal / nbSegs.back(); //cout << "nbSegs.back() " << nbSegs.back() << " nbSegFinal " << nbSegFinal << endl; params.clear(); - for ( int i = 0, segCount = 1; segCount < nbSegFinal; ++segCount ) + for ( i = 0, segCount = 1; segCount < nbSegFinal; ++segCount ) { while ( nbSegs[i] * fact < segCount ) ++i; @@ -1302,7 +1475,7 @@ bool AdaptiveAlgo::makeSegments() helper.SetElementsOnShape( true ); const int ID = 0; const SMDS_MeshNode *n1 = nf, *n2; - for ( size_t i = 0; i < params.size(); ++i, n1 = n2 ) + for ( i = 0; i < params.size(); ++i, n1 = n2 ) { gp_Pnt p2 = eData.myC3d.Value( params[i] ); n2 = helper.AddNode( p2.X(), p2.Y(), p2.Z(), ID, params[i] ); diff --git a/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx b/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx index 250948ddc..62fadc505 100644 --- a/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx +++ b/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx @@ -223,7 +223,10 @@ bool StdMeshers_Quadrangle_2D::Compute (SMESH_Mesh& aMesh, return false; myQuadStruct = quad; - bool ok = false; + updateDegenUV( quad ); + + enum { NOT_COMPUTED = -1, COMPUTE_FAILED = 0, COMPUTE_OK = 1 }; + int res = NOT_COMPUTED; if (myQuadranglePreference) { int n1 = quad->side[0]->NbPoints(); @@ -236,7 +239,7 @@ bool StdMeshers_Quadrangle_2D::Compute (SMESH_Mesh& aMesh, if (nfull == ntmp && ((n1 != n3) || (n2 != n4))) { // special path genarating only quandrangle faces - ok = computeQuadPref( aMesh, F, quad ); + res = computeQuadPref( aMesh, F, quad ); } } else if (myQuadType == QUAD_REDUCED) @@ -252,7 +255,7 @@ bool StdMeshers_Quadrangle_2D::Compute (SMESH_Mesh& aMesh, if ((n1 == n3 && n2 != n4 && n24tmp == n24) || (n2 == n4 && n1 != n3 && n13tmp == n13)) { - ok = computeReduced( aMesh, F, quad ); + res = computeReduced( aMesh, F, quad ); } else { @@ -270,12 +273,15 @@ bool StdMeshers_Quadrangle_2D::Compute (SMESH_Mesh& aMesh, } } - ok = computeQuadDominant( aMesh, F, quad ); + if ( res == NOT_COMPUTED ) + { + res = computeQuadDominant( aMesh, F, quad ); + } - if ( ok && myNeedSmooth ) + if ( res == COMPUTE_OK && myNeedSmooth ) smooth( quad ); - return ok; + return ( res == COMPUTE_OK ); } //================================================================================ @@ -927,6 +933,8 @@ FaceQuadStruct::Ptr StdMeshers_Quadrangle_2D::CheckNbEdges(SMESH_Mesh & ignoreMediumNodes, myProxyMesh)); ++iSide; } + if ( quad->side.size() == 4 ) + break; if ( nbLoops > 8 ) { error(TComm("Bug: infinite loop in StdMeshers_Quadrangle_2D::CheckNbEdges()")); @@ -1225,8 +1233,6 @@ bool StdMeshers_Quadrangle_2D::setNormalizedGrid (SMESH_Mesh & aMesh, // =down // - updateDegenUV( quad ); - int nbhoriz = Min(quad->side[0]->NbPoints(), quad->side[2]->NbPoints()); int nbvertic = Min(quad->side[1]->NbPoints(), quad->side[3]->NbPoints()); @@ -1412,8 +1418,6 @@ bool StdMeshers_Quadrangle_2D::computeQuadPref (SMESH_Mesh & aMesh, bool WisF = true; int i,j,geomFaceID = meshDS->ShapeToIndex(aFace); - updateDegenUV( quad ); - int nb = quad->side[0]->NbPoints(); int nr = quad->side[1]->NbPoints(); int nt = quad->side[2]->NbPoints(); @@ -2396,8 +2400,6 @@ bool StdMeshers_Quadrangle_2D::computeReduced (SMESH_Mesh & aMesh, if (uv_eb.size() != nb || uv_er.size() != nr || uv_et.size() != nt || uv_el.size() != nl) return error(COMPERR_BAD_INPUT_MESH); - updateDegenUV( quad ); - // arrays for normalized params TColStd_SequenceOfReal npb, npr, npt, npl; for (j = 0; j < nb; j++) { @@ -3266,7 +3268,7 @@ void StdMeshers_Quadrangle_2D::updateDegenUV(FaceQuadStruct::Ptr quad) uv1.v = uv2.v = 0.5 * ( uv1.v + uv2.v ); } - else if ( quad->side.size() == 4 ) + else if ( quad->side.size() == 4 && myQuadType == QUAD_STANDARD) // Set number of nodes on a degenerated side to be same as on an opposite side // ---------------------------------------------------------------------------- @@ -3329,8 +3331,8 @@ void StdMeshers_Quadrangle_2D::smooth (FaceQuadStruct::Ptr quad) while ( fIt->more() ) { const SMDS_MeshElement* face = fIt->next(); - const int nbN = face->NbCornerNodes(); - const int nInd = face->GetNodeIndex( node ); + const int nbN = face->NbCornerNodes(); + const int nInd = face->GetNodeIndex( node ); const int prevInd = myHelper->WrapIndex( nInd - 1, nbN ); const int nextInd = myHelper->WrapIndex( nInd + 1, nbN ); const SMDS_MeshNode* prevNode = face->GetNode( prevInd ); @@ -3370,24 +3372,30 @@ void StdMeshers_Quadrangle_2D::smooth (FaceQuadStruct::Ptr quad) if ( sNode._triangles.empty() ) continue; // not movable node - // compute a new XYZ - gp_XYZ newXYZ (0,0,0); - for ( unsigned i = 0; i < sNode._triangles.size(); ++i ) - newXYZ += sNode._triangles[i]._n1->_xyz; - newXYZ /= sNode._triangles.size(); - - // compute a new UV by projection gp_XY newUV; - proj.Perform( newXYZ ); - bool isValid = ( proj.IsDone() && proj.NbPoints() > 0 ); - if ( isValid ) + bool isValid = false; + bool use3D = ( iLoop > 2 ); // 3 loops in 2D and 2, in 3D + + if ( use3D ) { - // check validity of the newUV - Quantity_Parameter u,v; - proj.LowerDistanceParameters( u, v ); - newUV.SetCoord( u, v ); - for ( unsigned i = 0; i < sNode._triangles.size() && isValid; ++i ) - isValid = ( sNode._triangles[i].IsForward( newUV ) == refForward ); + // compute a new XYZ + gp_XYZ newXYZ (0,0,0); + for ( unsigned i = 0; i < sNode._triangles.size(); ++i ) + newXYZ += sNode._triangles[i]._n1->_xyz; + newXYZ /= sNode._triangles.size(); + + // compute a new UV by projection + proj.Perform( newXYZ ); + isValid = ( proj.IsDone() && proj.NbPoints() > 0 ); + if ( isValid ) + { + // check validity of the newUV + Quantity_Parameter u,v; + proj.LowerDistanceParameters( u, v ); + newUV.SetCoord( u, v ); + for ( unsigned i = 0; i < sNode._triangles.size() && isValid; ++i ) + isValid = ( sNode._triangles[i].IsForward( newUV ) == refForward ); + } } if ( !isValid ) { @@ -3578,9 +3586,10 @@ int StdMeshers_Quadrangle_2D::getCorners(const TopoDS_Face& theFace, theVertices.clear(); vector< double > angles; vector< TopoDS_Edge > edgeVec; - vector< int > cornerInd; + vector< int > cornerInd, nbSeg; angles.reserve( vertexByAngle.size() ); edgeVec.reserve( vertexByAngle.size() ); + nbSeg.reserve( vertexByAngle.size() ); cornerInd.reserve( nbCorners ); for ( edge = theWire.begin(); edge != theWire.end(); ++edge ) { @@ -3595,6 +3604,13 @@ int StdMeshers_Quadrangle_2D::getCorners(const TopoDS_Face& theFace, } angles.push_back( angleByVertex.IsBound( v ) ? angleByVertex( v ) : -M_PI ); edgeVec.push_back( *edge ); + if ( theConsiderMesh && isThereVariants ) + { + if ( SMESHDS_SubMesh* sm = helper.GetMeshDS()->MeshElements( *edge )) + nbSeg.push_back( sm->NbNodes() + 1 ); + else + nbSeg.push_back( 0 ); + } } // refine the result vector - make sides elual by length if diff --git a/src/StdMeshers/StdMeshers_ViscousLayers.cxx b/src/StdMeshers/StdMeshers_ViscousLayers.cxx index 6a6d871c4..e38c311ad 100644 --- a/src/StdMeshers/StdMeshers_ViscousLayers.cxx +++ b/src/StdMeshers/StdMeshers_ViscousLayers.cxx @@ -434,7 +434,7 @@ namespace VISCOUS_3D //vector _nodesAround; vector<_Simplex> _simplices; // for quality check - enum SmoothType { LAPLACIAN, CENTROIDAL, ANGULAR }; + enum SmoothType { LAPLACIAN, CENTROIDAL, ANGULAR, TFI }; bool Smooth(int& badNb, Handle(Geom_Surface)& surface, @@ -500,7 +500,11 @@ namespace VISCOUS_3D bool prepareEdgeToShrink( _LayerEdge& edge, const TopoDS_Face& F, SMESH_MesherHelper& helper, const SMESHDS_SubMesh* faceSubMesh ); - void fixBadFaces(const TopoDS_Face& F, SMESH_MesherHelper& helper); + void fixBadFaces(const TopoDS_Face& F, + SMESH_MesherHelper& helper, + const bool is2D, + const int step, + set * involvedNodes=NULL); bool addBoundaryElements(); bool error( const string& text, int solidID=-1 ); @@ -549,7 +553,7 @@ namespace VISCOUS_3D virtual vtkIdType GetVtkType() const { return -1; } virtual SMDSAbs_EntityType GetEntityType() const { return SMDSEntity_Last; } virtual SMDSAbs_GeometryType GetGeomType() const { return SMDSGeom_TRIANGLE; } -virtual SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const + virtual SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType) const { return SMDS_ElemIteratorPtr( new SMDS_NodeVectorElemIterator( _nn.begin(), _nn.end()));} }; //-------------------------------------------------------------------------------- @@ -568,6 +572,44 @@ virtual SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const _nn[3]=_le2->_nodes[0]; } }; + //-------------------------------------------------------------------------------- + /*! + * \brief Retriever of node coordinates either directly of from a surface by node UV. + * \warning Location of a surface is ignored + */ + struct NodeCoordHelper + { + SMESH_MesherHelper& _helper; + const TopoDS_Face& _face; + Handle(Geom_Surface) _surface; + gp_XYZ (NodeCoordHelper::* _fun)(const SMDS_MeshNode* n) const; + + NodeCoordHelper(const TopoDS_Face& F, SMESH_MesherHelper& helper, bool is2D) + : _helper( helper ), _face( F ) + { + if ( is2D ) + { + TopLoc_Location loc; + _surface = BRep_Tool::Surface( _face, loc ); + } + if ( _surface.IsNull() ) + _fun = & NodeCoordHelper::direct; + else + _fun = & NodeCoordHelper::byUV; + } + gp_XYZ operator()(const SMDS_MeshNode* n) const { return (this->*_fun)( n ); } + + private: + gp_XYZ direct(const SMDS_MeshNode* n) const + { + return SMESH_TNodeXYZ( n ); + } + gp_XYZ byUV (const SMDS_MeshNode* n) const + { + gp_XY uv = _helper.GetNodeUV( _face, n ); + return _surface->Value( uv.X(), uv.Y() ).XYZ(); + } + }; } // namespace VISCOUS_3D //================================================================================ @@ -801,10 +843,10 @@ namespace double u1 = intervals( i ); double u2 = intervals( i+1 ); curve.D2( 0.5*( u1+u2 ), p, drv1, drv2 ); - double cross = drv2 * drv1; //drv2 ^ drv1; + double cross = drv2 ^ drv1; if ( E.Orientation() == TopAbs_REVERSED ) cross = -cross; - isConvex = ( cross > -1e-9 ); + isConvex = ( cross > 0.1 ); //-1e-9 ); } // check if concavity is strong enough to care about it //const double maxAngle = 5 * Standard_PI180; @@ -873,7 +915,7 @@ namespace } void Finish() { if (py) - *py << "mesh.MakeGroup('Viscous Prisms',VOLUME,FT_ElemGeomType,'=',Geom_PENTA)"< nodesToSmooth( smoothNodes.size() ); { - dumpFunction(SMESH_Comment("beforeShrinkFace")<first); // debug const bool sortSimplices = isConcaveFace; for ( unsigned i = 0; i < smoothNodes.size(); ++i ) { @@ -3645,11 +3722,10 @@ bool _ViscousBuilder::shrink() helper.GetNodeUV( F, n, 0, &isOkUV); dumpMove( n ); } - dumpFunctionEnd(); } //if ( nodesToSmooth.empty() ) continue; - // Find EDGE's to shrink + // Find EDGE's to shrink and set simpices to LayerEdge's set< _Shrinker1D* > eShri1D; { for ( unsigned i = 0; i < lEdges.size(); ++i ) @@ -3666,6 +3742,23 @@ bool _ViscousBuilder::shrink() // srinked while srinking another FACE srinker.RestoreParams(); } + getSimplices( /*tgtNode=*/edge->_nodes.back(), edge->_simplices, ignoreShapes ); + } + } + + bool toFixTria = false; // to improve quality of trias by diagonal swap + if ( isConcaveFace ) + { + const bool hasTria = _mesh->NbTriangles(), hasQuad = _mesh->NbQuadrangles(); + if ( hasTria != hasQuad ) { + toFixTria = hasTria; + } + else { + set nbNodesSet; + SMDS_ElemIteratorPtr fIt = smDS->GetElements(); + while ( fIt->more() && nbNodesSet.size() < 2 ) + nbNodesSet.insert( fIt->next()->NbCornerNodes() ); + toFixTria = ( *nbNodesSet.begin() == 3 ); } } @@ -3676,7 +3769,7 @@ bool _ViscousBuilder::shrink() bool shrinked = true; int badNb, shriStep=0, smooStep=0; _SmoothNode::SmoothType smoothType - = isConcaveFace ? _SmoothNode::CENTROIDAL : _SmoothNode::LAPLACIAN; + = isConcaveFace ? _SmoothNode::ANGULAR : _SmoothNode::LAPLACIAN; while ( shrinked ) { shriStep++; @@ -3684,7 +3777,7 @@ bool _ViscousBuilder::shrink() // ----------------------------------------------- dumpFunction(SMESH_Comment("moveBoundaryOnF")<first<<"_st"<SetNewLength2d( surface,F,helper ); } @@ -3699,7 +3792,7 @@ bool _ViscousBuilder::shrink() // Smoothing in 2D // ----------------- int nbNoImpSteps = 0; - bool moved = true; + bool moved = true; badNb = 1; while (( nbNoImpSteps < 5 && badNb > 0) && moved) { @@ -3724,7 +3817,41 @@ bool _ViscousBuilder::shrink() return error(SMESH_Comment("Can't shrink 2D mesh on face ") << f2sd->first ); if ( shriStep > 200 ) return error(SMESH_Comment("Infinite loop at shrinking 2D mesh on face ") << f2sd->first ); - } + + // Fix narrow triangles by swapping diagonals + // --------------------------------------- + if ( toFixTria ) + { + set usedNodes; + fixBadFaces( F, helper, /*is2D=*/true, shriStep, & usedNodes); // swap diagonals + + // update working data + set::iterator n; + for ( size_t i = 0; i < nodesToSmooth.size() && !usedNodes.empty(); ++i ) + { + n = usedNodes.find( nodesToSmooth[ i ]._node ); + if ( n != usedNodes.end()) + { + getSimplices( nodesToSmooth[ i ]._node, + nodesToSmooth[ i ]._simplices, + ignoreShapes, NULL, + /*sortSimplices=*/ smoothType == _SmoothNode::ANGULAR ); + usedNodes.erase( n ); + } + } + for ( size_t i = 0; i < lEdges.size() && !usedNodes.empty(); ++i ) + { + n = usedNodes.find( /*tgtNode=*/ lEdges[i]->_nodes.back() ); + if ( n != usedNodes.end()) + { + getSimplices( lEdges[i]->_nodes.back(), + lEdges[i]->_simplices, + ignoreShapes ); + usedNodes.erase( n ); + } + } + } + } // while ( shrinked ) // No wrongly shaped faces remain; final smooth. Set node XYZ. bool isStructuredFixed = false; @@ -3732,10 +3859,16 @@ bool _ViscousBuilder::shrink() isStructuredFixed = algo->FixInternalNodes( *data._proxyMesh, F ); if ( !isStructuredFixed ) { - if ( isConcaveFace ) - fixBadFaces( F, helper ); // fix narrow faces by swapping diagonals - for ( int st = /*highQuality ? 10 :*/ 3; st; --st ) + if ( isConcaveFace ) // fix narrow faces by swapping diagonals + fixBadFaces( F, helper, /*is2D=*/false, ++shriStep ); + + for ( int st = 3; st; --st ) { + switch( st ) { + case 1: smoothType = _SmoothNode::LAPLACIAN; break; + case 2: smoothType = _SmoothNode::LAPLACIAN; break; + case 3: smoothType = _SmoothNode::ANGULAR; break; + } dumpFunction(SMESH_Comment("shrinkFace")<first<<"_st"<<++smooStep); // debug for ( unsigned i = 0; i < nodesToSmooth.size(); ++i ) { @@ -3794,54 +3927,54 @@ bool _ViscousBuilder::prepareEdgeToShrink( _LayerEdge& edge, edge._normal.SetCoord( uvDir.X(),uvDir.Y(), 0); edge._len = uvLen; - // IMPORTANT to have src nodes NOT yet REPLACED by tgt nodes in shrinked faces - vector faces; - multimap< double, const SMDS_MeshNode* > proj2node; - SMDS_ElemIteratorPtr fIt = srcNode->GetInverseElementIterator(SMDSAbs_Face); - while ( fIt->more() ) - { - const SMDS_MeshElement* f = fIt->next(); - if ( faceSubMesh->Contains( f )) - faces.push_back( f ); - } - for ( unsigned i = 0; i < faces.size(); ++i ) - { - const int nbNodes = faces[i]->NbCornerNodes(); - for ( int j = 0; j < nbNodes; ++j ) - { - const SMDS_MeshNode* n = faces[i]->GetNode(j); - if ( n == srcNode ) continue; - if ( n->GetPosition()->GetTypeOfPosition() != SMDS_TOP_FACE && - ( faces.size() > 1 || nbNodes > 3 )) - continue; - gp_Pnt2d uv = helper.GetNodeUV( F, n ); - gp_Vec2d uvDirN( srcUV, uv ); - double proj = uvDirN * uvDir; - proj2node.insert( make_pair( proj, n )); - } - } + // // IMPORTANT to have src nodes NOT yet REPLACED by tgt nodes in shrinked faces + // vector faces; + // multimap< double, const SMDS_MeshNode* > proj2node; + // SMDS_ElemIteratorPtr fIt = srcNode->GetInverseElementIterator(SMDSAbs_Face); + // while ( fIt->more() ) + // { + // const SMDS_MeshElement* f = fIt->next(); + // if ( faceSubMesh->Contains( f )) + // faces.push_back( f ); + // } + // for ( unsigned i = 0; i < faces.size(); ++i ) + // { + // const int nbNodes = faces[i]->NbCornerNodes(); + // for ( int j = 0; j < nbNodes; ++j ) + // { + // const SMDS_MeshNode* n = faces[i]->GetNode(j); + // if ( n == srcNode ) continue; + // if ( n->GetPosition()->GetTypeOfPosition() != SMDS_TOP_FACE && + // ( faces.size() > 1 || nbNodes > 3 )) + // continue; + // gp_Pnt2d uv = helper.GetNodeUV( F, n ); + // gp_Vec2d uvDirN( srcUV, uv ); + // double proj = uvDirN * uvDir; + // proj2node.insert( make_pair( proj, n )); + // } + // } - multimap< double, const SMDS_MeshNode* >::iterator p2n = proj2node.begin(), p2nEnd; - const double minProj = p2n->first; - const double projThreshold = 1.1 * uvLen; - if ( minProj > projThreshold ) - { - // tgtNode is located so that it does not make faces with wrong orientation - return true; - } + // multimap< double, const SMDS_MeshNode* >::iterator p2n = proj2node.begin(), p2nEnd; + // const double minProj = p2n->first; + // const double projThreshold = 1.1 * uvLen; + // if ( minProj > projThreshold ) + // { + // // tgtNode is located so that it does not make faces with wrong orientation + // return true; + // } edge._pos.resize(1); edge._pos[0].SetCoord( tgtUV.X(), tgtUV.Y(), 0 ); // store most risky nodes in _simplices - p2nEnd = proj2node.lower_bound( projThreshold ); - int nbSimpl = ( std::distance( p2n, p2nEnd ) + 1) / 2; - edge._simplices.resize( nbSimpl ); - for ( int i = 0; i < nbSimpl; ++i ) - { - edge._simplices[i]._nPrev = p2n->second; - if ( ++p2n != p2nEnd ) - edge._simplices[i]._nNext = p2n->second; - } + // p2nEnd = proj2node.lower_bound( projThreshold ); + // int nbSimpl = ( std::distance( p2n, p2nEnd ) + 1) / 2; + // edge._simplices.resize( nbSimpl ); + // for ( int i = 0; i < nbSimpl; ++i ) + // { + // edge._simplices[i]._nPrev = p2n->second; + // if ( ++p2n != p2nEnd ) + // edge._simplices[i]._nNext = p2n->second; + // } // set UV of source node to target node SMDS_FacePosition* pos = static_cast( tgtNode->GetPosition() ); pos->SetUParameter( srcUV.X() ); @@ -3949,23 +4082,28 @@ bool _ViscousBuilder::prepareEdgeToShrink( _LayerEdge& edge, */ //================================================================================ -void _ViscousBuilder::fixBadFaces(const TopoDS_Face& F, SMESH_MesherHelper& helper) +void _ViscousBuilder::fixBadFaces(const TopoDS_Face& F, + SMESH_MesherHelper& helper, + const bool is2D, + const int step, + set * involvedNodes) { SMESH::Controls::AspectRatio qualifier; SMESH::Controls::TSequenceOfXYZ points(3), points1(3), points2(3); - const double maxAspectRatio = 4.; + const double maxAspectRatio = is2D ? 4. : 2; + NodeCoordHelper xyz( F, helper, is2D ); // find bad triangles vector< const SMDS_MeshElement* > badTrias; vector< double > badAspects; - SMESHDS_SubMesh* sm = helper.GetMeshDS()->MeshElements( F ); + SMESHDS_SubMesh* sm = helper.GetMeshDS()->MeshElements( F ); SMDS_ElemIteratorPtr fIt = sm->GetElements(); while ( fIt->more() ) { const SMDS_MeshElement * f = fIt->next(); if ( f->NbCornerNodes() != 3 ) continue; - for ( int iP = 0; iP < 3; ++iP ) points(iP+1) = SMESH_TNodeXYZ( f->GetNode(iP)); + for ( int iP = 0; iP < 3; ++iP ) points(iP+1) = xyz( f->GetNode(iP)); double aspect = qualifier.GetValue( points ); if ( aspect > maxAspectRatio ) { @@ -3973,6 +4111,18 @@ void _ViscousBuilder::fixBadFaces(const TopoDS_Face& F, SMESH_MesherHelper& help badAspects.push_back( aspect ); } } + if ( step == 1 ) + { + dumpFunction(SMESH_Comment("beforeSwapDiagonals_F")<GetElements(); + while ( fIt->more() ) + { + const SMDS_MeshElement * f = fIt->next(); + if ( f->NbCornerNodes() == 3 ) + dumpChangeNodes( f ); + } + dumpFunctionEnd(); + } if ( badTrias.empty() ) return; @@ -3988,9 +4138,10 @@ void _ViscousBuilder::fixBadFaces(const TopoDS_Face& F, SMESH_MesherHelper& help double aspRatio [3]; int i1, i2, i3; - involvedFaces.insert( badTrias[iTia] ); + if ( !involvedFaces.insert( badTrias[iTia] ).second ) + continue; for ( int iP = 0; iP < 3; ++iP ) - points(iP+1) = SMESH_TNodeXYZ( badTrias[iTia]->GetNode(iP)); + points(iP+1) = xyz( badTrias[iTia]->GetNode(iP)); // find triangles adjacent to badTrias[iTia] with better aspect ratio after diag-swaping int bestCouple = -1; @@ -4006,7 +4157,7 @@ void _ViscousBuilder::fixBadFaces(const TopoDS_Face& F, SMESH_MesherHelper& help // aspect ratio of an adjacent tria for ( int iP = 0; iP < 3; ++iP ) - points2(iP+1) = SMESH_TNodeXYZ( trias[iSide].second->GetNode(iP)); + points2(iP+1) = xyz( trias[iSide].second->GetNode(iP)); double aspectInit = qualifier.GetValue( points2 ); // arrange nodes as after diag-swaping @@ -4023,6 +4174,12 @@ void _ViscousBuilder::fixBadFaces(const TopoDS_Face& F, SMESH_MesherHelper& help if ( aspRatio[ iSide ] > aspectInit + badAspects[ iTia ] ) continue; + // prevent inversion of a triangle + gp_Vec norm1 = gp_Vec( points1(1), points1(3) ) ^ gp_Vec( points1(1), points1(2) ); + gp_Vec norm2 = gp_Vec( points2(1), points2(3) ) ^ gp_Vec( points2(1), points2(2) ); + if ( norm1 * norm2 < 0. && norm1.Angle( norm2 ) > 70./180.*M_PI ) + continue; + if ( bestCouple < 0 || aspRatio[ bestCouple ] > aspRatio[ iSide ] ) bestCouple = iSide; } @@ -4043,17 +4200,25 @@ void _ViscousBuilder::fixBadFaces(const TopoDS_Face& F, SMESH_MesherHelper& help // swap diagonals SMESH_MeshEditor editor( helper.GetMesh() ); - dumpFunction(SMESH_Comment("beforeSwapDiagonals_F")<insert( triaCouples[i].first->begin_nodes(), + triaCouples[i].first->end_nodes() ); + involvedNodes->insert( triaCouples[i].second->begin_nodes(), + triaCouples[i].second->end_nodes() ); + } // just for debug dump resulting triangles - dumpFunction(SMESH_Comment("swapDiagonals_F")< minStepSize ) - stepSize = proj; - else if ( proj < minStepSize ) - stepSize = minStepSize; - } + // find intersection of 2 lines: curUV-tgtUV and that connecting simplex nodes + gp_XY uvN1 = helper.GetNodeUV( F, _simplices[i]._nPrev ); + gp_XY uvN2 = helper.GetNodeUV( F, _simplices[i]._nNext ); + gp_XY dirN = uvN2 - uvN1; + double det = uvDir.Crossed( dirN ); + if ( Abs( det ) < std::numeric_limits::min() ) continue; + gp_XY dirN2Cur = curUV - uvN1; + double step = dirN.Crossed( dirN2Cur ) / det; + if ( step > 0 ) + stepSize = Min( step, stepSize ); } - gp_Pnt2d newUV; - if ( uvLen - stepSize < _len / 20. ) + if ( uvLen - stepSize < _len / 200. ) { newUV = tgtUV; _pos.clear(); } + else if ( stepSize > 0 ) + { + newUV = curUV + uvDir.XY() * stepSize * kSafe; + } else { - newUV = curUV + uvDir.XY() * stepSize; + return true; } - SMDS_FacePosition* pos = static_cast( tgtNode->GetPosition() ); pos->SetUParameter( newUV.X() ); pos->SetVParameter( newUV.Y() ); @@ -4177,30 +4341,24 @@ bool _SmoothNode::Smooth(int& badNb, // compute new UV for the node gp_XY newPos (0,0); -/* if ( how == ANGULAR && _simplices.size() == 4 ) + if ( how == TFI && _simplices.size() == 4 ) { - vector corners; corners.reserve(4); + gp_XY corners[4]; for ( size_t i = 0; i < _simplices.size(); ++i ) if ( _simplices[i]._nOpp ) - corners.push_back( helper.GetNodeUV( face, _simplices[i]._nOpp, _node )); - if ( corners.size() == 4 ) - { - newPos = helper.calcTFI - ( 0.5, 0.5, - corners[0], corners[1], corners[2], corners[3], - uv[1], uv[2], uv[3], uv[0] ); - } - // vector p( _simplices.size() * 2 + 1 ); - // p.clear(); - // for ( size_t i = 0; i < _simplices.size(); ++i ) - // { - // p.push_back( uv[i] ); - // if ( _simplices[i]._nOpp ) - // p.push_back( helper.GetNodeUV( face, _simplices[i]._nOpp, _node )); - // } - // newPos = computeAngularPos( p, helper.GetNodeUV( face, _node ), refSign ); + corners[i] = helper.GetNodeUV( face, _simplices[i]._nOpp, _node ); + else + throw SALOME_Exception(LOCALIZED("TFI smoothing: _Simplex::_nOpp not set!")); + + newPos = helper.calcTFI ( 0.5, 0.5, + corners[0], corners[1], corners[2], corners[3], + uv[1], uv[2], uv[3], uv[0] ); + } + else if ( how == ANGULAR ) + { + newPos = computeAngularPos( uv, helper.GetNodeUV( face, _node ), refSign ); } - else*/ if ( how == CENTROIDAL && _simplices.size() > 3 ) + else if ( how == CENTROIDAL && _simplices.size() > 3 ) { // average centers of diagonals wieghted with their reciprocal lengths if ( _simplices.size() == 4 ) @@ -4231,7 +4389,6 @@ bool _SmoothNode::Smooth(int& badNb, else { // Laplacian smooth - //isCentroidal = false; for ( size_t i = 0; i < _simplices.size(); ++i ) newPos += uv[i]; newPos /= _simplices.size(); @@ -4249,8 +4406,6 @@ bool _SmoothNode::Smooth(int& badNb, if ( nbOkAfter < nbOkBefore ) { - // if ( isCentroidal ) - // return Smooth( badNb, surface, helper, refSign, !isCentroidal, set3D ); badNb += _simplices.size() - nbOkBefore; return false; } @@ -4285,22 +4440,22 @@ gp_XY _SmoothNode::computeAngularPos(vector& uv, { uv.push_back( uv.front() ); - vector< gp_XY > edgeDir( uv.size() ); + vector< gp_XY > edgeDir ( uv.size() ); vector< double > edgeSize( uv.size() ); for ( size_t i = 1; i < edgeDir.size(); ++i ) { - edgeDir[i-1] = uv[i] - uv[i-1]; + edgeDir [i-1] = uv[i] - uv[i-1]; edgeSize[i-1] = edgeDir[i-1].Modulus(); if ( edgeSize[i-1] < numeric_limits::min() ) edgeDir[i-1].SetX( 100 ); else edgeDir[i-1] /= edgeSize[i-1] * refSign; } - edgeDir.back() = edgeDir.front(); + edgeDir.back() = edgeDir.front(); edgeSize.back() = edgeSize.front(); - gp_XY newPos(0,0); - int nbEdges = 0; + gp_XY newPos(0,0); + int nbEdges = 0; double sumSize = 0; for ( size_t i = 1; i < edgeDir.size(); ++i ) { @@ -4320,7 +4475,7 @@ gp_XY _SmoothNode::computeAngularPos(vector& uv, } bisec /= bisecSize; - gp_XY dirToN = uvToFix - p; + gp_XY dirToN = uvToFix - p; double distToN = dirToN.Modulus(); if ( bisec * dirToN < 0 ) distToN = -distToN; diff --git a/src/StdMeshersGUI/StdMeshers_msg_fr.ts b/src/StdMeshersGUI/StdMeshers_msg_fr.ts index 17fac5a04..4f3de7883 100755 --- a/src/StdMeshersGUI/StdMeshers_msg_fr.ts +++ b/src/StdMeshersGUI/StdMeshers_msg_fr.ts @@ -3,6 +3,31 @@ @default + + SMESH_EDGES_WITH_LAYERS + Edges with layers + + + SMESH_FACES_WITH_LAYERS + Faces with layers +(walls) + + + SMESH_ADAPTIVE1D_TITLE + Hypothesis Construction + + + SMESH_MAX_SIZE + Max size + + + SMESH_MIN_SIZE + Min size + + + SMESH_ADAPTIVE1D_HYPOTHESIS + Adaptive + SMESH_ARITHMETIC_1D_HYPOTHESIS Arithmétique 1D @@ -486,4 +511,19 @@ Pas + + StdMeshersGUI_StdHypothesisCreator + + TO_IGNORE_EDGES + Edges without layers (inlets and oulets) + + + NOT_TO_IGNORE_EDGES + Edges with layers (walls) + + + TO_IGNORE_EDGES_OR_NOT + Specified edges are + + diff --git a/src/StdMeshersGUI/StdMeshers_msg_ja.ts b/src/StdMeshersGUI/StdMeshers_msg_ja.ts index 1eb65621d..4a51f79f0 100644 --- a/src/StdMeshersGUI/StdMeshers_msg_ja.ts +++ b/src/StdMeshersGUI/StdMeshers_msg_ja.ts @@ -5,15 +5,15 @@ StdMeshersGUI_StdHypothesisCreator TO_IGNORE_EDGES_OR_NOT - TO_IGNORE_EDGES_OR_NOT + 指定したエッジが NOT_TO_IGNORE_EDGES - NOT_TO_IGNORE_EDGES + エッジ層 (壁) TO_IGNORE_EDGES - TO_IGNORE_EDGES + エッジ層 (入り江および oulets) なし @@ -46,6 +46,22 @@ SMESH_CUT_NEG_MODE 負のセクション + + SMESH_ADAPTIVE1D_HYPOTHESIS + アダプティブ1次元Hypothesis + + + SMESH_MIN_SIZE + 最小サイズ + + + SMESH_MAX_SIZE + 最大サイズ + + + SMESH_ADAPTIVE1D_TITLE + Hypothesis構造 + SMESH_DEFLECTION1D_HYPOTHESIS 変形 d @@ -152,7 +168,7 @@ SMESH_MAX_LENGTH_HYPOTHESIS - 最大長 + 最大要素長 SMESH_CARTESIAN_PARAMS_HYPOTHESIS @@ -164,11 +180,11 @@ SMESH_VISCOUS_LAYERS_HYPOTHESIS - 境界層 + 境界層設定 SMESH_VISCOUS_LAYERS_TITLE - 仮定の構成 + 詳細設定 SMESH_TOTAL_THICKNESS @@ -180,23 +196,23 @@ SMESH_FACES_WO_LAYERS - 顔なし層 limite\n (入力と出力) + 境界層 (入力と出力) のない顔 SMESH_EDGES_WO_LAYERS - エッジ層 limite\n (入力と出力) なし + エッジ境界層 (入力と出力) なし SMESH_FACES_WITH_LAYERS - SMESH_FACES_WITH_LAYERS + 面層 (壁) SMESH_EDGES_WITH_LAYERS - SMESH_EDGES_WITH_LAYERS + レイヤーのエッジ SMESH_MAX_LENGTH_TITLE - 仮定の構成 + 要素長設定 SMESH_CARTESIAN_PARAMS_TITLE @@ -224,7 +240,7 @@ SMESH_MAX_ELEMENT_VOLUME_TITLE - 仮定の構成 + 詳細設定 SMESH_NB_SEGMENTS_HYPOTHESIS @@ -352,7 +368,7 @@ SMESH_SOURCE_EDGE - エッジ + Edge SMESH_SOURCE_EDGES @@ -360,7 +376,7 @@ SMESH_SOURCE_FACE - フェース + Face SMESH_SOURCE_FACES diff --git a/src/Tools/MGCleanerPlug/MGCleanerMonPlugDialog.py b/src/Tools/MGCleanerPlug/MGCleanerMonPlugDialog.py index b7e72d423..b7d02ec8e 100644 --- a/src/Tools/MGCleanerPlug/MGCleanerMonPlugDialog.py +++ b/src/Tools/MGCleanerPlug/MGCleanerMonPlugDialog.py @@ -129,14 +129,20 @@ class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget): self.connect(self.CB_ComputedOverlapDistance,SIGNAL("stateChanged(int)"),self.SP_OverlapDistance.setDisabled) def PBHelpPressed(self): + import SalomePyQt + sgPyQt = SalomePyQt.SalomePyQt() try: mydir=os.environ["SMESH_ROOT_DIR"] except Exception: QMessageBox.warning( self, "Help", "Help unavailable $SMESH_ROOT_DIR not found") return - maDoc=mydir+"/share/doc/salome/gui/SMESH/MGCleaner/_downloads/mg-cleaner_user_manual.pdf" - command="xdg-open "+maDoc+";" - subprocess.call(command, shell=True) + + maDoc=mydir+"/share/doc/salome/gui/SMESH/MGCleaner/index.html" + sgPyQt.helpContext(maDoc,"") + + #maDoc=mydir+"/share/doc/salome/gui/SMESH/MGCleaner/_downloads/mg-cleaner_user_manual.pdf" + #command="xdg-open "+maDoc+";" + #subprocess.call(command, shell=True) def PBOKPressed(self): if not(self.PrepareLigneCommande()): diff --git a/src/Tools/MGCleanerPlug/doc/files/mg-cleaner_user_manual.pdf b/src/Tools/MGCleanerPlug/doc/files/mg-cleaner_user_manual.pdf index a3907d243..2ac264e56 100644 Binary files a/src/Tools/MGCleanerPlug/doc/files/mg-cleaner_user_manual.pdf and b/src/Tools/MGCleanerPlug/doc/files/mg-cleaner_user_manual.pdf differ diff --git a/src/Tools/YamsPlug/YamsPlugDialog.ui b/src/Tools/YamsPlug/YamsPlugDialog.ui index 9b573daf4..f9ae2a42a 100644 --- a/src/Tools/YamsPlug/YamsPlugDialog.ui +++ b/src/Tools/YamsPlug/YamsPlugDialog.ui @@ -6,8 +6,8 @@ 0 0 - 800 - 500 + 791 + 593 @@ -339,7 +339,7 @@ In other words, it avoids having faces too far away from the curve they should r - If the Units parameter is relative, epsilon max correspond to (per thousand) s*Tolerance/1000, where s is the size of the bounding box of the domain. + If the Units parameter is relative, epsilon max correspond to s*Tolerance, where s is the size of the bounding box of the domain. If the Units parameter is absolute, the tolerance parameter is expressed in model units: if P=2 and point coordinates are given in millimeters, the maximal chordal deviation is 2 mm. @@ -599,13 +599,13 @@ New created vertices are saved in the .mesh file under keyword section 'Vertices - 0.890000000000000 + 90.000000000000000 - 0.010000000000000 + 1.000000000000000 - 0.040000000000000 + 15.000000000000000 diff --git a/src/Tools/YamsPlug/doc/Advanced_params.rst b/src/Tools/YamsPlug/doc/Advanced_params.rst index f76a749dd..23b0385bd 100644 --- a/src/Tools/YamsPlug/doc/Advanced_params.rst +++ b/src/Tools/YamsPlug/doc/Advanced_params.rst @@ -1,16 +1,19 @@ Advanced Remeshing Options ========================== -** be aware that no control of coherency is done when you set these parameters : for instance, geometrical approximation is only allowed when yams compute a mesh for finite elements but the GUI will let you choose geometrical approximation and compute a visualisation mesh. read DISTENE documentation ** +.. note:: + Be aware that no control of coherency is done when you set these parameters : for instance, geometrical approximation is only allowed when SurfOpt computes a mesh for finite elements but the GUI will let you choose geometrical approximation and compute a visualisation mesh. See Distene's documentation for more details : + :download:`MeshGems-SurfOpt: The automatic surface remeshing tool of the MeshGems Suite `. - - **Ridge detection** + +- **Ridge detection** if not set (ridge detection disabled ), MeshGems-SurfOpt will not try to detect any new ridge edge by its own mechanism : it will consider as ridge only the ridges given in the mesh. All non-ridge edges that would have been detected as ridge by the Ridge angle paramaeter (see below split edge) will be considered as part of the same continuous patch. This option should not be checked when all the known ridges of the mesh are given and when all other possible ridges are not geometric ridges to take into account. - - **Point smoothing** +- **Point smoothing** When not set (point smoothing is disabled), MeshGems-SurfOpt will not try to move the initial given vertices (along an edge, a ridge or onto the surface), hence MeshGems-SurfOpt will only swap edges, remove vertices or add vertices (refines) to change the mesh. - - **Geometrical approximation** +- **Geometrical approximation** this field as well as the Chordal deviation tolerance parameter,enables the user to bound the maximal chordal deviation allowed. it avoids having sharp angles. , that is, the maximal distance allowed between the detected curve and the plane of the corresponding mesh face. It avoids having faces too far away from the curve they represent. .. image:: images/Tolerance.png @@ -20,23 +23,23 @@ this field as well as the Chordal deviation tolerance parameter,enables the user This parameter P enables the user to specify the maximal chordal deviation E relatively to the local curvature. the maximal chordal deviation will be set to E=P x r (r is the radius of the circumcercle) if the units parameter is set to relative or E=P if the units parameter is set to absolute. - - **Ridge angle** +- **Ridge angle** This parameter specifies the angular values for the automatic detection of ridges and corners. A ridge is automatically detected if the angle between the normal vectors of two adjacent faces exceeds this value. - - **Maximal/Minimal size around vertices** +- **Maximal/Minimal size around vertices** These two parameters allow the user to prescribe a Maximal/Minimal size for the mesh elements, ie the lengths of the edges. - - **Mesh gradation** +- **Mesh gradation** This paramater P controls the element size variation : MeshGems-SurfOpt will avoid having two adjacent egdes which sizes vary more than th given gradation. a size correction is applied to the size map : if two adjacent edges are respectively e1 and e2 long and e2 > Pxe1, then, the new size for the second edge will be set to P x e1. -**This procedure is desactived if P=-1*** +**This procedure is desactived if P=-1** - - **Split edge** +- **Split edge** If this option is activated, MeshGems-SurfOpt creates new vertices placed on the curved surface and adds them to elements. It may be used to obtain higher order elements. diff --git a/src/Tools/YamsPlug/doc/Generics_params.rst b/src/Tools/YamsPlug/doc/Generics_params.rst index 761f26fe3..a38e68289 100644 --- a/src/Tools/YamsPlug/doc/Generics_params.rst +++ b/src/Tools/YamsPlug/doc/Generics_params.rst @@ -10,12 +10,12 @@ This parameter (between 0 and 10) indicates the amount of information that MeshG - **Memory Size** -You usually don't have to set this parameter but you can choose to limit the amount of memory used by MeshGems-SurfOpt. - It requires 370 bytes per node -. Or, if you try to enrich a already big mesh (up to 2 millions nodes), you exceptionally, need to allocate more memory. +You usually don't have to set this parameter but you can choose to limit the amount of memory used by MeshGems-SurfOpt -- It requires 370 bytes per node. Or, if you try to enrich a already big mesh (up to 2 millions nodes), you exceptionally, need to allocate more memory. - **File** -You can change the file used to store remeshing hypotheses. see paragraph :ref:`hypothesis-label` for further informations. +You can change the file used to store remeshing hypotheses, see :ref:`hypothesis-label` for further informations. .. image:: images/Generic.png :align: center diff --git a/src/Tools/YamsPlug/doc/Mandatory_params.rst b/src/Tools/YamsPlug/doc/Mandatory_params.rst index 9a84bdc5e..d4aff8f19 100644 --- a/src/Tools/YamsPlug/doc/Mandatory_params.rst +++ b/src/Tools/YamsPlug/doc/Mandatory_params.rst @@ -1,7 +1,7 @@ Simple Remeshing Options ========================= -simple case +Simple case ----------- All options, but the input mesh, have default values. however, **you have to specify these @@ -42,7 +42,7 @@ This is the main remeshing Option. SurfOpt always does quality improvement. It It is equivalent to SurfOpt's batch option *- - uniform_flat_subdivision yes*. - - **Smoothing** + - **Sandpapering** A surface sandpapering without shrinkage of the given surface triangulation is performed, i.e., the high curvature variations of the given surface will be smoothed out without shrinking the volume in doing so. If ridges are defined, they will be kept as they are in the resulting mesh. It could modify the geometry. It is equivalent to SurfOpt's batch option *- - sand_paper yes*. diff --git a/src/Tools/YamsPlug/doc/files/mg-surfopt_user_manual.pdf b/src/Tools/YamsPlug/doc/files/mg-surfopt_user_manual.pdf new file mode 100644 index 000000000..b85b19919 Binary files /dev/null and b/src/Tools/YamsPlug/doc/files/mg-surfopt_user_manual.pdf differ diff --git a/src/Tools/YamsPlug/doc/images/Generic.png b/src/Tools/YamsPlug/doc/images/Generic.png index eaabb4c92..ff10b2c6b 100644 Binary files a/src/Tools/YamsPlug/doc/images/Generic.png and b/src/Tools/YamsPlug/doc/images/Generic.png differ diff --git a/src/Tools/YamsPlug/doc/images/Simple.png b/src/Tools/YamsPlug/doc/images/Simple.png index 63f61b421..210025a2f 100644 Binary files a/src/Tools/YamsPlug/doc/images/Simple.png and b/src/Tools/YamsPlug/doc/images/Simple.png differ diff --git a/src/Tools/YamsPlug/monYamsPlugDialog.py b/src/Tools/YamsPlug/monYamsPlugDialog.py index f27bc22b5..076030b59 100644 --- a/src/Tools/YamsPlug/monYamsPlugDialog.py +++ b/src/Tools/YamsPlug/monYamsPlugDialog.py @@ -76,7 +76,7 @@ class MonYamsPlugDialog(Ui_YamsPlugDialog,QWidget): v1=QDoubleValidator(self) v1.setBottom(0.) #v1.setTop(1000.) #per thousand... only if relative - v1.setDecimals(2) + v1.setDecimals(3) self.SP_Tolerance.setValidator(v1) self.SP_Tolerance.titleForWarning="Chordal Tolerance" @@ -102,14 +102,20 @@ class MonYamsPlugDialog(Ui_YamsPlugDialog,QWidget): self.connect(self.LE_ParamsFile,SIGNAL("returnPressed()"),self.paramsFileNameChanged) def PBHelpPressed(self): + import SalomePyQt + sgPyQt = SalomePyQt.SalomePyQt() try : mydir=os.environ["SMESH_ROOT_DIR"] except Exception: QMessageBox.warning(self, "Help", "Help unavailable $SMESH_ROOT_DIR not found") return - maDoc=mydir+"/share/doc/salome/gui/SMESH/yams/_downloads/mg-surfopt_user_manual.pdf" - command="xdg-open "+maDoc+";" - subprocess.call(command, shell=True) + + maDoc=mydir+"/share/doc/salome/gui/SMESH/yams/index.html" + sgPyQt.helpContext(maDoc,"") + + #maDoc=mydir+"/share/doc/salome/gui/SMESH/yams/_downloads/mg-surfopt_user_manual.pdf" + #command="xdg-open "+maDoc+";" + #subprocess.call(command, shell=True) def PBOKPressed(self): if not(self.PrepareLigneCommande()): @@ -401,7 +407,11 @@ class MonYamsPlugDialog(Ui_YamsPlugDialog,QWidget): mySObject, myEntry = guihelper.getSObjectSelected() if CORBA.is_nil(mySObject) or mySObject==None: - QMessageBox.critical(self, "Mesh", "select an input mesh") + #QMessageBox.critical(self, "Mesh", "select an input mesh") + self.LE_MeshSmesh.setText("") + self.MeshIn="" + self.LE_MeshFile.setText("") + self.fichierIn="" return self.smeshStudyTool = SMeshStudyTools() try: @@ -477,7 +487,7 @@ class MonYamsPlugDialog(Ui_YamsPlugDialog,QWidget): if self.SP_MinSize.value() != 5 : self.commande+=" --min_size %f" %self.SP_MinSize.value() if self.SP_Gradation.value() != 1.3 : self.commande+=" --gradation %f" %self.SP_MaxSize.value() if self.SP_Memory.value() != 0 : self.commande+=" --max_memory %d" %self.SP_Memory.value() - if self.SP_Verbosity.value() != 3 : self.commande+=" --max_memory %d" %self.SP_Verbosity.value() + if self.SP_Verbosity.value() != 3 : self.commande+=" --verbose %d" %self.SP_Verbosity.value() self.commande+=" --in " + self.fichierIn self.commande+=" --out " + self.fichierOut @@ -503,22 +513,24 @@ class MonYamsPlugDialog(Ui_YamsPlugDialog,QWidget): self.CB_Ridge.setChecked(True) self.CB_Point.setChecked(True) self.CB_SplitEdge.setChecked(False) - self.SP_MaxSize.setProperty("value", -2.0) - self.SP_MinSize.setProperty("value", -2.0) + self.SP_MaxSize.setProperty("value", 100) + self.SP_MinSize.setProperty("value", 5) self.SP_Verbosity.setProperty("value", 3) self.SP_Memory.setProperty("value", 0) + self.PBMeshSmeshPressed() + self.TWOptions.setCurrentIndex(0) # Reset current active tab to the first tab __dialog=None def getDialog(): """ This function returns a singleton instance of the plugin dialog. - c est obligatoire pour faire un show sans parent... + It is mandatory in order to call show without a parent ... """ global __dialog if __dialog is None: __dialog = MonYamsPlugDialog() - #else : - # __dialog.clean() + else : + __dialog.clean() return __dialog #