ac8122ee8d24fab940aad0026f4f4c246380bd19
[occt.git] / src / TopOpeBRepBuild / TopOpeBRepBuild_Merge.cxx
1 // Created on: 1994-08-30
2 // Created by: Jean Yves LEBEY
3 // Copyright (c) 1994-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 <TopOpeBRepBuild_Builder.jxx>
23 #include <TopOpeBRepBuild_ShellFaceSet.hxx>
24 #include <TopOpeBRepBuild_SolidBuilder.hxx>
25 #include <TopoDS.hxx>
26 #include <TopOpeBRepDS_ListOfShapeOn1State.hxx>
27 #include <BRep_Tool.hxx>
28 #include <TopOpeBRepBuild_define.hxx>
29 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
30 #include <TopExp.hxx>
31 #include <TopTools_ListOfShape.hxx>
32 #include <BRep_Builder.hxx>
33 #include <BRepCheck_Wire.hxx>
34 #include <BRepCheck.hxx>
35 #include <TopoDS_Iterator.hxx>
36 //#include <DBRep.hxx>
37 #include <BRepCheck_Analyzer.hxx>
38 #include <BRepCheck_ListIteratorOfListOfStatus.hxx>
39 #include <BRepCheck.hxx>
40 #include <BRepCheck_Result.hxx>
41
42 #ifdef DEB
43 Standard_IMPORT Standard_Boolean TopOpeBRepBuild_GettraceSPS();
44 #endif
45 //------------
46 //static Standard_Integer ifvNbFace = 0;
47 //static char *name = "                 ";
48 //-------------
49 static void CorrectEdgeOrientation(TopoDS_Shape& aWire)
50 {
51
52   TopTools_ListOfShape anEdgeList, anAuxList, aTrueEdgeList;
53   BRep_Builder BB;
54   TopoDS_Vertex vf, vl, v1f, v1l;
55   Standard_Boolean append = Standard_True;
56
57   TopoDS_Iterator tdi(aWire, Standard_False, Standard_False);
58   for(; tdi.More(); tdi.Next()) anEdgeList.Append(tdi.Value());
59
60   Standard_Integer n = anEdgeList.Extent();
61   if(n <= 1) return;
62
63   TopTools_ListIteratorOfListOfShape anIt(anEdgeList);
64
65   TopoDS_Shape anCurEdge = anIt.Value();
66   TopExp::Vertices(TopoDS::Edge(anCurEdge), vf, vl, Standard_True);
67   aTrueEdgeList.Append(anCurEdge);
68   anIt.Next();
69
70   while(n > 0 && append) {
71
72     for(; anIt.More(); anIt.Next()) {
73       append = Standard_False;
74       anCurEdge =  anIt.Value();
75       TopExp::Vertices(TopoDS::Edge(anCurEdge), v1f, v1l, Standard_True);
76       if(v1f.IsSame(vl)) {
77         aTrueEdgeList.Append(anCurEdge);
78         vl = v1l;
79         append = Standard_True;
80         continue;
81       }
82       if(v1l.IsSame(vf)) {
83         aTrueEdgeList.Append(anCurEdge);
84         vf = v1f;
85         append = Standard_True;
86         continue;
87       }
88
89       if(v1l.IsSame(vl)) {
90         TopoDS_Shape anRevEdge = anCurEdge.Reversed();
91         aTrueEdgeList.Append(anRevEdge);
92         vl = v1f;
93         append = Standard_True;
94         continue;
95       }
96       if(v1f.IsSame(vf)) {
97         TopoDS_Shape anRevEdge = anCurEdge.Reversed();
98         aTrueEdgeList.Append(anRevEdge);
99         vf = v1l;
100         append = Standard_True;
101         continue;
102       }
103         
104       anAuxList.Append(anCurEdge);
105     }
106
107     anEdgeList.Assign(anAuxList);
108     anAuxList.Clear(); //something wrong in Assign when list contains 1 element.
109     n = anEdgeList.Extent();
110     anIt.Initialize(anEdgeList);
111   }
112
113   if(n > 0) aTrueEdgeList.Append(anEdgeList);
114
115   aWire.Nullify();
116   BB.MakeWire(TopoDS::Wire(aWire));
117   anIt.Initialize(aTrueEdgeList);
118   for(; anIt.More(); anIt.Next()) BB.Add(aWire, anIt.Value());
119
120 }
121
122
123
124 static void CorrectUnclosedWire(TopoDS_Shape& aWire)
125 {
126 //  cout << "-------CorrectUnclosedWire" << endl;
127   BRep_Builder BB;
128   TopoDS_Iterator tdi(aWire, Standard_False, Standard_False);
129   Standard_Integer nbe = 0;
130   for(; tdi.More(); tdi.Next()) {
131     nbe++;
132     const TopoDS_Shape& ed = tdi.Value();
133     Standard_Integer nbv = 0;
134     TopoDS_Iterator tdie(ed, Standard_False, Standard_False);
135     for(; tdie.More(); tdie.Next()) {
136       nbv++;
137     }
138 //    cout << "Edge " << nbe << " : " << nbv << endl;
139     if(nbv <= 1) {
140 //      cout << "Remove bad edge" << endl;
141       BB.Remove(aWire, ed);
142     }
143   }
144     
145   TopTools_IndexedDataMapOfShapeListOfShape VElists;
146   VElists.Clear();
147   TopExp::MapShapesAndAncestors(aWire, TopAbs_VERTEX, TopAbs_EDGE, VElists);
148   Standard_Integer nbVer = VElists.Extent(), i;
149
150   for(i = 1; i <= nbVer; i++) {
151     const TopTools_ListOfShape& Elist = VElists.FindFromIndex(i);
152     if(Elist.Extent() == 1) {
153       TopoDS_Shape anEdge = Elist.First();
154 //      cout << "Remove redundant edge" << endl;
155       BB.Remove(aWire, anEdge);
156     }
157   }
158 }
159       
160 //=======================================================================
161 //function : MergeShapes
162 //purpose  : 
163 //=======================================================================
164
165
166 void TopOpeBRepBuild_Builder::MergeShapes(const TopoDS_Shape& S1,const TopAbs_State ToBuild1,const TopoDS_Shape& S2,const TopAbs_State ToBuild2)
167 {
168   Standard_Boolean lesmemes = S1.IsEqual(S2);
169   if (lesmemes) {
170 #ifdef DEB
171     cout<<"TopOpeBRepBuild : S1 == S2"<<endl;
172 #endif
173     return;
174   }
175
176 #ifdef DEB
177   GdumpSHASETreset();
178 #endif
179
180   myState1 = ToBuild1;
181   myState2 = ToBuild2;
182   myShape1 = S1;
183   myShape2 = S2;
184   Standard_Boolean S1null = S1.IsNull();
185   Standard_Boolean S2null = S2.IsNull();
186   
187   MapShapes(S1,S2);
188   SplitSectionEdges();
189   
190   //======================== debut KPart
191   if (IsKPart()) {
192     MergeKPart();
193     ClearMaps();
194     return;
195   }
196   //======================== fin KPart
197   
198   Standard_Boolean RevOri1 = Reverse(ToBuild1,ToBuild2);
199   Standard_Boolean RevOri2 = Reverse(ToBuild2,ToBuild1);
200   
201   // Create a face set <SFS> connected by edges
202   // -----------------------------------------
203   TopOpeBRepBuild_ShellFaceSet SFS;
204   
205 #ifdef DEB
206   SFS.DEBNumber(GdumpSHASETindex());
207 #endif
208   
209   // NYI : SplitCompound appele par SplitShape
210   
211   TopOpeBRepTool_ShapeExplorer ex1;
212 #ifdef DEB
213   TopAbs_ShapeEnum t1,tex1;
214 #else
215   TopAbs_ShapeEnum t1=TopAbs_COMPOUND,tex1=TopAbs_COMPOUND;
216 #endif
217   if ( ! S1null ) {
218     t1 = tex1 = TopType(S1);
219     if ( t1 == TopAbs_COMPOUND ) {
220       tex1 = TopAbs_SOLID;  ex1.Init(S1,tex1);
221       if ( ! ex1.More() ) {
222         tex1 = TopAbs_SHELL; ex1.Init(S1,tex1);
223         if ( ! ex1.More() ) {
224           tex1 = TopAbs_FACE; ex1.Init(S1,tex1);
225           if( ! ex1.More() ) { 
226             tex1 = TopAbs_EDGE; ex1.Init(S1,tex1);
227           }
228         }
229       }
230     }
231     else if (t1 == TopAbs_WIRE) {
232       tex1 = TopAbs_EDGE; ex1.Init(S1,tex1);
233     }
234     else ex1.Init(S1,tex1);
235     SplitShapes(ex1,ToBuild1,ToBuild2,SFS,RevOri1);
236   }
237   
238   TopOpeBRepTool_ShapeExplorer ex2;
239 #ifdef DEB
240   TopAbs_ShapeEnum t2,tex2;
241 #else
242   TopAbs_ShapeEnum t2=TopAbs_COMPOUND,tex2=TopAbs_COMPOUND;
243 #endif
244   if ( ! S2null ) {
245     t2 = tex2 = TopType(S2);
246     if ( t2 == TopAbs_COMPOUND ) {
247       tex2 = TopAbs_SOLID;  ex2.Init(S2,tex2);
248       if ( ! ex2.More() ) {
249         tex2 = TopAbs_SHELL; ex2.Init(S2,tex2);
250         if ( ! ex2.More() ) {
251           tex2 = TopAbs_FACE; ex2.Init(S2,tex2);
252           if( ! ex2.More() ) { 
253             tex2 = TopAbs_EDGE; ex2.Init(S2,tex2);
254           }
255         }
256       }
257     }
258     else if (t2 == TopAbs_WIRE) {
259       tex2 = TopAbs_EDGE; ex2.Init(S2,tex2);
260     }
261     else ex2.Init(S2,tex2);
262     SplitShapes(ex2,ToBuild2,ToBuild1,SFS,RevOri2);
263   }
264   
265   // S1 or S2 = COMPOUND : connect them the list of merged shapes build
266   // on the first subshape.
267   
268   if ( ! S1null ) {
269     if ( t1 == TopAbs_COMPOUND ) {
270       TopTools_ListOfShape& L1 = ChangeMerged(S1,ToBuild1);
271       ex1.Init(S1,tex1);
272       if ( ex1.More() ) {
273         const TopoDS_Shape& SS1 = ex1.Current();
274         TopTools_ListOfShape& LSS1 = ChangeMerged(SS1,ToBuild1);
275         L1 = LSS1;
276       }
277     }
278   }
279   
280   if ( ! S2null ) {
281     if ( t2 == TopAbs_COMPOUND ) {
282       TopTools_ListOfShape& L2 = ChangeMerged(S2,ToBuild2);
283       ex2.Init(S2,tex2);
284       if ( ex2.More() ) {
285         const TopoDS_Shape& SS2 = ex2.Current();
286         TopTools_ListOfShape& LSS2 = ChangeMerged(SS2,ToBuild2);
287         L2 = LSS2;
288       }
289     }
290   }
291   
292   ClearMaps();
293   
294 } // MergeShapes
295
296
297 //=======================================================================
298 //function : Classify
299 //purpose  : LocOpe use
300 //=======================================================================
301
302 Standard_Boolean TopOpeBRepBuild_Builder::Classify() const 
303 {
304   return myClassifyVal;
305 }
306
307 //=======================================================================
308 //function : ChangeClassify
309 //purpose  : LocOpe use
310 //=======================================================================
311
312 void TopOpeBRepBuild_Builder::ChangeClassify(const Standard_Boolean classify)
313 {
314   myClassifyDef = Standard_True;
315   myClassifyVal = classify;
316 }
317
318 //=======================================================================
319 //function : MergeSolids
320 //purpose  : 
321 //=======================================================================
322
323 void TopOpeBRepBuild_Builder::MergeSolids(const TopoDS_Shape& S1,const TopAbs_State ToBuild1,const TopoDS_Shape& S2,const TopAbs_State ToBuild2)
324 {
325   MergeShapes(S1,ToBuild1,S2,ToBuild2);
326 } // MergeSolids
327
328
329 //=======================================================================
330 //function : MergeSolid
331 //purpose  : 
332 //=======================================================================
333
334 void TopOpeBRepBuild_Builder::MergeSolid(const TopoDS_Shape& S,const TopAbs_State ToBuild)
335 {
336   TopoDS_Shape Snull;
337   MergeShapes(S,ToBuild,Snull,ToBuild);
338 } // MergeSolid
339
340
341 //=======================================================================
342 //function : MakeSolids
343 //purpose  : 
344 //=======================================================================
345
346 void TopOpeBRepBuild_Builder::MakeSolids(TopOpeBRepBuild_SolidBuilder& SOBU,TopTools_ListOfShape& L)
347 {
348   TopoDS_Shape newSolid;
349   TopoDS_Shape newShell;
350   for (SOBU.InitSolid(); SOBU.MoreSolid(); SOBU.NextSolid()) {
351     myBuildTool.MakeSolid(newSolid);
352     for (SOBU.InitShell(); SOBU.MoreShell(); SOBU.NextShell()) {
353       Standard_Boolean isold = SOBU.IsOldShell();
354       if (isold) newShell = SOBU.OldShell();
355       else {
356         myBuildTool.MakeShell(newShell);
357         for (SOBU.InitFace(); SOBU.MoreFace(); SOBU.NextFace()) {
358           TopoDS_Shape F = SOBU.Face();
359           myBuildTool.AddShellFace(newShell,F);
360         }
361       }
362       myBuildTool.Closed(newShell,Standard_True); // NYI : check exact du caractere closed du shell
363       myBuildTool.AddSolidShell(newSolid,newShell);
364     }
365     L.Append(newSolid);
366   }
367 }
368 //=======================================================================
369 //function : MakeShells
370 //purpose  : 
371 //=======================================================================
372
373 void TopOpeBRepBuild_Builder::MakeShells(TopOpeBRepBuild_SolidBuilder& SOBU,TopTools_ListOfShape& L)
374 {
375   TopoDS_Shape newShell;
376   for (SOBU.InitShell(); SOBU.MoreShell(); SOBU.NextShell()) {
377     Standard_Boolean isold = SOBU.IsOldShell();
378     if (isold) newShell = SOBU.OldShell();
379     else {
380       myBuildTool.MakeShell(newShell);
381       for (SOBU.InitFace(); SOBU.MoreFace(); SOBU.NextFace()) {
382         TopoDS_Shape F = SOBU.Face();
383         myBuildTool.AddShellFace(newShell,F);
384       }
385     }
386     L.Append(newShell);
387   }
388 }
389
390
391
392 //=======================================================================
393 //function : MakeFaces
394 //purpose  : 
395 //=======================================================================
396
397 void TopOpeBRepBuild_Builder::MakeFaces(const TopoDS_Shape& aFace,TopOpeBRepBuild_FaceBuilder& FABU,TopTools_ListOfShape& L)
398 {
399 #ifdef DEB
400   Standard_Integer iF = 0; Standard_Boolean tSPS = GtraceSPS(aFace,iF);
401   if(tSPS){GdumpFABU(FABU);}
402 #endif
403   Standard_Boolean hashds = (!myDataStructure.IsNull());
404   TopoDS_Shape newFace;
405   TopoDS_Shape newWire;
406
407   for (FABU.InitFace(); FABU.MoreFace(); FABU.NextFace()) {
408     myBuildTool.CopyFace(aFace,newFace);
409     Standard_Boolean hns = Standard_False;
410     if (hashds) {
411       const TopOpeBRepDS_DataStructure& BDS = myDataStructure->DS();
412       hns = BDS.HasNewSurface(aFace);
413       if (hns) {
414         const Handle(Geom_Surface)& SU = BDS.NewSurface(aFace);
415         myBuildTool.UpdateSurface(newFace,SU);
416       }
417     }
418
419
420     for (FABU.InitWire(); FABU.MoreWire(); FABU.NextWire()) {
421       Standard_Boolean isold = FABU.IsOldWire();
422       if (isold) newWire = FABU.OldWire();
423       else {
424         myBuildTool.MakeWire(newWire);
425         for(FABU.InitEdge(); FABU.MoreEdge(); FABU.NextEdge()) {
426           TopoDS_Shape E = FABU.Edge();
427           if (hns) myBuildTool.UpdateSurface(E,aFace,newFace);
428           myBuildTool.AddWireEdge(newWire,E);
429         }
430       }
431       //----------- IFV
432       if(!isold) {
433         BRepCheck_Analyzer bca(newWire, Standard_False);
434         if (!bca.IsValid()) {
435           newWire.Free(Standard_True);
436           CorrectUnclosedWire(newWire);
437           const Handle(BRepCheck_Result)& bcr = bca.Result(newWire);
438           BRepCheck_ListIteratorOfListOfStatus itl(bcr->Status());
439           for(; itl.More(); itl.Next() ) {
440             if(itl.Value() == BRepCheck_BadOrientationOfSubshape) {
441               CorrectEdgeOrientation(newWire);
442               break;
443             }
444           }
445         }
446       }
447       myBuildTool.Closed(newWire,Standard_True); // NYI : check exact du caractere closed du wire
448       myBuildTool.AddFaceWire(newFace,newWire);
449     }
450
451
452     L.Append(newFace);
453   }
454 }
455
456
457 //=======================================================================
458 //function : MakeEdges
459 //purpose  : 
460 //=======================================================================
461
462 void TopOpeBRepBuild_Builder::MakeEdges(const TopoDS_Shape& anEdge,TopOpeBRepBuild_EdgeBuilder& EDBU,TopTools_ListOfShape& L)
463 {
464 #ifdef DEB
465   Standard_Integer iE; Standard_Boolean tSPS = GtraceSPS(anEdge,iE);
466   Standard_Integer ne = 0;
467 #endif
468   
469   Standard_Integer nvertex = 0;
470   for (TopOpeBRepTool_ShapeExplorer ex(anEdge,TopAbs_VERTEX); ex.More(); ex.Next()) nvertex++;
471   
472   TopoDS_Shape newEdge;
473   for (EDBU.InitEdge(); EDBU.MoreEdge(); EDBU.NextEdge()) {
474     
475     // 1 vertex sur edge courante => suppression edge
476     Standard_Integer nloop = 0;
477     for (EDBU.InitVertex(); EDBU.MoreVertex(); EDBU.NextVertex()) nloop++; 
478     if ( nloop <= 1 ) continue;
479     
480     myBuildTool.CopyEdge(anEdge,newEdge);
481     
482     Standard_Boolean hasvertex = Standard_False;
483     for (EDBU.InitVertex(); EDBU.MoreVertex(); EDBU.NextVertex()) {
484       TopoDS_Shape V = EDBU.Vertex();
485       TopAbs_Orientation Vori = V.Orientation();
486       
487       Standard_Boolean hassd = myDataStructure->HasSameDomain(V);
488       if (hassd) {
489         // on prend le vertex reference de V
490         Standard_Integer iref = myDataStructure->SameDomainReference(V);
491         V = myDataStructure->Shape(iref);
492         V.Orientation(Vori);
493       }
494       
495       TopAbs_Orientation oriV = V.Orientation();
496       if ( oriV != TopAbs_EXTERNAL ) {
497         // betonnage
498         Standard_Boolean equafound = Standard_False;
499         TopExp_Explorer exE(newEdge,TopAbs_VERTEX);
500         for (; exE.More(); exE.Next() ) {
501           const TopoDS_Shape& VE = exE.Current();
502           TopAbs_Orientation oriVE = VE.Orientation();
503           if ( V.IsEqual(VE) ) {
504             equafound = Standard_True;
505             break;
506           }
507           else if (oriVE == TopAbs_FORWARD || oriVE == TopAbs_REVERSED) {
508             if (oriV == oriVE) {
509               equafound = Standard_True;
510               break;
511             }
512           }
513           else if (oriVE == TopAbs_INTERNAL || oriVE == TopAbs_EXTERNAL) {
514             Standard_Real parV = EDBU.Parameter();
515             Standard_Real parVE = BRep_Tool::Parameter(TopoDS::Vertex(VE),
516                                              TopoDS::Edge(newEdge));
517             if ( parV == parVE ) {
518               equafound = Standard_True;
519               break;
520             }
521           }
522         }
523         if ( !equafound ) {
524           hasvertex = Standard_True;
525           Standard_Real parV = EDBU.Parameter();
526           myBuildTool.AddEdgeVertex(newEdge,V);
527           myBuildTool.Parameter(newEdge,V,parV);
528         }
529         
530       }
531     } // loop on vertices of new edge newEdge
532     
533 #ifdef DEB
534     if(tSPS){cout<<endl;}
535     if(tSPS){cout<<"V of new edge "<<++ne<<endl;}
536     if(tSPS){GdumpEDG(newEdge);} 
537 #endif
538     
539     if (hasvertex) L.Append(newEdge);
540   } // loop on EDBU edges
541 } // MakeEdges
542
543
544 //=======================================================================
545 //function : IsMerged
546 //purpose  : 
547 //=======================================================================
548
549 Standard_Boolean TopOpeBRepBuild_Builder::IsMerged(const TopoDS_Shape& S,const TopAbs_State ToBuild) const
550 {
551   const TopOpeBRepDS_DataMapOfShapeListOfShapeOn1State* p = NULL;
552   if      ( ToBuild == TopAbs_OUT ) p = &myMergedOUT;
553   else if ( ToBuild == TopAbs_IN  ) p = &myMergedIN;
554   else if ( ToBuild == TopAbs_ON  ) p = &myMergedON;
555   if ( p == NULL ) return Standard_False;
556
557   Standard_Boolean notbound = ! (*p).IsBound(S); 
558   if ( notbound ) {
559     return Standard_False;
560   }
561   else {
562     const TopTools_ListOfShape& L = Merged(S,ToBuild);
563     Standard_Boolean isempty = L.IsEmpty();
564     return (!isempty);
565   }
566 } // IsMerged
567
568
569 //=======================================================================
570 //function : Merged
571 //purpose  : 
572 //=======================================================================
573
574 const TopTools_ListOfShape& TopOpeBRepBuild_Builder::Merged(const TopoDS_Shape& S,const TopAbs_State ToBuild) const
575 {
576   const TopOpeBRepDS_DataMapOfShapeListOfShapeOn1State* p = NULL;
577   if      ( ToBuild == TopAbs_OUT ) p = &myMergedOUT;
578   else if ( ToBuild == TopAbs_IN  ) p = &myMergedIN;
579   else if ( ToBuild == TopAbs_ON  ) p = &myMergedON;
580   if ( p == NULL ) return myEmptyShapeList;
581
582   if ( ! (*p).IsBound(S) ) {
583     return myEmptyShapeList;
584   }
585   else {
586     const TopTools_ListOfShape& L = (*p)(S).ListOnState();
587     return L;
588   }
589 } // Merged
590
591
592 //=======================================================================
593 //function : ChangeMerged
594 //purpose  : 
595 //=======================================================================
596
597 TopTools_ListOfShape& TopOpeBRepBuild_Builder::ChangeMerged(const TopoDS_Shape& S, const TopAbs_State ToBuild)
598 {
599   TopOpeBRepDS_DataMapOfShapeListOfShapeOn1State* p = NULL;
600   if      ( ToBuild == TopAbs_OUT ) p = &myMergedOUT;
601   else if ( ToBuild == TopAbs_IN  ) p = &myMergedIN;
602   else if ( ToBuild == TopAbs_ON  ) p = &myMergedON;
603   if ( p == NULL ) return myEmptyShapeList;
604
605   if ( ! (*p).IsBound(S) ) {
606     TopOpeBRepDS_ListOfShapeOn1State thelist;
607     (*p).Bind(S, thelist);
608   }
609   TopTools_ListOfShape& L = (*p)(S).ChangeListOnState();
610   return L;
611 } // ChangeMerged
612
613 //=======================================================================
614 //function : MergeEdges
615 //purpose  : 
616 //=======================================================================
617
618 void TopOpeBRepBuild_Builder::MergeEdges(const TopTools_ListOfShape& ,//L1,
619                       const TopAbs_State ,//ToBuild1,
620                       const TopTools_ListOfShape& ,//L2,
621                       const TopAbs_State ,//ToBuild2,
622                       const Standard_Boolean ,//Keepon1,
623                       const Standard_Boolean ,//Keepon2,
624                       const Standard_Boolean )//Keepon12)
625 {
626 } // MergeEdges
627
628 //=======================================================================
629 //function : MergeFaces
630 //purpose  : 
631 //=======================================================================
632
633 void TopOpeBRepBuild_Builder::MergeFaces(const TopTools_ListOfShape& , //S1,
634                       const TopAbs_State , //ToBuild1,
635                       const TopTools_ListOfShape& , //S2,
636                       const TopAbs_State , //ToBuild2
637                       const Standard_Boolean ,//onA,
638                       const Standard_Boolean ,//onB,
639                       const Standard_Boolean )//onAB)
640 {
641 }