From 4ae19232e4bac8cec51b008f9f893c50c2cf1117 Mon Sep 17 00:00:00 2001 From: mnt Date: Thu, 10 Mar 2016 11:28:48 +0300 Subject: [PATCH 01/22] Do not generate PDF documentation with latex --- src/Tools/blocFissure/doc/CMakeLists.txt | 45 +++++------------------- 1 file changed, 8 insertions(+), 37 deletions(-) diff --git a/src/Tools/blocFissure/doc/CMakeLists.txt b/src/Tools/blocFissure/doc/CMakeLists.txt index c1b0efe46..8605eda97 100755 --- a/src/Tools/blocFissure/doc/CMakeLists.txt +++ b/src/Tools/blocFissure/doc/CMakeLists.txt @@ -17,47 +17,18 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -SET(RSTFILES - index.rst -) - -SET(SPHINXOPTS ) -SET(SOURCEDIR ${CMAKE_CURRENT_SOURCE_DIR}) -SET(PAPEROPT_a4 -D latex_paper_size=a4) -SET(ALLSPHINXOPTS -d doctrees ${PAPEROPT_a4} ${SPHINXOPTS} ${SOURCEDIR}) - SALOME_CONFIGURE_FILE(conf.py.in conf.py) -ADD_CUSTOM_TARGET(BUILD_HTML ALL - COMMAND ${CMAKE_COMMAND} -E make_directory html - COMMAND ${CMAKE_COMMAND} -E make_directory doctrees - COMMAND ${SPHINX_EXECUTABLE} -c ${CMAKE_CURRENT_BINARY_DIR} -b html ${ALLSPHINXOPTS} html - DEPENDS ${RSTFILES} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} -) - -ADD_CUSTOM_TARGET(BUILD_PDF ALL - COMMAND ${CMAKE_COMMAND} -E make_directory latex - COMMAND ${SPHINX_EXECUTABLE} -c ${CMAKE_CURRENT_BINARY_DIR} -b latex ${ALLSPHINXOPTS} latex - COMMAND make -C latex all-pdf - DEPENDS ${RSTFILES} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} -) +SET(_cmd_options -c ${CMAKE_CURRENT_BINARY_DIR} -b html -d doctrees -D latex_paper_size=a4 ${CMAKE_CURRENT_SOURCE_DIR} docutils) +SALOME_GENERATE_ENVIRONMENT_SCRIPT(_cmd env_script "${SPHINX_EXECUTABLE}" "${_cmd_options}") -INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/ +ADD_CUSTOM_TARGET(html_docs_blocFissure COMMAND ${_cmd}) + +INSTALL(CODE "EXECUTE_PROCESS(COMMAND \"${CMAKE_COMMAND}\" --build ${PROJECT_BINARY_DIR} --target html_docs_blocFissure)") +INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docutils/ DESTINATION ${SALOME_INSTALL_DOC}/gui/SMESH/blocFissure PATTERN ".buildinfo" EXCLUDE ) -INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/latex/blocFissure.pdf DESTINATION ${SALOME_INSTALL_DOC}/gui/SMESH/blocFissure) - -#SET(_cmd_options -c ${CMAKE_CURRENT_BINARY_DIR} -b html -d doctrees -D latex_paper_size=a4 ${CMAKE_CURRENT_SOURCE_DIR} docutils) -#SALOME_GENERATE_ENVIRONMENT_SCRIPT(_cmd env_script "${SPHINX_EXECUTABLE}" "${_cmd_options}") - -#ADD_CUSTOM_TARGET(html_docs_ZCracksPlug COMMAND ${_cmd}) - -#INSTALL(CODE "EXECUTE_PROCESS(COMMAND \"${CMAKE_COMMAND}\" --build ${PROJECT_BINARY_DIR} --target html_docs_ZCracksPlug)") -#INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docutils/ DESTINATION ${SALOME_INSTALL_DOC}/gui/SMESH/zcracks) - -#SET(make_clean_files docutils doctrees) -#SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${make_clean_files}") +SET(make_clean_files docutils doctrees) +SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${make_clean_files}") From 0224364ee28a7d92b0d28376df5649f6036be4c0 Mon Sep 17 00:00:00 2001 From: akl Date: Thu, 10 Mar 2016 17:55:36 +0300 Subject: [PATCH 02/22] Taking into account SALOME_BUILD_DOC option. --- src/Tools/blocFissure/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Tools/blocFissure/CMakeLists.txt b/src/Tools/blocFissure/CMakeLists.txt index 092977b32..0f0beaf32 100644 --- a/src/Tools/blocFissure/CMakeLists.txt +++ b/src/Tools/blocFissure/CMakeLists.txt @@ -20,7 +20,10 @@ ADD_SUBDIRECTORY(CasTests) ADD_SUBDIRECTORY(gmu) ADD_SUBDIRECTORY(materielCasTests) -ADD_SUBDIRECTORY(doc) + +IF(SALOME_BUILD_DOC) + ADD_SUBDIRECTORY(doc) +ENDIF(SALOME_BUILD_DOC) IF(SALOME_BUILD_GUI) ADD_SUBDIRECTORY(ihm) From a1a6d5ddc111fa237d1164fda37ff823a3fac764 Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 11 Mar 2016 16:32:07 +0300 Subject: [PATCH 03/22] 53103: Mesh visualization performance problem Optimize visualization and mesh loading. + fix docs --- doc/salome/examples/3dmesh.py | 23 +++-- doc/salome/examples/grouping_elements_ex01.py | 58 ++++++++++++ doc/salome/examples/prism_3d_algo.py | 4 +- doc/salome/gui/SMESH/CMakeLists.txt | 4 +- .../gui/SMESH/input/smeshpy_interface.doc | 93 +++++++++++-------- .../gui/SMESH/input/tui_creating_meshes.doc | 30 +++--- .../gui/SMESH/input/tui_grouping_elements.doc | 27 ++---- .../gui/SMESH/input/tui_modifying_meshes.doc | 50 ++++------ .../gui/SMESH/input/tui_quality_controls.doc | 2 + .../SMESH/input/tui_transforming_meshes.doc | 43 +++------ .../input/tui_work_on_objects_from_gui.doc | 2 +- idl/SMESH_Group.idl | 2 +- src/DriverMED/DriverMED_Family.cxx | 4 +- src/DriverMED/DriverMED_Family.h | 8 +- src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx | 19 ++-- src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx | 10 +- src/OBJECT/SMESH_Object.cxx | 84 ++++++++--------- src/SMESHDS/SMESHDS_Mesh.cxx | 2 +- src/SMESHGUI/SMESHGUI_MeshInfo.cxx | 1 + src/SMESH_I/SMESH_PreMeshInfo.cxx | 2 +- src/SMESH_SWIG/StdMeshersBuilder.py | 2 +- src/SMESH_SWIG/smeshBuilder.py | 26 +++--- 22 files changed, 265 insertions(+), 231 deletions(-) diff --git a/doc/salome/examples/3dmesh.py b/doc/salome/examples/3dmesh.py index 67a707533..57a1440e0 100644 --- a/doc/salome/examples/3dmesh.py +++ b/doc/salome/examples/3dmesh.py @@ -2,17 +2,16 @@ import salome salome.salome_init() -import GEOM from salome.geom import geomBuilder geompy = geomBuilder.New(salome.myStudy) -import SMESH, SALOMEDS +import SMESH from salome.smesh import smeshBuilder smesh = smeshBuilder.New(salome.myStudy) ### # Geometry: an assembly of a box, a cylinder and a truncated cone -# meshed with tetrahedral +# to be meshed with tetrahedra ### # Define values @@ -44,14 +43,14 @@ piece = geompy.MakeFuse(box_cyl, cone) geompy.addToStudy(piece, name) # Create a group of faces -group = geompy.CreateGroup(piece, geompy.ShapeType["FACE"]) +faces_group = geompy.CreateGroup(piece, geompy.ShapeType["FACE"]) group_name = name + "_grp" -geompy.addToStudy(group, group_name) -group.SetName(group_name) +geompy.addToStudy(faces_group, group_name) +faces_group.SetName(group_name) # Add faces to the group faces = geompy.SubShapeAllIDs(piece, geompy.ShapeType["FACE"]) -geompy.UnionIDs(group, faces) +geompy.UnionIDs(faces_group, faces) ### # Create a mesh @@ -60,20 +59,20 @@ geompy.UnionIDs(group, faces) # Define a mesh on a geometry tetra = smesh.Mesh(piece, name) -# Define 1D hypothesis +# Define 1D algorithm and hypothesis algo1d = tetra.Segment() algo1d.LocalLength(10) -# Define 2D hypothesis +# Define 2D algorithm and hypothesis algo2d = tetra.Triangle() algo2d.LengthFromEdges() -# Define 3D hypothesis +# Define 3D algorithm and hypothesis algo3d = tetra.Tetrahedron() algo3d.MaxElementVolume(100) # Compute the mesh tetra.Compute() -# Create a groupe of faces -tetra.Group(group) +# Create a mesh group of all triangles generated on geom faces present in faces_group +group = tetra.Group(faces_group) diff --git a/doc/salome/examples/grouping_elements_ex01.py b/doc/salome/examples/grouping_elements_ex01.py index 013332766..9181e43df 100644 --- a/doc/salome/examples/grouping_elements_ex01.py +++ b/doc/salome/examples/grouping_elements_ex01.py @@ -19,4 +19,62 @@ aGroup1 = mesh.MakeGroupByIds("Area > 100", SMESH.FACE, anIds) aGroup2 = mesh.CreateEmptyGroup(SMESH.NODE, "all nodes") aGroup2.AddFrom(mesh.mesh) + +# ==================================== +# Various methods of the Group object +# ==================================== + +aGroup = mesh.CreateEmptyGroup(SMESH.NODE, "aGroup") + +# set/get group name +aGroup.SetName( "new name" ) +print "name", aGroup.GetName() + +# get group type (type of entities in the group, SMESH.NODE in our case) +print "type", aGroup.GetType() + +# get number of entities (nodes in our case) in the group +print "size", aGroup.Size() + +# check of emptiness +print "is empty", aGroup.IsEmpty() + +# check of presence of an entity in the group +aGroup.Add([1,2]) # method specific to the standalone group +print "contains node 2", aGroup.Contains(2) + +# get an entity by index +print "1st node", aGroup.GetID(1) + +# get all entities +print "all", aGroup.GetIDs() + +# get number of nodes (actual for groups of elements) +print "nb nodes", aGroup.GetNumberOfNodes() + +# get underlying nodes (actual for groups of elements) +print "nodes", aGroup.GetNodeIDs() + +# set/get color +import SALOMEDS +aGroup.SetColor( SALOMEDS.Color(1.,1.,0.)); +print "color", aGroup.GetColor() + +# ---------------------------------------------------------------------------- +# methods specific to the standalone group and not present in GroupOnGeometry +# and GroupOnFilter +# ---------------------------------------------------------------------------- + +# clear the group's contents +aGroup.Clear() + +# add contents of other object (group, sub-mesh, filter) +aGroup.AddFrom( aGroup2 ) + +# removes entities +aGroup.Remove( [2,3,4] ) + + + + salome.sg.updateObjBrowser(1) diff --git a/doc/salome/examples/prism_3d_algo.py b/doc/salome/examples/prism_3d_algo.py index 7be0a29d3..e51822561 100644 --- a/doc/salome/examples/prism_3d_algo.py +++ b/doc/salome/examples/prism_3d_algo.py @@ -1,4 +1,4 @@ -# Use 3D extrusion meshing algorithm +# Usage of 3D Extrusion meshing algorithm import salome salome.salome_init() @@ -58,7 +58,7 @@ mesh = smesh.Mesh( prisms ) # assign Global hypotheses -# 1D algorithm and hypothesis for vertical division +# 1D algorithm and hypothesis for division along the pipe mesh.Segment().NumberOfSegments(15) # Extrusion 3D algo diff --git a/doc/salome/gui/SMESH/CMakeLists.txt b/doc/salome/gui/SMESH/CMakeLists.txt index 47c517cff..a221bbfe8 100644 --- a/doc/salome/gui/SMESH/CMakeLists.txt +++ b/doc/salome/gui/SMESH/CMakeLists.txt @@ -30,8 +30,8 @@ SET(kernel_file "${KERNEL_ROOT_DIR}/bin/salome/prepare_generating_doc.py") SALOME_ACCUMULATE_ENVIRONMENT(SMESH_MeshersList NOCHECK ${DOC_SMESH_MeshersList}) -SET(_cmd_options ${smesh_file} -d -o tmp1/smeshBuilder.py StdMeshers) -SALOME_GENERATE_ENVIRONMENT_SCRIPT(_cmd env_script "${PYTHON_EXECUTABLE}" "${_cmd_options}") +SET(_cmd_options ${smesh_file} -o tmp1/smeshBuilder.py StdMeshers) +SALOME_GENERATE_ENVIRONMENT_SCRIPT(_cmd env_script "${PYTHON_EXECUTABLE}" "${_cmd_options}") ADD_CUSTOM_TARGET(usr_docs ${CMAKE_COMMAND} -E make_directory tmp1 COMMAND ${CMAKE_COMMAND} -E make_directory tmp2 diff --git a/doc/salome/gui/SMESH/input/smeshpy_interface.doc b/doc/salome/gui/SMESH/input/smeshpy_interface.doc index df7e15967..92bd2f41d 100644 --- a/doc/salome/gui/SMESH/input/smeshpy_interface.doc +++ b/doc/salome/gui/SMESH/input/smeshpy_interface.doc @@ -7,49 +7,66 @@ be used for easy mesh creation and edition. Documentation for SALOME %Mesh module Python API is available in two forms: - Structured documentation, where all methods and -classes are grouped by their functionality, like it is done in the GUI documentation +classes are grouped by their functionality. - Linear documentation grouped only by classes, declared in the \ref smeshBuilder and \ref StdMeshersBuilder Python packages. -\n With SALOME 7.2, the Python interface for %Mesh has been slightly modified to offer new functionality, +\n With SALOME 7.2, the Python interface for %Mesh has been slightly modified to offer new functionality. \n You may have to modify your scripts generated with SALOME 6 or older versions. -\n Please see \ref smesh_migration_page - -The SMESH python package contains helper functions to manipulate mesh elements and -interact with these elements. - -Note that these functions either encapsulate the python programming interface of SMESH core -(the CORBA or SWIG interface for example) or extend existing utilities as the smesh.py module. - -The functions are distributed in the python package \b salome.smesh. - -\note -The main package \b salome contains other sub-packages that are distributed with the other -SALOME modules. For example, the KERNEL module provides the python package \b salome.kernel -and GEOM the package \b salome.geom. +\n Please see \ref smesh_migration_page. Class \ref smeshBuilder.smeshBuilder "smeshBuilder" provides an interface to create and handle meshes. It can be used to create an empty mesh or to import mesh from the data file. -Class \ref smeshstudytools.SMeshStudyTools "SMeshStudyTools" provides several methods to manipulate mesh objects in Salome study. - As soon as mesh is created, it is possible to manage it via its own methods, described in class \ref smeshBuilder.Mesh "Mesh" documentation. -Class \ref smeshBuilder.Mesh "Mesh" allows assigning algorithms to a mesh. -Please note that some algorithms, included in the standard SALOME -distribution are always available. Python package \ref StdMeshersBuilder "StdMeshersBuilder" -provides an interface for standard meshing algorithms included into -the SALOME %Mesh module distribution, like: -- REGULAR (1D) -- COMPOSITE (1D) -- MEFISTO (2D) -- Quadrangle (2D) -- Hexa(3D) -- etc ... +Class \ref smeshstudytools.SMeshStudyTools "SMeshStudyTools" provides several methods to manipulate mesh objects in Salome study. -To add meshing hypotheses, it is possible to use the functions provided by the -algorithms interfaces. +A usual workflow to generate a mesh on geometry is following: +
    +
  1. Create an instance of \ref smeshBuilder.smeshBuilder "smeshBuilder": +
    +      from salome.smesh import smeshBuilder
    +      smesh = smeshBuilder.New( salome.myStudy )
    +    
  2. +
  3. Create a \ref smeshBuilder.Mesh "mesh" object: +
    +      mesh = \ref smeshBuilder.smeshBuilder.Mesh "smesh.Mesh( geometry )" 
    +    
  4. +
  5. Create and assign \ref basic_meshing_algos_page "algorithms" by + calling corresponding methods of the mesh. If a sub-shape is + provided as an argument, a \ref constructing_submeshes_page "sub-mesh" + is implicitly created on this sub-shape: +
    +      regular1D = \ref smeshBuilder.Mesh.Segment "mesh.Segment"()
    +      mefisto   = \ref smeshBuilder.Mesh.Triangle "mesh.Triangle"( smeshBuilder.MEFISTO )
    +      # use other triangle algorithm on a face -- a sub-mesh appears in the mesh
    +      netgen    = \ref smeshBuilder.Mesh.Triangle "mesh.Triangle"( smeshBuilder.NETGEN_1D2D, face )
    +    
  6. +
  7. Create and assign \ref about_hypo_page "hypotheses" by calling + corresponding methods of algorithms: +
    +      segLen10 = \ref StdMeshersBuilder.StdMeshersBuilder_Segment.LocalLength "regular1D.LocalLength"( 10. )
    +      maxArea  = \ref StdMeshersBuilder.StdMeshersBuilder_Segment.LocalLength "mefisto.MaxElementArea"( 100. )
    +      netgen.SetMaxSize( 20. )
    +      netgen.SetFineness( smeshBuilder.VeryCoarse )
    +    
    +
  8. +
  9. \ref compute_anchor "Compute" the mesh (generate mesh nodes and elements): +
    +      \ref Mesh.Compute "mesh.Compute"()
    +    
    +
  10. +
+ +An easiest way to start with Python scripting is to do something in +GUI and then to get a corresponding Python script via + File > Dump Study menu item. Don't forget that you can get +all methods of any object in hand (e.g. a mesh group or a hypothesis) +by calling \a dir() Python built-in function. + +All methods of the Mesh Group can be found in \ref tui_create_standalone_group sample script. An example below demonstrates usage of the Python API for 3d mesh generation. @@ -61,19 +78,19 @@ Examples of Python scripts for Mesh operations are available by the following links: - \subpage tui_creating_meshes_page -- \subpage tui_cartesian_algo -- \subpage tui_use_existing_faces -- \subpage tui_viewing_meshes_page - \subpage tui_defining_hypotheses_page -- \subpage tui_quality_controls_page -- \subpage tui_filters_page - \subpage tui_grouping_elements_page +- \subpage tui_filters_page - \subpage tui_modifying_meshes_page - \subpage tui_transforming_meshes_page -- \subpage tui_notebook_smesh_page +- \subpage tui_viewing_meshes_page +- \subpage tui_quality_controls_page - \subpage tui_measurements_page -- \subpage tui_generate_flat_elements_page - \subpage tui_work_on_objects_from_gui +- \subpage tui_notebook_smesh_page +- \subpage tui_cartesian_algo +- \subpage tui_use_existing_faces - \subpage tui_prism_3d_algo +- \subpage tui_generate_flat_elements_page */ diff --git a/doc/salome/gui/SMESH/input/tui_creating_meshes.doc b/doc/salome/gui/SMESH/input/tui_creating_meshes.doc index 984616457..79b98b49d 100644 --- a/doc/salome/gui/SMESH/input/tui_creating_meshes.doc +++ b/doc/salome/gui/SMESH/input/tui_creating_meshes.doc @@ -2,54 +2,50 @@ \page tui_creating_meshes_page Creating Meshes +\tableofcontents + \n First of all see \ref example_3d_mesh "Example of 3d mesh generation", which is an example of good python script style for Mesh module.
-

Construction of a Mesh

+\section construction_of_a_mesh Construction of a mesh \tui_script{creating_meshes_ex01.py}
-\anchor tui_construction_submesh -

Construction of a Submesh

+\section tui_construction_submesh Construction of a sub-mesh \tui_script{creating_meshes_ex02.py}
-

Change priority of submeshes in Mesh

+\section change_priority_of_submeshes_in_mesh Change priority of sub-meshes in mesh \tui_script{creating_meshes_ex03.py}
-\anchor tui_editing_while_meshing -

Intermediate edition while meshing

+\section tui_editing_while_meshing Intermediate edition while meshing \tui_script{a3DmeshOnModified2Dmesh.py}
-\anchor tui_editing_mesh -

Editing a mesh

+\section tui_editing_mesh Editing a mesh \tui_script{creating_meshes_ex04.py}
-\anchor tui_export_mesh -

Export of a Mesh

+\section tui_export_mesh Export of a Mesh \tui_script{creating_meshes_ex05.py}
-

How to mesh a cylinder with hexahedrons?

+\section how_to_mesh_a_cylinder_with_hexahedrons How to mesh a cylinder with hexahedrons? Here you can see an example of python script, creating a hexahedral -mesh on a cylinder. And a picture below the source code of the script, -demonstrating the resulting mesh. +mesh on a cylinder. A picture below the source code of the script +demonstrates the resulting mesh. \tui_script{creating_meshes_ex06.py} \image html mesh_cylinder_hexa.png
-\anchor tui_building_compound -

Building a compound of meshes

+\section tui_building_compound Building a compound of meshes \tui_script{creating_meshes_ex07.py}
-\anchor tui_copy_mesh -

Mesh Copying

+\section tui_copy_mesh Mesh Copying \tui_script{creating_meshes_ex08.py} */ diff --git a/doc/salome/gui/SMESH/input/tui_grouping_elements.doc b/doc/salome/gui/SMESH/input/tui_grouping_elements.doc index a264f2542..535c47640 100644 --- a/doc/salome/gui/SMESH/input/tui_grouping_elements.doc +++ b/doc/salome/gui/SMESH/input/tui_grouping_elements.doc @@ -2,27 +2,24 @@ \page tui_grouping_elements_page Grouping Elements +\tableofcontents +
-\anchor tui_create_standalone_group -

Create a Standalone Group

+\section tui_create_standalone_group Create a Standalone Group \tui_script{grouping_elements_ex01.py} \image html create_group.png
-\anchor tui_create_group_on_geometry -

Create a Group on Geometry

+\section tui_create_group_on_geometry Create a Group on Geometry \tui_script{grouping_elements_ex02.py}
-\anchor tui_create_group_on_filter - -

Create a Group on Filter

+\section tui_create_group_on_filter Create a Group on Filter \tui_script{grouping_elements_ex03.py}
-\anchor tui_edit_group -

Edit a Group

+\section tui_edit_group Edit a Group \tui_script{grouping_elements_ex04.py} \image html editing_groups1.png @@ -30,8 +27,7 @@ \image html editing_groups2.png
-\anchor tui_union_of_groups -

Union of groups

+\section tui_union_of_groups Union of groups \tui_script{grouping_elements_ex05.py} \image html union_groups1.png @@ -41,8 +37,7 @@ \image html union_groups3.png
-\anchor tui_intersection_of_groups -

Intersection of groups

+\section tui_intersection_of_groups Intersection of groups \tui_script{grouping_elements_ex06.py} \image html intersect_groups1.png @@ -52,8 +47,7 @@ \image html intersect_groups3.png
-\anchor tui_cut_of_groups -

Cut of groups

+\section tui_cut_of_groups Cut of groups \tui_script{grouping_elements_ex07.py} \image html cut_groups1.png @@ -63,8 +57,7 @@ \image html cut_groups3.png
-\anchor tui_create_dim_group -

Creating groups of entities from existing groups of superior dimensions

+\section tui_create_dim_group Creating groups of entities from existing groups of superior dimensions \tui_script{grouping_elements_ex08.py} \image html dimgroup_tui1.png diff --git a/doc/salome/gui/SMESH/input/tui_modifying_meshes.doc b/doc/salome/gui/SMESH/input/tui_modifying_meshes.doc index 107306547..7d0352286 100644 --- a/doc/salome/gui/SMESH/input/tui_modifying_meshes.doc +++ b/doc/salome/gui/SMESH/input/tui_modifying_meshes.doc @@ -2,9 +2,10 @@ \page tui_modifying_meshes_page Modifying Meshes +\tableofcontents +
-\anchor tui_adding_nodes_and_elements -

Adding Nodes and Elements

+\section tui_adding_nodes_and_elements Adding Nodes and Elements
\anchor tui_add_node @@ -57,8 +58,7 @@ \tui_script{modifying_meshes_ex10.py}
-\anchor tui_removing_nodes_and_elements -

Removing Nodes and Elements

+\section tui_removing_nodes_and_elements Removing Nodes and Elements
\anchor tui_removing_nodes @@ -76,73 +76,59 @@ \tui_script{modifying_meshes_ex13.py}
-\anchor tui_renumbering_nodes_and_elements -

Renumbering Nodes and Elements

+\section tui_renumbering_nodes_and_elements Renumbering Nodes and Elements \tui_script{modifying_meshes_ex14.py}
-\anchor tui_moving_nodes -

Moving Nodes

+\section tui_moving_nodes Moving Nodes \tui_script{modifying_meshes_ex15.py}
-\anchor tui_diagonal_inversion -

Diagonal Inversion

+\section tui_diagonal_inversion Diagonal Inversion \tui_script{modifying_meshes_ex16.py}
-\anchor tui_uniting_two_triangles -

Uniting two Triangles

+\section tui_uniting_two_triangles Uniting two Triangles \tui_script{modifying_meshes_ex17.py}
-\anchor tui_uniting_set_of_triangles -

Uniting a Set of Triangles

+\section tui_uniting_set_of_triangles Uniting a Set of Triangles \tui_script{modifying_meshes_ex18.py}
-\anchor tui_orientation -

Orientation

+\section tui_orientation Orientation \tui_script{modifying_meshes_ex19.py}
-\anchor tui_cutting_quadrangles -

Cutting Quadrangles

+\section tui_cutting_quadrangles Cutting Quadrangles \tui_script{modifying_meshes_ex20.py}
-\anchor tui_smoothing -

Smoothing

+\section tui_smoothing Smoothing \tui_script{modifying_meshes_ex21.py}
-\anchor tui_extrusion -

Extrusion

+\section tui_extrusion Extrusion \tui_script{modifying_meshes_ex22.py}
-\anchor tui_extrusion_along_path -

Extrusion along a Path

+\section tui_extrusion_along_path Extrusion along a Path \tui_script{modifying_meshes_ex23.py}
-\anchor tui_revolution -

Revolution

+\section tui_revolution Revolution \tui_script{modifying_meshes_ex24.py}
-\anchor tui_pattern_mapping -

Pattern Mapping

+\section tui_pattern_mapping Pattern Mapping \tui_script{modifying_meshes_ex25.py}
-\anchor tui_quadratic -

Convert mesh to/from quadratic

+\section tui_quadratic Convert mesh to/from quadratic \tui_script{modifying_meshes_ex26.py}
-\anchor tui_split_biquad -

Split bi-quadratic into linear

+\section tui_split_biquad Split bi-quadratic into linear \tui_script{split_biquad.py} */ diff --git a/doc/salome/gui/SMESH/input/tui_quality_controls.doc b/doc/salome/gui/SMESH/input/tui_quality_controls.doc index be849962c..1434c9b07 100644 --- a/doc/salome/gui/SMESH/input/tui_quality_controls.doc +++ b/doc/salome/gui/SMESH/input/tui_quality_controls.doc @@ -2,6 +2,8 @@ \page tui_quality_controls_page Quality Controls +\tableofcontents + \section tui_free_borders Free Borders \tui_script{quality_controls_ex01.py} diff --git a/doc/salome/gui/SMESH/input/tui_transforming_meshes.doc b/doc/salome/gui/SMESH/input/tui_transforming_meshes.doc index 86ce3dca0..9837176b6 100644 --- a/doc/salome/gui/SMESH/input/tui_transforming_meshes.doc +++ b/doc/salome/gui/SMESH/input/tui_transforming_meshes.doc @@ -2,73 +2,58 @@ \page tui_transforming_meshes_page Transforming Meshes -

Transforming Meshes

+\tableofcontents
-\anchor tui_translation -

Translation

+\section tui_translation Translation \tui_script{transforming_meshes_ex01.py}
-\anchor tui_rotation -

Rotation

+\section tui_rotation Rotation \tui_script{transforming_meshes_ex02.py}
-\anchor tui_scale -

Scale

+\section tui_scale Scale \tui_script{transforming_meshes_ex03.py}
-\anchor tui_symmetry -

Symmetry

+\section tui_symmetry Symmetry \tui_script{transforming_meshes_ex04.py}
-\anchor tui_merging_nodes -

Merging Nodes

+\section tui_merging_nodes Merging Nodes \tui_script{transforming_meshes_ex05.py}
-\anchor tui_merging_elements -

Merging Elements

+\section tui_merging_elements Merging Elements \tui_script{transforming_meshes_ex06.py} -

Sewing Meshes

-
-\anchor tui_sew_meshes_border_to_side -

Sew Meshes Border to Side

+\section tui_sew_meshes_border_to_side Sew Meshes Border to Side \tui_script{transforming_meshes_ex07.py}
-\anchor tui_sew_conform_free_borders -

Sew Conform Free Borders

+\section tui_sew_conform_free_borders Sew Conform Free Borders \tui_script{transforming_meshes_ex08.py}
-\anchor tui_sew_free_borders -

Sew Free Borders

+\section tui_sew_free_borders Sew Free Borders \tui_script{transforming_meshes_ex09.py}
-\anchor tui_sew_side_elements -

Sew Side Elements

+\section tui_sew_side_elements Sew Side Elements \tui_script{transforming_meshes_ex10.py}
-\anchor tui_duplicate_nodes -

Duplicate nodes or/and elements

+\section tui_duplicate_nodes Duplicate nodes or/and elements \tui_script{transforming_meshes_ex11.py}
-\anchor tui_make_2dmesh_from_3d -

Create boundary elements

+\section tui_make_2dmesh_from_3d Create boundary elements \tui_script{transforming_meshes_ex12.py}
-\anchor tui_reorient_faces -

Reorient faces

