We do a lot of printing at KGL and over the years we've experimented with using 3D printing to make parts for 2D printing. In the last couple years we've done some 2D printing with LEGO, but didn't find existing LEGO parts that could be used to print text.
So we started by taking a printable brick and trying to turn it into "type".
Using OpenSCAD it was fairly straightforward to take an existing model of a LEGO-compatible part and subtract the letter "A" from it to test the idea. After a print or two, we had something that looked like it might work.
The next step was to 3D print a set so we could 2D print a test sheet. We didn't sweat the details such as alignment, etc. because the goal here was just to see how the transfer worked. If it appeared to have potential, we'd work on refinement next.
Jamie annotated the proof and I took that back to OpenSCAD for refinement.

Since I generated the set algorithmicly I didn't want to tweak the position of each letter by hand. I did some digging and learned about the textmetrics() function which gives you the dimensions (among other things) of the object that will be generated by a given invocation of the text() function. With this, it would be fairly straightforward to center each letter on it's LEGO tile.
However, this function isn't currently available in the release builds of OpenSCAD, so I had to get my hands on a nightly/development-snapshot build. I was kind of dreading this because I've built OpenSCAD from scratch before and at least back then, it wasn't fun.
Fortunately I found that this is no longer needed. You can install it via flatpak (which is the prefered way to install things on ElementaryOS) and so in a few minutes I was ready to go.
As it turns out I didn't need the textmetrics() function after all. After cleaning-up my code from various experiments I found that simply specifying the alignment of the text manually moved all the letters damn close to center. This is a major improvement, so for now I'm going to leave it as-is until we do another test (2D) print.

The other tweak was reducing the height of the part slightly. I don't know if the model we're using is just a little different from the real LEGO part, or if it's a matter of (3D) printing tolerance, but the printed parts were just a little taller than the off-the-shelf parts which is a big deal when (2D) printing something this way. I'm not sure exactly how much we need to shave off, so I created a 0.25mm disc and subtracted it from the top of the part.
Finally, there's one remaining improvement needed. The print bed I used for these has a texture to it, and that texture is visible on the (2D) print. I tried to address this by switching back to the original glass bed on my Ender 5+ (Tony), but this only reminded me of why I stopped using that bed (bad adhesion). So before I print another run of these parts I'm going to pick-up a smooth PEI bed for Tony.
More to come.
Jason J. Gullickson, 2026