0024624: Lost word in license statement in source files
[occt.git] / src / BOPTest / BOPTest_PartitionCommands.cxx
1 // Created by: Peter KURNEV
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
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.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #include <BOPTest.ixx>
16
17 #include <stdio.h>
18 #include <string.h>
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 //
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
103
104
105 static Standard_Integer bfillds  (Draw_Interpretor&, Standard_Integer, const char**); 
106 static Standard_Integer bbuild   (Draw_Interpretor&, Standard_Integer, const char**);
107 static Standard_Integer bbop     (Draw_Interpretor&, Standard_Integer, const char**);
108 static Standard_Integer bclear   (Draw_Interpretor&, Standard_Integer, const char**);
109 //=======================================================================
110 //function : PartitionCommands
111 //purpose  : 
112 //=======================================================================
113   void BOPTest::PartitionCommands(Draw_Interpretor& theCommands)
114 {
115   static Standard_Boolean done = Standard_False;
116   if (done) return;
117   done = Standard_True;
118   // Chapter's name
119   const char* g = "Partition commands";
120   // Commands  
121   theCommands.Add("bfillds"  , "use bfillds"           , __FILE__, bfillds  , g);
122   theCommands.Add("bbuild"   , " use bbuild r [-s -t]" , __FILE__, bbuild, g);
123   theCommands.Add("bbop"     , "use bbop r op"         , __FILE__, bbop, g);
124   theCommands.Add("bclear"   , "use bclear"            , __FILE__, bclear, g);
125 }
126
127 //=======================================================================
128 //function : bclear
129 //purpose  : 
130 //=======================================================================
131 Standard_Integer bclear(Draw_Interpretor& di, Standard_Integer n, const char** ) 
132 {
133   if (n!=1) {
134     di << " use bclear\n";
135     return 0;
136   }
137   //
138   BOPTest_Objects::Clear(); 
139   return 0;
140 }
141 //=======================================================================
142 //function : bfillds
143 //purpose  : 
144 //=======================================================================
145 Standard_Integer bfillds(Draw_Interpretor& di, Standard_Integer n, const char** ) 
146
147   if (n!=1) {
148     di << " Use bfillds\n";
149     return 0;
150   }
151   //
152   char buf[32];
153   Standard_Integer aNbS, iErr;
154   BOPCol_ListIteratorOfListOfShape aIt;
155   BOPCol_ListOfShape aLC;
156   
157   BOPCol_ListOfShape& aLS=BOPTest_Objects::Shapes();
158   aNbS=aLS.Extent();
159   if (!aNbS) {
160     di << " no objects to process\n";
161     return 0;
162   }
163   //
164   BOPCol_ListOfShape& aLT=BOPTest_Objects::Tools();
165   //
166   aIt.Initialize(aLS);
167   for (; aIt.More(); aIt.Next()) {
168     const TopoDS_Shape& aS=aIt.Value();
169     aLC.Append(aS);
170   }
171   //
172   aIt.Initialize(aLT);
173   for (; aIt.More(); aIt.Next()) {
174     const TopoDS_Shape& aS=aIt.Value();
175      aLC.Append(aS);
176   }
177   //
178   BOPAlgo_PaveFiller& aPF=BOPTest_Objects::PaveFiller();
179   //
180   aPF.SetArguments(aLC);
181   //
182   aPF.Perform();
183   iErr=aPF.ErrorStatus();
184   if (iErr) {
185     Sprintf(buf, " error: %d\n",  iErr);
186     di << buf;
187     return 0;
188   }
189   //
190   return 0;
191 }
192 //=======================================================================
193 //function : bbuild
194 //purpose  : 
195 //=======================================================================
196 Standard_Integer bbuild(Draw_Interpretor& di, Standard_Integer n, const char** a) 
197
198   if (n<2) {
199     di << " use bbuild r [-s -t]\n";
200     return 0;
201   }
202   //
203   BOPDS_PDS pDS=BOPTest_Objects::PDS();
204   if (!pDS) {
205     di << " prepare PaveFiller first\n";
206     return 0;
207   }
208   //
209   char buf[128];
210   Standard_Boolean bRunParallel, bShowTime;
211   Standard_Integer i, iErr;
212   
213   BOPTime_Chronometer aChrono;
214   BOPCol_ListIteratorOfListOfShape aIt;
215   //
216   
217   //
218   BOPAlgo_PaveFiller& aPF=BOPTest_Objects::PaveFiller();
219   //
220   BOPAlgo_Builder& aBuilder=BOPTest_Objects::Builder();
221   aBuilder.Clear();
222   //
223   BOPCol_ListOfShape& aLSObj=BOPTest_Objects::Shapes();
224   aIt.Initialize(aLSObj);
225   for (; aIt.More(); aIt.Next()) {
226     const TopoDS_Shape& aS=aIt.Value();
227     aBuilder.AddArgument(aS);
228   }
229   //
230   BOPCol_ListOfShape& aLSTool=BOPTest_Objects::Tools();
231   aIt.Initialize(aLSTool);
232   for (; aIt.More(); aIt.Next()) {
233     const TopoDS_Shape& aS=aIt.Value();
234     aBuilder.AddArgument(aS);
235   }
236   //
237   bShowTime=Standard_False;
238   bRunParallel=Standard_True;
239   for (i=2; i<n; ++i) {
240     if (!strcmp(a[i], "-s")) {
241       bRunParallel=Standard_False;
242     }
243     else if (!strcmp(a[i], "-t")) {
244       bShowTime=Standard_True;
245     }
246   }
247   aBuilder.SetRunParallel(bRunParallel);
248   //
249   //
250   aChrono.Start();
251   //
252   aBuilder.PerformWithFiller(aPF); 
253   iErr=aBuilder.ErrorStatus();
254   if (iErr) {
255     Sprintf(buf, " error: %d\n",  iErr);
256     di << buf;
257     return 0;
258   }
259   //
260   aChrono.Stop();
261   //
262   if (bShowTime) {
263     Standard_Real aTime;
264     //
265     aTime=aChrono.Time();
266     Sprintf(buf, "  Tps: %7.2lf\n", aTime);
267     di << buf;
268   }
269   //
270   const TopoDS_Shape& aR=aBuilder.Shape();
271   if (aR.IsNull()) {
272     di << " null shape\n";
273     return 0;
274   }
275   //
276   DBRep::Set(a[1], aR);
277   return 0;
278 }
279
280 //=======================================================================
281 //function : bbop
282 //purpose  : 
283 //=======================================================================
284 Standard_Integer bbop(Draw_Interpretor& di, Standard_Integer n, const char** a) 
285
286   if (n!=3) {
287     di << " use bbop r op\n";
288     return 0;
289   }
290   //
291   BOPDS_PDS pDS=BOPTest_Objects::PDS();
292   if (!pDS) {
293     di << " prepare PaveFiller first\n";
294     return 0;
295   }
296   //
297   char buf[32];
298   Standard_Integer iErr, iOp;
299   BOPAlgo_Operation aOp;
300   BOPCol_ListIteratorOfListOfShape aIt;
301   //
302   iOp=Draw::Atoi(a[2]);
303   if (iOp<0 || iOp>4) {
304     di << " invalid operation type\n";
305   }
306   aOp=(BOPAlgo_Operation)iOp;
307   //
308   BOPAlgo_PaveFiller& aPF=BOPTest_Objects::PaveFiller();
309   //
310   BOPAlgo_BOP& aBOP=BOPTest_Objects::BOP();
311   aBOP.Clear();
312   //
313   BOPCol_ListOfShape& aLSObj=BOPTest_Objects::Shapes();
314   aIt.Initialize(aLSObj);
315   for (; aIt.More(); aIt.Next()) {
316     const TopoDS_Shape& aS=aIt.Value();
317     aBOP.AddArgument(aS);
318   }
319   //
320   BOPCol_ListOfShape& aLSTools=BOPTest_Objects::Tools();
321   aIt.Initialize(aLSTools);
322   for (; aIt.More(); aIt.Next()) {
323     const TopoDS_Shape& aS=aIt.Value();
324     aBOP.AddTool(aS);
325   }
326   //
327   aBOP.SetOperation(aOp);
328   //
329   aBOP.PerformWithFiller(aPF);
330   iErr=aBOP.ErrorStatus();
331   if (iErr) {
332     Sprintf(buf, " error: %d\n",  iErr);
333     di << buf;
334     return 0;
335   }
336   //
337   const TopoDS_Shape& aR=aBOP.Shape();
338   if (aR.IsNull()) {
339     di << " null shape\n";
340     return 0;
341   }
342   //
343   DBRep::Set(a[1], aR);
344   return 0;
345 }
346