0024023: Revamp the OCCT Handle -- ambiguity
[occt.git] / src / BRepOffsetAPI / BRepOffsetAPI_DraftAngle.cxx
CommitLineData
b311480e 1// Created on: 1995-02-22
2// Created by: Jacques GOUSSARD
3// Copyright (c) 1995-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
17#include <BRepOffsetAPI_DraftAngle.ixx>
18
19#include <Draft_Modification.hxx>
20#include <TopoDS.hxx>
21#include <Geom_Surface.hxx>
22#include <TopLoc_Location.hxx>
23
24#include <TopTools_ListIteratorOfListOfShape.hxx>
25
26#include <BRepLib.hxx>
27#include <BRepFill_DataMapOfShapeSequenceOfReal.hxx>
28#include <TopTools_DataMapOfShapeSequenceOfShape.hxx>
29#include <TopTools_SequenceOfShape.hxx>
30#include <TopoDS_Iterator.hxx>
31#include <TopExp_Explorer.hxx>
32#include <BRepTools.hxx>
33#include <TColgp_SequenceOfPnt.hxx>
34#include <TColStd_SequenceOfReal.hxx>
35#include <TopOpeBRep_EdgesIntersector.hxx>
36#include <TopOpeBRep_Point2d.hxx>
37#include <Precision.hxx>
38#include <BRepFill_DataMapIteratorOfDataMapOfShapeSequenceOfReal.hxx>
39#include <BRepOffsetAPI_SequenceOfSequenceOfReal.hxx>
40#include <BRepOffsetAPI_SequenceOfSequenceOfShape.hxx>
41#include <BRepTools_Substitution.hxx>
42#include <BRep_Builder.hxx>
43#include <TopExp.hxx>
44#include <BRep_Tool.hxx>
45#include <BRepAdaptor_Curve.hxx>
46#include <BRepLib_MakeVertex.hxx>
47#include <BRep_TEdge.hxx>
48#include <BRep_ListIteratorOfListOfCurveRepresentation.hxx>
49#include <BRep_GCurve.hxx>
50#include <TopoDS_Wire.hxx>
51#include <BRepAdaptor_Curve2d.hxx>
ec357c5c 52#include <Geom2d_Curve.hxx>
7fd59977 53
54//=======================================================================
55//function : BRepOffsetAPI_DraftAngle
56//purpose :
57//=======================================================================
58
59BRepOffsetAPI_DraftAngle::BRepOffsetAPI_DraftAngle () {}
60
61
62//=======================================================================
63//function : BRepOffsetAPI_DraftAngle
64//purpose :
65//=======================================================================
66
67BRepOffsetAPI_DraftAngle::BRepOffsetAPI_DraftAngle (const TopoDS_Shape& S)
68{
69 myInitialShape = S;
70 myModification = new Draft_Modification(S);
71}
72
73
74//=======================================================================
75//function : Clear
76//purpose :
77//=======================================================================
78
79void BRepOffsetAPI_DraftAngle::Clear ()
80{
81 if (!myModification.IsNull()) {
c5f3a425 82 Handle(Draft_Modification)::DownCast (myModification)->Clear();
7fd59977 83 }
84}
85
86
87//=======================================================================
88//function : Init
89//purpose :
90//=======================================================================
91
92void BRepOffsetAPI_DraftAngle::Init (const TopoDS_Shape& S)
93{
94 myInitialShape = S;
95 NotDone();
96 if (!myModification.IsNull()) {
c5f3a425 97 Handle(Draft_Modification)::DownCast (myModification)->Init(S);
7fd59977 98 }
99 else {
100 myModification = new Draft_Modification(S);
101 }
102}
103
104
105//=======================================================================
106//function : Add
107//purpose :
108//=======================================================================
109
110void BRepOffsetAPI_DraftAngle::Add(const TopoDS_Face& F,
111 const gp_Dir& D,
112 const Standard_Real Angle,
113 const gp_Pln& Plane,
114 const Standard_Boolean Flag)
115{
116// POP-DPF : protection
117 if ( Abs(Angle) <= 1.e-04 )
118 return;
119 Standard_NullObject_Raise_if(myInitialShape.IsNull(),"");
c5f3a425 120 Handle(Draft_Modification)::DownCast (myModification)->Add(F,D,Angle,Plane, Flag);
7fd59977 121}
122
123
124//=======================================================================
125//function : AddDone
126//purpose :
127//=======================================================================
128
129Standard_Boolean BRepOffsetAPI_DraftAngle::AddDone () const
130{
131 Standard_NullObject_Raise_if(myInitialShape.IsNull(),"");
c5f3a425 132 return Handle(Draft_Modification)::DownCast (myModification)
7fd59977 133 ->ProblematicShape().IsNull();
134}
135
136
137//=======================================================================
138//function : Remove
139//purpose :
140//=======================================================================
141
142void BRepOffsetAPI_DraftAngle::Remove(const TopoDS_Face& F)
143{
144 Standard_NullObject_Raise_if(myInitialShape.IsNull(),"");
c5f3a425 145 Handle(Draft_Modification)::DownCast (myModification)->Remove(F);
7fd59977 146}
147
148
149//=======================================================================
150//function : ProblematicShape
151//purpose :
152//=======================================================================
153
154const TopoDS_Shape& BRepOffsetAPI_DraftAngle::ProblematicShape () const
155{
156 Standard_NullObject_Raise_if(myInitialShape.IsNull(),"");
c5f3a425 157 return Handle(Draft_Modification)::DownCast (myModification)->ProblematicShape();
7fd59977 158}
159
160
161//=======================================================================
162//function : ErrorStatus
163//purpose :
164//=======================================================================
165
166Draft_ErrorStatus BRepOffsetAPI_DraftAngle::Status () const
167{
168 Standard_NullObject_Raise_if(myInitialShape.IsNull(),"");
c5f3a425 169 return Handle(Draft_Modification)::DownCast (myModification)->Error();
7fd59977 170}
171
172
173//=======================================================================
174//function : ConnectedFaces
175//purpose :
176//=======================================================================
177
178const TopTools_ListOfShape& BRepOffsetAPI_DraftAngle::ConnectedFaces
179 (const TopoDS_Face& F) const
180{
181 Standard_NullObject_Raise_if(myInitialShape.IsNull(),"");
c5f3a425 182 return Handle(Draft_Modification)::DownCast (myModification)->ConnectedFaces(F);
7fd59977 183}
184
185
186//=======================================================================
187//function : ModifiedFaces
188//purpose :
189//=======================================================================
190
191const TopTools_ListOfShape& BRepOffsetAPI_DraftAngle::ModifiedFaces() const
192{
193 Standard_NullObject_Raise_if(myInitialShape.IsNull(),"");
c5f3a425 194 return Handle(Draft_Modification)::DownCast (myModification)->ModifiedFaces();
7fd59977 195}
196
197//=======================================================================
198//function : ModifiedFaces
199//purpose :
200//=======================================================================
201
202const TopTools_ListOfShape& BRepOffsetAPI_DraftAngle::Generated(const TopoDS_Shape& S)
203{
204 myGenerated.Clear();
205 Standard_NullObject_Raise_if(myInitialShape.IsNull(),"");
c5f3a425 206 Handle(Draft_Modification) DMod = Handle(Draft_Modification)::DownCast (myModification);
7fd59977 207
208 if (S.ShapeType() == TopAbs_FACE) {
209 Handle(Geom_Surface) Surf;
210 TopLoc_Location L;
211 Standard_Real Tol;
212 Standard_Boolean RW,RF;
213 if (DMod->NewSurface(TopoDS::Face(S), Surf, L, Tol, RW, RF)) {
214 myGenerated.Append(ModifiedShape (S));
215
216 }
217 }
218 return myGenerated;
219}
220
221//=======================================================================
222//function : ModifiedFaces
223//purpose :
224//=======================================================================
225
226const TopTools_ListOfShape& BRepOffsetAPI_DraftAngle::Modified(const TopoDS_Shape& S)
227{
228 myGenerated.Clear();
229 Standard_NullObject_Raise_if(myInitialShape.IsNull(),"");
c5f3a425 230 Handle(Draft_Modification) DMod = Handle(Draft_Modification)::DownCast (myModification);
7fd59977 231
232 if (S.ShapeType() == TopAbs_FACE) {
233 Handle(Geom_Surface) Surf;
234 TopLoc_Location L;
235 Standard_Real Tol;
236 Standard_Boolean RW,RF;
237
238 if (!DMod->NewSurface(TopoDS::Face(S), Surf, L, Tol, RW, RF)) {
239 // Ce n est pas une generation => peut etre une modif
240 myGenerated.Append(ModifiedShape (S));
241 if (myGenerated.Extent() == 1 && myGenerated.First().IsSame(S)) {
242 myGenerated.Clear();
243 }
244 }
245 }
246 return myGenerated;
247}
248
249
250//=======================================================================
251//function : Build
252//purpose :
253//=======================================================================
254
255void BRepOffsetAPI_DraftAngle::Build()
256{
c5f3a425 257 Handle(Draft_Modification)::DownCast (myModification)->Perform();
258 if (!Handle(Draft_Modification)::DownCast (myModification)->IsDone()) {
7fd59977 259 NotDone();
260 }
261 else {
262 DoModif(myInitialShape);
263 //BRepLib::SameParameter( myShape, 1.0e-7, Standard_True ); //patch
264 CorrectWires();
265 BRepLib::SameParameter( myShape, 1.0e-7, Standard_True ); //patch
266 }
267}
268
269//=======================================================================
270//function : CorrectWires
271//purpose :
272//=======================================================================
273
274void BRepOffsetAPI_DraftAngle::CorrectWires()
275{
276 Standard_Real TolInter = 1.e-7;
277 Standard_Integer i, j, k;
278
279 TopTools_SequenceOfShape Eseq;
280 TopTools_SequenceOfShape Wseq;
281 TopTools_SequenceOfShape Fseq;
282 TopoDS_Shape CurEdge, CurWire, CurFace;
283 TopoDS_Iterator wit, eit;
284
285 TopExp_Explorer fexp( myShape, TopAbs_FACE );
286 for (; fexp.More(); fexp.Next())
287 {
288 CurFace = fexp.Current();
289 wit.Initialize( CurFace );
290 for (; wit.More(); wit.Next())
291 {
292 CurWire = wit.Value();
293 TopTools_MapOfShape emap;
294 eit.Initialize( CurWire );
295 for (; eit.More(); eit.Next())
296 emap.Add( eit.Value() );
297 TopTools_MapIteratorOfMapOfShape mapit( emap );
298 for (; mapit.More(); mapit.Next())
299 {
300 CurEdge = mapit.Key();
301 if (BRepTools::IsReallyClosed( TopoDS::Edge(CurEdge), TopoDS::Face(CurFace) ))
302 {
303 Eseq.Append( CurEdge );
304 Wseq.Append( CurWire );
305 Fseq.Append( CurFace );
306 }
307 }
308 }
309 }
310
311 BRepFill_DataMapOfShapeSequenceOfReal Emap;
312
313 TopTools_SequenceOfShape NonSeam;
314 TopTools_SequenceOfShape NonSeamWires;
315 BRepOffsetAPI_SequenceOfSequenceOfReal ParsNonSeam;
316 BRepOffsetAPI_SequenceOfSequenceOfShape Seam;
317 BRepOffsetAPI_SequenceOfSequenceOfReal ParsSeam;
318
319 TopTools_DataMapOfShapeShape WFmap;
320 TopTools_DataMapOfShapeListOfShape WWmap;
321 for (i = 1; i <= Eseq.Length(); i++)
322 {
323 CurEdge = Eseq(i);
324 CurWire = Wseq(i);
325 CurFace = Fseq(i);
326 wit.Initialize( CurFace );
327 for (; wit.More(); wit.Next())
328 {
329 TopoDS_Shape aWire = wit.Value();
330 if (! aWire.IsSame( CurWire ))
331 {
332 TColgp_SequenceOfPnt pts;
333 TopTools_SequenceOfShape edges;
334 TColStd_SequenceOfReal pars;
335 Standard_Boolean Wadd = Standard_False;
336 eit.Initialize( aWire );
337 for (; eit.More(); eit.Next())
338 {
339 TopoDS_Shape anEdge = eit.Value();
340 TopOpeBRep_EdgesIntersector EInter;
341 EInter.SetFaces( CurFace, CurFace );
342 EInter.ForceTolerances( TolInter, TolInter );
343 EInter.Perform( CurEdge, anEdge );
344 if (EInter.IsEmpty())
345 {
346 EInter.Perform( CurEdge.Reversed(), anEdge );
347 if (EInter.IsEmpty())
348 continue;
349 }
350 Wadd = Standard_True;
351 if (! WFmap.IsBound( aWire ))
352 WFmap.Bind( aWire, CurFace );
353 Standard_Integer ind = 0;
354 for (j = 1; j <= NonSeam.Length(); j++)
355 if (anEdge.IsSame( NonSeam(j) ))
356 {
357 ind = j;
358 break;
359 }
360 if (ind == 0)
361 {
362 NonSeam.Append( anEdge );
363 NonSeamWires.Append( aWire );
364 ind = NonSeam.Length();
365 TColStd_SequenceOfReal emptyseq1, emptyseq2;
366 TopTools_SequenceOfShape emptyedgeseq;
367 ParsNonSeam.Append( emptyseq1 );
368 Seam.Append( emptyedgeseq );
369 ParsSeam.Append( emptyseq2 );
370 }
371 if (! Emap.IsBound( CurEdge ))
372 {
373 TColStd_SequenceOfReal emptyseq;
374 Emap.Bind( CurEdge, emptyseq );
375 }
376 EInter.InitPoint();
377 for (; EInter.MorePoint(); EInter.NextPoint())
378 {
379 const TopOpeBRep_Point2d& bp = EInter.Point();
380 if (bp.IsVertex(2))
381 {
382 gp_Pnt Pnt = bp.Value();
383 Standard_Integer ied = 0;
384 for (j = 1; j <= pts.Length(); j++)
385 if (Pnt.IsEqual( pts(j), Precision::Confusion() ))
386 {
387 ied = j;
388 break;
389 }
390 if (ied == 0)
391 {
392 pts.Append( Pnt );
393 edges.Append( anEdge );
394 pars.Append( bp.Parameter(2) );
395 Emap(CurEdge).Append( bp.Parameter(1) );
396 ParsNonSeam(ind).Append( bp.Parameter(2) );
397 Seam(ind).Append( CurEdge );
398 ParsSeam(ind).Append( bp.Parameter(1) );
399 }
400 /*
401 else
402 {
403 Standard_Real ParOnSeam = bp.Parameter(1);
404 Standard_Real Par1 = pars(ied);
405 Standard_Real Par2 = bp.Parameter(2);
406 BRepAdaptor_Curve2d SeamCurve( CurEdge, CurFace );
407 BRepAdaptor_Curve2d Curve1( edges(ied), CurFace );
408 BRepAdaptor_Curve2d Curve2( anEdge. CurFace );
409 gp_Pnt2d P2d;
410 gp_Vec2d SeamDer, Der1, Der2;
411 //SeamCurve->D1( ParOnSeam, P2d, SeamDer );
412 //Curve1->D1( Par1, P2d, Der1 );
413 //Curve2->D1( Par2, P2d, Der2 );
414 Standard_Real Crossed1 = SeamDer ^ Der1;
415 Standard_Real Crossed2 = SeamDer ^ Der2;
416 //if (Crossed1 > 0
417 }
418 */
419 }
420 else // ! bp.IsVertex(2)
421 {
422 //Temporary the case of tangency is not implemented
423 Emap(CurEdge).Append( bp.Parameter(1) );
424 ParsNonSeam(ind).Append( bp.Parameter(2) );
425 Seam(ind).Append( CurEdge );
426 ParsSeam(ind).Append( bp.Parameter(1) );
427 }
428 } //for (; EInter.MorePoint(); EInter.NextPoint())
429 } //for (; eit.More(); eit.Next())
430 if (Wadd)
431 {
432 if (! WWmap.IsBound( CurWire ))
433 {
434 TopTools_ListOfShape emptylist;
435 WWmap.Bind( CurWire, emptylist );
436 }
437 WWmap(CurWire).Append( aWire );
438 }
439 } //if (! aWire.IsSame( CurWire ))
440 } //for (; wit.More(); wit.Next())
441 } //for (i = 1; i <= Eseq.Length(); i++)
442
443 //Sorting
444 for (i = 1; i <= NonSeam.Length(); i++)
445 for (j = 1; j < ParsNonSeam(i).Length(); j++)
446 for (k = j+1; k <= ParsNonSeam(i).Length(); k++)
447 if (ParsNonSeam(i)(k) < ParsNonSeam(i)(j))
448 {
449 Standard_Real temp = ParsNonSeam(i)(j);
450 ParsNonSeam(i)(j) = ParsNonSeam(i)(k);
451 ParsNonSeam(i)(k) = temp;
452 TopoDS_Shape tmp = Seam(i)(j);
453 Seam(i)(j) = Seam(i)(k);
454 Seam(i)(k) = tmp;
455 temp = ParsSeam(i)(j);
456 ParsSeam(i)(j) = ParsSeam(i)(k);
457 ParsSeam(i)(k) = temp;
458 }
459 BRepFill_DataMapIteratorOfDataMapOfShapeSequenceOfReal iter( Emap );
460 for (; iter.More(); iter.Next())
461 {
462 TColStd_SequenceOfReal Seq;
463 Seq = iter.Value();
464 for (i = 1; i < Seq.Length(); i++)
465 for (j = i+1; j <= Seq.Length(); j++)
466 if (Seq(j) < Seq(i))
467 {
468 Standard_Real temp = Seq(i);
469 Seq(i) = Seq(j);
470 Seq(j) = temp;
471 }
472 Emap( iter.Key() ) = Seq;
473 }
474 BRepFill_DataMapOfShapeSequenceOfReal EPmap;
475 TopTools_DataMapOfShapeSequenceOfShape EVmap; //Seam
476 TopTools_DataMapOfShapeSequenceOfShape EWmap; //Seam and wires intersecting it
477 iter.Initialize( Emap );
478 for (; iter.More(); iter.Next())
479 {
480 TColStd_SequenceOfReal parseq;
481 EPmap.Bind( iter.Key(), parseq );
482 TopTools_SequenceOfShape shapeseq;
483 EVmap.Bind( iter.Key(), shapeseq );
484 TopTools_SequenceOfShape shapeseq2;
485 EWmap.Bind( iter.Key(), shapeseq2 );
486 }
487
488 //Reconstruction of non-seam edges
489 BRepTools_Substitution aSub;
490 BRep_Builder BB;
491 for (i = 1; i <= NonSeam.Length(); i++)
492 {
493 TopoDS_Edge anEdge = TopoDS::Edge( NonSeam(i) );
494 TopTools_ListOfShape NewEdges;
495 TopoDS_Edge NewE;
496 TopoDS_Vertex Vfirst, Vlast;
497 TopExp::Vertices( anEdge, Vfirst, Vlast );
498 Standard_Real par, FirstPar, LastPar;
499 BRep_Tool::Range( anEdge, FirstPar, LastPar );
500 Standard_Integer firstind = 1;
501 par = ParsNonSeam(i)(1);
502 TopoDS_Edge SeamEdge = TopoDS::Edge( Seam(i)(1) );
503 //Find the face
504 for (j = 1; j <= Eseq.Length(); j++)
505 if (SeamEdge.IsSame( Eseq(j) ))
506 break;
507 TopoDS_Face theFace = TopoDS::Face( Fseq(j) );
508 TopLoc_Location L;
509 Handle( Geom_Surface ) theSurf = BRep_Tool::Surface( theFace, L );
510 if (Abs(par-FirstPar) <= Precision::Confusion())
511 {
512 BB.UpdateVertex( Vfirst, ParsSeam(i)(1), SeamEdge, BRep_Tool::Tolerance(Vfirst) );
513 EPmap( SeamEdge ).Append( ParsSeam(i)(1) );
514 EVmap( SeamEdge ).Append( Vfirst );
515 EWmap( SeamEdge ).Append( NonSeamWires(i) );
516 firstind = 2;
517 }
518 Standard_Real prevpar = FirstPar;
519 TopoDS_Vertex PrevV = Vfirst;
520 for (j = firstind; j <= ParsNonSeam(i).Length(); j++)
521 {
522 TopoDS_Shape aLocalShape = anEdge.EmptyCopied();
523 NewE = TopoDS::Edge( aLocalShape );
524 //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
525 TopoDS_Vertex NewV;
526 par = ParsNonSeam(i)(j);
527 BB.Range( NewE, prevpar, par );
528 SeamEdge = TopoDS::Edge( Seam(i)(j) );
529 if (j == ParsNonSeam(i).Length() && Abs(par-LastPar) <= Precision::Confusion())
530 {
531 NewV = Vlast;
532 if (firstind == 2 && j == 2)
533 {
534 BB.UpdateVertex( Vlast, ParsSeam(i)(j), SeamEdge, BRep_Tool::Tolerance(Vlast) );
535 EPmap( SeamEdge ).Append( ParsSeam(i)(j) );
536 EVmap( SeamEdge ).Append( Vlast );
537 EWmap( SeamEdge ).Append( NonSeamWires(i) );
538 break;
539 }
540 }
541 else
542 {
543 BRepAdaptor_Curve bcur( NewE );
544 gp_Pnt Point = bcur.Value( par );
545 NewV = BRepLib_MakeVertex( Point );
546 BB.UpdateVertex( NewV, par, NewE, 10.*Precision::Confusion() );
547 }
548 BB.UpdateVertex( NewV, ParsSeam(i)(j), SeamEdge, 10.*Precision::Confusion() );
549 NewE.Orientation( TopAbs_FORWARD );
550 BB.Add( NewE, PrevV.Oriented(TopAbs_FORWARD) );
551 BB.Add( NewE, NewV.Oriented(TopAbs_REVERSED) );
552
553 NewEdges.Append( NewE );
554 EPmap( SeamEdge ).Append( ParsSeam(i)(j) );
555 EVmap( SeamEdge ).Append( NewV );
556 EWmap( SeamEdge ).Append( NonSeamWires(i) );
557
558 prevpar = par;
559 PrevV = NewV;
560 }
561 //The last edge
562 TopoDS_Shape aLocalShape = anEdge.EmptyCopied();
563 NewE = TopoDS::Edge( aLocalShape );
564 //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
565 par = LastPar;
566 if (Abs(prevpar-par) > Precision::Confusion())
567 {
568 BB.Range( NewE, prevpar, par );
569 NewE.Orientation( TopAbs_FORWARD );
570 BB.Add( NewE, PrevV.Oriented(TopAbs_FORWARD) );
571 BB.Add( NewE, Vlast.Oriented(TopAbs_REVERSED) );
572 NewEdges.Append( NewE );
573 }
574
575 //Substitute anEdge by NewEdges
576 aSub.Substitute( anEdge, NewEdges );
577 }
578
579 //Sorting of EPmap and EVmap and removing repeating points from them
580 iter.Initialize( EPmap );
581 for (; iter.More(); iter.Next())
582 {
583 TColStd_SequenceOfReal Seq;
584 Seq = iter.Value();
585 TopTools_SequenceOfShape SeqShape;
586 SeqShape = EVmap( iter.Key() );
587 TopTools_SequenceOfShape SeqShape2;
588 SeqShape2 = EWmap( iter.Key() );
589 for (i = 1; i < Seq.Length(); i++)
590 for (j = i+1; j <= Seq.Length(); j++)
591 if (Seq(j) < Seq(i))
592 {
593 Standard_Real temp = Seq(i);
594 Seq(i) = Seq(j);
595 Seq(j) = temp;
596 TopoDS_Shape tmp = SeqShape(i);
597 SeqShape(i) = SeqShape(j);
598 SeqShape(j) = tmp;
599 tmp = SeqShape2(i);
600 SeqShape2(i) = SeqShape2(j);
601 SeqShape2(j) = tmp;
602 }
603 EPmap( iter.Key() ) = Seq;
604 EVmap( iter.Key() ) = SeqShape;
605 EWmap( iter.Key() ) = SeqShape2;
606 }
607 iter.Initialize( EPmap );
608 for (; iter.More(); iter.Next())
609 {
610 TColStd_SequenceOfReal Seq;
611 Seq = iter.Value();
612 TopTools_SequenceOfShape SeqShape;
613 SeqShape = EVmap( iter.Key() );
614 TopTools_SequenceOfShape SeqShape2;
615 SeqShape2 = EWmap( iter.Key() );
616 Standard_Boolean remove = Standard_True;
617 while (remove)
618 {
619 remove = Standard_False;
620 for (i = 1; i < Seq.Length(); i++)
621 if (Abs(Seq(i)-Seq(i+1)) <= Precision::Confusion())
622 {
623 Seq.Remove(i+1);
624 SeqShape.Remove(i+1);
625 SeqShape2.Remove(i+1);
626 remove = Standard_True;
627 }
628 }
629 EPmap( iter.Key() ) = Seq;
630 EVmap( iter.Key() ) = SeqShape;
631 EWmap( iter.Key() ) = SeqShape2;
632 }
633
634 //Reconstruction of seam edges
635 TopTools_DataMapOfShapeShape VEmap;
636 iter.Initialize( Emap );
637 for (; iter.More(); iter.Next())
638 {
639 TopoDS_Edge anEdge = TopoDS::Edge( iter.Key() );
640 Standard_Boolean onepoint = Standard_False;
641 TopTools_ListOfShape NewEdges;
642 TColStd_SequenceOfReal Seq;
643 Seq = iter.Value();
644 TColStd_SequenceOfReal Seq2;
645 Seq2 = EPmap( anEdge );
646 TopTools_SequenceOfShape SeqVer;
647 SeqVer = EVmap( anEdge );
648 TopTools_SequenceOfShape SeqWire;
649 SeqWire = EWmap( anEdge );
650 TopoDS_Vertex Vfirst, Vlast;
651 TopExp::Vertices( anEdge, Vfirst, Vlast );
652 Standard_Real fpar, lpar, FirstPar, LastPar;
653 BRep_Tool::Range( anEdge, FirstPar, LastPar );
654 fpar = FirstPar;
655 lpar = Seq(1);
656 TopoDS_Edge NewE;
657 Standard_Integer firstind = 1;
658 if (Abs(fpar-lpar) <= Precision::Confusion())
659 {
660 firstind = 2;
661 fpar = Seq(1);
662 lpar = Seq(2);
663 }
664 else
665 {
666 if (Seq.Length()%2 != 0)
667 {
668 VEmap.Bind( Vfirst, anEdge );
669 firstind = 2;
670 fpar = Seq(1);
671 if (Seq.Length() > 2)
672 lpar = Seq(2);
673 else
674 onepoint = Standard_True;
675 }
676 }
677 if (!onepoint)
678 {
679 TopoDS_Shape aLocalShape = anEdge.EmptyCopied();
680 NewE = TopoDS::Edge( aLocalShape );
681 //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
682 BB.Range( NewE, fpar, lpar );
683 NewE.Orientation( TopAbs_FORWARD );
684 if (firstind == 1)
685 {
686 BB.Add( NewE, Vfirst.Oriented(TopAbs_FORWARD) );
687 aLocalShape = SeqVer(1).Oriented(TopAbs_REVERSED);
688 BB.Add( NewE, TopoDS::Vertex( aLocalShape ) );
689 //BB.Add( NewE, TopoDS::Vertex( SeqVer(1).Oriented(TopAbs_REVERSED) ) );
690 }
691 else
692 {
693 aLocalShape = SeqVer(1).Oriented(TopAbs_FORWARD);
694 BB.Add( NewE, TopoDS::Vertex( aLocalShape ) );
695 aLocalShape = SeqVer(2).Oriented(TopAbs_REVERSED);
696 BB.Add( NewE, TopoDS::Vertex( aLocalShape ) );
697 //BB.Add( NewE, TopoDS::Vertex( SeqVer(1).Oriented(TopAbs_FORWARD) ) );
698 //BB.Add( NewE, TopoDS::Vertex( SeqVer(2).Oriented(TopAbs_REVERSED) ) );
699 }
700 NewEdges.Append( NewE );
701
702 firstind++;
703 for (i = firstind; i < Seq.Length(); i += 2)
704 {
705 aLocalShape = anEdge.EmptyCopied();
706 NewE = TopoDS::Edge( aLocalShape );
707 //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
708 fpar = Seq(i);
709 lpar = Seq(i+1);
710 BB.Range( NewE, fpar, lpar );
711 //Find vertices
712 for (j = 1; j <= Seq2.Length(); j++)
713 if (Abs(fpar-Seq2(j)) <= Precision::Confusion())
714 break;
715 NewE.Orientation( TopAbs_FORWARD );
716 TopoDS_Shape aLocalShape = SeqVer(j).Oriented(TopAbs_FORWARD);
717 BB.Add( NewE, TopoDS::Vertex( aLocalShape ) );
718 aLocalShape = SeqVer(j+1).Oriented(TopAbs_REVERSED);
719 BB.Add( NewE, TopoDS::Vertex( aLocalShape ) );
720 //BB.Add( NewE, TopoDS::Vertex( SeqVer(j).Oriented(TopAbs_FORWARD) ) );
721 //BB.Add( NewE, TopoDS::Vertex( SeqVer(j+1).Oriented(TopAbs_REVERSED) ) );
722 NewEdges.Append( NewE );
723 }
724 }
725
726 i = Seq.Length();
727 fpar = Seq(i);
728 lpar = LastPar;
729 if (Abs(fpar-lpar) <= Precision::Confusion())
730 continue;
731 TopoDS_Shape aLocalShape = anEdge.EmptyCopied();
732 NewE = TopoDS::Edge( aLocalShape );
733 //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
734 BB.Range( NewE, fpar, lpar );
735 NewE.Orientation( TopAbs_FORWARD );
736 aLocalShape = SeqVer(SeqVer.Length()).Oriented(TopAbs_FORWARD);
737 BB.Add( NewE, TopoDS::Vertex( aLocalShape ) );
738 //BB.Add( NewE, TopoDS::Vertex( SeqVer(SeqVer.Length()).Oriented(TopAbs_FORWARD) ) );
739 BB.Add( NewE, Vlast.Oriented(TopAbs_REVERSED) );
740 NewEdges.Append( NewE );
741
742 //Substitute anEdge by NewEdges
743 aSub.Substitute( anEdge, NewEdges );
744 }
745
746 //Removing edges connected with missing extremities of seam edges
747 TopTools_DataMapIteratorOfDataMapOfShapeShape itve( VEmap );
748 for (; itve.More(); itve.Next())
749 {
750 TopoDS_Shape V = itve.Key();
751 TopoDS_Shape E = itve.Value();
752 TopoDS_Shape W;
753 for (i = 1; i <= Eseq.Length(); i++)
754 if (E.IsSame( Eseq(i) ))
755 {
756 W = Wseq(i);
757 break;
758 }
759 TopoDS_Shape Etoremove;
760 eit.Initialize( W );
761 for (; eit.More(); eit.Next())
762 {
763 TopoDS_Edge CurE = TopoDS::Edge( eit.Value() );
764 if (CurE.IsSame( E ))
765 continue;
766 TopoDS_Vertex Vfirst, Vlast;
767 TopExp::Vertices( CurE, Vfirst, Vlast );
768 if (Vfirst.IsSame( V ) || Vlast.IsSame( V ))
769 {
770 Etoremove = CurE;
771 break;
772 }
773 }
774 if (! Etoremove.IsNull())
775 {
776 W.Free( Standard_True );
777 BB.Remove( W, Etoremove );
778 }
779 }
780
781 aSub.Build( myShape );
782 if (aSub.IsCopied( myShape ))
783 {
784 const TopTools_ListOfShape& listSh = aSub.Copy( myShape );
785 if (! listSh.IsEmpty())
786 myShape = listSh.First();
787 }
788
789 //Reconstruction of wires
790 TopTools_ListOfShape theCopy;
791 TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itww( WWmap );
792 for (; itww.More(); itww.Next())
793 {
794 CurWire = itww.Key();
795 theCopy = aSub.Copy( CurWire );
796 CurWire = theCopy.First();
797 CurWire.Free( Standard_True );
798 TopTools_ListIteratorOfListOfShape itl( itww.Value() );
799 for (; itl.More(); itl.Next())
800 {
801 TopoDS_Shape aWire = itl.Value();
802 CurFace = WFmap( aWire );
803 theCopy = aSub.Copy( aWire );
804 aWire = theCopy.First();
805 //Adjusting period
806 TopLoc_Location L;
807 Handle( Geom_Surface ) theSurf = BRep_Tool::Surface( TopoDS::Face(CurFace), L );
808 eit.Initialize( aWire );
809 for (; eit.More(); eit.Next())
810 {
811 TopoDS_Edge anEdge = TopoDS::Edge( eit.Value() );
812 gp_Pnt2d Pfirst, Plast, Pmid;
813 BRep_Tool::UVPoints( anEdge, TopoDS::Face(CurFace), Pfirst, Plast );
814 BRepAdaptor_Curve2d bc2d( anEdge, TopoDS::Face(CurFace) );
815 Pmid = bc2d.Value( (bc2d.FirstParameter()+bc2d.LastParameter())/2. );
816 gp_Vec2d offset;
817 Standard_Boolean translate = Standard_False;
c6541a0c
D
818 if (Pfirst.X()-2.*M_PI > Precision::Confusion() ||
819 Plast.X()-2.*M_PI > Precision::Confusion() ||
820 Pmid.X()-2.*M_PI > Precision::Confusion())
7fd59977 821 {
c6541a0c 822 offset.SetCoord( -2.*M_PI, 0 );
7fd59977 823 translate = Standard_True;
824 }
825 if (Pfirst.X() < -Precision::Confusion() ||
826 Plast.X() < -Precision::Confusion() ||
827 Pmid.X() < -Precision::Confusion())
828 {
c6541a0c 829 offset.SetCoord( 2.*M_PI, 0 );
7fd59977 830 translate = Standard_True;
831 }
832 if (translate)
833 {
834 const Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*) &anEdge.TShape());
835 BRep_ListIteratorOfListOfCurveRepresentation itcr( TE->ChangeCurves() );
836 Handle(BRep_GCurve) GC;
837
838 for (; itcr.More(); itcr.Next())
839 {
840 GC = Handle(BRep_GCurve)::DownCast(itcr.Value());
841 if (!GC.IsNull() && GC->IsCurveOnSurface( theSurf, L ))
842 {
843 Handle(Geom2d_Curve) PC = GC->PCurve();
844 PC = Handle(Geom2d_Curve)::DownCast( PC->Translated( offset ) );
845 GC->PCurve( PC );
846 TE->ChangeCurves().Remove( itcr );
847 TE->ChangeCurves().Append( GC );
848 break;
849 }
850 }
851 }
852 }
853 ///////////////////
854 eit.Initialize( aWire, Standard_False );
855 for (; eit.More(); eit.Next())
856 {
857 TopoDS_Shape anEdge = eit.Value();
858 BB.Add( CurWire, anEdge );
859 }
860 if (aSub.IsCopied( CurFace ))
861 {
862 theCopy = aSub.Copy( CurFace );
863 CurFace = theCopy.First();
864 }
865 CurFace.Free( Standard_True );
866 BB.Remove( CurFace, aWire );
867 }
868 }
869}