Triangular Blanket Extrusion


Looking to CNC a parametric wall out of birch using triangles as a blanketed form.

I’m finding difficulty though in lofting the triangles together to create uniquely mitered edges that respond to their neighbors at a width of 3/4". The connections are intended to be a butt joint aka wood on wood connection. Attached are my files.

example C

Any help would be appreciated
Blanket Triangulation.3dm (12.9 MB)
230806_Blanket (14.8 KB)

I’m not using Lunchbox.

Instead of creating panels with gaps you’d have to create panels without gaps, join everything and use the Brep Topology component to extract the angle between two adjacent panels. Then orient all panels from 3D space to the XY plane.

Below is a simplified version with less triangles and the input curves of your surface internalised. The Rhino file is not needed for this definition.

The angles shown are the angles between the face normals. Negative values are concave, positive angles are convex. You’ll have to divide those by two.

My triangulation is different compared to what you achieved with Lunchbox and I don’t know in what order your triangles will be sorted.

Do you have access to 5-axis sawing?

230806_Blanket (42.1 KB)

Thanks Martin

Our machine uses a 5-axis arm with a variety of drill bits to achieve a clean finish in a variety of ways. Right now we’re testing it out. Our CNC can cut unique angles for each of the triangles edges to acquire this seamless wood-on-wood attachment that is desired.

Our issue now is finding how to create/extrude the surface with a mitered edge in the Z-axis that responds to the neighboring triangle - similar to how 3D Voronoi patterns respond in unison when adjusted. Here’s a sketch that might help explain.

Maybe this is not possible w/ my current script that lofts the geometry through line segments?

Yes that’s a miter cut and the same angle on both side of an edge. So x / 2….

Depending on the substructure used for this project, you could also cut all panels with the same angle.


Anyway, one way to create the panels is by extruding the edges a bit too far and use a C# script with Rhino.Geometry.Brep.CreateSolid

This works for the stripped example. I did not eliminate the intersections at some of the corners. This could be automated but might be an overkill, depending on your machine and CAM.

230806_Blanket (50.9 KB)

1 Like

I took a stab at the problem. One way to ensure zero-gap is to join faces into a mesh and offset said mesh. This however won’t guarantee constant panel thickness. To do so, one further step is required:

. offset to a greater distance than the desired thickness
. make an extruded Brep of each face and its corresponding offset, using a loft to create the connecting perimeter
. trim the Breps with the face planes at the desired offset distance

In this visualization red indicates the non-planar surfaces

Unless you have a torsion-free geometry to begin with, perimeter faces might be non-planar, and to maintain constant panel thickness you will have some uneven situations on one side, like these:

The file requires Weaverbird.

230806_Blanket (41.8 KB)


230806_Blanket (13.9 KB)

1 Like

Dear Tristan
you can do it simply by using this algorithm : (you can see the section, oriented objects and etc.)

Blanket (16.9 KB)


Be aware that in yours and @Rajeev2 method the panels do not retain constant thickness (which I believe was required by Tristan). Just offsetting the surface and repanelizing it does not guarantee that the panels’ front and back faces are parallel.

See this image where I replicated it (the numbers are the angle of the unrolled panels’ top face normal with Z - it should be 0 - also see the non-horizontal condition in the right viewport):

This condition is still acceptable if the thickness is negligible compared to the panels’ dimensions; however, I believe it matters in this case.


The solutions with lofting create no-planar miter surfaces, which of course can be milled but I don’t think this is very efficient compared to cuts with a 5-axis saw.

I haven’t looked at your files or any of those who replied with solutions. I’m confused about the 3/4" gap between them? Is that gap only for the “unrolled” CNC layout?

I assume this is the panel thickness.

Good grief :exclamation: I don’t have Lunchbox so looked at your Rhino file to find that most of your layers are empty except for ‘Layer 07’, which has three sets of what appeared to be triangular surfaces, so I started with one set of them… 270 breps.

It took me a long time to realize that these are extruded surfaces, not the triangular surfaces I want. :frowning:

If you (@Tristan_Ahlquist) can internalize the Surface param (output from Lunchbox?), I’ll take another look, unless you already have a solution. :cry:

P.S. I did some additional work to isolate the two largest surfaces of each brep and sort them by their X position, assuming that one is the base triangle and the other is the extrusion. When I zoom in I see gaps between these surfaces. Why?

Triangular Blanket (20.6 KB)

Martin / Alessio / Rajeev / Mohammad - Thank you all for the quick responses and helpful edits to the script. You all absolutely rock for taking a stab at it. Very impressed.

