0028501: Incomplete result of offset operation in mode Complete with Join type inters...
[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//
0a36ca0a 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
4e57c75e 15
42cf5bc1 16#include <BOPAlgo_BOP.hxx>
4e57c75e 17#include <BOPAlgo_Builder.hxx>
4e57c75e 18#include <BOPAlgo_Operation.hxx>
42cf5bc1 19#include <BOPAlgo_PaveFiller.hxx>
85915310 20#include <BOPAlgo_Section.hxx>
42cf5bc1 21#include <BOPTest.hxx>
4e57c75e 22#include <BOPTest_DrawableShape.hxx>
23#include <BOPTest_Objects.hxx>
42cf5bc1 24#include <DBRep.hxx>
25#include <Draw.hxx>
26#include <Draw_Color.hxx>
27#include <DrawTrSurf.hxx>
c7b59798 28#include <OSD_Timer.hxx>
42cf5bc1 29#include <TopoDS_Shape.hxx>
796a784d 30
42cf5bc1 31#include <stdio.h>
32#include <string.h>
33//
34//
4e57c75e 35static Standard_Integer bfillds (Draw_Interpretor&, Standard_Integer, const char**);
36static Standard_Integer bbuild (Draw_Interpretor&, Standard_Integer, const char**);
37static Standard_Integer bbop (Draw_Interpretor&, Standard_Integer, const char**);
a942f2da 38
4e57c75e 39//=======================================================================
40//function : PartitionCommands
41//purpose :
42//=======================================================================
a942f2da 43void BOPTest::PartitionCommands(Draw_Interpretor& theCommands)
4e57c75e 44{
45 static Standard_Boolean done = Standard_False;
46 if (done) return;
47 done = Standard_True;
48 // Chapter's name
43cb0011 49 const char* g = "BOPTest commands";
4e57c75e 50 // Commands
43cb0011 51 theCommands.Add("bfillds", "use bfillds [-t]" , __FILE__, bfillds, g);
52 theCommands.Add("bbuild" , "use bbuild r [-t]" , __FILE__, bbuild, g);
53 theCommands.Add("bbop" , "use bbop r op [-t]", __FILE__, bbop, g);
4e57c75e 54}
55//=======================================================================
56//function : bfillds
57//purpose :
58//=======================================================================
a942f2da 59Standard_Integer bfillds(Draw_Interpretor& di,
60 Standard_Integer n,
61 const char** a)
4e57c75e 62{
43cb0011 63 if (n > 2) {
64 di << " use bfillds [-t]\n";
4e57c75e 65 return 0;
66 }
67 //
68 char buf[32];
3510db62 69 Standard_Boolean bRunParallel, bNonDestructive, bShowTime;
a942f2da 70 Standard_Integer i, aNbS, iErr;
b1d15f53 71 Standard_Real aTol;
4e57c75e 72 BOPCol_ListIteratorOfListOfShape aIt;
73 BOPCol_ListOfShape aLC;
4e57c75e 74 BOPCol_ListOfShape& aLS=BOPTest_Objects::Shapes();
75 aNbS=aLS.Extent();
76 if (!aNbS) {
77 di << " no objects to process\n";
78 return 0;
79 }
80 //
b1d15f53 81 bShowTime = Standard_False;
49b0c452 82 //
83 bRunParallel=BOPTest_Objects::RunParallel();
3510db62 84 bNonDestructive = BOPTest_Objects::NonDestructive();
85 aTol = BOPTest_Objects::FuzzyValue();
483ce1bd 86 BOPAlgo_GlueEnum aGlue = BOPTest_Objects::Glue();
49b0c452 87 //
a942f2da 88 for (i=1; i<n; ++i) {
43cb0011 89 if (!strcmp(a[i], "-t")) {
a942f2da 90 bShowTime=Standard_True;
91 }
483ce1bd 92 }
a942f2da 93 //
4e57c75e 94 BOPCol_ListOfShape& aLT=BOPTest_Objects::Tools();
4e57c75e 95 //
96 aIt.Initialize(aLS);
97 for (; aIt.More(); aIt.Next()) {
98 const TopoDS_Shape& aS=aIt.Value();
99 aLC.Append(aS);
100 }
101 //
102 aIt.Initialize(aLT);
103 for (; aIt.More(); aIt.Next()) {
104 const TopoDS_Shape& aS=aIt.Value();
c7b59798 105 aLC.Append(aS);
4e57c75e 106 }
107 //
108 BOPAlgo_PaveFiller& aPF=BOPTest_Objects::PaveFiller();
109 //
110 aPF.SetArguments(aLC);
a942f2da 111 aPF.SetRunParallel(bRunParallel);
3510db62 112 aPF.SetNonDestructive(bNonDestructive);
b1d15f53 113 aPF.SetFuzzyValue(aTol);
483ce1bd 114 aPF.SetGlue(aGlue);
a942f2da 115 //
c7b59798 116 OSD_Timer aTimer;
117 aTimer.Start();
4e57c75e 118 //
119 aPF.Perform();
120 iErr=aPF.ErrorStatus();
121 if (iErr) {
122 Sprintf(buf, " error: %d\n", iErr);
123 di << buf;
124 return 0;
125 }
126 //
c7b59798 127 aTimer.Stop();
a942f2da 128 //
c7b59798 129 if (bShowTime)
130 {
131 Sprintf(buf, " Tps: %7.2lf\n", aTimer.ElapsedTime());
a942f2da 132 di << buf;
133 }
134 //
4e57c75e 135 return 0;
136}
4e57c75e 137//=======================================================================
138//function : bbuild
139//purpose :
140//=======================================================================
a942f2da 141Standard_Integer bbuild(Draw_Interpretor& di,
142 Standard_Integer n,
143 const char** a)
4e57c75e 144{
796a784d 145 if (n<2) {
43cb0011 146 di << " use bbuild r [-t]\n";
4e57c75e 147 return 0;
148 }
149 //
150 BOPDS_PDS pDS=BOPTest_Objects::PDS();
151 if (!pDS) {
152 di << " prepare PaveFiller first\n";
153 return 0;
154 }
155 //
796a784d 156 char buf[128];
157 Standard_Boolean bRunParallel, bShowTime;
158 Standard_Integer i, iErr;
c7b59798 159
4e57c75e 160 BOPCol_ListIteratorOfListOfShape aIt;
161 //
162 BOPAlgo_PaveFiller& aPF=BOPTest_Objects::PaveFiller();
163 //
a493b4a1 164 BOPTest_Objects::SetBuilderDefault();
4e57c75e 165 BOPAlgo_Builder& aBuilder=BOPTest_Objects::Builder();
166 aBuilder.Clear();
167 //
168 BOPCol_ListOfShape& aLSObj=BOPTest_Objects::Shapes();
169 aIt.Initialize(aLSObj);
170 for (; aIt.More(); aIt.Next()) {
171 const TopoDS_Shape& aS=aIt.Value();
172 aBuilder.AddArgument(aS);
173 }
174 //
175 BOPCol_ListOfShape& aLSTool=BOPTest_Objects::Tools();
176 aIt.Initialize(aLSTool);
177 for (; aIt.More(); aIt.Next()) {
178 const TopoDS_Shape& aS=aIt.Value();
179 aBuilder.AddArgument(aS);
180 }
181 //
796a784d 182 bShowTime=Standard_False;
49b0c452 183 bRunParallel=BOPTest_Objects::RunParallel();
796a784d 184 for (i=2; i<n; ++i) {
43cb0011 185 if (!strcmp(a[i], "-t")) {
796a784d 186 bShowTime=Standard_True;
187 }
188 }
189 aBuilder.SetRunParallel(bRunParallel);
190 //
191 //
c7b59798 192 OSD_Timer aTimer;
193 aTimer.Start();
796a784d 194 //
195 aBuilder.PerformWithFiller(aPF);
4e57c75e 196 iErr=aBuilder.ErrorStatus();
197 if (iErr) {
198 Sprintf(buf, " error: %d\n", iErr);
199 di << buf;
200 return 0;
201 }
202 //
c7b59798 203 aTimer.Stop();
796a784d 204 //
c7b59798 205 if (bShowTime)
206 {
207 Sprintf(buf, " Tps: %7.2lf\n", aTimer.ElapsedTime());
796a784d 208 di << buf;
209 }
210 //
4e57c75e 211 const TopoDS_Shape& aR=aBuilder.Shape();
212 if (aR.IsNull()) {
213 di << " null shape\n";
214 return 0;
215 }
216 //
217 DBRep::Set(a[1], aR);
218 return 0;
219}
4e57c75e 220//=======================================================================
221//function : bbop
222//purpose :
223//=======================================================================
a942f2da 224Standard_Integer bbop(Draw_Interpretor& di,
225 Standard_Integer n,
226 const char** a)
4e57c75e 227{
8620e18d 228 if (n<3) {
43cb0011 229 di << " use bbop r op [-t]\n";
4e57c75e 230 return 0;
231 }
232 //
233 BOPDS_PDS pDS=BOPTest_Objects::PDS();
234 if (!pDS) {
235 di << " prepare PaveFiller first\n";
236 return 0;
237 }
238 //
239 char buf[32];
8620e18d 240 Standard_Boolean bRunParallel, bShowTime;
241 Standard_Integer iErr, iOp, i;
4e57c75e 242 BOPAlgo_Operation aOp;
8620e18d 243 BOPCol_ListIteratorOfListOfShape aIt;
4e57c75e 244 //
245 iOp=Draw::Atoi(a[2]);
246 if (iOp<0 || iOp>4) {
247 di << " invalid operation type\n";
8620e18d 248 return 0;
4e57c75e 249 }
250 aOp=(BOPAlgo_Operation)iOp;
251 //
8620e18d 252 bShowTime=Standard_False;
49b0c452 253 bRunParallel=BOPTest_Objects::RunParallel();
8620e18d 254 for (i=3; i<n; ++i) {
43cb0011 255 if (!strcmp(a[i], "-t")) {
8620e18d 256 bShowTime=Standard_True;
257 }
258 }
259 //
4e57c75e 260 BOPAlgo_PaveFiller& aPF=BOPTest_Objects::PaveFiller();
261 //
85915310 262 BOPAlgo_Builder *pBuilder=NULL;
263
264 if (aOp!=BOPAlgo_SECTION) {
265 pBuilder=&BOPTest_Objects::BOP();
266 }
267 else {
268 pBuilder=&BOPTest_Objects::Section();
269 }
270 //
271 pBuilder->Clear();
4e57c75e 272 //
273 BOPCol_ListOfShape& aLSObj=BOPTest_Objects::Shapes();
274 aIt.Initialize(aLSObj);
275 for (; aIt.More(); aIt.Next()) {
276 const TopoDS_Shape& aS=aIt.Value();
85915310 277 pBuilder->AddArgument(aS);
4e57c75e 278 }
279 //
85915310 280 if (aOp!=BOPAlgo_SECTION) {
281 BOPAlgo_BOP *pBOP=(BOPAlgo_BOP *)pBuilder;
282 //
283 BOPCol_ListOfShape& aLSTools=BOPTest_Objects::Tools();
284 aIt.Initialize(aLSTools);
285 for (; aIt.More(); aIt.Next()) {
286 const TopoDS_Shape& aS=aIt.Value();
287 pBOP->AddTool(aS);
288 }
289 //
290 pBOP->SetOperation(aOp);
4e57c75e 291 }
b1d15f53 292 else {
293 BOPCol_ListOfShape& aLSTools=BOPTest_Objects::Tools();
294 aIt.Initialize(aLSTools);
295 for (; aIt.More(); aIt.Next()) {
296 const TopoDS_Shape& aS=aIt.Value();
297 pBuilder->AddArgument(aS);
298 }
299 }
4e57c75e 300 //
85915310 301 pBuilder->SetRunParallel(bRunParallel);
8620e18d 302 //
c7b59798 303 OSD_Timer aTimer;
304 aTimer.Start();
4e57c75e 305 //
85915310 306 pBuilder->PerformWithFiller(aPF);
307 iErr=pBuilder->ErrorStatus();
4e57c75e 308 if (iErr) {
309 Sprintf(buf, " error: %d\n", iErr);
310 di << buf;
311 return 0;
312 }
313 //
c7b59798 314 aTimer.Stop();
8620e18d 315 //
316 if (bShowTime) {
c7b59798 317 Sprintf(buf, " Tps: %7.2lf\n", aTimer.ElapsedTime());
8620e18d 318 di << buf;
319 }
320 //
85915310 321 const TopoDS_Shape& aR=pBuilder->Shape();
4e57c75e 322 if (aR.IsNull()) {
323 di << " null shape\n";
324 return 0;
325 }
326 //
a493b4a1 327 BOPTest_Objects::SetBuilder(pBuilder);
328 //
4e57c75e 329 DBRep::Set(a[1], aR);
330 return 0;
331}
332