0024428: Implementation of LGPL license
[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
7 // under the terms of the GNU Lesser General Public 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, aNbT, 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   aNbT=aLT.Extent();
166   //
167   aIt.Initialize(aLS);
168   for (; aIt.More(); aIt.Next()) {
169     const TopoDS_Shape& aS=aIt.Value();
170     aLC.Append(aS);
171   }
172   //
173   aIt.Initialize(aLT);
174   for (; aIt.More(); aIt.Next()) {
175     const TopoDS_Shape& aS=aIt.Value();
176      aLC.Append(aS);
177   }
178   //
179   BOPAlgo_PaveFiller& aPF=BOPTest_Objects::PaveFiller();
180   //
181   aPF.SetArguments(aLC);
182   //
183   aPF.Perform();
184   iErr=aPF.ErrorStatus();
185   if (iErr) {
186     Sprintf(buf, " error: %d\n",  iErr);
187     di << buf;
188     return 0;
189   }
190   //
191   return 0;
192 }
193 //=======================================================================
194 //function : bbuild
195 //purpose  : 
196 //=======================================================================
197 Standard_Integer bbuild(Draw_Interpretor& di, Standard_Integer n, const char** a) 
198
199   if (n<2) {
200     di << " use bbuild r [-s -t]\n";
201     return 0;
202   }
203   //
204   BOPDS_PDS pDS=BOPTest_Objects::PDS();
205   if (!pDS) {
206     di << " prepare PaveFiller first\n";
207     return 0;
208   }
209   //
210   char buf[128];
211   Standard_Boolean bRunParallel, bShowTime;
212   Standard_Integer i, iErr;
213   
214   BOPTime_Chronometer aChrono;
215   BOPCol_ListIteratorOfListOfShape aIt;
216   //
217   
218   //
219   BOPAlgo_PaveFiller& aPF=BOPTest_Objects::PaveFiller();
220   //
221   BOPAlgo_Builder& aBuilder=BOPTest_Objects::Builder();
222   aBuilder.Clear();
223   //
224   BOPCol_ListOfShape& aLSObj=BOPTest_Objects::Shapes();
225   aIt.Initialize(aLSObj);
226   for (; aIt.More(); aIt.Next()) {
227     const TopoDS_Shape& aS=aIt.Value();
228     aBuilder.AddArgument(aS);
229   }
230   //
231   BOPCol_ListOfShape& aLSTool=BOPTest_Objects::Tools();
232   aIt.Initialize(aLSTool);
233   for (; aIt.More(); aIt.Next()) {
234     const TopoDS_Shape& aS=aIt.Value();
235     aBuilder.AddArgument(aS);
236   }
237   //
238   bShowTime=Standard_False;
239   bRunParallel=Standard_True;
240   for (i=2; i<n; ++i) {
241     if (!strcmp(a[i], "-s")) {
242       bRunParallel=Standard_False;
243     }
244     else if (!strcmp(a[i], "-t")) {
245       bShowTime=Standard_True;
246     }
247   }
248   aBuilder.SetRunParallel(bRunParallel);
249   //
250   //
251   aChrono.Start();
252   //
253   aBuilder.PerformWithFiller(aPF); 
254   iErr=aBuilder.ErrorStatus();
255   if (iErr) {
256     Sprintf(buf, " error: %d\n",  iErr);
257     di << buf;
258     return 0;
259   }
260   //
261   aChrono.Stop();
262   //
263   if (bShowTime) {
264     Standard_Real aTime;
265     //
266     aTime=aChrono.Time();
267     Sprintf(buf, "  Tps: %7.2lf\n", aTime);
268     di << buf;
269   }
270   //
271   const TopoDS_Shape& aR=aBuilder.Shape();
272   if (aR.IsNull()) {
273     di << " null shape\n";
274     return 0;
275   }
276   //
277   DBRep::Set(a[1], aR);
278   return 0;
279 }
280
281 //=======================================================================
282 //function : bbop
283 //purpose  : 
284 //=======================================================================
285 Standard_Integer bbop(Draw_Interpretor& di, Standard_Integer n, const char** a) 
286
287   if (n!=3) {
288     di << " use bbop r op\n";
289     return 0;
290   }
291   //
292   BOPDS_PDS pDS=BOPTest_Objects::PDS();
293   if (!pDS) {
294     di << " prepare PaveFiller first\n";
295     return 0;
296   }
297   //
298   char buf[32];
299   Standard_Integer iErr, iOp;
300   BOPAlgo_Operation aOp;
301   BOPCol_ListIteratorOfListOfShape aIt;
302   //
303   iOp=Draw::Atoi(a[2]);
304   if (iOp<0 || iOp>4) {
305     di << " invalid operation type\n";
306   }
307   aOp=(BOPAlgo_Operation)iOp;
308   //
309   BOPAlgo_PaveFiller& aPF=BOPTest_Objects::PaveFiller();
310   //
311   BOPAlgo_BOP& aBOP=BOPTest_Objects::BOP();
312   aBOP.Clear();
313   //
314   BOPCol_ListOfShape& aLSObj=BOPTest_Objects::Shapes();
315   aIt.Initialize(aLSObj);
316   for (; aIt.More(); aIt.Next()) {
317     const TopoDS_Shape& aS=aIt.Value();
318     aBOP.AddArgument(aS);
319   }
320   //
321   BOPCol_ListOfShape& aLSTools=BOPTest_Objects::Tools();
322   aIt.Initialize(aLSTools);
323   for (; aIt.More(); aIt.Next()) {
324     const TopoDS_Shape& aS=aIt.Value();
325     aBOP.AddTool(aS);
326   }
327   //
328   aBOP.SetOperation(aOp);
329   //
330   aBOP.PerformWithFiller(aPF);
331   iErr=aBOP.ErrorStatus();
332   if (iErr) {
333     Sprintf(buf, " error: %d\n",  iErr);
334     di << buf;
335     return 0;
336   }
337   //
338   const TopoDS_Shape& aR=aBOP.Shape();
339   if (aR.IsNull()) {
340     di << " null shape\n";
341     return 0;
342   }
343   //
344   DBRep::Set(a[1], aR);
345   return 0;
346 }
347