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