From 4fd207ba70f20bf44ca4e6d097dc8b12e0bc5af5 Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 19 Jul 2012 12:44:41 +0000 Subject: [PATCH] About "Use Existing Faces" stub algorithm --- .../gui/SMESH/input/basic_meshing_algos.doc | 3 + .../gui/SMESH/input/constructing_meshes.doc | 415 ++++++++++-------- .../SMESH/input/constructing_submeshes.doc | 2 +- .../SMESH/input/tui_use_existing_faces.doc | 124 ++++++ 4 files changed, 366 insertions(+), 178 deletions(-) create mode 100644 doc/salome/gui/SMESH/input/tui_use_existing_faces.doc diff --git a/doc/salome/gui/SMESH/input/basic_meshing_algos.doc b/doc/salome/gui/SMESH/input/basic_meshing_algos.doc index 74e106143..a4ebe1c8a 100644 --- a/doc/salome/gui/SMESH/input/basic_meshing_algos.doc +++ b/doc/salome/gui/SMESH/input/basic_meshing_algos.doc @@ -62,6 +62,9 @@ There is also a number of more specific algorithms:
  • \subpage prism_3d_algo_page "for meshing prismatic shapes"
  • \subpage radial_quadrangle_1D2D_algo_page "for meshing special 2d faces (circles and part of circles)"
  • +\ref use_existing_anchor "Use existing edges" and +\ref use_existing_anchor "Use existing faces" algorithms can be +used to create an 1D or a 2D mesh in a python script. \ref constructing_meshes_page "Constructing meshes" page describes in detail how to apply meshing algorithms. diff --git a/doc/salome/gui/SMESH/input/constructing_meshes.doc b/doc/salome/gui/SMESH/input/constructing_meshes.doc index cefbd8ac7..adf63c6a1 100644 --- a/doc/salome/gui/SMESH/input/constructing_meshes.doc +++ b/doc/salome/gui/SMESH/input/constructing_meshes.doc @@ -2,106 +2,142 @@ \page constructing_meshes_page Constructing meshes -\n Construction of a mesh consists of: +\n Construction of a mesh on some geometry consists of: +Mesh can be \ref use_existing_anchor "computed using your own meshing algorithms" +written in Python. + +\anchor create_mesh_anchor +

    Creation of a mesh object

    To construct a mesh:
      -
    1. In the \b Mesh menu select Create Mesh or click "Create -Mesh" button in the toolbar. - -\image html image32.png -
      "Create Mesh" button
      - -The following dialog box will appear: - -\image html createmesh-inv.png -
    2. -
    3. For example, you need to mesh a 3d object. -\n First, type the name for your mesh in the "Name" box, by default, -it is "Mesh_1". Then select the object you wish to mesh in the Object -Browser and click the "Add" button (if name of the object not yet -appeared in \b Geometry field). - -\image html image120.png -
      "Add" button
      - -Now you can define 1d Algorithm and 1d Hypotheses, which will be -applied to the edges of your object. (Note that any object has edges, -even if their existence is not apparent, for example, a sphere has 4 -edges). Click the "Add Hypothesis" button to add a -hypothesis. - -\image html image121.png -
      "Add Hypothesis" button
      +
    4. Select a geometrical object for meshing.
    5. +
    6. In the \b Mesh menu select Create Mesh or click "Create + Mesh" button in the toolbar. + + \image html image32.png + "Create Mesh" button + + The following dialog box will appear: + + \image html createmesh-inv.png +
      +
    7. +
    8. Apply \subpage basic_meshing_algos_page "meshing algorithms" and + \subpage about_hypo_page "hypotheses" which will be used at computation of + this mesh. + + For example, you need to mesh a 3D object. + + First, type the name for your mesh in the \b Name box, by default, + it is "Mesh_1". Then select the geometrical object you wish to + mesh in the Object Browser and click "Select" button near \b Geometry + field (if name of the object not yet appeared in \b Geometry field). + + \image html image120.png + "Select" button + + Now you can define 3D Algorithm and 3D Hypotheses, which will be + applied to solids of your geometrical object. Click the "Add + Hypothesis" button to add a hypothesis. + + \image html image121.png + "Add Hypothesis" button + + Click the "Edit Hypothesis" button to change values for the + current hypothesis. + + \image html image122.png + "Edit Hypothesis" button + + Most standard 2D and 3D algorithms can work without hypotheses + using some default parameters. The use of additional hypotheses + is optional (i.e. you may leave "None" in this box). + + Proceed in the same way with 2D and 1D Algorithms and Hypotheses that + will be used to mesh faces and edges of your geometry. (Note + that any object has edges, even if their existence is not + apparent, for example, a sphere has 4 edges). Note that the + choice of hypotheses and of an algorithm of lower dimension depends on + the algorithm. + + Some algorithms generate mesh of several dimensions while others, of + only one dimension. In the latter case there must be one Algorithm and zero or several + Hypotheses for each dimension of your object, otherwise you will + not get any mesh at all. Of course, if you wish to mesh a face, + which is a 2D object, you don't need to define 3D Algorithm and + Hypotheses. + + In the Object Browser the structure of the new mesh will be + displayed as follows: + + \image html image88.jpg + + It contains: +
        +
      • a reference to the geometrical object on the basis of + which the mesh has been constructed;
      • +
      • Applied hypotheses folder containing the references + to the hypotheses applied at the construction of the mesh;
      • +
      • Applied algorithms folder containing the references + to the algorithms applied at the construction of the mesh.
      • +
      + + There is an alternative way to assign Algorithms and Hypotheses by + clicking Assign a set of hypotheses button and selecting among + pre-defined sets of hypotheses. In addition to the standard + sets of hypotheses, it is possible to create custom sets by editing + CustomMeshers.xml file located in the home directory. CustomMeshers.xml + file must describe sets of hypotheses in the + same way as ${SMESH_ROOT_DIR}/share/salome/resources/smesh/StdMeshers.xml + file does (sets of hypotheses are enclosed between + tags). + + \image html hypo_sets.png + List of sets of hypotheses: [custom] + automatically added to the sets defined by the user +
    9. +
    -Click the "Edit Hypothesis" button to define values for the -current hypothesis. +Consider trying a sample script for construction of a mesh from our +\ref tui_creating_meshes_page "TUI Scripts" section. -\image html image122.png -
    "Edit Hypothesis" button
    +\anchor evaluate_anchor +

    Evaluating mesh size

    -The use of additional hypotheses is optional (i.e. you may leave -"None" in this box). +After the mesh object is created and all hypotheses are assigned and +before \ref compute_anchor "Compute" operation, it is possible to +calculate the eventual mesh size. For this, select the mesh in +the Object Browser and from the \b Mesh menu select \b +Evaluate. The result of evaluation will be displayed in the following +information box: -Proceed in the same way with 2d and 3d Algorithms and Hypotheses, note -that the choice of hypotheses depends on the algorithm. There must be -one Algorithm and zero or several Hypotheses for each dimension of your -object (most standard 2D and 3D algorithms can work without -hypotheses using some default parameters), -otherwise you will not get any mesh at all. Of course, if you -wish to mesh a face, which is a 2d object, you don't need to define 3d -Algorithm and Hypotheses. -\n In the Object Browser the structure of the new mesh will be -displayed as follows: +\image html mesh_evaluation_succeed.png -\image html image88.jpg +\anchor preview_anchor +

    Previewing the mesh

    -It contains: - -
    -There is an alternative way to create a mesh on an object simply by -clicking Assign a set of hypotheses button and selecting among -pre-defined sets of hypotheses. In addition to the standard -sets of hypotheses, it is possible to create custom sets by editing -CustomMeshers.xml file located in the home directory. CustomMeshers.xml -file must describe sets of hypotheses in the -same way as ${SMESH_ROOT_DIR}/share/salome/resources/smesh/StdMeshers.xml -file does (sets of hypotheses are enclosed between -tags). -\image html hypo_sets.png -
    List of sets of hypotheses: [custom] is automatically added to the sets defined -by the user
    - - -\anchor preview_mesh_anchor - -
  • After the mesh object is created and all hypotheses are assigned and -before the mesh computation, it is possible to see the mesh preview. +Before \ref compute_anchor "the mesh computation", it is also possible +to see the mesh preview. For this, select the mesh in the Object Browser. From the \b Mesh menu -select \b Preview or click "Preview" button in the -toolbar or activate "Preview" item from the pop-up menu. +select \b Preview or click "Preview" button in the toolbar or activate +"Preview" item from the pop-up menu. \image html mesh_precompute.png -
    "Preview" button
    +"Preview" button Select 1D mesh or 2D mesh preview mode in the Preview dialog. - \image html preview_mesh_1D.png "1D mesh preview shows nodes computed on geometry edges" - +
    \image html preview_mesh_2D.png "2D mesh preview shows edge mesh elements, computed on geometry faces" Compute button computes the whole mesh. @@ -111,142 +147,167 @@ created mesh elements appers: \image html preview_tmp_data.png -These elenents can be reused in the next mesh computation. -
  • - - -
  • It is equally possible to skip the Preview and \b Compute the mesh -after the hypotheses are assigned. For this, select your mesh in the Object -Browser. From the \b Mesh menu select \b Compute or click "Compute" button of the -toolbar. - -\image html image28.png -
    "Compute" button
    - -The Mesh Computation information box appears. - -\image html meshcomputationsucceed.png - -If the mesh computation failed, the information about the cause of the -failure is provided. - -\image html meshcomputationfail.png - -After you select the error, Show Sub-shape button allows -visualizing the geometrical entity that causes it. - -\image html failed_computation.png "Example of the invalid input mesh" - -\note Mesh Computation Information box does not appear if you set -"Mesh computation/Show a computation result notification" preference -to the "Never" value. This option gives the possibility to control mesh -computation reporting. There are the following possibilities: always -show information box, only if an error occurs or never. -By default, the information box is always shown after mesh computation operation. - -Publish Sub-shape button publishes the sub-shape, whose meshing -failed, in GEOM component as a child of the mesh geometry, which -allows analyzing the problem geometry and creating a submesh on it in -order to locally tune hypotheses. - -NOTE It is possible to define a 1D or a 2D mesh in a -python script and then use such submeshes in the construction of a 3D -mesh. For this, there exist two algorithms: Use existing edges and Use -existing faces. They are not entirely usable from the GUI, so a -mesh created using these algorithms should be exported into a python -script, edited and then imported into the GUi. - -
  • It is possible to calculate the eventual mesh size -before \b Compute operation. For this, select the mesh in the Object -Browser and from the \b Mesh menu select \b Evaluate. The result of -evaluation will be displayed in the following information box: - -\image html mesh_evaluation_succeed.png +These elements can be kept in the mesh. -
  • +\anchor submesh_order_anchor +

    Changing submesh priority

    -\anchor mesh_order_anchor - -
  • -If the mesh contains concurrent submeshes, it is possible to change -the priority of their computation, i.e. to change the priority of -applying algorithms to the shared sub-shapes of the Mesh shape.
  • +If the mesh contains concurrent \ref constructing_submeshes_page "submeshes", +it is possible to change the priority of their computation, i.e. to +change the priority of applying algorithms to the shared sub-shapes of +the Mesh shape. To change submesh priority: -
  • Choose "Change submesh priority" from the Mesh menu or a popup menu. The opened dialogue -shows a list of submeshes in the order of their priority. +Choose "Change submesh priority" from the Mesh menu or a pop-up +menu. The opened dialog shows a list of submeshes in the order of +their priority. There is an example of submesh order modifications of the Mesh created on a Box shape. The main Mesh object:
      -
    • 1D Wire discretisation with Number of Segments=20
    • -
    • 2D Triangle (Mefisto) with HypothesisMax Element Area -
    • +
    • 1D Wire discretisation with Number of Segments=20
    • +
    • 2D Triangle (Mefisto) with HypothesisMax Element Area +
    -The first submesh object Submesh_1 created on Face_1 -is: +The first submesh object Submesh_1 created on Face_1 is:
      -
    • 1D Wire discretisation with Number of Segments=4
    • -
    • 2D Triangle (Mefisto) with HypothesisMaxElementArea=1200
    • +
    • 1D Wire discretisation with Number of Segments=4
    • +
    • 2D Triangle (Mefisto) with HypothesisMaxElementArea=1200
    -The second submesh object Submesh_2 created on Face_2 -is: +The second submesh object Submesh_2 created on Face_2 is:
      -
    • 1D Wire discretisation with Number of Segments=8
    • -
    • 2D Triangle (Mefisto) with HypothesisMaxElementArea=1200
    • +
    • 1D Wire discretisation with Number of Segments=8
    • +
    • 2D Triangle (Mefisto) with HypothesisMaxElementArea=1200
    -And the last submesh object Submesh_3 created on Face_3 -is: +And the last submesh object Submesh_3 created on Face_3 is:
      -
    • 1D Wire discretisation with Number of Segments=12
    • -
    • 2D Triangle (Mefisto) with HypothesisMaxElementArea=1200
    • +
    • 1D Wire discretisation with Number of Segments=12
    • +
    • 2D Triangle (Mefisto) with HypothesisMaxElementArea=1200
    -The submeshes become concurrent if they share sub-shapes that can be meshed -with different algorithms (or different hypothesises). -In the example, we have three submeshes with concurrent algorithms, -because they have different hypotheses. +The sub-meshes become concurrent if they share sub-shapes that can be +meshed with different algorithms (or different hypothesises). In the +example, we have three submeshes with concurrent algorithms, because +they have different hypotheses. The first mesh computation is made with: +
    \image html mesh_order_123.png -
    "Mesh order SubMesh_1, SubMesh_2, SubMesh_3"
    +"Mesh order SubMesh_1, SubMesh_2, SubMesh_3"
    +
    \image html mesh_order_123_res.png -
    "Result mesh with order SubMesh_1, SubMesh_2, SubMesh_3 "
    +"Result mesh with order SubMesh_1, SubMesh_2, SubMesh_3 "
    The next mesh computation is made with: +
    \image html mesh_order_213.png -
    "Mesh order SubMesh_2, SubMesh_1, SubMesh_3"
    +"Mesh order SubMesh_2, SubMesh_1, SubMesh_3"
    +
    \image html mesh_order_213_res.png -
    "Result mesh with order SubMesh_2, SubMesh_1, SubMesh_3 "
    +"Result mesh with order SubMesh_2, SubMesh_1, SubMesh_3 "
    And the last mesh computation is made with: +
    \image html mesh_order_321.png -
    "Mesh order SubMesh_3, SubMesh_2, SubMesh_1"
    -\image html mesh_order_321_res.png -
    "Result mesh with order SubMesh_3, SubMesh_2, SubMesh_1 "
    +"Mesh order SubMesh_3, SubMesh_2, SubMesh_1"
    +
    \image html mesh_order_321_res.png +"Result mesh with order SubMesh_3, SubMesh_2, SubMesh_1 "
    As we can see, each mesh computation has a different number of result elements and a different mesh discretisation on the shared edges (the edges that are shared between Face_1, Face_2 and Face_3) Additionally, submesh priority (the order of applied algorithms) can -be modified not only in a separate dialog box, but also in the -Preview. This helps to preview different mesh results, -modifying the order of submeshes. +be modified not only in a separate dialog box, but also in +the Preview. This helps to preview different mesh results, +modifying the order of submeshes. +
    \image html mesh_order_preview.png -
    "Preview with submesh priority list box"
    +"Preview with submesh priority list box"
    -If there are no concurrent submeshes under the Mesh object, the user will see the -following information. +If there are no concurrent submeshes under the Mesh object, the user +will see the following information. +
    \image html mesh_order_no_concurrent.png -
    "No concurrent submeshes detected"
    +"No concurrent submeshes detected"
    - -Consider trying a sample script for construction of a mesh from our -\ref tui_creating_meshes_page "TUI Scripts" section. +\anchor compute_anchor +

    Computing the mesh

    + +It is equally possible to skip \ref evaluate_anchor "the Evaluation" +and \ref preview_anchor "the Preview" and to \b Compute the mesh after +the hypotheses are assigned. For this, select your mesh in +the Object Browser. From the \b Mesh menu select \b Compute or +click "Compute" button of the toolbar. + +\image html image28.png +"Compute" button + +The Mesh Computation information box appears. + +\image html meshcomputationsucceed.png + +If the mesh computation failed, the information about the cause of the +failure is provided. + +\image html meshcomputationfail.png + +After you select the error, Show Sub-shape button allows +visualizing in magenta the geometrical entity that causes it. + +\image html failed_computation.png +3D algorithm failed to compute mesh on a box shown using Show + Sub-shape button + + +\note Mesh Computation Information box does not appear if you set +"Mesh computation/Show a computation result notification" preference +to the "Never" value. This option gives the possibility to control mesh +computation reporting. There are the following possibilities: always +show information box, only if an error occurs or never. +By default, the information box is always shown after mesh computation operation. + +Publish Sub-shape button publishes the sub-shape, whose meshing +failed, in GEOM component as a child of the mesh geometry, which +allows analyzing the problem geometry and creating a submesh on it in +order to locally tune hypotheses. + +If a cause of failure is an invalid input mesh and the algorithm has +provided information on what mesh entities are bad Show bad Mesh +button appears in the dialog. Clicked, it shows bad mesh entities in +the Viewer in magenta. Sometimes the shown mesh entities are too small +or/and hidden by other mesh elements, to see them it can be helpful to +switch the mesh to Wireframe visualization mode or to switch off +visualization of faces and volumes (if any). + +\anchor use_existing_anchor +

    "Use existing edges" and "Use existing faces" algorithms

    + +It is possible to create an 1D or a 2D mesh in a python script +(using AddNode, AddEdge and AddFace commands) and +then use such sub-meshes in the construction of a 2D or a 3D mesh. For +this, there exist two algorithms: Use existing edges and Use + existing faces. Scenario of their usage is following. For +example, you want to use standard algorithms to generate 1D and 3D +meshes and to create 2D mesh by your python code. Then you +
      +
    • create a mesh object, assign an 1D algorithm,
    • +
    • invoke \b Compute command, which computes an 1D mesh,
    • +
    • assign Use existing faces and a 3D algorithm,
    • +
    • run your python code, which creates a 2D mesh,
    • +
    • invoke \b Compute command, which computes a 3D mesh.
    • +
    + +Consider trying a sample script demonstrating usage of +\ref tui_use_existing_faces "Use existing faces" algorithm for +construction of a 2D mesh using Python commands. + +\image html use_existing_face_sample_mesh.png + Mesh computed by \ref tui_use_existing_faces "the sample script" + shown in a Shrink mode. */ diff --git a/doc/salome/gui/SMESH/input/constructing_submeshes.doc b/doc/salome/gui/SMESH/input/constructing_submeshes.doc index 9435c73fa..f300d6f50 100644 --- a/doc/salome/gui/SMESH/input/constructing_submeshes.doc +++ b/doc/salome/gui/SMESH/input/constructing_submeshes.doc @@ -18,7 +18,7 @@ while the box is a 3D object.
    will be used. This means that an edge shared by two faces each having its own different sub-mesh, will be meshed using algorithms and hypotheses of any of the two, chosen randomly. This indeterminacy can - be fixed by defining \ref mesh_order_anchor "Sub-mesh priority". + be fixed by defining \ref submesh_order_anchor "Sub-mesh priority".
    \n Construction of a sub-mesh consists of: diff --git a/doc/salome/gui/SMESH/input/tui_use_existing_faces.doc b/doc/salome/gui/SMESH/input/tui_use_existing_faces.doc new file mode 100644 index 000000000..8b9c7325a --- /dev/null +++ b/doc/salome/gui/SMESH/input/tui_use_existing_faces.doc @@ -0,0 +1,124 @@ +/*! + +\page tui_use_existing_faces Use existing faces + +This sample demonstrates how to use Use existing faces algorithm, +which is actulally just a stub allowing to use your own 2D algoritm +implemented in Python. + + +\code +import smesh, geompy +import numpy as np + +# define my 2D algorithm +def my2DMeshing( geomFace ): + + # find gravity center of geomFace + gcXYZ = geompy.PointCoordinates( geompy.MakeCDG( geomFace )) + + # define order and orientation of edges + sortedEdges = [] + geomEdges = geompy.SubShapeAll( geomFace, geompy.ShapeType["EDGE"]) + sortedEdges.append(( geomEdges.pop(0), True )) + while geomEdges: + prevEdge_rev = sortedEdges[ -1 ] + prevVV = geompy.SubShapeAll( prevEdge_rev[0], geompy.ShapeType["VERTEX"]) + prevV2 = prevVV[ prevEdge_rev[1] ] + found = False + for iE in range( len( geomEdges )): + v1,v2 = geompy.SubShapeAll( geomEdges[ iE ], geompy.ShapeType["VERTEX"]) + same1,same2 = [( geompy.MinDistance( prevV2, v ) < 1e-7 ) for v in [v1,v2] ] + if not same1 and not same2: continue + sortedEdges.append(( geomEdges.pop( iE ), same1 )) + found = True + break + assert found + sortedEdges.reverse() + + # put nodes on edges in a right order + nodes = [] + for edge, isForward in sortedEdges: + v1,v2 = geompy.SubShapeAll( edge, geompy.ShapeType["VERTEX"]) + edgeNodes = mesh.GetSubMeshNodesId( v2, all=False ) + \ + mesh.GetSubMeshNodesId( edge, all=False ) + \ + mesh.GetSubMeshNodesId( v1, all=False ) + if not isForward: edgeNodes.reverse() + nodes.extend( edgeNodes[:-1] ) + + # create nodes inside the geomFace + r1 = 0.6 + r2 = 1 - r1 + nodesInside = [] + for n in nodes: + nXYZ = mesh.GetNodeXYZ( n ) + newXYZ = np.add( np.multiply( r1, gcXYZ ), np.multiply( r2, nXYZ )) + nodesInside.append( mesh.AddNode( newXYZ[0], newXYZ[1], newXYZ[2] )) + mesh.SetNodeOnFace( nodesInside[-1], geomFace, 0, 0 ) + + # find out orientation of faces to create + # geomFace normal + faceNorm = geompy.GetNormal( geomFace ) + v1,v2 = [ geompy.PointCoordinates( v ) \ + for v in geompy.SubShapeAll( faceNorm, geompy.ShapeType["VERTEX"]) ] + faceNormXYZ = np.subtract( v2, v1 ) + outDirXYZ = np.subtract( v1, [ 50, 50, 50 ] ) + if np.dot( faceNormXYZ, outDirXYZ ) < 0: # reversed face + faceNormXYZ = np.multiply( -1., faceNormXYZ ) + # mesh face normal + e1 = np.subtract( mesh.GetNodeXYZ( nodes[0] ), mesh.GetNodeXYZ( nodes[1] )) + e2 = np.subtract( mesh.GetNodeXYZ( nodes[0] ), mesh.GetNodeXYZ( nodesInside[0] )) + meshNorm = np.cross( e1, e2 ) + # faces orientation + reverse = ( np.dot( faceNormXYZ, meshNorm ) < 0 ) + + # create mesh faces + iN = len( nodes ) + while iN: + n1, n2, n3, n4 = nodes[iN-1], nodes[iN-2], nodesInside[iN-2], nodesInside[iN-1] + iN -= 1 + if reverse: + f = mesh.AddFace( [n1, n2, n3, n4] ) + else: + f = mesh.AddFace( [n4, n3, n2, n1] ) + # new faces must be assigned to geometry to allow 3D algorithm finding them + mesh.SetMeshElementOnShape( f, geomFace ) + + if reverse: + nodesInside.reverse() + polygon = mesh.AddPolygonalFace( nodesInside ) + mesh.SetMeshElementOnShape( polygon, geomFace ) + + return + +# create geometry and get faces to mesh with my2DMeshing() +box = geompy.MakeBoxDXDYDZ( 100, 100, 100 ) +f1 = geompy.SubShapeAll( box, geompy.ShapeType["FACE"])[0] +f2 = geompy.GetOppositeFace( box, f1 ) +geompy.addToStudy( box, "box" ) +geompy.addToStudy( f1, "f1" ) +geompy.addToStudy( f2, "f2" ) + +# compute 1D mesh +mesh = smesh.Mesh( box ) +mesh.Segment().NumberOfSegments( 5 ) +mesh.Compute() + +# compute 2D mesh +mesh.Quadrangle() +mesh.UseExistingFaces(f1) # UseExistingFaces() allows using my2DMeshing() +mesh.UseExistingFaces(f2) +my2DMeshing( f1 ) +my2DMeshing( f2 ) +assert mesh.Compute() + +# compute 3D mesh +mesh.Prism() +assert mesh.Compute() + +\endcode + +Resulting mesh: +\image html use_existing_face_sample_mesh.png + +*/ -- 2.39.2