The thickness of our 12 ply Birch is 3/4" = The constant thickness I’m looking for in each panel.
@Joseph_Oster Preferably each panel will be fastened as a but joint with zero gap between. My desired method of joining panels is the “Lamello Zeta P2 P-System” seen below

Upon reflection… It seems unlikely to have a truly flat connection between panels… or even a flat surface from the secondary surface from the loft for that matter. IMO this could still work if panels are glued together at seams or fastened from behind.

Would be really interested if ya’ll had better ideas on how to make a seamless “Triangulated Blanket” surface that had no curves between joints. A direct panel-to-panel connection. Not married to just triangles either. Is a secondary structure inevitable?


Tristan, it’s right there. Just keep in mind that connecting all these panels with Lamello Zeta also means you have to assemble adjacent parts in perfect perpendicular direction. Zeta is good for anyting orthogonal but what you’re attempting here will be very complicated if not impossible with Zeta.

I’ve been there before.

Here’s a slightly more complex project I created:

Labyrinth @boulderhallebasel - Gallery - McNeel Forum

The miter surfaces in my definition are planar. But if the backside is never visible why don’t you cut all parts with let’s say -20° or -30° and use some good adhesive to glue all parts together using a waffle sub structure?


Thanks for the points you notified me
here is a different approach here the thickness is maintained and all the top is surface have same common edge

230806_Blanket (25.0 KB)

If you’re not married to the exact surface shape either you can try to approximate a panelization to a conical (torsion free) mesh, which would ensure planar thickness faces.

See this post by Daniel Piker for example:

He’s making the example with planar quad (PQ in short) meshes. Planarization and, ahem… “conicalization” (not sure if it’s a proper term) will move some points away from the original surface (there is a way of constraining the edge points to maintain the portal shape though), and the end result will depend on panel size, etc., but, if size and angle between panels remain within the interlocking system constraints, you should be able to use it without secondary structures.

1 Like

This is a very laborious flawed effort using Anemone to trim scaled offset triangles. It has four flaws where it appears to me that adjacent triangles are so close to co-planar that their intersections fail.

The clutter at the bottom left of the first image is diagnostic output that could be hidden. My method for examining each offset triangle is to disable both loop components (start and end, orange group) and move the wires connected to FastLoopStart ‘C’ (Counter) to the integer slider in the yellow group. This allows me to access each triangle separately to see its intersections.

Triangular Blanket (51.3 KB)

It takes the loop ~21 seconds to complete so there is a delay when opening the file or changing parameters. Not shown (because I just wrote it) is a simple ‘“unroll” / layout’ group.

The miter bevels are so slight that it’s probably not worth doing, as @martinsiegrist said. Glue or thickened epoxy would easily fill any gaps.

P.S. I used TriRemesh instead of Lunchbox to get the triangles. Curves to create the lofted base surface are internalized, no need for a Rhino file.

P.P.S. The best way to see the flaws is “preview mode” (green button).


Then select the FastLoopEnd and Tag components:

1 Like

Agreed - Lamello system along a curved system isn’t the answer here and something I doubt could work properly. Our team favored this system due to the speed of production → reduction in lead times. A -20° cut upon a waffle structure / foam backing / manually attaching torsion sides with adhesive are our next investigations.

Thank you for the reference this is great help. In square formations this might seem to work actually.

Thanks for taking a stab at it in another direction to validate the curved connections. Agreed - at such a small width, a mitered curved would be time consuming.

Working now on the following:

  1. Generate extruded panels w/ uniform angle
  2. Substructure that panels can drop into
  3. Square geometry option

Thanks everyone for the help!

What “uniform angle”? Especially since some triangles appear to require a reverse angle on miters. Might as well just make the edges square and deal with gaps, eh?

I used this code from @DanielPiker, posted here:

To produce very different code that is fast and looks accurate.

Triangular Blanket (49.3 KB)

As an afterthought, I added back components I didn’t use (yellow group at the bottom) that shows “dihedral angles” between faces, which range from -32.934998 To 17.201252 degrees with an average of -1.705997 degrees. The sorted list shows quite a few that are ±5 degrees or more.

I also modified the ‘“unroll” / layout’ group to use a grid:

P.S. Come to think of it, those “dihedral angles” in the yellow group are angles between face normal vectors so miter angles would be half of those values? The range is -16.5 To 8.6 degrees with an average of -0.853 degrees?
Triangular Blanket (46.8 KB)

1 Like