# HG changeset patch # User Paul Boddie # Date 1460371943 -7200 # Node ID 9bd1e34cd4424a661b711ac17bafc166af7746fe # Parent d3b02249788c9d4045551445ea6d80b5a361a791 Fixed grooves in each piece that accommodate parts of the other piece, also improving the way the floor is defined with wider cartridges. Introduced extent variables and made the separation of cartridges configurable. diff -r d3b02249788c -r 9bd1e34cd442 cartridge.scad --- a/cartridge.scad Sun Apr 10 19:02:37 2016 +0200 +++ b/cartridge.scad Mon Apr 11 12:52:23 2016 +0200 @@ -76,6 +76,7 @@ /* For printing: APART = 1; PCB = 0; */ APART = 1; + SPACE_APART = 10; PCB = 0; /* To check overlaps: INTERSECT = 1; CLOSED = 1; */ @@ -225,19 +226,29 @@ /* Cartridge dimensions. */ payload_width = int_payload_width + side + side; + payload_height = top + int_payload_height; + connector_width = int_connector_width + side + side; - payload_height = top + int_payload_height; connector_height = bottom + int_connector_height; + height = payload_height + bottom + int_connector_height; depth = int_payload_depth + front + payload_back; + upper_extent = height / 2; lower_extent = -upper_extent; int_payload_upper_extent = upper_extent - top; int_payload_lower_extent = lower_extent + int_connector_height + bottom; + /* Connector extents. */ + + int_connector_right_extent = int_connector_width / 2; + int_connector_left_extent = -int_connector_right_extent; + connector_left_extent = int_connector_left_extent - side; + connector_right_extent = int_connector_right_extent + side; + /* Where the payload is wider than the connector, the payload expands to the left. */ - int_payload_right_extent = int_connector_width / 2; + int_payload_right_extent = int_connector_right_extent; int_payload_left_extent = int_payload_right_extent - int_payload_width; payload_left_extent = int_payload_left_extent - side; payload_right_extent = int_payload_right_extent + side; @@ -627,11 +638,11 @@ cube_at(front_left, front_depth, connector_height, -1, -1, -1, - -int_connector_width / 2, 0, int_payload_lower_extent); + int_connector_left_extent, 0, int_payload_lower_extent); cube_at(front_right, front_depth, connector_height, 1, -1, -1, - int_connector_width / 2, 0, int_payload_lower_extent); + int_connector_right_extent, 0, int_payload_lower_extent); /* Top surface for the front piece. */ @@ -645,9 +656,15 @@ /* Floor of cartridge. */ - cube_at(int_connector_width, int_front_depth, bottom, - 0, -1, 1, - 0, 0, lower_extent + int_connector_height); + if (payload_width > connector_width) { + cube_at(payload_width, front_depth, bottom, + 1, -1, 1, + payload_left_extent, 0, lower_extent + int_connector_height); + } else { + cube_at(int_connector_width, int_front_depth, bottom, + 0, -1, 1, + 0, 0, lower_extent + int_connector_height); + } /* Left cutout. */ @@ -655,7 +672,7 @@ edge_connector_cutout_front_depth, bottom, 1, -1, 1, - -int_connector_width / 2, + int_connector_left_extent, 0, lower_extent + int_connector_height); @@ -665,20 +682,11 @@ edge_connector_cutout_front_depth, bottom, -1, -1, 1, - int_connector_width / 2, + int_connector_right_extent, 0, lower_extent + int_connector_height); } - /* Extended floor. */ - - if (payload_width > connector_width) { - - cube_at(payload_width - connector_width, front_depth, bottom, - 1, -1, 1, - payload_left_extent, 0, lower_extent + int_connector_height); - } - /* PCB supports. */ if (MODEL == ROM_CARTRIDGE) { @@ -745,7 +753,7 @@ [-extra, 0], ]); - /* Inner top cutout for the top and sides of the back portion. */ + /* Inner grooves for the top and sides of the back portion. */ cube_at(inner_top_front_cutout_width, inner_top_front_cutout_depth, @@ -768,16 +776,16 @@ /* Cutout to accept the back connector sides (or the floor of the back piece). */ cube_at(inner_connector_front_cutout_width, - inner_connector_front_cutout_depth, + BACK_CONNECTOR_SECTION ? inner_connector_front_cutout_depth : edge_connector_cutout_front_depth, BACK_CONNECTOR_SECTION ? inner_connector_front_cutout_height : bottom, 1, -1, -1, - int_connector_width / 2, 0, int_payload_lower_extent); + int_connector_right_extent, 0, int_payload_lower_extent); cube_at(inner_connector_front_cutout_width, - inner_connector_front_cutout_depth, + BACK_CONNECTOR_SECTION ? inner_connector_front_cutout_depth : edge_connector_cutout_front_depth, BACK_CONNECTOR_SECTION ? inner_connector_front_cutout_height : bottom, -1, -1, -1, - -int_connector_width / 2, 0, int_payload_lower_extent); + int_connector_left_extent, 0, int_payload_lower_extent); /* Fillets to round off the edges. */ @@ -811,11 +819,11 @@ rotate([0, 0, 180]) fillet_justified(rr, payload_height + bottom + extra); - translate([connector_width / 2 - ro, -front_depth + ro, lower_extent]) + translate([connector_right_extent - ro, -front_depth + ro, lower_extent]) rotate([0, 0, 270]) fillet_partitioned(rr, connector_height - bottom); - translate([-connector_width / 2 + ro, -front_depth + ro, lower_extent]) + translate([connector_left_extent + ro, -front_depth + ro, lower_extent]) rotate([0, 0, 180]) fillet_partitioned(rr, connector_height - bottom); } @@ -864,11 +872,11 @@ cube_at(back_left, back_depth, connector_height, -1, 1, -1, - -int_connector_width / 2, 0, int_payload_lower_extent); + int_connector_left_extent, 0, int_payload_lower_extent); cube_at(back_right, back_depth, connector_height, 1, 1, -1, - int_connector_width / 2, 0, int_payload_lower_extent); + int_connector_right_extent, 0, int_payload_lower_extent); } /* Top of back piece. */ @@ -915,15 +923,15 @@ if (BACK_CONNECTOR_SECTION) { - /* Left side of connector. */ + /* Left side of connector (or floor extension). */ difference() { cube_at(back_left - groove_depth, groove_width_extra, inner_connector_front_cutout_height, -1, 1, -1, - -int_connector_width / 2, -groove_width_extra, int_payload_lower_extent); + int_connector_left_extent, -groove_width_extra, int_payload_lower_extent); if (ROUND_CONNECTING_EDGES) - translate([-int_connector_width / 2 - groove_ro, + translate([int_connector_left_extent - groove_ro, -groove_width_extra + groove_ro, lower_extent]) rotate([0, 0, -90]) @@ -931,15 +939,15 @@ inner_connector_front_cutout_height + extra); } - /* Right side of connector. */ + /* Right side of connector (or floor extension). */ difference() { cube_at(back_right - groove_depth, groove_width_extra, inner_connector_front_cutout_height, 1, 1, -1, - int_connector_width / 2, -groove_width_extra, int_payload_lower_extent); + int_connector_right_extent, -groove_width_extra, int_payload_lower_extent); if (ROUND_CONNECTING_EDGES) - translate([int_connector_width / 2 + groove_ro, + translate([int_connector_right_extent + groove_ro, -groove_width_extra + groove_ro, lower_extent]) rotate([0, 0, 180]) @@ -967,9 +975,26 @@ /* Floor of cartridge. */ - cube_at(connector_width, back_depth, bottom, - 0, 1, 1, - 0, 0, lower_extent + int_connector_height); + if (payload_width > connector_width) { + + difference() { + cube_at(payload_width, back_depth, bottom, + 1, 1, 1, + payload_left_extent, 0, lower_extent + int_connector_height); + + /* Cut out the floor to provide a tab. */ + + cube_at(payload_width - connector_width + groove_depth, + edge_connector_cutout_front_depth, bottom, + 1, 1, 1, + payload_left_extent, 0, lower_extent + int_connector_height); + } + + } else { + cube_at(connector_width, back_depth, bottom, + 0, 1, 1, + 0, 0, lower_extent + int_connector_height); + } /* Edge connector cutout. */ @@ -980,22 +1005,6 @@ 0, 0, lower_extent + int_connector_height); } - /* Extended floor. */ - - if (payload_width > connector_width) { - - difference() { - - cube_at(payload_width - connector_width, back_depth, bottom, - 1, 1, 1, - payload_left_extent, 0, lower_extent + int_connector_height); - - cube_at(payload_width - connector_width, edge_connector_cutout_front_depth, bottom, - 1, 1, 1, - payload_left_extent, 0, lower_extent + int_connector_height); - } - } - /* PCB supports. */ if (MODEL == ROM_CARTRIDGE) { @@ -1035,11 +1044,19 @@ union() { - /* Left groove. */ + /* + Grooves are separated to permit a discontinuity with the + wide cartridge and for control over the back section. + */ - cube_at(groove_depth, groove_width_normal, height, - 1, 1, 0, - payload_left_extent, 0, 0); + cube_at(groove_depth, groove_width_normal, payload_height + bottom, + 1, 1, -1, + payload_left_extent, 0, upper_extent); + + if (BACK_CONNECTOR_SECTION) + cube_at(groove_depth, groove_width_normal, connector_height, + 1, 1, 1, + connector_left_extent, 0, lower_extent); /* Right groove. */ @@ -1047,6 +1064,11 @@ -1, 1, 0, payload_right_extent, 0, 0); + if (BACK_CONNECTOR_SECTION) + cube_at(groove_depth, groove_width_normal, connector_height, + -1, 1, 1, + connector_right_extent, 0, lower_extent); + /* Top grooves. */ cube_at(payload_width, groove_width_normal, groove_depth, @@ -1069,7 +1091,7 @@ translate([0, back_depth, lower_extent]) linear_extrude(height = back_cavity_height) - translate([-int_connector_width / 2, 0, 0]) + translate([int_connector_left_extent, 0, 0]) polygon([ [back_cavity_offset_from_inner_left, 0], [back_cavity_inner_offset_from_inner_left, @@ -1099,7 +1121,7 @@ translate([0, int_connector_back_depth, lower_extent]) linear_extrude(height = int_connector_height) - translate([-int_connector_width / 2, 0, 0]) + translate([int_connector_left_extent, 0, 0]) polygon([ [0, 0], [inner_back_slope_max_offset, 0], @@ -1110,7 +1132,7 @@ translate([0, int_connector_back_depth, lower_extent]) linear_extrude(height = int_connector_height) - translate([int_connector_width / 2, 0, 0]) + translate([int_connector_right_extent, 0, 0]) polygon([ [0, 0], [-inner_back_slope_max_offset, 0], @@ -1164,10 +1186,10 @@ fillet_justified(rr, payload_height + bottom + extra); if (BACK_CONNECTOR_SECTION) { - translate([connector_width / 2 - ro, back_depth - ro, lower_extent]) + translate([connector_right_extent - ro, back_depth - ro, lower_extent]) fillet_partitioned(rr, connector_height - bottom); - translate([-connector_width / 2 + ro, back_depth - ro, lower_extent]) + translate([connector_left_extent + ro, back_depth - ro, lower_extent]) rotate([0, 0, 90]) fillet_partitioned(rr, connector_height - bottom); } @@ -1197,12 +1219,12 @@ /* Sides of connector. */ - translate([-connector_width / 2 + groove_depth + groove_ro, -groove_width_extra + groove_ro, + translate([connector_left_extent + groove_depth + groove_ro, -groove_width_extra + groove_ro, lower_extent]) rotate([0, 0, 180]) fillet_partitioned(groove_rr, inner_connector_front_cutout_height); - translate([connector_width / 2 - groove_depth - groove_ro, -groove_width_extra + groove_ro, + translate([connector_right_extent - groove_depth - groove_ro, -groove_width_extra + groove_ro, lower_extent]) rotate([0, 0, -90]) fillet_partitioned(groove_rr, inner_connector_front_cutout_height); @@ -1280,13 +1302,13 @@ /* Holes for lugs. */ translate([ - -int_connector_width / 2 + pcb_lug_offset_from_inside, + int_connector_left_extent + pcb_lug_offset_from_inside, pcb_hole_start_depth, pcb_lug_offset_from_bottom]) rotate([90, 0, 0]) cylinder(h=pcb_hole_depth, r=pcb_lug_hole_radius); translate([ - int_connector_width / 2 - pcb_lug_offset_from_inside, + int_connector_right_extent - pcb_lug_offset_from_inside, pcb_hole_start_depth, pcb_lug_offset_from_bottom]) rotate([90, 0, 0]) cylinder(h=pcb_hole_depth, r=pcb_lug_hole_radius); @@ -1355,7 +1377,7 @@ the same way, if APART is defined. */ - front_displacement_together = CLOSED ? front_back_overlap : 0; + front_displacement_together = CLOSED ? front_back_overlap : front_back_overlap - SPACE_APART; front_displacement = APART ? -connector_width * 0.6 : 0; back_displacement = APART ? connector_width * 0.6 : 0; back_rotation = APART ? 180 : 0;