diff --git a/gaming_rig/articulation.png b/gaming_rig/articulation.png new file mode 100644 index 0000000..227be2f Binary files /dev/null and b/gaming_rig/articulation.png differ diff --git a/gaming_rig/articulation.scad b/gaming_rig/articulation.scad new file mode 100644 index 0000000..5033379 --- /dev/null +++ b/gaming_rig/articulation.scad @@ -0,0 +1,23 @@ +$fn=60; + +include + +base_width=30; +base_height=10; +base_length=100; + +difference() { + union() { + cuboid([base_width,base_length,base_height], rounding=1); + top_half() xcyl(d=base_length, l=base_width, rounding=1); + } + top_half(z=base_height/2) xcyl(d=base_length*3/4, l=base_width, rounding=-1); + top_half(z=base_height/2) xcyl(d=base_length, l=base_width/3, rounding=-1); + translate([0,base_length/3,0]) zcyl(d=5, l=base_height, rounding=-1); + translate([0,-base_length/3,0]) zcyl(d=5, l=base_height, rounding=-2); +} +difference() { + top_half(z=base_height/3) xcyl(d=base_length/2, l=base_width, rounding=1); + top_half(z=base_height/2) xcyl(d=base_length/2, l=base_width/3, rounding=-1); + translate([0,0,base_height]) xcyl(d=5, l=base_width, rounding=-1); +} \ No newline at end of file diff --git a/gaming_rig/articulation.stl b/gaming_rig/articulation.stl new file mode 100644 index 0000000..3817885 Binary files /dev/null and b/gaming_rig/articulation.stl differ diff --git a/server_rack/images/base_plate.png b/server_rack/images/base_plate.png new file mode 100644 index 0000000..d193fee Binary files /dev/null and b/server_rack/images/base_plate.png differ diff --git a/server_rack/images/triple_ssd_mount.png b/server_rack/images/triple_ssd_mount.png new file mode 100644 index 0000000..6fca252 Binary files /dev/null and b/server_rack/images/triple_ssd_mount.png differ diff --git a/server_rack/scad/base_plate.scad b/server_rack/scad/base_plate.scad new file mode 100644 index 0000000..63944c1 --- /dev/null +++ b/server_rack/scad/base_plate.scad @@ -0,0 +1,59 @@ +$fn=60; + +include +include +include ; + +base_l=190; +base_e=3; +b_height=5; + +module pilar() { + difference() { + zcyl(l=p_height, d=8, rounding1=-2); + zcyl(l=p_height, d=3, rounding=-1); + } +} +// holes_positions +* color("red") { + translate([-60,0,b_height-.5]) ycyl(l=200, d=1); + translate([60,0,b_height-.5]) ycyl(l=200, d=1); +} + +// sample side attach +* difference() { + translate([0, 0, 0]) zcyl(l=5, d=18, rounding2=1); + nutcatch_parallel("M4", clh=0.1); + translate([0,0,10]) hole_through(name="M4", l=10+5, cld=0.1, h=0, hcld=0.4); +} + +// base plate +difference() { + union() { + rect_tube(b_height+1, base_l, wall=base_e, rounding=base_e, irounding=base_e/2, center=true) { + attach(BOT) rect_tube(base_e, base_l, wall=base_e*4, rounding=base_e, irounding=base_e/2, center=true); + } + translate([60,-base_l/2,b_height-.5]) ycyl(l=5.5, d=18, rounding1=1); + translate([-60,-base_l/2,b_height-.5]) ycyl(l=5.5, d=18, rounding1=1); + translate([60,base_l/2,b_height-.5]) ycyl(l=5.5, d=18, rounding2=1); + translate([-60,base_l/2,b_height-.5]) ycyl(l=5.5, d=18, rounding2=1); + } + union() { + translate([60,-base_l/2,b_height-.5]) rotate([90,90,0]) { + nutcatch_parallel("M4", clh=0.1); + translate([0,0,10]) hole_through(name="M4", l=10+5, cld=0.1, h=0, hcld=0.4); + } + translate([-60,-base_l/2,b_height-.5]) rotate([90,90,0]) { + nutcatch_parallel("M4", clh=0.1); + translate([0,0,10]) hole_through(name="M4", l=10+5, cld=0.1, h=0, hcld=0.4); + } + translate([60,base_l/2,b_height-.5]) rotate([-90,90,0]) { + nutcatch_parallel("M4", clh=0.1); + translate([0,0,10]) hole_through(name="M4", l=10+5, cld=0.1, h=0, hcld=0.4); + } + translate([-60,base_l/2,b_height-.5]) rotate([-90,90,0]) { + nutcatch_parallel("M5", clh=0.1); + translate([0,0,10]) hole_through(name="M5", l=10+5, cld=0.1, h=0, hcld=0.4); + } + } +} \ No newline at end of file diff --git a/server_rack/scad/temp.scad b/server_rack/scad/temp.scad new file mode 100644 index 0000000..c02be2c --- /dev/null +++ b/server_rack/scad/temp.scad @@ -0,0 +1,30 @@ +$fn=60; + +include +include + +* import("../stl/dual_2.5_ssd_shelf.stl"); + +module wall() { + difference() { + union() { + translate([0,0,19]) cuboid([3,85,38], rounding=3, edges=[TOP+FRONT,TOP+BACK]); + translate([-1.5,0,2.5]) ycyl(l=85, d=3); + translate([-1.5,0,15.5]) ycyl(l=85, d=3); + translate([-1.5,0,28.5]) ycyl(l=85, d=3); + } + translate([0,-38.5,7]) xcyl(l=3, d=3.5); + translate([0,-38.5,20]) xcyl(l=3, d=3.5); + translate([0,-38.5,33]) xcyl(l=3, d=3.5); + translate([0,38.5,7]) xcyl(l=3, d=3.5); + translate([0,38.5,20]) xcyl(l=3, d=3.5); + translate([0,38.5,33]) xcyl(l=3, d=3.5); + } +} + +color("red") { + rect_tube(h=3, size=[76,85], wall=7); + * cuboid([76,85,3]); + translate([36.5,0,0]) wall(); + translate([-36.5,0,0]) mirror([1,0,0]) wall(); +} \ No newline at end of file diff --git a/server_rack/scad/triple_ssd_mount.scad b/server_rack/scad/triple_ssd_mount.scad new file mode 100644 index 0000000..3da21ae --- /dev/null +++ b/server_rack/scad/triple_ssd_mount.scad @@ -0,0 +1,37 @@ +$fn=60; + +include + +module wall() { + difference() { + union() { + translate([0,0,19]) cuboid([3,85,38], rounding=3, edges=[TOP+FRONT,TOP+BACK]); + translate([-1.5,0,2]) ycyl(l=85, d=3); + translate([-1.5,0,15]) ycyl(l=85, d=3); + translate([-1.5,0,28]) ycyl(l=85, d=3); + } + translate([0,-38.5,7]) xcyl(l=3, d=3.5); + translate([0,-38.5,20]) xcyl(l=3, d=3.5); + translate([0,-38.5,33]) xcyl(l=3, d=3.5); + translate([0,38.5,7]) xcyl(l=3, d=3.5); + translate([0,38.5,20]) xcyl(l=3, d=3.5); + translate([0,38.5,33]) xcyl(l=3, d=3.5); + } +} + + +difference() { + union() { + rect_tube(h=3, size=[85,85], wall=10, center=true, anchor=TOP) + translate([36.5,0,0]) wall(); + translate([-36.5,0,0]) mirror([1,0,0]) wall(); + rotate([0,0,41]) cuboid([170,10,3], rounding=5, edges=[FWD+RIGHT,FWD+LEFT,BACK+RIGHT,BACK+LEFT]); + rotate([0,0,-41]) cuboid([170,10,3], rounding=5, edges=[FWD+RIGHT,FWD+LEFT,BACK+RIGHT,BACK+LEFT]); + tube(od=135, id=125, l=3); + } + * cuboid([66,75,8]); + translate([60,52.5,0]) zcyl(l=10, d=4.5); + translate([60,-52.5,0]) zcyl(l=10, d=4.5); + translate([-60,52.5,0]) zcyl(l=10, d=4.5); + translate([-60,-52.5,0]) zcyl(l=10, d=4.5); +} diff --git a/server_rack/stl/base_plate.stl b/server_rack/stl/base_plate.stl new file mode 100644 index 0000000..90cdbe2 Binary files /dev/null and b/server_rack/stl/base_plate.stl differ diff --git a/server_rack/stl/mini_itx_mount.stl b/server_rack/stl/mini_itx_mount.stl new file mode 100644 index 0000000..0aa7a94 Binary files /dev/null and b/server_rack/stl/mini_itx_mount.stl differ diff --git a/server_rack/stl/triple_ssd_mount.stl b/server_rack/stl/triple_ssd_mount.stl new file mode 100644 index 0000000..a692977 Binary files /dev/null and b/server_rack/stl/triple_ssd_mount.stl differ diff --git a/tir_sportif/support_cible_électronique/rail.pdf b/tir_sportif/support_cible_électronique/rail.pdf new file mode 100644 index 0000000..0aa1c90 Binary files /dev/null and b/tir_sportif/support_cible_électronique/rail.pdf differ diff --git a/tir_sportif/support_cible_électronique/rail_poster.pdf b/tir_sportif/support_cible_électronique/rail_poster.pdf new file mode 100644 index 0000000..b193730 Binary files /dev/null and b/tir_sportif/support_cible_électronique/rail_poster.pdf differ diff --git a/tir_sportif/tripod/images/plate_xs.png b/tir_sportif/tripod/images/plate_xs.png new file mode 100644 index 0000000..5e7084a Binary files /dev/null and b/tir_sportif/tripod/images/plate_xs.png differ diff --git a/tir_sportif/tripod/scad/plate_xs.scad b/tir_sportif/tripod/scad/plate_xs.scad new file mode 100644 index 0000000..57d06e5 --- /dev/null +++ b/tir_sportif/tripod/scad/plate_xs.scad @@ -0,0 +1,20 @@ +$fn=60; + +include +include + +difference() { + union() { + zcyl(d=40, h=10, anchor=RIGHT); + cuboid([80,60,10], rounding=3, edges=[FWD+RIGHT,BACK+RIGHT], anchor=LEFT) + attach(LEFT) prismoid([60,10], [38.5,10], h=25.7, anchor=BOT); + translate([-30,-20,0]) cuboid([30,25,10], rounding=2, edges=[FWD+RIGHT,BACK+RIGHT,FWD+LEFT,BACK+LEFT], spin=60); + } + translate([-20,0,0]) zcyl(d=26, h=10, rounding=-.5); + translate([-30,-20,0]) cuboid([30,2,10], rounding=-.5, spin=60); + translate([40,0,5]) cuboid([75,55,2], rounding=3, edges=[FWD+RIGHT,BACK+RIGHT,FWD+LEFT,BACK+LEFT]); + translate([-30,-25,0]) rotate([0,0,60]) { + ycyl(d=6, h=31) + attach(BACK) zcyl(d=8, h=3, spin=90, anchor=TOP); + } +} \ No newline at end of file diff --git a/tir_sportif/tripod/scad/tube_clamp.scad b/tir_sportif/tripod/scad/tube_clamp.scad new file mode 100644 index 0000000..b4bcf9f --- /dev/null +++ b/tir_sportif/tripod/scad/tube_clamp.scad @@ -0,0 +1,193 @@ +id = 16.3; // inner diameter of ring +od = id+5; // outer diameter of ring +height = 5; // height of ring +gap = 100; // ring opening in degrees +ends=1; // 0 no ends, 1 round ends, 2 clamp ends +hd=1; // mount hole diameter +cd=7; // countersink diameter +cdepth=3; // coutersink depth +blobsize=1; // size of rounded ends, if ends==1 +sw=5; // mounting block width +sdepth=14; // support depth +nholes=1; // number of support holes. +block_holes=[1,2,3,4,5]; // block some holes e.g. [2,3] +sh=10; // mounting block height. NB total height is nholes x height. +support_loc=0; // 0 = mounting block is centered, >0 centred on hole number +support_rot=90; // support angle / clamp angle. +flat_bottom=false; //remove all points below the bottom of the ring for ease of printing +clamp_width=5; // width of clamp ends +clamp_depth=10; // depth of clamp ends +clamp_height=10; // height of clamp ends +clamp_hole=3; // diameter of clap screw hole +clamp_holew=1; // clamp hole width + +// internal constants +$fn=100; +g=1/(nholes+1); +fracs=[for (i=[g:g:(1-g)]) each i]; +sh2=sh+cd; + +module main() { + difference() { + union(){ + // the clip + clip(); + // mounting block + if (nholes>0) { + rotate([support_rot,0,0]) { + if (support_loc==0) { //center + translate([0,0,-(sh/2)*(nholes-1)]){ + support_block(); + } + } else { + translate([0,0,-sh*(support_loc-1)]){ + support_block(); + } + } + } + } + } + if(nholes>0){ + // holes go through clip and mounting block + rotate([support_rot,0,0]) { + if (support_loc==0) { //center + translate([0,0,-(sh/2)*(nholes-1)]){ + holes(); + } + } else { + translate([0,0,-sh*(support_loc-1)]){ + holes(); + } + } + } + } + //flat bottom + if (flat_bottom) { + translate([0,0,-(od+sh)-height/2]) { + cube(2*(od+sh),center=true); + } + } + } +} //main + + +module end_blobs(h,d,angle,od,center=false) { +translate([od,0,0]){ + cylinder(h=h,d=d,center=center); +} +rotate([0,0,angle]) { + translate([od,0,0]){ + cylinder(h=h,d=d,center=center); + } +} +} //end_blobs + +module end_clamps(){ + translate([id/2+clamp_depth/2+(od-id)/4,-clamp_width/2,0]){ + difference(){ + cube([clamp_depth,clamp_width,clamp_height],center=true); + translate([-clamp_holew/2,0,0]) { + rotate([90,0,0]){ + cylinder(d=clamp_hole,h=clamp_width+2,center=true); + } + } + translate([clamp_holew/2,0,0]) { + rotate([90,0,0]){ + cylinder(d=clamp_hole,h=clamp_width+2,center=true); + } + } + cube([clamp_holew,clamp_width+2,clamp_hole],center=true); + } + } + + rotate([0,0,gap]) { + translate([id/2+clamp_depth/2+(od-id)/4,clamp_width/2,0]){ + difference(){ + cube([clamp_depth,clamp_width,clamp_height],center=true); + translate([-clamp_holew/2,0,0]) { + rotate([90,0,0]){ + cylinder(d=clamp_hole,h=clamp_width+2,center=true); + } + } + translate([clamp_holew/2,0,0]) { + rotate([90,0,0]){ + cylinder(d=clamp_hole,h=clamp_width+2,center=true); + } + } + cube([clamp_holew,clamp_width+2,clamp_hole],center=true); + } + } +} +} + +module wedge(h,d,angle,center=false) { +intersection(){ + cylinder(h=h,d=d,center=center); + x = (sqrt(2*(d^2))/2)+1; + y = 0; + xr = x*cos(angle)-y*sin(angle); + yr = x*sin(angle)+y*cos(angle); + + linear_extrude(h*2,center=center){ + if (angle<=90){ + polygon([[x,0],[xr,yr],[0,0]]); + } else if (angle<=180) { + polygon([[x,0],[0,x],[xr,yr],[0,0]]); + } else if (angle<=270) { + polygon([[x,0],[0,x],[-x,0],[xr,yr],[0,0]]); + } else { + polygon([[x,0],[0,x],[-x,0],[0,-x],[xr,yr],[0,0]]); + } + } +} +} //wedge + +module support_block() { +for (k = [g:g:(1-g)]) { + offset=sh*((k-g)/g); + translate([-(sdepth/2)-id/2,0,offset]){ + cube([sdepth,sw,sh],center=true); + } +} +} //support_block + +module clip(){ + rotate([0,0,-gap/2]){ + difference() { + cylinder(h=height,d=od,center=true); + cylinder(h=height*2,d=id,center=true); + wedge(h=height*2,d=od+1,center=true,angle=gap); + } + if (ends==1) { + end_blobs(h=height,d=((od-id)/2)+blobsize,angle=gap,od=(id+(od-id)/2)/2,center=true); + } + if (ends==2) { + end_clamps(); + } + } + +} //clip + +module holes(){ + +for (f = [1:nholes]) { + k=fracs[f-1]; + if (len(search(f,block_holes))==0) { + offset=sh*((k-g)/g); + translate([-(sdepth/2)-id/2,0,offset]){ + // mount holes + rotate([0,90,0]){ + cylinder(h=2*sdepth,d=hd,center=true); + } + // countersink + translate([sdepth/2-cdepth,0,0]){ + rotate([0,90,0]){ + cylinder(h=2*sdepth,d=cd); + } + } +} +} +} +} + +main(); \ No newline at end of file diff --git a/tir_sportif/tripod/stl/04_M3_knurled_knob_12x25.stl b/tir_sportif/tripod/stl/04_M3_knurled_knob_12x25.stl new file mode 100644 index 0000000..bedc6a9 Binary files /dev/null and b/tir_sportif/tripod/stl/04_M3_knurled_knob_12x25.stl differ diff --git a/tir_sportif/tripod/stl/plate_xs.stl b/tir_sportif/tripod/stl/plate_xs.stl new file mode 100644 index 0000000..d0bbcf5 Binary files /dev/null and b/tir_sportif/tripod/stl/plate_xs.stl differ diff --git a/tools/palet_bag/stl/side_modeler_top2.stl b/tools/palet_bag/stl/side_modeler_top2.stl new file mode 100644 index 0000000..12091d5 Binary files /dev/null and b/tools/palet_bag/stl/side_modeler_top2.stl differ diff --git a/tubes/foot_cap.png b/tubes/foot_cap.png new file mode 100644 index 0000000..49e67b9 Binary files /dev/null and b/tubes/foot_cap.png differ diff --git a/tubes/foot_cap_generator_v102.scad b/tubes/foot_cap_generator_v102.scad new file mode 100644 index 0000000..2b657c7 --- /dev/null +++ b/tubes/foot_cap_generator_v102.scad @@ -0,0 +1,81 @@ +include +use +use +use + +// Höhe Rohr +h = 35; // [10:60] + +// Innendurchmesser Rohr +rd = 25.4; + +// Neigungswinkel zu Senkrechten +angel= 20; // [0:90] + +// Wandstärke +wall = 4; // [1:5] + +// Form Grundplatte +form = "r"; // [r:rund, q=:Quadrat] + +// Höhe Grundplatte +hg = 5; // [1:10] + +// Durchmesser Grundplatte +d = 60; // [10:100] + +// Kehle Zwischen Rohr und Grundplatte +kehle = 8; //[1:20] + +// Riffel an der Unterseite +radius = 2; //[0:5] + +/* [Hidden] */ +$fa = 1; +$fs = 0.4; + +// Rundung +fillet = 2; // [0:5] + + +difference() { + union() { + rotate([0, -angel, 0]) { + // Rohr gefast + difference() { + tube(h=2*h, id=rd, wall=wall, center=true); + translate([0, 0, h]) + fillet_cylinder_mask(r=rd/2 + wall, fillet=fillet); + } + // Füllung für Rohr + cylinder(h=tan(angel)*rd + sin(angel)*hg + hg , d=rd, center=true); + } + + // Grundplatte + if(form == "r") { + cyl(l=hg, d=d, fillet=fillet); + } else { + cuboid([d, d, hg], fillet=fillet); + } +} + // unteren Überstand entfernen + translate([0, 0, -(hg + h/2)]) + cylinder(d=d + tan(angel)*h , h=h+hg, center=true); +} +// kehle zwischen Rohr und Grundplatte +skew_xy(xa=-angel, ya=0) +scale([1/cos(angel), 1, 1]) +translate([0, 0, hg/2]) +rotate([180, 0, 0]) +fillet_hole_mask(d=rd + 2*wall, fillet=kehle, overage=0); + +// Riffel an der Unterseite +difference() { + for (i=[1:d/radius/4]){ + translate([4*i*radius - d/2 - radius, d/2, -hg/2]) + rotate([90,0,0]) + cylinder(h=d, r=radius); + } + translate([0, 0, -hg/2 - radius]) + tube(h=2*radius, id2=d, id1=d-4*fillet, od=2*d); +} \ No newline at end of file diff --git a/tubes/tube_clip.png b/tubes/tube_clip.png new file mode 100644 index 0000000..8a7375e Binary files /dev/null and b/tubes/tube_clip.png differ diff --git a/tubes/tube_clip.scad b/tubes/tube_clip.scad new file mode 100644 index 0000000..446e0d7 --- /dev/null +++ b/tubes/tube_clip.scad @@ -0,0 +1,44 @@ +// Provided under a Creative Commons Share Alike License +// CC-BY-SA +// Created by MacLemon + +// This Clip is used for mounting an LED strip to a pipe. Either place it between LEDs, or print from translucent material. I recommend using PET-G. + +//$fn=30; // Usually fine for rendering previews. +//$fn=60; // Used for final rending to .stl. (Yes, this IS slow.) +$fn= $preview ? 15 : 30; // uses 30 fragments for preview, 64 for rendering. + +pipe_diameter = 23.3; //mm Diameter of the pipe the clip shall hold on to. +outer_diameter = 29; //mm Outer diamter of the clip. (How beefy the clip is. +clip_width = 7; //mm Thickness of the clip. Shall fit in between LEDs. +strip_width = 12.3; //mm How wide the LED strip to be mounted is. +strip_height = 3.8; //mm Thickness, or how tall is the LED strip including an optional Epoxy cover. + +rounding = 1; //mm +clip_thickness = outer_diameter - pipe_diameter; // mm + +minkowski(){ + difference(){ + hull(){ // ring + LED strip holder block + cylinder (r = outer_diameter / 2 - rounding / 2, h = clip_width - rounding, center = true); // Clip Ring + translate ([(pipe_diameter + strip_height) / 2, 0, 0]) + cube ([ strip_height + clip_thickness - rounding, strip_width + clip_thickness, clip_width - rounding], center = true); // LED Block + translate ([(-pipe_diameter - strip_height) / 2, 0, 0]) + cube ([ strip_height + clip_thickness - rounding, strip_width + clip_thickness, clip_width - rounding], center = true); // grip Block + } + + // Remove LED strip cutout + translate ([(pipe_diameter / 2 + strip_height + rounding)/2, 0, 0]) + cube ([(pipe_diameter / 2 + strip_height + rounding), strip_width + rounding , clip_width * 2], center = true); + + // Remove clip on section + translate ([-sqrt(2 * pow(outer_diameter, 2))/2, 0, 0]) + rotate ([0, 0 ,135]) { + cube ([outer_diameter, outer_diameter, clip_width * 2 ], center = true); + } + + // Remove pipe + #cylinder (r = pipe_diameter / 2 + rounding, h = clip_width * 12, center = true); + } + sphere (r = rounding); +} diff --git a/tubes/tube_endcap.png b/tubes/tube_endcap.png new file mode 100644 index 0000000..0b40bf4 Binary files /dev/null and b/tubes/tube_endcap.png differ diff --git a/tubes/tube_endcap.scad b/tubes/tube_endcap.scad new file mode 100644 index 0000000..a521c2e --- /dev/null +++ b/tubes/tube_endcap.scad @@ -0,0 +1,64 @@ +// OpenSCAD simple script for a customizable round tube endcap +// By Magonegro JUNE-2016 +// Use your own parameters to customize your endcap. +// Open this in OpenSCAD, then press F6 wait for it to render the CAP and export to stl. +// At print time remember that Buildplate only support ir required tor the upper CAP external overhanging diameter. +InnerMAXDiameter = 20; // Max inner diameter for the rings +InnerMINDiameter = 18; // Keep same as MAX for cylindrical shape +Rings=6; // Number of rings. +RingHeight=3; // Max insertion height = Rings*RighHeight +RingsRatio=1; // Each ring's diameter will be this ratio the vaule of its precedent. + // Enter 1 for uniform rings or 0.97 (for 6 rings) for a conical shape. + // Beware the inner hole, it should be smaller than the last ring. +CAPOuterDiameter=24; // This should equal tube external diameter +CAPHeight=10; // Height of the CAP, included Fillet +Facets=100; // Resolution parameter, minimum value 3 for a triangular CAP, Defaults to 100 for smooth round CAP. Values lower than 30 could render artifacts +InnerHoleDiameter=InnerMINDiameter/1.5; // Average value +InnerHoleHeight=Rings*RingHeight; // Defaults till the cap +Fillet=6; // Fillet radius for the CAP, should be less or equal than CAPHeight. Zero for no fillet. Should be also less o equal than CAPOuterDiameter/2. + +module MakeCap() +{ + difference() + { + union() + { + // Rings + for(i=[0:Rings-1]) + { + Ratio=1-((1-RingsRatio)*(Rings-i)); + translate([0,0,i*RingHeight]) + cylinder(h = RingHeight, + r1 = Ratio*InnerMINDiameter/2, + r2 = Ratio*InnerMAXDiameter/2, + center = false,$fn=Facets); + } + // Cap + translate([0,0,RingHeight*Rings]) + cylinder(h = CAPHeight-Fillet, + r = CAPOuterDiameter/2, + center = false,$fn=Facets); + translate([0,0,RingHeight*Rings+CAPHeight-Fillet]) + cylinder(h = Fillet, + r = CAPOuterDiameter/2-Fillet, + center = false,$fn=Facets); + rotate([0,0,360/2*Facets]) + translate([0, 0, RingHeight*Rings+CAPHeight-Fillet]) + rotate_extrude(convexity = 10,$fn = Facets) + translate([CAPOuterDiameter/2-Fillet, 0, 0]) + intersection() + { + circle(r = Fillet, $fn = Facets); + square(Fillet); + } + } + // Hole + cylinder(h = InnerHoleHeight, + r = InnerHoleDiameter/2, + center = false,$fn=Facets); + + } +} + +// Main +MakeCap();