AcornElectron

Changeset

51:8aa91be70ce8
2014-12-06 Paul Boddie raw files shortlog changelog graph Introduced support for "left-justifying" a widened cartridge.
cartridge.scad (file)
     1.1 --- a/cartridge.scad	Mon Nov 24 23:28:19 2014 +0100
     1.2 +++ b/cartridge.scad	Sat Dec 06 19:00:29 2014 +0100
     1.3 @@ -181,6 +181,14 @@
     1.4  	int_payload_upper_extent = height / 2 - top;
     1.5  	int_payload_lower_extent = -height / 2 + int_connector_height + bottom;
     1.6  
     1.7 +	/* Where the payload is wider than the connector, the payload expands to the left. */
     1.8 +
     1.9 +	int_payload_right_extent = int_connector_width / 2;
    1.10 +	int_payload_left_extent = int_payload_right_extent - int_payload_width;
    1.11 +	payload_left_extent = int_payload_left_extent - side;
    1.12 +	payload_right_extent = int_payload_right_extent + side;
    1.13 +	payload_centre = (payload_left_extent + payload_right_extent) / 2;
    1.14 +
    1.15  	/* Cartridge surfaces. */
    1.16  
    1.17  	front_side = side;
    1.18 @@ -196,11 +204,15 @@
    1.19  	front_label_height = 46.0;
    1.20  	front_label_depth = 1.0;
    1.21  	front_label_offset_from_bottom = 19.5;
    1.22 +	front_label_centre = payload_centre;
    1.23 +	front_label_left_extent = front_label_centre - front_label_width / 2;
    1.24  
    1.25  	top_label_width = front_label_width;
    1.26  	top_label_height = 11.5; /* the height as seen from above */
    1.27  	top_label_depth = front_label_depth;
    1.28  	top_label_offset_from_front = 2.5;
    1.29 +	top_label_centre = payload_centre;
    1.30 +	top_label_left_extent = top_label_centre - front_label_width / 2;
    1.31  
    1.32  	/*
    1.33  	The groove around the sides and top. This is extended to allow the
    1.34 @@ -434,7 +446,7 @@
    1.35  
    1.36  	/* The actual shapes. */
    1.37  
    1.38 -	front_displacement = APART ? -payload_width * 0.6 : 0;
    1.39 +	front_displacement = APART ? -connector_width * 0.6 : 0;
    1.40  
    1.41  	if (FRONT)
    1.42  		translate([front_displacement, 0, 0])
    1.43 @@ -452,15 +464,15 @@
    1.44  
    1.45  					cube_at(payload_width, front, payload_height,
    1.46  						0, -1, 1,
    1.47 -						0, -int_front_depth, int_payload_lower_extent);
    1.48 +						payload_centre, -int_front_depth, int_payload_lower_extent);
    1.49  
    1.50  					cube_at(front_left, front_depth, payload_height,
    1.51  						-1, -1, 1,
    1.52 -						-int_payload_width / 2, 0, int_payload_lower_extent);
    1.53 +						int_payload_left_extent, 0, int_payload_lower_extent);
    1.54  
    1.55  					cube_at(front_right, front_depth, payload_height,
    1.56  						1, -1, 1,
    1.57 -						int_payload_width / 2, 0, int_payload_lower_extent);
    1.58 +						int_payload_right_extent, 0, int_payload_lower_extent);
    1.59  
    1.60  					/* Surfaces surrounding the connector. */
    1.61  
    1.62 @@ -480,7 +492,7 @@
    1.63  
    1.64  					cube_at(payload_width, front_depth, top,
    1.65  						0, -1, 1,
    1.66 -						0, 0, int_payload_upper_extent);
    1.67 +						payload_centre, 0, int_payload_upper_extent);
    1.68  				}
    1.69  
    1.70  				difference() {
    1.71 @@ -543,7 +555,7 @@
    1.72  				/* Front label. */
    1.73  
    1.74  				if (FRONT_LABEL_INSET)
    1.75 -					translate([-front_label_width / 2, -front_depth,
    1.76 +					translate([front_label_left_extent, -front_depth,
    1.77  						front_label_offset_from_bottom - height / 2])
    1.78  						cube([front_label_width, front_label_depth,
    1.79  							front_label_height]);
    1.80 @@ -551,7 +563,7 @@
    1.81  				/* Top label. See also the back piece. */
    1.82  
    1.83  				if (TOP_LABEL_INSET)
    1.84 -					translate([-top_label_width / 2,
    1.85 +					translate([top_label_left_extent,
    1.86  						-front_depth + top_label_offset_from_front,
    1.87  						height / 2 - top_label_depth])
    1.88  						cube([top_label_width, top_label_height,
    1.89 @@ -575,20 +587,20 @@
    1.90  			cube_at(inner_top_front_cutout_width,
    1.91  				inner_top_front_cutout_depth,
    1.92  				inner_top_front_cutout_height,
    1.93 -				0, -1, 1,
    1.94 -				0, 0, int_payload_upper_extent);
    1.95 +				1, -1, 1,
    1.96 +				int_payload_left_extent, 0, int_payload_upper_extent);
    1.97  
    1.98  			cube_at(inner_payload_front_cutout_width,
    1.99  				inner_payload_front_cutout_depth,
   1.100  				inner_payload_front_cutout_height,
   1.101  				1, -1, 1,
   1.102 -				int_payload_width / 2, 0, int_payload_lower_extent);
   1.103 +				int_payload_right_extent, 0, int_payload_lower_extent);
   1.104  
   1.105  			cube_at(inner_payload_front_cutout_width,
   1.106  				inner_payload_front_cutout_depth,
   1.107  				inner_payload_front_cutout_height,
   1.108  				-1, -1, 1,
   1.109 -				-int_payload_width / 2, 0, int_payload_lower_extent);
   1.110 +				int_payload_left_extent, 0, int_payload_lower_extent);
   1.111  
   1.112  			cube_at(inner_connector_front_cutout_width,
   1.113  				inner_connector_front_cutout_depth,
   1.114 @@ -608,27 +620,27 @@
   1.115  
   1.116  				/* Top left and right rounding. */
   1.117  			
   1.118 -				translate([-payload_width / 2 + ro, -front_depth / 2, height / 2 - ro])
   1.119 +				translate([payload_left_extent + ro, -front_depth / 2, height / 2 - ro])
   1.120  					rotate([0, 0, 180])
   1.121  						rotate([90, 0, 0])
   1.122  							fillet(rr, front_depth);
   1.123 -				translate([payload_width / 2 - ro, -front_depth / 2, height / 2 - ro])
   1.124 +				translate([payload_right_extent - ro, -front_depth / 2, height / 2 - ro])
   1.125  					rotate([90, 0, 0])
   1.126  						fillet(rr, front_depth);
   1.127  
   1.128  				/* Top front rounding. */
   1.129  			
   1.130 -				translate([0, -front_depth + ro, height / 2 - ro])
   1.131 +				translate([payload_centre, -front_depth + ro, height / 2 - ro])
   1.132  					rotate([0, 0, 180])
   1.133  						rotate([0, -90, 0])
   1.134  							fillet(rr, payload_width);
   1.135  
   1.136  				/* Edge rounding. */
   1.137  			
   1.138 -				translate([-payload_width / 2 + ro, -front_depth + ro, 0])
   1.139 +				translate([payload_left_extent + ro, -front_depth + ro, 0])
   1.140  					rotate([0, 0, 180])
   1.141  						fillet(rr, height);
   1.142 -				translate([payload_width / 2 - ro, -front_depth + ro, 0])
   1.143 +				translate([payload_right_extent - ro, -front_depth + ro, 0])
   1.144  					rotate([0, 0, 270])
   1.145  						fillet(rr, height);
   1.146  			}
   1.147 @@ -639,7 +651,7 @@
   1.148  	the same way, if APART is defined.
   1.149  	*/
   1.150  
   1.151 -	back_displacement = APART ? payload_width * 0.6 : 0;
   1.152 +	back_displacement = APART ? connector_width * 0.6 : 0;
   1.153  	back_rotation = APART ? 180 : 0;
   1.154  
   1.155  	if (BACK)
   1.156 @@ -661,15 +673,15 @@
   1.157  
   1.158  					cube_at(payload_width, payload_back, payload_height,
   1.159  						0, 1, 1,
   1.160 -						0, int_payload_back_depth, int_payload_lower_extent);
   1.161 +						payload_centre, int_payload_back_depth, int_payload_lower_extent);
   1.162  
   1.163  					cube_at(back_left, back_depth, payload_height,
   1.164  						-1, 1, 1,
   1.165 -						-int_payload_width / 2, 0, int_payload_lower_extent);
   1.166 +						int_payload_left_extent, 0, int_payload_lower_extent);
   1.167  
   1.168  					cube_at(back_right, back_depth, payload_height,
   1.169  						1, 1, 1,
   1.170 -						int_payload_width / 2, 0, int_payload_lower_extent);
   1.171 +						int_payload_right_extent, 0, int_payload_lower_extent);
   1.172  
   1.173  					/* Surfaces surrounding the connector. */
   1.174  
   1.175 @@ -691,7 +703,7 @@
   1.176  
   1.177  					cube_at(payload_width, back_depth, top,
   1.178  						0, 1, 1,
   1.179 -						0, 0, int_payload_upper_extent);
   1.180 +						payload_centre, 0, int_payload_upper_extent);
   1.181  
   1.182  					/*
   1.183  					The extension of the back to connect with the front. Here, the inside
   1.184 @@ -707,8 +719,8 @@
   1.185  					difference() {
   1.186  						cube_at(back_left - groove_depth, groove_width_extra, inner_payload_front_cutout_height,
   1.187  							-1, 1, 1,
   1.188 -							-int_payload_width / 2, -groove_width_extra, int_payload_lower_extent);
   1.189 -						translate([-int_payload_width / 2 - groove_ro, -groove_width_extra + groove_ro,
   1.190 +							int_payload_left_extent, -groove_width_extra, int_payload_lower_extent);
   1.191 +						translate([int_payload_left_extent - groove_ro, -groove_width_extra + groove_ro,
   1.192  							int_payload_lower_extent])
   1.193  							rotate([0, 0, -90])
   1.194  								fillet_justified(groove_rr, inner_payload_front_cutout_height);
   1.195 @@ -719,8 +731,8 @@
   1.196  					difference() {
   1.197  						cube_at(back_right - groove_depth, groove_width_extra, inner_payload_front_cutout_height,
   1.198  							1, 1, 1,
   1.199 -							int_payload_width / 2, -groove_width_extra, int_payload_lower_extent);
   1.200 -						translate([int_payload_width / 2 + groove_ro, -groove_width_extra + groove_ro,
   1.201 +							int_payload_right_extent, -groove_width_extra, int_payload_lower_extent);
   1.202 +						translate([int_payload_right_extent + groove_ro, -groove_width_extra + groove_ro,
   1.203  							int_payload_lower_extent])
   1.204  							rotate([0, 0, 180])
   1.205  								fillet_justified(groove_rr, inner_payload_front_cutout_height);
   1.206 @@ -755,8 +767,8 @@
   1.207  					difference() {
   1.208  						cube_at(payload_width - groove_depth * 2, groove_width_extra, top - top_groove_depth,
   1.209  							0, 1, 1,
   1.210 -							0, -groove_width_extra, int_payload_upper_extent);
   1.211 -						translate([0, -groove_width_extra + groove_ro,
   1.212 +							payload_centre, -groove_width_extra, int_payload_upper_extent);
   1.213 +						translate([payload_centre, -groove_width_extra + groove_ro,
   1.214  							int_payload_upper_extent + groove_ro])
   1.215  							rotate([0, 0, 180])
   1.216  								rotate([0, 90, 0])
   1.217 @@ -801,7 +813,7 @@
   1.218  				/* Top label. See also the front piece. */
   1.219  
   1.220  				if (TOP_LABEL_INSET)
   1.221 -					translate([-top_label_width / 2,
   1.222 +					translate([top_label_left_extent,
   1.223  						-front_depth + top_label_offset_from_front,
   1.224  						height / 2 - top_label_depth])
   1.225  						cube([top_label_width, top_label_height,
   1.226 @@ -816,23 +828,23 @@
   1.227  
   1.228  				cube_at(groove_depth, groove_width_normal, height,
   1.229  					1, 1, 0,
   1.230 -					-payload_width / 2, 0, 0);
   1.231 +					payload_left_extent, 0, 0);
   1.232  
   1.233  				/* Right groove. */
   1.234  
   1.235  				cube_at(groove_depth, groove_width_normal, height,
   1.236  					-1, 1, 0,
   1.237 -					payload_width / 2, 0, 0);
   1.238 +					payload_right_extent, 0, 0);
   1.239  
   1.240  				/* Top grooves. */
   1.241  
   1.242  				cube_at(payload_width, groove_width_normal, groove_depth,
   1.243  					0, 1, -1,
   1.244 -					0, 0, height / 2);
   1.245 +					payload_centre, 0, height / 2);
   1.246  
   1.247  				cube_at(payload_width, top_groove_width, top_groove_depth,
   1.248  					0, 1, -1,
   1.249 -					0, -groove_width_extra, height / 2);
   1.250 +					payload_centre, -groove_width_extra, height / 2);
   1.251  			}
   1.252  
   1.253  			/* Back cavity. */
   1.254 @@ -913,26 +925,26 @@
   1.255  
   1.256  				/* Top left and right rounding. */
   1.257  			
   1.258 -				translate([-payload_width / 2 + ro, back_depth / 2, height / 2 - ro])
   1.259 +				translate([payload_left_extent + ro, back_depth / 2, height / 2 - ro])
   1.260  					rotate([0, 0, 180])
   1.261  						rotate([90, 0, 0])
   1.262  							fillet(rr, back_depth);
   1.263 -				translate([payload_width / 2 - ro, back_depth / 2, height / 2 - ro])
   1.264 +				translate([payload_right_extent - ro, back_depth / 2, height / 2 - ro])
   1.265  					rotate([90, 0, 0])
   1.266  						fillet(rr, back_depth);
   1.267  			
   1.268  				/* Top back rounding. */
   1.269  			
   1.270 -				translate([0, back_depth - ro, height / 2 - ro])
   1.271 +				translate([payload_centre, back_depth - ro, height / 2 - ro])
   1.272  					rotate([0, -90, 0])
   1.273  						fillet(rr, payload_width);
   1.274  			
   1.275  				/* Outer edge rounding. */
   1.276  			
   1.277 -				translate([payload_width / 2 - ro, back_depth - ro, int_payload_lower_extent - extra])
   1.278 +				translate([payload_right_extent - ro, back_depth - ro, int_payload_lower_extent - extra])
   1.279  					fillet_justified(rr, payload_height + extra);
   1.280  
   1.281 -				translate([-payload_width / 2 + ro, back_depth - ro, int_payload_lower_extent - extra])
   1.282 +				translate([payload_left_extent + ro, back_depth - ro, int_payload_lower_extent - extra])
   1.283  					rotate([0, 0, 90])
   1.284  						fillet_justified(rr, payload_height + extra);
   1.285  
   1.286 @@ -953,12 +965,12 @@
   1.287  				edges, the payload filleting is extended downwards.
   1.288  				*/
   1.289  
   1.290 -				translate([-payload_width / 2 + groove_depth + groove_ro, -groove_width_extra + groove_ro,
   1.291 +				translate([payload_left_extent + groove_depth + groove_ro, -groove_width_extra + groove_ro,
   1.292  					int_payload_lower_extent - extra])
   1.293  					rotate([0, 0, 180])
   1.294  						fillet_justified(groove_rr, inner_payload_front_cutout_height + extra);
   1.295  
   1.296 -				translate([payload_width / 2 - groove_depth - groove_ro, -groove_width_extra + groove_ro,
   1.297 +				translate([payload_right_extent - groove_depth - groove_ro, -groove_width_extra + groove_ro,
   1.298  					int_payload_lower_extent - extra])
   1.299  					rotate([0, 0, -90])
   1.300  						fillet_justified(groove_rr, inner_payload_front_cutout_height + extra);
   1.301 @@ -977,7 +989,7 @@
   1.302  
   1.303  				/* Top of payload. */
   1.304  
   1.305 -				translate([0, -groove_width_extra + groove_ro,
   1.306 +				translate([payload_centre, -groove_width_extra + groove_ro,
   1.307  					int_payload_upper_extent + inner_top_front_cutout_height - groove_ro])
   1.308  					rotate([0, 0, 180])
   1.309  						rotate([0, -90, 0])