FabButton¶
“Good design gets edited. Bad design gets rebuilt.”
Background¶
When my colleague Onik Babajanyan and I entered the building, we noticed that Neil Gershenfeld was taking measurements at the location where the toilet flush button was missing. I told Neil that it looked like a very interesting project.
Shortly after, I suggested that I could take on the project myself, and Neil kindly agreed.
Project organization¶
In this article, I want to share my approach to designing a toilet flush button and explain how I work with parametric modeling.
I often spend more time on the design phase than I technically have to, but this is a deliberate choice. My goal is to create a parametric design that can be easily edited and adapted to new conditions later, without rebuilding the model from scratch.
When working on any project, I follow several key principles:
-
the project must be easy to edit;
-
the project must be easy to read, both for my future self and for other users;
-
all critical dimensions and dependencies must be clearly defined.
Most of my projects include mounting features. Since I work with different 3D printers and machines, their manufacturing accuracy can vary. For this reason, my designs always include parameters that account for tolerances and equipment inaccuracies.
In addition, many models contain dimensions that are interdependent. To avoid confusion and to prevent accidentally breaking the geometry, I explicitly highlight these dependencies in the parameter table (Spreadsheet). This helps avoid situations where changing a single value breaks the entire part.
The button design was created in FreeCAD, and all key parameters were defined in the Spreadsheet workbench.
When creating parameters, I follow a specific naming system:
-
parameters are logically grouped;
-
camelCase is used;
-
each part has its own prefix.
For example, if a parameter belongs to the Button part, its short name starts with a lowercase b. If the parameter represents height, the next letter is uppercase H. In this way, the parameter representing the button height is named bH.
In FreeCAD, the Spreadsheet can be used almost like a regular table: you can add text, merge cells, and visually structure data. I use the following organization principle:
- I merge several columns and place the part name in the center, for example Button;

-
one parameter is assigned per row;
-
in the first column, I write the parameter description, for example “Height”;
-
then, by right-clicking the adjacent cell and opening Properties…, I set:
-
Display unit (for example, mm);
-
Alias (for example, bH);
-

-
in the next column, I repeat the Alias as plain text to easily see all available variables;
-
in another column, I write the parameter name in my native language — Armenian or Russian. I usually use Russian, because translation from Russian to English works much better than from Armenian.
This way, each parameter first has an English name for people who use my design, and then a name in Armenian or Russian for my own convenience.
If a parameter has dependencies and manually changing its value may break the geometry, I mark it as automatically re-growing in a separate column and highlight the entire row in red for clarity. If a parameter is fixed, I mark it as Fixed and highlight the row in blue.

This approach allows me to maintain control over complex parametric models, quickly adapt them to new conditions, and preserve both readability and logical structure of the project.
Design of parts¶
In order to install the button onto the toilet cistern, I first needed to design and manufacture a part that would secure the cistern lid in place.

I also designed a nut to fix this part using the existing screw.

The nut was designed so that it fits tightly at the bottom, while the upper part has a stepped shape, allowing it to be tightened by hand.
Next, I moved on to designing the button itself. I added a logo area where the Fab Academy logo would later be printed in color.

Below is a photo showing all the parts together:

Test¶
Before printing the final parts, I conducted small test prints to check the fit between the button

and the fixing part using the Original Prusa i3 MK3:

Printing the Parts¶
Since the button required a colored logo, it was necessary to use a printer capable of multi-color printing. The Original Prusa XL – 5-toolhead 3D Printer was a very good fit for this task.
As I had no prior experience working with this printer or its slicer, I received valuable help from Patrick Dezseri.

Then I printed the part.
After that, it was time for assembly.

However, the connection between the parts turned out to be slightly weak. To ensure the button worked correctly, my colleague Onik Babajanyan and I manually adjusted the button, and eventually it fit properly.

This issue occurred because the initial test prints were made on a different printer.

The design required a parameter adjustment so that the button could securely lock into place without the need for manual post-processing. Since many people were using the printer at the time, I could not immediately reprint the updated version.
After the button was installed, I made several improvements to the project. The file that I plan to publish on this page already includes these changes.
Parameter adjustment¶
To ensure reliable fixation of the button without the need for manual post-processing, a parameter adjustment in the design was required. At that time, the printer was heavily in use, so I was not able to print the updated version immediately.
There are two key principles that the button mechanism must satisfy:
First, the connection between the button and the insert must provide enough clearance to allow the button to rotate freely.
Second, the size of the “through hole” must be large enough for the button connection to pass through during assembly, yet tight enough afterward to prevent the button from falling out.
The first requirement did not cause any issues. However, the second one required adjusting the parameter value.
Eventually, I was able to find a suitable value for the “through hole” parameter in the mounting part.

With this adjustment, the button no longer falls out, and removing it from its seated position is not trivial. If removal is necessary, it can be done with the help of a tool.

The final test was successful:
After that, I permanently installed the button in its final position.
Conclusion¶
If you plan to print this part on a different 3D printer, you should first print the test parts test-1 and test-2. Once you confirm that the connection works correctly, you can proceed with printing the Insert and Button parts. If the test fails, adjust the parameters mB or mThole, depending on the issue. Additionally, if you change the printer and the printed Nuts part does not screw on properly, you will need to adjust the nB parameter.
Files¶
If you change a parameter value, an error may occur: Pad013: Wire is not closed. In this case, open Sketch029, then click on any point and try to move it slightly. After that, close the Tasks panel — the error should disappear.