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