Meshing#

One way of creating lattice infill is mapping the given lattice unit, such strut, TPMS or geometry, into the infill domain as defined by mesh. User may refers to the conformal lattice generation section for details. This section summarized the basic integrated mesher functions. All examples here you should be able to find under the folder Test_json\MeshLattice.

Tetrahedron Mesher#

Artisan has an integrated simple tetrahedron elements mesher that automatically meshes the given geometry using Delaunay triangulation algorithm. This basic meshing algorithm discretize the geometry layer-by-layer that conforms the geometric shape. The following JSON, that stores at the file GenTetBasicMesh.txt, meshed a sphere with the radius of 600 mm and generated the mesh lattice by using the exactly same mesh.

{"Setup":{  "Type" : "Geometry",
            "Geomfile": ".//sample-obj//Ball_Mesh.STL",
            "Rot" : [0.0,0.0,0.0],
            "res":[5.0,5.0,5.0],
                            "Padding": 4,
            "onGPU": false,
            "memorylimit": 16106127360
            },
"WorkFlow":{
      "1": {"Gen_TetBasicMesh":{
                "Geomfile": ".//sample-obj//Ball_Mesh.STL",
                                    "size": [100.0,100.0,100.0],
                                    "Meshfile": ".//sample-obj//Ball_Mesh.med",
                "ConvertTet2Beam": true
                }
           },
      "2": {"Add_Lattice":{
                "la_name": ".//Test_json_03//GenTetBasicMesh.mld",
                "size": [150.0,150.0,150.0], "thk":10.0, "Rot":[0.0, 0.0, 0.0], "Trans":[0.0, 0.0, 0.0],
                "Inv": false, "Fill": false, "Cube_Request": {}
                }
           },
      "3": {
            "Export": {"outfile": ".//Test_results/BallBasicTetNMesh_Lattice.stl"}
           }
                      },
"PostProcess":{"CombineMeshes": true,
            "RemovePartitionMeshFile": false,
            "RemoveIsolatedParts": true,
            "ExportLazPts": true}
 }

The keywords Gen_TetBasicMesh activates the algorithm. The parameter "Geomfile" defines the location of the target meshing geometry, Meshfile indicates where the mesh would be stored. Currently it supports Abaqus inp, Ansys fluent msh and Salome med file format. The parameter "size" defines the lattice size at current layer as

\[num_{nodes} = area / (size[0]*size[1]*0.5)\]

num_{nodes} is the number of nodes at current layer, and they were evenly and randomly distributed over the current layer surface. The value size[2], which is the third element in size, defines the layer depth, here 100 mm depth. The parameter ConvertTet2Beam is boolean type definition, that "true" meant the mesher will convert generated tetrahedron to the beam element (a 2-node-strut-like element), false will keep tetrahedron element. One of the benefits is user may import the beam element into the FEA solver for further analysis if the mesh lattice is desired.

Above JSON produced a mesh lattice filled ball geometry as shown below.

_images/BallMeshLattice.png

The cross-sectional view below clearly showed the lattices were stacked layer by layer, from exterior surface towards center.

_images/BallMeshLattice_CrossSection.png

Please note that, this simple mesher may apply to the geometry with less dramatic change and more continuously smooth surface change. The quality of mesh may vary depending on the geometry features and definitions of mesh size etc.. For more complex mesh pattern, user may consider use professional mesher and import the results as input in mesh lattice generation workflow.

Voronoi Polygon#

A Voronoi diagram, also known as a Voronoi tessellation or Voronoi decomposition, is a geometric structure that partitions a space into regions based on the proximity to a set of given points. In a Voronoi diagram, each point in the set is associated with a unique region that consists of all locations in the space that are closer to that point than any other point. It is named after the Russian mathematician Georgy Voronoi, who first introduced the idea. Voronoi polygons have various applications, such as in computer graphics, spatial analysis, geographical information systems, and computational biology. They provide a way to partition space based on proximity and are useful in solving proximity-based problems and analyzing spatial patterns. In additive manufacturing, this structure is often used on the components which suppose to bear loading with cushioning effect.

