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
|
||||
*/
|
||||
|
||||
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
|
||||
use <BOSL/transforms.scad>
|
||||
use <BOSL/metric_screws.scad>
|
||||
use <BOSL/masks.scad>
|
||||
|
||||
use <holodisk_spec.scad>
|
||||
use <anim.scad>
|
||||
|
||||
include <holodisk.scad>
|
||||
include <reader.scad>
|
||||
|
114
holodisk.scad
114
holodisk.scad
@ -1,11 +1,55 @@
|
||||
// dependency: https://github.com/revarbat/BOSL
|
||||
use <BOSL/transforms.scad>
|
||||
use <BOSL/metric_screws.scad>
|
||||
//use <BOSL/metric_screws.scad>
|
||||
use <BOSL/masks.scad>
|
||||
|
||||
use <holodisk_spec.scad>
|
||||
use <anim.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;
|
||||
tc=tr*1.5;
|
||||
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() {
|
||||
linear_extrude(height=plate) {
|
||||
back_bumpers();
|
||||
square([width, depth]);
|
||||
difference() {
|
||||
linear_extrude(height=plate) {
|
||||
back_bumpers();
|
||||
square([width, depth]);
|
||||
}
|
||||
down(0.1) translate(get_holodisk_laser_cutout_pos()) cube(get_holodisk_laser_cutout_size());
|
||||
}
|
||||
}
|
||||
|
||||
color("SaddleBrown") top_cover();
|
||||
color("grey") walls();
|
||||
color("Silver") slides();
|
||||
color("SaddleBrown") bottom_cover();
|
||||
color("silver") back_bolts();
|
||||
color("silver") front_bolts();
|
||||
//color("silver") back_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 spindle(d, h) {
|
||||
color("Sienna") cylinder(h=h, d=d);
|
||||
@ -180,9 +267,12 @@ module mechanism() {
|
||||
tapes();
|
||||
}
|
||||
|
||||
module holodisk() {
|
||||
#frame();
|
||||
mechanism();
|
||||
module holodisk(size) {
|
||||
frame(size);
|
||||
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 --
|
72
reader.scad
72
reader.scad
@ -1,52 +1,53 @@
|
||||
// dependency: https://github.com/revarbat/BOSL
|
||||
use <BOSL/transforms.scad>
|
||||
|
||||
use <holodisk_spec.scad>
|
||||
|
||||
include <anim.scad>
|
||||
|
||||
// outside config
|
||||
width=60;
|
||||
height=15;
|
||||
depth=100;
|
||||
tape_height=5;
|
||||
tape_z=4;
|
||||
|
||||
// local config
|
||||
frame=5;
|
||||
head_frame=2;
|
||||
head_size=[14, 10, tape_height+head_frame*2];
|
||||
head_pos=[width/2, -frame+2, tape_z-head_frame];
|
||||
laser_size=[10, 2, tape_height];
|
||||
laser_pos=[head_pos.x, head_pos.y + 10 + head_size.y, tape_z];
|
||||
laser_tower_size=[laser_size.x+2, laser_size.y+1, 15];
|
||||
|
||||
module reader() {
|
||||
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;
|
||||
head_frame=2;
|
||||
head_size=[14, 10, tape_height+head_frame*2];
|
||||
head_pos=[laser_cutout_pos.x, -frame+2, tape_z-head_frame];
|
||||
laser_size=[10, 2, tape_height];
|
||||
laser_offset=3;
|
||||
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 laser(corner=0.1) {
|
||||
up(laser_size.z/2)
|
||||
up(corner)
|
||||
color("Red")
|
||||
minkowski() {
|
||||
s=[laser_size.x, laser_size.y, laser_size.z-corner*2];
|
||||
cube(s, center=true);
|
||||
sphere(corner);
|
||||
}
|
||||
fwd(laser_cutout_size.y/3) cube(laser_size, center=true);
|
||||
}
|
||||
|
||||
module laser_tower(corner=2) {
|
||||
module laser_tower(corner=1) {
|
||||
color("DarkSlateBlue")
|
||||
back(laser_tower_size.y-laser_size.y)
|
||||
difference() {
|
||||
minkowski() {
|
||||
s=[laser_tower_size.x, laser_tower_size.y, laser_tower_size.z-corner*2];
|
||||
up(laser_size.z/2)
|
||||
cube(s, center=true);
|
||||
sphere(corner);
|
||||
}
|
||||
fwd(laser_tower_size.y) scale(1.05) laser();
|
||||
up(laser_size.z/2)
|
||||
fwd(laser_offset/2) scale(0.99) cube(laser_tower_size, center=true);
|
||||
fwd(laser_size.y/3) scale(1.1) laser();
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
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) {
|
||||
@ -57,14 +58,19 @@ module reader() {
|
||||
s=[head_size[0], head_size[1] + frame, head_size[2]-corner*2];
|
||||
|
||||
difference() {
|
||||
up(head_size.z/2) cube(s, center=true);
|
||||
translate(head_pos) up(head_size.z/2) cube(s, center=true);
|
||||
head_space();
|
||||
}
|
||||
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) {
|
||||
laser();
|
||||
laser_tower();
|
||||
@ -73,10 +79,12 @@ module reader() {
|
||||
color("DarkSlateBlue") {
|
||||
difference() {
|
||||
fwd(frame) cube([width, frame, height]);
|
||||
translate(head_pos) head_space();
|
||||
head_space();
|
||||
}
|
||||
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