AcornElectron

Changeset

50:127c1ea316e1
2014-11-24 Paul Boddie raw files shortlog changelog graph Separated the payload and connector widths so that the former can be changed independently of the latter, although the payload currently remains centred on the connector whereas it should be justified with the right edge of the connector (and have a width limited only by the Plus 1 cartridge space/slot).
cartridge.scad (file)
     1.1 --- a/cartridge.scad	Fri Oct 10 16:24:44 2014 +0200
     1.2 +++ b/cartridge.scad	Mon Nov 24 23:28:19 2014 +0100
     1.3 @@ -71,6 +71,8 @@
     1.4  				}
     1.5  	}
     1.6  
     1.7 +	/* A fillet justified using the axes. */
     1.8 +
     1.9  	module fillet_justified(r, h) {
    1.10  		if (FILLET)
    1.11  			difference() {
    1.12 @@ -79,6 +81,17 @@
    1.13  			}
    1.14  	}
    1.15  
    1.16 +	/* A justified fillet with the extra material below the y-axis. */
    1.17 +
    1.18 +	module fillet_partitioned(r, h) {
    1.19 +		if (FILLET)
    1.20 +			difference() {
    1.21 +				translate([0, 0, -extra])
    1.22 +					cube([r + extra, r + extra, h + extra]);
    1.23 +				cylinder(r = r, h = h);
    1.24 +			}
    1.25 +	}
    1.26 +
    1.27  	module fillet_torus(radius, rounding) {
    1.28  		if (FILLET)
    1.29  			difference() {
    1.30 @@ -127,7 +140,8 @@
    1.31  
    1.32  	/* Internal dimensions. */
    1.33  
    1.34 -	int_width = 86.0;
    1.35 +	int_payload_width = 86.0;	/* internal width in the payload section */
    1.36 +	int_connector_width = 86.0;	/* limited to the Plus 1 socket dimensions */
    1.37  	int_payload_depth = 12.5;	/* maximum depth in the payload section */
    1.38  	int_connector_depth = 11.0;	/* maximum depth in the connector section */
    1.39  	int_payload_height = 50.8;	/* space between the top and the floor */
    1.40 @@ -158,7 +172,8 @@
    1.41  
    1.42  	/* Cartridge dimensions. */
    1.43  
    1.44 -	width = int_width + side + side;
    1.45 +	payload_width = int_payload_width + side + side;
    1.46 +	connector_width = int_connector_width + side + side;
    1.47  	payload_height = top + int_payload_height;
    1.48  	connector_height = bottom + int_connector_height;
    1.49  	height = payload_height + bottom + int_connector_height;
    1.50 @@ -177,7 +192,7 @@
    1.51  
    1.52  	/* Label details. */
    1.53  
    1.54 -	front_label_width = 83.0;
    1.55 +	front_label_width = payload_width - side - side - 3.0;
    1.56  	front_label_height = 46.0;
    1.57  	front_label_depth = 1.0;
    1.58  	front_label_offset_from_bottom = 19.5;
    1.59 @@ -207,13 +222,17 @@
    1.60  	Offsets are measured from the outside surfaces.
    1.61  	*/
    1.62  
    1.63 -	inner_top_front_cutout_width = int_width;
    1.64 +	inner_top_front_cutout_width = int_payload_width;
    1.65  	inner_top_front_cutout_depth = top_groove_width;
    1.66  	inner_top_front_cutout_height = top - top_groove_depth;
    1.67  
    1.68 -	inner_side_front_cutout_height = height - top_groove_depth;
    1.69 -	inner_side_front_cutout_width = front_side - groove_depth;
    1.70 -	inner_side_front_cutout_depth = groove_width_overlap;
    1.71 +	inner_payload_front_cutout_height = payload_height - top_groove_depth;
    1.72 +	inner_payload_front_cutout_width = front_side - groove_depth;
    1.73 +	inner_payload_front_cutout_depth = groove_width_overlap;
    1.74 +
    1.75 +	inner_connector_front_cutout_height = connector_height;
    1.76 +	inner_connector_front_cutout_width = front_side - groove_depth;
    1.77 +	inner_connector_front_cutout_depth = groove_width_overlap;
    1.78  
    1.79  	/*
    1.80  	The back cavity is the indented part at the bottom of the back of the
    1.81 @@ -249,7 +268,7 @@
    1.82  
    1.83  	/* The tapering off of the inner front edge. */
    1.84  
    1.85 -	inner_front_edge_width = width - front_side * 2;
    1.86 +	inner_front_edge_width = connector_width - front_side * 2;
    1.87  	inner_front_edge_height = 3.0;
    1.88  	inner_front_edge_depth = 1.5;
    1.89  
    1.90 @@ -267,7 +286,7 @@
    1.91  	*/
    1.92  
    1.93  	edge_connector_cutout_front_depth = front_back_overlap;
    1.94 -	edge_connector_cutout_front_width = (int_width - edge_connector_cutout_back_width) / 2;
    1.95 +	edge_connector_cutout_front_width = (int_connector_width - edge_connector_cutout_back_width) / 2;
    1.96  
    1.97  	/*
    1.98  	Edge connectors are themselves 0.05" or approximately 1.27mm in
    1.99 @@ -375,7 +394,7 @@
   1.100  
   1.101  	module pcb_lug(xdir) {
   1.102  		translate([xdir *
   1.103 -			(int_width / 2 - pcb_lug_offset_from_inside),
   1.104 +			(int_connector_width / 2 - pcb_lug_offset_from_inside),
   1.105  			back_depth,
   1.106  			int_payload_lower_extent + pcb_lug_offset_from_bottom
   1.107  			])
   1.108 @@ -400,7 +419,7 @@
   1.109  
   1.110  	module pcb_front_lug(xdir) {
   1.111  		translate([xdir *
   1.112 -			(int_width / 2 - pcb_lug_offset_from_inside),
   1.113 +			(int_connector_width / 2 - pcb_lug_offset_from_inside),
   1.114  			-int_front_depth + pcb_front_lug_depth,
   1.115  			int_payload_lower_extent + pcb_lug_offset_from_bottom
   1.116  			])
   1.117 @@ -415,7 +434,7 @@
   1.118  
   1.119  	/* The actual shapes. */
   1.120  
   1.121 -	front_displacement = APART ? -width * 0.6 : 0;
   1.122 +	front_displacement = APART ? -payload_width * 0.6 : 0;
   1.123  
   1.124  	if (FRONT)
   1.125  		translate([front_displacement, 0, 0])
   1.126 @@ -428,16 +447,38 @@
   1.127  				/* Front portion. */
   1.128  
   1.129  				if (FRONT_SURFACE) {
   1.130 -					cube_at(width, front, height,
   1.131 -						0, -1, 0,
   1.132 -						0, -int_front_depth, 0);
   1.133 -					cube_at(front_left, front_depth, height,
   1.134 -						-1, -1, 0,
   1.135 -						-int_width / 2, 0, 0);
   1.136 -					cube_at(front_right, front_depth, height,
   1.137 -						1, -1, 0,
   1.138 -						int_width / 2, 0, 0);
   1.139 -					cube_at(width, front_depth, top,
   1.140 +
   1.141 +					/* Surfaces surrounding the payload. */
   1.142 +
   1.143 +					cube_at(payload_width, front, payload_height,
   1.144 +						0, -1, 1,
   1.145 +						0, -int_front_depth, int_payload_lower_extent);
   1.146 +
   1.147 +					cube_at(front_left, front_depth, payload_height,
   1.148 +						-1, -1, 1,
   1.149 +						-int_payload_width / 2, 0, int_payload_lower_extent);
   1.150 +
   1.151 +					cube_at(front_right, front_depth, payload_height,
   1.152 +						1, -1, 1,
   1.153 +						int_payload_width / 2, 0, int_payload_lower_extent);
   1.154 +
   1.155 +					/* Surfaces surrounding the connector. */
   1.156 +
   1.157 +					cube_at(connector_width, front, connector_height,
   1.158 +						0, -1, -1,
   1.159 +						0, -int_front_depth, int_payload_lower_extent);
   1.160 +
   1.161 +					cube_at(front_left, front_depth, connector_height,
   1.162 +						-1, -1, -1,
   1.163 +						-int_connector_width / 2, 0, int_payload_lower_extent);
   1.164 +
   1.165 +					cube_at(front_right, front_depth, connector_height,
   1.166 +						1, -1, -1,
   1.167 +						int_connector_width / 2, 0, int_payload_lower_extent);
   1.168 +
   1.169 +					/* Top surface for the front piece. */
   1.170 +
   1.171 +					cube_at(payload_width, front_depth, top,
   1.172  						0, -1, 1,
   1.173  						0, 0, int_payload_upper_extent);
   1.174  				}
   1.175 @@ -446,7 +487,7 @@
   1.176  
   1.177  					/* Floor of cartridge. */
   1.178  
   1.179 -					cube_at(int_width, int_front_depth, bottom,
   1.180 +					cube_at(int_connector_width, int_front_depth, bottom,
   1.181  						0, -1, 1,
   1.182  						0, 0, -height / 2 + int_connector_height);
   1.183  
   1.184 @@ -456,7 +497,7 @@
   1.185  						edge_connector_cutout_front_depth,
   1.186  						bottom,
   1.187  						1, -1, 1,
   1.188 -						-int_width / 2,
   1.189 +						-int_connector_width / 2,
   1.190  						0,
   1.191  						-height / 2 + int_connector_height);
   1.192  
   1.193 @@ -466,7 +507,7 @@
   1.194  						edge_connector_cutout_front_depth,
   1.195  						bottom,
   1.196  						-1, -1, 1,
   1.197 -						int_width / 2,
   1.198 +						int_connector_width / 2,
   1.199  						0,
   1.200  						-height / 2 + int_connector_height);
   1.201  				}
   1.202 @@ -537,17 +578,29 @@
   1.203  				0, -1, 1,
   1.204  				0, 0, int_payload_upper_extent);
   1.205  
   1.206 -			cube_at(inner_side_front_cutout_width,
   1.207 -				inner_side_front_cutout_depth,
   1.208 -				inner_side_front_cutout_height,
   1.209 -				1, -1, 0,
   1.210 -				int_width / 2, 0, -inner_top_front_cutout_height);
   1.211 +			cube_at(inner_payload_front_cutout_width,
   1.212 +				inner_payload_front_cutout_depth,
   1.213 +				inner_payload_front_cutout_height,
   1.214 +				1, -1, 1,
   1.215 +				int_payload_width / 2, 0, int_payload_lower_extent);
   1.216 +
   1.217 +			cube_at(inner_payload_front_cutout_width,
   1.218 +				inner_payload_front_cutout_depth,
   1.219 +				inner_payload_front_cutout_height,
   1.220 +				-1, -1, 1,
   1.221 +				-int_payload_width / 2, 0, int_payload_lower_extent);
   1.222  
   1.223 -			cube_at(inner_side_front_cutout_width,
   1.224 -				inner_side_front_cutout_depth,
   1.225 -				inner_side_front_cutout_height,
   1.226 -				-1, -1, 0,
   1.227 -				-int_width / 2, 0, -inner_top_front_cutout_height);
   1.228 +			cube_at(inner_connector_front_cutout_width,
   1.229 +				inner_connector_front_cutout_depth,
   1.230 +				inner_connector_front_cutout_height,
   1.231 +				1, -1, -1,
   1.232 +				int_connector_width / 2, 0, int_payload_lower_extent);
   1.233 +
   1.234 +			cube_at(inner_connector_front_cutout_width,
   1.235 +				inner_connector_front_cutout_depth,
   1.236 +				inner_connector_front_cutout_height,
   1.237 +				-1, -1, -1,
   1.238 +				-int_connector_width / 2, 0, int_payload_lower_extent);
   1.239  
   1.240  			/* Fillets to round off the edges. */
   1.241  
   1.242 @@ -555,11 +608,11 @@
   1.243  
   1.244  				/* Top left and right rounding. */
   1.245  			
   1.246 -				translate([-width / 2 + ro, -front_depth / 2, height / 2 - ro])
   1.247 +				translate([-payload_width / 2 + ro, -front_depth / 2, height / 2 - ro])
   1.248  					rotate([0, 0, 180])
   1.249  						rotate([90, 0, 0])
   1.250  							fillet(rr, front_depth);
   1.251 -				translate([width / 2 - ro, -front_depth / 2, height / 2 - ro])
   1.252 +				translate([payload_width / 2 - ro, -front_depth / 2, height / 2 - ro])
   1.253  					rotate([90, 0, 0])
   1.254  						fillet(rr, front_depth);
   1.255  
   1.256 @@ -568,14 +621,14 @@
   1.257  				translate([0, -front_depth + ro, height / 2 - ro])
   1.258  					rotate([0, 0, 180])
   1.259  						rotate([0, -90, 0])
   1.260 -							fillet(rr, width);
   1.261 +							fillet(rr, payload_width);
   1.262  
   1.263  				/* Edge rounding. */
   1.264  			
   1.265 -				translate([-width / 2 + ro, -front_depth + ro, 0])
   1.266 +				translate([-payload_width / 2 + ro, -front_depth + ro, 0])
   1.267  					rotate([0, 0, 180])
   1.268  						fillet(rr, height);
   1.269 -				translate([width / 2 - ro, -front_depth + ro, 0])
   1.270 +				translate([payload_width / 2 - ro, -front_depth + ro, 0])
   1.271  					rotate([0, 0, 270])
   1.272  						fillet(rr, height);
   1.273  			}
   1.274 @@ -586,7 +639,7 @@
   1.275  	the same way, if APART is defined.
   1.276  	*/
   1.277  
   1.278 -	back_displacement = APART ? width * 0.6 : 0;
   1.279 +	back_displacement = APART ? payload_width * 0.6 : 0;
   1.280  	back_rotation = APART ? 180 : 0;
   1.281  
   1.282  	if (BACK)
   1.283 @@ -602,65 +655,112 @@
   1.284  
   1.285  				if (BACK_SURFACE) {
   1.286  
   1.287 +					/* Surfaces surrounding the payload. */
   1.288 +
   1.289  					/* Payload section of back surface. */
   1.290  
   1.291 -					cube_at(width, payload_back, payload_height,
   1.292 +					cube_at(payload_width, payload_back, payload_height,
   1.293  						0, 1, 1,
   1.294  						0, int_payload_back_depth, int_payload_lower_extent);
   1.295  
   1.296 +					cube_at(back_left, back_depth, payload_height,
   1.297 +						-1, 1, 1,
   1.298 +						-int_payload_width / 2, 0, int_payload_lower_extent);
   1.299 +
   1.300 +					cube_at(back_right, back_depth, payload_height,
   1.301 +						1, 1, 1,
   1.302 +						int_payload_width / 2, 0, int_payload_lower_extent);
   1.303 +
   1.304 +					/* Surfaces surrounding the connector. */
   1.305 +
   1.306  					/* Connector section of back surface overlapping the floor. */
   1.307  
   1.308 -					cube_at(width, connector_back, connector_height,
   1.309 -						0, 1, 1,
   1.310 -						0, int_connector_back_depth, -height / 2);
   1.311 -
   1.312 -					/* Sides of back piece. */
   1.313 +					cube_at(connector_width, connector_back, connector_height,
   1.314 +						0, 1, -1,
   1.315 +						0, int_connector_back_depth, int_payload_lower_extent);
   1.316  
   1.317 -					cube_at(back_left, back_depth, height,
   1.318 -						-1, 1, 0,
   1.319 -						-int_width / 2, 0, 0);
   1.320 +					cube_at(back_left, back_depth, connector_height,
   1.321 +						-1, 1, -1,
   1.322 +						-int_connector_width / 2, 0, int_payload_lower_extent);
   1.323  
   1.324 -					cube_at(back_right, back_depth, height,
   1.325 -						1, 1, 0,
   1.326 -						int_width / 2, 0, 0);
   1.327 +					cube_at(back_right, back_depth, connector_height,
   1.328 +						1, 1, -1,
   1.329 +						int_connector_width / 2, 0, int_payload_lower_extent);
   1.330  
   1.331  					/* Top of back piece. */
   1.332  
   1.333 -					cube_at(width, back_depth, top,
   1.334 +					cube_at(payload_width, back_depth, top,
   1.335  						0, 1, 1,
   1.336  						0, 0, int_payload_upper_extent);
   1.337  
   1.338 -					/* The extension of the back to connect with the front. */
   1.339 +					/*
   1.340 +					The extension of the back to connect with the front. Here, the inside
   1.341 +					edges are rounded. The outside edges are rounded later.
   1.342 +
   1.343 +					An extra overlapping measure is employed so that the filleting is
   1.344 +					continuous between the payload and connector portions. On the inside
   1.345 +					edges, the connector filleting is extended upwards.
   1.346 +					*/
   1.347 +
   1.348 +					/* Left side of payload. */
   1.349  
   1.350  					difference() {
   1.351 -						cube_at(back_left - groove_depth, groove_width_extra, inner_side_front_cutout_height,
   1.352 +						cube_at(back_left - groove_depth, groove_width_extra, inner_payload_front_cutout_height,
   1.353  							-1, 1, 1,
   1.354 -							-int_width / 2, -groove_width_extra, -height / 2);
   1.355 -						translate([-int_width / 2 - groove_ro, -groove_width_extra + groove_ro,
   1.356 -							-height / 2])
   1.357 +							-int_payload_width / 2, -groove_width_extra, int_payload_lower_extent);
   1.358 +						translate([-int_payload_width / 2 - groove_ro, -groove_width_extra + groove_ro,
   1.359 +							int_payload_lower_extent])
   1.360  							rotate([0, 0, -90])
   1.361 -								fillet_justified(groove_rr, inner_side_front_cutout_height);
   1.362 +								fillet_justified(groove_rr, inner_payload_front_cutout_height);
   1.363  					}
   1.364  
   1.365 +					/* Right side of payload. */
   1.366 +
   1.367  					difference() {
   1.368 -						cube_at(back_right - groove_depth, groove_width_extra, inner_side_front_cutout_height,
   1.369 +						cube_at(back_right - groove_depth, groove_width_extra, inner_payload_front_cutout_height,
   1.370  							1, 1, 1,
   1.371 -							int_width / 2, -groove_width_extra, -height / 2);
   1.372 -						translate([int_width / 2 + groove_ro, -groove_width_extra + groove_ro,
   1.373 +							int_payload_width / 2, -groove_width_extra, int_payload_lower_extent);
   1.374 +						translate([int_payload_width / 2 + groove_ro, -groove_width_extra + groove_ro,
   1.375 +							int_payload_lower_extent])
   1.376 +							rotate([0, 0, 180])
   1.377 +								fillet_justified(groove_rr, inner_payload_front_cutout_height);
   1.378 +					}
   1.379 +
   1.380 +					/* Left side of connector. */
   1.381 +
   1.382 +					difference() {
   1.383 +						cube_at(back_left - groove_depth, groove_width_extra, inner_connector_front_cutout_height,
   1.384 +							-1, 1, -1,
   1.385 +							-int_connector_width / 2, -groove_width_extra, int_payload_lower_extent);
   1.386 +						translate([-int_connector_width / 2 - groove_ro, -groove_width_extra + groove_ro,
   1.387 +							-height / 2])
   1.388 +							rotate([0, 0, -90])
   1.389 +								fillet_partitioned(groove_rr, inner_connector_front_cutout_height + extra);
   1.390 +					}
   1.391 +
   1.392 +					/* Right side of connector. */
   1.393 +
   1.394 +					difference() {
   1.395 +						cube_at(back_right - groove_depth, groove_width_extra, inner_connector_front_cutout_height,
   1.396 +							1, 1, -1,
   1.397 +							int_connector_width / 2, -groove_width_extra, int_payload_lower_extent);
   1.398 +						translate([int_connector_width / 2 + groove_ro, -groove_width_extra + groove_ro,
   1.399  							-height / 2])
   1.400  							rotate([0, 0, 180])
   1.401 -								fillet_justified(groove_rr, inner_side_front_cutout_height);
   1.402 +								fillet_partitioned(groove_rr, inner_connector_front_cutout_height + extra);
   1.403  					}
   1.404  
   1.405 +					/* Top side. */
   1.406 +
   1.407  					difference() {
   1.408 -						cube_at(width - groove_depth * 2, groove_width_extra, top - top_groove_depth,
   1.409 +						cube_at(payload_width - groove_depth * 2, groove_width_extra, top - top_groove_depth,
   1.410  							0, 1, 1,
   1.411  							0, -groove_width_extra, int_payload_upper_extent);
   1.412  						translate([0, -groove_width_extra + groove_ro,
   1.413  							int_payload_upper_extent + groove_ro])
   1.414  							rotate([0, 0, 180])
   1.415  								rotate([0, 90, 0])
   1.416 -									fillet(groove_rr, width - groove_depth * 2);
   1.417 +									fillet(groove_rr, payload_width - groove_depth * 2);
   1.418  					}
   1.419  				}
   1.420  
   1.421 @@ -668,7 +768,7 @@
   1.422  
   1.423  					/* Floor of cartridge. */
   1.424  
   1.425 -					cube_at(int_width, int_connector_back_depth, bottom,
   1.426 +					cube_at(int_connector_width, int_connector_back_depth, bottom,
   1.427  						0, 1, 1,
   1.428  						0, 0, -height / 2 + int_connector_height);
   1.429  
   1.430 @@ -716,21 +816,21 @@
   1.431  
   1.432  				cube_at(groove_depth, groove_width_normal, height,
   1.433  					1, 1, 0,
   1.434 -					-width / 2, 0, 0);
   1.435 +					-payload_width / 2, 0, 0);
   1.436  
   1.437  				/* Right groove. */
   1.438  
   1.439  				cube_at(groove_depth, groove_width_normal, height,
   1.440  					-1, 1, 0,
   1.441 -					width / 2, 0, 0);
   1.442 +					payload_width / 2, 0, 0);
   1.443  
   1.444  				/* Top grooves. */
   1.445  
   1.446 -				cube_at(width, groove_width_normal, groove_depth,
   1.447 +				cube_at(payload_width, groove_width_normal, groove_depth,
   1.448  					0, 1, -1,
   1.449  					0, 0, height / 2);
   1.450  
   1.451 -				cube_at(width, top_groove_width, top_groove_depth,
   1.452 +				cube_at(payload_width, top_groove_width, top_groove_depth,
   1.453  					0, 1, -1,
   1.454  					0, -groove_width_extra, height / 2);
   1.455  			}
   1.456 @@ -744,7 +844,7 @@
   1.457  
   1.458  					translate([0, back_depth, -height / 2])
   1.459  						linear_extrude(height = back_cavity_height)
   1.460 -							translate([-int_width / 2, 0, 0])
   1.461 +							translate([-int_connector_width / 2, 0, 0])
   1.462  								polygon([
   1.463  									[back_cavity_offset_from_inner_left, 0],
   1.464  									[back_cavity_inner_offset_from_inner_left,
   1.465 @@ -774,7 +874,7 @@
   1.466  
   1.467  			translate([0, int_connector_back_depth, -height / 2])
   1.468  				linear_extrude(height = int_connector_height)
   1.469 -					translate([-int_width / 2, 0, 0])
   1.470 +					translate([-int_connector_width / 2, 0, 0])
   1.471  						polygon([
   1.472  							[0, 0],
   1.473  							[inner_back_slope_max_offset, 0],
   1.474 @@ -785,7 +885,7 @@
   1.475  
   1.476  			translate([0, int_connector_back_depth, -height / 2])
   1.477  				linear_extrude(height = int_connector_height)
   1.478 -					translate([int_width / 2, 0, 0])
   1.479 +					translate([int_connector_width / 2, 0, 0])
   1.480  						polygon([
   1.481  							[0, 0],
   1.482  							[-inner_back_slope_max_offset, 0],
   1.483 @@ -813,11 +913,11 @@
   1.484  
   1.485  				/* Top left and right rounding. */
   1.486  			
   1.487 -				translate([-width / 2 + ro, back_depth / 2, height / 2 - ro])
   1.488 +				translate([-payload_width / 2 + ro, back_depth / 2, height / 2 - ro])
   1.489  					rotate([0, 0, 180])
   1.490  						rotate([90, 0, 0])
   1.491  							fillet(rr, back_depth);
   1.492 -				translate([width / 2 - ro, back_depth / 2, height / 2 - ro])
   1.493 +				translate([payload_width / 2 - ro, back_depth / 2, height / 2 - ro])
   1.494  					rotate([90, 0, 0])
   1.495  						fillet(rr, back_depth);
   1.496  			
   1.497 @@ -825,33 +925,63 @@
   1.498  			
   1.499  				translate([0, back_depth - ro, height / 2 - ro])
   1.500  					rotate([0, -90, 0])
   1.501 -						fillet(rr, width);
   1.502 +						fillet(rr, payload_width);
   1.503  			
   1.504 -				/* Edge rounding. */
   1.505 +				/* Outer edge rounding. */
   1.506  			
   1.507 -				translate([width / 2 - ro, back_depth - ro, 0])
   1.508 -					fillet(rr, height);
   1.509 -				translate([-width / 2 + ro, back_depth - ro, 0])
   1.510 +				translate([payload_width / 2 - ro, back_depth - ro, int_payload_lower_extent - extra])
   1.511 +					fillet_justified(rr, payload_height + extra);
   1.512 +
   1.513 +				translate([-payload_width / 2 + ro, back_depth - ro, int_payload_lower_extent - extra])
   1.514 +					rotate([0, 0, 90])
   1.515 +						fillet_justified(rr, payload_height + extra);
   1.516 +
   1.517 +				translate([connector_width / 2 - ro, back_depth - ro, -height / 2])
   1.518 +					fillet_partitioned(rr, connector_height);
   1.519 +
   1.520 +				translate([-connector_width / 2 + ro, back_depth - ro, -height / 2])
   1.521  					rotate([0, 0, 90])
   1.522 -						fillet(rr, height);
   1.523 +						fillet_partitioned(rr, connector_height);
   1.524 +
   1.525 +				/*
   1.526 +				Outer edge rounding of the back extension. This is done as a
   1.527 +				separate removal operation rather than occurring when creating the
   1.528 +				extension in order to ensure that the edges are actually rounded.
   1.529 +
   1.530 +				An extra overlapping measure is employed so that the filleting is
   1.531 +				continuous between the payload and connector portions. On the outside
   1.532 +				edges, the payload filleting is extended downwards.
   1.533 +				*/
   1.534  
   1.535 -				/* Outer edge rounding of the back extension. */
   1.536 +				translate([-payload_width / 2 + groove_depth + groove_ro, -groove_width_extra + groove_ro,
   1.537 +					int_payload_lower_extent - extra])
   1.538 +					rotate([0, 0, 180])
   1.539 +						fillet_justified(groove_rr, inner_payload_front_cutout_height + extra);
   1.540  
   1.541 -				translate([-width / 2 + groove_depth + groove_ro, -groove_width_extra + groove_ro,
   1.542 +				translate([payload_width / 2 - groove_depth - groove_ro, -groove_width_extra + groove_ro,
   1.543 +					int_payload_lower_extent - extra])
   1.544 +					rotate([0, 0, -90])
   1.545 +						fillet_justified(groove_rr, inner_payload_front_cutout_height + extra);
   1.546 +
   1.547 +				/* Sides of connector. */
   1.548 +
   1.549 +				translate([-connector_width / 2 + groove_depth + groove_ro, -groove_width_extra + groove_ro,
   1.550  					-height / 2])
   1.551  					rotate([0, 0, 180])
   1.552 -						fillet_justified(groove_rr, inner_side_front_cutout_height);
   1.553 +						fillet_partitioned(groove_rr, inner_connector_front_cutout_height);
   1.554  
   1.555 -				translate([width / 2 - groove_depth - groove_ro, -groove_width_extra + groove_ro,
   1.556 +				translate([connector_width / 2 - groove_depth - groove_ro, -groove_width_extra + groove_ro,
   1.557  					-height / 2])
   1.558  					rotate([0, 0, -90])
   1.559 -						fillet_justified(groove_rr, inner_side_front_cutout_height);
   1.560 +						fillet_partitioned(groove_rr, inner_connector_front_cutout_height);
   1.561 +
   1.562 +				/* Top of payload. */
   1.563  
   1.564  				translate([0, -groove_width_extra + groove_ro,
   1.565  					int_payload_upper_extent + inner_top_front_cutout_height - groove_ro])
   1.566  					rotate([0, 0, 180])
   1.567  						rotate([0, -90, 0])
   1.568 -							fillet(groove_rr, width - groove_depth * 2);
   1.569 +							fillet(groove_rr, payload_width - groove_depth * 2);
   1.570  			}
   1.571  		}
   1.572  
   1.573 @@ -931,13 +1061,13 @@
   1.574  				/* Holes for lugs. */
   1.575  
   1.576  				translate([
   1.577 -					-int_width / 2 + pcb_lug_offset_from_inside,
   1.578 +					-int_connector_width / 2 + pcb_lug_offset_from_inside,
   1.579  					pcb_hole_start_depth, pcb_lug_offset_from_bottom])
   1.580  					rotate([-90, 0, 0])
   1.581  						cylinder(h=pcb_hole_depth, r=pcb_lug_hole_radius);
   1.582  
   1.583  				translate([
   1.584 -					int_width / 2 - pcb_lug_offset_from_inside,
   1.585 +					int_connector_width / 2 - pcb_lug_offset_from_inside,
   1.586  					pcb_hole_start_depth, pcb_lug_offset_from_bottom])
   1.587  					rotate([-90, 0, 0])
   1.588  						cylinder(h=pcb_hole_depth, r=pcb_lug_hole_radius);