The following consists mostly out of excerpts of my diploma thesis so read that instead if you want to go a bit deeper.

I developed this in 2017 independently from [Ben Eadie]'s very similar Idea shared on Hackaday in may 2022.

Ouroboros is open source and you can get it here.


the issue to solve:

The major issue with printing with big nozzles is that at some point the stringing can not be handled by tuning the retraction and temperature settings anymore. This results in messy surfaces with spikes and holes.

Combing can only mitigate the problems and results in even longer travel times. But, didn’t we buy our printers to print and not to travel? And didn’t we choose the 1 mm Nozzle to print big parts crazily fast?

That is why I became obsessed with creating 3D-prints that can be printed in one go without traveling at all.

When your slicer slices an object it generates a set of curves at the intersection of an XY-plane and the object for each layer. These are offset to compensate for the extrusion width. Usually you have no control over the start and the end of the curves, and the slicer wants to print each curve completely before going to the next. This means that even touching curves have travels between them.

I was not willing to accept that.

the theory behind my solution:

What if you could tell the slicer to print one curve to a specific point, switch to another touching curve, print that first and then to continue with the first one? If you could stitch all the curves into one big curve? If you now could also align the end points, preferably to somewhere out of sight, the only travel movements that are left are the layer changes. You can do all of that! I call it stitching and this is how to do it.

Quick Grasshopper introduction:

Grasshopper is a visual scripting interface for Rhino, a Computer Aided Design (CAD) application developed by McNeel & Associates. It has a work flow similar to modular audio synthesizers which allows the creation of parametric geometry by connecting components with “cables”.

A network of Grasshopper components as shown above is called a definition. They have inputs on the left and outputs on the right. The data is organized in so-called data trees which can be thought of as nested lists.

Like variables in programming languages, parameters contain data. They can reference Rhino geometry or contain data that is generated by Grasshopper components. In addition to the Point and Curve parameters you can see in the example, there are a lot of other data types. For example, Boundary Representations (Breps) which can contain surfaces and solids.

There are components for all kinds of operations, for example geometry, manipulating the data tree and mathematics.

Grasshopper has a very active community that provides a multitude of mostly free plug-ins that contain additional components. They can be pre-compiled from C# or contain user editable Grasshopper definitions called "User Objects".

A few words on Xylinus:

Xylinus is a set of Grasshopper User Objects developed by [Ryan Hoover]. It can generate G-code directly from Rhino and Grasshopper geometry.

It works with FDM printers, syringe printers and resin printers.

Ryan Hoover created Xylinus to control bioprinters and other experimental 3D printers he has developed at the Baltimore Under Ground Science Space and the Maryland Institute College of Art.

Within the scope of my diploma project I made quite a few contributions to Xylinus that will be part of the next release. I covered my contributions in my diploma thesis in detail.

Finaly we come to Ouroboros:

The Ouroboros logo
The Ouroboros logo

Ouroboros is the Greek name of the serpent devouring its own tail. Originally The symbol is from Egypt and is found in the mythology of many other ancient peoples. It is interpreted as the eternal cycle of life, death and rebirth and the oneness of everything.

By unifying curves and always returning to the starting point Ouroboros reflects in its name the essence of its function

Ouroboros is a set of user objects intended to be used in conjunction with Xylinus. The heart of it are two components that stitch curves together in the way I described earlier.

Stitch With Points:

"Stitch With Points" combines a list of closed curves into one closed curve using points to position the stitch.

The "Stitch Points" have to be between or near the curves that have to be stitched. Of course you can stitch more than two curves at once. Just make sure that you have one point for each stitch.

Their order is irrelevant - they find their curves by ignoring everything that is more than twice the "Extrusion Width" away.

 It works by constructing a rectangle to cut into the curves, deleting the intersection and connecting the curves by their exposed end points.

The cutting rectangle is constructed by first finding the closest points to the "Stitch Point" on the curves. These points are connected by a line. Its midpoint is the center of the rectangle which is aligned to that line. The rectangle has a width of the "Extrusion Width" and the height of twice that, multiplied by the Cut "Depth Multiplier".

