FILAMENTSPOOL_AUTOS = filamentspool filamentspool-lt filamentspool-sm
FILAMENTSPOOL_AUTOS += filamentspool-storarm3
-USING_AUTOS ?= $(FILAMENTSPOOL_AUTOS) xeno-drivebay-bracket dungeonquest-cone anke-gps-bracket cable-hole-trunking-cover anglepoise-neck crossbar-computer-led-mount wardrobe-hook knifeblock pandemic-counter pattress-boxes-3-cover bike-lipo-box earring-stand bike-stalk-led-mount
+USING_AUTOS ?= $(FILAMENTSPOOL_AUTOS) xeno-drivebay-bracket dungeonquest-cone anke-gps-bracket cable-hole-trunking-cover anglepoise-neck crossbar-computer-led-mount wardrobe-hook knifeblock pandemic-counter pattress-boxes-3-cover bike-lipo-box earring-stand bike-stalk-led-mount sewing-table
AUTO_TOPLEVELS := $(foreach m,$(USING_AUTOS),$(shell $(PLAY)/toplevel-find $m))
-AUTO_INCS = funcs.scad utils.scad sealing-box.scad
+AUTO_INCS = funcs.scad utils.scad sealing-box.scad sewing-table.scad
default: autoincs scads
-$(shell set -xe; ./commitid.scad.pl >commitid.scad.tmp; cmp commitid.scad.tmp commitid.scad || mv -f commitid.scad.tmp commitid.scad )
+$(shell set -xe; $(PLAY)/commitid.scad.pl >commitid.scad.tmp; cmp commitid.scad.tmp commitid.scad || mv -f commitid.scad.tmp commitid.scad )
autoincs: $(AUTO_INCS)
scads: $(addsuffix .auto.scad, $(AUTO_TOPLEVELS))
filamentspool-number-n$n.dxf)
$(addsuffix .auto.stl, $(foreach f,$(FILAMENTSPOOL_AUTOS),$(shell \
- ./toplevel-find $f))): $(FILAMENTSPOOL_DXFS)
+ $(PLAY)/toplevel-find $(PLAY)/$f))): $(FILAMENTSPOOL_DXFS)
filamentspool-numbers filamentspool.stl: $(FILAMENTSPOOL_DXFS)
--- /dev/null
+// -*- C -*-
+
+include <funcs.scad>
+include <commitid.scad>
+
+ply_th = 18;
+ply_hole_dia = 15;
+ply_edge_min = 10;
+
+tile_th = 3;
+post_dia = 8;
+
+post_shorter = 1;
+
+screw_dia = 2.2;
+screw_big_dia = 3.6;
+screw_big_len = 4.0;
+
+round_edge_rad = 2.0;
+
+interlock_dia = 10;
+
+// calculated
+
+ply_edge_hole_dist = ply_edge_min + ply_hole_dia/2;
+
+echo(str("HOLES IN PLY ctr dist from edge = ", ply_edge_hole_dist));
+
+hole_slop = (ply_hole_dia - post_dia)/2;
+tile_hard_edge_hole_dist = ply_edge_hole_dist + hole_slop;
+thehd = [ tile_hard_edge_hole_dist, tile_hard_edge_hole_dist ];
+
+interlock_rad = interlock_dia/2;
+interlock_negative_rad = interlock_rad + 0.125;
+
+module Post(){
+ mirror([0,0,1]) {
+ difference(){
+ cylinder(r= post_dia/2, h= tile_th + ply_th - post_shorter);
+ translate([0,0, tile_th]) {
+ cylinder(r= screw_big_dia/2, h= screw_big_len);
+ cylinder(r= screw_dia/2, h= ply_th, $fn=20);
+ }
+ }
+ }
+}
+
+module Posts(posts) {
+ for (p= posts) {
+ translate([p[0], p[1], 0])
+ Post();
+ }
+}
+
+module TileBase(botleft_post, topright_post){
+ botleft = botleft_post - thehd;
+ size = topright_post - botleft_post + thehd * 2;
+ difference(){
+ mirror([0,0,1])
+ translate([botleft[0], botleft[1], 0])
+ cube([size[0], size[1], tile_th]);
+ translate( [ botleft_post[0], botleft_post[1], -tile_th ]
+ + 0.5 * [ post_dia, post_dia, 0 ] )
+ Commitid_BestCount_M( topright_post-botleft_post
+ + [0, thehd[0] ]
+ + [-post_dia,-post_dia] );
+ }
+}
+
+m4_dnl INREFFRAME(left_post, right_post, morevars) { body; }
+m4_define(`INREFFRAME',`
+ length_vec = ($2) - ($1);
+ length = dist2d([0,0], length_vec);
+ length_uvec = length_vec / length;
+ ortho_uvec = [ -length_uvec[1], length_uvec[0] ];
+ m = [ [ length_uvec[0], ortho_uvec[0], 0, ($1)[0], ],
+ [ length_uvec[1], ortho_uvec[1], 0, ($1)[1], ],
+ [ 0, 0, 1, 0, ],
+ [ 0, 0, 0, 1, ] ];
+ $3
+ multmatrix(m)
+')
+
+m4_dnl INREFFRAME(left_post, right_post, morevars)
+m4_dnl INREFFRAME_EDGE { body; }
+m4_define(`INREFFRAME_EDGE',`
+ translate([-thehd[1], -thehd[0], -round_edge_rad])
+')
+
+module RoundEdge(left_post, right_post) {
+ INREFFRAME(left_post, right_post,
+ `tlength = length + thehd[1] * 2;') m4_dnl '
+ INREFFRAME_EDGE {
+ difference(){
+ rotate([0,90,0])
+ cylinder(r= round_edge_rad, h= tlength, $fn=50);
+ translate([-1, 0, -20])
+ cube([tlength+2, 20, 20]);
+ }
+ }
+}
+
+module RoundLeftCorner(this_post, right_post) {
+ INREFFRAME(this_post, right_post) INREFFRAME_EDGE {
+ difference(){
+ sphere(r= round_edge_rad, $fn=60);
+ translate([0,0, -20])
+ cube([20,20,20]);
+ }
+ }
+}
+
+module InterlockCore(r, plusth, ymir) {
+ dx = sqrt(3) * r;
+ $fn= 80;
+ translate([0, -thehd[0], plusth]){
+ mirror([0,ymir,0]){
+ mirror([0,0,1]){
+ linear_extrude(height=tile_th+plusth*2, convexity=10){
+ circle(r=r);
+ difference(){
+ translate([-dx, -0.1])
+ square([ dx*2, r/2 + 0.1 ]);
+ for (xi = [-1, 1]) {
+ translate([ xi*dx, r ])
+ circle(r=r);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+module InterlockNegative(this_post, right_post) {
+ INREFFRAME(this_post, right_post)
+ InterlockCore(interlock_negative_rad, 1, 0);
+}
+
+module Interlock(this_post, right_post) {
+ INREFFRAME(this_post, right_post)
+ InterlockCore(interlock_rad, 0, 1);
+}
+
+module TestPiece1(){ ////toplevel
+ holes = [ [-100, 0],
+ [ 0, 0]
+ ];
+ difference(){
+ TileBase(holes[0], holes[1]);
+ InterlockNegative(holes[1], holes[1] + [0,1]);
+ }
+ Posts(holes);
+ RoundEdge(holes[0], holes[1]);
+ RoundEdge(holes[0] + [ 0, 0.1 ], holes[0]);
+ RoundLeftCorner(holes[0], holes[1]);
+}
+
+module TestPiece2(){ ////toplevel
+ holes = [ [ 0, 0],
+ [ 50, 0]
+ ];
+ TileBase(holes[0], holes[1]);
+ Posts(holes);
+ RoundEdge(holes[0], holes[1]);
+ Interlock(holes[0], holes[0] + [0, -1]);
+}
+
+module Demo(){
+ translate([ -thehd[1], 0 ])
+ color("blue")
+ TestPiece1();
+ translate([ +thehd[1], 0 ])
+ TestPiece2();
+}
+
+//TestPiece1();
+//TestPiece2();
+//Demo();