0022898: IGES import fails in german environment
[occt.git] / src / TestTopOpe / TestTopOpe_BOOP.cxx
1 // Created on: 1996-02-05
2 // Created by: Jea Yves LEBEY
3 // Copyright (c) 1996-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21
22 #include <TestTopOpe_BOOP.hxx>
23 #include <TestTopOpe.hxx>
24 #include <TopOpeBRepTool.hxx>
25 #include <TopOpeBRepTool_GeomTool.hxx>
26 #include <TopOpeBRepDS_HDataStructure.hxx>
27 #include <TopOpeBRepDS.hxx>
28 #include <TopOpeBRepDS_BuildTool.hxx>
29 #include <TopOpeBRepDS_HDataStructure.hxx>
30 #include <TopOpeBRepDS_Filter.hxx>
31 #include <TopOpeBRepDS_Reducer.hxx>
32 #include <TopOpeBRepDS_Check.hxx>
33 #include <TopOpeBRepDS_Surface.hxx>
34 #include <TopOpeBRepDS_Curve.hxx>
35 #include <TopOpeBRepDS_Point.hxx>
36 #include <TopOpeBRepDS.hxx>
37 #include <TopOpeBRep_FacesFiller.hxx>
38 #include <TopOpeBRep_FacesIntersector.hxx>
39 #include <TopOpeBRep_EdgesIntersector.hxx>
40 #include <TopOpeBRep_ShapeIntersector.hxx>
41 #include <TopOpeBRep_define.hxx>
42 #include <BRepAlgo_BooleanOperations.hxx>
43 #include <BRep_Builder.hxx>
44 #include <BRep_Builder.hxx>
45 #include <BRep_Tool.hxx>
46 #include <TopExp_Explorer.hxx>
47 #include <TopoDS.hxx>
48 #include <TopAbs.hxx>
49 #include <gp_Pnt.hxx>
50 #include <DBRep.hxx>
51 #include <Draw_Appli.hxx>
52 #ifdef WNT
53 Standard_IMPORT Draw_Viewer dout;
54 #endif
55
56 extern Standard_Integer TOPOPE_SeeShape(char *name);
57
58 #ifdef DEB
59 #include <TopOpeBRepTool_KRO.hxx>
60 extern Standard_Boolean TopOpeBRepTool_GettraceKRO();
61 extern void PrintKRO_PREPA();
62 #endif
63
64 Standard_Integer TestTopOpe_BOOP::Prepare(const char* ns1,const char* ns2)
65 {
66   Standard_Integer err = 0;
67   if ((err = LoadShapes(ns1,ns2))) return err; // 0
68   if ((err = LoadnewDS())) return err; // 100
69   if ((err = DSF_Insert())) return err; // 100<,<200
70   if ((err = LoadnewHB())) return err; // 200
71   if ((err = Builder_Perform())) return err; // 200<,<300
72   return 0;
73 }
74
75 Standard_Integer TestTopOpe_BOOP::LoadShapes(const char* ns1, const char* ns2)
76 {
77   if (ns1==NULL) return 1;TopoDS_Shape S1=DBRep::Get(ns1);if (S1.IsNull()) return 1;
78   if (ns2==NULL) return 1;TopoDS_Shape S2=DBRep::Get(ns2);if (S2.IsNull()) return 1;
79   SetShape1(S1); mynameS1 = ns1;
80   SetShape2(S2); mynameS2 = ns2;
81   mylastPREP = 0;
82   return 0;
83 }
84
85 Standard_Integer TestTopOpe_BOOP::LoadnewDS()
86 {
87   myHDS = new TopOpeBRepDS_HDataStructure();
88   TestTopOpe::Shapes(myS1,myS2);
89   TestTopOpe::CurrentDS(myHDS);
90   if (myPDSF != NULL) { free((TopOpeBRep_DSFiller*)myPDSF); myPDSF = NULL; }
91   myPDSF = new TopOpeBRep_DSFiller();
92   mylastPREP = 100;
93   return 0;
94 }
95
96 Standard_Integer TestTopOpe_BOOP::DSF_Insert()
97 {
98 //  Standard_Integer err = 0;
99   TopOpeBRep_DSFiller DSF;
100   DSF_Insert(DSF);
101   mylastPREP = 190;
102   return 0;
103 }
104
105 Standard_Integer TestTopOpe_BOOP::LoadnewHB()
106 {
107 //  Standard_Integer err = 0;
108   TopOpeBRepTool_GeomTool GT;
109   Standard_Boolean c2d = myVarsTopo.GetC2D();
110   GT.Define(myVarsTopo.GetOCT(),Standard_True,c2d, c2d);
111   Standard_Real t3,t2; myVarsTopo.GetTolx(t3,t2);
112   GT.SetTolerances(t3,t2);
113   TopOpeBRepDS_BuildTool BT(GT);
114   myHB = new TopOpeBRepBuild_HBuilder(BT);
115   mylastPREP = 200;
116   return 0;
117 }
118
119 Standard_Integer TestTopOpe_BOOP::Builder_Perform()
120 {
121 //  Standard_Integer err = 0;  
122   myHB->Perform(myHDS,myS1,myS2);
123 #ifdef DEB
124   if ( TopOpeBRepTool_GettraceKRO() ) PrintKRO_PREPA();
125 #endif
126   myESP = myHDS->EdgesSameParameter();
127   myPREPdone = Standard_True;
128   myBOOdone = Standard_False;
129   mylastPREP = 290;
130   return 0;
131 }
132
133 Standard_Integer TestTopOpe_BOOP::FaceFilter()
134 {
135   TopOpeBRepDS_Filter F(myHDS);
136   F.ProcessFaceInterferences(myHB->ChangeBuilder().MSplit(TopAbs_ON));
137   return 0;
138 }
139
140 Standard_Integer TestTopOpe_BOOP::FaceReducer()
141 {
142   TopOpeBRepDS_Reducer R(myHDS);
143   R.ProcessFaceInterferences(myHB->ChangeBuilder().MSplit(TopAbs_ON));
144   return 0;
145 }
146
147 Standard_Boolean TestTopOpe_BOOP::CheckBooope(const char* key)
148 {
149   Standard_Boolean res = Standard_True;
150   Operation_t o = Operation(key);
151   if (o == BOOP_UND) return Standard_False;
152   
153   if ( !myPREPdone) {
154     cout<<"pas de preparation"<<endl;
155     if ( myHB.IsNull() ) {
156       res = Standard_False;
157     }
158   }
159   else if ( !myESP ) {
160     cout<<"edges non SameParameter()"<<endl;
161     if (o == BOOP_C12 || o == BOOP_C21 || o == BOOP_COM || o == BOOP_FUS) res = Standard_False;
162   }
163   
164   return res;
165 }
166
167 Standard_Integer TestTopOpe_BOOP::FindShape(const TCollection_AsciiString& name)
168 {
169   Standard_Integer ix = 0;
170   if (ISINTEGER(name.ToCString())) {
171     if (myHDS.IsNull()) return 0;
172     Standard_Integer is = Draw::Atoi(name.ToCString());
173     Standard_Integer ns = myHDS->NbShapes();
174     Standard_Integer i1 = 0, i2 = 0;
175     if (is != 0) { 
176       if (is > ns || ns < 1) {
177         cout<<"index "<<is<<" is not assigned in DS"<<endl;
178         return 0;
179       }
180       else {
181         i1 = i2 = is;
182       }
183     }
184     else {
185       i1 = 1; i2 = ns; 
186     }
187     for (Standard_Integer ids=i1;ids<=i2;ids++) {
188       ix = FindShape(ids,myS1);
189       if (ix) cout<<"DS shape "<<ids<<" is same "<<TopOpeBRepDS::SPrint(myHDS->Shape(ids).ShapeType(),ix)<<" of "<<mynameS1<<" (1)"<<endl;
190       ix = FindShape(ids,myS2);
191       if (ix) cout<<"DS shape "<<ids<<" is same "<<TopOpeBRepDS::SPrint(myHDS->Shape(ids).ShapeType(),ix)<<" of "<<mynameS2<<" (2)"<<endl;
192     }
193   }
194   else {
195     Standard_CString aCString =  name.ToCString();
196     TopoDS_Shape S = DBRep::Get(aCString);
197     if (S.IsNull()) {cout<<"shape "<<name<<" not found"<<endl; return 0;}
198     else {
199       ix = FindShape(S,myS1);
200       if (ix) cout<<"shape "<<name<<" is same "<<TopOpeBRepDS::SPrint(S.ShapeType(),ix)<<" of "<<mynameS1<<" (1)"<<endl;
201       ix = FindShape(S,myS2);
202       if (ix) cout<<"shape "<<name<<" is same "<<TopOpeBRepDS::SPrint(S.ShapeType(),ix)<<" of "<<mynameS2<<" (2)"<<endl;
203     }
204  }
205   return 0;
206 }
207
208 Standard_Integer TestTopOpe_BOOP::FindShape(const Standard_Integer ids,const TopoDS_Shape& Sref)
209 {
210   if (myHDS.IsNull()) return 0;
211   const TopoDS_Shape& S = myHDS->Shape(ids);
212   Standard_Integer i = FindShape(S,Sref);
213   return i;
214 }
215
216 Standard_Integer TestTopOpe_BOOP::FindShape(const TopoDS_Shape& S,const TopoDS_Shape& Sref)
217 {
218   if (Sref.IsNull()) return 0; TopExp_Explorer x; Standard_Integer i;
219   for (i=1,x.Init(Sref,S.ShapeType());x.More();x.Next(),i++)
220     if (x.Current().IsSame(S)) return i;
221   return 0;
222 }
223
224 void TestTopOpe_BOOP::Booope(const char* key,const char *namres)
225 {
226   Standard_Boolean res = CheckBooope(key);
227   if (!res) return;
228   if (myHB.IsNull()) return;
229   
230   Operation_t o = Operation(key);
231
232   if       (o == BOOP_SECC || o == BOOP_SECE || o == BOOP_SEC) {
233     Standard_Integer k;
234     if      (o == BOOP_SECC) k = 1; // section sur courbes
235     else if (o == BOOP_SECE) k = 2; // section sur aretes
236     else if (o == BOOP_SEC)  k = 3; // toutes sections
237     else return;
238     TopTools_ListOfShape LE; myHB->InitSection(k);
239     for (;myHB->MoreSection();myHB->NextSection())
240       LE.Append(myHB->CurrentSection());
241     MakeResult(LE); StoreResult(key,namres);
242   }
243
244   else if (o == BOOP_C12 || o == BOOP_C21 || o == BOOP_COM || o == BOOP_FUS) {
245
246     TopAbs_State t1=TopAbs_UNKNOWN,t2=TopAbs_UNKNOWN;
247     if      (o == BOOP_C12) { t1 = TopAbs_OUT; t2 = TopAbs_IN;  }
248     else if (o == BOOP_C21) { t1 = TopAbs_IN;  t2 = TopAbs_OUT; }
249     else if (o == BOOP_COM) { t1 = TopAbs_IN;  t2 = TopAbs_IN;  }
250     else if (o == BOOP_FUS) { t1 = TopAbs_OUT; t2 = TopAbs_OUT; }
251     
252     if((myS2type > TopAbs_WIRE) && (o == BOOP_COM)) {
253       BRepAlgo_BooleanOperations babo;
254       babo.Shapes2d(myS1,myS2);
255       TestTopOpe::CurrentDS(babo.DataStructure());
256       babo.Common();
257       myHB = babo.Builder();
258       const TopTools_ListOfShape& LE = myHB->Splits(myS2, TopAbs_IN);
259       MakeResult(LE); StoreResult(key,namres);
260       return;
261     }
262     
263     myHB->Clear();
264     myHB->MergeShapes(myS1,t1,myS2,t2);
265     cout<<"MergeShapes done"<<endl;
266     
267     const TopTools_ListOfShape& L1 = myHB->Merged(myS1,t1);
268     MakeResult(L1);
269     StoreResult(key,namres);
270   }
271
272   myBOOdone = Standard_True;
273 }
274
275 void TestTopOpe_BOOP::ClearResult()
276 {
277   BRep_Builder BB;
278   BB.MakeCompound(myCresult);
279   myNresult = 0;
280 }
281
282 void TestTopOpe_BOOP::AddResult(const TopTools_ListOfShape& L)
283 {
284   BRep_Builder BB;
285   TopTools_ListIteratorOfListOfShape it(L);
286   for (; it.More(); it.Next(), myNresult++) BB.Add(myCresult,it.Value());
287 }
288
289 void TestTopOpe_BOOP::MakeResult(const TopTools_ListOfShape& L)
290 {
291   ClearResult();
292   AddResult(L);
293 }
294
295 void TestTopOpe_BOOP::StoreResult
296 (const char* key,const char* namres, char* extent) const
297 {
298   const char* nam = (namres == NULL) ? myresnamdef : namres;
299   if (nam == NULL) return;
300   char na[100]; strcpy(na,nam);if (extent!=NULL) strcat(na,extent);
301
302   if (Operation(key) != BOOP_SEC && myVarsTopo.GetClear()) dout.Clear();
303   DBRep::Set(na,myCresult);
304   if (key != NULL) {
305     cout<<"("<<myNresult<<" shape) ";
306     cout<<key<<" result stored in variable "<<na<<endl;
307   }
308 }
309
310 void TestTopOpe_BOOP::GetSplit(const TopAbs_ShapeEnum typ,const TopAbs_State sta)
311 {
312   if ( myHB.IsNull() ) return;
313   if ( myHB->DataStructure().IsNull() ) return;
314   ClearResult();
315   Standard_Integer ns = myHB->DataStructure()->DS().NbShapes();
316   for (Standard_Integer is = 1; is <= ns; is++) {
317     const TopoDS_Shape& S = myHB->DataStructure()->Shape(is);
318     Standard_Boolean issplit = myHB->IsSplit(S,sta);
319     if (issplit) {
320       GetSplit(typ,sta,is);
321     }
322   }
323 }
324
325 void TestTopOpe_BOOP::GetSplit(const TopAbs_ShapeEnum typ,
326                         const TopAbs_State sta,
327                         const Standard_Integer isha)
328 {
329   if (isha == 0) return;
330   if ( myHB.IsNull() ) return;
331   if ( myHB->DataStructure().IsNull() ) return;
332   const TopoDS_Shape& S = myHB->DataStructure()->Shape(isha);
333   if (S.IsNull()) { cout<<"shape "<<isha<<" nul"<<endl; return; }
334   if (S.ShapeType() != typ) return;
335   Standard_Boolean issplit = myHB->IsSplit(S,sta);
336   if (issplit) {
337     const TopTools_ListOfShape& LS = myHB->Splits(S,sta);
338     ClearResult();
339     AddResult(LS);
340     TCollection_AsciiString namres;
341
342     if      (typ==TopAbs_EDGE) namres = "e"; 
343     else if (typ==TopAbs_FACE) namres = "f";
344     else if (typ==TopAbs_SOLID) namres = "s";
345     namres += TCollection_AsciiString(isha);
346 //    namres += "sp";
347     if      (sta==TopAbs_IN) namres += "in";
348     else if (sta==TopAbs_OUT) namres += "ou";
349     else if (sta==TopAbs_ON) namres += "on";
350
351     cout<<namres<<" : Split ";TopAbs::Print(sta,cout);
352     cout<<" (";TopAbs::Print(typ,cout);cout<<","<<isha<<")";
353     cout<<" --> "<<LS.Extent();
354     cout<<endl;
355
356     Standard_Boolean bcle = myVarsTopo.GetClear();
357     myVarsTopo.SetClear(Standard_False);
358     StoreResult(NULL,(char*)namres.ToCString());
359     TOPOPE_SeeShape((char *)namres.ToCString());
360     myVarsTopo.SetClear(bcle);
361   }
362 }
363
364 void TestTopOpe_BOOP::GetSplit(const TopAbs_State sta,const Standard_Integer isha)
365 {
366   if (isha == 0) return;
367   if ( myHB.IsNull() ) return;
368   if ( myHB->DataStructure().IsNull() ) return;
369   const TopoDS_Shape& S = myHB->DataStructure()->Shape(isha);
370   if (S.IsNull()) { cout<<"shape "<<isha<<" nul"<<endl; return; }
371   TopAbs_ShapeEnum typ = S.ShapeType();
372   Standard_Boolean issplit = myHB->IsSplit(S,sta);
373   if (issplit) { 
374     GetSplit(typ,sta,isha);
375   }
376 }
377
378 void TestTopOpe_BOOP::GetSplit(const Standard_Integer isha)
379 {
380   if (isha == 0) return;
381   if ( myHB.IsNull() ) return;
382   if ( myHB->DataStructure().IsNull() ) return;
383   const TopoDS_Shape& S = myHB->DataStructure()->Shape(isha);
384   if (S.IsNull()) { cout<<"shape "<<isha<<" nul"<<endl; return; }  
385   GetSplit(TopAbs_OUT,isha);
386   GetSplit(TopAbs_ON,isha);
387   GetSplit(TopAbs_IN,isha);
388 }
389
390 void TestTopOpe_BOOP::GetSplit(const TopAbs_State sta)
391 {
392   if ( myHB.IsNull() ) return;
393   if ( myHB->DataStructure().IsNull() ) return;
394   GetSplit(TopAbs_SOLID,sta);
395   GetSplit(TopAbs_FACE,sta);
396   GetSplit(TopAbs_EDGE,sta);
397 }
398
399 void TestTopOpe_BOOP::GetMerged(const TopAbs_ShapeEnum typ,const TopAbs_State sta)
400 {
401   if ( myHB.IsNull() ) return;
402   if ( myHB->DataStructure().IsNull() ) return;
403   ClearResult();
404   Standard_Integer ns = myHB->DataStructure()->DS().NbShapes();
405   for (Standard_Integer is = 1; is <= ns; is++) {
406     const TopoDS_Shape& S = myHB->DataStructure()->Shape(is);
407     Standard_Boolean isMerged = myHB->IsMerged(S,sta);
408     if (isMerged) {
409       GetMerged(typ,sta,is);
410     }
411   }
412 }
413
414 void TestTopOpe_BOOP::GetMerged(const TopAbs_ShapeEnum typ,const TopAbs_State sta,const Standard_Integer isha)
415 {
416   if (isha == 0) return;
417   if ( myHB.IsNull() ) return;
418   if ( myHB->DataStructure().IsNull() ) return;
419   const TopoDS_Shape& S = myHB->DataStructure()->Shape(isha);
420   if (S.IsNull()) { cout<<"shape "<<isha<<" nul"<<endl; return; }
421   if (S.ShapeType() != typ) return;
422   Standard_Boolean isMerged = myHB->IsMerged(S,sta);
423   if (isMerged) {
424     const TopTools_ListOfShape& LS = myHB->Merged(S,sta);
425     ClearResult();
426     AddResult(LS);
427     TCollection_AsciiString namres;
428
429     if      (typ==TopAbs_EDGE) namres = "e"; 
430     else if (typ==TopAbs_FACE) namres = "f";
431     else if (typ==TopAbs_SOLID) namres = "s";
432     namres += TCollection_AsciiString(isha);
433     namres += "me";
434     if      (sta==TopAbs_IN) namres += "IN";
435     else if (sta==TopAbs_OUT) namres += "OUT";
436     else if (sta==TopAbs_ON) namres += "ON";
437
438     cout<<namres<<" : Merged ";TopAbs::Print(sta,cout);
439     cout<<" (";TopAbs::Print(typ,cout);cout<<","<<isha<<")";
440     cout<<" --> "<<LS.Extent()<<" shape";
441     cout<<endl;
442
443     Standard_Boolean bcle = myVarsTopo.GetClear();
444     myVarsTopo.SetClear(Standard_False);
445     StoreResult(NULL,(char*)namres.ToCString());
446     TOPOPE_SeeShape((char *)namres.ToCString());
447     myVarsTopo.SetClear(bcle);
448   }
449 }
450
451 void TestTopOpe_BOOP::GetMerged(const TopAbs_State sta,const Standard_Integer isha)
452 {
453   if (isha == 0) return;
454   if ( myHB.IsNull() ) return;
455   if ( myHB->DataStructure().IsNull() ) return;
456   const TopoDS_Shape& S = myHB->DataStructure()->Shape(isha);
457   if (S.IsNull()) { cout<<"shape "<<isha<<" nul"<<endl; return; }
458   TopAbs_ShapeEnum typ = S.ShapeType();
459   Standard_Boolean isMerged = myHB->IsMerged(S,sta);
460   if (isMerged) {
461     GetMerged(typ,sta,isha);
462   }
463 }
464
465 void TestTopOpe_BOOP::GetMerged(const Standard_Integer isha)
466 {
467   if (isha == 0) return;
468   if ( myHB.IsNull() ) return;
469   if ( myHB->DataStructure().IsNull() ) return;
470   const TopoDS_Shape& S = myHB->DataStructure()->Shape(isha);
471   if (S.IsNull()) { cout<<"shape "<<isha<<" nul"<<endl; return; }  
472   GetMerged(TopAbs_OUT,isha);
473   GetMerged(TopAbs_ON,isha);
474   GetMerged(TopAbs_IN,isha);
475 }
476
477 void TestTopOpe_BOOP::GetMerged(const TopAbs_State sta)
478
479   if ( myHB.IsNull() ) return;
480   if ( myHB->DataStructure().IsNull() ) return;
481   GetMerged(TopAbs_SOLID,sta);
482   GetMerged(TopAbs_FACE,sta);
483   GetMerged(TopAbs_EDGE,sta);
484 }
485
486 // NYI void ChkIntg();
487 // NYI void ChkIntgInterf();
488 // NYI void ChkIntgSamDomain();
489 // NYI void ChkVertex();