# How to construct a \`Mesh\` from faces containing \`TriangleFace\` and \`QuadFace\` with GeometryBasics

**URL:** <https://discourse.julialang.org/t/how-to-construct-a-mesh-from-faces-containing-triangleface-and-quadface-with-geometrybasics/112001>\
**Category:** Visualization\
**Tags:** question, package, 3d\
**Created:** [March 23, 2024, 3:21am UTC](https://discourse.julialang.org/t/how-to-construct-a-mesh-from-faces-containing-triangleface-and-quadface-with-geometrybasics/112001 "2024-03-23T03:21:06Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![kimikage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kimikage/32/14534_2.png) [@kimikage](https://discourse.julialang.org/u/kimikage)\
**Post date:** [March 23, 2024, 3:21am UTC](https://discourse.julialang.org/t/how-to-construct-a-mesh-from-faces-containing-triangleface-and-quadface-with-geometrybasics/112001/1 "2024-03-23T03:21:07Z")

</div>

I am trying to do read/write of a simple Wavefront .obj file _without triangulation_.

However, the following will result in an error.

```julia-repl
julia> using GeometryBasics # v0.4.10

julia> vertices = Point3f[(0, 0, 0), (1, 0, 0), (1, 1, 0), (0, 1, 0), (0, 0, 1)];

julia> faces = [QuadFace(1, 2, 3, 4), TriangleFace(5, 2, 1)];

julia> Mesh(vertices, faces)
ERROR: MethodError: no method matching Polytope(::Type{Point{3, Float32}}, ::Type{NgonFace{S, Int64} where S})

julia> VERSION
v"1.10.2"

```

The construction will succeed if the type is sufficiently qualified as follows:

```julia
using GeometryBasics
import GeometryBasics.Ngon

TQFace = Union{TriangleFace{Int},QuadFace{Int}}
TQNgon = Union{Triangle{3,Float32}, Ngon{3,Float32,4,Point3f}}

vertices = Point3f[(0, 0, 0), (1, 0, 0), (1, 1, 0), (0, 1, 0), (0, 0, 1)]
tqfaces = TQFace[QuadFace(1, 2, 3, 4), TriangleFace(5, 2, 1)]

faceview = FaceView{TQNgon,Point3f,TQFace,Vector{Point3f},Vector{TQFace}}(vertices, tqfaces); # `show` throws an error

mesh = Mesh(faceview); # `show` throws an error

```

```julia-repl
julia> faces(mesh) # seems to be working
2-element Vector{Union{TriangleFace{Int64}, QuadFace{Int64}}}:
 [1, 2, 3, 4]
 TriangleFace(5, 2, 1)

```

Are there additional packages that would be useful for this use case?

---

<div class="post-metadata">

**Author:** ![mkitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkitti/32/12459_2.png) [@mkitti](https://discourse.julialang.org/u/mkitti)\
**Post date:** [March 23, 2024, 3:36am UTC](https://discourse.julialang.org/t/how-to-construct-a-mesh-from-faces-containing-triangleface-and-quadface-with-geometrybasics/112001/2 "2024-03-23T03:36:48Z")

</div>

What you probably want to do is convert all of your faces to `TriangleFace`

---

<div class="post-metadata">

**Author:** ![kimikage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kimikage/32/14534_2.png) [@kimikage](https://discourse.julialang.org/u/kimikage)\
**Post date:** [March 23, 2024, 3:47am UTC](https://discourse.julialang.org/t/how-to-construct-a-mesh-from-faces-containing-triangleface-and-quadface-with-geometrybasics/112001/3 "2024-03-23T03:47:08Z")

</div>

Triangulation is an irreversible process. 😕  
On the other hand, converting a `TriangleFace` to a `QuadFace` with duplicate vertices may work.  
However, I do not know if the workaround is common.

---

<div class="post-metadata">

**Author:** ![juliohm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/juliohm/32/215266_2.png) [@juliohm](https://discourse.julialang.org/u/juliohm)\
**Post date:** [March 23, 2024, 9:00am UTC](https://discourse.julialang.org/t/how-to-construct-a-mesh-from-faces-containing-triangleface-and-quadface-with-geometrybasics/112001/4 "2024-03-23T09:00:22Z")

</div>

Meshes.jl is what you need, most likely.

---

<div class="post-metadata">

**Author:** ![kimikage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kimikage/32/14534_2.png) [@kimikage](https://discourse.julialang.org/u/kimikage)\
**Post date:** [March 23, 2024, 9:27am UTC](https://discourse.julialang.org/t/how-to-construct-a-mesh-from-faces-containing-triangleface-and-quadface-with-geometrybasics/112001/5 "2024-03-23T09:27:40Z")

</div>

IIUC, Meshes.jl is independent of the GeometryBasics.jl ecosystem.  
I prefer Meshes.jl’s design, but there is some resistance to say goodbye to GeometryBasics.jl. 😅

Regardless, my objective can be achieved, and I would like to use Meshes.jl as a solution.

---

<div class="post-metadata">

**Author:** ![kimikage](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kimikage/32/14534_2.png) [@kimikage](https://discourse.julialang.org/u/kimikage)\
**Post date:** [March 23, 2024, 3:38pm UTC](https://discourse.julialang.org/t/how-to-construct-a-mesh-from-faces-containing-triangleface-and-quadface-with-geometrybasics/112001/6 "2024-03-23T15:38:17Z")

</div>

Using Meshes.jl, a mesh with triangular and rectangular faces could be generated from the SVG of Julia’s logo. 😃

 ![SimpleMesh](https://global.discourse-cdn.com/julialang/original/3X/0/6/0637708e8a8e19c962b0e536f229368afdbb6c3a.png)
