Extracted anim. Added holodisk spec.
This commit is contained in:
		
							parent
							
								
									c64fee4e52
								
							
						
					
					
						commit
						814f47b1a8
					
				
							
								
								
									
										14
									
								
								anim.scad
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								anim.scad
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | // animation | ||||||
|  | function get_anim_keys() = [ | ||||||
|  | 0, // initial | ||||||
|  | 0.1, // resting | ||||||
|  | 0.3, // holodisk inserted | ||||||
|  | 0.4, // laser raised | ||||||
|  | 0.5, // start playing | ||||||
|  | 0.7, // stop playing | ||||||
|  | 0.8, // laser lowered, holodisk removing | ||||||
|  | 1 // final | ||||||
|  | ]; | ||||||
|  | 
 | ||||||
|  | function anim(key_from, key_to, KEYS=get_anim_keys()) | ||||||
|  |     = max(0, min(($t - KEYS[key_from]) / (KEYS[key_to] - KEYS[key_from]), 1)); | ||||||
| @ -6,48 +6,10 @@ | |||||||
|  * Related: http://cedmagic.com/history/holotape.html |  * Related: http://cedmagic.com/history/holotape.html | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| width=55; |  | ||||||
| depth=100; |  | ||||||
| height=16; |  | ||||||
| wall=3; |  | ||||||
| plate=3; |  | ||||||
| top_rim=2; |  | ||||||
| bolt_headtype="hex"; |  | ||||||
| front_body_depth=12; |  | ||||||
| front_body_bolt_offset=8; |  | ||||||
| back_bumpers_radius=5; |  | ||||||
| back_bumpers_bolt_size=3; |  | ||||||
| tape_height=5; |  | ||||||
| tape_thickness=0.2; |  | ||||||
| spool_tape_tolerance=1; |  | ||||||
| spool_inner_height=tape_height+spool_tape_tolerance; |  | ||||||
| spool_inner_radius=4; |  | ||||||
| spool_outer_radius=18; |  | ||||||
| spool_plate_height=2; |  | ||||||
| spool_plate_holes=3; |  | ||||||
| spool_plate_hole_angle=360/spool_plate_holes * 0.5; |  | ||||||
| spool_plate_hole_inner_rim=1; |  | ||||||
| spool_plate_hole_outer_rim=4; |  | ||||||
| spool_slit_depth=0.8; |  | ||||||
| spool1_depth=depth*0.77; |  | ||||||
| spool2_depth=depth*0.40; |  | ||||||
| spool3_depth=(spool1_depth+spool2_depth)/2; |  | ||||||
| spool4_depth=depth*0.16; |  | ||||||
| main_spools_x=width * 0.45; |  | ||||||
| aux_spools_right_x=main_spools_x + spool_outer_radius + 1; |  | ||||||
| aux_spools_left_x=main_spools_x - 13; |  | ||||||
| middle_spool_in_r=2; |  | ||||||
| middle_spool_out_r=7; |  | ||||||
| aux_spool_plate_hole_inner_rim=2; |  | ||||||
| aux_spool_plate_hole_outer_rim=2; |  | ||||||
| spindle_diam=2; |  | ||||||
| spindle_diam_tolerance=0.2; |  | ||||||
| tape_z=plate+spool_plate_height; |  | ||||||
| 
 |  | ||||||
| // dependency: https://github.com/revarbat/BOSL | // dependency: https://github.com/revarbat/BOSL | ||||||
| use <BOSL/transforms.scad> | 
 | ||||||
| use <BOSL/metric_screws.scad> | use <holodisk_spec.scad> | ||||||
| use <BOSL/masks.scad> | use <anim.scad> | ||||||
| 
 | 
 | ||||||
| include <holodisk.scad> | include <holodisk.scad> | ||||||
| include <reader.scad> | include <reader.scad> | ||||||
|  | |||||||
							
								
								
									
										108
									
								
								holodisk.scad
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								holodisk.scad
									
									
									
									
									
								
							| @ -1,11 +1,55 @@ | |||||||
| // dependency: https://github.com/revarbat/BOSL | // dependency: https://github.com/revarbat/BOSL | ||||||
| use <BOSL/transforms.scad> | use <BOSL/transforms.scad> | ||||||
| use <BOSL/metric_screws.scad> | //use <BOSL/metric_screws.scad> | ||||||
| use <BOSL/masks.scad> | use <BOSL/masks.scad> | ||||||
| 
 | 
 | ||||||
