# Sample: creation of simple twist drill bit
#Category: Modeling
#Title: Drill

pload MODELING VISUALIZATION

# drill parameters (some terms taken from http://www.drill-bits.cn/drill-bits-quality.asp)
dset R  4.    ;# outer radius
dset D  2*R   ;# diameter
dset Rr 3.5   ;# chisel radius (outer radius minus body clearance)

dset b  1.    ;# web thickness (approximate)
dset d  b/2

dset H  80.   ;# height of the spiral part
dset a  3.*pi ;# total angle of spiral rotation

dset sigma 118 ;# point angle, in degrees

# Create section profile by sequence of Boolean operations
# on simple planar objects
puts "Creating the drill section profile..."

polyline rectangle1 d -R 0  R -R 0  -d R 0  -R R 0  d -R 0

circle circle1 0 0 0  0 0 1 R
mkedge circle1 circle1
wire circle1 circle1

circle circle2 0 0 0  0 0 1 Rr
mkedge circle2 circle2
wire circle2 circle2

plane p0
mkface rectangle1 p0 rectangle1
mkface circle1 p0 circle1
mkface circle2 p0 circle2

bcommon sec rectangle1 circle1
bfuse sec sec circle2
unifysamedom sec sec

# Construct flute profile so as to have cutting lip straight after sharpening.
# Here we need to take into account spiral shift of the flute edge
# along the point length -- the way to do that is to make spiral
# from the desired cutting lip edge and then intersect it by plane
polyline lip d -d/2 0  d -R -R/tan(sigma/2*pi/180)

polyline sp 0 0 0  0 0 H
cylinder cc 0 0 0  0 0 1  0 -4 0  4
line ll 0 0 a 80
trim ll ll 0 sqrt(a*a+H*H)

vertex v1 0 -R 0
vertex v2 0 -R H
trotate v2 0 0 0 0 0 1 180.*a/pi
mkedge ee ll cc v1 v2
wire gg ee
 
mksweep sp
setsweep -G gg 0 0
addsweep lip
buildsweep spiral -S

mkface f0 p0 -R R -R R
bsection sflute spiral f0

# here we rely on that section curve is parameterized from 0 to 1 
# and directed as cutting lip edge;
# note that this can change if intersection algorithm is modified
explode sflute e
mkcurve cflute sflute_1
cvalue cflute 0. x0 y0 z0
cvalue cflute 1. x1 y1 z1
vertex vf0 x0 y0 z0 
vertex vf1 x1 y1 z1

# -- variant: replace curve by arc with start at x0,y0,z0 and end at x1,y1,z1,
# -- such that tangent at start point is along Y
#dset Rflute ((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0))/(2*(x1-x0))
#circle aflute x0+Rflute y0 0  0 0 1  Rflute
#mkedge sflute_1 aflute vf0 vf1

# make rounding in the flute; use circle with radius Rr/2
circle cround x0+Rr/2 y0 0  0 0 1 Rr/2
vertex vf3 x0+Rr y0 0 
mkedge sflute_2 cround vf3 vf0
vertex vf2 R -R 0
edge sflute_3 vf3 vf2
edge sflute_4 vf2 vf1
wire w2 sflute_1 sflute_2 sflute_3 sflute_4
mkface flute p0 w2

# cut flute from profile
bcut sec sec flute
trotate flute 0 0 0 0 0 1 180.
bcut sec sec flute
donly sec

# sweep profile to get a drill body
puts "Sweeping the profile..."

mksweep sp
setsweep -G gg 0 0
explode sec w
addsweep sec_1
buildsweep base -S

# sharpen the drill (see http://tool-land.ru/zatochka-sverla.php)
puts "Sharpening..."

dset theta a*R/H*sin((90-sigma/2)*pi/180)
plane ax1 d 1.9*D "H+1.9*D/tan(pi/180.*sigma/2.)" 0 -1 -1
pcone sh1 ax1 0 100*sin((sigma-90)/2*pi/180.) 100
trotate sh1 0 0 0 0 0 1 -theta*180/pi
tcopy sh1 sh2
trotate sh2 0 0 0 0 0 1 180
box sh -D/2 -D/2 72 D D 20
bcommon qq sh1 sh2
bcut sharpener sh qq

bcut body base sharpener

# make a shank
puts "Making a shank..."
plane pl2 0 0 -40  0 0 1
pcylinder shank pl2 4 40
pcone transit R 0 R
plane pl3 0 0 -40  0 0 -0.5
pcone tail pl3 R 0 0.5
bfuse shank shank tail
bfuse shank shank transit
bfuse drill body shank

# check result
checkshape drill

# show result
puts "Displaying result..."
incmesh drill 0.01
vdisplay drill
vsetdispmode drill 1
vrenderparams -msaa 8
vfit

# show section and sweep path
ttranslate sec_1 0 0 H; trotate sec_1 0 0 0 0 0 1 a*180/pi; incmesh gg 0.01; vdisplay gg sec_1
