// ------------------------------------------------------------------------ // 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: ** // ********************** include // $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();