# In Sage is there support for non-convex polyhedra?

Which reference page gives help or examples? Can they be triangulated? I want to triangulate them in order to help turn them into stl files.

edit retag close merge delete

Sort by » oldest newest most voted

### Export SageMath nonconvex polyhedron to STL

We construct a non-convex polyhedron and export it to STL.

Define a list of vertices given as triples for points in $\mathbb{R}^3$.

v = [( 1,  0,  0), ( 2,  0, -1), ( 3,  0,  0), ( 2,  0,  1),
( 0,  1,  0), ( 0,  2, -1), ( 0,  3,  0), ( 0,  2,  1),
(-1,  0,  0), (-2,  0, -1), (-3,  0,  0), (-2,  0,  1),
( 0, -1,  0), ( 0, -2, -1), ( 0, -3,  0), ( 0, -2,  1)]


Define a list of faces: each face is a tuple of indices where each index refers to a vertex in the list of vertices.

f = [(4*k + j, 4*((k+1)%4) + j, 4*((k+1)%4) + (j+1)%4, 4*k + (j+1)%4)
for k in range(4) for j in range(4)]


Now define a polyhedron using the function polygons3d, which takes as arguments a list of vertices and a list of faces as above. In addition, use threejs_flat_shading=True for correct shading in the Three.js rendering.

torus = polygons3d(points=v, faces=f, threejs_flat_shading=True)


View the polyhedron.

torus.show(frame=False)


Save it in STL format (this saves to binary STL).

torus.save('diamond_torus.stl')


To get the ascii STL:

torus_ascii_stl = torus.stl_ascii_string()
print(torus_ascii_stl)


To save the polyhedron to ascii STL, write that ascii string to a file:

with open('diamond_torus_ascii.stl', 'w') as f:
f.write(torus_ascii_stl)


Note also that Blender can be made to use SageMath's Python, so Python scripting in Blender can use all the power of Sage.

Edit (2021-04-29): support for polyhedral complexes is coming:

more

Thank you - this was very helpful.
I did not know I could directly save it in stl format. In my convex examples I was using the function/attribute
"triangulate" and then using a surface_to_stl routine to generate the stl. I notice that this polygon3d does not have a triangulate attribute. Also that the saved stl file is binary - is there a way to get the stl file in text format?

1

Once the polyhedron has a name (here torus), explore its methods with torus.<TAB> where <TAB> means hitting the TAB key. Or if you want only methods starting in stl, type torus.stl<TAB>. This reveals the two methods .stl_binary and .stl_ascii_string. You can then check their documentation with torus.stl_ascii_string? and their source code with torus.stl_ascii_string??.