base updates
This commit is contained in:
+79
-78
@@ -30,8 +30,9 @@ inlay_clearance = 0.08;
|
||||
|
||||
/* [McMaster 97171A240 inserts] */
|
||||
insert_pilot_diameter = 8.1;
|
||||
insert_body_length = 9.525;
|
||||
insert_flange_diameter = 12.9;
|
||||
insert_length = 12.7;
|
||||
insert_flange_diameter = 9.525;
|
||||
insert_flange_seat_diameter = 10.5;
|
||||
insert_flange_depth = 1.35;
|
||||
screw_clearance_diameter = 6.8;
|
||||
insert_boss_diameter = 20;
|
||||
@@ -80,13 +81,17 @@ assert(plate_width <= 256 && plate_depth <= 256,
|
||||
"Base exceeds the X2D main-nozzle build area");
|
||||
assert(plate_height >= 13.462,
|
||||
"Insert bosses violate McMaster's 0.530-inch minimum material thickness");
|
||||
assert(insert_flange_seat_diameter > insert_flange_diameter,
|
||||
"Insert flange relief must provide clearance around the brass flange");
|
||||
assert(plate_height >= insert_length + insert_flange_depth,
|
||||
"Insert length and flange relief exceed the boss thickness");
|
||||
assert(top_skin > inlay_depth,
|
||||
"Top skin must be thicker than the inlay");
|
||||
assert(grid_columns == 8 && grid_rows == 8,
|
||||
"This release's shared front-foot geometry expects an 8 x 8 grid");
|
||||
assert(socket_key_size[0] / 2 + socket_key_clearance
|
||||
assert(socket_key_size[0] / 2 + socket_key_clearance + perimeter_wall
|
||||
< socket_mount_x - insert_boss_diameter / 2,
|
||||
"Socket key slot overlaps a full-depth mounting-insert boss");
|
||||
"Socket key wall overlaps a full-depth mounting-insert boss");
|
||||
assert(socket_gusset_outer_x
|
||||
< socket_mount_x - socket_mount_tool_diameter / 2,
|
||||
"Socket gusset enters a flange-screw tool-access envelope");
|
||||
@@ -106,9 +111,9 @@ assert(socket_mount_ys[0] - socket_mount_tool_diameter / 2
|
||||
+ socket_mount_tool_diameter / 2 <= socket_front_y,
|
||||
"Socket washer envelope exceeds the flange depth");
|
||||
assert(socket_key_axis_y + socket_key_size[1] / 2
|
||||
+ socket_key_clearance
|
||||
+ socket_key_clearance + perimeter_wall
|
||||
< grid_pitch - insert_boss_diameter / 2,
|
||||
"Socket key slot overlaps the first grid-row insert bosses");
|
||||
"Socket key wall overlaps the first grid-row insert bosses");
|
||||
assert(socket_mount_ys[len(socket_mount_ys) - 1]
|
||||
+ insert_boss_diameter / 2
|
||||
< grid_pitch - insert_boss_diameter / 2,
|
||||
@@ -123,11 +128,30 @@ rear_foot_ys = corner_radius;
|
||||
socket_hole_xs = [plate_width / 2 - socket_mount_x,
|
||||
plate_width / 2 + socket_mount_x];
|
||||
socket_hole_ys = [for (y = socket_mount_ys) datum_y + y];
|
||||
all_insert_points = concat(
|
||||
[for (x = grid_xs, y = grid_ys) [x, y]],
|
||||
corner_insert_points = concat(
|
||||
[for (x = [grid_xs[0], grid_xs[len(grid_xs) - 1]]) [x, rear_foot_ys]],
|
||||
[for (x = socket_hole_xs, y = socket_hole_ys) [x, y]]
|
||||
[for (x = [grid_xs[0], grid_xs[len(grid_xs) - 1]])
|
||||
[x, grid_ys[len(grid_ys) - 1]]]
|
||||
);
|
||||
socket_insert_points = [
|
||||
for (x = socket_hole_xs, y = socket_hole_ys) [x, y]
|
||||
];
|
||||
underside_insert_points = concat(corner_insert_points, socket_insert_points);
|
||||
topside_insert_points = [
|
||||
for (x = grid_xs, y = grid_ys)
|
||||
if (!(y == grid_ys[len(grid_ys) - 1]
|
||||
&& (x == grid_xs[0] || x == grid_xs[len(grid_xs) - 1])))
|
||||
[x, y]
|
||||
];
|
||||
all_insert_points = concat(
|
||||
topside_insert_points,
|
||||
underside_insert_points
|
||||
);
|
||||
|
||||
assert(len(topside_insert_points) == 62,
|
||||
"The accessory grid must contain 62 top-installed inserts");
|
||||
assert(len(underside_insert_points) == 8,
|
||||
"Four corner and four socket inserts must install from the underside");
|
||||
|
||||
module rounded_rect_2d(size, radius) {
|
||||
offset(r = radius)
|
||||
@@ -162,17 +186,23 @@ module underside_structure_2d() {
|
||||
plate_outline_2d(perimeter_wall);
|
||||
}
|
||||
for (x = grid_xs)
|
||||
translate([x - rib_width / 2, corner_radius, 0])
|
||||
square([rib_width, plate_depth - 2 * corner_radius]);
|
||||
translate([x - rib_width / 2, 0, 0])
|
||||
square([rib_width, plate_depth]);
|
||||
for (y = concat([datum_y], grid_ys))
|
||||
translate([corner_radius, y - rib_width / 2, 0])
|
||||
square([plate_width - 2 * corner_radius, rib_width]);
|
||||
translate([0, y - rib_width / 2, 0])
|
||||
square([plate_width, rib_width]);
|
||||
|
||||
// A full-depth wall supports the locator independently of the
|
||||
// surrounding grid ribs. The fitted slot is subtracted later.
|
||||
offset(delta = perimeter_wall)
|
||||
socket_key_2d(socket_key_clearance);
|
||||
|
||||
translate([corner_radius, rear_foot_ys - rib_width / 2, 0])
|
||||
square([plate_width - 2 * corner_radius, rib_width]);
|
||||
// Carry both short socket-bay ribs through to the rear wall.
|
||||
for (x = socket_hole_xs)
|
||||
translate([x - rib_width / 2, corner_radius, 0])
|
||||
square([rib_width, datum_y - corner_radius]);
|
||||
translate([x - rib_width / 2, 0, 0])
|
||||
square([rib_width, datum_y]);
|
||||
|
||||
for (p = all_insert_points)
|
||||
translate(p) circle(d = insert_boss_diameter);
|
||||
@@ -189,45 +219,8 @@ module base_structure_positive() {
|
||||
}
|
||||
}
|
||||
|
||||
module one_insert_cutout(x, y, pilot = insert_pilot_diameter) {
|
||||
translate([x, y, -eps])
|
||||
cylinder(h = insert_flange_depth + eps, d = insert_flange_diameter);
|
||||
translate([x, y, insert_flange_depth - eps])
|
||||
cylinder(h = insert_body_length + 2 * eps, d = pilot);
|
||||
translate([x, y, insert_flange_depth + insert_body_length - eps])
|
||||
cylinder(
|
||||
h = plate_height - insert_flange_depth - insert_body_length + 2 * eps,
|
||||
d = screw_clearance_diameter
|
||||
);
|
||||
}
|
||||
|
||||
module all_insert_cutouts() {
|
||||
union() {
|
||||
for (p = all_insert_points)
|
||||
translate([p[0], p[1], -eps])
|
||||
cylinder(h = insert_flange_depth + eps,
|
||||
d = insert_flange_diameter);
|
||||
}
|
||||
union() {
|
||||
for (p = all_insert_points)
|
||||
translate([p[0], p[1], insert_flange_depth - eps])
|
||||
cylinder(h = insert_body_length + 2 * eps,
|
||||
d = insert_pilot_diameter);
|
||||
}
|
||||
union() {
|
||||
for (p = all_insert_points)
|
||||
translate([p[0], p[1],
|
||||
insert_flange_depth + insert_body_length - eps])
|
||||
cylinder(
|
||||
h = plate_height - insert_flange_depth
|
||||
- insert_body_length + 2 * eps,
|
||||
d = screw_clearance_diameter
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module insert_pattern_2d(diameter) {
|
||||
for (p = all_insert_points) translate(p) circle(d = diameter);
|
||||
module insert_pattern_2d(diameter, points = all_insert_points) {
|
||||
for (p = points) translate(p) circle(d = diameter);
|
||||
}
|
||||
|
||||
module socket_key_2d(clearance = 0) {
|
||||
@@ -259,16 +252,23 @@ module accent_service() {
|
||||
linear_extrude(height = inlay_depth)
|
||||
difference() {
|
||||
grid_artwork_2d();
|
||||
insert_pattern_2d(screw_clearance_diameter);
|
||||
insert_pattern_2d(insert_flange_seat_diameter,
|
||||
topside_insert_points);
|
||||
insert_pattern_2d(insert_pilot_diameter,
|
||||
underside_insert_points);
|
||||
socket_key_2d(socket_key_clearance);
|
||||
}
|
||||
}
|
||||
|
||||
module base_layer_2d(outline = false, hole_diameter, artwork = false) {
|
||||
module base_layer_2d(outline = false,
|
||||
topside_hole_diameter = insert_pilot_diameter,
|
||||
underside_hole_diameter = insert_pilot_diameter,
|
||||
artwork = false) {
|
||||
difference() {
|
||||
if (outline) plate_outline_2d();
|
||||
else underside_structure_2d();
|
||||
insert_pattern_2d(hole_diameter);
|
||||
insert_pattern_2d(topside_hole_diameter, topside_insert_points);
|
||||
insert_pattern_2d(underside_hole_diameter, underside_insert_points);
|
||||
// The locator is a through-slot so no unsupported bridge is printed
|
||||
// against the textured build plate.
|
||||
socket_key_2d(socket_key_clearance);
|
||||
@@ -278,33 +278,36 @@ module base_layer_2d(outline = false, hole_diameter, artwork = false) {
|
||||
|
||||
module base_segment_service(index, with_artwork = false) {
|
||||
underside_top = plate_height - top_skin;
|
||||
body_top = insert_flange_depth + insert_body_length;
|
||||
artwork_bottom = plate_height - inlay_depth;
|
||||
top_split = (underside_top + artwork_bottom) / 2;
|
||||
topside_flange_bottom = plate_height - insert_flange_depth;
|
||||
top_skin_split = (underside_top + topside_flange_bottom) / 2;
|
||||
|
||||
if (index == 0)
|
||||
linear_extrude(height = insert_flange_depth)
|
||||
base_layer_2d(false, insert_flange_diameter);
|
||||
base_layer_2d(false, insert_pilot_diameter,
|
||||
insert_flange_seat_diameter);
|
||||
else if (index == 1)
|
||||
translate([0, 0, insert_flange_depth])
|
||||
linear_extrude(height = insert_body_length)
|
||||
base_layer_2d(false, insert_pilot_diameter);
|
||||
linear_extrude(height = underside_top - insert_flange_depth)
|
||||
base_layer_2d(false);
|
||||
else if (index == 2)
|
||||
translate([0, 0, body_top])
|
||||
linear_extrude(height = underside_top - body_top)
|
||||
base_layer_2d(false, screw_clearance_diameter);
|
||||
else if (index == 3)
|
||||
translate([0, 0, underside_top])
|
||||
linear_extrude(height = top_split - underside_top)
|
||||
base_layer_2d(true, screw_clearance_diameter);
|
||||
linear_extrude(height = top_skin_split - underside_top)
|
||||
base_layer_2d(true);
|
||||
else if (index == 3)
|
||||
translate([0, 0, top_skin_split])
|
||||
linear_extrude(height = topside_flange_bottom - top_skin_split)
|
||||
base_layer_2d(true);
|
||||
else if (index == 4)
|
||||
translate([0, 0, top_split])
|
||||
linear_extrude(height = artwork_bottom - top_split)
|
||||
base_layer_2d(true, screw_clearance_diameter);
|
||||
translate([0, 0, topside_flange_bottom])
|
||||
linear_extrude(height = artwork_bottom - topside_flange_bottom)
|
||||
base_layer_2d(true, insert_flange_seat_diameter,
|
||||
insert_pilot_diameter);
|
||||
else if (index == 5)
|
||||
translate([0, 0, artwork_bottom])
|
||||
linear_extrude(height = inlay_depth)
|
||||
base_layer_2d(true, screw_clearance_diameter, with_artwork);
|
||||
base_layer_2d(true, insert_flange_seat_diameter,
|
||||
insert_pilot_diameter, with_artwork);
|
||||
else assert(false, str("Unknown base segment: ", index));
|
||||
}
|
||||
|
||||
@@ -548,13 +551,11 @@ module coupon_common_cutouts() {
|
||||
x = 14 + i * 24;
|
||||
pilot = coupon_insert_diameters[i];
|
||||
translate([x, 56, coupon_boss_height - insert_flange_depth])
|
||||
cylinder(h = insert_flange_depth + eps, d = insert_flange_diameter);
|
||||
translate([x, 56, coupon_boss_height - insert_flange_depth - insert_body_length])
|
||||
cylinder(h = insert_body_length + eps, d = pilot);
|
||||
cylinder(h = insert_flange_depth + eps,
|
||||
d = insert_flange_seat_diameter);
|
||||
translate([x, 56, -eps])
|
||||
cylinder(h = coupon_boss_height - insert_flange_depth
|
||||
- insert_body_length + 2 * eps,
|
||||
d = screw_clearance_diameter);
|
||||
cylinder(h = coupon_boss_height - insert_flange_depth + eps,
|
||||
d = pilot);
|
||||
}
|
||||
translate([coupon_fit_center[0], coupon_fit_center[1], -eps])
|
||||
rounded_prism(
|
||||
|
||||
Reference in New Issue
Block a user