Skip to content
Snippets Groups Projects
Select Git revision
  • bc6b651adf17a57698ee60d88b305afb4bb216b8
  • master default protected
  • steplayer
  • bl
  • pluginMeshQuality
  • fixBugsAmaury
  • hierarchical-basis
  • alphashapes
  • relaying
  • new_export_boris
  • oras_vs_osm
  • reassign_partitions
  • distributed_fwi
  • rename-classes
  • fix/fortran-api-example-t4
  • robust_partitions
  • reducing_files
  • fix_overlaps
  • 3115-issue-fix
  • 3023-Fillet2D-Update
  • convert_fdivs
  • gmsh_4_14_0
  • gmsh_4_13_1
  • gmsh_4_13_0
  • gmsh_4_12_2
  • gmsh_4_12_1
  • gmsh_4_12_0
  • gmsh_4_11_1
  • gmsh_4_11_0
  • gmsh_4_10_5
  • gmsh_4_10_4
  • gmsh_4_10_3
  • gmsh_4_10_2
  • gmsh_4_10_1
  • gmsh_4_10_0
  • gmsh_4_9_5
  • gmsh_4_9_4
  • gmsh_4_9_3
  • gmsh_4_9_2
  • gmsh_4_9_1
  • gmsh_4_9_0
41 results

t13.jl

Blame
  • t13.jl 4.20 KiB
    # ------------------------------------------------------------------------------
    #
    #  Gmsh Julia tutorial 13
    #
    #  Remeshing an STL file without an underlying CAD model
    #
    # ------------------------------------------------------------------------------
    
    import gmsh
    
    gmsh.initialize()
    
    function createGeometryAndMesh()
        # Clear all models and merge an STL mesh that we would like to remesh (from
        # the parent directory):
        gmsh.clear()
        gmsh.merge(abspath(joinpath(@__DIR__, "..", "t13_data.stl")))
    
        # We first classify ("color") the surfaces by splitting the original surface
        # along sharp geometrical features. This will create new discrete surfaces,
        # curves and points.
    
        # Angle between two triangles above which an edge is considered as sharp,
        # retrieved from the ONELAB database (see below):
        angle = gmsh.onelab.getNumber("Parameters/Angle for surface detection")[1]
    
        # For complex geometries, patches can be too complex, too elongated or too
        # large to be parametrized; setting the following option will force the
        # creation of patches that are amenable to reparametrization:
        forceParametrizablePatches = gmsh.onelab.getNumber(
            "Parameters/Create surfaces guaranteed to be parametrizable")[1]
    
        # For open surfaces include the boundary edges in the classification
        # process:
        includeBoundary = true
    
        # Force curves to be split on given angle:
        curveAngle = 180
    
        gmsh.model.mesh.classifySurfaces(angle * pi / 180., includeBoundary,
                                         forceParametrizablePatches,
                                         curveAngle * pi / 180.)
    
        # Create a geometry for all the discrete curves and surfaces in the mesh, by
        # computing a parametrization for each one
        gmsh.model.mesh.createGeometry()
    
        # Note that if a CAD model (e.g. as a STEP file, see `t20.jl') is available
        # instead of an STL mesh, it is usually better to use that CAD model instead
        # of the geometry created by reparametrizing the mesh. Indeed, CAD
        # geometries will in general be more accurate, with smoother
        # parametrizations, and will lead to more efficient and higher quality
        # meshing. Discrete surface remeshing in Gmsh is optimized to handle dense
        # STL meshes coming from e.g. imaging systems, where no CAD is available; it
        # is less well suited for the poor quality STL triangulations (optimized for
        # size, with e.g. very elongated triangles) that are usually generated by
        # CAD tools for e.g. 3D printing.
    
        # Create a volume from all the surfaces
        s = gmsh.model.getEntities(2)
        l = gmsh.model.geo.addSurfaceLoop([e[2] for e in s])
        gmsh.model.geo.addVolume([l])
    
        gmsh.model.geo.synchronize()
    
        # We specify element sizes imposed by a size field, just because we can :-)
        f = gmsh.model.mesh.field.add("MathEval")
        if gmsh.onelab.getNumber("Parameters/Apply funny mesh size field?")[1] != 0
            gmsh.model.mesh.field.setString(f, "F", "2*Sin((x+y)/5) + 3")
        else
            gmsh.model.mesh.field.setString(f, "F", "4")
        end
        gmsh.model.mesh.field.setAsBackgroundMesh(f)
    
        gmsh.model.mesh.generate(3)
        gmsh.write("t13.msh")
    end
    
    # Create ONELAB parameters with remeshing options:
    gmsh.onelab.set("""[
      {
        "type":"number",
        "name":"Parameters/Angle for surface detection",
        "values":[40],
        "min":20,
        "max":120,
        "step":1
      },
      {
        "type":"number",
        "name":"Parameters/Create surfaces guaranteed to be parametrizable",
        "values":[0],
        "choices":[0, 1]
      },
      {
        "type":"number",
        "name":"Parameters/Apply funny mesh size field?",
        "values":[0],
        "choices":[0, 1]
      }
    ]""")
    
    # Create the geometry and mesh it:
    createGeometryAndMesh()
    
    # Launch the GUI and handle the "check" event to recreate the geometry and mesh
    # with new parameters if necessary:
    function checkForEvent()
        action = gmsh.onelab.getString("ONELAB/Action")
        if length(action) > 0 && action[1] == "check"
            gmsh.onelab.setString("ONELAB/Action", [""])
            createGeometryAndMesh()
            gmsh.graphics.draw()
        end
        return true
    end
    
    if !("-nopopup" in ARGS)
        gmsh.fltk.initialize()
        while gmsh.fltk.isAvailable() == 1 && checkForEvent()
            gmsh.fltk.wait()
        end
    end
    
    gmsh.finalize()