Setup the generation of the Voronoi polygons on the given geometry is similar to the tet mesher. Below shows the piece of setup JSON (the file GenVorMesh.txt).

{"Setup":{  "Type" : "Geometry",
            "Geomfile": ".//sample-obj//Ball_Mesh.STL",
            "Rot" : [0.0,0.0,0.0],
            "res":[5.0,5.0,5.0],
                    "Padding": 4,
            "onGPU": false,
            "memorylimit": 16106127360
            },
 "WorkFlow":{
      "1": {"Gen_VoronoiPolyMesh":{
                "Geomfile": ".//sample-obj//Ball_Mesh.STL",
                        "size": [100.0,100.0,100.0],
                        "Meshfile": ".//sample-obj//Ball_VorMesh.med",
                        "remove_tol": 5.0
                }
           },
      "2": {"Add_Lattice":{
                "la_name": ".//Test_json//MeshLattice//GenVorMesh.mld",
                "size": [150.0,150.0,150.0], "thk":10.0, "Rot":[0.0,0.0,0.0], "Trans":[0.0,0.0,0.0], "Inv": false, "Fill": false,
                "Cube_Request": {}
                }
           },
      "3":{
          "Export": {"outfile": ".//Test_results/BallBasicVoriMesh_Lattice.stl"}
          }
               },
 "PostProcess":{
            "CombineMeshes": true,
            "RemovePartitionMeshFile": false,
            "RemoveIsolatedParts": true,
            "ExportLazPts": true
            }
}

The parameter setup is very similar to the keywords Gen_TetBasicMesh. The additional parameter remove_tol defines tolerance of removing the strut which contains the end node outside of the given geometry. The mesh is an approximation of geometry, sometime, the end-nodes may locate beyond the boundary of geometric shape. This parameter allows user to flexibly remove such. The results are shown below.

_images/VoriMeshBall.png

And the cross-section view shows how the mesher generates the element layer by layer.

_images/VoriMeshBall_CrossSection.png

We can certainly apply this to a more complex geometry. The example below (GenVorMesh_crank_handle.txt) shows the generation of the Voronoi polygons on a real world component.

{"Setup":{  "Type" : "Geometry",
            "Geomfile": ".//sample-obj//crank_handle.stl",
            "Rot" : [0.0,0.0,0.0],
            "res":[0.25,0.25,0.25],
                    "Padding": 4,
            "onGPU": false,
            "memorylimit": 16106127360000000
            },
 "WorkFlow":{
      "1": {"Gen_VoronoiPolyMesh":{
                "Geomfile": ".//sample-obj//crank_handle.stl",
                        "size": [3.0,3.0,3.0],
                        "Meshfile": ".//sample-obj//crank_handle.med",
                        "remove_tol": 0.6
                }
           },
       "2": {"Add_Lattice":{
                "la_name": ".//Test_json//MeshLattice//GenVorMesh_crank_handle.mld",
                "size": [3.5,3.5,3.5], "thk":0.5, "Rot":[0.0,0.0,0.0], "Trans":[0.0,0.0,0.0], "Inv": false, "Fill": false,
                "Cube_Request": {}
                }
           },
       "3":{
            "Export": {"outfile": ".//Test_results/crank_handle_VoriMesh_Lattice.stl"}
          }
                },
 "PostProcess":{"CombineMeshes": true,
            "RemovePartitionMeshFile": false,
            "RemoveIsolatedParts": true,
            "ExportLazPts": true}
}

And the mesh lattice defintion (GenVorMesh_crank_handle.mld) is:

{
    "type": "MeshLattice",
    "definition": {
        "meshfile": ".//sample-obj//crank_handle.med"
    }
}

The result is shown as below. As mentioned before, the current mesh strategy may not handle the sharp edge very well, and in general, it produces a good fitting of Voronoi polygons.

_images/crank_handle_vori_mesh.png