//Parameter für User //Innenradius der Kurve //Innenradius der Kurve //radius_inner=36; //K0,5 - nicht praktikabel ;) //radius_inner=107.5; //K1 //radius_inner=179; //K1,5 //radius_inner=250.5; //K2 //radius_inner=322; //K2,5 //radius_inner=393.5; //K3 //radius_inner=465; //K3,5 radius_inner=536.5; //K4 track_angle=15; //Grad der Kurve connection_printed_upper=true; //Verbindung fuer gedruckte Kurven untereinander oben connection_printed_lower=false; //Verbindung fuer gedruckte Kurven untereinander unten slots=false; plus=false; smallMiddlePeg = true; //kleineren Zapfen in der Mitte verwenden placeCustomSupports = false; //Eigene Supports drucken (momentan nur fuer die Aussparungen unten, besser Supports vom Slicer verwenden) //Parameter, nicht ändern: track_width=143; track_height=7.5; radius_outer=radius_inner+track_width; railguard_height=12.5; //Hoehe Leitplanke railguard_width=1.5; innerguard_height=6; //Hoehe Innenfuehrung innerguard_width=1.2; plus_width=1.5; plus_height=8; slot_height=5; slot_width=2; conductor_height=0.2; conductor_width=5; bracing_width=1.6; //Breite der Leitplanken-Versteifung bracing_end_angle=0.5; //Winkel, den die äußeren Leitplanken-Versteifungen vom Rand weg sind conductor_pos=[19.5,28.5,37.5,46.5,91.5,100.5,109.5,118.5]; conductor_peg_length = 8; //Laenge der Leiterbahn-Zapfen der Originalschienen conductor_peg_height = 2.8; //Hoehe der Leiterbahn-Zapfen der Originalschienen (fuer Aussparung) conductor_peg_height_printed = conductor_peg_height-.4; //Hoehe der Leiterbahn-Zapfen fuer Verbindung mit gedruckter Schiene bracing_angle_inner=5; //Winkel, in dem etwa eine Versteifung innen gesetzt wird bracing_angle_outer=4; //Winkel, in dem etwa eine Versteifung aussen gesetzt wird // increase the visual detail $fn = 200; //Schienenprofil mit Leitplanken etc., das als Kurve rotiert wird module trackProfile() { translate([radius_inner, 0, 0]) { difference() { union() { //Fahrbahn square([track_width, track_height]); //Leitplanke links translate([5.5, track_height, 0]) square([railguard_width, railguard_height]); //Leitplanke rechts translate([track_width-5.5-railguard_width, track_height, 0]) square([railguard_width, railguard_height]); if(plus) { //Servo plus-Mittelleitplanke, keine Innenfuehrung translate([60+5.5+railguard_width, track_height, 0]) polygon([[-1.5,0],[0,1.5],[0,plus_height],[plus_width,plus_height],[plus_width,1.5],[plus_width+1.5,0]]); } else { //Innenfuehrung //translate([9.5, track_height, 0]) square([innerguard_width, innerguard_height]); translate([9.5, track_height, 0]) polygon([[-1.5,0],[0,1.5],[0,innerguard_height],[innerguard_width,innerguard_height],[innerguard_width,1.5],[innerguard_width+1.5,0]]); } //Leiterbahnen links translate([conductor_pos[0], track_height, 0]) square([conductor_width, conductor_height]); translate([conductor_pos[1], track_height, 0]) square([conductor_width, conductor_height]); translate([conductor_pos[2], track_height, 0]) square([conductor_width, conductor_height]); translate([conductor_pos[3], track_height, 0]) square([conductor_width, conductor_height]); //Leiterbahnen rechts translate([conductor_pos[4], track_height, 0]) square([conductor_width, conductor_height]); translate([conductor_pos[5], track_height, 0]) square([conductor_width, conductor_height]); translate([conductor_pos[6], track_height, 0]) square([conductor_width, conductor_height]); translate([conductor_pos[7], track_height, 0]) square([conductor_width, conductor_height]); } if(slots) { //Slots translate([34.5, track_height-slot_height, 0]) square([slot_width, slot_height+1]); translate([106.5, track_height-slot_height, 0]) square([slot_width, slot_height+1]); } } } } //Versteifung links module bracingLeft() { translate([radius_inner,bracing_width/2,track_height]) rotate([90,0,0]) linear_extrude(bracing_width) polygon([[0,0],[5.5,0],[5.5,railguard_height]]); } //Versteifung rechts module bracingRight() { translate([radius_outer-5.5,bracing_width/2,track_height]) rotate([90,0,0]) linear_extrude(bracing_width) polygon([[0,0],[5.5,0],[0,railguard_height]]); } //Versteifungen am Kurvenverlauf platzieren module placeBracings(right, circaAngle) { //Schleife für Versteifungen bracing_angle_left = track_angle - (bracing_end_angle * 2); bracing_count = round(bracing_angle_left / circaAngle) - 2; //wie viele Versteifungen brauchen wir noch? angle = bracing_angle_left / (bracing_count * 2); //Winkel für die Versteifungen berechnen for(a=[bracing_end_angle:angle:bracing_angle_left]) { if(right) { rotate([0,0,a]) bracingRight(); } else { rotate([0,0,a]) bracingLeft(); } } //Anfang und Ende immer setzen if(right) { rotate([0,0,bracing_end_angle]) bracingRight(); rotate([0,0,bracing_angle_left]) bracingRight(); } else { rotate([0,0,bracing_end_angle]) bracingLeft(); rotate([0,0,bracing_angle_left]) bracingLeft(); } } //Zapfenloecher Definition module pegHoles(printed) { if(printed) { //Leicht andere Position fuer gedruckte Verbindung translate([8.5,0,1.2]) cube([8.5,25,5]); translate([80.5,0,1.2]) cube([8.5,25,5]); } else { translate([7.5,0,1.2]) cube([8.5,25,5]); translate([79.5,0,1.2]) cube([8.5,25,5]); } } //Implementierung Zapfenloecher unten module pegHolesLower() { translate([radius_inner,0,0]) { pegHoles(connection_printed_lower); pegHolesConductor(connection_printed_lower); } } //Implementierung Zapfenloecher oben module pegHolesUpper() { rotate([0,0,track_angle]) translate([radius_inner+track_width,0,0]) rotate([0,0,180]) { pegHoles(connection_printed_upper); pegHolesConductor(connection_printed_upper); } } //Aussparung Stromzapfen Definition module pegHolesConductor(printed) { if(printed) { //Verbindung mit gedruckter Schiene translate([conductor_pos[1]-.2,0,track_height-conductor_peg_height]) cube([conductor_width+.4,conductor_peg_length,conductor_peg_height+10]); translate([conductor_pos[3]-.2,0,track_height-conductor_peg_height]) cube([conductor_width+.4,conductor_peg_length,conductor_peg_height+10]); translate([conductor_pos[5]-.2,0,track_height-conductor_peg_height]) cube([conductor_width+.4,conductor_peg_length,conductor_peg_height+10]); translate([conductor_pos[7]-.2,0,track_height-conductor_peg_height]) cube([conductor_width+.4,conductor_peg_length,conductor_peg_height+10]); } else { //Verbindung mit Originalschiene translate([conductor_pos[1]+.5,0,track_height-conductor_peg_height]) cube([conductor_width-1,conductor_peg_length,conductor_peg_height+10]); translate([conductor_pos[3]+.5,0,track_height-conductor_peg_height]) cube([conductor_width-1,conductor_peg_length,conductor_peg_height+10]); translate([conductor_pos[5]+.5,0,track_height-conductor_peg_height]) cube([conductor_width-1,conductor_peg_length,conductor_peg_height+10]); translate([conductor_pos[7]+.5,0,track_height-conductor_peg_height]) cube([conductor_width-1,conductor_peg_length,conductor_peg_height+10]); } } //Tasche fuer Verriegelung module pocketLocking() { translate([radius_inner-2,4,1.2]) cube([track_width-20,3.5,2.5]); rotate([0,0,track_angle]) translate([radius_inner-2+20,-8,1.2]) cube([track_width,3.5,2.5]); } //Schienenzapfzen aussen module pegSmall() { difference() { translate([0,0,4+1.8]) rotate([0,90,0]) linear_extrude(7.5) //polygon([[0,0],[4,0],[4,4],[2,4],[2,7.5],[4,7.5],[4,8.5],[3,13],[1,13],[0,8.5]]); polygon([[0,0],[4,0],[4,4],[2,4],[2,7.3],[4,7.3],[4,8.5],[3,13],[1,13],[0,8.5]]); linear_extrude(10) polygon([[-0.1,8.5],[1,13],[6.5,13],[7.6,8.5],[7.6,14],[-0.1,14]]); } } //Schienenzapfzen Mitte module pegLarge() { difference() { translate([0,0,4+1.8]) rotate([0,90,0]) linear_extrude(7.5) //polygon([[0,0],[4,0],[4,4],[2,4],[2,7.5],[4,7.5],[4,13.5],[3,18],[1,18],[0,13.5]]); polygon([[0,0],[4,0],[4,4],[2,4],[2,7.3],[4,7.3],[4,13.5],[3,18],[1,18],[0,13.5]]); linear_extrude(10) polygon([[-0.1,13.5],[1,19],[6.5,19],[7.6,13.5],[7.6,19],[-0.1,19]]); } } //pegLarge(); //Zapfen fuer Stromleiter, fuer Verbindung zur Originalschiene module pegConductorOriginal() { difference() { linear_extrude(2) polygon([[0,0],[2.5,0],[2.5,5],[2,7],[0.5,7],[0,5]]); translate([0,0,2]) rotate([0,90,0]) linear_extrude(2.5) polygon([[-0.1,5],[0.5,7],[1.5,7],[2.1,5],[2.1,8],[-0.1,8]]); } } //pegConductor(); //Zapfen fuer Stromleiter, fuer Verbindung zu gedruckter Schiene module pegConductorPrinted() { //doch wieder die cube([conductor_width-1,conductor_peg_length,conductor_peg_height_printed+conductor_height]); //cube([conductor_width,conductor_peg_length,conductor_peg_height_printed+conductor_height]); //Mit korrigierter Position der Loecher muessen die Zapfen nur etwas schmaler sein //cube([conductor_width-.5,conductor_peg_length,conductor_peg_height_printed+conductor_height]); } //Stromleiterzapfen für eine Seite module pegConductors(printed) { if(printed) { //Verbindung mit gedruckter Schiene z_offset=track_height-conductor_peg_height+(conductor_peg_height-conductor_peg_height_printed); //Abstand von unten /*translate([conductor_pos[1]+1,0,z_offset]) pegConductorPrinted(); translate([conductor_pos[3]+1,0,z_offset]) pegConductorPrinted(); translate([conductor_pos[5]+1,0,z_offset]) pegConductorPrinted(); translate([conductor_pos[7]+1,0,z_offset]) pegConductorPrinted();*/ /*translate([conductor_pos[1],0,z_offset]) pegConductorPrinted(); translate([conductor_pos[3],0,z_offset]) pegConductorPrinted(); translate([conductor_pos[5],0,z_offset]) pegConductorPrinted(); translate([conductor_pos[7],0,z_offset]) pegConductorPrinted();*/ translate([conductor_pos[1]+.5,0,z_offset]) pegConductorPrinted(); translate([conductor_pos[3]+.5,0,z_offset]) pegConductorPrinted(); translate([conductor_pos[5]+.5,0,z_offset]) pegConductorPrinted(); translate([conductor_pos[7]+.5,0,z_offset]) pegConductorPrinted(); } else { //Verbindung mit Originalschiene x_offset_single = (conductor_width-2.5) / 2; //Einrueckung pro Stromleiter z_offset=4.6; //Abstand von unten translate([conductor_pos[1]+x_offset_single,0,z_offset]) pegConductorOriginal(); translate([conductor_pos[3]+x_offset_single,0,z_offset]) pegConductorOriginal(); translate([conductor_pos[5]+x_offset_single,0,z_offset]) pegConductorOriginal(); translate([conductor_pos[7]+x_offset_single,0,z_offset]) pegConductorOriginal(); } } //pegConductors(); //Alle Schienenzapfen generieren module pegs() { //Schienenzapfen unten //Aussen //translate([radius_outer-7,0,0]) rotate([0,0,180]) pegSmall(); translate([radius_outer-8.5,0,0]) rotate([0,0,180]) pegSmall(); //Mitte //translate([radius_inner+54+7,0,0]) rotate([0,0,180]) pegLarge(); //translate([radius_inner+56+7,0,0]) rotate([0,0,180]) pegLarge(); translate([radius_inner+55.5+7,0,0]) rotate([0,0,180]) if(smallMiddlePeg) pegSmall(); else pegLarge(); //Stromleiter unten translate([radius_outer,0,0]) rotate([0,0,180]) pegConductors(connection_printed_lower); //Schienenzapfen oben //Aussen rotate([0,0,track_angle]) translate([radius_inner+8.5,0,0]) pegSmall(); //Mitte rotate([0,0,track_angle]) translate([radius_outer-55.5-7,0,0]) if(smallMiddlePeg) pegSmall(); else pegLarge(); //Stromleiter oben rotate([0,0,track_angle]) translate([radius_inner,0,0]) pegConductors(connection_printed_upper); } //Aussparung unten fuer Bahnstueckverriegelung etc. module cutoutBottom() { translate([17.5,2,0]) cube([60.5,12,4]); translate([90,2,0]) cube([35,12,4]); } //rotate([0,0,180]) cutoutBottom(); //Alle Aussparungen unten module cutoutsBottom() { translate([radius_inner,0,0]) cutoutBottom(); rotate([0,0,track_angle]) translate([radius_outer,0,0]) rotate([0,0,180]) cutoutBottom(); } //Custom Supports module cutoutButtomSupports() { translate([22.5,5,0]) { cube([50.5,6,0.2]); cube([50.5,0.4,4]); translate([0,5.6,0]) cube([50.5,0.4,4]); cube([0.4,6,4]); translate([50.5,0,0]) cube([0.4,6,4]); } translate([95,5,0]) { cube([25,6,0.2]); cube([25,0.4,4]); translate([0,5.6,0]) cube([25,0.4,4]); cube([0.4,6,4]); translate([25,0,0]) cube([0.4,6,4]); } } //cutoutButtomSupports(); /*module pegMiddleCustomSupports() { polygon([[0,0],[4,0],[4,4],[2,4],[2,7.3],[4,7.3],[4,8.5],[3,13],[1,13],[0,8.5]]); } pegMiddleCustomSupports();*/ module customSupports() { //Cutout Bottom translate([radius_inner,0,0]) cutoutButtomSupports(); rotate([0,0,track_angle]) translate([radius_outer,0,0]) rotate([0,0,180]) cutoutButtomSupports(); //TODO: Pegs, conductor pegs (normal und printed) } //Gesamtobjekt translate([-radius_inner,0,0]) union() { difference() { //Schienenprofil extrudieren rotate_extrude(angle = track_angle, convexity = 10, $fn = 400) trackProfile(); pegHolesLower(); pegHolesUpper(); pocketLocking(); cutoutsBottom(); } //Versteifungen setzen placeBracings(false, bracing_angle_inner); placeBracings(true, bracing_angle_outer); //Zapfen pegs(); //Custom Supports if(placeCustomSupports) customSupports(); }