//////////////////////////////////////////////////////////////////////////////// module darkField_kerf() { spacing = .10; Dfilter = 32; ringThickness = 1+kerf; sparThickness = 1+kerf; startDiam = 4; endDiam = 24; diamInc = 2; numOfItems = floor(((endDiam-startDiam)/diamInc)+1); //Stop at 75% full size numRows = floor(sqrt(numOfItems)); numCols = floor(numOfItems/numRows); numOfLeftovers = numOfItems - numRows*numCols; echo("numOfItems =",numOfItems); echo("numRows =",numRows); echo("numCols =",numCols); echo("numOfLeftovers =",numOfLeftovers); for(j = [1:numRows]) { translate([0,-(j-1)*(Dfilter+Dfilter*spacing),0]) { for(i = [1:numCols]) assign(loopDiam = startDiam+(diamInc*((j-1)*numCols+(i-1)))) { translate([(i-1)*(Dfilter+Dfilter*spacing),0,0]) { difference() { circle(Dfilter/2+kerf,$fn=50); difference() { circle((Dfilter/2-ringThickness),$fn=50); for(i = [0:3]) { rotate(i*360/3,[0,0,1]) translate([-sparThickness/2-kerf/2,0,0]) square([(sparThickness+kerf),(Dfilter)/2]); } } } circle(loopDiam/2+kerf,$fn=50); echo("loopDiam",loopDiam); } } } } //take care of unfull rows if(numOfLeftovers > 0) { translate([0,-numRows*(Dfilter+Dfilter*spacing),0]) { for(i = [1:numOfLeftovers]) assign(loopDiam = startDiam+(diamInc*(numRows*numCols+(i-1)))) { translate([(i-1)*(Dfilter+Dfilter*spacing),0,0]) { difference() { circle(Dfilter/2+kerf,$fn=50); difference() { circle((Dfilter/2-ringThickness),$fn=50); for(i = [0:3]) { rotate(i*360/3,[0,0,1]) translate([-sparThickness/2-kerf/2,0,0]) square([sparThickness+kerf,(Dfilter)/2]); } } } circle(loopDiam/2+kerf,$fn=50); echo("loopDiam",loopDiam); } } } } } //////////////////////////////////////////////////////////////////////////////// module darkField() { spacing = .10; Dfilter = 32; ringThickness = 1; sparThickness = 1; startDiam = 4; endDiam = 24; diamInc = 2; numOfItems = floor(((endDiam-startDiam)/diamInc)+1); //Stop at 75% full size numRows = floor(sqrt(numOfItems)); numCols = floor(numOfItems/numRows); numOfLeftovers = numOfItems - numRows*numCols; echo("numOfItems =",numOfItems); echo("numRows =",numRows); echo("numCols =",numCols); echo("numOfLeftovers =",numOfLeftovers); for(j = [1:numRows]) { translate([0,-(j-1)*(Dfilter+Dfilter*spacing),0]) { for(i = [1:numCols]) assign(loopDiam = startDiam+(diamInc*((j-1)*numCols+(i-1)))) { translate([(i-1)*(Dfilter+Dfilter*spacing),0,0]) { difference() { circle(Dfilter/2,$fn=50); difference() { circle((Dfilter/2-ringThickness),$fn=50); for(i = [0:3]) { rotate(i*360/3,[0,0,1]) translate([-sparThickness/2,0,0]) square([sparThickness,(Dfilter)/2]); } } } circle(loopDiam/2,$fn=50); echo("loopDiam",loopDiam); } } } } //take care of unfull rows if(numOfLeftovers > 0) { translate([0,-numRows*(Dfilter+Dfilter*spacing),0]) { for(i = [1:numOfLeftovers]) assign(loopDiam = startDiam+(diamInc*(numRows*numCols+(i-1)))) { translate([(i-1)*(Dfilter+Dfilter*spacing),0,0]) { difference() { circle(Dfilter/2,$fn=50); difference() { circle((Dfilter/2-ringThickness),$fn=50); for(i = [0:3]) { rotate(i*360/3,[0,0,1]) translate([-sparThickness/2,0,0]) square([sparThickness,(Dfilter)/2]); } } } circle(loopDiam/2,$fn=50); echo("loopDiam",loopDiam); } } } } } //////////////////////////////////////////////////////////////////////////////// module oblique_kerf() { Dfilter = 32; spacing = .1; //10% spacing offsetInc = 2; startOffset = 2; endOffset = 23; //70% max offset numOfItems = floor(((endOffset-startOffset)/offsetInc)+1); //Stop at 75% full size numRows = floor(sqrt(numOfItems)); numCols = floor(numOfItems/numRows); numOfLeftovers = numOfItems - numRows*numCols; echo("numOfItems =",numOfItems); echo("numRows =",numRows); echo("numCols =",numCols); echo("numOfLeftovers =",numOfLeftovers); for(j = [1:numRows]) { translate([0,-(j-1)*(Dfilter+Dfilter*spacing),0]) { for(i = [1:numCols]) assign(offset = startOffset+(offsetInc*((j-1)*numCols+(i-1)))) { translate([-(i)*(Dfilter+Dfilter*spacing),0,0]) { difference() { echo("offset",offset); circle(Dfilter/2+kerf,$fn=50); translate([offset, 0, 0]) circle(Dfilter/2-kerf,$fn=50); } } } } } //take care of unfull rows if(numOfLeftovers > 0) { translate([0,-numRows*(Dfilter+Dfilter*spacing),0]) { for(i = [1:numOfLeftovers]) assign(offset = startOffset+(offsetInc*(numRows*numCols+(i-1)))) { translate([-(i)*(Dfilter+Dfilter*spacing),0,0]) { difference() { difference() { echo("offset",offset); circle(Dfilter/2+kerf,$fn=50); translate([offset, 0, 0]) circle(Dfilter/2-kerf,$fn=50); } } } } } } } //////////////////////////////////////////////////////////////////////////////// module oblique() { Dfilter = 32; spacing = .1; //10% spacing offsetInc = 2; startOffset = 2; endOffset = 23; //70% max offset numOfItems = floor(((endOffset-startOffset)/offsetInc)+1); //Stop at 75% full size numRows = floor(sqrt(numOfItems)); numCols = floor(numOfItems/numRows); numOfLeftovers = numOfItems - numRows*numCols; echo("numOfItems =",numOfItems); echo("numRows =",numRows); echo("numCols =",numCols); echo("numOfLeftovers =",numOfLeftovers); for(j = [1:numRows]) { translate([0,-(j-1)*(Dfilter+Dfilter*spacing),0]) { for(i = [1:numCols]) assign(offset = startOffset+(offsetInc*((j-1)*numCols+(i-1)))) { translate([-(i)*(Dfilter+Dfilter*spacing),0,0]) { difference() { echo("offset",offset); circle(Dfilter/2,$fn=50); translate([offset, 0, 0]) circle(Dfilter/2,$fn=50); } } } } } //take care of unfull rows if(numOfLeftovers > 0) { translate([0,-numRows*(Dfilter+Dfilter*spacing),0]) { for(i = [1:numOfLeftovers]) assign(offset = startOffset+(offsetInc*(numRows*numCols+(i-1)))) { translate([-(i)*(Dfilter+Dfilter*spacing),0,0]) { difference() { difference() { echo("offset",offset); circle(Dfilter/2,$fn=50); translate([offset, 0, 0]) circle(Dfilter/2,$fn=50); } } } } } } } //////////////////////////////////////////////////////////////////////////////// kerf=0.15; color("black") { oblique_kerf(); darkField_kerf(); } //Kerf visualization and check /*translate([0,0,0.5]) { oblique(); darkField(); }*/ /*translate([0,14,0]) { translate([0,0,1.1]) { color("blue") square(1,true); } translate([0,0,1]) { color("yellow") square(1+kerf*2,true); } }*/