0024428: Implementation of LGPL license
[occt.git] / src / BRepAlgo / BRepAlgo_EdgeConnector.cxx
1 // Created on: 1997-08-22
2 // Created by: Prestataire Mary FABIEN
3 // Copyright (c) 1997-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
9 // under the terms of the GNU Lesser General Public 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 #include <BRepAlgo_EdgeConnector.ixx>
18
19 #include <TopoDS_Shape.hxx>
20 #include <TopTools_ListOfShape.hxx>
21 #include <TopTools_ListIteratorOfListOfShape.hxx>
22 #include <TopoDS_Wire.hxx>
23 #include <BRep_Builder.hxx>
24 #include <TopOpeBRepBuild_ShapeSet.hxx>
25 #include <TopOpeBRepBuild_BlockIterator.hxx>
26 #include <TopOpeBRepBuild_BlockBuilder.hxx>
27 #include <BRepAlgo_DataMapOfShapeBoolean.hxx>
28
29 //=======================================================================
30 //function : Create
31 //purpose  : 
32 //=======================================================================
33
34 BRepAlgo_EdgeConnector::BRepAlgo_EdgeConnector()
35 :myIsDone(Standard_False)
36 {
37   myListeOfEdge.Clear();
38 }
39
40 //=======================================================================
41 //function : Add
42 //purpose  : 
43 //=======================================================================
44
45 void BRepAlgo_EdgeConnector::Add(const TopoDS_Edge& e)
46 {
47   if(e.IsNull()) return;
48   myListeOfEdge.Append(e);
49 }
50
51 //=======================================================================
52 //function : Add
53 //purpose  : 
54 //=======================================================================
55
56 void BRepAlgo_EdgeConnector::Add(TopTools_ListOfShape& LOEdge)
57 {
58   if(LOEdge.IsEmpty()) return;
59   myListeOfEdge.Append(LOEdge);
60 }
61
62 //=======================================================================
63 //function : AddStart
64 //purpose  : 
65 //=======================================================================
66
67 void BRepAlgo_EdgeConnector::AddStart(const TopoDS_Shape& e)
68 {
69   if(e.IsNull()) return;
70   myListeOfStartEdge.Append(e);
71 }
72
73 //=======================================================================
74 //function : AddStart
75 //purpose  : 
76 //=======================================================================
77
78 void BRepAlgo_EdgeConnector::AddStart(TopTools_ListOfShape& LOEdge)
79 {
80   if(LOEdge.IsEmpty()) return;
81   myListeOfStartEdge.Append(LOEdge);
82 }
83
84 //=======================================================================
85 //function : ClearStartElement
86 //purpose  : 
87 //=======================================================================
88
89 void BRepAlgo_EdgeConnector::ClearStartElement()
90 {
91   myListeOfStartEdge.Clear();
92 }
93
94 //=======================================================================
95 //function : MakeBlock
96 //purpose  : 
97 //=======================================================================
98
99 TopTools_ListOfShape& BRepAlgo_EdgeConnector::MakeBlock()
100 {
101   Standard_Boolean b;
102   if(myListeOfStartEdge.IsEmpty()) return myListeOfStartEdge;
103   TopOpeBRepBuild_ShapeSet SS(TopAbs_VERTEX);
104   myResultMap.Clear();
105   myResultList.Clear();
106   TopTools_ListIteratorOfListOfShape it(myListeOfEdge);
107   for(;it.More();it.Next()) {
108     const TopoDS_Shape& edge = it.Value();
109     SS.AddElement(edge);
110   }
111   it.Initialize(myListeOfStartEdge);
112   for(;it.More();it.Next()) {
113     const TopoDS_Shape& edge = it.Value();
114     SS.AddStartElement(edge);
115   }
116   myBlockB.MakeBlock(SS);
117   BRep_Builder WireB;
118   for(myBlockB.InitBlock();myBlockB.MoreBlock();myBlockB.NextBlock()) {
119 //#ifndef DEB
120     TopOpeBRepBuild_BlockIterator BI = myBlockB.BlockIterator();
121 //#else
122 //    TopOpeBRepBuild_BlockIterator& BI = myBlockB.BlockIterator();
123 //#endif
124     TopoDS_Wire W;
125     WireB.MakeWire(W);
126     for(BI.Initialize();BI.More();BI.Next()) {
127       const TopoDS_Shape& CurrentE = myBlockB.Element(BI);
128       WireB.Add(W, CurrentE);
129     }
130     b = myBlockB.CurrentBlockIsRegular();
131     myResultMap.Bind(W, b);
132     myResultList.Append(W);
133   }
134   Done();
135   return myResultList;
136 }
137
138 //=======================================================================
139 //function : IsWire
140 //purpose  : 
141 //=======================================================================
142
143 Standard_Boolean BRepAlgo_EdgeConnector::IsWire(const TopoDS_Shape& S)
144 {
145   if(!myResultMap.IsBound(S)) {
146     return Standard_False;
147   }
148   Standard_Boolean b = Standard_False;
149   myBlockB.InitBlock();
150   TopTools_ListIteratorOfListOfShape LI(myResultList);
151   for(;myBlockB.MoreBlock();myBlockB.NextBlock(),LI.Next()) {
152     if(S == LI.Value()) {
153       b = myBlockB.CurrentBlockIsRegular();
154       break;
155     }
156   }
157   return b;
158 }
159
160 //=======================================================================
161 //function : IsDone
162 //purpose  : 
163 //=======================================================================
164
165
166 Standard_Boolean BRepAlgo_EdgeConnector::IsDone() const
167 {
168   return myIsDone;
169 }
170
171 //=======================================================================
172 //function : Done
173 //purpose  : 
174 //=======================================================================
175
176
177 void BRepAlgo_EdgeConnector::Done()
178 {
179   myIsDone = Standard_True;
180 }
181