0024821: CLang warning -Wunsequenced in StdSelect_ViewerSelector3d
[occt.git] / src / BOPTest / BOPTest_PartitionCommands.cxx
CommitLineData
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//=======================================================================
44class 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//=======================================================================
75class 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 103static Standard_Integer bfillds (Draw_Interpretor&, Standard_Integer, const char**);
104static Standard_Integer bbuild (Draw_Interpretor&, Standard_Integer, const char**);
105static Standard_Integer bbop (Draw_Interpretor&, Standard_Integer, const char**);
106static Standard_Integer bclear (Draw_Interpretor&, Standard_Integer, const char**);
a942f2da 107
4e57c75e 108//=======================================================================
109//function : PartitionCommands
110//purpose :
111//=======================================================================
a942f2da 112void 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 130Standard_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 146Standard_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 225Standard_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 313Standard_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