--- /dev/null
+infty = 100;
+eps = 0.01;
+
+wall = 1.5;
+
+lens_size = 9.2;
+lens_depth = 3;
+lens_side = 0.9;
+lens_angle = 0;
+
+cable_w = 7;
+
+stem_w = 2.75;
+slot_l = 8;
+slot_x_off = 6;
+slot_angle = 15;
+slot_y_angle = 10;
+
+// FIXME: Print rotated 180 degrees!
+module body() {
+ hull() {
+ rotate([lens_angle, 0, 0])
+ translate([-lens_size/2-wall, 0, 0])
+ cube([lens_size+2*wall, 2*wall+lens_depth, wall+lens_size/2]);
+ rotate([0, 0, slot_angle])
+ translate([-stem_w-wall-slot_x_off, -slot_l, 0])
+ cube([stem_w + 2*wall, slot_l, wall + lens_size/2]);
+ }
+}
+
+difference() {
+ body();
+ // bottom
+ translate([-infty/2, -infty/2, -infty]) cube(infty);
+ // lens body
+ rotate([lens_angle, 0, 0])
+ translate([-lens_size/2, wall, wall+(wall+lens_depth)*tan(-lens_angle)])
+ cube([lens_size, lens_depth, lens_size + eps]);
+ // lens front
+ rotate([lens_angle, 0, 0])
+ translate([-lens_size/2+lens_side, wall, wall+(wall+lens_depth)*tan(-lens_angle)])
+ cube([lens_size-2*lens_side, lens_depth+wall+eps, lens_size + wall + 2*eps]);
+ // cable hole
+ rotate([lens_angle, 0, 0])
+ translate([-cable_w/2, wall, -eps])
+ cube([cable_w, lens_depth+wall+eps, lens_size+wall+2*eps]);
+ rotate([0, 0, slot_angle])
+ rotate([0, slot_y_angle, 0])
+ translate([-stem_w-slot_x_off, -infty/2, lens_size/2-1.5-infty])
+ cube([stem_w, infty, infty]);
+}
hook_w = 3.5;
hook_l = 6;
-hook_hole_l = 2;
-hook_hole_w = 1.5;
+hook_hole_l = 3;
+hook_hole_w = 2;
+
+ziptie_w = 4;
+ziptie_h = 3;
// base plate
difference() {
// cube([body_l-2*corner_r-2*hook_l, body_w - 2*corner_r, wall +2*eps]);
translate([-body_l/2+corner_r, -body_w/2+corner_r, -eps])
cube([body_l-2*corner_r, body_w - 2*corner_r, wall +2*eps]);
+
+ // ziptie angles
+ for (x = [-1, 1]) for (y = [-1, 1]) scale([x, y, 1])
+ translate([body_l/2-corner_r-hook_l-ziptie_w,
+ body_w/2+wall/2-corner_r/2, wall])
+ rotate([-40, 0, 0])
+ translate([0, -ziptie_h/2, -infty/2])
+ cube([ziptie_w, ziptie_h, infty]);
+
+ // more space for lens
+ for (x = [-1, 1]) scale([x, 1, 1])
+ translate([body_l/2, -body_w/2+corner_r, -eps])
+ cube([wall+eps, body_w-2*corner_r, wall+2*eps]);
}
// raised corner bottom
translate([0, 0,-eps])
cylinder(r = corner_r, h = infty);
translate([-infty, -infty/2, -infty/2]) cube(infty);
+ // front edges cut
+ rotate([-30, 0, 0])
translate([-infty/2, -infty, -infty/2]) cube(infty);
}
// Q6 lens dimensions
yellow_ring_d = 19.5 + 0.5;
yellow_ring_h = 3.5;
+lens_d = 17;
view_angle = 95;
hood_h = 20;
-hood_top_d = 30;
+hood_top_d = 25;
-lens_d = 15;
+lens_d = 8;
wall = 1.5;
-rectangle_h = 80;
+rectangle_h = 120;
rectangle_w2h = 1.777;
rect_d2 = rectangle_h * tan(view_angle/2);
rect_x = 2*rect_d2/sqrt(1+rectangle_w2h*rectangle_w2h);
rect_y = rectangle_w2h * rect_x;
$fn = 128;
+
+module view_field() {
+ minkowski() {
+ hull() {
+ cube(eps);
+ translate([-rect_x/2, -rect_y/2, rectangle_h])
+ cube([rect_x, rect_y, eps]);
+ }
+ cylinder(r=lens_d/2, h = eps);
+ }
+}
+
+
+hood_r = 30;
+hood_h = 60;
+
+hood_y = 80;
+hood_x = 50;
+
+difference() {
+/*
+ union() {
+ translate([hood_x/2-wall, -hood_y/2, 0])
+ cube([wall, hood_y, hood_h]);
+ for (y = [-1,1]) scale([1, y, 1])
+ translate([-hood_x/2, hood_y/2-wall, 0])
+ cube([hood_x, wall, hood_h]);
+ }
+*/
+ scale([1, 1.5, 1])
+ cylinder(r = hood_r, h = hood_h);
+ scale([1, 1.5, 1])
+ translate([0, 0, -eps])
+ cylinder(r = hood_r-wall, h = hood_h+2*eps);
+
+ view_field();
+}
+
+difference() {
+ cylinder(r = yellow_ring_d/2+wall, h = yellow_ring_h);
+ translate([0, 0, -eps])
+ cylinder(r = yellow_ring_d/2, h = yellow_ring_h+2*eps);
+}
+
+/*
difference() {
// body
hull() {
}
-
-
+*/
// Q6 lens dimensions
black_ring_d = 18.5 + 0.5;
-yellow_ring_d = 19.5 + 0.5;
+yellow_ring_d = 19.5 + 1;
yellow_ring_d2 = 20.5;
black_ring_h = 3.5;
yellow_ring_h = 3.5;
lens_overhang = 2;
-wall = 1.5;
+clip_h = 0.5;
+clip_w = 1;
+
+wall = 1;
body_h = wall + lens_overhang + black_ring_h + yellow_ring_h;
body_d = 2*wall + yellow_ring_d2;
cylinder(r = black_ring_d/2-wall, h = lens_overhang+eps);
translate([0, 0, wall + lens_overhang])
cylinder(r = black_ring_d/2, h = black_ring_h+eps);
- translate([0, 0, wall + lens_overhang + black_ring_h])
+ translate([0, 0, wall + lens_overhang + black_ring_h]) difference() {
cylinder(r = yellow_ring_d/2, h = yellow_ring_h+eps);
+ for (angle = [0:90:360]) rotate ([0, 0, angle])
+ translate([yellow_ring_d/2 - clip_w, -yellow_ring_d/2,
+ yellow_ring_h - clip_h])
+ cube([clip_w + eps, yellow_ring_d, clip_h + 2*eps]);
+ }
}
fuse_w = 60;
fuse_h = 33-3;
-fuse_l = 80;
+fuse_l = 100;
wall = 2;
wing_hole_l = 25;
wing_hole_h = 8;
+rear_edge_w = 4;
+rear_edge_h = 19 -3 ; // see front_rod_h from mini-arrow-fuselage.scad
+rear_edge_l = 132-121.5; // fuse_l - front_rod_x from mini-arrow-fuselage.scad
+
+include <mini-arrow-spring2.scad>
+spring_width = 23;
+spring_beam_w = 3;
+
difference() {
translate([0, -fuse_w/2, 0]) intersection() {
- cube([fuse_l, fuse_w, fuse_h]);
- translate([0, 0, front_h])
- scale([fuse_l/(fuse_h-front_h), 1, 1])
+ cube([fuse_l - spring_width + spring_beam_w, fuse_w, fuse_h]);
+ translate([rear_edge_l, 0, front_h])
+ scale([(fuse_l-rear_edge_l)/(fuse_h-front_h), 1, 1])
rotate([-90, 0, 0])
cylinder(r = fuse_h-front_h,
h = fuse_w, $fn = 128);
translate([0, fuse_w/2, -10*0.707])
rotate([45, 0, 0])
cube([fuse_l, 10, 10]);
+ // rear end
+ for (y = [-1, 1]) scale([1, y, 1])
+ translate([0, fuse_w/2, 0])
+ rotate([0, 0, 60])
+ cylinder(r = rear_edge_w, h = rear_edge_h, $fn = 4);
};
// wing hole
translate([wing_hole_x, -fuse_w/2-eps, wall])
cube([wing_hole_l, fuse_w + 2*eps, wing_hole_h]);
// center squares
- for (x = [9:16:fuse_l - 15])
+ for (x = [9:16:fuse_l - 30])
for (y = [0,16])
for (n = [0, 16/2])
for (s = [-1, 1])
scale([1, s, 1])
translate([x+n, y-n, -eps])
cylinder(r = 6, h = wall + 2*eps, $fn = 4);
+ // top underhang
+ translate([rear_edge_l-infty, -infty/2, rear_edge_h])
+ cube(infty);
}
+
+translate([fuse_l - spring_width/2, 0, 0])
+rotate([0, 0, 90])
+ spring();
+
}
}
+module spring() {
poly_path4339(5);
poly_path4315(5);
poly_path4321(5);
poly_path4327(5);
poly_path4297(5);
poly_path4309(5);
+}
spoke_h = 1.5;
center_d = 5;
-center_hole = 1;
+center_hole = 1 + 0.5;
center_h = 8;
module body() {
segment_overlap = 15;
-loose_fit_diam_diff = 0.5; // cylinder with outer diameter d1
+loose_fit_diam_diff = 1.0; // cylinder with outer diameter d1
// will fit loosely into the hole with inner diameter
// d1 + loose_fit_diam_diff
-tight_fit_diam_diff = 0.25; // cylinder with outer diameter d1
+tight_fit_diam_diff = 0.5; // cylinder with outer diameter d1
// will fit tightly into the hole with inner diameter
// d1 + tight_fit_diam_diff
// keep the resulting .stl file manifold.
fudge = 0.1;
-module poly_path4306(h)
+module poly_outline()
{
- // linear_extrude(height=5)
- rotate_extrude(angle = 210) rotate([0, 0, 90])
- translate([35,-13, 0]){
- polygon([[-35.333988,-11.375980],[-35.388672,-10.879880],[-19.400388,-8.881840],[-7.386879,-6.756644],[4.589842,-4.381840],[11.716397,-2.942169],[19.560552,-0.889650],[22.772022,0.412676],[26.967856,2.622476],[31.177810,5.551311],[32.984881,7.226479],[34.431642,9.010740],[34.818362,10.416990],[34.888672,11.375980],[35.388672,11.368160],[35.314452,10.356450],[34.845702,8.733400],[33.349661,6.878547],[31.503835,5.154443],[27.236641,2.175499],[22.991750,-0.049398],[19.716792,-1.366210],[11.819819,-3.433821],[4.687502,-4.874020],[-7.291714,-7.247646],[-19.322268,-9.374020],[-35.333988,-11.375980]]);
- }
+translate([35.01, -17.5, 0])
+ polygon([[-34.993000,-7.750540],[-35.002600,-7.283950],[-30.390825,-6.787054],[-19.036880,-5.237750],[-5.577521,-2.848014],[4.953350,-0.739700],[12.407086,0.839569],[19.933820,2.756390],[29.405920,5.806369],[35.001720,7.750540],[35.002600,7.248370],[29.490142,5.319456],[20.070500,2.275930],[12.517434,0.353189],[5.050970,-1.227980],[-5.481264,-3.336864],[-18.958800,-5.729930],[-30.353692,-7.267481],[-34.993080,-7.750540]]);
}
infty = 200;
+
+module outline_border() {
+ rotate([0, -90, 0])
+ linear_extrude(height=0.5) poly_outline();
+}
+
+module body() {
+ // main shape
+ rotate_extrude(angle = 210)
+ rotate([0, 0, 90])
+ poly_outline();
+
+ // inner side supports
+ for (i = [-1,1]) scale([1, i, 1])
+ for (y = [0:0.25:3.5])
+ translate([0, y, 0])
+ outline_border();
+}
+
difference() {
- poly_path4306();
- translate([-infty/2, -infty/2, -infty]) cube(infty);
- rotate([7, 0, 0])
- translate([-infty/2, 10, -infty/2]) cube(infty);
+ body();
+ translate([5, -infty/2,-infty/2]) cube(infty);
}
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="1.979899"
- inkscape:cx="585.26214"
- inkscape:cy="560"
+ inkscape:zoom="3.959798"
+ inkscape:cx="543.45808"
+ inkscape:cy="425.42546"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
id="layer1">
<path
style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="m 99.999998,174.5 c 24.887072,-0.1539 52.990312,1.25242 62.500002,2.5 11.44956,1.92679 29.84519,3.48465 35,17.5"
- id="path4279"
+ d="m 99.999997,172 c 0,0 7.001553,0.5954 16.000003,2 8.99845,1.4046 18.91741,3.47247 24,4.5 5.08259,1.02753 9.81101,2.01972 15,3.5 5.18899,1.48028 15,5 15,5"
+ id="outline"
inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccc" />
+ sodipodi:nodetypes="czzzc"
+ inkscape:label="#path4268" />
</g>
</svg>