0024628: Intersection result is unfixed
[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//
d5f74e42 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
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
103
104
4e57c75e 105static Standard_Integer bfillds (Draw_Interpretor&, Standard_Integer, const char**);
106static Standard_Integer bbuild (Draw_Interpretor&, Standard_Integer, const char**);
107static Standard_Integer bbop (Draw_Interpretor&, Standard_Integer, const char**);
108static 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);
796a784d 122 theCommands.Add("bbuild" , " use bbuild r [-s -t]" , __FILE__, bbuild, g);
4e57c75e 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//=======================================================================
131Standard_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//=======================================================================
145Standard_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];
96a95605 153 Standard_Integer aNbS, iErr;
4e57c75e 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();
4e57c75e 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}
4e57c75e 192//=======================================================================
193//function : bbuild
194//purpose :
195//=======================================================================
196Standard_Integer bbuild(Draw_Interpretor& di, Standard_Integer n, const char** a)
197{
796a784d 198 if (n<2) {
199 di << " use bbuild r [-s -t]\n";
4e57c75e 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 //
796a784d 209 char buf[128];
210 Standard_Boolean bRunParallel, bShowTime;
211 Standard_Integer i, iErr;
212
213 BOPTime_Chronometer aChrono;
4e57c75e 214 BOPCol_ListIteratorOfListOfShape aIt;
215 //
796a784d 216
217 //
4e57c75e 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 //
796a784d 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);
4e57c75e 253 iErr=aBuilder.ErrorStatus();
254 if (iErr) {
255 Sprintf(buf, " error: %d\n", iErr);
256 di << buf;
257 return 0;
258 }
259 //
796a784d 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 //
4e57c75e 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//=======================================================================
284Standard_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