Fill the repository

This commit is contained in:
2026-04-05 20:11:23 +02:00
parent 0fc2818264
commit 77e17a9915
32 changed files with 163433 additions and 2 deletions
+198
View File
@@ -0,0 +1,198 @@
// ------------------------------------------------------------------------
// Customizable struts for Fischertechnik.
// The modules in this file can be used to generate:
// - i-struts (struts with a length which is a multiple of the basic
// building block (15 mm)). i-struts may or may not have additional
// eyelets every 15 mm.
// - x-struts with predefined length corresponding to the Fischertechnik
// original struts.
// - x-struts with any length to connect other diagonal distances than
// the standard x-struts.
//
// Diagonal distances between structural design elements (15 mm grid) which
// might be printable depending on your 3D printers build plate:
// from https://www.ftcommunity.de/data/downloads/beschreibungen/statikhilfe.pdf
// R15 | 15 | 30 | 45 | 60 | 75 | 90 | 105 | 120 | 135 |
// 15 | 21,2 | | | | | | | | |
// 30 | 33,5 | 42,4 | | | | | | | |
// 45 | 47,4 | 54,1 | 63,6 | | | | | | |
// 60 | 61,8 | 67,1 | 75,0 | 84,9 | | | | | |
// 75 | 76,5 | 80,8 | 87,5 | 96,0 | 106,1 | | | | |
// 90 | 91,2 | 94,9 | 100,6 | 108,2 | 117,2 | 127,3 | | | |
// 105 | 106,1 | 109,2 | 114,2 | 120,9 | 129,0 | 138,3 | 148,5 | | |
// 120 | 120,9 | 123,7 | 128,2 | 134,2 | 141,5 | 150,0 | 159,5 | 169,7 | |
// 135 | 135,8 | 138,3 | 142,3 | 147,7 | 154,4 | 162,2 | 171,0 | 180,6 | 190,9 |
// 150 | 150,7 | 153,0 | 156,6 | 161,6 | 167,7 | 174,9 | 183,1 | 192,1 | 201,8 |
// 165 | 165,7 | 167,7 | 171,0 | 175,6 | 181,2 | 187,9 | 195,6 | 204,0 | 213,2 |
// 180 | 180,6 | 182,5 | 185,5 | 189,7 | 195,0 | 201,2 | 208,4 | 216,3 | 225,0 |
//
// ------------------------------------------------------------------------
//----------------------- parameters ---------------------------
/* [Strut options] */
// The type of the strut, may be an I-Strut or an X-Strut
StrutType = 0; // [0 : no output, 1:X-Strut, 2:I-Strut, 3:I-Strut with hole]
// The length of the I-Strut (should be a multiple of the basic block size of 15 mm)
I_Strut_Length = 60; // [15:15:195]
// The length of the X-Strut
X_Strut_Length = 42.4; // [21.2, 42.4, 63.6, 84.8, 106.1, 127.3, 148.5, 169.6, 190.9]
// An individual strut length for X-Struts (overrides X_Strut_Length if > 1.0)
Individual_Strut_Length = 0.1;
// Should the backside be indented too? If printed with indention, the indention is too small to use support structures and remove them successfully.
Indent_Backside = 0; // [0:No, 1:Yes ]
/* [Hidden] */
// **********************
// ** Static Settings: **
// **********************
// $fn = 50;
$fa = 0.5; // default minimum facet angle is now 0.5
$fs = 0.5; // default minimum facet size is now 0.5 mm
// Build plate size correction for the eyelets
Correction = 0.2; // [0.0, 0.1, 0.2, 0.3]
strut_radius = 3.975;
strut_width = 7.95;
strut_thickness = 2.8;
// strut_eyelet_radius = 3.2;
strut_eyelet_radius = 3.3;
jut = 0.1;
eyelet_height = strut_thickness + jut;
// *********************
// ** Helper Modules: **
// *********************
// --------------------------------------------------------------------
// a basic strut without any eyelets
// --------------------------------------------------------------------
module strut(len = 15, h = strut_thickness, w = strut_width) {
hull() {
cylinder(d = w, h = h, center = true);
translate([0, len, 0])
cylinder(d = w, h = h, center = true);
}
}
// --------------------------------------------------------------------
// a single eyelet which can be substracted from a strut
// --------------------------------------------------------------------
module strut_eyelet(radius = strut_eyelet_radius, correctionVal = 0.0) {
cube_width = radius * 2;// apply_correction(7.2, correctionVal, horizontal);
cube_height = 3.1; // apply_correction(3.1, correctionVal, horizontal);
union() {
// prefix the intersection with render(), otherwise we'll get
// a message "Normalized Tree is growing past 200000 elements"
// on i_struts with a lot of eyelets.
// It takes a bit on the first compile, but the after rendering
// the eyelet is in the cache and draws relatively fast.
// Without the render() an i_strut(360) takes forever to calculate.
render() intersection() {
#union() {
cube([cube_height,cube_width,eyelet_height], center = true);
cylinder(r = 2.1, h = eyelet_height, center = true);
}
cylinder(r = radius, h = eyelet_height, center = true);
}
translate([0, 0, 0.375 + 0.65])
cylinder(r = radius, h = 0.75 + jut, center = true);
translate([0, 0,-(0.375 + 0.65)])
cylinder(r = radius, h = 0.75 + jut, center = true);
}
}
// --------------------------------------------------------------------
// a single indention to be placed between two eyelets on a strut.
// --------------------------------------------------------------------
module indention(len = 1, width = 1, off = 1, indention = 1) {
translate([0, len / 2, indention])
cube([width, len - off * 2, 0.75 + jut], center = true);
}
// --------------------------------------------------------------------
// a row of eyelets every 15 mm for the i-struts
// --------------------------------------------------------------------
module strut_eyelet_row(cnt = 1, eyelet_dist = FT_GRID_SIZE, correction = 0.0) {
for (i = [0 : eyelet_dist : cnt * eyelet_dist]) {
translate([0, i, 0]) {
strut_eyelet(correctionVal = correction);
}
}
}
// --------------------------------------------------------------------
// a row of indentions between the eyelets on an i-strut
// --------------------------------------------------------------------
module strut_indention_row(cnt = 1, eyelet_dist = FT_GRID_SIZE, indention = 0.375 + 0.65) {
for (i = [0 : eyelet_dist : cnt * eyelet_dist]) {
translate([0, i, 0])
indention(len = eyelet_dist, width = strut_eyelet_radius * 2, off = strut_radius, indention = indention);
}
}
// ********************
// ** Strut Modules: **
// ********************
// --------------------------------------------------------------------
// a strut with an eyelet at both ends and the length as text on the
// center of the indendtion
// --------------------------------------------------------------------
module x_or_i_strut(len = FT_GRID_SIZE * 2, h = strut_thickness, w = strut_width) {
union() {
difference() {
strut(len = len, h = h, w = w);
strut_eyelet();
translate([0, len, 0])
strut_eyelet();
indention(len = len, width = strut_eyelet_radius * 2, off = strut_radius, indention = 0.375 + 0.65);
if (Indent_Backside == 1)
indention(len = len, width = strut_eyelet_radius * 2, off = strut_radius, indention = -(0.375 + 0.65));
}
linear_extrude(height = 1.1, convexity = 100, twist = 0)
translate([0,len / 2 , 1])
rotate([0, 0, 90])
text(str(len), font="Impact", size = 3.5, valign="center", halign="center");
}
}
// --------------------------------------------------------------------
// an i-strut with eyelets every 15mm
// --------------------------------------------------------------------
module i_strut_with_holes(len = FT_GRID_SIZE * 2, h = strut_thickness, w = strut_width) {
difference() {
strut(len = len, h = h, w = w);
strut_eyelet_row(len / FT_GRID_SIZE);
strut_indention_row(cnt = (len / FT_GRID_SIZE) - 1);
if (Indent_Backside == 1)
strut_indention_row(cnt = (len / FT_GRID_SIZE) - 1, indention = -(0.375 + 0.65));
}
}
// ********************
// ** Build section: **
// ********************
module main() {
if (StrutType == 1) {
if (Individual_Strut_Length > 1.0)
x_or_i_strut(len = Individual_Strut_Length);
else
x_or_i_strut(len = X_Strut_Length);
}
else if (StrutType == 2) {
x_or_i_strut(len = I_Strut_Length);
}
else if (StrutType == 3) {
i_strut_with_holes(len = I_Strut_Length);
}
}
main();