+\section tui_reorient_faces Reorient faces \tui_script{transforming_meshes_ex13.py} */ diff --git a/doc/salome/gui/SMESH/input/tui_work_on_objects_from_gui.doc b/doc/salome/gui/SMESH/input/tui_work_on_objects_from_gui.doc index abc51d95b..569d821a9 100644 --- a/doc/salome/gui/SMESH/input/tui_work_on_objects_from_gui.doc +++ b/doc/salome/gui/SMESH/input/tui_work_on_objects_from_gui.doc @@ -6,7 +6,7 @@ It is sometimes useful to work alternatively in the GUI of SALOME and in the Pyt \code myMesh_ref = salome.IDToObject("ID") -// were ID is the number that appears in the object browser in the Entry column +// were ID is the string looking like "0:1:2:3" that appears in the object browser in the Entry column // ( If hidden show it by right clicking and checking the checkbox Entry) myMesh = smesh.Mesh(myMesh_ref) \endcode diff --git a/idl/SMESH_Group.idl b/idl/SMESH_Group.idl index 4941f14df..bdc3d6312 100644 --- a/idl/SMESH_Group.idl +++ b/idl/SMESH_Group.idl @@ -74,7 +74,7 @@ module SMESH boolean Contains( in long elem_id ); /*! - * Returns ID of an element at position + * Returns ID of an element at position counted from 1 */ long GetID( in long elem_index ); diff --git a/src/DriverMED/DriverMED_Family.cxx b/src/DriverMED/DriverMED_Family.cxx index d682304fe..4b7ac91c4 100644 --- a/src/DriverMED/DriverMED_Family.cxx +++ b/src/DriverMED/DriverMED_Family.cxx @@ -69,7 +69,7 @@ void DriverMED_Family ::AddElement(const SMDS_MeshElement* theElement) { - myElements.insert(theElement); + myElements.insert( myElements.end(), theElement ); } void @@ -414,7 +414,7 @@ void DriverMED_Family::Init (SMESHDS_GroupBase* theGroup) SMDS_ElemIteratorPtr elemIt = theGroup->GetElements(); while (elemIt->more()) { - myElements.insert(elemIt->next()); + myElements.insert( myElements.end(), elemIt->next() ); } // Type diff --git a/src/DriverMED/DriverMED_Family.h b/src/DriverMED/DriverMED_Family.h index c83534cf9..28d05a568 100644 --- a/src/DriverMED/DriverMED_Family.h +++ b/src/DriverMED/DriverMED_Family.h @@ -49,10 +49,10 @@ #define REST_BALL_FAMILY -5 #define FIRST_ELEM_FAMILY -6 -typedef std::list DriverMED_FamilyPtrList; -typedef std::map SMESHDS_SubMeshPtrMap; -typedef std::list SMESHDS_GroupBasePtrList; -typedef std::set ElementsSet; +typedef std::list DriverMED_FamilyPtrList; +typedef std::map SMESHDS_SubMeshPtrMap; +typedef std::list SMESHDS_GroupBasePtrList; +typedef std::set ElementsSet; class MESHDRIVERMED_EXPORT DriverMED_Family { diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx index 58f9c0ca0..c773d9925 100644 --- a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx @@ -976,8 +976,8 @@ Driver_Mesh::Status DriverMED_R_SMESHDS_Mesh::Perform() } if ( DriverMED::checkFamilyID ( aFamily, aFamNum, myFamilies )) { // Save reference to this element from its family - myFamilies[aFamNum]->AddElement(anElement); - myFamilies[aFamNum]->SetType(anElement->GetType()); + aFamily->AddElement(anElement); + aFamily->SetType(anElement->GetType()); } } } // loop on aNbElems @@ -1081,8 +1081,8 @@ void DriverMED_R_SMESHDS_Mesh::GetGroup(SMESHDS_Group* theGroup) DriverMED_FamilyPtr aFamily = (*aFamsIter).second; if (aFamily->GetTypes().count( theGroup->GetType() ) && aFamily->MemberOf(aGroupName)) { - const set& anElements = aFamily->GetElements(); - set::const_iterator anElemsIter = anElements.begin(); + const ElementsSet& anElements = aFamily->GetElements(); + ElementsSet::const_iterator anElemsIter = anElements.begin(); for (; anElemsIter != anElements.end(); anElemsIter++) { const SMDS_MeshElement * element = *anElemsIter; @@ -1110,8 +1110,8 @@ void DriverMED_R_SMESHDS_Mesh::GetSubMesh (SMESHDS_SubMesh* theSubMesh, DriverMED_FamilyPtr aFamily = (*aFamsIter).second; if (aFamily->MemberOf(aName)) { - const set& anElements = aFamily->GetElements(); - set::const_iterator anElemsIter = anElements.begin(); + const ElementsSet& anElements = aFamily->GetElements(); + ElementsSet::const_iterator anElemsIter = anElements.begin(); if (aFamily->GetType() == SMDSAbs_Node) { for (; anElemsIter != anElements.end(); anElemsIter++) @@ -1146,14 +1146,13 @@ void DriverMED_R_SMESHDS_Mesh::CreateAllSubMeshes () if (aName.substr(0, 7) == string("SubMesh")) { int Id = atoi(string(aName).substr(7).c_str()); - set anElements = aFamily->GetElements(); - set::iterator anElemsIter = anElements.begin(); + const ElementsSet& anElements = aFamily->GetElements(); + ElementsSet::const_iterator anElemsIter = anElements.begin(); if (aFamily->GetType() == SMDSAbs_Node) { for (; anElemsIter != anElements.end(); anElemsIter++) { - SMDS_MeshNode* node = const_cast - ( static_cast( *anElemsIter )); + const SMDS_MeshNode* node = static_cast( *anElemsIter ); // find out a shape type TopoDS_Shape aShape = myMesh->IndexToShape( Id ); int aShapeType = ( aShape.IsNull() ? -1 : aShape.ShapeType() ); diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx index cee3e1b09..638f4ad5c 100644 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx @@ -254,7 +254,6 @@ namespace const SMDSAbs_ElementType anElemType) { anElemFamMap.Clear(); - //anElemFamMap.clear(); list::iterator aFamsIter = aFamilies.begin(); while ( aFamsIter != aFamilies.end() ) { @@ -263,12 +262,11 @@ namespace } else { int aFamId = (*aFamsIter)->GetId(); - const set& anElems = (*aFamsIter)->GetElements(); - set::const_iterator anElemsIter = anElems.begin(); + const ElementsSet& anElems = (*aFamsIter)->GetElements(); + ElementsSet::const_iterator anElemsIter = anElems.begin(); for (; anElemsIter != anElems.end(); anElemsIter++) { anElemFamMap.Bind( (Standard_Address)*anElemsIter, aFamId ); - //anElemFamMap[*anElemsIter] = aFamId; } // remove a family from the list aFamilies.erase( aFamsIter++ ); @@ -288,9 +286,7 @@ namespace { if ( anElemFamMap.IsBound( (Standard_Address) anElement )) return anElemFamMap( (Standard_Address) anElement ); -// TElemFamilyMap::iterator elem_famNum = anElemFamMap.find( anElement ); -// if ( elem_famNum != anElemFamMap.end() ) -// return elem_famNum->second; + return aDefaultFamilyId; } diff --git a/src/OBJECT/SMESH_Object.cxx b/src/OBJECT/SMESH_Object.cxx index 44d70da65..cbb913fe1 100644 --- a/src/OBJECT/SMESH_Object.cxx +++ b/src/OBJECT/SMESH_Object.cxx @@ -232,8 +232,8 @@ void SMESH_VisualObjDef::createPoints( vtkPoints* thePoints ) { thePoints->SetPoint( nbPoints, aNode->X(), aNode->Y(), aNode->Z() ); int anId = aNode->GetID(); - mySMDS2VTKNodes.insert( TMapOfIds::value_type( anId, nbPoints ) ); - myVTK2SMDSNodes.insert( TMapOfIds::value_type( nbPoints, anId ) ); + mySMDS2VTKNodes.insert( mySMDS2VTKNodes.end(), std::make_pair( anId, nbPoints )); + myVTK2SMDSNodes.insert( myVTK2SMDSNodes.end(), std::make_pair( nbPoints, anId )); nbPoints++; } } @@ -251,48 +251,48 @@ void SMESH_VisualObjDef::buildPrs(bool buildGrid) MESSAGE("----------------------------------------------------------SMESH_VisualObjDef::buildPrs " << buildGrid); if (buildGrid) { - myLocalGrid = true; - try - { - mySMDS2VTKNodes.clear(); - myVTK2SMDSNodes.clear(); - mySMDS2VTKElems.clear(); - myVTK2SMDSElems.clear(); + myLocalGrid = true; + try + { + mySMDS2VTKNodes.clear(); + myVTK2SMDSNodes.clear(); + mySMDS2VTKElems.clear(); + myVTK2SMDSElems.clear(); - if ( IsNodePrs() ) - buildNodePrs(); - else - buildElemPrs(); - } - catch(...) - { - mySMDS2VTKNodes.clear(); - myVTK2SMDSNodes.clear(); - mySMDS2VTKElems.clear(); - myVTK2SMDSElems.clear(); + if ( IsNodePrs() ) + buildNodePrs(); + else + buildElemPrs(); + } + catch(...) + { + mySMDS2VTKNodes.clear(); + myVTK2SMDSNodes.clear(); + mySMDS2VTKElems.clear(); + myVTK2SMDSElems.clear(); - myGrid->SetPoints( 0 ); - myGrid->SetCells( 0, 0, 0, 0, 0 ); - throw; - } + myGrid->SetPoints( 0 ); + myGrid->SetCells( 0, 0, 0, 0, 0 ); + throw; + } } else { - myLocalGrid = false; - if (!GetMesh()->isCompacted()) - { - MESSAGE("*** buildPrs ==> compactMesh!"); - GetMesh()->compactMesh(); - } - vtkUnstructuredGrid *theGrid = GetMesh()->getGrid(); - updateEntitiesFlags(); - myGrid->ShallowCopy(theGrid); - //MESSAGE(myGrid->GetReferenceCount()); - //MESSAGE( "Update - myGrid->GetNumberOfCells() = "<GetNumberOfCells() ); - //MESSAGE( "Update - myGrid->GetNumberOfPoints() = "<GetNumberOfPoints() ); - if( MYDEBUGWITHFILES ) { - SMESH::WriteUnstructuredGrid( myGrid,"myPrs.vtu" ); - } + myLocalGrid = false; + if (!GetMesh()->isCompacted()) + { + MESSAGE("*** buildPrs ==> compactMesh!"); + GetMesh()->compactMesh(); + } + vtkUnstructuredGrid *theGrid = GetMesh()->getGrid(); + updateEntitiesFlags(); + myGrid->ShallowCopy(theGrid); + //MESSAGE(myGrid->GetReferenceCount()); + //MESSAGE( "Update - myGrid->GetNumberOfCells() = "<GetNumberOfCells() ); + //MESSAGE( "Update - myGrid->GetNumberOfPoints() = "<GetNumberOfPoints() ); + if( MYDEBUGWITHFILES ) { + SMESH::WriteUnstructuredGrid( myGrid,"myPrs.vtu" ); + } } } @@ -454,8 +454,8 @@ void SMESH_VisualObjDef::buildElemPrs() int anId = anElem->GetID(); - mySMDS2VTKElems.insert( TMapOfIds::value_type( anId, iElem ) ); - myVTK2SMDSElems.insert( TMapOfIds::value_type( iElem, anId ) ); + mySMDS2VTKElems.insert( mySMDS2VTKElems.end(), std::make_pair( anId, iElem )); + myVTK2SMDSElems.insert( myVTK2SMDSElems.end(), std::make_pair( iElem, anId )); SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); { @@ -986,7 +986,7 @@ static int getNodesFromElems( SMESH::long_array_var& theElemIds, // function : getPointers // purpose : Get std::list from list of IDs //================================================================================= -static int getPointers( const SMDSAbs_ElementType theRequestType, +static int getPointers( const SMDSAbs_ElementType theRequestType, SMESH::long_array_var& theElemIds, const SMDS_Mesh* theMesh, std::list& theResList ) diff --git a/src/SMESHDS/SMESHDS_Mesh.cxx b/src/SMESHDS/SMESHDS_Mesh.cxx index 072fcdac7..ba7d59f37 100644 --- a/src/SMESHDS/SMESHDS_Mesh.cxx +++ b/src/SMESHDS/SMESHDS_Mesh.cxx @@ -2275,7 +2275,7 @@ void SMESHDS_Mesh::compactMesh() int newSmdsId = 0; for (int i = 0; i < myCellsSize; i++) { - if (myCells[i]) + if ( myCells[i] ) { newSmdsId++; // SMDS id start to 1 assert(newSmdsId <= newCellSize); diff --git a/src/SMESHGUI/SMESHGUI_MeshInfo.cxx b/src/SMESHGUI/SMESHGUI_MeshInfo.cxx index f16d08d87..f71de0320 100644 --- a/src/SMESHGUI/SMESHGUI_MeshInfo.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshInfo.cxx @@ -2320,6 +2320,7 @@ GrpComputor::GrpComputor( SMESH::SMESH_GroupBase_ptr grp, void GrpComputor::compute() { if ( !CORBA::is_nil( myGroup ) && myItem ) { + SUIT_OverrideCursor wc; QTreeWidgetItem* item = myItem; myItem = 0; int nb = myToComputeSize ? myGroup->Size() : myGroup->GetNumberOfNodes(); diff --git a/src/SMESH_I/SMESH_PreMeshInfo.cxx b/src/SMESH_I/SMESH_PreMeshInfo.cxx index 0621ed9f1..eb4181170 100644 --- a/src/SMESH_I/SMESH_PreMeshInfo.cxx +++ b/src/SMESH_I/SMESH_PreMeshInfo.cxx @@ -920,7 +920,7 @@ void SMESH_PreMeshInfo::readSubMeshes(DriverMED_R_SMESHDS_Mesh* reader) const #endif nbElems = elemSet.size(); } - // add elements to submeshes + // add elements to sub-meshes TIDSortedElemSet::iterator iE = elemSet.begin(); for ( size_t i = 0; i < nbElems; ++i, ++iE ) { diff --git a/src/SMESH_SWIG/StdMeshersBuilder.py b/src/SMESH_SWIG/StdMeshersBuilder.py index 6dd91e288..204e461b1 100644 --- a/src/SMESH_SWIG/StdMeshersBuilder.py +++ b/src/SMESH_SWIG/StdMeshersBuilder.py @@ -1100,7 +1100,7 @@ class StdMeshersBuilder_Prism3D(Mesh_Algorithm): pass # end of StdMeshersBuilder_Prism3D class -## Defines a Prism 3D algorithm +## Defines Radial Prism 3D algorithm # # It is created by calling smeshBuilder.Mesh.Prism(geom=0) # diff --git a/src/SMESH_SWIG/smeshBuilder.py b/src/SMESH_SWIG/smeshBuilder.py index cfd4117f1..6e39264b1 100644 --- a/src/SMESH_SWIG/smeshBuilder.py +++ b/src/SMESH_SWIG/smeshBuilder.py @@ -32,7 +32,6 @@ ## @{ ## @defgroup l3_algos_basic Basic meshing algorithms ## @defgroup l3_algos_proj Projection Algorithms -## @defgroup l3_algos_radialp Radial Prism ## @defgroup l3_algos_segmarv Segments around Vertex ## @defgroup l3_algos_3dextr 3D extrusion meshing algorithm @@ -70,10 +69,9 @@ ## @defgroup l2_modif_trsf Transforming meshes (Translation, Rotation, Symmetry, Sewing, Merging) ## @defgroup l2_modif_movenode Moving nodes ## @defgroup l2_modif_throughp Mesh through point -## @defgroup l2_modif_invdiag Diagonal inversion of elements ## @defgroup l2_modif_unitetri Uniting triangles -## @defgroup l2_modif_changori Changing orientation of elements ## @defgroup l2_modif_cutquadr Cutting elements +## @defgroup l2_modif_changori Changing orientation of elements ## @defgroup l2_modif_smooth Smoothing ## @defgroup l2_modif_extrurev Extrusion and Revolution ## @defgroup l2_modif_patterns Pattern mapping @@ -310,9 +308,9 @@ engine = None doLcc = False created = False -## This class allows to create, load or manipulate meshes -# It has a set of methods to create load or copy meshes, to combine several meshes. -# It also has methods to get infos on meshes. +## This class allows to create, load or manipulate meshes. +# It has a set of methods to create, load or copy meshes, to combine several meshes, etc. +# It also has methods to get infos and measure meshes. class smeshBuilder(object, SMESH._objref_SMESH_Gen): # MirrorType enumeration @@ -614,6 +612,7 @@ class smeshBuilder(object, SMESH._objref_SMESH_Gen): # @param allGroups forces creation of groups corresponding to every input mesh # @param name name of a new mesh # @return an instance of Mesh class + # @ingroup l2_compounds def Concatenate( self, meshes, uniteIdenticalGroups, mergeNodesAndElements = False, mergeTolerance = 1e-5, allGroups = False, name = ""): @@ -1162,7 +1161,7 @@ omniORB.registerObjref(SMESH._objref_SMESH_Gen._NP_RepositoryId, smeshBuilder) # import salome # salome.salome_init() # from salome.smesh import smeshBuilder -# smesh = smeshBuilder.New(theStudy) +# smesh = smeshBuilder.New(salome.myStudy) # \endcode # @param study SALOME study, generally obtained by salome.myStudy. # @param instance CORBA proxy of SMESH Engine. If None, the default Engine is used. @@ -1177,7 +1176,7 @@ def New( study, instance=None): import salome salome.salome_init() from salome.smesh import smeshBuilder - smesh = smeshBuilder.New(theStudy) + smesh = smeshBuilder.New(salome.myStudy) Parameters: study SALOME study, generally obtained by salome.myStudy. @@ -2153,7 +2152,7 @@ class Mesh: ## # Create a standalone group of entities basing on nodes of other groups. - # \param groups - list of groups, sub-meshes or filters, of any type. + # \param groups - list of reference groups, sub-meshes or filters, of any type. # \param elemType - a type of elements to include to the new group; either of # (SMESH.NODE, SMESH.EDGE, SMESH.FACE, SMESH.VOLUME). # \param name - a name of the new group. @@ -2165,7 +2164,10 @@ class Mesh: # - SMESH.AT_LEAST_ONE - include if one or more node is common, # - SMEHS.MAJORITY - include if half of nodes or more are common. # \param underlyingOnly - if \c True (default), an element is included to the - # new group provided that it is based on nodes of one element of \a groups. + # new group provided that it is based on nodes of an element of \a groups; + # in this case the reference \a groups are supposed to be of higher dimension + # than \a elemType, which can be useful for example to get all faces lying on + # volumes of the reference \a groups. # @return an instance of SMESH_Group # @ingroup l2_grps_operon def CreateDimGroup(self, groups, elemType, name, @@ -2176,7 +2178,7 @@ class Mesh: ## Convert group on geom into standalone group - # @ingroup l2_grps_delete + # @ingroup l2_grps_edit def ConvertToStandalone(self, group): return self.mesh.ConvertToStandalone(group) @@ -3073,7 +3075,7 @@ class Mesh: # @param NodeID1 the ID of the first node # @param NodeID2 the ID of the second node # @return false if proper faces were not found - # @ingroup l2_modif_invdiag + # @ingroup l2_modif_cutquadr def InverseDiag(self, NodeID1, NodeID2): return self.editor.InverseDiag(NodeID1, NodeID2) From 77ab84920942791849f9fdbd567da6701acfca7f Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 11 Mar 2016 18:17:39 +0300 Subject: [PATCH 04/22] IPAL53097: At med export "Automatically define space dimension" does not work --- src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx | 58 +++++++++++++--------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx index 638f4ad5c..1b3c26bac 100644 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx @@ -37,6 +37,10 @@ #include "SMDS_SetIterator.hxx" #include "SMESHDS_Mesh.hxx" +#include +#include +#include + #include @@ -350,17 +354,34 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() aBounds[2] = min(aBounds[2],aNode->Y()); aBounds[3] = max(aBounds[3],aNode->Y()); - + aBounds[4] = min(aBounds[4],aNode->Z()); aBounds[5] = max(aBounds[5],aNode->Z()); } double EPS = 1.0E-7; + TopoDS_Shape mainShape = myMesh->ShapeToMesh(); + bool hasShapeToMesh = ( myMesh->SubMeshIndices().size() > 1 ); + if ( !mainShape.IsNull() && hasShapeToMesh ) + { + // define EPS by max tolerance of the mainShape (IPAL53097) + TopExp_Explorer subShape; + for ( subShape.Init( mainShape, TopAbs_FACE ); subShape.More(); subShape.Next() ) { + EPS = Max( EPS, BRep_Tool::Tolerance( TopoDS::Face( subShape.Current() ))); + } + for ( subShape.Init( mainShape, TopAbs_EDGE ); subShape.More(); subShape.Next() ) { + EPS = Max( EPS, BRep_Tool::Tolerance( TopoDS::Edge( subShape.Current() ))); + } + for ( subShape.Init( mainShape, TopAbs_VERTEX ); subShape.More(); subShape.Next() ) { + EPS = Max( EPS, BRep_Tool::Tolerance( TopoDS::Vertex( subShape.Current() ))); + } + EPS *= 2.; + } anIsXDimension = (aBounds[1] - aBounds[0]) + abs(aBounds[1]) + abs(aBounds[0]) > EPS; anIsYDimension = (aBounds[3] - aBounds[2]) + abs(aBounds[3]) + abs(aBounds[2]) > EPS; anIsZDimension = (aBounds[5] - aBounds[4]) + abs(aBounds[5]) + abs(aBounds[4]) > EPS; aSpaceDimension = anIsXDimension + anIsYDimension + anIsZDimension; - if(!aSpaceDimension) + if ( !aSpaceDimension ) aSpaceDimension = 3; // PAL16857(SMESH not conform to the MED convention): if ( aSpaceDimension == 2 && anIsZDimension ) // 2D only if mesh is in XOY plane @@ -377,7 +398,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() } SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(/*idInceasingOrder=*/true); - switch(aSpaceDimension){ + switch ( aSpaceDimension ) { case 3: aCoordHelperPtr.reset(new TCoordHelper(aNodesIter,aXYZGetCoord,aXYZName)); break; @@ -444,7 +465,8 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() myDoGroupOfVolumes && nbVolumes, myDoGroupOf0DElems && nb0DElements, myDoGroupOfBalls && nbBalls); - } else { + } + else { aFamilies = DriverMED_Family::MakeFamilies (getIterator( mySubMeshes ), myGroups, myDoGroupOfNodes && nbNodes, @@ -477,7 +499,6 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() PNodeInfo aNodeInfo = myMed->CrNodeInfo(aMeshInfo, aNbNodes, theMode, theSystem, theIsElemNum, theIsElemNames); - //cout << " fillElemFamilyMap( SMDSAbs_Node )" << endl; // find family numbers for nodes TElemFamilyMap anElemFamMap; fillElemFamilyMap( anElemFamMap, aFamilies, SMDSAbs_Node ); @@ -687,21 +708,11 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() int defaultFamilyId = 0; switch ( aElemTypeData->_smdsType ) { - case SMDSAbs_0DElement: - defaultFamilyId = my0DElementsDefaultFamilyId; - break; - case SMDSAbs_Ball: - defaultFamilyId = myBallsDefaultFamilyId; - break; - case SMDSAbs_Edge: - defaultFamilyId = myEdgesDefaultFamilyId; - break; - case SMDSAbs_Face: - defaultFamilyId = myFacesDefaultFamilyId; - break; - case SMDSAbs_Volume: - defaultFamilyId = myVolumesDefaultFamilyId; - break; + case SMDSAbs_0DElement: defaultFamilyId = my0DElementsDefaultFamilyId; break; + case SMDSAbs_Ball: defaultFamilyId = myBallsDefaultFamilyId; break; + case SMDSAbs_Edge: defaultFamilyId = myEdgesDefaultFamilyId; break; + case SMDSAbs_Face: defaultFamilyId = myFacesDefaultFamilyId; break; + case SMDSAbs_Volume: defaultFamilyId = myVolumesDefaultFamilyId; break; default: continue; } @@ -783,7 +794,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() if ( nbPolyhedronNodes == 0 ) { // Count nb of nodes while ( elemIterator->more() ) { - const SMDS_MeshElement* anElem = elemIterator->next(); + const SMDS_MeshElement* anElem = elemIterator->next(); const SMDS_VtkVolume *aPolyedre = dynamic_cast(anElem); if ( !aPolyedre ) continue; nbPolyhedronNodes += aPolyedre->NbNodes(); @@ -812,7 +823,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() TInt iFace = 0, iNode = 0; while ( elemIterator->more() ) { - const SMDS_MeshElement* anElem = elemIterator->next(); + const SMDS_MeshElement* anElem = elemIterator->next(); const SMDS_VtkVolume *aPolyedre = dynamic_cast(anElem); if ( !aPolyedre ) continue; // index @@ -854,8 +865,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() else if (aElemTypeData->_geomType == eBALL ) { // allocate data arrays - PBallInfo aBallInfo = myMed->CrBallInfo( aMeshInfo, - aElemTypeData->_nbElems ); + PBallInfo aBallInfo = myMed->CrBallInfo( aMeshInfo, aElemTypeData->_nbElems ); // build map of family numbers for this type if ( !isElemFamMapBuilt[ aElemTypeData->_smdsType ]) From d45cd9ae88f00b0d4cc3e6746c32a8c16f2fcc71 Mon Sep 17 00:00:00 2001 From: eap Date: Tue, 15 Mar 2016 15:59:11 +0300 Subject: [PATCH 05/22] 53057: NETGEN-1D2D3D issues "Ignored" warning for faces of a sub-mesh This case also reveals the following bugs: 1) SMESH_MesherHelper::IsReversedSubMesh() incorrectly works on a coarsely meshed disk 2) Addition of NETGEN-1D2D3D removes already computed faces of a sub-mesh on a group of FACEs (SMESH_subMesh::cleanDependsOn()) 3) Volumes are shown, instead of faces, when displaying a sub-mesh on a SOLID with only a 2D algo assigned to the sub-mesh (SMESH_subMesh_i.cxx) --- src/SMESH/SMESH_MesherHelper.cxx | 4 ++++ src/SMESH/SMESH_subMesh.cxx | 17 +++++++-------- src/SMESH_I/SMESH_subMesh_i.cxx | 37 +++++++++++++++++++++----------- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/SMESH/SMESH_MesherHelper.cxx b/src/SMESH/SMESH_MesherHelper.cxx index 3703a7215..40016a488 100644 --- a/src/SMESH/SMESH_MesherHelper.cxx +++ b/src/SMESH/SMESH_MesherHelper.cxx @@ -2904,6 +2904,10 @@ bool SMESH_MesherHelper::IsReversedSubMesh (const TopoDS_Face& theFace) bool ok = true; double u0 = GetNodeU( TopoDS::Edge( E ), nn[0], nn[1], &ok ); double u1 = GetNodeU( TopoDS::Edge( E ), nn[1], nn[0], &ok ); + // check that the 2 nodes are connected with a segment (IPAL53055) + // if ( SMESHDS_SubMesh* sm = GetMeshDS()->MeshElements( E )) + // if ( sm->NbElements() > 0 && !GetMeshDS()->FindEdge( nn[0], nn[1] )) + // ok = false; if ( ok ) { isReversed = ( u0 > u1 ); diff --git a/src/SMESH/SMESH_subMesh.cxx b/src/SMESH/SMESH_subMesh.cxx index 38a445708..f395b7986 100644 --- a/src/SMESH/SMESH_subMesh.cxx +++ b/src/SMESH/SMESH_subMesh.cxx @@ -1217,8 +1217,6 @@ void SMESH_subMesh::cleanDependsOn( SMESH_Algo* algoRequiringCleaning/*=0*/ ) } else if ( algoRequiringCleaning && algoRequiringCleaning->SupportSubmeshes() ) { - SMESHDS_Mesh* meshDS = _father->GetMeshDS(); - // find sub-meshes to keep elements on set< SMESH_subMesh* > smToKeep; TopAbs_ShapeEnum prevShapeType = TopAbs_SHAPE; @@ -1242,13 +1240,14 @@ void SMESH_subMesh::cleanDependsOn( SMESH_Algo* algoRequiringCleaning/*=0*/ ) } if ( !keepSubMeshes ) { - // look for an algo assigned to sm - bool algoFound = false; - const list& hyps = meshDS->GetHypothesis( sm->_subShape ); - list::const_iterator h = hyps.begin(); - for ( ; ( !algoFound && h != hyps.end() ); ++h ) - algoFound = ((*h)->GetType() != SMESHDS_Hypothesis::PARAM_ALGO ); - keepSubMeshes = algoFound; + // look for a local algo used to mesh sm + TopoDS_Shape algoShape = SMESH_MesherHelper::GetShapeOfHypothesis + ( algoRequiringCleaning, _subShape, _father ); + SMESH_HypoFilter moreLocalAlgo; + moreLocalAlgo.Init( SMESH_HypoFilter::IsMoreLocalThan( algoShape, *_father )); + moreLocalAlgo.And ( SMESH_HypoFilter::IsAlgo() ); + bool localAlgoFound = _father->GetHypothesis( sm->_subShape, moreLocalAlgo, true ); + keepSubMeshes = localAlgoFound; } // remember all sub-meshes of sm if ( keepSubMeshes ) diff --git a/src/SMESH_I/SMESH_subMesh_i.cxx b/src/SMESH_I/SMESH_subMesh_i.cxx index ee9117e2c..bc0fa18c8 100644 --- a/src/SMESH_I/SMESH_subMesh_i.cxx +++ b/src/SMESH_I/SMESH_subMesh_i.cxx @@ -107,9 +107,10 @@ bool getSubMeshes(::SMESH_subMesh* theSubMesh, TopAbs_ShapeEnum aShapeType = aShape.ShapeType(); // IPAL18558: Wrong information of the created sub-mesh is shown. (Sub-mesh on a FACE - // with only 1D algo assigned + // with only 1D algo assigned) // Find dimension of sub-meshes to return as highest dimension of the assigned algorithm - if ( theSubMesh->IsEmpty() && !theSubMesh->GetAlgo() ) + if (( theSubMesh->IsEmpty() || ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() )) && + ( !theSubMesh->GetAlgo() )) { // on father sub-meshes, check presence of an algo which will mesh this sub-mesh // even if no algo is assigned to this sub-mesh @@ -121,20 +122,22 @@ bool getSubMeshes(::SMESH_subMesh* theSubMesh, if ( !topAlgoPresent ) { - // look for a sub-mesh with an algo - SMESH_subMeshIteratorPtr smIt = - theSubMesh->getDependsOnIterator(/*includeSelf=*/false, /*complexShapeFirst=*/true); + // find max dimension of an assigned algo TopAbs_ShapeEnum algoShape = TopAbs_SHAPE; - while ( smIt->more() && algoShape == TopAbs_SHAPE ) - { - sm = smIt->next(); - if ( sm->GetAlgo() ) - algoShape = sm->GetSubShape().ShapeType(); - } + const std::list & hyps = aMesh->GetHypothesisList( aShape ); + std::list ::const_iterator hypIt = hyps.begin(); + for ( ; hypIt != hyps.end(); ++hypIt ) + if ( const SMESH_Algo* algo = dynamic_cast< const SMESH_Algo* >( *hypIt )) + switch ( algo->GetDim() ) { + case 1: algoShape = TopAbs_EDGE; break; + case 2: algoShape = TopAbs_FACE; break; + case 3: algoShape = TopAbs_SOLID; break; + case 0: algoShape = TopAbs_VERTEX; break; + } if ( algoShape != TopAbs_SHAPE ) { - // return all sub-meshes on this shape type - smIt = theSubMesh->getDependsOnIterator(/*includeSelf=*/false, /*complexShapeFirst=*/true); + // return all sub-meshes on this dimension + SMESH_subMeshIteratorPtr smIt = theSubMesh->getDependsOnIterator(/*includeSelf=*/false); while ( smIt->more() ) { sm = smIt->next(); @@ -209,6 +212,8 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfElements() ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); + if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) + aSubMeshDS = 0; int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; @@ -244,6 +249,8 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfNodes(CORBA::Boolean all) } ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); + if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) + aSubMeshDS = 0; if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) { @@ -292,6 +299,8 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsId() ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); + if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) + aSubMeshDS = 0; int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; TListOfSubMeshes smList; @@ -342,6 +351,8 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theEle ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); + if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) + aSubMeshDS = 0; // PAL5440, return all nodes belonging to elements of submesh set nodeIds; From 14497e96c0a3538b6b4cc706dc303b3234f2e822 Mon Sep 17 00:00:00 2001 From: eap Date: Tue, 15 Mar 2016 17:14:26 +0300 Subject: [PATCH 06/22] IPAL0053055: Import-1D2D algorithm fails --- src/SMESH/SMESH_MesherHelper.cxx | 6 +++--- src/StdMeshers/StdMeshers_Import_1D2D.cxx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SMESH/SMESH_MesherHelper.cxx b/src/SMESH/SMESH_MesherHelper.cxx index 40016a488..043c0b71b 100644 --- a/src/SMESH/SMESH_MesherHelper.cxx +++ b/src/SMESH/SMESH_MesherHelper.cxx @@ -2905,9 +2905,9 @@ bool SMESH_MesherHelper::IsReversedSubMesh (const TopoDS_Face& theFace) double u0 = GetNodeU( TopoDS::Edge( E ), nn[0], nn[1], &ok ); double u1 = GetNodeU( TopoDS::Edge( E ), nn[1], nn[0], &ok ); // check that the 2 nodes are connected with a segment (IPAL53055) - // if ( SMESHDS_SubMesh* sm = GetMeshDS()->MeshElements( E )) - // if ( sm->NbElements() > 0 && !GetMeshDS()->FindEdge( nn[0], nn[1] )) - // ok = false; + if ( SMESHDS_SubMesh* sm = GetMeshDS()->MeshElements( E )) + if ( sm->NbElements() > 0 && !GetMeshDS()->FindEdge( nn[0], nn[1] )) + ok = false; if ( ok ) { isReversed = ( u0 > u1 ); diff --git a/src/StdMeshers/StdMeshers_Import_1D2D.cxx b/src/StdMeshers/StdMeshers_Import_1D2D.cxx index df7f8c065..8b0318391 100644 --- a/src/StdMeshers/StdMeshers_Import_1D2D.cxx +++ b/src/StdMeshers/StdMeshers_Import_1D2D.cxx @@ -219,7 +219,7 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & bndBox2d.Enlarge( 1e-2 * Sqrt( bndBox2d.SquareExtent() )); BRepBndLib::Add( geomFace, bndBox3d ); - bndBox3d.Enlarge( 1e-5 * sqrt( bndBox3d.SquareExtent() )); + bndBox3d.Enlarge( 1e-2 * sqrt( bndBox3d.SquareExtent() )); } set subShapeIDs; From 14534b55573063b254a2c3a6108bb2e0ca85b9fd Mon Sep 17 00:00:00 2001 From: eap Date: Tue, 15 Mar 2016 18:52:11 +0300 Subject: [PATCH 07/22] IPAL53053: Mesh compute with 3D Extrusion algo crashes SALOME --- src/StdMeshers/StdMeshers_Prism_3D.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/StdMeshers/StdMeshers_Prism_3D.cxx b/src/StdMeshers/StdMeshers_Prism_3D.cxx index 225da4650..d2413b564 100644 --- a/src/StdMeshers/StdMeshers_Prism_3D.cxx +++ b/src/StdMeshers/StdMeshers_Prism_3D.cxx @@ -3298,6 +3298,9 @@ bool StdMeshers_PrismAsBlock::Init(SMESH_MesherHelper* helper, if ( !myHelper->LoadNodeColumns( faceColumns, (*quad)->face, quadBot, meshDS )) return error(COMPERR_BAD_INPUT_MESH, TCom("Can't find regular quadrangle mesh ") << "on a side face #" << MeshDS()->ShapeToIndex( (*quad)->face )); + + if ( !faceColumns.empty() && (int)faceColumns.begin()->second.size() != VerticalSize() ) + return error(COMPERR_BAD_INPUT_MESH, "Different 'vertical' discretization"); } // edge columns int id = MeshDS()->ShapeToIndex( *edgeIt ); From a695ce3aeecb27a023e248ccb9433d62916308cd Mon Sep 17 00:00:00 2001 From: eap Date: Wed, 16 Mar 2016 19:59:08 +0300 Subject: [PATCH 08/22] IPAL53051: 3D Extrusion fails + minor doc modifs --- doc/salome/examples/creating_meshes_ex02.py | 26 +++++++++------- doc/salome/examples/creating_meshes_ex03.py | 29 ++++++++---------- .../gui/SMESH/images/prism_needs_hyps.png | Bin 19373 -> 33626 bytes doc/salome/gui/SMESH/input/prism_3d_algo.doc | 9 +++--- doc/salome/gui/SMESH/input/quad_ijk_algo.doc | 4 +-- src/StdMeshers/StdMeshers_Prism_3D.cxx | 2 +- src/StdMeshers/StdMeshers_ProjectionUtils.cxx | 4 +-- src/StdMeshers/StdMeshers_Projection_2D.cxx | 19 +++++++++--- 8 files changed, 52 insertions(+), 41 deletions(-) diff --git a/doc/salome/examples/creating_meshes_ex02.py b/doc/salome/examples/creating_meshes_ex02.py index fe9f72f08..3980d4d74 100644 --- a/doc/salome/examples/creating_meshes_ex02.py +++ b/doc/salome/examples/creating_meshes_ex02.py @@ -1,4 +1,4 @@ -# Construction of a Submesh +# Construction of a Sub-mesh import salome salome.salome_init() @@ -20,27 +20,31 @@ EdgeX = geompy.GetEdgeNearPoint(box, p5) geompy.addToStudyInFather(box, EdgeX, "Edge [0,0,0 - 10,0,0]") # create a hexahedral mesh on the box -quadra = smesh.Mesh(box, "Box : quadrangle 2D mesh") +mesh = smesh.Mesh(box, "Box : hexahedral 3D mesh") -# create a regular 1D algorithm for the faces -algo1D = quadra.Segment() +# create a Regular_1D algorithm for discretization of edges +algo1D = mesh.Segment() # define "NumberOfSegments" hypothesis to cut # all the edges in a fixed number of segments algo1D.NumberOfSegments(4) # create a quadrangle 2D algorithm for the faces -quadra.Quadrangle() +mesh.Quadrangle() -# construct a submesh on the edge with a local hypothesis -algo_local = quadra.Segment(EdgeX) +# construct a sub-mesh on the edge with a local Regular_1D algorithm +algo_local = mesh.Segment(EdgeX) -# define "Arithmetic1D" hypothesis to cut the edge in several segments with increasing arithmetic length +# define "Arithmetic1D" hypothesis to cut EdgeX in several segments with length arithmetically +# increasing from 1.0 to 4.0 algo_local.Arithmetic1D(1, 4) -# define "Propagation" hypothesis that propagates all other hypotheses -# on all edges of the opposite side in case of quadrangular faces +# define "Propagation" hypothesis that propagates algo_local and "Arithmetic1D" hypothesis +# on all parallel edges of the box algo_local.Propagation() +# assign a hexahedral algorithm +mesh.Hexahedron() + # compute the mesh -quadra.Compute() +mesh.Compute() diff --git a/doc/salome/examples/creating_meshes_ex03.py b/doc/salome/examples/creating_meshes_ex03.py index 7cf85b786..8687b8971 100644 --- a/doc/salome/examples/creating_meshes_ex03.py +++ b/doc/salome/examples/creating_meshes_ex03.py @@ -1,4 +1,4 @@ -# Change priority of submeshes in Mesh +# Change priority of sub-meshes in Mesh import salome salome.salome_init() @@ -16,47 +16,44 @@ Box_1 = geompy.MakeBoxDXDYDZ(200, 200, 200) # create Mesh object on Box shape Mesh_1 = smesh.Mesh(Box_1) -# assign mesh algorithms +# assign mesh algorithms and hypotheses Regular_1D = Mesh_1.Segment() Nb_Segments_1 = Regular_1D.NumberOfSegments(20) -Nb_Segments_1.SetDistrType( 0 ) MEFISTO_2D = Mesh_1.Triangle() Max_Element_Area_1 = MEFISTO_2D.MaxElementArea(1200) Tetrahedron = Mesh_1.Tetrahedron() Max_Element_Volume_1 = Tetrahedron.MaxElementVolume(40000) -# create submesh and assign algorithms on Face_1 +# create sub-mesh and assign algorithms on Face_1 Regular_1D_1 = Mesh_1.Segment(geom=Face_1) Nb_Segments_2 = Regular_1D_1.NumberOfSegments(4) -Nb_Segments_2.SetDistrType( 0 ) MEFISTO_2D_1 = Mesh_1.Triangle(algo=smeshBuilder.MEFISTO,geom=Face_1) -Length_From_Edges_2D = MEFISTO_2D_1.LengthFromEdges() SubMesh_1 = MEFISTO_2D_1.GetSubMesh() -# create submesh and assign algorithms on Face_2 +# create sub-mesh and assign algorithms on Face_2 Regular_1D_2 = Mesh_1.Segment(geom=Face_2) Nb_Segments_3 = Regular_1D_2.NumberOfSegments(8) -Nb_Segments_3.SetDistrType( 0 ) MEFISTO_2D_2 = Mesh_1.Triangle(algo=smeshBuilder.MEFISTO,geom=Face_2) -Length_From_Edges_2D_1 = MEFISTO_2D_2.LengthFromEdges() SubMesh_2 = MEFISTO_2D_2.GetSubMesh() -# create submesh and assign algorithms on Face_3 +# create sub-mesh and assign algorithms on Face_3 Regular_1D_3 = Mesh_1.Segment(geom=Face_3) Nb_Segments_4 = Regular_1D_3.NumberOfSegments(12) -Nb_Segments_4.SetDistrType( 0 ) MEFISTO_2D_3 = Mesh_1.Triangle(algo=smeshBuilder.MEFISTO,geom=Face_3) -Length_From_Edges_2D_2 = MEFISTO_2D_3.LengthFromEdges() SubMesh_3 = MEFISTO_2D_3.GetSubMesh() -# check exisiting submesh priority order +# check exisiting sub-mesh priority order [ [ SubMesh_1, SubMesh_3, SubMesh_2 ] ] = Mesh_1.GetMeshOrder() -# set new submesh order +isDone = Mesh_1.Compute() +print "Nb elements at initial order of sub-meshes:", Mesh_1.NbElements() + +# set new sub-mesh order isDone = Mesh_1.SetMeshOrder( [ [ SubMesh_1, SubMesh_2, SubMesh_3 ] ]) # compute mesh isDone = Mesh_1.Compute() +print "Nb elements at new order of sub-meshes:", Mesh_1.NbElements() -# clear mesh result and compute with other submesh order -Mesh_1.Clear() +# compute with other sub-mesh order isDone = Mesh_1.SetMeshOrder( [ [ SubMesh_2, SubMesh_1, SubMesh_3 ] ]) isDone = Mesh_1.Compute() +print "Nb elements at another order of sub-meshes:", Mesh_1.NbElements() diff --git a/doc/salome/gui/SMESH/images/prism_needs_hyps.png b/doc/salome/gui/SMESH/images/prism_needs_hyps.png index 8c567809df180b98afe8c1ebf95f78bfffd5b275..d56d4309994ece8cc91152d868f6b85e47898f55 100644 GIT binary patch literal 33626 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�@|1ZT&1G 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 E00ZOiUjP6A literal 19373 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 1D algorithm and hypothesis that will be applied for meshing (logically) vertical edges of the prism (which connect the top and the base faces of the prism). In the sample picture above these are - "Regular_1D" algorithm and "Nb. Segments_1" hypothesis. + "Regular_1D" algorithm and "Nb. Segments" hypothesis named "Vertical + Nb. Segments". The \b Local algorithms and hypotheses to be chosen at @@ -51,9 +52,9 @@ The \b Local algorithms and hypotheses to be chosen at meshing the top and the base prism faces. These faces can be meshed with any type of 2D elements: quadrangles, triangles, polygons or their mix. It is enough to define a sub-mesh on either the top or the base - face. In the sample picture above, "BLSURF" algorithm meshes - "Face_1" base surface with triangles. (1D algorithm is not - assigned as "BLSURF" does not require divided edges to create a 2D mesh.) + face. In the sample picture above, "NETGEN_1D2D" algorithm meshes + "bottom disk" face with triangles. (1D algorithm is not + assigned as "NETGEN_1D2D" does not require divided edges to create a 2D mesh.)
  • Optionally you can define a 1D sub-mesh on some vertical edges of stacked prisms, which will override the global 1D hypothesis mentioned diff --git a/doc/salome/gui/SMESH/input/quad_ijk_algo.doc b/doc/salome/gui/SMESH/input/quad_ijk_algo.doc index 1ba49dd83..90e7eea94 100644 --- a/doc/salome/gui/SMESH/input/quad_ijk_algo.doc +++ b/doc/salome/gui/SMESH/input/quad_ijk_algo.doc @@ -20,8 +20,8 @@ The algorithm treats any face as quadrangle. If a face is bound by more than four edges, four most sharp vertices are considered as corners of the quadrangle and all edges between these vertices are treated as quadrangle sides. In the case of three edges, the vertex -specified by the user is considered as a degenerated side of the -quadrangle. +specified by the user is considered as a fourth degenerated side of the +quadrangle. \image html quad_meshes.png "Algorithm generates a structured mesh on complex faces provided that edges are properly discretized" diff --git a/src/StdMeshers/StdMeshers_Prism_3D.cxx b/src/StdMeshers/StdMeshers_Prism_3D.cxx index d2413b564..5c0a5af0f 100644 --- a/src/StdMeshers/StdMeshers_Prism_3D.cxx +++ b/src/StdMeshers/StdMeshers_Prism_3D.cxx @@ -1330,7 +1330,7 @@ bool StdMeshers_Prism_3D::compute(const Prism_3D::TPrismTopo& thePrism) // update state of sub-meshes (mostly in order to erase improper errors) SMESH_subMesh* sm = myHelper->GetMesh()->GetSubMesh( thePrism.myShape3D ); - SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(/*includeSelf=*/false); + SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(/*includeSelf=*/true); while ( smIt->more() ) { sm = smIt->next(); diff --git a/src/StdMeshers/StdMeshers_ProjectionUtils.cxx b/src/StdMeshers/StdMeshers_ProjectionUtils.cxx index 51a639869..06aa33a57 100644 --- a/src/StdMeshers/StdMeshers_ProjectionUtils.cxx +++ b/src/StdMeshers/StdMeshers_ProjectionUtils.cxx @@ -1868,7 +1868,7 @@ StdMeshers_ProjectionUtils::GetPropagationEdge( SMESH_Mesh* aMes int prevChainSize = aChain.Extent(); if ( aChain.Add(anOppE) > prevChainSize ) { // ... anOppE is not in aChain // Add found edge to the chain oriented so that to - // have it co-directed with a forward MainEdge + // have it co-directed with a fromEdge TopAbs_Orientation ori = anE.Orientation(); if ( anOppE.Orientation() == fourEdges[found].Orientation() ) ori = TopAbs::Reverse( ori ); @@ -1931,7 +1931,7 @@ FindMatchingNodesOnFaces( const TopoDS_Face& face1, helper1.SetSubShape( face1 ); helper2.SetSubShape( face2 ); - if ( helper1.HasSeam() != helper2.HasSeam() ) + if ( helper1.HasRealSeam() != helper2.HasRealSeam() ) RETURN_BAD_RESULT("Different faces' geometry"); // Data to call SMESH_MeshEditor::FindMatchingNodes(): diff --git a/src/StdMeshers/StdMeshers_Projection_2D.cxx b/src/StdMeshers/StdMeshers_Projection_2D.cxx index 66c893628..648510c94 100644 --- a/src/StdMeshers/StdMeshers_Projection_2D.cxx +++ b/src/StdMeshers/StdMeshers_Projection_2D.cxx @@ -821,8 +821,8 @@ namespace { // find trsf const int totNbSeg = 50; vector< gp_XY > srcPnts, tgtPnts; - srcPnts.resize( totNbSeg ); - tgtPnts.resize( totNbSeg ); + srcPnts.reserve( totNbSeg ); + tgtPnts.reserve( totNbSeg ); for ( size_t iW = 0; iW < srcWires.size(); ++iW ) { const double minSegLen = srcWires[iW]->Length() / totNbSeg; @@ -1392,10 +1392,19 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& } } } - else if ( nbEdgesInWires.front() == 1 ) + else if ( nbEdgesInWires.front() == 1 ) // a sole edge in a wire { - // TODO::Compare orientation of curves in a sole edge - //RETURN_BAD_RESULT("Not implemented case"); + TopoDS_Edge srcE1 = srcEdges.front(), tgtE1 = tgtEdges.front(); + for ( size_t iW = 0; iW < srcWires.size(); ++iW ) + { + StdMeshers_FaceSidePtr srcWire = srcWires[iW]; + for ( int iE = 0; iE < srcWire->NbEdges(); ++iE ) + if ( srcE1.IsSame( srcWire->Edge( iE ))) + { + reverse = ( tgtE1.Orientation() != tgtWires[iW]->Edge( iE ).Orientation() ); + break; + } + } } else { From a6bce4dabaa3e22cf4417358e150755e4dbb4d2a Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 17 Mar 2016 15:30:10 +0300 Subject: [PATCH 09/22] Fix regression of SALOME_TESTS/Grids/smesh/3D_submesh_00/A6 Fix SMESH_subMesh::cleanDependsOn() + minor improvements in SMESH_submesh and sample scripts --- doc/salome/examples/creating_meshes_ex04.py | 3 +-- doc/salome/examples/creating_meshes_ex06.py | 5 ++++- src/SMESH/SMESH_Mesh.cxx | 8 ++++---- src/SMESH/SMESH_subMesh.cxx | 16 +++++++++------- src/SMESH/SMESH_subMesh.hxx | 8 ++++---- src/SMESHDS/SMESHDS_Mesh.cxx | 2 +- .../StdMeshers_QuadFromMedialAxis_1D2D.cxx | 2 +- 7 files changed, 24 insertions(+), 20 deletions(-) diff --git a/doc/salome/examples/creating_meshes_ex04.py b/doc/salome/examples/creating_meshes_ex04.py index f2cdfdb87..82408d5a3 100644 --- a/doc/salome/examples/creating_meshes_ex04.py +++ b/doc/salome/examples/creating_meshes_ex04.py @@ -46,8 +46,7 @@ tria.Compute() PrintMeshInfo(tria) # remove a local hypothesis -mesh = tria.GetMesh() -mesh.RemoveHypothesis(edge, hyp4) +tria.RemoveHypothesis(hyp4, edge) # compute the mesh tria.Compute() diff --git a/doc/salome/examples/creating_meshes_ex06.py b/doc/salome/examples/creating_meshes_ex06.py index d16e067d3..8e52da6be 100644 --- a/doc/salome/examples/creating_meshes_ex06.py +++ b/doc/salome/examples/creating_meshes_ex06.py @@ -1,5 +1,8 @@ # Creating a hexahedral mesh on a cylinder. -# Note: it is a copy of 'ex24_cylinder.py' from SMESH_SWIG +# +# This example uses Partition to divide the cylinder into blocks, which is +# a general approach. But for the case of cylinder there is a dedicated +# command creating a blocked cylinder: geompy.MakeDividedCylinder() import salome salome.salome_init() diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index ecc7888e7..467fdd6a3 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -679,8 +679,8 @@ SMESH_Mesh::AddHypothesis(const TopoDS_Shape & aSubShape, // shape - bool isAlgo = ( anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO ); - int event = isAlgo ? SMESH_subMesh::ADD_ALGO : SMESH_subMesh::ADD_HYP; + bool isAlgo = ( anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO ); + SMESH_subMesh::algo_event event = isAlgo ? SMESH_subMesh::ADD_ALGO : SMESH_subMesh::ADD_HYP; SMESH_Hypothesis::Hypothesis_Status ret = subMesh->AlgoStateEngine(event, anHyp); @@ -755,8 +755,8 @@ SMESH_Hypothesis::Hypothesis_Status // shape - bool isAlgo = ( !anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO ); - int event = isAlgo ? SMESH_subMesh::REMOVE_ALGO : SMESH_subMesh::REMOVE_HYP; + bool isAlgo = ( !anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO ); + SMESH_subMesh::algo_event event = isAlgo ? SMESH_subMesh::REMOVE_ALGO : SMESH_subMesh::REMOVE_HYP; SMESH_subMesh *subMesh = GetSubMesh(aSubShape); diff --git a/src/SMESH/SMESH_subMesh.cxx b/src/SMESH/SMESH_subMesh.cxx index f395b7986..ed0826782 100644 --- a/src/SMESH/SMESH_subMesh.cxx +++ b/src/SMESH/SMESH_subMesh.cxx @@ -609,7 +609,7 @@ bool SMESH_subMesh::IsApplicableHypotesis(const SMESH_Hypothesis* theHypothesis, //================================================================================ SMESH_Hypothesis::Hypothesis_Status - SMESH_subMesh::AlgoStateEngine(int event, SMESH_Hypothesis * anHyp) + SMESH_subMesh::AlgoStateEngine(algo_event event, SMESH_Hypothesis * anHyp) { // **** les retour des evenement shape sont significatifs // (add ou remove fait ou non) @@ -1167,7 +1167,7 @@ void SMESH_subMesh::setAlgoState(algo_state state) //================================================================================ SMESH_Hypothesis::Hypothesis_Status - SMESH_subMesh::SubMeshesAlgoStateEngine(int event, + SMESH_subMesh::SubMeshesAlgoStateEngine(algo_event event, SMESH_Hypothesis * anHyp, bool exitOnFatal) { @@ -1232,9 +1232,11 @@ void SMESH_subMesh::cleanDependsOn( SMESH_Algo* algoRequiringCleaning/*=0*/ ) if ( !sameShapeType ) { // check if the algo allows presence of global algos of dimension the algo - // can generate it-self + // can generate it-self; + // always keep a node on VERTEX, as this node can be shared by segments + // lying on EDGEs not shared by the VERTEX of sm, due to MergeNodes (PAL23068) int shapeDim = SMESH_Gen::GetShapeDim( sm->GetSubShape() ); - keepSubMeshes = algoRequiringCleaning->NeedLowerHyps( shapeDim ); + keepSubMeshes = ( algoRequiringCleaning->NeedLowerHyps( shapeDim ) || shapeDim == 0 ); prevShapeType = sm->GetSubShape().ShapeType(); toKeepPrevShapeType = keepSubMeshes; } @@ -1345,7 +1347,7 @@ static void cleanSubMesh( SMESH_subMesh * subMesh ) */ //============================================================================= -bool SMESH_subMesh::ComputeStateEngine(int event) +bool SMESH_subMesh::ComputeStateEngine(compute_event event) { switch ( event ) { case MODIF_ALGO_STATE: @@ -1982,7 +1984,7 @@ void SMESH_subMesh::updateSubMeshState(const compute_state theState) //purpose : //======================================================================= -void SMESH_subMesh::ComputeSubMeshStateEngine(int event, const bool includeSelf) +void SMESH_subMesh::ComputeSubMeshStateEngine(compute_event event, const bool includeSelf) { SMESH_subMeshIteratorPtr smIt = getDependsOnIterator(includeSelf,false); while ( smIt->more() ) @@ -2453,7 +2455,7 @@ void SMESH_subMeshEventListener::ProcessEvent(const int event, switch ( event ) { case SMESH_subMesh::CLEAN: for ( ; smIt != smEnd; ++ smIt) - (*smIt)->ComputeStateEngine( event ); + (*smIt)->ComputeStateEngine( SMESH_subMesh::compute_event( event )); break; case SMESH_subMesh::COMPUTE: case SMESH_subMesh::COMPUTE_SUBMESH: diff --git a/src/SMESH/SMESH_subMesh.hxx b/src/SMESH/SMESH_subMesh.hxx index 8f9f83c2c..f00841373 100644 --- a/src/SMESH/SMESH_subMesh.hxx +++ b/src/SMESH/SMESH_subMesh.hxx @@ -216,10 +216,10 @@ protected: public: SMESH_Hypothesis::Hypothesis_Status - AlgoStateEngine(int event, SMESH_Hypothesis * anHyp); + AlgoStateEngine(algo_event event, SMESH_Hypothesis * anHyp); SMESH_Hypothesis::Hypothesis_Status - SubMeshesAlgoStateEngine(int event, SMESH_Hypothesis * anHyp, bool exitOnFatal=false); + SubMeshesAlgoStateEngine(algo_event event, SMESH_Hypothesis * anHyp, bool exitOnFatal=false); algo_state GetAlgoState() const { return _algoState; } compute_state GetComputeState() const { return _computeState; } @@ -227,8 +227,8 @@ public: void DumpAlgoState(bool isMain); - bool ComputeStateEngine(int event); - void ComputeSubMeshStateEngine(int event, const bool includeSelf=false); + bool ComputeStateEngine(compute_event event); + void ComputeSubMeshStateEngine(compute_event event, const bool includeSelf=false); bool Evaluate(MapShapeNbElems& aResMap); diff --git a/src/SMESHDS/SMESHDS_Mesh.cxx b/src/SMESHDS/SMESHDS_Mesh.cxx index ba7d59f37..0283b6b74 100644 --- a/src/SMESHDS/SMESHDS_Mesh.cxx +++ b/src/SMESHDS/SMESHDS_Mesh.cxx @@ -980,7 +980,7 @@ void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt, { //MESSAGE(" --------------------------------> SMESHDS_Mesh::RemoveFreeElement " << subMesh << " " << fromGroups); if (elt->GetType() == SMDSAbs_Node) { - RemoveFreeNode( static_cast(elt), subMesh); + RemoveFreeNode( static_cast(elt), subMesh, fromGroups); return; } diff --git a/src/StdMeshers/StdMeshers_QuadFromMedialAxis_1D2D.cxx b/src/StdMeshers/StdMeshers_QuadFromMedialAxis_1D2D.cxx index acd202846..58d179c55 100644 --- a/src/StdMeshers/StdMeshers_QuadFromMedialAxis_1D2D.cxx +++ b/src/StdMeshers/StdMeshers_QuadFromMedialAxis_1D2D.cxx @@ -554,7 +554,7 @@ namespace return false; for ( size_t iS = 0; iS < theShortEdges[ nbBranchPoints > 0 ].size(); ++iS ) - shortMap.Add( theShortEdges[ nbBranchPoints ][ iS ]); + shortMap.Add( theShortEdges[ nbBranchPoints > 0 ][ iS ]); ++nbBranchPoints; } From 1a82677a356073e12ab45362dcc473b4ddcdc278 Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 17 Mar 2016 19:21:24 +0300 Subject: [PATCH 10/22] 52977: Find Element by Point does not find supporting node of Ball element at group of balls selection + minor changes in sample scripts --- doc/salome/examples/creating_meshes_ex06.py | 27 ++++++++++----------- doc/salome/examples/creating_meshes_ex08.py | 4 +-- src/SMESH_I/SMESH_MeshEditor_i.cxx | 17 +++++++------ 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/doc/salome/examples/creating_meshes_ex06.py b/doc/salome/examples/creating_meshes_ex06.py index 8e52da6be..90fe2765e 100644 --- a/doc/salome/examples/creating_meshes_ex06.py +++ b/doc/salome/examples/creating_meshes_ex06.py @@ -25,7 +25,7 @@ height = 200 # Build a cylinder # ---------------- -base = geompy.MakeVertex(0, 0, 0) +base = geompy.MakeVertex(0, 0, 0) direction = geompy.MakeVectorDXDYDZ(0, 0, 1) cylinder = geompy.MakeCylinder(base, direction, radius, height) @@ -37,9 +37,9 @@ geompy.addToStudy(cylinder, "cylinder") size = radius/2.0 -box_rot = geompy.MakeBox(-size, -size, 0, +size, +size, height) +box_rot = geompy.MakeBox(-size, -size, 0, +size, +size, height) box_axis = geompy.MakeLine(base, direction) -box = geompy.MakeRotation(box_rot, box_axis, math.pi/4) +box = geompy.MakeRotation(box_rot, box_axis, math.pi/4) hole = geompy.MakeCut(cylinder, box) @@ -50,8 +50,8 @@ plane_b = geompy.MakePlane(base, geompy.MakeVectorDXDYDZ(0, 1, 0), plane_trim) blocks_part = geompy.MakePartition([hole], [plane_a, plane_b], [], [], geompy.ShapeType["SOLID"]) blocks_list = [box] + geompy.SubShapeAll(blocks_part, geompy.ShapeType["SOLID"]) -blocks_all = geompy.MakeCompound(blocks_list) -blocks = geompy.MakeGlueFaces(blocks_all, 0.0001) +blocks_all = geompy.MakeCompound(blocks_list) +blocks = geompy.MakeGlueFaces(blocks_all, 0.0001) geompy.addToStudy(blocks, "cylinder:blocks") @@ -62,8 +62,7 @@ def group(name, shape, type, base=None, direction=None): t = geompy.ShapeType[type] g = geompy.CreateGroup(shape, t) - geompy.addToStudy(g, name) - g.SetName(name) + geompy.addToStudyInFather(shape, g, name) if base!=None: l = geompy.GetShapesOnPlaneWithLocationIDs(shape, t, direction, base, GEOM.ST_ON) @@ -76,7 +75,7 @@ group_a = group("baseA", blocks, "FACE", base, direction) base_b = geompy.MakeVertex(0, 0, height) group_b = group("baseB", blocks, "FACE", base_b, direction) -group_1 = group("limit", blocks, "SOLID") +group_1 = group("limit", blocks, "SOLID") group_1_all = geompy.SubShapeAllIDs(blocks, geompy.ShapeType["SOLID"]) geompy.UnionIDs(group_1, group_1_all) group_1_box = geompy.GetBlockNearPoint(blocks, base) @@ -87,12 +86,12 @@ geompy.DifferenceList(group_1, [group_1_box]) smesh.SetCurrentStudy(salome.myStudy) -def discretize(x, y, z, n, s=blocks): - p = geompy.MakeVertex(x, y, z) - e = geompy.GetEdgeNearPoint(s, p) - a = hexa.Segment(e) - a.NumberOfSegments(n) - a.Propagation() +def discretize(x, y, z, nbSeg, shape=blocks): + vert = geompy.MakeVertex( x, y, z ) + edge = geompy.GetEdgeNearPoint( shape, vert ) + algo = hexa.Segment( edge ) + algo.NumberOfSegments( nbSeg ) + algo.Propagation() hexa = smesh.Mesh(blocks) diff --git a/doc/salome/examples/creating_meshes_ex08.py b/doc/salome/examples/creating_meshes_ex08.py index e8f43eee6..0cb4b229f 100644 --- a/doc/salome/examples/creating_meshes_ex08.py +++ b/doc/salome/examples/creating_meshes_ex08.py @@ -14,7 +14,7 @@ smesh = smeshBuilder.New(salome.myStudy) box = geompy.MakeBoxDXDYDZ(100,100,100) face = geompy.SubShapeAllSorted(box, geompy.ShapeType["FACE"])[0] -# generate 3D mesh +# generate a prismatic 3D mesh mesh = smesh.Mesh(box) localAlgo = mesh.Triangle(face) mesh.AutomaticHexahedralization() @@ -44,4 +44,4 @@ nodeIds = nGroup.GetIDs()[-10:] newMesh = smesh.CopyMesh( mesh.GetIDSource( nodeIds, SMESH.NODE), "some nodes copy") # 6. copy a sub-mesh -newMesh = smesh.CopyMesh( subMesh, "submesh copy" ) +newMesh = smesh.CopyMesh( subMesh, "sub-mesh copy" ) diff --git a/src/SMESH_I/SMESH_MeshEditor_i.cxx b/src/SMESH_I/SMESH_MeshEditor_i.cxx index 76a5d6d16..52cb45765 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.cxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.cxx @@ -4480,13 +4480,15 @@ SMESH_MeshEditor_i::FindAmongElementsByPoint(SMESH::SMESH_IDSource_ptr elementID { SMESH_TRY; SMESH::long_array_var res = new SMESH::long_array; - - SMESH::array_of_ElementType_var types = elementIDs->GetTypes(); - if ( types->length() == 1 && // a part contains only nodes or 0D elements - ( types[0] == SMESH::NODE || types[0] == SMESH::ELEM0D || types[0] == SMESH::BALL) && - type != types[0] ) // but search of elements of dim > 0 - return res._retn(); + if ( type != SMESH::NODE ) + { + SMESH::array_of_ElementType_var types = elementIDs->GetTypes(); + if ( types->length() == 1 && // a part contains only nodes or 0D elements + ( types[0] == SMESH::NODE || types[0] == SMESH::ELEM0D || types[0] == SMESH::BALL) && + type != types[0] ) // but search of elements of dim > 0 + return res._retn(); + } if ( SMESH::DownCast( elementIDs )) // elementIDs is the whole mesh return FindElementsByPoint( x,y,z, type ); @@ -4500,7 +4502,8 @@ SMESH_MeshEditor_i::FindAmongElementsByPoint(SMESH::SMESH_IDSource_ptr elementID SMESHDS_Mesh* meshDS = SMESH::DownCast( mesh )->GetImpl().GetMeshDS(); if ( !idSourceToSet( elementIDs, meshDS, elements, - SMDSAbs_ElementType(type), /*emptyIfIsMesh=*/true)) + ( type == SMESH::NODE ? SMDSAbs_All : (SMDSAbs_ElementType) type ), + /*emptyIfIsMesh=*/true)) return res._retn(); typedef SMDS_SetIterator TIter; From 4ed74ad3da0e1ddd1d6ac5891a8202e0831abcb5 Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 17 Mar 2016 21:47:21 +0300 Subject: [PATCH 11/22] 52976: Find Elements by Point - All does not find Ball element + minor changes in sample scripts --- doc/salome/examples/defining_hypotheses_ex05.py | 2 +- doc/salome/examples/defining_hypotheses_ex07.py | 5 +++-- src/SMESHUtils/SMESH_MeshAlgos.cxx | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/salome/examples/defining_hypotheses_ex05.py b/doc/salome/examples/defining_hypotheses_ex05.py index d2b98f1cc..204496ce0 100644 --- a/doc/salome/examples/defining_hypotheses_ex05.py +++ b/doc/salome/examples/defining_hypotheses_ex05.py @@ -37,7 +37,7 @@ algo.NumberOfSegments(20) # assign triangulation algorithm algo = tria_mesh.Triangle() -# apply "Max Element Area" hypothesis to each triangle +# assign "Max Element Area" hypothesis algo.MaxElementArea(100) # compute the mesh diff --git a/doc/salome/examples/defining_hypotheses_ex07.py b/doc/salome/examples/defining_hypotheses_ex07.py index c2dc2cfb0..1630a9047 100644 --- a/doc/salome/examples/defining_hypotheses_ex07.py +++ b/doc/salome/examples/defining_hypotheses_ex07.py @@ -24,12 +24,13 @@ tria = smesh.Mesh(face1, "Face : triangle 2D mesh") # Define 1D meshing algo1D = tria.Segment() -algo1D.NumberOfSegments(2) +algo1D.LocalLength(3.) # create and assign the algorithm for 2D meshing with triangles algo2D = tria.Triangle() -# create and assign "LengthFromEdges" hypothesis to build triangles based on the length of the edges taken from the wire +# create and assign "LengthFromEdges" hypothesis to build triangles with +# linear size close to the length of the segments generated on the face wires (3.) algo2D.LengthFromEdges() # compute the mesh diff --git a/src/SMESHUtils/SMESH_MeshAlgos.cxx b/src/SMESHUtils/SMESH_MeshAlgos.cxx index a897decd6..985e4a7ae 100644 --- a/src/SMESHUtils/SMESH_MeshAlgos.cxx +++ b/src/SMESHUtils/SMESH_MeshAlgos.cxx @@ -1259,7 +1259,7 @@ bool SMESH_MeshAlgos::IsOut( const SMDS_MeshElement* element, const gp_Pnt& poin // Node or 0D element ------------------------------------------------------------------------- { gp_Vec n2p ( xyz[0], point ); - return n2p.SquareMagnitude() <= tol * tol; + return n2p.SquareMagnitude() > tol * tol; } return true; } From 3ae5846f2427f15ff0472576c2af89d8978a14ca Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 18 Mar 2016 15:42:33 +0300 Subject: [PATCH 12/22] IPAL52974: Find Element by Point shows nodes that do not belong to current group --- src/SMESHGUI/SMESHGUI_MeshEditPreview.cxx | 11 +++++++++ src/SMESHGUI/SMESHGUI_MeshEditPreview.h | 1 + src/SMESHUtils/SMESH_MeshAlgos.cxx | 30 ++++++++++++++++++++--- src/SMESHUtils/SMESH_MeshAlgos.hxx | 3 +++ 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/SMESHGUI/SMESHGUI_MeshEditPreview.cxx b/src/SMESHGUI/SMESHGUI_MeshEditPreview.cxx index 50fe4e592..73377c3b1 100644 --- a/src/SMESHGUI/SMESHGUI_MeshEditPreview.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshEditPreview.cxx @@ -404,3 +404,14 @@ vtkUnstructuredGrid* SMESHGUI_MeshEditPreview::GetGrid() const { return myGrid; } + +//================================================================================ +/*! + * \brief Returns myViewWindow + */ +//================================================================================ + +SVTK_ViewWindow* SMESHGUI_MeshEditPreview::GetViewWindow() const +{ + return myViewWindow; +} diff --git a/src/SMESHGUI/SMESHGUI_MeshEditPreview.h b/src/SMESHGUI/SMESHGUI_MeshEditPreview.h index a506a3718..e88355819 100644 --- a/src/SMESHGUI/SMESHGUI_MeshEditPreview.h +++ b/src/SMESHGUI/SMESHGUI_MeshEditPreview.h @@ -74,6 +74,7 @@ public: SALOME_Actor* GetActor() const; vtkUnstructuredGrid* GetGrid() const; + SVTK_ViewWindow* GetViewWindow() const; }; #endif // SMESHGUI_MESHEDITPREVIEW_H diff --git a/src/SMESHUtils/SMESH_MeshAlgos.cxx b/src/SMESHUtils/SMESH_MeshAlgos.cxx index 985e4a7ae..a5f7701c2 100644 --- a/src/SMESHUtils/SMESH_MeshAlgos.cxx +++ b/src/SMESHUtils/SMESH_MeshAlgos.cxx @@ -60,7 +60,8 @@ struct SMESH_NodeSearcherImpl: public SMESH_NodeSearcher /*! * \brief Constructor */ - SMESH_NodeSearcherImpl( const SMDS_Mesh* theMesh ) + SMESH_NodeSearcherImpl( const SMDS_Mesh* theMesh = 0, + SMDS_ElemIteratorPtr theElemIt = SMDS_ElemIteratorPtr() ) { myMesh = ( SMDS_Mesh* ) theMesh; @@ -70,6 +71,14 @@ struct SMESH_NodeSearcherImpl: public SMESH_NodeSearcher while ( nIt->more() ) nodes.insert( nodes.end(), nIt->next() ); } + else if ( theElemIt ) + { + while ( theElemIt->more() ) + { + const SMDS_MeshElement* e = theElemIt->next(); + nodes.insert( e->begin_nodes(), e->end_nodes() ); + } + } myOctreeNode = new SMESH_OctreeNode(nodes) ; // get max size of a leaf box @@ -714,8 +723,12 @@ FindElementsByPoint(const gp_Pnt& point, if ( type == SMDSAbs_Node || type == SMDSAbs_0DElement || type == SMDSAbs_Ball) { if ( !_nodeSearcher ) - _nodeSearcher = new SMESH_NodeSearcherImpl( _mesh ); - + { + if ( _meshPartIt ) + _nodeSearcher = new SMESH_NodeSearcherImpl( 0, _meshPartIt ); + else + _nodeSearcher = new SMESH_NodeSearcherImpl( _mesh ); + } std::vector< const SMDS_MeshNode* > foundNodes; _nodeSearcher->FindNearPoint( point, tolerance, foundNodes ); @@ -1695,6 +1708,17 @@ SMESH_NodeSearcher* SMESH_MeshAlgos::GetNodeSearcher(SMDS_Mesh& mesh) return new SMESH_NodeSearcherImpl( &mesh ); } +//======================================================================= +/*! + * \brief Return SMESH_NodeSearcher + */ +//======================================================================= + +SMESH_NodeSearcher* SMESH_MeshAlgos::GetNodeSearcher(SMDS_ElemIteratorPtr elemIt) +{ + return new SMESH_NodeSearcherImpl( 0, elemIt ); +} + //======================================================================= /*! * \brief Return SMESH_ElementSearcher diff --git a/src/SMESHUtils/SMESH_MeshAlgos.hxx b/src/SMESHUtils/SMESH_MeshAlgos.hxx index f8ea69a6b..6420bf966 100644 --- a/src/SMESHUtils/SMESH_MeshAlgos.hxx +++ b/src/SMESHUtils/SMESH_MeshAlgos.hxx @@ -159,6 +159,9 @@ namespace SMESH_MeshAlgos SMESHUtils_EXPORT SMESH_NodeSearcher* GetNodeSearcher( SMDS_Mesh& mesh ); + SMESHUtils_EXPORT + SMESH_NodeSearcher* GetNodeSearcher( SMDS_ElemIteratorPtr elemIt ); + /*! * \brief Return SMESH_ElementSearcher. The caller is responsible for deleting it */ From 7eda9ca931ed2a11cb5e4637e4ffe19f5c061115 Mon Sep 17 00:00:00 2001 From: vsr Date: Fri, 18 Mar 2016 20:10:20 +0300 Subject: [PATCH 13/22] Copyright update: 2016 --- AUTHORS | 0 CMakeLists.txt | 2 +- INSTALL | 1 - LICENCE | 504 ------------------ NEWS | 0 README | 119 +++++ SMESH_version.h.in | 2 +- SalomeSMESHConfig.cmake.in | 2 +- adm_local/CMakeLists.txt | 2 +- adm_local/cmake_files/CMakeLists.txt | 2 +- adm_local/cmake_files/FindCGNS.cmake | 2 +- adm_local/cmake_files/FindSMESH.cmake | 2 +- adm_local/cmake_files/FindSalomeCGNS.cmake | 2 +- adm_local/cmake_files/FindSalomeSMESH.cmake | 2 +- adm_local/cmake_files/FindSalomeTBB.cmake | 2 +- adm_local/cmake_files/FindSalomef2c.cmake | 2 +- adm_local/cmake_files/FindTBB.cmake | 2 +- adm_local/cmake_files/Findf2c.cmake | 2 +- adm_local/unix/CMakeLists.txt | 2 +- adm_local/unix/config_files/CMakeLists.txt | 2 +- adm_local/unix/config_files/check_Platform.m4 | 2 +- adm_local/unix/config_files/check_SMESH.m4 | 2 +- adm_local/unix/config_files/check_cgal.m4 | 2 +- adm_local/unix/config_files/check_cgns.m4 | 2 +- adm_local/unix/config_files/check_f77.m4 | 2 +- adm_local/unix/config_files/check_padder.m4 | 2 +- adm_local/unix/config_files/check_qwt.m4 | 2 +- bin/CMakeLists.txt | 2 +- bin/smesh_setenv.py | 2 +- cvs-tags | 35 -- doc/CMakeLists.txt | 2 +- doc/salome/CMakeLists.txt | 2 +- doc/salome/examples/CMakeLists.txt | 2 +- .../examples/CTestTestfileInstall.cmake | 2 +- doc/salome/examples/testme.py | 2 +- doc/salome/gui/CMakeLists.txt | 2 +- doc/salome/gui/SMESH/CMakeLists.txt | 2 +- doc/salome/gui/SMESH/collect_mesh_methods.py | 2 +- doc/salome/gui/SMESH/doxyfile.in | 2 +- doc/salome/gui/SMESH/doxyfile_py.in | 2 +- doc/salome/gui/SMESH/static/footer.html | 2 +- doc/salome/tui/CMakeLists.txt | 2 +- doc/salome/tui/doxyfile.in | 2 +- doc/salome/tui/static/footer.html | 2 +- idl/CMakeLists.txt | 2 +- idl/SMESH_BasicHypothesis.idl | 2 +- idl/SMESH_Filter.idl | 2 +- idl/SMESH_Gen.idl | 2 +- idl/SMESH_Group.idl | 2 +- idl/SMESH_Hypothesis.idl | 2 +- idl/SMESH_Measurements.idl | 2 +- idl/SMESH_Mesh.idl | 2 +- idl/SMESH_MeshEditor.idl | 2 +- idl/SMESH_Pattern.idl | 2 +- resources/CMakeLists.txt | 2 +- resources/SMESHCatalog.xml.in | 2 +- resources/SalomeApp.xml.in | 2 +- resources/StdMeshers.xml.in | 2 +- src/CMakeLists.txt | 2 +- src/Controls/CMakeLists.txt | 2 +- src/Controls/SMESH_Controls.cxx | 2 +- src/Controls/SMESH_ControlsDef.hxx | 2 +- src/Driver/CMakeLists.txt | 2 +- src/Driver/Driver_Document.cxx | 2 +- src/Driver/Driver_Document.h | 2 +- src/Driver/Driver_Mesh.cxx | 2 +- src/Driver/Driver_Mesh.h | 2 +- src/Driver/Driver_SMDS_Mesh.cxx | 2 +- src/Driver/Driver_SMDS_Mesh.h | 2 +- src/Driver/Driver_SMESHDS_Mesh.cxx | 2 +- src/Driver/Driver_SMESHDS_Mesh.h | 2 +- src/DriverCGNS/CMakeLists.txt | 2 +- src/DriverCGNS/DriverCGNS_Read.cxx | 2 +- src/DriverCGNS/DriverCGNS_Read.hxx | 2 +- src/DriverCGNS/DriverCGNS_Write.cxx | 2 +- src/DriverCGNS/DriverCGNS_Write.hxx | 2 +- src/DriverCGNS/SMESH_DriverCGNS.hxx | 2 +- src/DriverDAT/CMakeLists.txt | 2 +- src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx | 2 +- src/DriverDAT/DriverDAT_R_SMDS_Mesh.h | 2 +- src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx | 2 +- src/DriverDAT/DriverDAT_W_SMDS_Mesh.h | 2 +- src/DriverDAT/SMESH_DriverDAT.hxx | 2 +- src/DriverGMF/CMakeLists.txt | 2 +- src/DriverGMF/DriverGMF.cxx | 2 +- src/DriverGMF/DriverGMF.hxx | 2 +- src/DriverGMF/DriverGMF_Read.cxx | 2 +- src/DriverGMF/DriverGMF_Read.hxx | 2 +- src/DriverGMF/DriverGMF_Write.cxx | 2 +- src/DriverGMF/DriverGMF_Write.hxx | 2 +- src/DriverGMF/SMESH_DriverGMF.hxx | 2 +- src/DriverMED/CMakeLists.txt | 2 +- src/DriverMED/DriverMED.hxx | 2 +- src/DriverMED/DriverMED_Family.cxx | 2 +- src/DriverMED/DriverMED_Family.h | 2 +- src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx | 2 +- src/DriverMED/DriverMED_R_SMESHDS_Mesh.h | 2 +- src/DriverMED/DriverMED_W_Field.cxx | 2 +- src/DriverMED/DriverMED_W_Field.h | 2 +- src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx | 2 +- src/DriverMED/DriverMED_W_SMESHDS_Mesh.h | 2 +- src/DriverMED/SMESH_DriverMED.hxx | 2 +- src/DriverSTL/CMakeLists.txt | 2 +- src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx | 2 +- src/DriverSTL/DriverSTL_R_SMDS_Mesh.h | 2 +- src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx | 2 +- src/DriverSTL/DriverSTL_W_SMDS_Mesh.h | 2 +- src/DriverSTL/SMESH_DriverSTL.hxx | 2 +- src/DriverUNV/CMakeLists.txt | 2 +- src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx | 2 +- src/DriverUNV/DriverUNV_R_SMDS_Mesh.h | 2 +- src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx | 2 +- src/DriverUNV/DriverUNV_W_SMDS_Mesh.h | 2 +- src/DriverUNV/SMESH_DriverUNV.hxx | 2 +- src/DriverUNV/UNV164_Structure.cxx | 2 +- src/DriverUNV/UNV164_Structure.hxx | 2 +- src/DriverUNV/UNV2411_Structure.cxx | 2 +- src/DriverUNV/UNV2411_Structure.hxx | 2 +- src/DriverUNV/UNV2412_Structure.cxx | 2 +- src/DriverUNV/UNV2412_Structure.hxx | 2 +- src/DriverUNV/UNV2417_Structure.cxx | 2 +- src/DriverUNV/UNV2417_Structure.hxx | 2 +- src/DriverUNV/UNV2420_Structure.cxx | 2 +- src/DriverUNV/UNV2420_Structure.hxx | 2 +- src/DriverUNV/UNV_Utilities.cxx | 2 +- src/DriverUNV/UNV_Utilities.hxx | 2 +- src/MEDWrapper/Base/CMakeLists.txt | 2 +- src/MEDWrapper/Base/MED_Algorithm.cxx | 2 +- src/MEDWrapper/Base/MED_Algorithm.hxx | 2 +- src/MEDWrapper/Base/MED_Common.hxx | 2 +- src/MEDWrapper/Base/MED_CoordUtils.cxx | 2 +- src/MEDWrapper/Base/MED_CoordUtils.hxx | 2 +- src/MEDWrapper/Base/MED_GaussDef.cxx | 2 +- src/MEDWrapper/Base/MED_GaussDef.hxx | 2 +- src/MEDWrapper/Base/MED_GaussUtils.cxx | 2 +- src/MEDWrapper/Base/MED_GaussUtils.hxx | 2 +- src/MEDWrapper/Base/MED_SharedPtr.hxx | 2 +- src/MEDWrapper/Base/MED_SliceArray.hxx | 2 +- src/MEDWrapper/Base/MED_Structures.cxx | 2 +- src/MEDWrapper/Base/MED_Structures.hxx | 2 +- src/MEDWrapper/Base/MED_TStructures.hxx | 2 +- src/MEDWrapper/Base/MED_TWrapper.hxx | 2 +- src/MEDWrapper/Base/MED_Utilities.cxx | 2 +- src/MEDWrapper/Base/MED_Utilities.hxx | 2 +- src/MEDWrapper/Base/MED_Vector.hxx | 2 +- src/MEDWrapper/Base/MED_Wrapper.cxx | 2 +- src/MEDWrapper/Base/MED_Wrapper.hxx | 2 +- src/MEDWrapper/Base/MED_WrapperBase.hxx | 2 +- src/MEDWrapper/CMakeLists.txt | 2 +- src/MEDWrapper/Factory/CMakeLists.txt | 2 +- src/MEDWrapper/Factory/MED_Factory.cxx | 2 +- src/MEDWrapper/Factory/MED_Factory.hxx | 2 +- src/MEDWrapper/Factory/MED_Test.cxx | 2 +- src/MEDWrapper/Factory/MED_WrapperFactory.hxx | 2 +- src/MEDWrapper/Factory/mprint_version.cxx | 2 +- src/MEDWrapper/V2_2/CMakeLists.txt | 2 +- src/MEDWrapper/V2_2/MED_V2_2_Wrapper.cxx | 2 +- src/MEDWrapper/V2_2/MED_V2_2_Wrapper.hxx | 2 +- src/MEFISTO2/CMakeLists.txt | 2 +- src/MEFISTO2/Rn.h | 2 +- src/MEFISTO2/aptrte.cxx | 2 +- src/MEFISTO2/aptrte.h | 2 +- src/MEFISTO2/areteideale.f | 2 +- src/MEFISTO2/trte.f | 2 +- src/OBJECT/CMakeLists.txt | 2 +- src/OBJECT/SMESH_Actor.cxx | 2 +- src/OBJECT/SMESH_Actor.h | 2 +- src/OBJECT/SMESH_ActorDef.h | 2 +- src/OBJECT/SMESH_ActorUtils.cxx | 2 +- src/OBJECT/SMESH_ActorUtils.h | 2 +- src/OBJECT/SMESH_CellLabelActor.cxx | 2 +- src/OBJECT/SMESH_CellLabelActor.h | 2 +- src/OBJECT/SMESH_DeviceActor.cxx | 2 +- src/OBJECT/SMESH_DeviceActor.h | 2 +- src/OBJECT/SMESH_ExtractGeometry.cxx | 2 +- src/OBJECT/SMESH_ExtractGeometry.h | 2 +- src/OBJECT/SMESH_FaceOrientationFilter.cxx | 2 +- src/OBJECT/SMESH_FaceOrientationFilter.h | 2 +- src/OBJECT/SMESH_NodeLabelActor.cxx | 2 +- src/OBJECT/SMESH_NodeLabelActor.h | 2 +- src/OBJECT/SMESH_Object.cxx | 2 +- src/OBJECT/SMESH_Object.h | 2 +- src/OBJECT/SMESH_ObjectDef.h | 2 +- src/OBJECT/SMESH_PreviewActorsCollection.cxx | 2 +- src/OBJECT/SMESH_PreviewActorsCollection.h | 2 +- src/OBJECT/SMESH_SVTKActor.cxx | 2 +- src/OBJECT/SMESH_SVTKActor.h | 2 +- src/OBJECT/SMESH_ScalarBarActor.cxx | 2 +- src/OBJECT/SMESH_ScalarBarActor.h | 2 +- src/PluginUtils/CMakeLists.txt | 2 +- src/PluginUtils/GeomSelectionTools.cxx | 2 +- src/PluginUtils/GeomSelectionTools.h | 2 +- src/SMDS/CMakeLists.txt | 2 +- src/SMDS/ObjectPool.hxx | 2 +- src/SMDS/SMDSAbs_ElementType.hxx | 2 +- src/SMDS/SMDS_BallElement.cxx | 2 +- src/SMDS/SMDS_BallElement.hxx | 2 +- src/SMDS/SMDS_Downward.cxx | 2 +- src/SMDS/SMDS_Downward.hxx | 2 +- src/SMDS/SMDS_EdgePosition.cxx | 2 +- src/SMDS/SMDS_EdgePosition.hxx | 2 +- src/SMDS/SMDS_ElemIterator.hxx | 2 +- src/SMDS/SMDS_FaceOfEdges.cxx | 2 +- src/SMDS/SMDS_FaceOfEdges.hxx | 2 +- src/SMDS/SMDS_FaceOfNodes.cxx | 2 +- src/SMDS/SMDS_FaceOfNodes.hxx | 2 +- src/SMDS/SMDS_FacePosition.cxx | 2 +- src/SMDS/SMDS_FacePosition.hxx | 2 +- src/SMDS/SMDS_Iterator.hxx | 2 +- src/SMDS/SMDS_IteratorOfElements.cxx | 2 +- src/SMDS/SMDS_IteratorOfElements.hxx | 2 +- src/SMDS/SMDS_IteratorOnIterators.hxx | 2 +- src/SMDS/SMDS_LinearEdge.cxx | 2 +- src/SMDS/SMDS_LinearEdge.hxx | 2 +- src/SMDS/SMDS_MemoryLimit.cxx | 2 +- src/SMDS/SMDS_Mesh.cxx | 2 +- src/SMDS/SMDS_Mesh.hxx | 2 +- src/SMDS/SMDS_Mesh0DElement.cxx | 2 +- src/SMDS/SMDS_Mesh0DElement.hxx | 2 +- src/SMDS/SMDS_MeshCell.cxx | 2 +- src/SMDS/SMDS_MeshCell.hxx | 2 +- src/SMDS/SMDS_MeshEdge.cxx | 2 +- src/SMDS/SMDS_MeshEdge.hxx | 2 +- src/SMDS/SMDS_MeshElement.cxx | 2 +- src/SMDS/SMDS_MeshElement.hxx | 2 +- src/SMDS/SMDS_MeshElementIDFactory.cxx | 2 +- src/SMDS/SMDS_MeshElementIDFactory.hxx | 2 +- src/SMDS/SMDS_MeshFace.cxx | 2 +- src/SMDS/SMDS_MeshFace.hxx | 2 +- src/SMDS/SMDS_MeshGroup.cxx | 2 +- src/SMDS/SMDS_MeshGroup.hxx | 2 +- src/SMDS/SMDS_MeshIDFactory.cxx | 2 +- src/SMDS/SMDS_MeshIDFactory.hxx | 2 +- src/SMDS/SMDS_MeshInfo.hxx | 2 +- src/SMDS/SMDS_MeshNode.cxx | 2 +- src/SMDS/SMDS_MeshNode.hxx | 2 +- src/SMDS/SMDS_MeshNodeIDFactory.cxx | 2 +- src/SMDS/SMDS_MeshNodeIDFactory.hxx | 2 +- src/SMDS/SMDS_MeshObject.cxx | 2 +- src/SMDS/SMDS_MeshObject.hxx | 2 +- src/SMDS/SMDS_MeshVolume.cxx | 2 +- src/SMDS/SMDS_MeshVolume.hxx | 2 +- src/SMDS/SMDS_PolygonalFaceOfNodes.cxx | 2 +- src/SMDS/SMDS_PolygonalFaceOfNodes.hxx | 2 +- src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx | 2 +- src/SMDS/SMDS_PolyhedralVolumeOfNodes.hxx | 2 +- src/SMDS/SMDS_Position.cxx | 2 +- src/SMDS/SMDS_Position.hxx | 2 +- src/SMDS/SMDS_QuadraticEdge.cxx | 2 +- src/SMDS/SMDS_QuadraticEdge.hxx | 2 +- src/SMDS/SMDS_QuadraticFaceOfNodes.cxx | 2 +- src/SMDS/SMDS_QuadraticFaceOfNodes.hxx | 2 +- src/SMDS/SMDS_QuadraticVolumeOfNodes.cxx | 2 +- src/SMDS/SMDS_QuadraticVolumeOfNodes.hxx | 2 +- src/SMDS/SMDS_SetIterator.hxx | 2 +- src/SMDS/SMDS_SpacePosition.cxx | 2 +- src/SMDS/SMDS_SpacePosition.hxx | 2 +- src/SMDS/SMDS_StdIterator.hxx | 2 +- src/SMDS/SMDS_TypeOfPosition.hxx | 2 +- src/SMDS/SMDS_UnstructuredGrid.cxx | 2 +- src/SMDS/SMDS_UnstructuredGrid.hxx | 2 +- src/SMDS/SMDS_VertexPosition.cxx | 2 +- src/SMDS/SMDS_VertexPosition.hxx | 2 +- src/SMDS/SMDS_VolumeOfFaces.cxx | 2 +- src/SMDS/SMDS_VolumeOfFaces.hxx | 2 +- src/SMDS/SMDS_VolumeOfNodes.cxx | 2 +- src/SMDS/SMDS_VolumeOfNodes.hxx | 2 +- src/SMDS/SMDS_VolumeTool.cxx | 2 +- src/SMDS/SMDS_VolumeTool.hxx | 2 +- src/SMDS/SMDS_VtkCellIterator.cxx | 2 +- src/SMDS/SMDS_VtkCellIterator.hxx | 2 +- src/SMDS/SMDS_VtkEdge.cxx | 2 +- src/SMDS/SMDS_VtkEdge.hxx | 2 +- src/SMDS/SMDS_VtkFace.cxx | 2 +- src/SMDS/SMDS_VtkFace.hxx | 2 +- src/SMDS/SMDS_VtkVolume.cxx | 2 +- src/SMDS/SMDS_VtkVolume.hxx | 2 +- src/SMDS/SMESH_SMDS.hxx | 2 +- src/SMDS/chrono.cxx | 2 +- src/SMDS/chrono.hxx | 2 +- src/SMESH/CMakeLists.txt | 2 +- src/SMESH/SMESH_Algo.cxx | 2 +- src/SMESH/SMESH_Algo.hxx | 2 +- src/SMESH/SMESH_Gen.cxx | 2 +- src/SMESH/SMESH_Gen.hxx | 2 +- src/SMESH/SMESH_Group.cxx | 2 +- src/SMESH/SMESH_Group.hxx | 2 +- src/SMESH/SMESH_HypoFilter.cxx | 2 +- src/SMESH/SMESH_HypoFilter.hxx | 2 +- src/SMESH/SMESH_Hypothesis.cxx | 2 +- src/SMESH/SMESH_Hypothesis.hxx | 2 +- src/SMESH/SMESH_Mesh.cxx | 2 +- src/SMESH/SMESH_Mesh.hxx | 2 +- src/SMESH/SMESH_MeshEditor.cxx | 2 +- src/SMESH/SMESH_MeshEditor.hxx | 2 +- src/SMESH/SMESH_MesherHelper.cxx | 2 +- src/SMESH/SMESH_MesherHelper.hxx | 2 +- src/SMESH/SMESH_Pattern.cxx | 2 +- src/SMESH/SMESH_Pattern.hxx | 2 +- src/SMESH/SMESH_ProxyMesh.cxx | 2 +- src/SMESH/SMESH_ProxyMesh.hxx | 2 +- src/SMESH/SMESH_SMESH.hxx | 2 +- src/SMESH/SMESH_subMesh.cxx | 2 +- src/SMESH/SMESH_subMesh.hxx | 2 +- src/SMESH/SMESH_subMeshEventListener.hxx | 2 +- src/SMESH/memoire.h | 2 +- src/SMESHClient/CMakeLists.txt | 2 +- src/SMESHClient/SMESHClientBin.cxx | 2 +- src/SMESHClient/SMESH_Client.cxx | 2 +- src/SMESHClient/SMESH_Client.hxx | 2 +- src/SMESHDS/CMakeLists.txt | 2 +- src/SMESHDS/SMESHDS_Command.cxx | 2 +- src/SMESHDS/SMESHDS_Command.hxx | 2 +- src/SMESHDS/SMESHDS_CommandType.hxx | 2 +- src/SMESHDS/SMESHDS_DataMapOfShape.hxx | 2 +- src/SMESHDS/SMESHDS_Document.cxx | 2 +- src/SMESHDS/SMESHDS_Document.hxx | 2 +- src/SMESHDS/SMESHDS_Group.cxx | 2 +- src/SMESHDS/SMESHDS_Group.hxx | 2 +- src/SMESHDS/SMESHDS_GroupBase.cxx | 2 +- src/SMESHDS/SMESHDS_GroupBase.hxx | 2 +- src/SMESHDS/SMESHDS_GroupOnFilter.cxx | 2 +- src/SMESHDS/SMESHDS_GroupOnFilter.hxx | 2 +- src/SMESHDS/SMESHDS_GroupOnGeom.cxx | 2 +- src/SMESHDS/SMESHDS_GroupOnGeom.hxx | 2 +- src/SMESHDS/SMESHDS_Hypothesis.cxx | 2 +- src/SMESHDS/SMESHDS_Hypothesis.hxx | 2 +- src/SMESHDS/SMESHDS_Mesh.cxx | 2 +- src/SMESHDS/SMESHDS_Mesh.hxx | 2 +- src/SMESHDS/SMESHDS_Script.cxx | 2 +- src/SMESHDS/SMESHDS_Script.hxx | 2 +- src/SMESHDS/SMESHDS_SubMesh.cxx | 2 +- src/SMESHDS/SMESHDS_SubMesh.hxx | 2 +- src/SMESHDS/SMESHDS_TSubMeshHolder.hxx | 2 +- src/SMESHDS/SMESH_Controls.hxx | 2 +- src/SMESHDS/SMESH_SMESHDS.hxx | 2 +- src/SMESHFiltersSelection/CMakeLists.txt | 2 +- .../SMESH_LogicalFilter.cxx | 2 +- .../SMESH_LogicalFilter.hxx | 2 +- .../SMESH_NumberFilter.cxx | 2 +- .../SMESH_NumberFilter.hxx | 2 +- src/SMESHFiltersSelection/SMESH_Type.h | 2 +- .../SMESH_TypeFilter.cxx | 2 +- .../SMESH_TypeFilter.hxx | 2 +- src/SMESHGUI/CMakeLists.txt | 2 +- src/SMESHGUI/SMESHGUI.cxx | 2 +- src/SMESHGUI/SMESHGUI.h | 2 +- .../SMESHGUI_Add0DElemsOnAllNodesDlg.cxx | 2 +- .../SMESHGUI_Add0DElemsOnAllNodesDlg.h | 2 +- src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_AddMeshElementDlg.h | 2 +- .../SMESHGUI_AddQuadraticElementDlg.cxx | 2 +- .../SMESHGUI_AddQuadraticElementDlg.h | 2 +- src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_BuildCompoundDlg.h | 2 +- src/SMESHGUI/SMESHGUI_ClippingDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_ClippingDlg.h | 2 +- src/SMESHGUI/SMESHGUI_ComputeDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_ComputeDlg.h | 2 +- src/SMESHGUI/SMESHGUI_ConvToQuadDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_ConvToQuadDlg.h | 2 +- src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx | 2 +- src/SMESHGUI/SMESHGUI_ConvToQuadOp.h | 2 +- src/SMESHGUI/SMESHGUI_CopyMeshDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_CopyMeshDlg.h | 2 +- src/SMESHGUI/SMESHGUI_CreatePatternDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_CreatePatternDlg.h | 2 +- .../SMESHGUI_CreatePolyhedralVolumeDlg.cxx | 2 +- .../SMESHGUI_CreatePolyhedralVolumeDlg.h | 2 +- src/SMESHGUI/SMESHGUI_DeleteGroupDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_DeleteGroupDlg.h | 2 +- src/SMESHGUI/SMESHGUI_Dialog.cxx | 2 +- src/SMESHGUI/SMESHGUI_Dialog.h | 2 +- src/SMESHGUI/SMESHGUI_DisplayEntitiesDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_DisplayEntitiesDlg.h | 2 +- src/SMESHGUI/SMESHGUI_Displayer.cxx | 2 +- src/SMESHGUI/SMESHGUI_Displayer.h | 2 +- src/SMESHGUI/SMESHGUI_DuplicateNodesDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_DuplicateNodesDlg.h | 2 +- .../SMESHGUI_ExtrusionAlongPathDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.h | 2 +- src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_ExtrusionDlg.h | 2 +- src/SMESHGUI/SMESHGUI_FieldSelectorWdg.cxx | 2 +- src/SMESHGUI/SMESHGUI_FieldSelectorWdg.h | 2 +- src/SMESHGUI/SMESHGUI_FileInfoDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_FileInfoDlg.h | 2 +- src/SMESHGUI/SMESHGUI_FileValidator.cxx | 2 +- src/SMESHGUI/SMESHGUI_FileValidator.h | 2 +- src/SMESHGUI/SMESHGUI_Filter.cxx | 2 +- src/SMESHGUI/SMESHGUI_Filter.h | 2 +- src/SMESHGUI/SMESHGUI_FilterDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_FilterDlg.h | 2 +- src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_FilterLibraryDlg.h | 2 +- src/SMESHGUI/SMESHGUI_FilterUtils.cxx | 2 +- src/SMESHGUI/SMESHGUI_FilterUtils.h | 2 +- src/SMESHGUI/SMESHGUI_FindElemByPointDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_FindElemByPointDlg.h | 2 +- src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx | 2 +- src/SMESHGUI/SMESHGUI_GEOMGenUtils.h | 2 +- src/SMESHGUI/SMESHGUI_GroupDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_GroupDlg.h | 2 +- src/SMESHGUI/SMESHGUI_GroupOnShapeDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_GroupOnShapeDlg.h | 2 +- src/SMESHGUI/SMESHGUI_GroupOpDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_GroupOpDlg.h | 2 +- src/SMESHGUI/SMESHGUI_GroupUtils.cxx | 2 +- src/SMESHGUI/SMESHGUI_GroupUtils.h | 2 +- src/SMESHGUI/SMESHGUI_Hypotheses.cxx | 2 +- src/SMESHGUI/SMESHGUI_Hypotheses.h | 2 +- src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx | 2 +- src/SMESHGUI/SMESHGUI_HypothesesUtils.h | 2 +- src/SMESHGUI/SMESHGUI_IdPreview.cxx | 2 +- src/SMESHGUI/SMESHGUI_IdPreview.h | 2 +- src/SMESHGUI/SMESHGUI_IdValidator.h | 2 +- src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx | 2 +- src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.h | 2 +- src/SMESHGUI/SMESHGUI_MakeNodeAtPointDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_MakeNodeAtPointDlg.h | 2 +- src/SMESHGUI/SMESHGUI_Measurements.cxx | 2 +- src/SMESHGUI/SMESHGUI_Measurements.h | 2 +- src/SMESHGUI/SMESHGUI_MergeDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_MergeDlg.h | 2 +- src/SMESHGUI/SMESHGUI_MeshDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_MeshDlg.h | 2 +- src/SMESHGUI/SMESHGUI_MeshEditPreview.cxx | 2 +- src/SMESHGUI/SMESHGUI_MeshEditPreview.h | 2 +- src/SMESHGUI/SMESHGUI_MeshInfo.cxx | 2 +- src/SMESHGUI/SMESHGUI_MeshInfo.h | 2 +- src/SMESHGUI/SMESHGUI_MeshInfosBox.cxx | 2 +- src/SMESHGUI/SMESHGUI_MeshInfosBox.h | 2 +- src/SMESHGUI/SMESHGUI_MeshOp.cxx | 2 +- src/SMESHGUI/SMESHGUI_MeshOp.h | 2 +- src/SMESHGUI/SMESHGUI_MeshOrderDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_MeshOrderDlg.h | 2 +- src/SMESHGUI/SMESHGUI_MeshOrderOp.cxx | 2 +- src/SMESHGUI/SMESHGUI_MeshOrderOp.h | 2 +- src/SMESHGUI/SMESHGUI_MeshPatternDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_MeshPatternDlg.h | 2 +- src/SMESHGUI/SMESHGUI_MeshUtils.cxx | 2 +- src/SMESHGUI/SMESHGUI_MeshUtils.h | 2 +- src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_MultiEditDlg.h | 2 +- src/SMESHGUI/SMESHGUI_NodesDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_NodesDlg.h | 2 +- src/SMESHGUI/SMESHGUI_Operation.cxx | 2 +- src/SMESHGUI/SMESHGUI_Operation.h | 2 +- src/SMESHGUI/SMESHGUI_Operations.h | 2 +- src/SMESHGUI/SMESHGUI_PatternUtils.cxx | 2 +- src/SMESHGUI/SMESHGUI_PatternUtils.h | 2 +- src/SMESHGUI/SMESHGUI_PatternWidget.cxx | 2 +- src/SMESHGUI/SMESHGUI_PatternWidget.h | 2 +- src/SMESHGUI/SMESHGUI_PreVisualObj.cxx | 2 +- src/SMESHGUI/SMESHGUI_PreVisualObj.h | 2 +- .../SMESHGUI_Preferences_ScalarBarDlg.cxx | 2 +- .../SMESHGUI_Preferences_ScalarBarDlg.h | 2 +- src/SMESHGUI/SMESHGUI_PreviewDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_PreviewDlg.h | 2 +- src/SMESHGUI/SMESHGUI_PropertiesDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_PropertiesDlg.h | 2 +- src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_RemoveElementsDlg.h | 2 +- src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_RemoveNodesDlg.h | 2 +- src/SMESHGUI/SMESHGUI_RenumberingDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_RenumberingDlg.h | 2 +- src/SMESHGUI/SMESHGUI_ReorientFacesDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_ReorientFacesDlg.h | 2 +- src/SMESHGUI/SMESHGUI_RevolutionDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_RevolutionDlg.h | 2 +- src/SMESHGUI/SMESHGUI_RotationDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_RotationDlg.h | 2 +- src/SMESHGUI/SMESHGUI_ScaleDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_ScaleDlg.h | 2 +- src/SMESHGUI/SMESHGUI_Selection.cxx | 2 +- src/SMESHGUI/SMESHGUI_Selection.h | 2 +- src/SMESHGUI/SMESHGUI_SelectionOp.cxx | 2 +- src/SMESHGUI/SMESHGUI_SelectionOp.h | 2 +- src/SMESHGUI/SMESHGUI_SewingDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_SewingDlg.h | 2 +- src/SMESHGUI/SMESHGUI_ShapeByMeshDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_ShapeByMeshDlg.h | 2 +- src/SMESHGUI/SMESHGUI_SingleEditDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_SingleEditDlg.h | 2 +- src/SMESHGUI/SMESHGUI_SmoothingDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_SmoothingDlg.h | 2 +- src/SMESHGUI/SMESHGUI_SpinBox.cxx | 2 +- src/SMESHGUI/SMESHGUI_SpinBox.h | 2 +- src/SMESHGUI/SMESHGUI_SplitBiQuad.cxx | 2 +- src/SMESHGUI/SMESHGUI_SplitBiQuad.h | 2 +- src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_SymmetryDlg.h | 2 +- src/SMESHGUI/SMESHGUI_TranslationDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_TranslationDlg.h | 2 +- src/SMESHGUI/SMESHGUI_TransparencyDlg.cxx | 2 +- src/SMESHGUI/SMESHGUI_TransparencyDlg.h | 2 +- src/SMESHGUI/SMESHGUI_Utils.cxx | 2 +- src/SMESHGUI/SMESHGUI_Utils.h | 2 +- src/SMESHGUI/SMESHGUI_VTKUtils.cxx | 2 +- src/SMESHGUI/SMESHGUI_VTKUtils.h | 2 +- src/SMESHGUI/SMESHGUI_XmlHandler.cxx | 2 +- src/SMESHGUI/SMESHGUI_XmlHandler.h | 2 +- src/SMESHGUI/SMESH_SMESHGUI.hxx | 2 +- src/SMESHUtils/CMakeLists.txt | 2 +- src/SMESHUtils/SMESH_Block.cxx | 2 +- src/SMESHUtils/SMESH_Block.hxx | 2 +- src/SMESHUtils/SMESH_Comment.hxx | 2 +- src/SMESHUtils/SMESH_ComputeError.hxx | 2 +- src/SMESHUtils/SMESH_File.cxx | 2 +- src/SMESHUtils/SMESH_File.hxx | 2 +- src/SMESHUtils/SMESH_FreeBorders.cxx | 2 +- src/SMESHUtils/SMESH_MAT2d.cxx | 2 +- src/SMESHUtils/SMESH_MAT2d.hxx | 2 +- src/SMESHUtils/SMESH_MeshAlgos.cxx | 2 +- src/SMESHUtils/SMESH_MeshAlgos.hxx | 2 +- src/SMESHUtils/SMESH_Octree.cxx | 2 +- src/SMESHUtils/SMESH_Octree.hxx | 2 +- src/SMESHUtils/SMESH_OctreeNode.cxx | 2 +- src/SMESHUtils/SMESH_OctreeNode.hxx | 2 +- src/SMESHUtils/SMESH_Quadtree.cxx | 2 +- src/SMESHUtils/SMESH_Quadtree.hxx | 2 +- src/SMESHUtils/SMESH_Tree.hxx | 2 +- src/SMESHUtils/SMESH_TryCatch.cxx | 2 +- src/SMESHUtils/SMESH_TryCatch.hxx | 2 +- src/SMESHUtils/SMESH_TypeDefs.hxx | 2 +- src/SMESHUtils/SMESH_Utils.hxx | 2 +- src/SMESH_I/CMakeLists.txt | 2 +- src/SMESH_I/SMESH.hxx | 2 +- src/SMESH_I/SMESH_0D_Algo_i.cxx | 2 +- src/SMESH_I/SMESH_0D_Algo_i.hxx | 2 +- src/SMESH_I/SMESH_1D_Algo_i.cxx | 2 +- src/SMESH_I/SMESH_1D_Algo_i.hxx | 2 +- src/SMESH_I/SMESH_2D_Algo_i.cxx | 2 +- src/SMESH_I/SMESH_2D_Algo_i.hxx | 2 +- src/SMESH_I/SMESH_2smeshpy.cxx | 2 +- src/SMESH_I/SMESH_2smeshpy.hxx | 2 +- src/SMESH_I/SMESH_3D_Algo_i.cxx | 2 +- src/SMESH_I/SMESH_3D_Algo_i.hxx | 2 +- src/SMESH_I/SMESH_Algo_i.cxx | 2 +- src/SMESH_I/SMESH_Algo_i.hxx | 2 +- src/SMESH_I/SMESH_DumpPython.cxx | 2 +- src/SMESH_I/SMESH_Filter_i.cxx | 2 +- src/SMESH_I/SMESH_Filter_i.hxx | 2 +- src/SMESH_I/SMESH_Gen_i.cxx | 2 +- src/SMESH_I/SMESH_Gen_i.hxx | 2 +- src/SMESH_I/SMESH_Gen_i_1.cxx | 2 +- src/SMESH_I/SMESH_Group_i.cxx | 2 +- src/SMESH_I/SMESH_Group_i.hxx | 2 +- src/SMESH_I/SMESH_Hypothesis_i.cxx | 2 +- src/SMESH_I/SMESH_Hypothesis_i.hxx | 2 +- src/SMESH_I/SMESH_Measurements_i.cxx | 2 +- src/SMESH_I/SMESH_Measurements_i.hxx | 2 +- src/SMESH_I/SMESH_MeshEditor_i.cxx | 2 +- src/SMESH_I/SMESH_MeshEditor_i.hxx | 2 +- src/SMESH_I/SMESH_MeshPartDS.hxx | 2 +- src/SMESH_I/SMESH_Mesh_i.cxx | 2 +- src/SMESH_I/SMESH_Mesh_i.hxx | 2 +- src/SMESH_I/SMESH_NoteBook.cxx | 2 +- src/SMESH_I/SMESH_NoteBook.hxx | 2 +- src/SMESH_I/SMESH_Pattern_i.cxx | 2 +- src/SMESH_I/SMESH_Pattern_i.hxx | 2 +- src/SMESH_I/SMESH_PreMeshInfo.cxx | 2 +- src/SMESH_I/SMESH_PreMeshInfo.hxx | 2 +- src/SMESH_I/SMESH_PythonDump.hxx | 2 +- src/SMESH_I/SMESH_subMesh_i.cxx | 2 +- src/SMESH_I/SMESH_subMesh_i.hxx | 2 +- src/SMESH_PY/CMakeLists.txt | 2 +- src/SMESH_PY/__init__.py | 2 +- src/SMESH_PY/smeshstudytools.py | 2 +- src/SMESH_SWIG/CMakeLists.txt | 2 +- src/SMESH_SWIG/PAL_MESH_041_mesh.py | 2 +- src/SMESH_SWIG/PAL_MESH_043_2D.py | 2 +- src/SMESH_SWIG/PAL_MESH_043_3D.py | 2 +- src/SMESH_SWIG/SMESH_AdvancedEditor.py | 2 +- src/SMESH_SWIG/SMESH_BelongToGeom.py | 2 +- src/SMESH_SWIG/SMESH_BuildCompound.py | 2 +- src/SMESH_SWIG/SMESH_GroupFromGeom.py | 2 +- src/SMESH_SWIG/SMESH_GroupFromGeom2.py | 2 +- src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py | 2 +- src/SMESH_SWIG/SMESH_Nut.py | 2 +- src/SMESH_SWIG/SMESH_Partition1_tetra.py | 2 +- src/SMESH_SWIG/SMESH_Sphere.py | 2 +- src/SMESH_SWIG/SMESH_blocks.py | 2 +- src/SMESH_SWIG/SMESH_box.py | 2 +- src/SMESH_SWIG/SMESH_box2_tetra.py | 2 +- src/SMESH_SWIG/SMESH_box3_tetra.py | 2 +- src/SMESH_SWIG/SMESH_box_tetra.py | 2 +- src/SMESH_SWIG/SMESH_controls.py | 2 +- src/SMESH_SWIG/SMESH_demo_hexa2_upd.py | 2 +- src/SMESH_SWIG/SMESH_fixation.py | 2 +- src/SMESH_SWIG/SMESH_fixation_hexa.py | 2 +- src/SMESH_SWIG/SMESH_fixation_netgen.py | 2 +- src/SMESH_SWIG/SMESH_fixation_tetra.py | 2 +- src/SMESH_SWIG/SMESH_flight_skin.py | 2 +- src/SMESH_SWIG/SMESH_freebord.py | 2 +- src/SMESH_SWIG/SMESH_hexaedre.py | 2 +- src/SMESH_SWIG/SMESH_mechanic.py | 2 +- src/SMESH_SWIG/SMESH_mechanic_editor.py | 2 +- src/SMESH_SWIG/SMESH_mechanic_netgen.py | 2 +- src/SMESH_SWIG/SMESH_mechanic_tetra.py | 2 +- src/SMESH_SWIG/SMESH_reg.py | 2 +- src/SMESH_SWIG/SMESH_shared_modules.py | 2 +- src/SMESH_SWIG/SMESH_test.py | 2 +- src/SMESH_SWIG/SMESH_test0.py | 2 +- src/SMESH_SWIG/SMESH_test1.py | 2 +- src/SMESH_SWIG/SMESH_test1_AndDisplay.py | 2 +- src/SMESH_SWIG/SMESH_test2.py | 2 +- src/SMESH_SWIG/SMESH_test3.py | 2 +- src/SMESH_SWIG/SMESH_test4.py | 2 +- src/SMESH_SWIG/SMESH_test5.py | 2 +- src/SMESH_SWIG/StdMeshersBuilder.py | 2 +- src/SMESH_SWIG/__init__.py | 2 +- src/SMESH_SWIG/batchmode_mefisto.py | 2 +- src/SMESH_SWIG/batchmode_smesh.py | 2 +- src/SMESH_SWIG/ex00_all.py | 2 +- src/SMESH_SWIG/ex01_cube2build.py | 2 +- src/SMESH_SWIG/ex02_cube2primitive.py | 2 +- src/SMESH_SWIG/ex03_cube2partition.py | 2 +- src/SMESH_SWIG/ex04_cube5tetraHexa.py | 2 +- src/SMESH_SWIG/ex05_hole1build.py | 2 +- src/SMESH_SWIG/ex06_hole1boolean.py | 2 +- src/SMESH_SWIG/ex07_hole1partition.py | 2 +- src/SMESH_SWIG/ex08_hole2build.py | 2 +- src/SMESH_SWIG/ex09_grid4build.py | 2 +- src/SMESH_SWIG/ex10_grid4geometry.py | 2 +- src/SMESH_SWIG/ex11_grid3partition.py | 2 +- src/SMESH_SWIG/ex12_grid17partition.py | 2 +- src/SMESH_SWIG/ex13_hole1partial.py | 2 +- src/SMESH_SWIG/ex14_cyl1holed.py | 2 +- src/SMESH_SWIG/ex15_cyl2geometry.py | 2 +- src/SMESH_SWIG/ex16_cyl2complementary.py | 2 +- src/SMESH_SWIG/ex17_dome1.py | 2 +- src/SMESH_SWIG/ex18_dome2.py | 2 +- src/SMESH_SWIG/ex19_sphereINcube.py | 2 +- src/SMESH_SWIG/ex21_lamp.py | 2 +- src/SMESH_SWIG/ex24_cylinder.py | 2 +- src/SMESH_SWIG/ex29_refine.py | 2 +- src/SMESH_SWIG/ex30_groupsOp.py | 2 +- src/SMESH_SWIG/ex30_tepal.py | 2 +- src/SMESH_SWIG/ex31_dimGroup.py | 2 +- src/SMESH_SWIG/smesh.py | 2 +- src/SMESH_SWIG/smeshBuilder.py | 2 +- src/SMESH_SWIG/smesh_algorithm.py | 2 +- src/SMESH_SWIG/smesh_selection.py | 2 +- src/SMESH_SWIG_WITHIHM/CMakeLists.txt | 2 +- src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx | 2 +- src/SMESH_SWIG_WITHIHM/libSMESH_Swig.h | 2 +- src/SMESH_SWIG_WITHIHM/libSMESH_Swig.i | 2 +- src/StdMeshers/CMakeLists.txt | 2 +- src/StdMeshers/SMESH_StdMeshers.hxx | 2 +- src/StdMeshers/StdMeshers_Adaptive1D.cxx | 2 +- src/StdMeshers/StdMeshers_Adaptive1D.hxx | 2 +- src/StdMeshers/StdMeshers_Arithmetic1D.cxx | 2 +- src/StdMeshers/StdMeshers_Arithmetic1D.hxx | 2 +- src/StdMeshers/StdMeshers_AutomaticLength.cxx | 2 +- src/StdMeshers/StdMeshers_AutomaticLength.hxx | 2 +- .../StdMeshers_CartesianParameters3D.cxx | 2 +- .../StdMeshers_CartesianParameters3D.hxx | 2 +- src/StdMeshers/StdMeshers_Cartesian_3D.cxx | 2 +- src/StdMeshers/StdMeshers_Cartesian_3D.hxx | 2 +- .../StdMeshers_CompositeHexa_3D.cxx | 2 +- .../StdMeshers_CompositeHexa_3D.hxx | 2 +- .../StdMeshers_CompositeSegment_1D.cxx | 2 +- .../StdMeshers_CompositeSegment_1D.hxx | 2 +- src/StdMeshers/StdMeshers_Deflection1D.cxx | 2 +- src/StdMeshers/StdMeshers_Deflection1D.hxx | 2 +- src/StdMeshers/StdMeshers_Distribution.cxx | 2 +- src/StdMeshers/StdMeshers_Distribution.hxx | 2 +- src/StdMeshers/StdMeshers_FaceSide.cxx | 2 +- src/StdMeshers/StdMeshers_FaceSide.hxx | 2 +- src/StdMeshers/StdMeshers_FixedPoints1D.cxx | 2 +- src/StdMeshers/StdMeshers_FixedPoints1D.hxx | 2 +- src/StdMeshers/StdMeshers_Geometric1D.cxx | 2 +- src/StdMeshers/StdMeshers_Geometric1D.hxx | 2 +- src/StdMeshers/StdMeshers_HexaFromSkin_3D.cxx | 2 +- src/StdMeshers/StdMeshers_HexaFromSkin_3D.hxx | 2 +- src/StdMeshers/StdMeshers_Hexa_3D.cxx | 2 +- src/StdMeshers/StdMeshers_Hexa_3D.hxx | 2 +- src/StdMeshers/StdMeshers_ImportSource.cxx | 2 +- src/StdMeshers/StdMeshers_ImportSource.hxx | 2 +- src/StdMeshers/StdMeshers_Import_1D.cxx | 2 +- src/StdMeshers/StdMeshers_Import_1D.hxx | 2 +- src/StdMeshers/StdMeshers_Import_1D2D.cxx | 2 +- src/StdMeshers/StdMeshers_Import_1D2D.hxx | 2 +- .../StdMeshers_LayerDistribution.cxx | 2 +- .../StdMeshers_LayerDistribution.hxx | 2 +- .../StdMeshers_LayerDistribution2D.cxx | 2 +- .../StdMeshers_LayerDistribution2D.hxx | 2 +- src/StdMeshers/StdMeshers_LengthFromEdges.cxx | 2 +- src/StdMeshers/StdMeshers_LengthFromEdges.hxx | 2 +- src/StdMeshers/StdMeshers_LocalLength.cxx | 2 +- src/StdMeshers/StdMeshers_LocalLength.hxx | 2 +- src/StdMeshers/StdMeshers_MEFISTO_2D.cxx | 2 +- src/StdMeshers/StdMeshers_MEFISTO_2D.hxx | 2 +- src/StdMeshers/StdMeshers_MaxElementArea.cxx | 2 +- src/StdMeshers/StdMeshers_MaxElementArea.hxx | 2 +- .../StdMeshers_MaxElementVolume.cxx | 2 +- .../StdMeshers_MaxElementVolume.hxx | 2 +- src/StdMeshers/StdMeshers_MaxLength.cxx | 2 +- src/StdMeshers/StdMeshers_MaxLength.hxx | 2 +- .../StdMeshers_NotConformAllowed.cxx | 2 +- .../StdMeshers_NotConformAllowed.hxx | 2 +- src/StdMeshers/StdMeshers_NumberOfLayers.cxx | 2 +- src/StdMeshers/StdMeshers_NumberOfLayers.hxx | 2 +- .../StdMeshers_NumberOfLayers2D.cxx | 2 +- .../StdMeshers_NumberOfLayers2D.hxx | 2 +- .../StdMeshers_NumberOfSegments.cxx | 2 +- .../StdMeshers_NumberOfSegments.hxx | 2 +- src/StdMeshers/StdMeshers_Penta_3D.cxx | 2 +- src/StdMeshers/StdMeshers_Penta_3D.hxx | 2 +- .../StdMeshers_PolygonPerFace_2D.cxx | 2 +- .../StdMeshers_PolygonPerFace_2D.hxx | 2 +- src/StdMeshers/StdMeshers_Prism_3D.cxx | 2 +- src/StdMeshers/StdMeshers_Prism_3D.hxx | 2 +- .../StdMeshers_ProjectionSource1D.cxx | 2 +- .../StdMeshers_ProjectionSource1D.hxx | 2 +- .../StdMeshers_ProjectionSource2D.cxx | 2 +- .../StdMeshers_ProjectionSource2D.hxx | 2 +- .../StdMeshers_ProjectionSource3D.cxx | 2 +- .../StdMeshers_ProjectionSource3D.hxx | 2 +- src/StdMeshers/StdMeshers_ProjectionUtils.cxx | 2 +- src/StdMeshers/StdMeshers_ProjectionUtils.hxx | 2 +- src/StdMeshers/StdMeshers_Projection_1D.cxx | 2 +- src/StdMeshers/StdMeshers_Projection_1D.hxx | 2 +- src/StdMeshers/StdMeshers_Projection_1D2D.cxx | 2 +- src/StdMeshers/StdMeshers_Projection_1D2D.hxx | 2 +- src/StdMeshers/StdMeshers_Projection_2D.cxx | 2 +- src/StdMeshers/StdMeshers_Projection_2D.hxx | 2 +- src/StdMeshers/StdMeshers_Projection_3D.cxx | 2 +- src/StdMeshers/StdMeshers_Projection_3D.hxx | 2 +- src/StdMeshers/StdMeshers_Propagation.cxx | 2 +- src/StdMeshers/StdMeshers_Propagation.hxx | 2 +- .../StdMeshers_QuadFromMedialAxis_1D2D.cxx | 2 +- .../StdMeshers_QuadFromMedialAxis_1D2D.hxx | 2 +- .../StdMeshers_QuadToTriaAdaptor.cxx | 2 +- .../StdMeshers_QuadToTriaAdaptor.hxx | 2 +- .../StdMeshers_QuadrangleParams.cxx | 2 +- .../StdMeshers_QuadrangleParams.hxx | 2 +- .../StdMeshers_QuadranglePreference.cxx | 2 +- .../StdMeshers_QuadranglePreference.hxx | 2 +- src/StdMeshers/StdMeshers_Quadrangle_2D.cxx | 2 +- src/StdMeshers/StdMeshers_Quadrangle_2D.hxx | 2 +- src/StdMeshers/StdMeshers_QuadraticMesh.cxx | 2 +- src/StdMeshers/StdMeshers_QuadraticMesh.hxx | 2 +- src/StdMeshers/StdMeshers_RadialPrism_3D.cxx | 2 +- src/StdMeshers/StdMeshers_RadialPrism_3D.hxx | 2 +- .../StdMeshers_RadialQuadrangle_1D2D.cxx | 2 +- .../StdMeshers_RadialQuadrangle_1D2D.hxx | 2 +- src/StdMeshers/StdMeshers_Regular_1D.cxx | 2 +- src/StdMeshers/StdMeshers_Regular_1D.hxx | 2 +- src/StdMeshers/StdMeshers_Reversible1D.cxx | 2 +- src/StdMeshers/StdMeshers_Reversible1D.hxx | 2 +- .../StdMeshers_SegmentAroundVertex_0D.cxx | 2 +- .../StdMeshers_SegmentAroundVertex_0D.hxx | 2 +- .../StdMeshers_SegmentLengthAroundVertex.cxx | 2 +- .../StdMeshers_SegmentLengthAroundVertex.hxx | 2 +- src/StdMeshers/StdMeshers_StartEndLength.cxx | 2 +- src/StdMeshers/StdMeshers_StartEndLength.hxx | 2 +- .../StdMeshers_UseExisting_1D2D.cxx | 2 +- .../StdMeshers_UseExisting_1D2D.hxx | 2 +- src/StdMeshers/StdMeshers_ViscousLayers.cxx | 2 +- src/StdMeshers/StdMeshers_ViscousLayers.hxx | 2 +- src/StdMeshers/StdMeshers_ViscousLayers2D.cxx | 2 +- src/StdMeshers/StdMeshers_ViscousLayers2D.hxx | 2 +- src/StdMeshersGUI/CMakeLists.txt | 2 +- src/StdMeshersGUI/SMESH_StdMeshersGUI.hxx | 2 +- src/StdMeshersGUI/StdMeshersGUI.cxx | 2 +- .../StdMeshersGUI_CartesianParamCreator.cxx | 2 +- .../StdMeshersGUI_CartesianParamCreator.h | 2 +- .../StdMeshersGUI_DistrPreview.cxx | 2 +- .../StdMeshersGUI_DistrPreview.h | 2 +- .../StdMeshersGUI_DistrTable.cxx | 2 +- src/StdMeshersGUI/StdMeshersGUI_DistrTable.h | 2 +- .../StdMeshersGUI_FixedPointsParamWdg.cxx | 2 +- .../StdMeshersGUI_FixedPointsParamWdg.h | 2 +- ...tdMeshersGUI_LayerDistributionParamWdg.cxx | 2 +- .../StdMeshersGUI_LayerDistributionParamWdg.h | 2 +- .../StdMeshersGUI_NbSegmentsCreator.cxx | 2 +- .../StdMeshersGUI_NbSegmentsCreator.h | 2 +- .../StdMeshersGUI_ObjectReferenceParamWdg.cxx | 2 +- .../StdMeshersGUI_ObjectReferenceParamWdg.h | 2 +- .../StdMeshersGUI_PropagationHelperWdg.cxx | 2 +- .../StdMeshersGUI_PropagationHelperWdg.h | 3 +- .../StdMeshersGUI_QuadrangleParamWdg.cxx | 2 +- .../StdMeshersGUI_QuadrangleParamWdg.h | 2 +- .../StdMeshersGUI_RadioButtonsGrpWdg.cxx | 2 +- .../StdMeshersGUI_RadioButtonsGrpWdg.h | 2 +- .../StdMeshersGUI_StdHypothesisCreator.cxx | 2 +- .../StdMeshersGUI_StdHypothesisCreator.h | 2 +- .../StdMeshersGUI_SubShapeSelectorWdg.cxx | 2 +- .../StdMeshersGUI_SubShapeSelectorWdg.h | 2 +- src/StdMeshers_I/CMakeLists.txt | 2 +- src/StdMeshers_I/SMESH_StdMeshers_I.hxx | 2 +- src/StdMeshers_I/StdMeshers_Adaptive1D_i.cxx | 2 +- src/StdMeshers_I/StdMeshers_Adaptive1D_i.hxx | 2 +- .../StdMeshers_Arithmetic1D_i.cxx | 2 +- .../StdMeshers_Arithmetic1D_i.hxx | 2 +- .../StdMeshers_AutomaticLength_i.cxx | 2 +- .../StdMeshers_AutomaticLength_i.hxx | 2 +- .../StdMeshers_CartesianParameters3D_i.cxx | 2 +- .../StdMeshers_CartesianParameters3D_i.hxx | 2 +- .../StdMeshers_Cartesian_3D_i.cxx | 2 +- .../StdMeshers_Cartesian_3D_i.hxx | 2 +- .../StdMeshers_CompositeSegment_1D_i.cxx | 2 +- .../StdMeshers_CompositeSegment_1D_i.hxx | 2 +- .../StdMeshers_Deflection1D_i.cxx | 2 +- .../StdMeshers_Deflection1D_i.hxx | 2 +- .../StdMeshers_FixedPoints1D_i.cxx | 2 +- .../StdMeshers_FixedPoints1D_i.hxx | 2 +- src/StdMeshers_I/StdMeshers_Geometric1D_i.cxx | 2 +- src/StdMeshers_I/StdMeshers_Geometric1D_i.hxx | 2 +- src/StdMeshers_I/StdMeshers_Hexa_3D_i.cxx | 2 +- src/StdMeshers_I/StdMeshers_Hexa_3D_i.hxx | 2 +- .../StdMeshers_ImportSource1D_i.cxx | 2 +- .../StdMeshers_ImportSource1D_i.hxx | 2 +- .../StdMeshers_ImportSource2D_i.cxx | 2 +- .../StdMeshers_ImportSource2D_i.hxx | 2 +- src/StdMeshers_I/StdMeshers_Import_1D2D_i.cxx | 2 +- src/StdMeshers_I/StdMeshers_Import_1D2D_i.hxx | 2 +- src/StdMeshers_I/StdMeshers_Import_1D_i.cxx | 2 +- src/StdMeshers_I/StdMeshers_Import_1D_i.hxx | 2 +- .../StdMeshers_LayerDistribution2D_i.cxx | 2 +- .../StdMeshers_LayerDistribution2D_i.hxx | 2 +- .../StdMeshers_LayerDistribution_i.cxx | 2 +- .../StdMeshers_LayerDistribution_i.hxx | 2 +- .../StdMeshers_LengthFromEdges_i.cxx | 2 +- .../StdMeshers_LengthFromEdges_i.hxx | 2 +- src/StdMeshers_I/StdMeshers_LocalLength_i.cxx | 2 +- src/StdMeshers_I/StdMeshers_LocalLength_i.hxx | 2 +- src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.cxx | 2 +- src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.hxx | 2 +- .../StdMeshers_MaxElementArea_i.cxx | 2 +- .../StdMeshers_MaxElementArea_i.hxx | 2 +- .../StdMeshers_MaxElementVolume_i.cxx | 2 +- .../StdMeshers_MaxElementVolume_i.hxx | 2 +- src/StdMeshers_I/StdMeshers_MaxLength_i.cxx | 2 +- src/StdMeshers_I/StdMeshers_MaxLength_i.hxx | 2 +- .../StdMeshers_NotConformAllowed_i.cxx | 2 +- .../StdMeshers_NotConformAllowed_i.hxx | 2 +- .../StdMeshers_NumberOfLayers2D_i.cxx | 2 +- .../StdMeshers_NumberOfLayers2D_i.hxx | 2 +- .../StdMeshers_NumberOfLayers_i.cxx | 2 +- .../StdMeshers_NumberOfLayers_i.hxx | 2 +- .../StdMeshers_NumberOfSegments_i.cxx | 2 +- .../StdMeshers_NumberOfSegments_i.hxx | 2 +- src/StdMeshers_I/StdMeshers_ObjRefUlils.cxx | 2 +- src/StdMeshers_I/StdMeshers_ObjRefUlils.hxx | 2 +- .../StdMeshers_PolygonPerFace_2D_i.cxx | 2 +- .../StdMeshers_PolygonPerFace_2D_i.hxx | 2 +- src/StdMeshers_I/StdMeshers_Prism_3D_i.cxx | 2 +- src/StdMeshers_I/StdMeshers_Prism_3D_i.hxx | 2 +- .../StdMeshers_ProjectionSource1D_i.cxx | 2 +- .../StdMeshers_ProjectionSource1D_i.hxx | 2 +- .../StdMeshers_ProjectionSource2D_i.cxx | 2 +- .../StdMeshers_ProjectionSource2D_i.hxx | 2 +- .../StdMeshers_ProjectionSource3D_i.cxx | 2 +- .../StdMeshers_ProjectionSource3D_i.hxx | 2 +- .../StdMeshers_Projection_1D_2D_3D_i.cxx | 2 +- .../StdMeshers_Projection_1D_2D_3D_i.hxx | 2 +- src/StdMeshers_I/StdMeshers_Propagation_i.cxx | 2 +- src/StdMeshers_I/StdMeshers_Propagation_i.hxx | 2 +- .../StdMeshers_QuadrangleParams_i.cxx | 2 +- .../StdMeshers_QuadrangleParams_i.hxx | 2 +- .../StdMeshers_QuadranglePreference_i.cxx | 2 +- .../StdMeshers_QuadranglePreference_i.hxx | 2 +- .../StdMeshers_Quadrangle_2D_i.cxx | 2 +- .../StdMeshers_Quadrangle_2D_i.hxx | 2 +- .../StdMeshers_QuadraticMesh_i.cxx | 2 +- .../StdMeshers_QuadraticMesh_i.hxx | 2 +- .../StdMeshers_RadialQuadrangle_1D2D_i.cxx | 2 +- .../StdMeshers_RadialQuadrangle_1D2D_i.hxx | 2 +- src/StdMeshers_I/StdMeshers_Regular_1D_i.cxx | 2 +- src/StdMeshers_I/StdMeshers_Regular_1D_i.hxx | 2 +- .../StdMeshers_Reversible1D_i.cxx | 2 +- .../StdMeshers_Reversible1D_i.hxx | 2 +- .../StdMeshers_SegmentAroundVertex_0D_i.cxx | 2 +- .../StdMeshers_SegmentAroundVertex_0D_i.hxx | 2 +- ...StdMeshers_SegmentLengthAroundVertex_i.cxx | 2 +- ...StdMeshers_SegmentLengthAroundVertex_i.hxx | 2 +- .../StdMeshers_StartEndLength_i.cxx | 2 +- .../StdMeshers_StartEndLength_i.hxx | 2 +- .../StdMeshers_UseExisting_1D2D_i.cxx | 2 +- .../StdMeshers_UseExisting_1D2D_i.hxx | 2 +- .../StdMeshers_ViscousLayers2D_i.cxx | 2 +- .../StdMeshers_ViscousLayers2D_i.hxx | 2 +- .../StdMeshers_ViscousLayers_i.cxx | 2 +- .../StdMeshers_ViscousLayers_i.hxx | 2 +- src/StdMeshers_I/StdMeshers_i.cxx | 2 +- src/Tools/CMakeLists.txt | 2 +- src/Tools/MGCleanerPlug/CMakeLists.txt | 2 +- .../MGCleanerPlug/MGCleanerMonPlugDialog.py | 2 +- .../MGCleanerPlug/MGCleanerMonViewText.py | 2 +- .../MGCleanerPlug/MGCleanerplug_plugin.py | 2 +- src/Tools/MGCleanerPlug/doc/CMakeLists.txt | 2 +- src/Tools/MGCleanerPlug/doc/conf.py.in | 2 +- src/Tools/MacMesh/CMakeLists.txt | 2 +- src/Tools/MacMesh/Example/PressureValve.py.in | 2 +- src/Tools/MacMesh/MacMesh/Alarms.py | 2 +- src/Tools/MacMesh/MacMesh/CentralUnrefine.py | 2 +- src/Tools/MacMesh/MacMesh/CompositeBox.py | 2 +- src/Tools/MacMesh/MacMesh/CompositeBoxF.py | 2 +- src/Tools/MacMesh/MacMesh/Config.py | 2 +- src/Tools/MacMesh/MacMesh/CutnGroup.py | 2 +- src/Tools/MacMesh/MacMesh/Cylinder.py | 2 +- src/Tools/MacMesh/MacMesh/GenFunctions.py | 2 +- src/Tools/MacMesh/MacMesh/MacObject.py | 2 +- src/Tools/MacMesh/MacMesh/PublishGroups.py | 2 +- src/Tools/MacMesh/MacMesh/SharpAngle.py | 2 +- src/Tools/MeshCut/AUTHORS | 2 +- src/Tools/MeshCut/CMakeLists.txt | 2 +- src/Tools/MeshCut/MeshCut_Carre.cxx | 2 +- src/Tools/MeshCut/MeshCut_Carre.hxx | 2 +- src/Tools/MeshCut/MeshCut_Cas.cxx | 2 +- src/Tools/MeshCut/MeshCut_Cas.hxx | 2 +- src/Tools/MeshCut/MeshCut_Cube.cxx | 2 +- src/Tools/MeshCut/MeshCut_Cube.hxx | 2 +- src/Tools/MeshCut/MeshCut_DC.cxx | 2 +- src/Tools/MeshCut/MeshCut_Fonctions.cxx | 2 +- src/Tools/MeshCut/MeshCut_Fonctions.hxx | 2 +- src/Tools/MeshCut/MeshCut_Globals.hxx | 2 +- src/Tools/MeshCut/MeshCut_Maillage.cxx | 2 +- src/Tools/MeshCut/MeshCut_Maillage.hxx | 2 +- src/Tools/MeshCut/MeshCut_Utils.cxx | 2 +- src/Tools/MeshCut/MeshCut_Utils.hxx | 2 +- src/Tools/MeshCut/meshcut_plugin.py | 2 +- src/Tools/Verima/Base/CMakeLists.txt | 2 +- src/Tools/Verima/Base/__init__.py | 2 +- src/Tools/Verima/CMakeLists.txt | 2 +- src/Tools/Verima/CreeDocuments/CMakeLists.txt | 2 +- src/Tools/Verima/CreeDocuments/__init__.py | 2 +- .../templatesHtml/CMakeLists.txt | 2 +- src/Tools/Verima/Doc/CMakeLists.txt | 2 +- src/Tools/Verima/Doc/conf.py | 179 ------- src/Tools/Verima/Doc/conf.py.in | 2 +- src/Tools/Verima/Doc/makefile | 2 +- src/Tools/Verima/Gui/CMakeLists.txt | 2 +- src/Tools/Verima/Gui/__init__.py | 2 +- src/Tools/Verima/Stats/CMakeLists.txt | 2 +- src/Tools/Verima/Stats/__init__.py | 2 +- src/Tools/Verima/__init__.py | 2 +- src/Tools/YamsPlug/CMakeLists.txt | 2 +- src/Tools/YamsPlug/doc/CMakeLists.txt | 2 +- src/Tools/YamsPlug/doc/conf.py.in | 2 +- src/Tools/YamsPlug/monViewText.py | 2 +- src/Tools/YamsPlug/monYamsPlugDialog.py | 2 +- src/Tools/YamsPlug/yamsplug_plugin.py | 2 +- src/Tools/ZCracksPlug/CMakeLists.txt | 2 +- src/Tools/ZCracksPlug/doc/CMakeLists.txt | 2 +- src/Tools/ZCracksPlug/doc/conf.py.in | 2 +- src/Tools/ZCracksPlug/zcracks_plugin.py | 2 +- src/Tools/blocFissure/CMakeLists.txt | 2 +- src/Tools/blocFissure/CasTests/CMakeLists.txt | 2 +- src/Tools/blocFissure/doc/CMakeLists.txt | 2 +- src/Tools/blocFissure/gmu/CMakeLists.txt | 2 +- src/Tools/blocFissure/ihm/CMakeLists.txt | 2 +- .../blocFissure/ihm/fissureCoude_plugin.py | 4 +- .../blocFissure/ihm/fissureGenerale_plugin.py | 4 +- .../materielCasTests/CMakeLists.txt | 2 +- src/Tools/padder/CMakeLists.txt | 2 +- src/Tools/padder/doc/CMakeLists.txt | 2 +- src/Tools/padder/doc/doxyfile.in | 2 +- src/Tools/padder/meshjob/CMakeLists.txt | 2 +- src/Tools/padder/meshjob/idl/CMakeLists.txt | 2 +- src/Tools/padder/meshjob/idl/MESHJOB.idl | 2 +- .../padder/meshjob/idl/SPADDERPluginTest.idl | 2 +- src/Tools/padder/meshjob/impl/CMakeLists.txt | 2 +- .../padder/meshjob/impl/MeshJobManager_i.cxx | 2 +- .../padder/meshjob/impl/MeshJobManager_i.hxx | 2 +- .../meshjob/impl/SPADDERPluginTester_i.cxx | 2 +- .../meshjob/impl/SPADDERPluginTester_i.hxx | 2 +- src/Tools/padder/meshjob/impl/testhelper.hxx | 2 +- src/Tools/padder/resources/CMakeLists.txt | 2 +- .../resources/testdata/buildparticules.py | 2 +- src/Tools/padder/spadderpy/CMakeLists.txt | 2 +- src/Tools/padder/spadderpy/__init__.py | 2 +- src/Tools/padder/spadderpy/configreader.py | 2 +- src/Tools/padder/spadderpy/gui/CMakeLists.txt | 2 +- src/Tools/padder/spadderpy/gui/inputdata.py | 2 +- src/Tools/padder/spadderpy/gui/inputdialog.py | 2 +- .../padder/spadderpy/gui/plugindialog.py | 2 +- .../padder/spadderpy/plugin/CMakeLists.txt | 2 +- .../padder/spadderpy/plugin/envPlugins.sh.in | 2 +- .../padder/spadderpy/plugin/spadderPlugin.py | 2 +- src/Tools/padder/unittests/CMakeLists.txt | 2 +- src/Tools/padder/unittests/__init__.py | 2 +- src/Tools/padder/unittests/autotest.sh.in | 2 +- .../unittests/usecase_meshJobManager.py | 2 +- .../unittests/usecase_spadderPluginTester.py | 2 +- src/Tools/smesh_plugins.py | 2 +- 990 files changed, 1104 insertions(+), 1705 deletions(-) delete mode 100644 AUTHORS delete mode 100644 INSTALL delete mode 100644 LICENCE delete mode 100644 NEWS delete mode 100644 cvs-tags delete mode 100644 src/Tools/Verima/Doc/conf.py diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index e69de29bb..000000000 diff --git a/CMakeLists.txt b/CMakeLists.txt index 312c48e84..89369d158 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2012-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2012-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/INSTALL b/INSTALL deleted file mode 100644 index 0ea0b81cb..000000000 --- a/INSTALL +++ /dev/null @@ -1 +0,0 @@ -SALOME2 : SMESH module diff --git a/LICENCE b/LICENCE deleted file mode 100644 index b1e3f5a26..000000000 --- a/LICENCE +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/NEWS b/NEWS deleted file mode 100644 index e69de29bb..000000000 diff --git a/README b/README index e69de29bb..78f5c9b6f 100644 --- a/README +++ b/README @@ -0,0 +1,119 @@ +***************** +About SALOME Mesh +***************** + +SALOME Mesh module implements the functionalities for: +- Creating meshes in different ways: + * By meshing geometrical models previously created or imported by the Geometry + component; + * Bottom-up, using mesh edition operations, especially extrusion and revolution; + * By generation of the 3D mesh from the 2D mesh (the latter can be either imported + or manually created). +- Importing and exporting meshes in various formats. +- Modifying meshes with a vast array of dedicated operations. +- Creating groups of mesh elements. +- Filtering mesh entities (nodes or elements) using Filters functionality for + creating groups and applying mesh modifications. +- Viewing meshes in the VTK viewer and getting info on mesh and its sub-objects. +- Applying to meshes Quality Controls, allowing to highlight important elements. +- Taking various measurements of the mesh objects. + +For more information please visit the SALOME platform web site: + + + +======= +License +======= + +SALOME platform is distributed under the GNU Lesser General Public License. +See COPYING file for more details. + +Also, additional information can be found at SALOME platform web site: + + + +============ +Installation +============ + +-------------- +Pre-requisites +-------------- + +SALOME platform relies on a set of third-party softwares; some of them are needed +at build time only, while other ones are needed in runtime also. + +For more information about the pre-requisites please visit SALOME platform web +site: + +* Check Release Notes and Software Requirements of the latest SALOME release at + + + +* Pre-requisites page at SALOME web site: + + + +Note: SALOME Mesh module needs SALOME KERNEL, SALOME GUI and SALOME Geometry as +pre-requisites. + +------------------ +Basic Installation +------------------ + +The build procedure of the SALOME platform is implemented with CMake. +In order to build the module you have to do the following actions: + +1. Set up environment for pre-requisites (see "Pre-requisites" section above). + +2. Create a build directory: + + % mkdir SMESH_BUILD + +3. Configure the build procedure: + + % cd SMESH_BUILD + % cmake -DCMAKE_BUILD_TYPE= -DCMAKE_INSTALL_PREFIX= + + where + - is either Release or Debug (default: Release); + - is a destination folder to install SALOME Mesh + module (default: /usr); + - is a path to the SALOME Mesh sources directory. + + Note: by default (if CMAKE_INSTALL_PREFIX option is not given), SALOME Mesh + module will be configured for installation to the /usr directory that requires + root permissions to complete the installation. + +4. Build and install: + + % make + % make install + + This will install SALOME Mesh module to the + specified to cmake command on the previous step. + +------------------- +Custom installation +------------------- + +SALOME Mesh module supports a set of advanced configuration options; +for more details learn CMakeLists.txt file in the root source directory. + +You can also use other options of cmake command to customize your installation. +Learn more about available options by typing + + % cmake --help + +============= +Documentation +============= + +The directory doc contains additional documentation file of SALOME Mesh module. + +=============== +Troubleshooting +=============== + +Please, send a mail to webmaster.salome@opencascade.com. diff --git a/SMESH_version.h.in b/SMESH_version.h.in index 79e9367d3..b12be09f3 100644 --- a/SMESH_version.h.in +++ b/SMESH_version.h.in @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/SalomeSMESHConfig.cmake.in b/SalomeSMESHConfig.cmake.in index 3ec182cbe..5b4233425 100644 --- a/SalomeSMESHConfig.cmake.in +++ b/SalomeSMESHConfig.cmake.in @@ -5,7 +5,7 @@ # ############################################################### -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/adm_local/CMakeLists.txt b/adm_local/CMakeLists.txt index 3f181513f..4150922ef 100755 --- a/adm_local/CMakeLists.txt +++ b/adm_local/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/adm_local/cmake_files/CMakeLists.txt b/adm_local/cmake_files/CMakeLists.txt index 9be31435b..e38f32ae0 100755 --- a/adm_local/cmake_files/CMakeLists.txt +++ b/adm_local/cmake_files/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2012-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2012-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/adm_local/cmake_files/FindCGNS.cmake b/adm_local/cmake_files/FindCGNS.cmake index 94535f27e..a60b77637 100644 --- a/adm_local/cmake_files/FindCGNS.cmake +++ b/adm_local/cmake_files/FindCGNS.cmake @@ -5,7 +5,7 @@ # ######################################################################### -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/adm_local/cmake_files/FindSMESH.cmake b/adm_local/cmake_files/FindSMESH.cmake index e05012824..9a4ba3c87 100644 --- a/adm_local/cmake_files/FindSMESH.cmake +++ b/adm_local/cmake_files/FindSMESH.cmake @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/adm_local/cmake_files/FindSalomeCGNS.cmake b/adm_local/cmake_files/FindSalomeCGNS.cmake index a49239168..c3cf74565 100644 --- a/adm_local/cmake_files/FindSalomeCGNS.cmake +++ b/adm_local/cmake_files/FindSalomeCGNS.cmake @@ -1,4 +1,4 @@ -# Copyright (C) 2013-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2013-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/adm_local/cmake_files/FindSalomeSMESH.cmake b/adm_local/cmake_files/FindSalomeSMESH.cmake index dc63bd2fa..da6fbd6ee 100644 --- a/adm_local/cmake_files/FindSalomeSMESH.cmake +++ b/adm_local/cmake_files/FindSalomeSMESH.cmake @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/adm_local/cmake_files/FindSalomeTBB.cmake b/adm_local/cmake_files/FindSalomeTBB.cmake index 0fc8270ee..5934aa531 100644 --- a/adm_local/cmake_files/FindSalomeTBB.cmake +++ b/adm_local/cmake_files/FindSalomeTBB.cmake @@ -1,4 +1,4 @@ -# Copyright (C) 2013-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2013-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/adm_local/cmake_files/FindSalomef2c.cmake b/adm_local/cmake_files/FindSalomef2c.cmake index 4deefa22e..08f824b1c 100755 --- a/adm_local/cmake_files/FindSalomef2c.cmake +++ b/adm_local/cmake_files/FindSalomef2c.cmake @@ -1,4 +1,4 @@ -# Copyright (C) 2013-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2013-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/adm_local/cmake_files/FindTBB.cmake b/adm_local/cmake_files/FindTBB.cmake index a1592539f..0f4077fa7 100644 --- a/adm_local/cmake_files/FindTBB.cmake +++ b/adm_local/cmake_files/FindTBB.cmake @@ -5,7 +5,7 @@ # ######################################################################### -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/adm_local/cmake_files/Findf2c.cmake b/adm_local/cmake_files/Findf2c.cmake index 8510af1c7..08a131cda 100755 --- a/adm_local/cmake_files/Findf2c.cmake +++ b/adm_local/cmake_files/Findf2c.cmake @@ -6,7 +6,7 @@ # ######################################################################### -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/adm_local/unix/CMakeLists.txt b/adm_local/unix/CMakeLists.txt index 0e7521931..b27faef5b 100755 --- a/adm_local/unix/CMakeLists.txt +++ b/adm_local/unix/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2012-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2012-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/adm_local/unix/config_files/CMakeLists.txt b/adm_local/unix/config_files/CMakeLists.txt index 28926ce57..8d31a490e 100755 --- a/adm_local/unix/config_files/CMakeLists.txt +++ b/adm_local/unix/config_files/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/adm_local/unix/config_files/check_Platform.m4 b/adm_local/unix/config_files/check_Platform.m4 index 37cb27288..6a6fd4ca8 100755 --- a/adm_local/unix/config_files/check_Platform.m4 +++ b/adm_local/unix/config_files/check_Platform.m4 @@ -1,4 +1,4 @@ -dnl Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +dnl Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE dnl dnl Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/adm_local/unix/config_files/check_SMESH.m4 b/adm_local/unix/config_files/check_SMESH.m4 index 189e12c85..bd2cb2208 100644 --- a/adm_local/unix/config_files/check_SMESH.m4 +++ b/adm_local/unix/config_files/check_SMESH.m4 @@ -1,4 +1,4 @@ -dnl Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +dnl Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE dnl dnl Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/adm_local/unix/config_files/check_cgal.m4 b/adm_local/unix/config_files/check_cgal.m4 index 3f5d6b0eb..780f24bc2 100644 --- a/adm_local/unix/config_files/check_cgal.m4 +++ b/adm_local/unix/config_files/check_cgal.m4 @@ -1,4 +1,4 @@ -dnl Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +dnl Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE dnl dnl Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/adm_local/unix/config_files/check_cgns.m4 b/adm_local/unix/config_files/check_cgns.m4 index 27d5741bc..3dfd6cf53 100644 --- a/adm_local/unix/config_files/check_cgns.m4 +++ b/adm_local/unix/config_files/check_cgns.m4 @@ -1,4 +1,4 @@ -dnl Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +dnl Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE dnl dnl Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/adm_local/unix/config_files/check_f77.m4 b/adm_local/unix/config_files/check_f77.m4 index 9c74dee19..7c0906ead 100644 --- a/adm_local/unix/config_files/check_f77.m4 +++ b/adm_local/unix/config_files/check_f77.m4 @@ -1,4 +1,4 @@ -dnl Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +dnl Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE dnl dnl Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/adm_local/unix/config_files/check_padder.m4 b/adm_local/unix/config_files/check_padder.m4 index 5c65463f2..f4a9fdc78 100644 --- a/adm_local/unix/config_files/check_padder.m4 +++ b/adm_local/unix/config_files/check_padder.m4 @@ -1,4 +1,4 @@ -dnl Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +dnl Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE dnl dnl Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/adm_local/unix/config_files/check_qwt.m4 b/adm_local/unix/config_files/check_qwt.m4 index 43595035b..8c0fe5f73 100644 --- a/adm_local/unix/config_files/check_qwt.m4 +++ b/adm_local/unix/config_files/check_qwt.m4 @@ -1,4 +1,4 @@ -dnl Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +dnl Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE dnl dnl Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/bin/CMakeLists.txt b/bin/CMakeLists.txt index 1b651f73d..a60ce61e1 100755 --- a/bin/CMakeLists.txt +++ b/bin/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2012-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2012-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/bin/smesh_setenv.py b/bin/smesh_setenv.py index bdb3afd23..8c888cb9e 100644 --- a/bin/smesh_setenv.py +++ b/bin/smesh_setenv.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/cvs-tags b/cvs-tags deleted file mode 100644 index 6991d061f..000000000 --- a/cvs-tags +++ /dev/null @@ -1,35 +0,0 @@ -Start-v1_1a: ? - ? - -V1_2_1: ? - ? - -V1_2_2: 2003-09-26 17:00 - New data structure in SMDS. - -nadir_1_2_2: 2003-10-06 12:50 - Branch after V1_2_2. Developpement branch for user nadir - -merge_1_2_c__1_2_2: 2003-10-17 14:35 - Branch after V1_2_2. Branch to merge Salome 1.2c. Initiated by Paul Rascle. - -MergeV1_2c-1: 2003-10-19 13:49 - End of merge_1_2_c__1_2_2 branch. This branch is ready to be merge with the head. - -V1_3_0b1: 2003-11-12 - First pre-release of 1.3.0. Include the merge of 1.2c branch. - -nadir_update_MED_v1_3_0: 2003-11-17 10:22 - New branch for user nadir. Synchronization of API with MED 1.3. - -V1_3_0b2: 2003-11-18 - Second pre-release of 1.3.0. Synchronization of API with MED 1.3. - -V1_3_0: 2003-11-25 08:52 - Release 1.3.0. - -V1_3_1: 2004-01-05 14:28 - Release 1.3.1. Added Netgen. - -merge_1_2_d: 2003-01-20 11:25 - Branch to merge Release 1.2d of Salome Pro. diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 8bfe7cab7..beddf10e4 100755 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/doc/salome/CMakeLists.txt b/doc/salome/CMakeLists.txt index 1ccad11e2..88fb17859 100755 --- a/doc/salome/CMakeLists.txt +++ b/doc/salome/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/doc/salome/examples/CMakeLists.txt b/doc/salome/examples/CMakeLists.txt index 65d8e52e2..942c3b023 100644 --- a/doc/salome/examples/CMakeLists.txt +++ b/doc/salome/examples/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2012-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2012-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/doc/salome/examples/CTestTestfileInstall.cmake b/doc/salome/examples/CTestTestfileInstall.cmake index ef512ff06..d56f42065 100644 --- a/doc/salome/examples/CTestTestfileInstall.cmake +++ b/doc/salome/examples/CTestTestfileInstall.cmake @@ -1,4 +1,4 @@ -# Copyright (C) 2015 CEA/DEN, EDF R&D +# Copyright (C) 2015-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/doc/salome/examples/testme.py b/doc/salome/examples/testme.py index cd74c4495..6a502d00d 100755 --- a/doc/salome/examples/testme.py +++ b/doc/salome/examples/testme.py @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/doc/salome/gui/CMakeLists.txt b/doc/salome/gui/CMakeLists.txt index 1a8d6cf4d..07de864c8 100755 --- a/doc/salome/gui/CMakeLists.txt +++ b/doc/salome/gui/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/doc/salome/gui/SMESH/CMakeLists.txt b/doc/salome/gui/SMESH/CMakeLists.txt index a221bbfe8..1dfd05b52 100644 --- a/doc/salome/gui/SMESH/CMakeLists.txt +++ b/doc/salome/gui/SMESH/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2012-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2012-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/doc/salome/gui/SMESH/collect_mesh_methods.py b/doc/salome/gui/SMESH/collect_mesh_methods.py index 0d55a3c74..7aa83b084 100755 --- a/doc/salome/gui/SMESH/collect_mesh_methods.py +++ b/doc/salome/gui/SMESH/collect_mesh_methods.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: iso-8859-1 -*- -# Copyright (C) 2012-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2012-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/doc/salome/gui/SMESH/doxyfile.in b/doc/salome/gui/SMESH/doxyfile.in index 03d6398e0..6374b61b9 100755 --- a/doc/salome/gui/SMESH/doxyfile.in +++ b/doc/salome/gui/SMESH/doxyfile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/doc/salome/gui/SMESH/doxyfile_py.in b/doc/salome/gui/SMESH/doxyfile_py.in index 6cb04289b..d48007ab2 100755 --- a/doc/salome/gui/SMESH/doxyfile_py.in +++ b/doc/salome/gui/SMESH/doxyfile_py.in @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/doc/salome/gui/SMESH/static/footer.html b/doc/salome/gui/SMESH/static/footer.html index affd43d84..91afd6cc8 100755 --- a/doc/salome/gui/SMESH/static/footer.html +++ b/doc/salome/gui/SMESH/static/footer.html @@ -4,7 +4,7 @@
      $navpath
    diff --git a/doc/salome/tui/CMakeLists.txt b/doc/salome/tui/CMakeLists.txt index 6112e4024..c24a1eaeb 100755 --- a/doc/salome/tui/CMakeLists.txt +++ b/doc/salome/tui/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/doc/salome/tui/doxyfile.in b/doc/salome/tui/doxyfile.in index 3b002f990..654668715 100755 --- a/doc/salome/tui/doxyfile.in +++ b/doc/salome/tui/doxyfile.in @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/doc/salome/tui/static/footer.html b/doc/salome/tui/static/footer.html index affd43d84..91afd6cc8 100755 --- a/doc/salome/tui/static/footer.html +++ b/doc/salome/tui/static/footer.html @@ -4,7 +4,7 @@
      $navpath
    diff --git a/idl/CMakeLists.txt b/idl/CMakeLists.txt index 92bfcc47e..4122cf306 100755 --- a/idl/CMakeLists.txt +++ b/idl/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2012-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2012-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public diff --git a/idl/SMESH_BasicHypothesis.idl b/idl/SMESH_BasicHypothesis.idl index 62e4ed488..a6a0fef9f 100644 --- a/idl/SMESH_BasicHypothesis.idl +++ b/idl/SMESH_BasicHypothesis.idl @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/idl/SMESH_Filter.idl b/idl/SMESH_Filter.idl index 738aa325e..7625bba24 100644 --- a/idl/SMESH_Filter.idl +++ b/idl/SMESH_Filter.idl @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/idl/SMESH_Gen.idl b/idl/SMESH_Gen.idl index ec43ae714..75fbe0894 100644 --- a/idl/SMESH_Gen.idl +++ b/idl/SMESH_Gen.idl @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/idl/SMESH_Group.idl b/idl/SMESH_Group.idl index bdc3d6312..e5e533d18 100644 --- a/idl/SMESH_Group.idl +++ b/idl/SMESH_Group.idl @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/idl/SMESH_Hypothesis.idl b/idl/SMESH_Hypothesis.idl index ab6e7dd43..397079a96 100644 --- a/idl/SMESH_Hypothesis.idl +++ b/idl/SMESH_Hypothesis.idl @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/idl/SMESH_Measurements.idl b/idl/SMESH_Measurements.idl index 2da555d91..cb6d68acf 100644 --- a/idl/SMESH_Measurements.idl +++ b/idl/SMESH_Measurements.idl @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/idl/SMESH_Mesh.idl b/idl/SMESH_Mesh.idl index 9ede0252f..51c98282c 100644 --- a/idl/SMESH_Mesh.idl +++ b/idl/SMESH_Mesh.idl @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/idl/SMESH_MeshEditor.idl b/idl/SMESH_MeshEditor.idl index b28fb1432..28bc6f912 100644 --- a/idl/SMESH_MeshEditor.idl +++ b/idl/SMESH_MeshEditor.idl @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/idl/SMESH_Pattern.idl b/idl/SMESH_Pattern.idl index 8799f2739..4e3b37f40 100644 --- a/idl/SMESH_Pattern.idl +++ b/idl/SMESH_Pattern.idl @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt index 66f426f00..9975b95b2 100755 --- a/resources/CMakeLists.txt +++ b/resources/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS diff --git a/resources/SMESHCatalog.xml.in b/resources/SMESHCatalog.xml.in index 429d96009..a1d573d7f 100644 --- a/resources/SMESHCatalog.xml.in +++ b/resources/SMESHCatalog.xml.in @@ -1,6 +1,6 @@ tetrahedron - if (nbRepl == 3 && - iRepl[ 0 ] > 2 && iRepl[ 1 ] > 2 && iRepl[ 2 ] > 2 ) { - // all top nodes stick: reverse a bottom - uniqueNodes[ 0 ] = curNodes [ 1 ]; - uniqueNodes[ 1 ] = curNodes [ 0 ]; + if ( curNodes[3] == curNodes[4] && + curNodes[3] == curNodes[5] ) { + // top nodes stick + isOk = true; } - else if (nbRepl == 3 && - iRepl[ 0 ] < 3 && iRepl[ 1 ] < 3 && iRepl[ 2 ] < 3 ) { - // all bottom nodes stick: set a top before + else if ( curNodes[0] == curNodes[1] && + curNodes[0] == curNodes[2] ) { + // bottom nodes stick: set a top before uniqueNodes[ 3 ] = uniqueNodes [ 0 ]; - uniqueNodes[ 0 ] = curNodes [ 3 ]; + uniqueNodes[ 0 ] = curNodes [ 5 ]; uniqueNodes[ 1 ] = curNodes [ 4 ]; - uniqueNodes[ 2 ] = curNodes [ 5 ]; + uniqueNodes[ 2 ] = curNodes [ 3 ]; + isOk = true; } - else if (nbRepl == 4 && - iRepl[ 2 ] - iRepl [ 0 ] == 3 && iRepl[ 3 ] - iRepl [ 1 ] == 3 ) { - // a lateral face turns into a line: reverse a bottom - uniqueNodes[ 0 ] = curNodes [ 1 ]; - uniqueNodes[ 1 ] = curNodes [ 0 ]; + else if (( curNodes[0] == curNodes[3] ) + + ( curNodes[1] == curNodes[4] ) + + ( curNodes[2] == curNodes[5] ) == 2 ) { + // a lateral face turns into a line + isOk = true; } - else - isOk = false; } else if ( nbUniqueNodes == 5 ) { - // PENTAHEDRON --------------------> 2 tetrahedrons - if ( nbRepl == 2 && iRepl[ 1 ] - iRepl [ 0 ] == 3 ) { - // a bottom node sticks with a linked top one - // 1. - SMDS_MeshElement* newElem = - aMesh->AddVolume(curNodes[ 3 ], - curNodes[ 4 ], - curNodes[ 5 ], - curNodes[ iRepl[ 0 ] == 2 ? 1 : 2 ]); - myLastCreatedElems.Append(newElem); - if ( aShapeId ) - aMesh->SetMeshElementOnShape( newElem, aShapeId ); - // 2. : reverse a bottom - uniqueNodes[ 0 ] = curNodes [ 1 ]; - uniqueNodes[ 1 ] = curNodes [ 0 ]; - nbUniqueNodes = 4; + // PENTAHEDRON --------------------> pyramid + if ( curNodes[0] == curNodes[3] ) + { + uniqueNodes[ 0 ] = curNodes[ 1 ]; + uniqueNodes[ 1 ] = curNodes[ 4 ]; + uniqueNodes[ 2 ] = curNodes[ 5 ]; + uniqueNodes[ 3 ] = curNodes[ 2 ]; + uniqueNodes[ 4 ] = curNodes[ 0 ]; + isOk = true; + } + if ( curNodes[1] == curNodes[4] ) + { + uniqueNodes[ 0 ] = curNodes[ 0 ]; + uniqueNodes[ 1 ] = curNodes[ 2 ]; + uniqueNodes[ 2 ] = curNodes[ 5 ]; + uniqueNodes[ 3 ] = curNodes[ 3 ]; + uniqueNodes[ 4 ] = curNodes[ 1 ]; + isOk = true; + } + if ( curNodes[2] == curNodes[5] ) + { + uniqueNodes[ 0 ] = curNodes[ 0 ]; + uniqueNodes[ 1 ] = curNodes[ 3 ]; + uniqueNodes[ 2 ] = curNodes[ 4 ]; + uniqueNodes[ 3 ] = curNodes[ 1 ]; + uniqueNodes[ 4 ] = curNodes[ 2 ]; + isOk = true; } - else - isOk = false; } - else - isOk = false; break; - case 8: { - if(elem->IsQuadratic()) { // Quadratic quadrangle - // 1 5 2 - // +---+---+ - // | | - // | | - // 4+ +6 - // | | - // | | - // +---+---+ - // 0 7 3 - isOk = false; - if(nbRepl==2) { - MESSAGE("nbRepl=2: " << iRepl[0] << " " << iRepl[1]); - } - if(nbRepl==3) { - MESSAGE("nbRepl=3: " << iRepl[0] << " " << iRepl[1] << " " << iRepl[2]); - nbUniqueNodes = 6; - if( iRepl[0]==0 && iRepl[1]==1 && iRepl[2]==4 ) { - uniqueNodes[0] = curNodes[0]; - uniqueNodes[1] = curNodes[2]; - uniqueNodes[2] = curNodes[3]; - uniqueNodes[3] = curNodes[5]; - uniqueNodes[4] = curNodes[6]; - uniqueNodes[5] = curNodes[7]; - isOk = true; - } - if( iRepl[0]==0 && iRepl[1]==3 && iRepl[2]==7 ) { - uniqueNodes[0] = curNodes[0]; - uniqueNodes[1] = curNodes[1]; - uniqueNodes[2] = curNodes[2]; - uniqueNodes[3] = curNodes[4]; - uniqueNodes[4] = curNodes[5]; - uniqueNodes[5] = curNodes[6]; - isOk = true; - } - if( iRepl[0]==0 && iRepl[1]==4 && iRepl[2]==7 ) { - uniqueNodes[0] = curNodes[1]; - uniqueNodes[1] = curNodes[2]; - uniqueNodes[2] = curNodes[3]; - uniqueNodes[3] = curNodes[5]; - uniqueNodes[4] = curNodes[6]; - uniqueNodes[5] = curNodes[0]; - isOk = true; - } - if( iRepl[0]==1 && iRepl[1]==2 && iRepl[2]==5 ) { - uniqueNodes[0] = curNodes[0]; - uniqueNodes[1] = curNodes[1]; - uniqueNodes[2] = curNodes[3]; - uniqueNodes[3] = curNodes[4]; - uniqueNodes[4] = curNodes[6]; - uniqueNodes[5] = curNodes[7]; - isOk = true; - } - if( iRepl[0]==1 && iRepl[1]==4 && iRepl[2]==5 ) { - uniqueNodes[0] = curNodes[0]; - uniqueNodes[1] = curNodes[2]; - uniqueNodes[2] = curNodes[3]; - uniqueNodes[3] = curNodes[1]; - uniqueNodes[4] = curNodes[6]; - uniqueNodes[5] = curNodes[7]; - isOk = true; - } - if( iRepl[0]==2 && iRepl[1]==3 && iRepl[2]==6 ) { - uniqueNodes[0] = curNodes[0]; - uniqueNodes[1] = curNodes[1]; - uniqueNodes[2] = curNodes[2]; - uniqueNodes[3] = curNodes[4]; - uniqueNodes[4] = curNodes[5]; - uniqueNodes[5] = curNodes[7]; - isOk = true; - } - if( iRepl[0]==2 && iRepl[1]==5 && iRepl[2]==6 ) { - uniqueNodes[0] = curNodes[0]; - uniqueNodes[1] = curNodes[1]; - uniqueNodes[2] = curNodes[3]; - uniqueNodes[3] = curNodes[4]; - uniqueNodes[4] = curNodes[2]; - uniqueNodes[5] = curNodes[7]; - isOk = true; - } - if( iRepl[0]==3 && iRepl[1]==6 && iRepl[2]==7 ) { - uniqueNodes[0] = curNodes[0]; - uniqueNodes[1] = curNodes[1]; - uniqueNodes[2] = curNodes[2]; - uniqueNodes[3] = curNodes[4]; - uniqueNodes[4] = curNodes[5]; - uniqueNodes[5] = curNodes[3]; - isOk = true; - } - } - if(nbRepl==4) { - MESSAGE("nbRepl=4: " << iRepl[0] << " " << iRepl[1] << " " << iRepl[2] << " " << iRepl[3]); - } - if(nbRepl==5) { - MESSAGE("nbRepl=5: " << iRepl[0] << " " << iRepl[1] << " " << iRepl[2] << " " << iRepl[3] << " " << iRepl[4]); - } - break; - } + } + case SMDSEntity_Hexa: + { //////////////////////////////////// HEXAHEDRON isOk = false; SMDS_VolumeTool hexa (elem); hexa.SetExternalNormal(); if ( nbUniqueNodes == 4 && nbRepl == 4 ) { - //////////////////////// HEX ---> 1 tetrahedron + //////////////////////// HEX ---> tetrahedron for ( int iFace = 0; iFace < 6; iFace++ ) { const int *ind = hexa.GetFaceNodesIndices( iFace ); // indices of face nodes if (curNodes[ind[ 0 ]] == curNodes[ind[ 1 ]] && curNodes[ind[ 0 ]] == curNodes[ind[ 2 ]] && curNodes[ind[ 0 ]] == curNodes[ind[ 3 ]] ) { // one face turns into a point ... + int pickInd = ind[ 0 ]; int iOppFace = hexa.GetOppFaceIndex( iFace ); ind = hexa.GetFaceNodesIndices( iOppFace ); int nbStick = 0; + uniqueNodes.clear(); for ( iCur = 0; iCur < 4 && nbStick < 2; iCur++ ) { if ( curNodes[ind[ iCur ]] == curNodes[ind[ iCur + 1 ]] ) nbStick++; + else + uniqueNodes.push_back( curNodes[ind[ iCur ]]); } if ( nbStick == 1 ) { // ... and the opposite one - into a triangle. // set a top node - ind = hexa.GetFaceNodesIndices( iFace ); - uniqueNodes[ 3 ] = curNodes[ind[ 0 ]]; + uniqueNodes.push_back( curNodes[ pickInd ]); isOk = true; } break; @@ -7697,7 +7633,7 @@ void SMESH_MeshEditor::MergeNodes (TListOfListOfNodes & theGroupsOfNodes) } } else if ( nbUniqueNodes == 6 && nbRepl == 2 ) { - //////////////////////// HEX ---> 1 prism + //////////////////////// HEX ---> prism int nbTria = 0, iTria[3]; const int *ind; // indices of face nodes // look for triangular faces @@ -7712,7 +7648,6 @@ void SMESH_MeshEditor::MergeNodes (TListOfListOfNodes & theGroupsOfNodes) // check if triangles are opposite if ( nbTria == 2 && iTria[0] == hexa.GetOppFaceIndex( iTria[1] )) { - isOk = true; // set nodes of the bottom triangle ind = hexa.GetFaceNodesIndices( iTria[ 0 ]); vector indB; @@ -7732,11 +7667,12 @@ void SMESH_MeshEditor::MergeNodes (TListOfListOfNodes & theGroupsOfNodes) uniqueNodes[ iCur + 3 ] = curNodes[ indT[ j ]]; break; } + isOk = true; + break; } - break; } - else if (nbUniqueNodes == 5 && nbRepl == 4 ) { - //////////////////// HEXAHEDRON ---> 2 tetrahedrons + else if (nbUniqueNodes == 5 && nbRepl == 3 ) { + //////////////////// HEXAHEDRON ---> pyramid for ( int iFace = 0; iFace < 6; iFace++ ) { const int *ind = hexa.GetFaceNodesIndices( iFace ); // indices of face nodes if (curNodes[ind[ 0 ]] == curNodes[ind[ 1 ]] && @@ -7745,139 +7681,61 @@ void SMESH_MeshEditor::MergeNodes (TListOfListOfNodes & theGroupsOfNodes) // one face turns into a point ... int iOppFace = hexa.GetOppFaceIndex( iFace ); ind = hexa.GetFaceNodesIndices( iOppFace ); - int nbStick = 0; - iUnique = 2; // reverse a tetrahedron 1 bottom - for ( iCur = 0; iCur < 4 && nbStick == 0; iCur++ ) { + uniqueNodes.clear(); + for ( iCur = 0; iCur < 4; iCur++ ) { if ( curNodes[ind[ iCur ]] == curNodes[ind[ iCur + 1 ]] ) - nbStick++; - else if ( iUnique >= 0 ) - uniqueNodes[ iUnique-- ] = curNodes[ind[ iCur ]]; + break; + else + uniqueNodes.push_back( curNodes[ind[ iCur ]]); } - if ( nbStick == 0 ) { + if ( uniqueNodes.size() == 4 ) { // ... and the opposite one is a quadrangle // set a top node const int* indTop = hexa.GetFaceNodesIndices( iFace ); - uniqueNodes[ 3 ] = curNodes[indTop[ 0 ]]; - nbUniqueNodes = 4; - // tetrahedron 2 - SMDS_MeshElement* newElem = - aMesh->AddVolume(curNodes[ind[ 0 ]], - curNodes[ind[ 3 ]], - curNodes[ind[ 2 ]], - curNodes[indTop[ 0 ]]); - myLastCreatedElems.Append(newElem); - if ( aShapeId ) - aMesh->SetMeshElementOnShape( newElem, aShapeId ); + uniqueNodes.push_back( curNodes[indTop[ 0 ]]); isOk = true; } break; } } } - else if ( nbUniqueNodes == 6 && nbRepl == 4 ) { - ////////////////// HEXAHEDRON ---> 2 tetrahedrons or 1 prism - // find indices of quad and tri faces - int iQuadFace[ 6 ], iTriFace[ 6 ], nbQuad = 0, nbTri = 0, iFace; - for ( iFace = 0; iFace < 6; iFace++ ) { + + if ( !isOk && nbUniqueNodes > 4 ) { + ////////////////// HEXAHEDRON ---> polyhedron + hexa.SetExternalNormal(); + vector poly_nodes; poly_nodes.reserve( 6 * 4 ); + vector quantities; quantities.reserve( 6 ); + for ( int iFace = 0; iFace < 6; iFace++ ) + { const int *ind = hexa.GetFaceNodesIndices( iFace ); // indices of face nodes + if ( curNodes[ind[0]] == curNodes[ind[2]] || + curNodes[ind[1]] == curNodes[ind[3]] ) + { + quantities.clear(); + break; // opposite nodes stick + } nodeSet.clear(); for ( iCur = 0; iCur < 4; iCur++ ) - nodeSet.insert( curNodes[ind[ iCur ]] ); - nbUniqueNodes = nodeSet.size(); - if ( nbUniqueNodes == 3 ) - iTriFace[ nbTri++ ] = iFace; - else if ( nbUniqueNodes == 4 ) - iQuadFace[ nbQuad++ ] = iFace; + { + if ( nodeSet.insert( curNodes[ind[ iCur ]] ).second ) + poly_nodes.push_back( curNodes[ind[ iCur ]]); + } + if ( nodeSet.size() < 3 ) + poly_nodes.resize( poly_nodes.size() - nodeSet.size() ); + else + quantities.push_back( nodeSet.size() ); } - if (nbQuad == 2 && nbTri == 4 && - hexa.GetOppFaceIndex( iQuadFace[ 0 ] ) == iQuadFace[ 1 ]) { - // 2 opposite quadrangles stuck with a diagonal; - // sample groups of merged indices: (0-4)(2-6) - // --------------------------------------------> 2 tetrahedrons - const int *ind1 = hexa.GetFaceNodesIndices( iQuadFace[ 0 ]); // indices of quad1 nodes - const int *ind2 = hexa.GetFaceNodesIndices( iQuadFace[ 1 ]); - int i0, i1d, i2, i3d, i0t, i2t; // d-daigonal, t-top - if (curNodes[ind1[ 0 ]] == curNodes[ind2[ 0 ]] && - curNodes[ind1[ 2 ]] == curNodes[ind2[ 2 ]]) { - // stuck with 0-2 diagonal - i0 = ind1[ 3 ]; - i1d = ind1[ 0 ]; - i2 = ind1[ 1 ]; - i3d = ind1[ 2 ]; - i0t = ind2[ 1 ]; - i2t = ind2[ 3 ]; - } - else if (curNodes[ind1[ 1 ]] == curNodes[ind2[ 3 ]] && - curNodes[ind1[ 3 ]] == curNodes[ind2[ 1 ]]) { - // stuck with 1-3 diagonal - i0 = ind1[ 0 ]; - i1d = ind1[ 1 ]; - i2 = ind1[ 2 ]; - i3d = ind1[ 3 ]; - i0t = ind2[ 0 ]; - i2t = ind2[ 1 ]; - } - else { - ASSERT(0); - } - // tetrahedron 1 - uniqueNodes[ 0 ] = curNodes [ i0 ]; - uniqueNodes[ 1 ] = curNodes [ i1d ]; - uniqueNodes[ 2 ] = curNodes [ i3d ]; - uniqueNodes[ 3 ] = curNodes [ i0t ]; - nbUniqueNodes = 4; - // tetrahedron 2 - SMDS_MeshElement* newElem = aMesh->AddVolume(curNodes[ i1d ], - curNodes[ i2 ], - curNodes[ i3d ], - curNodes[ i2t ]); - myLastCreatedElems.Append(newElem); - if ( aShapeId ) + if ( quantities.size() >= 4 ) + { + const SMDS_MeshElement* newElem = aMesh->AddPolyhedralVolume( poly_nodes, quantities ); + myLastCreatedElems.Append( newElem ); + if ( aShapeId && newElem ) aMesh->SetMeshElementOnShape( newElem, aShapeId ); - isOk = true; + rmElemIds.push_back( elem->GetID() ); } - else if (( nbTri == 2 && nbQuad == 3 ) || // merged (0-4)(1-5) - ( nbTri == 4 && nbQuad == 2 )) { // merged (7-4)(1-5) - // --------------------------------------------> prism - // find 2 opposite triangles - nbUniqueNodes = 6; - for ( iFace = 0; iFace + 1 < nbTri; iFace++ ) { - if ( hexa.GetOppFaceIndex( iTriFace[ iFace ] ) == iTriFace[ iFace + 1 ]) { - // find indices of kept and replaced nodes - // and fill unique nodes of 2 opposite triangles - const int *ind1 = hexa.GetFaceNodesIndices( iTriFace[ iFace ]); - const int *ind2 = hexa.GetFaceNodesIndices( iTriFace[ iFace + 1 ]); - const SMDS_MeshNode** hexanodes = hexa.GetNodes(); - // fill unique nodes - iUnique = 0; - isOk = true; - for ( iCur = 0; iCur < 4 && isOk; iCur++ ) { - const SMDS_MeshNode* n = curNodes[ind1[ iCur ]]; - const SMDS_MeshNode* nInit = hexanodes[ind1[ iCur ]]; - if ( n == nInit ) { - // iCur of a linked node of the opposite face (make normals co-directed): - int iCurOpp = ( iCur == 1 || iCur == 3 ) ? 4 - iCur : iCur; - // check that correspondent corners of triangles are linked - if ( !hexa.IsLinked( ind1[ iCur ], ind2[ iCurOpp ] )) - isOk = false; - else { - uniqueNodes[ iUnique ] = n; - uniqueNodes[ iUnique + 3 ] = curNodes[ind2[ iCurOpp ]]; - iUnique++; - } - } - } - break; - } - } - } - } // if ( nbUniqueNodes == 6 && nbRepl == 4 ) - else - { - MESSAGE("MergeNodes() removes hexahedron "<< elem); } break; - } // HEXAHEDRON + } // case HEXAHEDRON default: isOk = false; @@ -7885,7 +7743,7 @@ void SMESH_MeshEditor::MergeNodes (TListOfListOfNodes & theGroupsOfNodes) } // if ( nbNodes != nbUniqueNodes ) // some nodes stick - if ( isOk ) // the non-poly elem remains valid after sticking nodes + if ( isOk ) // a non-poly elem remains valid after sticking nodes { if ( nbNodes != nbUniqueNodes || !aMesh->ChangeElementNodes( elem, & curNodes[0], nbNodes )) From 57cd3cc56534d233d9555650065507ff7f0972af Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 24 Mar 2016 20:12:07 +0300 Subject: [PATCH 19/22] 23068: [CEA 1505] Be able to keep meshing in 2D after having merged the nodes in 1D In SMESH_subMesh::ComputeStateEngine() transform errors into warnings if it is caused by mesh edition Regression of SALOME_TESTS/Grids/smesh/2D_submesh_00/A7 fix SMESH_subMesh::cleanDependsOn() Regression of SALOME_TESTS/Grids/smesh/imps_02/C4 fix getSubMeshes() in SMESH_subMesh_i.cxx and use it in all cases Regression SALOME_TESTS/Grids/smesh/mesh_Projection_2D_01/B1 In StdMeshers_Projection_2D treat coincident nodes in all cases --- src/SMESH/SMESH_subMesh.cxx | 91 +++++------ src/SMESH/SMESH_subMesh.hxx | 5 +- src/SMESH_I/SMESH_subMesh_i.cxx | 171 ++++---------------- src/StdMeshers/StdMeshers_Projection_2D.cxx | 9 +- 4 files changed, 80 insertions(+), 196 deletions(-) diff --git a/src/SMESH/SMESH_subMesh.cxx b/src/SMESH/SMESH_subMesh.cxx index 64ee5948d..9618871bd 100644 --- a/src/SMESH/SMESH_subMesh.cxx +++ b/src/SMESH/SMESH_subMesh.cxx @@ -241,7 +241,7 @@ bool SMESH_subMesh::IsMeshComputed() const { if ( _alwaysComputed ) return true; - // algo may bind a submesh not to _subShape, eg 3D algo + // algo may bind a sub-mesh not to _subShape, eg 3D algo // sets nodes on SHELL while _subShape may be SOLID SMESHDS_Mesh* meshDS = _father->GetMeshDS(); @@ -280,7 +280,7 @@ bool SMESH_subMesh::SubMeshesComputed(bool * isFailedToCompute/*=0*/) const int dimToCheck = myDim - 1; bool subMeshesComputed = true; if ( isFailedToCompute ) *isFailedToCompute = false; - // check subMeshes with upper dimension => reverse iteration + // check sub-meshes with upper dimension => reverse iteration SMESH_subMeshIteratorPtr smIt = getDependsOnIterator(false,true); while ( smIt->more() ) { @@ -291,67 +291,22 @@ bool SMESH_subMesh::SubMeshesComputed(bool * isFailedToCompute/*=0*/) const // MSV 07.04.2006: restrict checking to myDim-1 only. Ex., there is no sense // in checking of existence of edges if the algo needs only faces. Moreover, - // degenerated edges may have no submesh, as after computing NETGEN_2D. + // degenerated edges may have no sub-mesh, as after computing NETGEN_2D. if ( !_algo || _algo->NeedDiscreteBoundary() ) { int dim = SMESH_Gen::GetShapeDim( ss ); if (dim < dimToCheck) - break; // the rest subMeshes are all of less dimension + break; // the rest sub-meshes are all of less dimension } SMESHDS_SubMesh * ds = sm->GetSubMeshDS(); - bool computeOk = (sm->GetComputeState() == COMPUTE_OK || - (ds && ( dimToCheck ? ds->NbElements() : ds->NbNodes() ))); + bool computeOk = ((sm->GetComputeState() == COMPUTE_OK ) || + (ds && ( dimToCheck ? ds->NbElements() : ds->NbNodes() ))); if (!computeOk) { subMeshesComputed = false; + if ( isFailedToCompute && !(*isFailedToCompute) ) *isFailedToCompute = ( sm->GetComputeState() == FAILED_TO_COMPUTE ); - // int type = ss.ShapeType(); - - // switch (type) - // { - // case TopAbs_COMPOUND: - // { - // MESSAGE("The not computed sub mesh is a COMPOUND"); - // break; - // } - // case TopAbs_COMPSOLID: - // { - // MESSAGE("The not computed sub mesh is a COMPSOLID"); - // break; - // } - // case TopAbs_SHELL: - // { - // MESSAGE("The not computed sub mesh is a SHEL"); - // break; - // } - // case TopAbs_WIRE: - // { - // MESSAGE("The not computed sub mesh is a WIRE"); - // break; - // } - // case TopAbs_SOLID: - // { - // MESSAGE("The not computed sub mesh is a SOLID"); - // break; - // } - // case TopAbs_FACE: - // { - // MESSAGE("The not computed sub mesh is a FACE"); - // break; - // } - // case TopAbs_EDGE: - // { - // MESSAGE("The not computed sub mesh is a EDGE"); - // break; - // } - // default: - // { - // MESSAGE("The not computed sub mesh is of unknown type"); - // break; - // } - // } - if ( !isFailedToCompute ) break; } @@ -1254,7 +1209,7 @@ void SMESH_subMesh::cleanDependsOn( SMESH_Algo* algoRequiringCleaning/*=0*/ ) // remember all sub-meshes of sm if ( keepSubMeshes ) { - SMESH_subMeshIteratorPtr smIt2 = getDependsOnIterator(false); + SMESH_subMeshIteratorPtr smIt2 = sm->getDependsOnIterator(false); while ( smIt2->more() ) smToKeep.insert( smIt2->next() ); } @@ -1624,6 +1579,36 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event) _computeError.reset(); } + // transform errors into warnings if it is caused by mesh edition (imp 0023068) + if (!ret && _father->GetIsModified() ) + { + for (subS.ReInit(); subS.More(); subS.Next()) + { + SMESH_subMesh* sm = _father->GetSubMesh( subS.Current() ); + if ( !sm->IsMeshComputed() && sm->_computeError ) + { + // check if there is a VERTEX w/o nodes + // with READY_TO_COMPUTE state (after MergeNodes()) + SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(false,false); + while ( smIt->more() ) + { + SMESH_subMesh * vertSM = smIt->next(); + if ( vertSM->_subShape.ShapeType() != TopAbs_VERTEX ) break; + if ( vertSM->GetComputeState() == READY_TO_COMPUTE ) + { + SMESHDS_SubMesh * ds = vertSM->GetSubMeshDS(); + if ( !ds || ds->NbNodes() == 0 ) + { + sm->_computeState = READY_TO_COMPUTE; + sm->_computeError->myName = COMPERR_WARNING; + break; + } + } + } + } + } + } + // send event SUBMESH_COMPUTED if ( ret ) { if ( !algo->NeedDiscreteBoundary() ) diff --git a/src/SMESH/SMESH_subMesh.hxx b/src/SMESH/SMESH_subMesh.hxx index 331d70160..8de40d222 100644 --- a/src/SMESH/SMESH_subMesh.hxx +++ b/src/SMESH/SMESH_subMesh.hxx @@ -96,8 +96,7 @@ class SMESH_EXPORT SMESH_subMesh enum compute_state { - NOT_READY, READY_TO_COMPUTE, - COMPUTE_OK, FAILED_TO_COMPUTE + NOT_READY, READY_TO_COMPUTE, COMPUTE_OK, FAILED_TO_COMPUTE }; enum algo_state { @@ -123,7 +122,7 @@ class SMESH_EXPORT SMESH_subMesh }; // ================================================================== - // Members to track non hierarchical dependencies between submeshes + // Members to track non hierarchical dependencies between sub-meshes // ================================================================== /*! diff --git a/src/SMESH_I/SMESH_subMesh_i.cxx b/src/SMESH_I/SMESH_subMesh_i.cxx index 7f86e0ddc..a660013ed 100644 --- a/src/SMESH_I/SMESH_subMesh_i.cxx +++ b/src/SMESH_I/SMESH_subMesh_i.cxx @@ -29,14 +29,13 @@ #include "SMESH_Gen_i.hxx" #include "SMESH_Mesh_i.hxx" #include "SMESH_PreMeshInfo.hxx" +#include "SMESH_MesherHelper.hxx" #include "Utils_CorbaException.hxx" #include "utilities.h" #include "OpUtil.hxx" #include "Utils_ExceptHandlers.hxx" -#include -#include #include using namespace std; @@ -97,99 +96,37 @@ bool getSubMeshes(::SMESH_subMesh* theSubMesh, { size_t size = theSubMeshList.size(); - SMESH_Mesh* aMesh = theSubMesh->GetFather(); - SMESHDS_Mesh* aMeshDS = aMesh->GetMeshDS(); - SMESHDS_SubMesh* aSubMeshDS = theSubMesh->GetSubMeshDS(); - ::SMESH_subMesh* sm; + // check all child sub-meshes of one complexity, + // if no elements found and no algo assigned, go to children of lower complexity - // nodes can be bound to either vertex, edge, face or solid_or_shell - TopoDS_Shape aShape = theSubMesh->GetSubShape(); - TopAbs_ShapeEnum aShapeType = aShape.ShapeType(); - - // IPAL18558: Wrong information of the created sub-mesh is shown. (Sub-mesh on a FACE - // with only 1D algo assigned) - // Find dimension of sub-meshes to return as highest dimension of the assigned algorithm - if (( theSubMesh->IsEmpty() || ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() )) && - ( !theSubMesh->GetAlgo() )) + TopoDS_Shape shape = theSubMesh->GetSubShape(); + TopAbs_ShapeEnum mainType = SMESH_MesherHelper::GetGroupType( shape, /*noCompound=*/true ); + TopAbs_ShapeEnum shapeType = shape.ShapeType(); + bool elementsFound = false; + bool algoFound = false; + SMESH_subMeshIteratorPtr smIt = theSubMesh->getDependsOnIterator(/*includeSelf=*/true, + /*complexFirst=*/true); + while ( smIt->more() ) { - // on father sub-meshes, check presence of an algo which will mesh this sub-mesh - // even if no algo is assigned to this sub-mesh - bool topAlgoPresent = false; - TopTools_ListIteratorOfListOfShape ancestors( aMesh->GetAncestors( aShape )); - for ( ; ancestors.More() && !topAlgoPresent; ancestors.Next() ) - if (( sm = aMesh->GetSubMeshContaining( ancestors.Value() ))) - topAlgoPresent = ( sm->GetAlgo() && !sm->GetAlgo()->NeedDiscreteBoundary() ); - - if ( !topAlgoPresent ) + ::SMESH_subMesh* sm = smIt->next(); + if ( sm->GetSubShape().ShapeType() != shapeType ) { - // find max dimension of an assigned algo - TopAbs_ShapeEnum algoShape = TopAbs_SHAPE; - const std::list & hyps = aMesh->GetHypothesisList( aShape ); - std::list ::const_iterator hypIt = hyps.begin(); - for ( ; hypIt != hyps.end(); ++hypIt ) - if ( const SMESH_Algo* algo = dynamic_cast< const SMESH_Algo* >( *hypIt )) - switch ( algo->GetDim() ) { - case 1: algoShape = TopAbs_EDGE; break; - case 2: algoShape = TopAbs_FACE; break; - case 3: algoShape = TopAbs_SOLID; break; - case 0: algoShape = TopAbs_VERTEX; break; - } - if ( algoShape != TopAbs_SHAPE ) - { - // return all sub-meshes on this dimension - SMESH_subMeshIteratorPtr smIt = theSubMesh->getDependsOnIterator(/*includeSelf=*/false); - while ( smIt->more() ) - { - sm = smIt->next(); - if ( sm->GetSubShape().ShapeType() == algoShape && sm->GetSubMeshDS() ) - theSubMeshList.push_back( sm->GetSubMeshDS() ); - } - return size < theSubMeshList.size(); - } + if ( elementsFound || algoFound ) + break; + if ( sm->GetSubShape().ShapeType() == TopAbs_VERTEX && + mainType != TopAbs_VERTEX ) + break; } + shapeType = sm->GetSubShape().ShapeType(); + if ( !sm->IsEmpty() ) + { + elementsFound = true; + theSubMeshList.push_back( sm->GetSubMeshDS() ); + } + if ( sm->GetAlgo() ) + algoFound = true; } - switch ( aShapeType ) - { - case TopAbs_SOLID: - { - // add sub-mesh of solid itself - if (( aSubMeshDS = aMeshDS->MeshElements( aShape ))) - theSubMeshList.push_back( aSubMeshDS ); - - // and of the first shell - TopExp_Explorer exp( aShape, TopAbs_SHELL ); - if ( exp.More() ) - if (( aSubMeshDS = aMeshDS->MeshElements( exp.Current() ))) - theSubMeshList.push_back( aSubMeshDS ); - break; - } - case TopAbs_WIRE: - case TopAbs_COMPOUND: - case TopAbs_COMPSOLID: - { - // call getSubMeshes() for sub-shapes - list shapeList; - shapeList.push_back( aShape ); - list::iterator sh = shapeList.begin(); - for ( ; sh != shapeList.end(); ++sh ) { - for ( TopoDS_Iterator it( *sh ); it.More(); it.Next() ) { - if (( sm = aMesh->GetSubMeshContaining( it.Value() ))) - getSubMeshes( sm, theSubMeshList ); // add found sub-mesh or explore deeper - else - // no submesh for a compound inside compound - shapeList.push_back( it.Value() ); - } - } - // return only unique sub-meshes - set smSet( theSubMeshList.begin(), theSubMeshList.end() ); - theSubMeshList.assign( smSet.begin(), smSet.end() ); - break; - } - default: - if ( aSubMeshDS ) - theSubMeshList.push_back( aSubMeshDS ); - } return size < theSubMeshList.size(); } @@ -211,15 +148,11 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfElements() return 0; ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) - aSubMeshDS = 0; - int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; + int nbElems = 0; - // volumes are bound to shell TListOfSubMeshes smList; - if ( nbElems == 0 && getSubMeshes( aSubMesh, smList )) + if ( getSubMeshes( aSubMesh, smList )) { TListOfSubMeshes::iterator sm = smList.begin(); for ( ; sm != smList.end(); ++sm ) @@ -249,8 +182,6 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfNodes(CORBA::Boolean all) } ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) - aSubMeshDS = 0; if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) { @@ -298,17 +229,10 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsId() _preMeshInfo->FullLoadFromFile(); ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) - aSubMeshDS = 0; - int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; + int nbElems = 0; TListOfSubMeshes smList; - if ( nbElems ) - smList.push_back( aSubMeshDS ); - - // volumes are bound to shell - if ( nbElems == 0 && getSubMeshes( aSubMesh, smList )) + if ( getSubMeshes( aSubMesh, smList )) { TListOfSubMeshes::iterator sm = smList.begin(); for ( ; sm != smList.end(); ++sm ) @@ -350,17 +274,14 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theEle _preMeshInfo->FullLoadFromFile(); ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() ) - aSubMeshDS = 0; - // PAL5440, return all nodes belonging to elements of submesh + // PAL5440, return all nodes belonging to elements of the sub-mesh set nodeIds; - int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; + int nbElems = 0; // volumes may be bound to shell instead of solid TListOfSubMeshes smList; - if ( nbElems == 0 && getSubMeshes( aSubMesh, smList )) + if ( getSubMeshes( aSubMesh, smList )) { TListOfSubMeshes::iterator sm = smList.begin(); for ( ; sm != smList.end(); ++sm ) @@ -386,29 +307,6 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theEle nbElems += (*sm)->NbElements(); } } - aSubMeshDS = 0; - } - else - { - if ( nbElems ) - smList.push_back( aSubMeshDS ); - } - - if ( theElemType == SMESH::NODE && aSubMeshDS ) - { - SMDS_ElemIteratorPtr eIt = aSubMeshDS->GetElements(); - if ( eIt->more() ) { - while ( eIt->more() ) { - const SMDS_MeshElement* anElem = eIt->next(); - SMDS_ElemIteratorPtr nIt = anElem->nodesIterator(); - while ( nIt->more() ) - nodeIds.insert( nIt->next()->GetID() ); - } - } else { - SMDS_NodeIteratorPtr nIt = aSubMeshDS->GetNodes(); - while ( nIt->more() ) - nodeIds.insert( nIt->next()->GetID() ); - } } if ( theElemType == SMESH::NODE ) @@ -428,8 +326,7 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theEle TListOfSubMeshes::iterator sm = smList.begin(); for ( i = 0; sm != smList.end(); sm++ ) { - aSubMeshDS = *sm; - SMDS_ElemIteratorPtr anIt = aSubMeshDS->GetElements(); + SMDS_ElemIteratorPtr anIt = (*sm)->GetElements(); while ( i < n && anIt->more() ) { const SMDS_MeshElement* anElem = anIt->next(); if ( theElemType == SMESH::ALL || anElem->GetType() == (SMDSAbs_ElementType)theElemType ) diff --git a/src/StdMeshers/StdMeshers_Projection_2D.cxx b/src/StdMeshers/StdMeshers_Projection_2D.cxx index fed12f5a5..c4375bac9 100644 --- a/src/StdMeshers/StdMeshers_Projection_2D.cxx +++ b/src/StdMeshers/StdMeshers_Projection_2D.cxx @@ -1437,6 +1437,9 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& if ( mapper.GetErrorCode() != SMESH_Pattern::ERR_OK ) return error("Can't make mesh by source mesh pattern"); + } // end of projection using Pattern mapping + + { // ------------------------------------------------------------------------- // mapper doesn't take care of nodes already existing on edges and vertices, // so we must merge nodes created by it with existing ones @@ -1476,7 +1479,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& continue; // do not treat sm of degen VERTEX } - // Sort new and old nodes of a submesh separately + // Sort new and old nodes of a sub-mesh separately bool isSeam = helper.IsRealSeam( sm->GetId() ); @@ -1600,6 +1603,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& // The mapper can't create quadratic elements, so convert if needed // ---------------------------------------------------------------- + SMDS_ElemIteratorPtr faceIt; faceIt = srcSubMesh->GetSubMeshDS()->GetElements(); bool srcIsQuad = faceIt->next()->IsQuadratic(); faceIt = tgtSubMesh->GetSubMeshDS()->GetElements(); @@ -1613,8 +1617,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape& editor.ConvertToQuadratic(/*theForce3d=*/false, tgtFaces, false); } - - } // end of projection using Pattern mapping + } // end of coincident nodes and quadratic elements treatment if ( !projDone || is1DComputed ) From c8f0893cc3484e8945d65b740efdc7795619a560 Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 25 Mar 2016 13:44:51 +0300 Subject: [PATCH 20/22] Regression of doc/salome/examples/use_existing_faces.py --- .../gui/SMESH/images/split_into_tetra_icon.png | Bin 923 -> 885 bytes resources/split_into_tetra.png | Bin 923 -> 885 bytes src/SMESH/SMESH_subMesh.cxx | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/salome/gui/SMESH/images/split_into_tetra_icon.png b/doc/salome/gui/SMESH/images/split_into_tetra_icon.png index b113c304db955efefb3cecebe156174c299177b8..c9ea7b4c97720e15c19bf2ce810a9d10e7030e97 100644 GIT binary patch delta 818 zcmV-21I_%K2lWP!Bnkm@Qb$4nuFf3kks&aD-~$;7DFptV4Z{Ec0`*BmK~y-)m6UI2 z6K5R9KX&k+kRmHoQWZ8Bc5gO{pqZqC7JMb_ z#YAjD=!+HlMg;$qFi^1WRsDx4%+1akkBd!e(l$%(((Z*#a$Q@sUpRQ~?s-1<{J!6R z=XU}Ywf)#Hf7aNNEtBoMPllOiF_U32ovyeQI+L-!6AFXfC%={5wGG*S%$`j_^6Lvc zyZaVndJKD0HyzzRm&e6q7rb4->zC zACIaspYQ=t9|%yT$i#&26OogCws-x1#J|~@N+2sVe*M)aHOh{q7WHQU#xDGT!!^4O zQd6@??SV^cb{rk_v*&!2$y3b$a&zy|J%YWddu6i{JC6ObX17+2_SMrhq!U|6AYWIOuiKo?)A?k7@?6hw z?1Qk;zLL{Qdpj;~9V>#sli{m~6XEccKqxdM!sUvc{&UvJ?~|rW#1>NM_wHdB27mwY z000SKA{-8G+j}59F#G4%ckazjY;B&2K*QXAwG|@ZoO#awIzFC!b3e=N8(3a>J50GT#bC z6oYoR>(YyhtpJo6@eymf(Lq0m;y$qe+e`&$D(RzYr@!A;?LGuxnosi9}@a5y1!)5L-31fMLv?9IUth7XEGt=JCsCQha(qjpY2 zIwM8L{-oQ3t!aZv+9nM#e|mH8?(v}}OIWtn4_vs1bMEJy^ZosVCgx=n1#NF>T2)bPrqNn!O#_38w0KNDAjoa-e(RL(z>HHYN@d)|S zYCB*k1J69+>~M9Jf80-h48S)NZ{QURw@JENGxP*cG;Fwbag3flACUUxU82#b2nK^s zDXzX@d8aEre(;Ni)7BF`wU-C>|AbPEVc$4`Wtsatp04i{KmZ=U-=EMl4NcQfRh6xH z^3`dQIYDM-AG)sNbUG;(i?l={k;9Xdli#kduOAcM!Q&&5e^0iQ)#q9+m+9;4LrPd& zTtuCop8h-%iM+2U%4eeZ`|-Kc!)%9SPHbM+wlPhUYuBzKrKAPm$Cw_z@6p%7kNFa$ z)9I5;KoW%Lz^{}vrbB)5FlOY zCq8qO|ASf|axy2_H9A+50%$^QD*f&IlT-}RT$s!?PV5?;t6d{e2mtWc4{ris-?VD$ zL~8}FSg7S^+cs*mY?NY*-l6fDG+pUON;&oCxz{m`e>~OPtG{Ix(==}hn}uI5RTL$h zPNzPMUl_x(EOa9^RbSn!Ums?9dHFfDzGBVj9U8~yjI&}s$j+VJZ?B}+MoiPhuoiAs z*IYSsh-5Mul2V$gWm#KR?*2U=v7_rD1_lP$FiO9!t*st&sLms8&k+kRmHoQWZ8Bc5gO{pqZqC7JMb_ z#YAjD=!+HlMg;$qFi^1WRsDx4%+1akkBd!e(l$%(((Z*#a$Q@sUpRQ~?s-1<{J!6R z=XU}Ywf)#Hf7aNNEtBoMPllOiF_U32ovyeQI+L-!6AFXfC%={5wGG*S%$`j_^6Lvc zyZaVndJKD0HyzzRm&e6q7rb4->zC zACIaspYQ=t9|%yT$i#&26OogCws-x1#J|~@N+2sVe*M)aHOh{q7WHQU#xDGT!!^4O zQd6@??SV^cb{rk_v*&!2$y3b$a&zy|J%YWddu6i{JC6ObX17+2_SMrhq!U|6AYWIOuiKo?)A?k7@?6hw z?1Qk;zLL{Qdpj;~9V>#sli{m~6XEccKqxdM!sUvc{&UvJ?~|rW#1>NM_wHdB27mwY z000SKA{-8G+j}59F#G4%ckazjY;B&2K*QXAwG|@ZoO#awIzFC!b3e=N8(3a>J50GT#bC z6oYoR>(YyhtpJo6@eymf(Lq0m;y$qe+e`&$D(RzYr@!A;?LGuxnosi9}@a5y1!)5L-31fMLv?9IUth7XEGt=JCsCQha(qjpY2 zIwM8L{-oQ3t!aZv+9nM#e|mH8?(v}}OIWtn4_vs1bMEJy^ZosVCgx=n1#NF>T2)bPrqNn!O#_38w0KNDAjoa-e(RL(z>HHYN@d)|S zYCB*k1J69+>~M9Jf80-h48S)NZ{QURw@JENGxP*cG;Fwbag3flACUUxU82#b2nK^s zDXzX@d8aEre(;Ni)7BF`wU-C>|AbPEVc$4`Wtsatp04i{KmZ=U-=EMl4NcQfRh6xH z^3`dQIYDM-AG)sNbUG;(i?l={k;9Xdli#kduOAcM!Q&&5e^0iQ)#q9+m+9;4LrPd& zTtuCop8h-%iM+2U%4eeZ`|-Kc!)%9SPHbM+wlPhUYuBzKrKAPm$Cw_z@6p%7kNFa$ z)9I5;KoW%Lz^{}vrbB)5FlOY zCq8qO|ASf|axy2_H9A+50%$^QD*f&IlT-}RT$s!?PV5?;t6d{e2mtWc4{ris-?VD$ zL~8}FSg7S^+cs*mY?NY*-l6fDG+pUON;&oCxz{m`e>~OPtG{Ix(==}hn}uI5RTL$h zPNzPMUl_x(EOa9^RbSn!Ums?9dHFfDzGBVj9U8~yjI&}s$j+VJZ?B}+MoiPhuoiAs z*IYSsh-5Mul2V$gWm#KR?*2U=v7_rD1_lP$FiO9!t*st&sLms8getDependsOnIterator(false); + SMESH_subMeshIteratorPtr smIt2 = sm->getDependsOnIterator(true); while ( smIt2->more() ) smToKeep.insert( smIt2->next() ); } From d82557916e0bdbca05093f35658e8cd81b6cf8aa Mon Sep 17 00:00:00 2001 From: ana Date: Fri, 1 Apr 2016 18:48:46 +0300 Subject: [PATCH 21/22] Windows compatibility --- src/SMESHGUI/SMESHGUI.cxx | 2 +- src/SMESH_I/SMESH_Gen_i.cxx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index a08aefbc4..93b579798 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -586,7 +586,7 @@ namespace "SMESH_OCTAHEDRA","SMESH_POLYEDRONS","SMESH_QUADRATIC_POLYEDRONS","SMESH_BALLS" }; // is typeMsg complete? (compilation failure mains that enum SMDSAbs_EntityType changed) - int nbTypes = sizeof( typeMsg ) / sizeof( const char* ); + const int nbTypes = sizeof( typeMsg ) / sizeof( const char* ); int _assert[( nbTypes == SMESH::Entity_Last ) ? 1 : -1 ]; _assert[0]=1; QString andStr = " " + QObject::tr("SMESH_AND") + " ", comma(", "); diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index 24cc1967e..204466afe 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -4896,7 +4896,7 @@ bool SMESH_Gen_i::LoadASCII( SALOMEDS::SComponent_ptr theComponent, _CORBA_Octet* buffer = new _CORBA_Octet[real_size]; char tmp[3]; tmp[2]='\0'; - uint c = -1; + unsigned int c = -1; for ( int i = 0; i < real_size; i++ ) { memcpy( &(tmp[0]), &(theStream[i*3+1]), 2 ); From 53bd086779d54791bfd119de31f01eac699e0745 Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 14 Apr 2016 18:31:42 +0300 Subject: [PATCH 22/22] 23269: Meshing a composite block with IJK StdMeshers_CompositeHexa_3D.cxx And more: 1) Avoid creating actors for not shown mesh objects SMESHGUI_ComputeDlg.cxx 2) Add wait-cursor while group deletion, which can be long on large meshes SMESHGUI_DeleteGroupDlg.cxx 3) Avoid getting elem types of a new group on filter, which can be long SMESH_Gen_i_1.cxx --- src/SMESHGUI/SMESHGUI_ComputeDlg.cxx | 8 ++++++-- src/SMESHGUI/SMESHGUI_DeleteGroupDlg.cxx | 3 +++ src/SMESH_I/SMESH_Gen_i_1.cxx | 3 +-- src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx | 13 ++++++++++--- src/StdMeshers/StdMeshers_Prism_3D.cxx | 2 +- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx b/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx index 05858cc14..ad4453c1c 100644 --- a/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx @@ -939,7 +939,9 @@ void SMESHGUI_BaseComputeOp::computeMesh() if ( !smSObj ) continue; SMESH::SMESH_IDSource_var aSubMeshObj = SMESH::SObjectToInterface( smSObj ); - aListToUpdate.append( TListOf_IDSrc_SObj::value_type( aSubMeshObj, smSObj )); + SMESH_Actor *anActor = SMESH::FindActorByObject( aSubMeshObj ); + if ( anActor && anActor->GetVisibility() ) + aListToUpdate.append( TListOf_IDSrc_SObj::value_type( aSubMeshObj, smSObj )); } // put Groups into list SMESH::ListOfGroups_var aGroups = myMesh->GetGroups(); @@ -955,7 +957,9 @@ void SMESHGUI_BaseComputeOp::computeMesh() if ( !aGroupSO ) continue; SMESH::SMESH_IDSource_var aGroupObj = SMESH::SObjectToInterface( aGroupSO ); - aListToUpdate.append( TListOf_IDSrc_SObj::value_type( aGroupObj, aGroupSO )); + SMESH_Actor *anActor = SMESH::FindActorByObject( aGroupObj ); + if ( anActor && anActor->GetVisibility() ) + aListToUpdate.append( TListOf_IDSrc_SObj::value_type( aGroupObj, aGroupSO )); } // update mesh, sub-mesh and groups, if it's possible diff --git a/src/SMESHGUI/SMESHGUI_DeleteGroupDlg.cxx b/src/SMESHGUI/SMESHGUI_DeleteGroupDlg.cxx index 6952b96c9..7711022c3 100644 --- a/src/SMESHGUI/SMESHGUI_DeleteGroupDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_DeleteGroupDlg.cxx @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -205,6 +206,8 @@ bool SMESHGUI_DeleteGroupDlg::onApply() if (!isValid()) return false; + SUIT_OverrideCursor wc; + myBlockSelection = true; QList::iterator anIter; diff --git a/src/SMESH_I/SMESH_Gen_i_1.cxx b/src/SMESH_I/SMESH_Gen_i_1.cxx index 30ef9e5c6..af12566d8 100644 --- a/src/SMESH_I/SMESH_Gen_i_1.cxx +++ b/src/SMESH_I/SMESH_Gen_i_1.cxx @@ -771,8 +771,7 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishGroup (SALOMEDS::Study_ptr theStudy SetName( aRootSO, aRootNames[aType] ); // Add new group to corresponding sub-tree - SMESH::array_of_ElementType_var elemTypes = theGroup->GetTypes(); - int isEmpty = ( elemTypes->length() == 0 ); + int isEmpty = false; std::string pm[2] = { "ICON_SMESH_TREE_GROUP", "ICON_SMESH_TREE_MESH_WARN" }; if ( SMESH::DownCast< SMESH_GroupOnFilter_i* > ( theGroup )) { diff --git a/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx b/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx index cd047490a..cb0512d1f 100644 --- a/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx +++ b/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx @@ -382,12 +382,12 @@ namespace const TopTools_MapOfShape& cornerVV, TopTools_MapOfShape& internEE) { - TopTools_IndexedMapOfShape subEE, subFF; + TopTools_IndexedMapOfShape subEE; TopExp::MapShapes( shape, TopAbs_EDGE, subEE ); - TopExp::MapShapes( shape, TopAbs_FACE, subFF ); + //TopExp::MapShapes( shape, TopAbs_FACE, subFF ); TopoDS_Vertex VV[2]; - TopTools_MapOfShape subChecked/*, ridgeEE*/; + TopTools_MapOfShape subChecked, ridgeEE; TopTools_MapIteratorOfMapOfShape vIt( cornerVV ); for ( ; vIt.More(); vIt.Next() ) { @@ -401,6 +401,8 @@ namespace TopoDS_Edge ridgeE = TopoDS::Edge( *riE ); while ( !ridgeE.IsNull() ) { + if ( !ridgeEE.Add( ridgeE )) + break; TopExp::Vertices( ridgeE, VV[0], VV[1] ); TopoDS_Shape V1 = VV[ V0.IsSame( VV[0] )]; if ( cornerVV.Contains( V1 ) ) @@ -451,6 +453,11 @@ namespace } // loop on ridge EDGEs around a corner VERTEX } // loop on on corner VERTEXes + if ( subEE.Extent() > ridgeEE.Extent() + internEE.Extent() ) // PAL23269 + for ( int i = 1; i < subEE.Extent(); ++i ) + if ( !ridgeEE.Contains( subEE(i) )) + internEE.Add( subEE(i) ); + return true; } // getInternalEdges() } // namespace diff --git a/src/StdMeshers/StdMeshers_Prism_3D.cxx b/src/StdMeshers/StdMeshers_Prism_3D.cxx index c7a44bada..d60f1397e 100644 --- a/src/StdMeshers/StdMeshers_Prism_3D.cxx +++ b/src/StdMeshers/StdMeshers_Prism_3D.cxx @@ -1116,7 +1116,7 @@ bool StdMeshers_Prism_3D::compute(const Prism_3D::TPrismTopo& thePrism) ( ! botSM->GetAlgo() || ! _gen->Compute( *botSM->GetFather(), botSM->GetSubShape(), /*shapeOnly=*/true ))) return error( COMPERR_BAD_INPUT_MESH, - TCom( "No mesher defined to compute the face #") + TCom( "No mesher defined to compute the base face #") << shapeID( thePrism.myBottom )); // Make all side FACEs of thePrism meshed with quads