1 // Created on: 1999-04-27
2 // Created by: Pavel DURANDIN
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 <ShapeAnalysis_Edge.hxx>
19 #include <ShapeExtend_WireData.hxx>
20 #include <ShapeFix_WireSegment.hxx>
21 #include <TopoDS_Edge.hxx>
22 #include <TopoDS_Vertex.hxx>
23 #include <TopoDS_Wire.hxx>
24
25 //=======================================================================
26 //function : ShapeFix_WireSegment
27 //purpose :
28 //=======================================================================
ShapeFix_WireSegment()29 ShapeFix_WireSegment::ShapeFix_WireSegment()
30 {
31 Clear();
32 myOrient = TopAbs_FORWARD;
33 }
34
35 //=======================================================================
36 //function : ShapeFix_WireSegment
37 //purpose :
38 //=======================================================================
39
ShapeFix_WireSegment(const Handle (ShapeExtend_WireData)& wire,const TopAbs_Orientation ori)40 ShapeFix_WireSegment::ShapeFix_WireSegment(const Handle(ShapeExtend_WireData)& wire,
41 const TopAbs_Orientation ori)
42 {
43 Load ( wire );
44 myOrient = ori;
45 }
46
47 //=======================================================================
48 //function : Clear
49 //purpose :
50 //=======================================================================
51
Clear()52 void ShapeFix_WireSegment::Clear()
53 {
54 myWire = new ShapeExtend_WireData;
55 myWire->ManifoldMode() = Standard_False;
56 myIUMin = new TColStd_HSequenceOfInteger;
57 myIUMax = new TColStd_HSequenceOfInteger;
58 myIVMin = new TColStd_HSequenceOfInteger;
59 myIVMax = new TColStd_HSequenceOfInteger;
60 myVertex = TopoDS_Vertex();
61 }
62
63 //=======================================================================
64 //function : Load
65 //purpose :
66 //=======================================================================
67
Load(const Handle (ShapeExtend_WireData)& wire)68 void ShapeFix_WireSegment::Load (const Handle(ShapeExtend_WireData)& wire)
69 {
70 // myWire = wire;
71 Clear();
72 myWire->ManifoldMode() = wire->ManifoldMode();
73 for ( Standard_Integer i=1; i <= wire->NbEdges(); i++ )
74 AddEdge ( i, wire->Edge(i) );
75 }
76
77 //=======================================================================
78 //function : WireData
79 //purpose :
80 //=======================================================================
81
Handle(ShapeExtend_WireData)82 const Handle(ShapeExtend_WireData)& ShapeFix_WireSegment::WireData() const
83 {
84 return myWire;
85 }
86
87 //=======================================================================
88 //function : Orientation
89 //purpose :
90 //=======================================================================
91
Orientation(const TopAbs_Orientation ori)92 void ShapeFix_WireSegment::Orientation(const TopAbs_Orientation ori)
93 {
94 myOrient = ori;
95 }
96
97 //=======================================================================
98 //function : Orientation
99 //purpose :
100 //=======================================================================
101
Orientation() const102 TopAbs_Orientation ShapeFix_WireSegment::Orientation() const
103 {
104 return myOrient;
105 }
106
107 //=======================================================================
108 //function : FirstVertex
109 //purpose :
110 //=======================================================================
111
FirstVertex() const112 TopoDS_Vertex ShapeFix_WireSegment::FirstVertex() const
113 {
114 ShapeAnalysis_Edge sae;
115 return sae.FirstVertex (myWire->Edge(1));
116 }
117
118 //=======================================================================
119 //function : LastVertex
120 //purpose :
121 //=======================================================================
122
LastVertex() const123 TopoDS_Vertex ShapeFix_WireSegment::LastVertex() const
124 {
125 ShapeAnalysis_Edge sae;
126 return sae.LastVertex (myWire->Edge(myWire->NbEdges()));
127 }
128
129 //=======================================================================
130 //function : IsClosed
131 //purpose :
132 //=======================================================================
133
IsClosed() const134 Standard_Boolean ShapeFix_WireSegment::IsClosed() const
135 {
136 TopoDS_Vertex v;
137 v = FirstVertex();
138 return v.IsSame(LastVertex());
139 }
140
141 //=======================================================================
142 // WORK with EDGES and PATCH INDICES
143 //=======================================================================
144
145 #define MININD -32000
146 #define MAXIND 32000
147
148 //=======================================================================
149 //function : NbEdges
150 //purpose :
151 //=======================================================================
152
NbEdges() const153 Standard_Integer ShapeFix_WireSegment::NbEdges() const
154 {
155 return myWire->NbEdges();
156 }
157
158 //=======================================================================
159 //function : Edge
160 //purpose :
161 //=======================================================================
162
Edge(const Standard_Integer i) const163 TopoDS_Edge ShapeFix_WireSegment::Edge (const Standard_Integer i) const
164 {
165
166 return myWire->Edge(i);
167 }
168
169 //=======================================================================
170 //function : SetEdge
171 //purpose :
172 //=======================================================================
173
SetEdge(const Standard_Integer i,const TopoDS_Edge & edge)174 void ShapeFix_WireSegment::SetEdge (const Standard_Integer i,
175 const TopoDS_Edge &edge)
176 {
177 myWire->Set ( edge, i );
178 }
179
180 //=======================================================================
181 //function : AddEdge
182 //purpose :
183 //=======================================================================
184
AddEdge(const Standard_Integer i,const TopoDS_Edge & edge)185 void ShapeFix_WireSegment::AddEdge (const Standard_Integer i,
186 const TopoDS_Edge &edge)
187 {
188 AddEdge ( i, edge, MININD, MAXIND, MININD, MAXIND );
189 }
190
191 //=======================================================================
192 //function : AddEdge
193 //purpose :
194 //=======================================================================
195
AddEdge(const Standard_Integer i,const TopoDS_Edge & edge,const Standard_Integer iumin,const Standard_Integer iumax,const Standard_Integer ivmin,const Standard_Integer ivmax)196 void ShapeFix_WireSegment::AddEdge (const Standard_Integer i,
197 const TopoDS_Edge &edge,
198 const Standard_Integer iumin,
199 const Standard_Integer iumax,
200 const Standard_Integer ivmin,
201 const Standard_Integer ivmax)
202 {
203 myWire->Add ( edge, i );
204 if ( i ==0 ) {
205 myIUMin->Append ( iumin );
206 myIUMax->Append ( iumax );
207 myIVMin->Append ( ivmin );
208 myIVMax->Append ( ivmax );
209 }
210 else {
211 myIUMin->InsertBefore ( i, iumin );
212 myIUMax->InsertBefore ( i, iumax );
213 myIVMin->InsertBefore ( i, ivmin );
214 myIVMax->InsertBefore ( i, ivmax );
215 }
216 }
217
218 //=======================================================================
219 //function : SetPatchIndex
220 //purpose :
221 //=======================================================================
222
SetPatchIndex(const Standard_Integer i,const Standard_Integer iumin,const Standard_Integer iumax,const Standard_Integer ivmin,const Standard_Integer ivmax)223 void ShapeFix_WireSegment::SetPatchIndex (const Standard_Integer i,
224 const Standard_Integer iumin,
225 const Standard_Integer iumax,
226 const Standard_Integer ivmin,
227 const Standard_Integer ivmax)
228 {
229 myIUMin->SetValue ( i, iumin );
230 myIUMax->SetValue ( i, iumax );
231 myIVMin->SetValue ( i, ivmin );
232 myIVMax->SetValue ( i, ivmax );
233 }
234
235 //=======================================================================
236 //function : DefineIUMin
237 //purpose :
238 //=======================================================================
239
DefineIUMin(const Standard_Integer i,const Standard_Integer iumin)240 void ShapeFix_WireSegment::DefineIUMin (const Standard_Integer i,
241 const Standard_Integer iumin)
242 {
243 if ( myIUMin->Value(i) < iumin ) myIUMin->SetValue ( i, iumin );
244 #ifdef OCCT_DEBUG
245 if ( myIUMin->Value(i) > myIUMax->Value(i) )
246 std::cout << "Warning: ShapeFix_WireSegment::DefineIUMin: indexation error" << std::endl;
247 #endif
248 }
249
250 //=======================================================================
251 //function : DefineIUMax
252 //purpose :
253 //=======================================================================
254
DefineIUMax(const Standard_Integer i,const Standard_Integer iumax)255 void ShapeFix_WireSegment::DefineIUMax (const Standard_Integer i,
256 const Standard_Integer iumax)
257 {
258 if ( myIUMax->Value(i) > iumax ) myIUMax->SetValue ( i, iumax );
259 #ifdef OCCT_DEBUG
260 Standard_Integer iun = myIUMin->Value(i), iux = myIUMax->Value(i);
261 if ( iun > iux )
262 std::cout << "Warning: ShapeFix_WireSegment::DefineIUMax: indexation error" << std::endl;
263 #endif
264 }
265
266 //=======================================================================
267 //function : DefineIVMin
268 //purpose :
269 //=======================================================================
270
DefineIVMin(const Standard_Integer i,const Standard_Integer ivmin)271 void ShapeFix_WireSegment::DefineIVMin (const Standard_Integer i,
272 const Standard_Integer ivmin)
273 {
274 if ( myIVMin->Value(i) < ivmin ) myIVMin->SetValue ( i, ivmin );
275 #ifdef OCCT_DEBUG
276 Standard_Integer ivn = myIVMin->Value(i), ivx = myIVMax->Value(i);
277 if ( ivn > ivx )
278 std::cout << "Warning: ShapeFix_WireSegment::DefineIVMin: indexation error" << std::endl;
279 #endif
280 }
281
282 //=======================================================================
283 //function : DefineIVMax
284 //purpose :
285 //=======================================================================
286
DefineIVMax(const Standard_Integer i,const Standard_Integer ivmax)287 void ShapeFix_WireSegment::DefineIVMax (const Standard_Integer i,
288 const Standard_Integer ivmax)
289 {
290 if ( myIVMax->Value(i) > ivmax ) myIVMax->SetValue ( i, ivmax );
291 #ifdef OCCT_DEBUG
292 Standard_Integer ivn = myIVMin->Value(i), ivx = myIVMax->Value(i);
293 if ( ivn > ivx )
294 std::cout << "Warning: ShapeFix_WireSegment::DefineIVMax: indexation error" << std::endl;
295 #endif
296 }
297
298 //=======================================================================
299 //function : GetPatchIndex
300 //purpose :
301 //=======================================================================
302
GetPatchIndex(const Standard_Integer i,Standard_Integer & iumin,Standard_Integer & iumax,Standard_Integer & ivmin,Standard_Integer & ivmax) const303 void ShapeFix_WireSegment::GetPatchIndex (const Standard_Integer i,
304 Standard_Integer &iumin,
305 Standard_Integer &iumax,
306 Standard_Integer &ivmin,
307 Standard_Integer &ivmax) const
308 {
309 iumin = myIUMin->Value(i);
310 iumax = myIUMax->Value(i);
311 ivmin = myIVMin->Value(i);
312 ivmax = myIVMax->Value(i);
313 }
314
315 //=======================================================================
316 //function : CheckPatchIndex
317 //purpose :
318 //=======================================================================
319
CheckPatchIndex(const Standard_Integer i) const320 Standard_Boolean ShapeFix_WireSegment::CheckPatchIndex (const Standard_Integer i) const
321 {
322 Standard_Integer dU = myIUMax->Value(i) - myIUMin->Value(i);
323 Standard_Integer dV = myIVMax->Value(i) - myIVMin->Value(i);
324 Standard_Boolean ok = ( dU ==0 || dU ==1 ) && ( dV ==0 || dV ==1 );
325 #ifdef OCCT_DEBUG
326 if ( ! ok )
327 std::cout << "Warning: ShapeFix_WireSegment::CheckPatchIndex: incomplete indexation" << std::endl;
328 #endif
329 return ok;
330 }
331
332 //=======================================================================
333 //function : SetVertex
334 //purpose :
335 //=======================================================================
336
SetVertex(const TopoDS_Vertex & theVertex)337 void ShapeFix_WireSegment::SetVertex(const TopoDS_Vertex& theVertex)
338 {
339 myVertex = theVertex;
340 //SetVertex(theVertex, MININD, MAXIND, MININD, MAXIND);
341 }
342
343 /*//=======================================================================
344 //function : SetVertex
345 //purpose :
346 //=======================================================================
347
348 void ShapeFix_WireSegment::SetVertex(const TopoDS_Vertex& theVertex,
349 Standard_Integer iumin,
350 Standard_Integer iumax,
351 Standard_Integer ivmin,
352 Standard_Integer ivmax)
353 myVertex = theVertex;
354 myIUMin->Append ( iumin );
355 myIUMax->Append ( iumax );
356 myIVMin->Append ( ivmin );
357 myIVMax->Append ( ivmax );
358 }
359 */
360 //=======================================================================
361 //function : GetVertex
362 //purpose :
363 //=======================================================================
364
GetVertex() const365 TopoDS_Vertex ShapeFix_WireSegment::GetVertex() const
366 {
367 return myVertex;
368 }
369
370 //=======================================================================
371 //function : IsVertex
372 //purpose :
373 //=======================================================================
374
IsVertex() const375 Standard_Boolean ShapeFix_WireSegment::IsVertex() const
376 {
377 return !myVertex.IsNull();
378 }
379