]>
Commit | Line | Data |
---|---|---|
4e57c75e | 1 | // Created by: Peter KURNEV |
973c2be1 | 2 | // Copyright (c) 1999-2014 OPEN CASCADE SAS |
4e57c75e | 3 | // |
973c2be1 | 4 | // This file is part of Open CASCADE Technology software library. |
4e57c75e | 5 | // |
a942f2da | 6 | // This library is free software; you can redistribute it and / or modify it |
7 | // under the terms of the GNU Lesser General Public version 2.1 as published | |
973c2be1 | 8 | // by the Free Software Foundation, with special exception defined in the file |
9 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT | |
10 | // distribution for complete text of the license and disclaimer of any warranty. | |
4e57c75e | 11 | // |
973c2be1 | 12 | // Alternatively, this file may be used under the terms of Open CASCADE |
13 | // commercial license or contractual agreement. | |
4e57c75e | 14 | |
15 | #include <BOPTest.ixx> | |
16 | ||
17 | #include <stdio.h> | |
796a784d | 18 | #include <string.h> |
4e57c75e | 19 | |
20 | #include <NCollection_IncAllocator.hxx> | |
21 | ||
22 | #include <DBRep.hxx> | |
23 | #include <Draw.hxx> | |
24 | #include <Draw_Color.hxx> | |
25 | #include <DrawTrSurf.hxx> | |
26 | ||
27 | #include <TopoDS_Shape.hxx> | |
28 | // | |
29 | #include <BOPAlgo_Builder.hxx> | |
30 | #include <BOPAlgo_PaveFiller.hxx> | |
31 | #include <BOPAlgo_Operation.hxx> | |
32 | #include <BOPAlgo_BOP.hxx> | |
33 | // | |
34 | #include <BOPTest_DrawableShape.hxx> | |
35 | #include <BOPTest_Objects.hxx> | |
36 | ||
37 | // | |
796a784d | 38 | #ifdef HAVE_TBB |
39 | #include <BOPCol_TBB.hxx> | |
40 | //======================================================================= | |
41 | //class : BOPTime_Chronometer | |
42 | //purpose : | |
43 | //======================================================================= | |
44 | class BOPTime_Chronometer { | |
45 | public: | |
46 | BOPTime_Chronometer() { | |
47 | } | |
48 | // | |
49 | ~BOPTime_Chronometer() { | |
50 | } | |
51 | // | |
52 | void Start() { | |
53 | myT0 = tick_count::now(); | |
54 | } | |
55 | // | |
56 | void Stop() { | |
57 | myTime=(tick_count::now() - myT0).seconds(); | |
58 | } | |
59 | // | |
60 | double Time() const{ | |
61 | return myTime; | |
62 | }; | |
63 | // | |
64 | protected: | |
65 | tick_count myT0; | |
66 | double myTime; | |
67 | }; | |
68 | //////////////////////////////////////////////////////////////////////// | |
69 | #else | |
70 | #include <OSD_Chronometer.hxx> | |
71 | //======================================================================= | |
72 | //class : BOPTime_Chronometer | |
73 | //purpose : | |
74 | //======================================================================= | |
75 | class BOPTime_Chronometer { | |
76 | public: | |
77 | BOPTime_Chronometer() { | |
78 | } | |
79 | // | |
80 | ~BOPTime_Chronometer() { | |
81 | } | |
82 | // | |
83 | void Start() { | |
84 | myChronometer.Reset(); | |
85 | myChronometer.Start(); | |
86 | } | |
87 | // | |
88 | void Stop() { | |
89 | myChronometer.Stop(); | |
90 | myChronometer.Show(myTime); | |
91 | } | |
92 | // | |
93 | double Time() const{ | |
94 | return myTime; | |
95 | }; | |
96 | // | |
97 | protected: | |
98 | OSD_Chronometer myChronometer; | |
99 | double myTime; | |
100 | }; | |
101 | #endif | |
102 | ||
4e57c75e | 103 | static Standard_Integer bfillds (Draw_Interpretor&, Standard_Integer, const char**); |
104 | static Standard_Integer bbuild (Draw_Interpretor&, Standard_Integer, const char**); | |
105 | static Standard_Integer bbop (Draw_Interpretor&, Standard_Integer, const char**); | |
106 | static Standard_Integer bclear (Draw_Interpretor&, Standard_Integer, const char**); | |
a942f2da | 107 | |
4e57c75e | 108 | //======================================================================= |
109 | //function : PartitionCommands | |
110 | //purpose : | |
111 | //======================================================================= | |
a942f2da | 112 | void BOPTest::PartitionCommands(Draw_Interpretor& theCommands) |
4e57c75e | 113 | { |
114 | static Standard_Boolean done = Standard_False; | |
115 | if (done) return; | |
116 | done = Standard_True; | |
117 | // Chapter's name | |
118 | const char* g = "Partition commands"; | |
119 | // Commands | |
a942f2da | 120 | theCommands.Add("bfillds" , "use bfillds [-s -t]" , __FILE__, bfillds, g); |
121 | theCommands.Add("bbuild" , "use bbuild r [-s -t]", __FILE__, bbuild, g); | |
122 | theCommands.Add("bbop" , "use bbop r op" , __FILE__, bbop, g); | |
123 | theCommands.Add("bclear" , "use bclear" , __FILE__, bclear, g); | |
4e57c75e | 124 | } |
125 | ||
126 | //======================================================================= | |
127 | //function : bclear | |
128 | //purpose : | |
129 | //======================================================================= | |
a942f2da | 130 | Standard_Integer bclear(Draw_Interpretor& di, |
131 | Standard_Integer n, | |
132 | const char** ) | |
4e57c75e | 133 | { |
134 | if (n!=1) { | |
135 | di << " use bclear\n"; | |
136 | return 0; | |
137 | } | |
138 | // | |
139 | BOPTest_Objects::Clear(); | |
140 | return 0; | |
141 | } | |
142 | //======================================================================= | |
143 | //function : bfillds | |
144 | //purpose : | |
145 | //======================================================================= | |
a942f2da | 146 | Standard_Integer bfillds(Draw_Interpretor& di, |
147 | Standard_Integer n, | |
148 | const char** a) | |
4e57c75e | 149 | { |
a942f2da | 150 | if (n>3) { |
151 | di << " use bfillds [-s -t]\n"; | |
4e57c75e | 152 | return 0; |
153 | } | |
154 | // | |
155 | char buf[32]; | |
a942f2da | 156 | Standard_Boolean bRunParallel, bShowTime; |
157 | Standard_Integer i, aNbS, iErr; | |
4e57c75e | 158 | BOPCol_ListIteratorOfListOfShape aIt; |
159 | BOPCol_ListOfShape aLC; | |
a942f2da | 160 | BOPTime_Chronometer aChrono; |
4e57c75e | 161 | |
162 | BOPCol_ListOfShape& aLS=BOPTest_Objects::Shapes(); | |
163 | aNbS=aLS.Extent(); | |
164 | if (!aNbS) { | |
165 | di << " no objects to process\n"; | |
166 | return 0; | |
167 | } | |
168 | // | |
a942f2da | 169 | bShowTime=Standard_False; |
170 | bRunParallel=Standard_True; | |
171 | for (i=1; i<n; ++i) { | |
172 | if (!strcmp(a[i], "-s")) { | |
173 | bRunParallel=Standard_False; | |
174 | } | |
175 | else if (!strcmp(a[i], "-t")) { | |
176 | bShowTime=Standard_True; | |
177 | } | |
178 | } | |
179 | // | |
4e57c75e | 180 | BOPCol_ListOfShape& aLT=BOPTest_Objects::Tools(); |
4e57c75e | 181 | // |
182 | aIt.Initialize(aLS); | |
183 | for (; aIt.More(); aIt.Next()) { | |
184 | const TopoDS_Shape& aS=aIt.Value(); | |
185 | aLC.Append(aS); | |
186 | } | |
187 | // | |
188 | aIt.Initialize(aLT); | |
189 | for (; aIt.More(); aIt.Next()) { | |
190 | const TopoDS_Shape& aS=aIt.Value(); | |
191 | aLC.Append(aS); | |
192 | } | |
193 | // | |
194 | BOPAlgo_PaveFiller& aPF=BOPTest_Objects::PaveFiller(); | |
195 | // | |
196 | aPF.SetArguments(aLC); | |
a942f2da | 197 | aPF.SetRunParallel(bRunParallel); |
198 | // | |
199 | aChrono.Start(); | |
4e57c75e | 200 | // |
201 | aPF.Perform(); | |
202 | iErr=aPF.ErrorStatus(); | |
203 | if (iErr) { | |
204 | Sprintf(buf, " error: %d\n", iErr); | |
205 | di << buf; | |
206 | return 0; | |
207 | } | |
208 | // | |
a942f2da | 209 | aChrono.Stop(); |
210 | // | |
211 | if (bShowTime) { | |
212 | Standard_Real aTime; | |
213 | // | |
214 | aTime=aChrono.Time(); | |
215 | Sprintf(buf, " Tps: %7.2lf\n", aTime); | |
216 | di << buf; | |
217 | } | |
218 | // | |
4e57c75e | 219 | return 0; |
220 | } | |
4e57c75e | 221 | //======================================================================= |
222 | //function : bbuild | |
223 | //purpose : | |
224 | //======================================================================= | |
a942f2da | 225 | Standard_Integer bbuild(Draw_Interpretor& di, |
226 | Standard_Integer n, | |
227 | const char** a) | |
4e57c75e | 228 | { |
796a784d | 229 | if (n<2) { |
230 | di << " use bbuild r [-s -t]\n"; | |
4e57c75e | 231 | return 0; |
232 | } | |
233 | // | |
234 | BOPDS_PDS pDS=BOPTest_Objects::PDS(); | |
235 | if (!pDS) { | |
236 | di << " prepare PaveFiller first\n"; | |
237 | return 0; | |
238 | } | |
239 | // | |
796a784d | 240 | char buf[128]; |
241 | Standard_Boolean bRunParallel, bShowTime; | |
242 | Standard_Integer i, iErr; | |
243 | ||
244 | BOPTime_Chronometer aChrono; | |
4e57c75e | 245 | BOPCol_ListIteratorOfListOfShape aIt; |
246 | // | |
247 | BOPAlgo_PaveFiller& aPF=BOPTest_Objects::PaveFiller(); | |
248 | // | |
249 | BOPAlgo_Builder& aBuilder=BOPTest_Objects::Builder(); | |
250 | aBuilder.Clear(); | |
251 | // | |
252 | BOPCol_ListOfShape& aLSObj=BOPTest_Objects::Shapes(); | |
253 | aIt.Initialize(aLSObj); | |
254 | for (; aIt.More(); aIt.Next()) { | |
255 | const TopoDS_Shape& aS=aIt.Value(); | |
256 | aBuilder.AddArgument(aS); | |
257 | } | |
258 | // | |
259 | BOPCol_ListOfShape& aLSTool=BOPTest_Objects::Tools(); | |
260 | aIt.Initialize(aLSTool); | |
261 | for (; aIt.More(); aIt.Next()) { | |
262 | const TopoDS_Shape& aS=aIt.Value(); | |
263 | aBuilder.AddArgument(aS); | |
264 | } | |
265 | // | |
796a784d | 266 | bShowTime=Standard_False; |
267 | bRunParallel=Standard_True; | |
268 | for (i=2; i<n; ++i) { | |
269 | if (!strcmp(a[i], "-s")) { | |
270 | bRunParallel=Standard_False; | |
271 | } | |
272 | else if (!strcmp(a[i], "-t")) { | |
273 | bShowTime=Standard_True; | |
274 | } | |
275 | } | |
276 | aBuilder.SetRunParallel(bRunParallel); | |
277 | // | |
278 | // | |
279 | aChrono.Start(); | |
280 | // | |
281 | aBuilder.PerformWithFiller(aPF); | |
4e57c75e | 282 | iErr=aBuilder.ErrorStatus(); |
283 | if (iErr) { | |
284 | Sprintf(buf, " error: %d\n", iErr); | |
285 | di << buf; | |
286 | return 0; | |
287 | } | |
288 | // | |
796a784d | 289 | aChrono.Stop(); |
290 | // | |
291 | if (bShowTime) { | |
292 | Standard_Real aTime; | |
293 | // | |
294 | aTime=aChrono.Time(); | |
295 | Sprintf(buf, " Tps: %7.2lf\n", aTime); | |
296 | di << buf; | |
297 | } | |
298 | // | |
4e57c75e | 299 | const TopoDS_Shape& aR=aBuilder.Shape(); |
300 | if (aR.IsNull()) { | |
301 | di << " null shape\n"; | |
302 | return 0; | |
303 | } | |
304 | // | |
305 | DBRep::Set(a[1], aR); | |
306 | return 0; | |
307 | } | |
308 | ||
309 | //======================================================================= | |
310 | //function : bbop | |
311 | //purpose : | |
312 | //======================================================================= | |
a942f2da | 313 | Standard_Integer bbop(Draw_Interpretor& di, |
314 | Standard_Integer n, | |
315 | const char** a) | |
4e57c75e | 316 | { |
317 | if (n!=3) { | |
318 | di << " use bbop r op\n"; | |
319 | return 0; | |
320 | } | |
321 | // | |
322 | BOPDS_PDS pDS=BOPTest_Objects::PDS(); | |
323 | if (!pDS) { | |
324 | di << " prepare PaveFiller first\n"; | |
325 | return 0; | |
326 | } | |
327 | // | |
328 | char buf[32]; | |
329 | Standard_Integer iErr, iOp; | |
330 | BOPAlgo_Operation aOp; | |
331 | BOPCol_ListIteratorOfListOfShape aIt; | |
332 | // | |
333 | iOp=Draw::Atoi(a[2]); | |
334 | if (iOp<0 || iOp>4) { | |
335 | di << " invalid operation type\n"; | |
336 | } | |
337 | aOp=(BOPAlgo_Operation)iOp; | |
338 | // | |
339 | BOPAlgo_PaveFiller& aPF=BOPTest_Objects::PaveFiller(); | |
340 | // | |
341 | BOPAlgo_BOP& aBOP=BOPTest_Objects::BOP(); | |
342 | aBOP.Clear(); | |
343 | // | |
344 | BOPCol_ListOfShape& aLSObj=BOPTest_Objects::Shapes(); | |
345 | aIt.Initialize(aLSObj); | |
346 | for (; aIt.More(); aIt.Next()) { | |
347 | const TopoDS_Shape& aS=aIt.Value(); | |
348 | aBOP.AddArgument(aS); | |
349 | } | |
350 | // | |
351 | BOPCol_ListOfShape& aLSTools=BOPTest_Objects::Tools(); | |
352 | aIt.Initialize(aLSTools); | |
353 | for (; aIt.More(); aIt.Next()) { | |
354 | const TopoDS_Shape& aS=aIt.Value(); | |
355 | aBOP.AddTool(aS); | |
356 | } | |
357 | // | |
358 | aBOP.SetOperation(aOp); | |
359 | // | |
360 | aBOP.PerformWithFiller(aPF); | |
361 | iErr=aBOP.ErrorStatus(); | |
362 | if (iErr) { | |
363 | Sprintf(buf, " error: %d\n", iErr); | |
364 | di << buf; | |
365 | return 0; | |
366 | } | |
367 | // | |
368 | const TopoDS_Shape& aR=aBOP.Shape(); | |
369 | if (aR.IsNull()) { | |
370 | di << " null shape\n"; | |
371 | return 0; | |
372 | } | |
373 | // | |
374 | DBRep::Set(a[1], aR); | |
375 | return 0; | |
376 | } | |
377 |