0023948: Wrong intersection between a surface of revolution and a plane.
[occt.git] / src / QANewBRepNaming / QANewBRepNaming_Cut.cxx
1 // Created on: 2000-10-31
2 // Created by: Sergey ZARITCHNY
3 // Copyright (c) 2000-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <QANewBRepNaming_Cut.ixx>
17 #include <TopoDS_Iterator.hxx>
18 #include <TopoDS_Shell.hxx>
19 #include <BRep_Builder.hxx>
20 #include <TopExp_Explorer.hxx>
21 #include <TopTools_ListOfShape.hxx>
22 #include <TopTools_ListIteratorOfListOfShape.hxx>
23 #include <TNaming_NamedShape.hxx>
24 #include <TNaming_Tool.hxx>
25 #include <TNaming_Builder.hxx>
26 #include <TNaming_Builder.hxx>
27 #include <QANewBRepNaming_Loader.hxx>
28
29
30 //=======================================================================
31 //function : QANewBRepNaming_Cut
32 //purpose  : 
33 //=======================================================================
34
35 QANewBRepNaming_Cut::QANewBRepNaming_Cut() {}
36
37 //=======================================================================
38 //function : QANewBRepNaming_Cut
39 //purpose  : 
40 //=======================================================================
41
42 QANewBRepNaming_Cut::QANewBRepNaming_Cut(const TDF_Label& ResultLabel)
43      :QANewBRepNaming_BooleanOperationFeat(ResultLabel) {}
44
45 //=======================================================================
46 //function : Load
47 //purpose  : 
48 //=======================================================================
49
50 void QANewBRepNaming_Cut::Load(BRepAlgoAPI_BooleanOperation& MS) const {
51
52   TopoDS_Shape ResSh = MS.Shape();
53   const TopoDS_Shape& ObjSh = MS.Shape1();
54   const TopoDS_Shape& ToolSh = MS.Shape2();
55   const TopAbs_ShapeEnum& TypeSh = ShapeType(ObjSh);
56
57   if (ResSh.IsNull()) {
58 #ifdef DEB
59     cout<<"QANewBRepNaming_Cut::Load(): The result of the boolean operation is null"<<endl;
60 #endif
61     return;
62   }
63
64   // If the shapes are the same - select the result and exit:
65   if (IsResultChanged(MS)) {
66 #ifdef DEB
67     cout<<"QANewBRepNaming_Cut::Load(): The object and the result of CUT operation are the same"<<endl;
68 #endif
69     if (MS.Shape().ShapeType() == TopAbs_COMPOUND) {
70       Standard_Integer nbSubResults = 0;
71       TopoDS_Iterator itr(MS.Shape());
72       for (; itr.More(); itr.Next()) nbSubResults++;
73       if (nbSubResults == 1) { //
74         itr.Initialize(MS.Shape());
75         if (itr.More()) ResSh = itr.Value();
76       } //
77     }    
78     TNaming_Builder aBuilder(ResultLabel());
79     aBuilder.Select(ResSh, ObjSh);
80     return;
81   }
82   //
83   Standard_Boolean aWRCase = IsWRCase(MS);
84   // Naming of the result:
85   LoadResult(MS);
86
87   // Naming of modified, deleted and new sub shapes:
88   if (TypeSh == TopAbs_WIRE || TypeSh == TopAbs_EDGE) {//LoadWire(MS);
89 //Modified
90     TNaming_Builder ModEBuilder(ModifiedEdges());    
91     QANewBRepNaming_Loader::LoadModifiedShapes(MS, ObjSh, TopAbs_EDGE, ModEBuilder, Standard_True);
92 //Generated vertexes
93     if(MS.HasGenerated()) {  
94       TNaming_Builder nBuilder (NewShapes());
95       QANewBRepNaming_Loader::LoadGeneratedShapes (MS, ObjSh,  TopAbs_EDGE, nBuilder);
96       QANewBRepNaming_Loader::LoadGeneratedShapes (MS, ToolSh, TopAbs_FACE, nBuilder);
97     }
98 //Deleted (Faces, Edges, Vertexes)
99     if(MS.HasDeleted()){ 
100       TNaming_Builder DelFBuilder(DeletedFaces()); // all deleted shapes
101       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ObjSh,  TopAbs_EDGE,   DelFBuilder);
102       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ObjSh,  TopAbs_VERTEX, DelFBuilder);
103       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ToolSh, TopAbs_FACE,   DelFBuilder);
104     }
105
106   }
107   else if (TypeSh == TopAbs_SHELL || TypeSh == TopAbs_FACE) {//LoadShell(MS);
108 //Modified
109     if(!aWRCase) {
110       TNaming_Builder ModFBuilder(ModifiedFaces());
111       QANewBRepNaming_Loader::LoadModifiedShapes(MS, ObjSh, TopAbs_FACE, ModFBuilder, Standard_True);
112     } else {
113       LoadSymmetricalEdges(MS);
114       LoadModified1n (MS, ObjSh, TopAbs_FACE);
115       LoadModified11 (MS, ObjSh,  TopAbs_FACE);
116     }
117     TNaming_Builder ModEBuilder(ModifiedEdges());    
118     QANewBRepNaming_Loader::LoadModifiedShapes(MS, ObjSh, TopAbs_EDGE, ModEBuilder, Standard_True);
119 //
120
121
122 //Generated edges (edges of free boundaries)
123     if(MS.HasGenerated()) {  
124       TNaming_Builder nBuilder (NewShapes());
125       QANewBRepNaming_Loader::LoadGeneratedShapes (MS, ObjSh,  TopAbs_FACE, nBuilder);
126       QANewBRepNaming_Loader::LoadGeneratedShapes (MS, ToolSh, TopAbs_FACE, nBuilder);
127     }
128 //Deleted
129     if(MS.HasDeleted()){ 
130       TNaming_Builder DelFBuilder(DeletedFaces());
131       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ObjSh,  TopAbs_FACE, DelFBuilder);     
132       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ObjSh,  TopAbs_EDGE, DelFBuilder);
133       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ToolSh, TopAbs_FACE, DelFBuilder); 
134     }
135   }
136   else { // Solid
137     
138     if(MS.HasModified()){
139       if(aWRCase) {
140         LoadSymmetricalEdges(MS);
141         LoadModified1n (MS, ObjSh,  TopAbs_FACE);
142         LoadModified11 (MS, ObjSh,  TopAbs_FACE);
143         LoadModified11 (MS, ToolSh, TopAbs_FACE);
144       } else if(QANewBRepNaming_BooleanOperationFeat::IsWRCase2(MS)) {
145         LoadModified1n (MS, ObjSh,  TopAbs_FACE);
146         LoadModified11 (MS, ObjSh,  TopAbs_FACE);
147         LoadModified11 (MS, ToolSh, TopAbs_FACE);
148         LoadWRCase(MS);
149       } else {
150         TNaming_Builder ModBuilder(ModifiedFaces()); 
151         QANewBRepNaming_Loader::LoadModifiedShapes (MS, ObjSh,  TopAbs_FACE, ModBuilder, Standard_True);
152         QANewBRepNaming_Loader::LoadModifiedShapes (MS, ToolSh, TopAbs_FACE, ModBuilder, Standard_True);
153       }
154     }
155     
156     
157     if(MS.HasDeleted()){
158       TNaming_Builder DelBuilder(DeletedFaces());
159       QANewBRepNaming_Loader::LoadDeletedShapes (MS, ObjSh,  TopAbs_FACE, DelBuilder);
160       QANewBRepNaming_Loader::LoadDeletedShapes (MS, ToolSh, TopAbs_FACE, DelBuilder);     
161     }
162   }
163
164   LoadDegenerated(MS);
165     
166   // Naming of the content:
167   if (ShapeType(ObjSh) == TopAbs_SOLID) LoadContent(MS);
168 }