base updates

This commit is contained in:
2026-08-29 09:35:49 -07:00
parent a6e7f27bee
commit 0847b8017b
47 changed files with 1624431 additions and 1877485 deletions
+79 -78
View File
@@ -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(