0026937: Eliminate NO_CXX_EXCEPTION macro support
[occt.git] / src / QANewBRepNaming / QANewBRepNaming_Revol.cxx
1 // Created on: 1999-11-05
2 // Created by: Vladislav ROMASHKO
3 // Copyright (c) 1999-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <BRep_Tool.hxx>
19 #include <BRepPrimAPI_MakeRevol.hxx>
20 #include <QANewBRepNaming_Loader.hxx>
21 #include <QANewBRepNaming_Revol.hxx>
22 #include <Standard_NullObject.hxx>
23 #include <TColStd_ListOfInteger.hxx>
24 #include <TDataStd_Name.hxx>
25 #include <TDF_Label.hxx>
26 #include <TNaming_Builder.hxx>
27 #include <TopExp.hxx>
28 #include <TopExp_Explorer.hxx>
29 #include <TopoDS.hxx>
30 #include <TopoDS_Iterator.hxx>
31 #include <TopoDS_Shape.hxx>
32 #include <TopTools_DataMapOfShapeShape.hxx>
33
34 //=======================================================================
35 //function : QANewBRepNaming_Revol
36 //purpose  : 
37 //=======================================================================
38 QANewBRepNaming_Revol::QANewBRepNaming_Revol()
39 {}
40
41 //=======================================================================
42 //function : QANewBRepNaming_Revol
43 //purpose  : 
44 //=======================================================================
45
46 QANewBRepNaming_Revol::QANewBRepNaming_Revol(const TDF_Label& Label)
47      : QANewBRepNaming_TopNaming(Label)
48 {}
49
50 //=======================================================================
51 //function : Init
52 //purpose  : 
53 //=======================================================================
54
55 void QANewBRepNaming_Revol::Init(const TDF_Label& Label)
56 {
57   if(Label.IsNull())
58     throw Standard_NullObject("QANewBRepNaming_Revol::Init The Result label is Null ...");
59   myResultLabel = Label;
60 }
61
62 //=======================================================================
63 //function : Start
64 //purpose  : 
65 //=======================================================================
66
67 TDF_Label QANewBRepNaming_Revol::Start () const
68 {
69   return ResultLabel().FindChild(1,Standard_True);
70 }
71
72 //=======================================================================
73 //function : End
74 //purpose  : 
75 //=======================================================================
76
77 TDF_Label QANewBRepNaming_Revol::End () const
78 {
79   return ResultLabel().FindChild(2,Standard_True);
80 }
81
82 //=======================================================================
83 //function : Lateral
84 //purpose  : 
85 //=======================================================================
86
87 TDF_Label QANewBRepNaming_Revol::Lateral () const
88 {
89   return ResultLabel().FindChild(3,Standard_True);
90 }
91
92
93 //=======================================================================
94 //function : Degenerated
95 //purpose  : 
96 //=======================================================================
97
98 TDF_Label QANewBRepNaming_Revol::Degenerated() const {
99   //const TDF_Label& L = ResultLabel().NewChild();
100   const TDF_Label& L = ResultLabel().FindChild(4, Standard_True);
101 #ifdef OCCT_DEBUG
102   TDataStd_Name::Set(L, "Degenerated");
103 #endif
104   return L;
105 }
106
107
108 //=======================================================================
109 //function : Content
110 //purpose  : 
111 //=======================================================================
112
113 TDF_Label QANewBRepNaming_Revol::Content() const {
114   //const TDF_Label& L = ResultLabel().NewChild();
115   const TDF_Label& L = ResultLabel().FindChild(5, Standard_True);
116 #ifdef OCCT_DEBUG
117   TDataStd_Name::Set(L, "Content");
118 #endif
119   return L;
120 }
121
122
123 //=======================================================================
124 //function : Load (Revol)
125 //purpose  : 
126 //=======================================================================
127
128 void QANewBRepNaming_Revol::Load (BRepPrimAPI_MakeRevol& mkRevol, 
129                              const TopoDS_Shape& basis) const
130
131 {
132 /*  TopTools_DataMapOfShapeShape SubShapes;
133   for (TopExp_Explorer Exp(mkRevol.Shape(), TopAbs_FACE); Exp.More(); Exp.Next()) {
134     SubShapes.Bind(Exp.Current(),Exp.Current());
135   }
136
137   TNaming_Builder Builder(ResultLabel());
138   Builder.Generated(mkRevol.Shape());
139   
140   //Insert lateral faces : Face from Edge
141   TNaming_Builder LateralFaceBuilder(Lateral());
142   QANewBRepNaming_Loader::LoadAndOrientGeneratedShapes(mkRevol, basis, TopAbs_EDGE,
143                                                   LateralFaceBuilder, SubShapes);
144
145   //Insert Start Face
146   TNaming_Builder StartBuilder(Start());
147   TopoDS_Shape StartFace = mkRevol.FirstShape();
148   if (!StartFace.IsNull()) {
149     if (SubShapes.IsBound(StartFace)) {
150       StartFace = SubShapes(StartFace);
151     }
152     StartBuilder.Generated(StartFace);
153   }
154
155   //Insert End shapes
156   TNaming_Builder EndBuilder(End());
157   TopoDS_Shape EndFace = mkRevol.LastShape();
158   if (!EndFace.IsNull()) {
159     if (SubShapes.IsBound(EndFace)) {
160       EndFace = SubShapes(EndFace);
161     }
162     EndBuilder.Generated(EndFace);
163   }*/
164   TopTools_DataMapOfShapeShape SubShapes;
165   for (TopExp_Explorer Exp(mkRevol.Shape(), TopAbs_FACE); Exp.More(); Exp.Next()) {
166     SubShapes.Bind(Exp.Current(),Exp.Current());
167   }
168
169   Handle(TDF_TagSource) Tagger = TDF_TagSource::Set(ResultLabel());
170   if (Tagger.IsNull()) return;
171   Tagger->Set(0);
172
173   TNaming_Builder Builder(ResultLabel());
174   Builder.Generated(basis,mkRevol.Shape());
175   
176   //Insert lateral faces : Face from Edge
177   TNaming_Builder LateralFaceBuilder(Lateral());
178   QANewBRepNaming_Loader::LoadAndOrientGeneratedShapes(mkRevol, basis, TopAbs_EDGE,
179                                                   LateralFaceBuilder, SubShapes);
180
181   Standard_Boolean makeTopBottom = Standard_True;
182   if (basis.ShapeType() == TopAbs_COMPOUND) {
183     TopoDS_Iterator itr(basis);
184     if (itr.More() && itr.Value().ShapeType() == TopAbs_WIRE) makeTopBottom = Standard_False;
185   } else if (basis.ShapeType() == TopAbs_WIRE || basis.ShapeType() == TopAbs_EDGE) {
186     makeTopBottom = Standard_False;
187   }
188   if (makeTopBottom) {
189     //Insert start face
190     TopoDS_Shape StartFace = mkRevol.FirstShape();
191     if (!StartFace.IsNull()) {
192       if (StartFace.ShapeType() != TopAbs_COMPOUND) {
193         TNaming_Builder StartBuilder(Start());  
194         if (SubShapes.IsBound(StartFace)) {
195           StartFace = SubShapes(StartFace);
196         }
197         StartBuilder.Generated(StartFace);
198       } else {
199         TopoDS_Iterator itr(StartFace);
200         for (; itr.More(); itr.Next()) {
201           TNaming_Builder StartBuilder(Start());  
202           StartBuilder.Generated(itr.Value());
203         }
204       }
205     }
206     
207     //Insert end face
208     TopoDS_Shape EndFace = mkRevol.LastShape();
209     if (!EndFace.IsNull()) {
210       if (EndFace.ShapeType() != TopAbs_COMPOUND) {
211         TNaming_Builder EndBuilder(End());
212         if (SubShapes.IsBound(EndFace)) {
213           EndFace = SubShapes(EndFace);
214         }
215         EndBuilder.Generated(EndFace);
216       } else {
217         TopoDS_Iterator itr(EndFace);
218         for (; itr.More(); itr.Next()) {
219           TNaming_Builder EndBuilder(End());  
220           EndBuilder.Generated(itr.Value());
221         }
222       }
223     }
224   }
225
226   // Insert dangle edges and vertices:
227   if (QANewBRepNaming_Loader::HasDangleShapes(mkRevol.Shape())) {
228     if (mkRevol.Shape().ShapeType() == TopAbs_COMPOUND) {
229       TopoDS_Iterator itr(mkRevol.Shape());
230       for (; itr.More(); itr.Next()) {
231         QANewBRepNaming_Loader::LoadDangleShapes(itr.Value(), ResultLabel());
232       }
233     } else {
234       QANewBRepNaming_Loader::LoadDangleShapes(mkRevol.Shape(), ResultLabel());
235     }
236   }
237
238   // Insert degenerated shapes:
239   TopTools_IndexedMapOfShape allEdges;
240   TopExp::MapShapes(mkRevol.Shape(), TopAbs_EDGE, allEdges);
241   Standard_Integer i = 1;
242   TColStd_ListOfInteger goodEdges;
243   for (; i <= allEdges.Extent(); i++) {
244     if (BRep_Tool::Degenerated(TopoDS::Edge(allEdges.FindKey(i)))) {
245       TNaming_Builder DegeneratedBuilder(Degenerated()); 
246       DegeneratedBuilder.Generated(allEdges.FindKey(i));
247     }      
248   }
249
250   // The content of the result:
251   if (mkRevol.Shape().ShapeType() == TopAbs_COMPOUND) {
252     TopoDS_Iterator itr(mkRevol.Shape());
253     while (itr.More() && itr.Value().ShapeType() == TopAbs_SOLID) {
254       TNaming_Builder aContentBuilder(Content());
255       aContentBuilder.Generated(itr.Value());
256       itr.Next();
257     }
258   }
259 }  
260
261
262