The Cut Depth Multiplier determines how far the rectangle will cut into the curves. If its value is too high, it might cut into other parts of the curve (shown in the left sketch). If it is too low, the rectangle might not cut with its sides and the end points would end up to be too close to each other (shown in the right sketch). The stitches are possibly a weak point. I would advise not to put them on the same spot in each layer.

Stitch With Breps:

Stitch With Breps merges a list of closed curves into one closed curve using solids to generate an alternating stitch pattern.

The intersection between the curves and the Stitch Geometry marks the position of the stitches. The stitch aligns to opposite sides on alternating layers.

Hole Punch:

Hole Punch is, for now,  the only utility component included in Ouroboros.

Sometimes it is unavoidable to break the circle and cut a hole into a curve. Having open curves can result in travel movements but if you need them, they should be right where the hole is.

But just cutting a hole into the closed curve is not going to cut it. We want the layer to be started at the former seam point. If you cut a closed curve in Grasshopper, the seam point will be in the last segment. That segment has to be cut at the seam point and the off cut belongs to the beginning of the layer.
That is what Hole Punch is taking care of for you

Project examples:

During the beginning of the Covid-19 pandemic in 2020 when protective gear like face shields were in high demand and in short supply, I used my pre-Ouroboros workflow to help out.

Prusa Research published 3D-models of a face shield that became the de facto standard, with many compatible variants from the community. It initially took about 3 hours to print but there were several “slim versions” with reduced print times. With a 1 mm nozzle and 0.5 mm layer height I could print in 18 minutes what others printed in 1½ hours. This has to be a world reccord! I have not been given an avard for this jet though. ;)

I printed about 500 pcs. of my Voodoo Face Shields and donated them all to Maker vs Virus who took care of distribution.

The Garberobe was the first project I implemented using this technique.

The name is a mix of Garderobe, the German word for coat rack, and Garbe meaning bundle of hay.

One set of parts is printed in about 4h which is quite fast for 300 grams of material.

You can buy them only in Germany for now. Send my an e-mail or something if you are interessted. they are available in many colors and with oak or ash poles. Because the design is parametric it is also possible to generate tailor made prints for the poles that you have laying around.

My pre Ouroboros work flow:

Before I had started Ouroboros, I achieved satisfying results with Curas Surface Mode. It does not fill out the sliced curves but uses them directly as paths. To show Cura where I want the stitches to connect the compartments, I had to cut holes into the double walls and to connect the surfaces in a staggered pattern as shown below.

Unfortunately, this only works most of the time, but finding the reason can be a nightmare, because Cura is basically a black box.
Another frustrating issue was that crafting these stitches can be a tedious task and when I wanted to change the layer height I had to start all over again.
Although it basically worked fine, there had to be a better solution. When I realised that I could transfer this work flow directly into Rhino and Grasshopper, Ouroboros was born.

Cura settings:

If you want to replicate this technique, you have to edit the following settings:

Set "Surface Mode" to "Surface" and "Z Seam Alignment" to "User Specified". Then you can either select a preset from" Z Seam Position" or define the seam more precisely with "Z Seam X" and "Z Seam Y". The latter has the advantage that you can hide the seam somewhere inside where it doesn’t affect the outer surface.
In some cases "Shortest" works fine as well but the seam will then be on the outside though.

To check if everything worked, uncheck Color Scheme > Shell to reveal the travel paths. They should be neatly stacked. Sub mm variations are allright.

Keep in mind that the seam can only be on a corner and not in the middle of a line.

Also a hint to Cura beginners: Most settings are hidden by default. To get to the Setting Visibility preferences, click on the gear that appears when you hover over a setting category.

The other settings heavily depend on your printer and your geometry. But I had good results with my Anet A8 printer, with Volcano hot end and a 1 mm nozzle, with layer heights between 0.5 mm and 0.75 mm and an outer wall speed between 20 mm/s and 30 mm/s.