From ef5328e2957c15351f11c9f18dbda0911be7417a Mon Sep 17 00:00:00 2001 From: joak Date: Thu, 30 May 2024 00:54:05 +0200 Subject: [PATCH] Add 'test.scad' --- test.scad | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 test.scad diff --git a/test.scad b/test.scad new file mode 100644 index 0000000..b6251d2 --- /dev/null +++ b/test.scad @@ -0,0 +1,164 @@ +// mathgrrl punch card maker + +///////////////////////////////////////////////////////////////////// +// parameters + +$fn=48; // resolution + +rows = 48; // number of pattern rows +cols = 24; // 24 is standard + +p = 3.75; // punch diameter +r = p/2; // punch radius +h = 4.5; // horizontal distance between punch centers +v = 5; // vertical distance between punch centers + +b = 16; // horizontal card border +c = 11; // vertical card border + +width = cols*h+2*b; // card width - should be 140 for 24 punches +height = rows*v+2*c; // card height - should be 322 for 60 rows + +gaugerows = 6; // test gauge and enter here +gaugestitches = 5; // test gauge and enter here + +x = 1; // allows x in visual punch layout + +%color("white") card(width,height); // makes gray background for F5 + +///////////////////////////////////////////////////////////////////// +// punch the BORDER HOLES + +edge(width,height); +belt(rows); +loop(rows); +overlap(rows); + +///////////////////////////////////////////////////////////////////// +// punch a PATTERN (choose one) + +// one-line experiments +//punch(offdiagonals(6,rows)); +//punch(squares(4,4,rows)); +//punch(diagonals(6,10),shift=1,reverse="yes"); + +// diamonds +//punch(diagonals(6,rows)); +//punch(offdiagonals(6,rows)); + +// uneven diamonds +//punch(diagonals(6,rows)); +//punch(offdiagonals(5,rows)); + +// baby squares +//punch(diagonals(3,rows)); +//punch(offdiagonals(3,rows)); + +// baby square diagonal mixup +//punch(offdiagonals(12,rows)); +//punch(offdiagonals(8,rows)); +//punch(diagonals(3,rows)); + +// zipper +//punch(dots(4,1,rows)); +//punch(dots(6,4,rows)); +//punch(square(4,rows)); +punch(fil()); + +///////////////////////////////////////////////////////////////////// +// FUNCTIONS for patterns +include ; +function fil(filename) = + datas; + +// multiple rows of dots every "size" starting at "shift" +function dots(size,shift,length) = + [ for (j=[length-1:-1:0]) + [ for (i=[0:cols-1]) (i+j*(size-shift))%size==0 ? 0 : 1 ] ]; + +function diagonals(size,length) = // size div by 24 + [ for (j=[length-1:-1:0]) + [ for (i=[0:cols-1]) (i+j)%size==0 ? 0 : 1 ] ]; + +function offdiagonals(size,length) = // size div by 24 + [ for (j=[length-1:-1:0]) + [ for (i=[cols-1:-1:0]) (i+j+1)%size==0 ? 0 : 1 ] ]; + +function squares(across,high,length) = // across div by 24 + [ for (j=[length-1:-1:0]) + [ for (i=[0:cols-1]) (j%high==0 || i%across==0) ? 0 : 1 ] ]; + +///////////////////////////////////////////////////////////////////// +// MODULES for patterns + +module gauge(col=3,row=4){ + linear_extrude(2) + translate([0,c]) + scale([1,(h/v)*(gaugestitches/gaugerows)]) + translate([0,-c]) + children(); +} + +module punch(pattern,start=0,shift=0,reverse="no"){ + + // convert to coordinate list + // if/else requires updated OpenSCAD and lc-else setting in preferences + coords = [ for (i=[0:len(pattern[0])-1], j=[0:len(pattern)-1]) + if (reverse=="no" && pattern[j][i]==0) + [(i+shift)%cols,len(pattern)-1-j] + else if (reverse=="yes" && pattern[j][i]!=0) + [(i+shift)%cols,len(pattern)-1-j] ]; + + // place punches according to dimensions + place = [for (i=[0:len(coords)-1]) + [h*coords[i][0]+b+h/2,v*coords[i][1]+c+v/2]]; + + // put the punches on the card + for (i=[0:len(place)-1]) translate(place[i]) color("gray") circle(r); + +} + +///////////////////////////////////////////////////////////////////// +// MODULES for border punches + +module belt(rows){ + color("lightgreen") + for (j=[-2:rows+1]){ + translate([b+h/2-5.5,(c+v/2)+j*v]) circle(r-0.25); + translate([b+h/2+(cols-1)*h+5.5,(c+v/2)+j*v]) circle(r-0.25); + } +} + +module loop(rows){ + color("lightgreen") + for (j=[-1,0,rows/2-1,rows/2]){ // use this for two at top and bottom + //for (j=[-1:rows/2]){ // use this for all the way up and down + translate([b-10.5,c+v+j*2*v]) circle(r); + translate([b+cols*h+10.5,c+(j*2+1)*v]) circle(r); + } +} + +module overlap(rows){ + color("lightgreen") + for (i=[0:cols-1],j=[1,2]){ + translate([b+h/2+i*h,c+v/2-j*v]) circle(r); + translate([b+h/2+i*h,c+v/2+(rows-1+j)*v]) circle(r); + } +} + +///////////////////////////////////////////////////////////////////// +// MODULES for card + +// card outline (inside edge is the desired punch card outline) +module edge(width,height){ + extra = 2; + translate([-extra,-extra]) square([width+2*extra,extra]); + translate([-extra,-extra]) square([extra,height+2*extra]); + translate([-extra,height]) square([width+2*extra,extra]); + translate([width,-extra]) square([extra,height+2*extra]); +} + +// card shading (display only) +module card(width,height){ + linear_extrude(.1) square([width,height]); +}