0026619: Tolerances of operands are modified using bop
[occt.git] / src / BOPTest / BOPTest_APICommands.cxx
1 // Created by: Peter KURNEV
2 // Copyright (c) 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
16 #include <BOPAlgo_PaveFiller.hxx>
17 #include <BOPCol_ListOfShape.hxx>
18 #include <BOPTest.hxx>
19 #include <BOPTest_Objects.hxx>
20 #include <BRepAlgoAPI_BooleanOperation.hxx>
21 #include <BRepAlgoAPI_BuilderAlgo.hxx>
22 #include <BRepAlgoAPI_Common.hxx>
23 #include <BRepAlgoAPI_Cut.hxx>
24 #include <BRepAlgoAPI_Fuse.hxx>
25 #include <BRepAlgoAPI_Section.hxx>
26 #include <DBRep.hxx>
27 #include <Draw.hxx>
28 #include <TopoDS_Shape.hxx>
29 #include <TopTools_ListOfShape.hxx>
30
31 #include <stdio.h>
32 #include <string.h>
33 static 
34   void ConvertList(const BOPCol_ListOfShape& aLSB,
35                    TopTools_ListOfShape& aLS);
36
37 static Standard_Integer bapibuild(Draw_Interpretor&, Standard_Integer, const char**); 
38 static Standard_Integer bapibop  (Draw_Interpretor&, Standard_Integer, const char**); 
39
40 //=======================================================================
41 //function : APICommands
42 //purpose  : 
43 //=======================================================================
44 void BOPTest::APICommands(Draw_Interpretor& theCommands)
45 {
46   static Standard_Boolean done = Standard_False;
47   if (done) return;
48   done = Standard_True;
49   // Chapter's name
50   const char* g = "BOPTest commands";
51   // Commands  
52   theCommands.Add("bapibuild", "use bapibuild r" , __FILE__, bapibuild, g);
53   theCommands.Add("bapibop", "use bapibop r type" , __FILE__, bapibop, g);
54 }
55 //=======================================================================
56 //function : bapibop
57 //purpose  : 
58 //=======================================================================
59 Standard_Integer bapibop(Draw_Interpretor& di,
60                          Standard_Integer n, 
61                          const char** a) 
62
63   if (n<3) {
64     di << " use bapibop r type\n";
65     return 0;
66   }
67   //
68   char buf[128];
69   Standard_Boolean bRunParallel, bNonDestructive;
70   Standard_Integer iErr, iOp;
71   Standard_Real aFuzzyValue;
72   BRepAlgoAPI_Common aCommon;
73   BRepAlgoAPI_Fuse aFuse;
74   BRepAlgoAPI_Cut aCut;
75   BRepAlgoAPI_Section aSection;
76   BRepAlgoAPI_BooleanOperation *pBuilder;
77   BOPAlgo_Operation aOp;
78   //
79   pBuilder=NULL;
80   iOp=atoi(a[2]);
81   if (iOp<0 || iOp>4) {
82     printf(" invalid operation type\n");
83     return 0;
84   }
85   aOp=(BOPAlgo_Operation)iOp;
86   //
87   switch (aOp) {
88    case BOPAlgo_COMMON:
89      pBuilder=&aCommon;
90      break;
91      //
92    case BOPAlgo_FUSE:
93      pBuilder=&aFuse;
94      break;
95      //
96    case BOPAlgo_CUT:
97    case BOPAlgo_CUT21:
98      pBuilder=&aCut;
99      break;
100      //
101    case BOPAlgo_SECTION:
102      pBuilder=&aSection;
103      break;
104      //
105    default:
106      break;
107   }
108   //
109   BOPCol_ListOfShape& aLSB=BOPTest_Objects::Shapes();
110   BOPCol_ListOfShape& aLTB=BOPTest_Objects::Tools();
111   //
112   TopTools_ListOfShape aLS, aLT;
113   ConvertList(aLSB, aLS);
114   ConvertList(aLTB, aLT);
115   //
116   bRunParallel=BOPTest_Objects::RunParallel();
117   aFuzzyValue=BOPTest_Objects::FuzzyValue();
118   bNonDestructive = BOPTest_Objects::NonDestructive();
119   //
120   if (aOp!=BOPAlgo_CUT21) {
121     pBuilder->SetArguments(aLS);
122     pBuilder->SetTools(aLT);
123   }
124   else {
125     pBuilder->SetArguments(aLT);
126     pBuilder->SetTools(aLS);
127   }
128   //
129   pBuilder->SetRunParallel(bRunParallel);
130   pBuilder->SetFuzzyValue(aFuzzyValue);
131   pBuilder->SetNonDestructive(bNonDestructive);
132   //
133   pBuilder->Build(); 
134   iErr=pBuilder->ErrorStatus();
135   if (iErr) {
136     Sprintf(buf, " error: %d\n",  iErr);
137     di << buf;
138     return 0;
139   }
140   //
141   const TopoDS_Shape& aR=pBuilder->Shape();
142   if (aR.IsNull()) {
143     di << " null shape\n";
144     return 0;
145   }
146   //
147   DBRep::Set(a[1], aR);
148   return 0;
149 }
150 //=======================================================================
151 //function : bapibuild
152 //purpose  : 
153 //=======================================================================
154 Standard_Integer bapibuild(Draw_Interpretor& di,
155                         Standard_Integer n, 
156                         const char** a) 
157
158   if (n<2) {
159     di << " use bapibuild r\n";
160     return 0;
161   }
162   //
163   char buf[128];
164   Standard_Boolean bRunParallel, bNonDestructive;
165   Standard_Integer iErr;
166   Standard_Real aFuzzyValue;
167   BRepAlgoAPI_BuilderAlgo aBuilder;
168   //
169   BOPCol_ListOfShape& aLSB=BOPTest_Objects::Shapes();
170   BOPCol_ListOfShape& aLTB=BOPTest_Objects::Tools();
171   //
172   TopTools_ListOfShape aLS;
173   ConvertList(aLSB, aLS);
174   ConvertList(aLTB, aLS);
175   //
176   bRunParallel=BOPTest_Objects::RunParallel();
177   aFuzzyValue=BOPTest_Objects::FuzzyValue();
178   bNonDestructive = BOPTest_Objects::NonDestructive();
179   //
180   aBuilder.SetArguments(aLS);
181   aBuilder.SetRunParallel(bRunParallel);
182   aBuilder.SetFuzzyValue(aFuzzyValue);
183   aBuilder.SetNonDestructive(bNonDestructive);
184   //
185   aBuilder.Build(); 
186   iErr=aBuilder.ErrorStatus();
187   if (iErr) {
188     Sprintf(buf, " error: %d\n",  iErr);
189     di << buf;
190     return 0;
191   }
192   //
193   const TopoDS_Shape& aR=aBuilder.Shape();
194   if (aR.IsNull()) {
195     di << " null shape\n";
196     return 0;
197   }
198   //
199   DBRep::Set(a[1], aR);
200   return 0;
201 }
202 //=======================================================================
203 //function : ConvertLists
204 //purpose  : 
205 //=======================================================================
206 void ConvertList(const BOPCol_ListOfShape& aLSB,
207                  TopTools_ListOfShape& aLS)
208 {
209   BOPCol_ListIteratorOfListOfShape aItB;
210   //
211   aItB.Initialize(aLSB);
212   for (; aItB.More(); aItB.Next()) {
213     const TopoDS_Shape& aS=aItB.Value();
214     aLS.Append(aS);
215   }
216 }
217