|  | use <holodisk_spec.scad> | ||||||
|  | use <anim.scad> | ||||||
|  | 
 | ||||||
| include <tape.scad> | include <tape.scad> | ||||||
| 
 | 
 | ||||||
| module frame() { | disk_size = get_holodisk_size(); | ||||||
|  | holodisk_size = get_holodisk_size(); | ||||||
|  | wall=3; | ||||||
|  | plate=3; | ||||||
|  | top_rim=2; | ||||||
|  | bolt_headtype="hex"; | ||||||
|  | front_body_depth=12; | ||||||
|  | front_body_bolt_offset=8; | ||||||
|  | back_bumpers_radius=5; | ||||||
|  | back_bumpers_bolt_size=3; | ||||||
|  | tape_height=5; | ||||||
|  | tape_thickness=0.2; | ||||||
|  | spool_tape_tolerance=1; | ||||||
|  | spool_inner_height=tape_height+spool_tape_tolerance; | ||||||
|  | spool_inner_radius=4; | ||||||
|  | spool_outer_radius=18; | ||||||
|  | spool_plate_height=2; | ||||||
|  | spool_plate_holes=3; | ||||||
|  | spool_plate_hole_angle=360/spool_plate_holes * 0.5; | ||||||
|  | spool_plate_hole_inner_rim=1; | ||||||
|  | spool_plate_hole_outer_rim=4; | ||||||
|  | spool_slit_depth=0.8; | ||||||
|  | spool1_depth=disk_size.y*0.77; | ||||||
|  | spool2_depth=disk_size.y*0.40; | ||||||
|  | spool3_depth=(spool1_depth+spool2_depth)/2; | ||||||
|  | spool4_depth=disk_size.y*0.16; | ||||||
|  | main_spools_x=disk_size.x*0.45; | ||||||
|  | aux_spools_right_x=main_spools_x + spool_outer_radius + 1; | ||||||
|  | aux_spools_left_x=main_spools_x - 13; | ||||||
|  | middle_spool_in_r=2; | ||||||
|  | middle_spool_out_r=7; | ||||||
|  | aux_spool_plate_hole_inner_rim=2; | ||||||
|  | aux_spool_plate_hole_outer_rim=2; | ||||||
|  | spindle_diam=2; | ||||||
|  | spindle_diam_tolerance=0.2; | ||||||
|  | tape_z=plate+spool_plate_height; | ||||||
|  | 
 | ||||||
|  | module frame(size) { | ||||||
|  |     width=size.x; | ||||||
|  |     depth=size.y; | ||||||
|  |     height=size.z; | ||||||
|  |      | ||||||
|     tr=top_rim; |     tr=top_rim; | ||||||
|     tc=tr*1.5; |     tc=tr*1.5; | ||||||
|     fbd=front_body_depth; |     fbd=front_body_depth; | ||||||
| @ -76,21 +120,64 @@ module frame() { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|      |      | ||||||
|  |     module slides() { | ||||||
|  |         slide_size = get_holodisk_slide_size(); | ||||||
|  |             slide_pos = get_holodisk_slide_pos(); | ||||||
|  |             slide_plate_size = [0.1, slide_size.y, slide_size.z];  | ||||||
|  |             sliding_size = get_holodisk_slide_sliding_size(); | ||||||
|  |             sliding_pos = get_holodisk_slide_sliding_pos(); | ||||||
|  |          | ||||||
|  |         module slide() { | ||||||
|  |             hull() { | ||||||
|  |                 translate(sliding_pos) cube(sliding_size); | ||||||
|  |                 translate(slide_pos) cube(slide_plate_size); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         module slider() { | ||||||
|  |             slider_size = get_holodisk_slide_slider_size(); | ||||||
|  |             slider_pos = get_holodisk_slide_slider_pos(); | ||||||
|  |             slider_plate_size = [0.1, slider_size.y, slider_size.z];  | ||||||
|  |             slider_top_size = [slider_size.x, slider_size.y, sliding_size.z];  | ||||||
|  |             hull() { | ||||||
|  |                 up((slider_size.z-sliding_size.z)/2) translate(slider_pos) cube(slider_top_size); | ||||||
|  |                 translate(slider_pos) cube(slider_plate_size); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |              | ||||||
|  |         right(get_holodisk_size().x) { | ||||||
|  |            slide(); | ||||||
|  |            slider(); | ||||||
|  |         } | ||||||
|  |         scale([-1,1,1]) { | ||||||
|  |             slide(); | ||||||
|  |             slider(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|     module bottom_cover() { |     module bottom_cover() { | ||||||
|  |         difference() { | ||||||
|             linear_extrude(height=plate) { |             linear_extrude(height=plate) { | ||||||
|                 back_bumpers(); |                 back_bumpers(); | ||||||
|                 square([width, depth]); |                 square([width, depth]); | ||||||
|             } |             } | ||||||
|  |             down(0.1) translate(get_holodisk_laser_cutout_pos()) cube(get_holodisk_laser_cutout_size()); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     color("SaddleBrown") top_cover(); |     color("SaddleBrown") top_cover(); | ||||||
|     color("grey") walls(); |     color("grey") walls(); | ||||||
|  |     color("Silver") slides(); | ||||||
|     color("SaddleBrown") bottom_cover(); |     color("SaddleBrown") bottom_cover(); | ||||||
|     color("silver") back_bolts(); |     //color("silver") back_bolts(); | ||||||
|     color("silver") front_bolts(); |     //color("silver") front_bolts(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| module mechanism() { | module mechanism(size) { | ||||||
|  |     width=size.x; | ||||||
|  |     depth=size.y; | ||||||
|  |     height=size.z; | ||||||
|  |      | ||||||
|     module spool(r_in, r_out, in_rim, out_rim) { |     module spool(r_in, r_out, in_rim, out_rim) { | ||||||
|         module spindle(d, h) { |         module spindle(d, h) { | ||||||
|             color("Sienna") cylinder(h=h, d=d); |             color("Sienna") cylinder(h=h, d=d); | ||||||
| @ -180,9 +267,12 @@ module mechanism() { | |||||||
|     tapes(); |     tapes(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| module holodisk() { | module holodisk(size) { | ||||||
|     #frame(); |     frame(size); | ||||||
|     mechanism(); |     mechanism(size); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| holodisk(); | retraction=holodisk_size.y+10; | ||||||
|  | back((1-anim(1, 2)) * retraction) // anim insert | ||||||
|  | back((anim(len(get_anim_keys())-2, len(get_anim_keys())-1)) * retraction) // anim remove | ||||||
|  | holodisk(holodisk_size); | ||||||
|  | |||||||
							
								
								
									
										61
									
								
								holodisk_spec.scad
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								holodisk_spec.scad
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | |||||||
|  | /* | ||||||
|  |  * Technical Specification for Wattz Electronics Holodisk (AKA Holotape or THT) | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | // -- core dimensions -- | ||||||
|  | 
 | ||||||
|  | function get_holodisk_size() = [55, 100, 16]; | ||||||
|  | 
 | ||||||
|  | // -- tape -- | ||||||
|  | 
 | ||||||
|  | function get_holodisk_tape_height() = 5; | ||||||
|  | 
 | ||||||
|  | // -- slide -- | ||||||
|  | 
 | ||||||
|  | spz = 8; | ||||||
|  | function get_holodisk_slide_size() = [2, 35, get_holodisk_size().z - spz]; | ||||||
|  | 
 | ||||||
|  | function get_holodisk_slide_pos() = [0, 15, spz/2]; | ||||||
|  | 
 | ||||||
|  | sy = 2; | ||||||
|  | sz = 4; | ||||||
|  | function get_holodisk_slide_sliding_size() = [get_holodisk_slide_size().x, get_holodisk_slide_size().y - sy, get_holodisk_slide_size().z - sz]; | ||||||
|  | 
 | ||||||
|  | function get_holodisk_slide_sliding_pos() = [get_holodisk_slide_pos().x, get_holodisk_slide_pos().y + sy/2, get_holodisk_slide_pos().z + sz/2]; | ||||||
|  | 
 | ||||||
|  | srx = 2; | ||||||
|  | srz = 2; | ||||||
|  | function get_holodisk_slide_slider_size() = [get_holodisk_slide_size().x + srx, 15, get_holodisk_slide_size().z + srz]; | ||||||
|  | 
 | ||||||
|  | function get_holodisk_slide_slider_pos() = [get_holodisk_slide_sliding_pos().x, get_holodisk_slide_sliding_pos().y, get_holodisk_slide_sliding_pos().z - get_holodisk_slide_slider_size().z/2 + srz]; | ||||||
|  | 
 | ||||||
|  | // -- laser -- | ||||||
|  | 
 | ||||||
|  | function get_holodisk_laser_cutout_size() = [15, 9, 20]; | ||||||
|  | 
 | ||||||
|  | function get_holodisk_laser_cutout_pos() = [ | ||||||
|  |     get_holodisk_size().x/2 - get_holodisk_laser_cutout_size().x/2, | ||||||
|  |     12, | ||||||
|  |     0]; | ||||||
|  |      | ||||||
|  | function get_holodisk_laser_cutout_pos_center() = [ | ||||||
|  |     get_holodisk_laser_cutout_pos().x + get_holodisk_laser_cutout_size().x/2, | ||||||
|  |     get_holodisk_laser_cutout_pos().y + get_holodisk_laser_cutout_size().y/2, | ||||||
|  |     get_holodisk_laser_cutout_pos().z + get_holodisk_laser_cutout_size().z/2]; | ||||||
|  | 
 | ||||||
|  | // -- laser-window -- | ||||||
|  | 
 | ||||||
|  | function get_holodisk_laserwindow_pos_center() = [ | ||||||
|  |     get_holodisk_laser_cutout_pos_center().x, | ||||||
|  |     0, | ||||||
|  |     6.5 | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  | function get_holodisk_laserwindow_size() = [ | ||||||
|  |     get_holodisk_laser_cutout_size().x, | ||||||
|  |     30, | ||||||
|  |     get_holodisk_tape_height() + 2 | ||||||
|  |     ]; | ||||||
|  |      | ||||||
|  | // -- END -- | ||||||
							
								
								
									
										62
									
								
								reader.scad
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								reader.scad
									
									
									
									
									
								
							| @ -1,52 +1,53 @@ | |||||||
| // dependency: https://github.com/revarbat/BOSL | // dependency: https://github.com/revarbat/BOSL | ||||||
| use <BOSL/transforms.scad> | use <BOSL/transforms.scad> | ||||||
| 
 | 
 | ||||||
|  | use <holodisk_spec.scad> | ||||||
|  | 
 | ||||||
|  | include <anim.scad> | ||||||
|  | 
 | ||||||
| // outside config | // outside config | ||||||
| width=60; |  | ||||||
| height=15; |  | ||||||
| depth=100; |  | ||||||
| tape_height=5; | tape_height=5; | ||||||
| tape_z=4; | tape_z=4; | ||||||
| 
 | 
 | ||||||
| // local config | 
 | ||||||
|  | module reader(disk_size) { | ||||||
|  |     width=disk_size.x; | ||||||
|  |     depth=disk_size.y; | ||||||
|  |     height=disk_size.z; | ||||||
|  | 
 | ||||||
|  |     laser_cutout_size = get_holodisk_laser_cutout_size(); | ||||||
|  |     laser_cutout_pos = get_holodisk_laser_cutout_pos_center(); | ||||||
|  |      | ||||||
|     frame=5; |     frame=5; | ||||||
|     head_frame=2; |     head_frame=2; | ||||||
|     head_size=[14, 10, tape_height+head_frame*2]; |     head_size=[14, 10, tape_height+head_frame*2]; | ||||||
| head_pos=[width/2, -frame+2, tape_z-head_frame]; |     head_pos=[laser_cutout_pos.x, -frame+2, tape_z-head_frame]; | ||||||
|     laser_size=[10, 2, tape_height]; |     laser_size=[10, 2, tape_height]; | ||||||
| laser_pos=[head_pos.x, head_pos.y + 10 + head_size.y, tape_z]; |     laser_offset=3; | ||||||
| laser_tower_size=[laser_size.x+2, laser_size.y+1, 15]; |     laser_pos=[laser_cutout_pos.x, laser_cutout_pos.y + laser_offset, tape_z]; | ||||||
|  |     laser_tower_size=[laser_cutout_size.x - 1, laser_cutout_size.y - 1 - laser_offset, 15]; | ||||||
|      |      | ||||||
| module reader() { |  | ||||||
|     module laser(corner=0.1) { |     module laser(corner=0.1) { | ||||||
|         up(laser_size.z/2) |         up(laser_size.z/2) | ||||||
|         up(corner) |         up(corner) | ||||||
|         color("Red") |         color("Red") | ||||||
|         minkowski() { |         fwd(laser_cutout_size.y/3) cube(laser_size, center=true); | ||||||
|             s=[laser_size.x, laser_size.y, laser_size.z-corner*2]; |  | ||||||
|             cube(s, center=true); |  | ||||||
|             sphere(corner); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     module laser_tower(corner=2) { |     module laser_tower(corner=1) { | ||||||
|         color("DarkSlateBlue") |         color("DarkSlateBlue") | ||||||
|         back(laser_tower_size.y-laser_size.y) |  | ||||||
|         difference() { |         difference() { | ||||||
|             minkowski() { |  | ||||||
|                 s=[laser_tower_size.x, laser_tower_size.y, laser_tower_size.z-corner*2]; |  | ||||||
|             up(laser_size.z/2) |             up(laser_size.z/2) | ||||||
|                 cube(s, center=true); |             fwd(laser_offset/2) scale(0.99) cube(laser_tower_size, center=true); | ||||||
|                 sphere(corner); |             fwd(laser_size.y/3) scale(1.1) laser(); | ||||||
|             } |  | ||||||
|             fwd(laser_tower_size.y) scale(1.05) laser(); |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     module head_space() { |     module head_space() { | ||||||
|         stube=[head_size.x-head_frame*2, head_size.y+head_frame*3, head_size.z-head_frame*2]; |         /*stube=[head_size.x-head_frame*2, head_size.y+head_frame*3, head_size.z-head_frame*2]; | ||||||
|         up(head_size.z/4 + head_frame) |         up(head_size.z/4 + head_frame) | ||||||
|             cube(stube, center=true); |             cube(stube, center=true);*/ | ||||||
|  |         translate(get_holodisk_laserwindow_pos_center()) cube(get_holodisk_laserwindow_size(), center=true); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     module head(corner=0.5) { |     module head(corner=0.5) { | ||||||
| @ -57,14 +58,19 @@ module reader() { | |||||||
|             s=[head_size[0], head_size[1] + frame, head_size[2]-corner*2]; |             s=[head_size[0], head_size[1] + frame, head_size[2]-corner*2]; | ||||||
|              |              | ||||||
|             difference() { |             difference() { | ||||||
|                 up(head_size.z/2) cube(s, center=true); |                 translate(head_pos) up(head_size.z/2) cube(s, center=true); | ||||||
|                 head_space(); |                 head_space(); | ||||||
|             } |             } | ||||||
|             sphere(corner); |             sphere(corner); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     |     | ||||||
|     translate(head_pos) head(); |     head(); | ||||||
|  |      | ||||||
|  |     retraction=laser_tower_size.z; | ||||||
|  |     down(retraction) | ||||||
|  |     up(anim(2, 3)*retraction) | ||||||
|  |     down(anim(5, 6)*retraction) | ||||||
|     translate(laser_pos) { |     translate(laser_pos) { | ||||||
|         laser(); |         laser(); | ||||||
|         laser_tower(); |         laser_tower(); | ||||||
| @ -73,10 +79,12 @@ module reader() { | |||||||
|     color("DarkSlateBlue") { |     color("DarkSlateBlue") { | ||||||
|         difference() { |         difference() { | ||||||
|             fwd(frame) cube([width, frame, height]); |             fwd(frame) cube([width, frame, height]); | ||||||
|             translate(head_pos) head_space(); |             head_space(); | ||||||
|         } |         } | ||||||
|         fwd(frame) down(frame) cube([width, depth + frame, frame]); |         fwd(frame) down(frame) cube([width, depth + frame, frame]); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| reader(); | holodisk_size = is_undef(disk_size) ? [50, 100, 20] : disk_size; | ||||||
|  | 
 | ||||||
|  | reader(holodisk_size); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user