0025024: BSplCLib::PrepareInsertKnots reports incorrect number of poles
[occt.git] / samples / tcl / drill.tcl
CommitLineData
07b5cb8f 1# Sample: creation of simple twist drill bit
2
3pload MODELING VISUALIZATION
4
5# drill parameters (some terms taken from http://www.drill-bits.cn/drill-bits-quality.asp)
6dset R 4. ;# outer radius
7dset D 2*R ;# diameter
8dset Rr 3.5 ;# chisel radius (outer radius minus body clearance)
9
10dset b 1. ;# web thickness (approximate)
11dset d b/2
12
13dset H 80. ;# height of the spiral part
14dset a 3.*pi ;# total angle of spiral rotation
15
16dset sigma 118 ;# point angle, in degrees
17
18# Create section profile by sequence of Boolean operations
19# on simple planar objects
20puts "Creating the drill section profile..."
21
22polyline rectangle1 d -R 0 R -R 0 -d R 0 -R R 0 d -R 0
23
24circle circle1 0 0 0 0 0 1 R
25mkedge circle1 circle1
26wire circle1 circle1
27
28circle circle2 0 0 0 0 0 1 Rr
29mkedge circle2 circle2
30wire circle2 circle2
31
32plane p0
33mkface rectangle1 p0 rectangle1
34mkface circle1 p0 circle1
35mkface circle2 p0 circle2
36
37bcommon sec rectangle1 circle1
38# note use of 'fuse' instead of 'bfuse' -- we need to get single face
39fuse sec sec circle2
40
41# Construct flute profile so as to have cutting lip straight after sharpening.
42# Here we need to take into account spiral shift of the flute edge
43# along the point length -- the way to do that is to make spiral
44# from the desired cutting lip edge and then intersect it by plane
45polyline lip d -d/2 0 d -R -R/tan(sigma/2*pi/180)
46
47polyline sp 0 0 0 0 0 H
48cylinder cc 0 0 0 0 0 1 0 -4 0 4
49line ll 0 0 a 80
50trim ll ll 0 sqrt(a*a+H*H)
51
52vertex v1 0 -R 0
53vertex v2 0 -R H
54trotate v2 0 0 0 0 0 1 180.*a/pi
55mkedge ee ll cc v1 v2
56wire gg ee
57
58mksweep sp
59setsweep -G gg 0 0
60addsweep lip
61buildsweep spiral -S
62
63mkface f0 p0 -R R -R R
64bsection sflute spiral f0
65
66# here we rely on that section curve is parameterized from 0 to 1
67# and directed as cutting lip edge;
68# note that this can change if intersection algorithm is modified
69explode sflute e
70mkcurve cflute sflute_1
71cvalue cflute 0. x0 y0 z0
72cvalue cflute 1. x1 y1 z1
73vertex vf0 x0 y0 z0
74vertex vf1 x1 y1 z1
75
76# -- variant: replace curve by arc with start at x0,y0,z0 and end at x1,y1,z1,
77# -- such that tanget at start point is along Y
78#dset Rflute ((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0))/(2*(x1-x0))
79#circle aflute x0+Rflute y0 0 0 0 1 Rflute
80#mkedge sflute_1 aflute vf0 vf1
81
82# make rounding in the flute; use circle with radius Rr/2
83circle cround x0+Rr/2 y0 0 0 0 1 Rr/2
84vertex vf3 x0+Rr y0 0
85mkedge sflute_2 cround vf3 vf0
86vertex vf2 R -R 0
87edge sflute_3 vf3 vf2
88edge sflute_4 vf2 vf1
89wire w2 sflute_1 sflute_2 sflute_3 sflute_4
90mkface flute p0 w2
91
92# cut flute from profile
93bcut sec sec flute
94trotate flute 0 0 0 0 0 1 180.
95bcut sec sec flute
96donly sec
97
98# sweep profile to get a drill body
99puts "Sweeping the profile..."
100
101mksweep sp
102setsweep -G gg 0 0
103explode sec w
104addsweep sec_1
105buildsweep base -S
106
107# sharpen the drill (see http://tool-land.ru/zatochka-sverla.php)
108puts "Sharpening..."
109
110dset theta a*R/H*sin((90-sigma/2)*pi/180)
111plane ax1 d 1.9*D "H+1.9*D/tan(pi/180.*sigma/2.)" 0 -1 -1
112pcone sh1 ax1 0 100*sin((sigma-90)/2*pi/180.) 100
113trotate sh1 0 0 0 0 0 1 -theta*180/pi
114tcopy sh1 sh2
115trotate sh2 0 0 0 0 0 1 180
116box sh -D/2 -D/2 72 D D 20
117bcommon qq sh1 sh2
118bcut sharpener sh qq
119
120bcut body base sharpener
121
122# make a shank
123puts "Making a shank..."
124plane pl2 0 0 -40 0 0 1
125pcylinder shank pl2 4 40
126pcone transit R 0 R
127plane pl3 0 0 -40 0 0 -0.5
128pcone tail pl3 R 0 0.5
129bfuse shank shank tail
130bfuse shank shank transit
131bfuse drill body shank
132
133# check result
134checkshape drill
135
136# show result
137puts "Displaying result..."
138incmesh drill 0.01
139vdisplay drill
140vsetdispmode drill 1
141vfit
142
143# show section and sweep path
144ttranslate 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