|
@@ -76,6 +76,8 @@ module h2n_ring(width, depth, radius, height, slot_w, slot_d, band_wall, tube_wa
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// side columns
|
|
|
|
|
+
|
|
|
module h2n_columns(width, height, ring_height, tilt, band, transition, radius, wall) {
|
|
module h2n_columns(width, height, ring_height, tilt, band, transition, radius, wall) {
|
|
|
// side tubes for cables
|
|
// side tubes for cables
|
|
|
for (m = [0, 1]) mirror([m, 0, 0]) {
|
|
for (m = [0, 1]) mirror([m, 0, 0]) {
|
|
@@ -83,15 +85,19 @@ module h2n_columns(width, height, ring_height, tilt, band, transition, radius, w
|
|
|
// angled tube (4 degrees inward tilt)
|
|
// angled tube (4 degrees inward tilt)
|
|
|
difference() {
|
|
difference() {
|
|
|
hull() {
|
|
hull() {
|
|
|
- rounded_block(thin_mint, radius, radius, radius / 1 - thin_mint);
|
|
|
|
|
|
|
+ // rounded_block(thin_mint, radius, radius, radius / 1 - thin_mint);
|
|
|
|
|
+ cylinder(r = radius, h = thin_mint, $fn = facets);
|
|
|
translate([height * tan(tilt) - wall/2, 0, height]) {
|
|
translate([height * tan(tilt) - wall/2, 0, height]) {
|
|
|
- rounded_block(thin_mint, radius, radius, radius / 1 - thin_mint);
|
|
|
|
|
|
|
+ // rounded_block(thin_mint, radius, radius, radius / 1 - thin_mint);
|
|
|
|
|
+ cylinder(r = radius, h = thin_mint, $fn = facets);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
hull() {
|
|
hull() {
|
|
|
- rounded_block_relative(thin_mint, radius, radius, radius / 1 - thin_mint, - wall);
|
|
|
|
|
|
|
+ // rounded_block_relative(thin_mint, radius, radius, radius / 1 - thin_mint, - wall);
|
|
|
|
|
+ cylinder(r = radius - wall, h = thin_mint, $fn = facets);
|
|
|
translate([height * tan(tilt) - wall/2, 0, height]) {
|
|
translate([height * tan(tilt) - wall/2, 0, height]) {
|
|
|
- rounded_block_relative(thin_mint, radius, radius, radius / 1 - thin_mint, - wall);
|
|
|
|
|
|
|
+ // rounded_block_relative(thin_mint, radius, radius, radius / 1 - thin_mint, - wall);
|
|
|
|
|
+ cylinder(r = radius - wall, h = thin_mint, $fn = facets);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
// slots for cables
|
|
// slots for cables
|
|
@@ -100,39 +106,113 @@ module h2n_columns(width, height, ring_height, tilt, band, transition, radius, w
|
|
|
cube([5.0, mount_radius * 4, 22.0]);
|
|
cube([5.0, mount_radius * 4, 22.0]);
|
|
|
translate([0, 2 * mount_radius, 22.0]) {
|
|
translate([0, 2 * mount_radius, 22.0]) {
|
|
|
rotate([0, 90, 0]) {
|
|
rotate([0, 90, 0]) {
|
|
|
- cylinder(r = mount_radius, h = 5.0, $fn = facets);
|
|
|
|
|
|
|
+ cylinder(r = mount_radius + wall, h = 5.0, $fn = facets);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ // connector to bridge
|
|
|
|
|
+ translate([-(width / 2 + mount_radius - wall / 2 - height * tan(tilt)), 0, height]) {
|
|
|
|
|
+ tube(mount_radius + wall / 2, mount_radius, 5.0);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// bridge that connects to capsule array
|
|
|
|
|
+
|
|
|
|
|
+module semi_cylinder(r, h, e = thin_mint) {
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ cylinder(h, r, r, $fn = facets);
|
|
|
|
|
+ translate ([-r*2, -(r+e), -e])
|
|
|
|
|
+ cube([2*(r+e), 2*(r+e), h+2*e]);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+module quarter_sphere(r, e = thin_mint) {
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ sphere(r, $fn = facets);
|
|
|
|
|
+ translate([-r, -r, -r])
|
|
|
|
|
+ cube([2*(r+e), 2*(r+e), (r+e)]);
|
|
|
|
|
+ translate([-r, -r, 0])
|
|
|
|
|
+ cube([(r+e), 2*(r+e), (r+e)]);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-module h2n_bridge(width, height, ring_height, ring_wall, tilt, band, transition, radius, wall) {
|
|
|
|
|
- // triangular transition
|
|
|
|
|
- translate([0, 0, height + band]) {
|
|
|
|
|
|
|
+module cylcube(width, depth, height, wall) {
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ semi_cylinder(r = depth, h = height);
|
|
|
|
|
+ semi_cylinder(r = depth - wall, h = height);
|
|
|
|
|
+ }
|
|
|
|
|
+ translate([-(width + depth / 2), -depth, 0]) {
|
|
|
difference() {
|
|
difference() {
|
|
|
- hull() {
|
|
|
|
|
- rounded_block(thin_mint, width / 2 + radius * 2 - ring_wall - height * tan(tilt), radius, radius / 1 - thin_mint);
|
|
|
|
|
- translate([0, 0, transition - band]) {
|
|
|
|
|
- cylinder(r = radius, h = thin_mint, $fn = facets);
|
|
|
|
|
|
|
+ cube([(width + depth / 2), depth * 2, height]);
|
|
|
|
|
+ translate([0, wall, 0]) {
|
|
|
|
|
+ cube([(width + depth), (depth - wall) * 2, height]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+module h2n_bridge(width, height, ring_height, ring_wall, tilt, band, transition, radius, col_wall, wall) {
|
|
|
|
|
+ // capsule array mount
|
|
|
|
|
+ translate([0, 0, band + 20.0]) {
|
|
|
|
|
+ tetra_capsule_array_mount([-45, 135]);
|
|
|
|
|
+ }
|
|
|
|
|
+ // stalk
|
|
|
|
|
+ translate([0, 0, band]) {
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ tube(mount_radius + wall, mount_radius, 20.0);
|
|
|
|
|
+ // remove the part of the stalk that is inside the bridge
|
|
|
|
|
+ translate([width / 2, 0, -4*thin_mint]) {
|
|
|
|
|
+ rotate([0, -90, 0]) {
|
|
|
|
|
+ semi_cylinder(r = radius + col_wall - wall, h = width);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- hull() {
|
|
|
|
|
- rounded_block_relative(thin_mint, width / 2 + radius * 2 - ring_wall - height * tan(tilt), radius, radius / 1 - thin_mint, - wall);
|
|
|
|
|
- translate([0, 0, transition - band]) {
|
|
|
|
|
- cylinder(r = radius - wall, h = thin_mint, $fn = facets);
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // top of bridge
|
|
|
|
|
+ translate([width / 2, 0, band]) {
|
|
|
|
|
+ rotate([0, -90, 0]) {
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ // curvy ceiling
|
|
|
|
|
+ semi_cylinder(r = radius + col_wall, h = width);
|
|
|
|
|
+ semi_cylinder(r = radius + col_wall - wall, h = width);
|
|
|
|
|
+ // make a hole for the cables
|
|
|
|
|
+ translate([0, 0, width / 2]) {
|
|
|
|
|
+ rotate([0, 90, 0]) {
|
|
|
|
|
+ cylinder(r = mount_radius, h = 10, $fn = facets);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- // triangular base
|
|
|
|
|
- translate([0, 0, height]) {
|
|
|
|
|
- difference() {
|
|
|
|
|
- rounded_block(band, width / 2 + radius * 2 - ring_wall - height * tan(tilt), radius, radius * 0.99 - thin_mint);
|
|
|
|
|
- rounded_block_relative(band, width / 2 + radius * 2 - ring_wall - height * tan(tilt), radius, radius * 0.8 - thin_mint, - wall);
|
|
|
|
|
|
|
+ // caps at ends
|
|
|
|
|
+ for (m = [0, 1]) mirror([m, 0, 0]) {
|
|
|
|
|
+ // fixme: why the 0.3 magic below?
|
|
|
|
|
+ translate([width / 2 - 0.3, 0, band]) {
|
|
|
|
|
+ difference() {
|
|
|
|
|
+ quarter_sphere(r = radius + col_wall);
|
|
|
|
|
+ quarter_sphere(r = radius + col_wall - wall);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // base of bridge
|
|
|
|
|
+ translate([0, 0, 0]) {
|
|
|
|
|
+ for (m = [0, 1]) mirror([m, 0, 0]) {
|
|
|
|
|
+ translate([width / 2 + mount_radius - col_wall - height * tan(tilt) + wall, 0, 0]) {
|
|
|
|
|
+ cylcube(width / 2 - height * tan(tilt), radius + col_wall, band, wall);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // reinforcement beams at the base
|
|
|
|
|
+ translate([-col_wall / 2, -(radius + wall), 0]) {
|
|
|
|
|
+ cube([col_wall, (radius + wall) * 2, col_wall]);
|
|
|
|
|
+ }
|
|
|
|
|
+ for (m = [0, 1]) mirror([m, 0, 0]) {
|
|
|
|
|
+ translate([-width / 2 + radius + wall + 0.5, -(radius + wall), 0]) {
|
|
|
|
|
+ cube([col_wall, (radius + wall) * 2, col_wall]);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -154,20 +234,29 @@ h2n_band_height = 6.0;
|
|
|
// base band width
|
|
// base band width
|
|
|
h2n_band_wall = 1.6;
|
|
h2n_band_wall = 1.6;
|
|
|
|
|
|
|
|
|
|
+// walls for the columns
|
|
|
|
|
+h2n_col_wall = 2 * wall;
|
|
|
|
|
+
|
|
|
// render the whole thing
|
|
// render the whole thing
|
|
|
|
|
|
|
|
-h2n_ring(h2n_width_m, h2n_depth_m, h2n_depth * 0.425, h2n_band_height, h2n_side_band_w, h2n_side_band, h2n_band_wall, 0.0, wall);
|
|
|
|
|
|
|
+difference() {
|
|
|
|
|
+union() {
|
|
|
|
|
+
|
|
|
|
|
+*h2n_ring(h2n_width_m, h2n_depth_m, h2n_depth * 0.425, h2n_band_height, h2n_side_band_w, h2n_side_band, h2n_band_wall, 0.0, wall);
|
|
|
|
|
|
|
|
-h2n_columns(h2n_width_m, connector_height, h2n_band_height, 4.0, 10.0, transition_height, mount_radius + wall, wall);
|
|
|
|
|
|
|
+*h2n_columns(h2n_width_m, connector_height, h2n_band_height, 4.0, 10.0, transition_height, mount_radius + h2n_col_wall, h2n_col_wall);
|
|
|
|
|
|
|
|
-h2n_bridge(h2n_width_m, connector_height, h2n_band_height, h2n_band_wall, 4.0, 10.0, transition_height, mount_radius + wall, wall);
|
|
|
|
|
|
|
+h2n_bridge(h2n_width_m, connector_height, h2n_band_height, h2n_band_wall, 4.0, 10.0, transition_height, mount_radius, h2n_col_wall, wall);
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+*translate([-40, -50, 0]) {
|
|
|
|
|
+ cube([80, 50, 80]);
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
// capsule holders and connector to main body
|
|
// capsule holders and connector to main body
|
|
|
-*rotate([0, 0, -45]) {
|
|
|
|
|
|
|
+*rotate([0, 0, 0]) {
|
|
|
render_tetra_capsule_array(connector_height + transition_height + 30);
|
|
render_tetra_capsule_array(connector_height + transition_height + 30);
|
|
|
- translate([0, 0, connector_height + transition_height]) {
|
|
|
|
|
- tetra_capsule_array_mount([-45, 135]);
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// make sure dimensions are fine
|
|
// make sure dimensions are fine
|