You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
3.5 KiB
126 lines
3.5 KiB
/*
|
|
* Star Adventurer Upgrades - Vixen Dovetail Bar
|
|
*
|
|
* Copyright (c) 2021 Steve Cross <flip@foxhollow.cc>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
|
|
dis_color="#2f99a7";
|
|
|
|
channel_height = 15; // mm, actual: 15mm
|
|
channel_width = 44; // mm, actual: 44 mm
|
|
channel_angle = 15; // degrees, actual: 15°
|
|
|
|
// how long the final bar is to be, in mm
|
|
channel_length = 200; // [20:10:200]
|
|
|
|
punch_hole_offset = 15;
|
|
punch_hole_d = 6.75; // actual: 6.35 mm
|
|
punch_head_d = 10; // actual: 9.50 mm
|
|
punch_head_h = 7.5; // actual: 6.40 mm
|
|
|
|
punch_slot_count = 4;
|
|
|
|
$fn = 360;
|
|
|
|
// flip_upside_down(channel_height)
|
|
make_vixen_dovetail_bar(channel_length);
|
|
|
|
module make_vixen_dovetail_bar(length, width = channel_width)
|
|
{
|
|
difference() {
|
|
make_base_vixen_dovetail_bar(length);
|
|
|
|
translate([channel_width/2, 0, 0])
|
|
make_all_slots();
|
|
}
|
|
}
|
|
|
|
module make_all_slots() {
|
|
length = (channel_length - (punch_hole_offset * (punch_slot_count+1))) / punch_slot_count;
|
|
// echo (length);
|
|
|
|
for (i = [1:punch_slot_count]) {
|
|
translate([
|
|
-punch_head_d/2, // shift to offset the width of the slot
|
|
(i*punch_hole_offset) + ((i-1)*length), // lay out lengthwise along the bar
|
|
0
|
|
])
|
|
make_dovetail_slot(length);
|
|
}
|
|
}
|
|
|
|
module flip_upside_down(height) {
|
|
translate([0, 0, height])
|
|
mirror([0, 0, 1])
|
|
children();
|
|
}
|
|
|
|
module cylinder2(h, d) {
|
|
translate([d/2, d/2, 0])
|
|
cylinder(h=h, d=d);
|
|
}
|
|
|
|
module make_dovetail_slot(length) {
|
|
translate([punch_head_d/2, punch_head_d/2, 0]) {
|
|
|
|
hull() {
|
|
cylinder(h= channel_height + 2, d= punch_hole_d);
|
|
|
|
// translate([0, length-punch_hole_d/2, 0])
|
|
translate([0, length-punch_head_d, 0])
|
|
cylinder(h= channel_height + 2, d= punch_hole_d);
|
|
}
|
|
|
|
translate([0, 0, -1])
|
|
hull() {
|
|
cylinder(h=punch_head_h+1, d=punch_head_d);
|
|
|
|
// translate([0, length-punch_hole_d/2, 0])
|
|
translate([0, length-punch_head_d, 0])
|
|
cylinder(h=punch_head_h+1, d=punch_head_d);
|
|
}
|
|
}
|
|
}
|
|
|
|
module make_base_vixen_dovetail_bar(length, width = channel_width, height = channel_height, angle = channel_angle, oversize = 0) {
|
|
// side_a
|
|
// ______
|
|
// | /
|
|
// | /
|
|
// | / side_c
|
|
// | /
|
|
// |/
|
|
// angle_a
|
|
//
|
|
// side_c = side_b / cos(angle_a)
|
|
// side_a = sqrt(sq(side_c) - sq(side_b))
|
|
//
|
|
|
|
side_c=height / cos(angle); // echo(side_c);
|
|
side_a = sqrt(pow(side_c, 2) - pow(height, 2)); // echo (side_a);
|
|
|
|
translate([0, length, 0])
|
|
rotate([90, 0, 0])
|
|
linear_extrude(height = length)
|
|
polygon(points=[
|
|
// [x, z]
|
|
[0, 0], // bottom left
|
|
[side_a, height], // top left
|
|
[width-side_a+oversize, height], // top right
|
|
[width+oversize, 0] // bottom right
|
|
]);
|
|
}
|
|
|