0028567: Get rid of the unused DRAW commands based on old Boolean Operations (BRepAlgo)
[occt.git] / src / QANewBRepNaming / QANewBRepNaming_Intersection.cxx
1 // Created on: 2000-10-31
2 // Created by: Vladislav ROMASHKO
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
17 #include <BRepAlgoAPI_BooleanOperation.hxx>
18 #include <QANewBRepNaming_Intersection.hxx>
19 #include <QANewBRepNaming_Loader.hxx>
20 #include <TDF_Label.hxx>
21 #include <TNaming_Builder.hxx>
22 #include <TopoDS_Iterator.hxx>
23 #include <TopOpeBRepBuild_HBuilder.hxx>
24 #include <TopTools_ListIteratorOfListOfShape.hxx>
25
26 #ifdef OCCT_DEBUG
27 #include <TDataStd_Name.hxx>
28 #include <TNaming_NamedShape.hxx>
29 #endif
30 enum BoolArguments {
31   SOLID_SOLID,
32   SOLID_SHELL,
33   SOLID_WIRE,
34   SHELL_SOLID,
35   SHELL_SHELL,
36   SHELL_WIRE,
37   WIRE_SOLID,
38   WIRE_SHELL,
39   WIRE_WIRE,
40   UNEXPECTED
41 };
42 //=======================================================================
43 //function : QANewBRepNaming_Intersection
44 //purpose  : 
45 //=======================================================================
46
47 QANewBRepNaming_Intersection::QANewBRepNaming_Intersection() {}
48
49 //=======================================================================
50 //function : QANewBRepNaming_Intersection
51 //purpose  : 
52 //=======================================================================
53
54 QANewBRepNaming_Intersection::QANewBRepNaming_Intersection(const TDF_Label& ResultLabel)
55      :QANewBRepNaming_BooleanOperation(ResultLabel) {}
56
57 //=======================================================================
58 //function : Load
59 //purpose  : 
60 //=======================================================================
61
62 void QANewBRepNaming_Intersection::Load(BRepAlgoAPI_BooleanOperation& MS) const {
63   TopoDS_Shape ResSh = MS.Shape();
64   if (ResSh.IsNull()) {
65 #ifdef OCCT_DEBUG
66     cout<<"QANewBRepNaming_Intersection::Load(): The result of the Intersection is null"<<endl;
67 #endif
68     return;
69   }
70
71   const TopAbs_ShapeEnum& ResType = ShapeType(ResSh);
72   const TopoDS_Shape& ObjSh = MS.Shape1();
73   const TopoDS_Shape& ToolSh = MS.Shape2();
74
75   // If the shapes are the same - select the result and exit:
76   if (IsResultChanged(MS)) {
77 #ifdef OCCT_DEBUG
78     cout<<"QANewBRepNaming_Intersection::Load(): The object and the result of INTERSECTION operation are the same"<<endl;
79     // Not modified!
80 #endif
81     if (ResType == TopAbs_COMPOUND) {
82       Standard_Integer nbSubResults = 0;
83       TopoDS_Iterator itr(MS.Shape());
84       for (; itr.More(); itr.Next()) nbSubResults++;
85       if (nbSubResults == 1) {
86         itr.Initialize(MS.Shape());
87         if (itr.More()) ResSh = itr.Value();
88       }
89     }    
90     TNaming_Builder aBuilder(ResultLabel());
91     aBuilder.Select(ResSh, ObjSh);
92     return;
93   }
94   
95   const TopAbs_ShapeEnum& anObjType = ShapeType(ObjSh);
96   const TopAbs_ShapeEnum& aToolType = ShapeType(ToolSh);
97   BoolArguments anArg;
98   switch (anObjType) 
99     {
100     case TopAbs_SOLID://1
101       switch (aToolType)
102         {
103         case TopAbs_WIRE:
104         case TopAbs_EDGE:
105           anArg = SOLID_WIRE;
106           break;
107         case TopAbs_SOLID:
108           anArg = SHELL_SHELL;
109           break;
110         default:
111           anArg = UNEXPECTED;
112         }
113       break;
114     case TopAbs_SHELL://2
115     case TopAbs_FACE:
116       switch (aToolType)
117         {
118         case TopAbs_SHELL:
119         case TopAbs_FACE:
120           anArg = SHELL_SHELL;
121           break;
122         case TopAbs_WIRE:
123         case TopAbs_EDGE:
124           anArg = SHELL_WIRE;
125           break;
126         default:
127           anArg = UNEXPECTED;
128         }
129       break;
130     case TopAbs_WIRE://3
131     case TopAbs_EDGE:
132       switch (aToolType)
133         {
134         case TopAbs_SOLID:
135           anArg = WIRE_SOLID;
136           break;
137         case TopAbs_SHELL:
138         case TopAbs_FACE:
139           anArg = WIRE_SHELL;
140           break;  
141         case TopAbs_WIRE:
142         case TopAbs_EDGE:
143           anArg = WIRE_WIRE;
144           break;
145         default:
146           anArg = UNEXPECTED;
147         }
148       break;
149     default:
150       anArg = UNEXPECTED;
151     }
152
153   if(anArg == UNEXPECTED) {
154 #ifdef OCCT_DEBUG
155       cout <<"QANewBRepNaming_Intersection:: Unexpected Use Case" << endl;
156 #endif
157       return;
158     } else
159       LoadResult(MS);   
160
161   // Naming of modified, deleted and new sub shapes:
162   if (anArg == SHELL_SHELL) { // Result Wire/Edge
163 //Generated Edges and (may be) vertexes
164     if(MS.HasGenerated()) {  
165       TNaming_Builder nBuilder (NewShapes());
166       QANewBRepNaming_Loader::LoadGeneratedShapes (MS, ObjSh,  TopAbs_FACE, nBuilder);
167       QANewBRepNaming_Loader::LoadGeneratedShapes (MS, ToolSh, TopAbs_FACE, nBuilder);
168       QANewBRepNaming_Loader::LoadGeneratedShapes (MS, ObjSh,  TopAbs_EDGE, nBuilder);
169       QANewBRepNaming_Loader::LoadGeneratedShapes (MS, ToolSh, TopAbs_EDGE, nBuilder);
170     }
171     if(MS.HasDeleted()){ 
172       TNaming_Builder DelFBuilder(DeletedFaces());
173       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ObjSh,  TopAbs_FACE, DelFBuilder);
174       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ToolSh, TopAbs_FACE, DelFBuilder);
175       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ObjSh,  TopAbs_EDGE, DelFBuilder);
176       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ToolSh, TopAbs_EDGE, DelFBuilder);
177     }
178   }
179   else if (anArg == SOLID_WIRE || anArg == WIRE_SOLID || 
180            anArg == SHELL_WIRE || anArg == WIRE_SHELL) { // Result ==> Vertex
181     
182     if(MS.HasGenerated()) {  
183       TNaming_Builder nBuilder (NewShapes());
184       QANewBRepNaming_Loader::LoadGeneratedShapes (MS, ObjSh,  TopAbs_FACE, nBuilder);
185       QANewBRepNaming_Loader::LoadGeneratedShapes (MS, ToolSh, TopAbs_FACE, nBuilder);
186       QANewBRepNaming_Loader::LoadGeneratedShapes (MS, ObjSh,  TopAbs_EDGE, nBuilder);
187       QANewBRepNaming_Loader::LoadGeneratedShapes (MS, ToolSh, TopAbs_EDGE, nBuilder);
188     }
189     if(MS.HasDeleted()){ 
190       TNaming_Builder DelFBuilder(DeletedFaces());
191       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ObjSh,  TopAbs_FACE, DelFBuilder);
192       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ToolSh, TopAbs_FACE, DelFBuilder);
193       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ObjSh,  TopAbs_EDGE, DelFBuilder);
194       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ToolSh, TopAbs_EDGE, DelFBuilder);
195       if(anArg == SOLID_WIRE || anArg == SHELL_WIRE) {
196         QANewBRepNaming_Loader::LoadDeletedShapes(MS, ToolSh, TopAbs_VERTEX, DelFBuilder);
197       } else 
198         QANewBRepNaming_Loader::LoadDeletedShapes(MS, ObjSh, TopAbs_VERTEX, DelFBuilder);
199     }   
200   } else if (anArg == WIRE_WIRE) {
201     if(MS.HasGenerated()) {  
202       TNaming_Builder nBuilder (NewShapes());
203       QANewBRepNaming_Loader::LoadGeneratedShapes (MS, ObjSh,  TopAbs_EDGE, nBuilder);
204       QANewBRepNaming_Loader::LoadGeneratedShapes (MS, ToolSh, TopAbs_EDGE, nBuilder);
205     }
206     if(MS.HasDeleted()){ 
207       TNaming_Builder DelFBuilder(DeletedFaces());
208       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ObjSh,  TopAbs_EDGE,   DelFBuilder);
209       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ToolSh, TopAbs_EDGE,   DelFBuilder);
210       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ToolSh, TopAbs_VERTEX, DelFBuilder);
211       QANewBRepNaming_Loader::LoadDeletedShapes(MS, ObjSh,  TopAbs_VERTEX, DelFBuilder);
212     }
213   }
214
215   LoadDegenerated(MS);
216   
217   // Naming of the content:
218 //    if (ShapeType(ResSh) == TopAbs_VERTEX) LoadContent(MS);
219 }