Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
6e448b6f1This file is pinned to the selected release. Download the original to open it in your design tool.
// tape-cutter
// ostat - 2023-03-01
/* [Common settings] */
// The width of the tape (Role Height)
TapeWidth = 100;
// The thicness if the role
RoleThickness = 50;
// The role inner Diameter
RoleInnerDiameter = 80;
//Thickness of the cutter walls
Wallthickness = 2;
/* [Teeth] */
// The style of the teeth
TeethStyle = "teeth"; //[teeth: All teeth, hybrid: Teeth with smooth edge, edge: Smooth edge, blade: Blade insert]
//Size of the teath. Default is Wallthickness*2
TeethSize = 0;
// Raise the teeth
TeethBaseLength = 0;
// Sharpen the teeth
SharpenTeeth = "up"; //[no, down, up]
// Raise the at an angle
TeethAngle = 30;
// Thickness of the blade
BladeThickness = 0.5;
// Thickness of the teeth. Default is wallthickness
TeethThickness = 0;
/* [Extra settings] */
//How rounded the corners should be. Default is Wallthickness.
FilletRadius = 0;
//Size of the opening to insert the role. Default is RoleThickness*2/3.
Opening = 0;
//Show much of the tape should the cutter cover, in deg. Default, aims for an inside length fo 25mm.
SliceAngle = 0;
//Amount of clearance applied to TapeWidth and RoleThickness.
Clearance = 1;
/* [Hidden] */
fudgeFactor = 0.015;
rotatefudgeFactor = 1;
targetLength = 15;
$fn=120;
//Apply Clearance
_tapeWidth = TapeWidth + Clearance;
_roleThickness = RoleThickness + Clearance;
//Apply defaults
_opening = Opening > 0 ? Opening : _roleThickness*1/2;
_filletRadius = FilletRadius > 0 ? FilletRadius : Wallthickness/2;
_teethSize = TeethSize > 0 ? TeethSize : Wallthickness*2;
_teethBaseLength = TeethAngle > 0 && TeethBaseLength < 2 ? 2 : TeethBaseLength;
_sliceAngle = SliceAngle > 0 ? SliceAngle : acos((targetLength^2-2*((RoleInnerDiameter/2)^2))/(-2*(RoleInnerDiameter/2)^2));
_teethThickness = TeethThickness > 0 ? TeethThickness : TeethStyle == "blade" ? Wallthickness * 1.5 : Wallthickness;
difference(){
union(){
//outer sized
extrude(RoleInnerDiameter/2, _sliceAngle)
translate([_filletRadius,0,0])
RoundedSquare(_tapeWidth+Wallthickness*2, _roleThickness+Wallthickness*2, _filletRadius+Wallthickness);
translate([RoleInnerDiameter/2+_roleThickness,0,0])
Teeth(
teethSize = _teethSize,
style = TeethStyle,
baseLength = _teethBaseLength,
angle = TeethAngle,
sharpen = SharpenTeeth,
wallthickness = _teethThickness,
tapeWidth = _tapeWidth,
filletRadius = _filletRadius,
bladeThickness = BladeThickness);
}
//cutout spape
rotate([0,0,-rotatefudgeFactor/2])
extrude(RoleInnerDiameter/2, _sliceAngle+rotatefudgeFactor)
translate([_filletRadius,0,0])
union(){
RoundedSquare(_tapeWidth, _roleThickness, _filletRadius);
translate([(_roleThickness-_opening)/2-_filletRadius,-Wallthickness*2,0])
RoundedSquare(Wallthickness*2, _opening, 0);
}
}
module Teeth(
teethSize,
style,
baseLength,
angle,
sharpen,
wallthickness,
tapeWidth,
filletRadius,
bladeThickness)
{
teethDiag = teethSize*sqrt(2);
flatHeight = (tapeWidth-filletRadius*2);
teethCount = floor(flatHeight/teethDiag);
teethSpacing = ((flatHeight-teethDiag)/(teethCount));
echo (flatHeight = flatHeight, teetDiag = teethSize*sqrt(2), teethCount=teethCount, teethSpacing = teethSpacing);
bladeThickness = 0.5;
bladeDepth = baseLength;
rotate([0, 0,angle])
translate([0,-baseLength,0])
difference(){
union(){
for(i=[0:teethCount])
{
echo(i=i, pos = i*teethSpacing, end=i*teethSpacing+teethDiag);
translate([0,0,i*teethSpacing])
union(){
rotate([45,0,0])
cube([wallthickness,teethSize,teethSize]);
cube([wallthickness,baseLength*2,teethDiag]);
}
}
if(TeethStyle == "hybrid"){
translate([0,-teethDiag/2,teethSpacing+teethDiag/2])
cube([wallthickness,teethSize,teethSpacing*(teethCount-2)]);
}
if(TeethStyle == "edge" || TeethStyle == "blade"){
translate([0,-teethDiag/2,teethDiag/2])
cube([wallthickness,teethSize,teethSpacing*(teethCount)]);
}
}
if(TeethStyle == "blade"){
translate([(wallthickness-bladeThickness)/2,-(baseLength+1),-fudgeFactor])
cube([bladeThickness, baseLength*2, flatHeight+fudgeFactor*2]);
}
if(sharpen == "down" || TeethStyle == "blade"){
teethAng = atan(wallthickness/(teethDiag/2));
translate([wallthickness,0,0])
rotate([0,0,-(90+teethAng)])
cube([teethSize*2,teethSize,tapeWidth]);
}
if(sharpen == "up" || TeethStyle == "blade"){
teethAng = atan((teethDiag/2)/wallthickness);
rotate([0,0,-(90+teethAng)])
cube([teethSize*2,teethSize,tapeWidth]);
}
if(angle == 0){
translate([0,baseLength,0])
cube([wallthickness*2,teethSize,tapeWidth]);
}
}
}
module RoundedSquare(height, width, filletRadius){
if(filletRadius == 0 )
{
square([width,height]);
}
else
{
_filletRadius = min(height/2, width/2, filletRadius);
circlepositionx = width - _filletRadius*2;
circlepositiony = height - _filletRadius*2;
circlepositions =
[[ circlepositionx, circlepositiony ],
[ 0, circlepositiony ],
[ circlepositionx, 0],
[ 0, 0]];
hull() for (i= [ 0 : len(circlepositions) - 1 ])
{
translate([circlepositions[i][0], circlepositions[i][1], 0])
circle(r=_filletRadius);
}
}
}
module extrude(extrusiongRadius, extrusionAngle) {
rotate_extrude(angle=extrusionAngle, convexity=10)
translate([extrusiongRadius, 0, 0])
children();
}
// rotate as per a, v, but around point pt
module rotate_about_pt(z, y, pt) {
translate(pt)
rotate([0, y, z]) // CHANGE HERE
translate(-pt)
children();
}