0031939: Coding - correction of spelling errors in comments
[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
7fd59977 17
42cf5bc1 18#include <BRep_Builder.hxx>
19#include <BRep_GCurve.hxx>
20#include <BRep_ListIteratorOfListOfCurveRepresentation.hxx>
21#include <BRep_TEdge.hxx>
22#include <BRep_Tool.hxx>
23#include <BRepAdaptor_Curve.hxx>
24#include <BRepAdaptor_Curve2d.hxx>
7fd59977 25#include <BRepFill_DataMapIteratorOfDataMapOfShapeSequenceOfReal.hxx>
42cf5bc1 26#include <BRepFill_DataMapOfShapeSequenceOfReal.hxx>
27#include <BRepLib.hxx>
28#include <BRepLib_MakeVertex.hxx>
29#include <BRepOffsetAPI_DraftAngle.hxx>
7fd59977 30#include <BRepOffsetAPI_SequenceOfSequenceOfReal.hxx>
31#include <BRepOffsetAPI_SequenceOfSequenceOfShape.hxx>
42cf5bc1 32#include <BRepTools.hxx>
7fd59977 33#include <BRepTools_Substitution.hxx>
42cf5bc1 34#include <Draft_Modification.hxx>
35#include <Geom2d_Curve.hxx>
36#include <Geom_Surface.hxx>
37#include <gp_Dir.hxx>
38#include <gp_Pln.hxx>
39#include <Precision.hxx>
40#include <Standard_ConstructionError.hxx>
41#include <Standard_NoSuchObject.hxx>
42#include <Standard_NullObject.hxx>
43#include <StdFail_NotDone.hxx>
44#include <TColgp_SequenceOfPnt.hxx>
45#include <TColStd_SequenceOfReal.hxx>
7fd59977 46#include <TopExp.hxx>
42cf5bc1 47#include <TopExp_Explorer.hxx>
48#include <TopLoc_Location.hxx>
49#include <TopoDS.hxx>
50#include <TopoDS_Face.hxx>
51#include <TopoDS_Iterator.hxx>
52#include <TopoDS_Shape.hxx>
7fd59977 53#include <TopoDS_Wire.hxx>
42cf5bc1 54#include <TopTools_DataMapOfShapeSequenceOfShape.hxx>
55#include <TopTools_ListIteratorOfListOfShape.hxx>
56#include <TopTools_SequenceOfShape.hxx>
7fd59977 57
3b77eff6 58#include <Geom2dInt_GInter.hxx>
59#include <IntRes2d_IntersectionPoint.hxx>
60
7fd59977 61//=======================================================================
62//function : BRepOffsetAPI_DraftAngle
63//purpose :
64//=======================================================================
7fd59977 65BRepOffsetAPI_DraftAngle::BRepOffsetAPI_DraftAngle () {}
66
67
68//=======================================================================
69//function : BRepOffsetAPI_DraftAngle
70//purpose :
71//=======================================================================
72
73BRepOffsetAPI_DraftAngle::BRepOffsetAPI_DraftAngle (const TopoDS_Shape& S)
74{
75 myInitialShape = S;
76 myModification = new Draft_Modification(S);
77}
78
79
80//=======================================================================
81//function : Clear
82//purpose :
83//=======================================================================
84
85void BRepOffsetAPI_DraftAngle::Clear ()
86{
87 if (!myModification.IsNull()) {
c5f3a425 88 Handle(Draft_Modification)::DownCast (myModification)->Clear();
7fd59977 89 }
90}
91
92
93//=======================================================================
94//function : Init
95//purpose :
96//=======================================================================
97
98void BRepOffsetAPI_DraftAngle::Init (const TopoDS_Shape& S)
99{
100 myInitialShape = S;
101 NotDone();
102 if (!myModification.IsNull()) {
c5f3a425 103 Handle(Draft_Modification)::DownCast (myModification)->Init(S);
7fd59977 104 }
105 else {
106 myModification = new Draft_Modification(S);
107 }
108}
109
110
111//=======================================================================
112//function : Add
113//purpose :
114//=======================================================================
115
116void BRepOffsetAPI_DraftAngle::Add(const TopoDS_Face& F,
117 const gp_Dir& D,
118 const Standard_Real Angle,
119 const gp_Pln& Plane,
120 const Standard_Boolean Flag)
121{
122// POP-DPF : protection
123 if ( Abs(Angle) <= 1.e-04 )
124 return;
2d2b3d53 125 Standard_NullObject_Raise_if (myInitialShape.IsNull(),
126 "BRepOffsetAPI_DraftAngle::Add() - initial shape is not set");
c5f3a425 127 Handle(Draft_Modification)::DownCast (myModification)->Add(F,D,Angle,Plane, Flag);
7fd59977 128}
129
130
131//=======================================================================
132//function : AddDone
133//purpose :
134//=======================================================================
135
136Standard_Boolean BRepOffsetAPI_DraftAngle::AddDone () const
137{
2d2b3d53 138 Standard_NullObject_Raise_if (myInitialShape.IsNull(),
139 "BRepOffsetAPI_DraftAngle::AddDone() - initial shape is not set");
c5f3a425 140 return Handle(Draft_Modification)::DownCast (myModification)
7fd59977 141 ->ProblematicShape().IsNull();
142}
143
144
145//=======================================================================
146//function : Remove
147//purpose :
148//=======================================================================
149
150void BRepOffsetAPI_DraftAngle::Remove(const TopoDS_Face& F)
151{
2d2b3d53 152 Standard_NullObject_Raise_if (myInitialShape.IsNull(),
153 "BRepOffsetAPI_DraftAngle::Remove() - initial shape is not set");
c5f3a425 154 Handle(Draft_Modification)::DownCast (myModification)->Remove(F);
7fd59977 155}
156
157
158//=======================================================================
159//function : ProblematicShape
160//purpose :
161//=======================================================================
162
163const TopoDS_Shape& BRepOffsetAPI_DraftAngle::ProblematicShape () const
164{
2d2b3d53 165 Standard_NullObject_Raise_if (myInitialShape.IsNull(),
166 "BRepOffsetAPI_DraftAngle::ProblematicShape() - initial shape is not set");
c5f3a425 167 return Handle(Draft_Modification)::DownCast (myModification)->ProblematicShape();
7fd59977 168}
169
170
171//=======================================================================
33ba8565 172//function : Status
7fd59977 173//purpose :
174//=======================================================================
175
176Draft_ErrorStatus BRepOffsetAPI_DraftAngle::Status () const
177{
2d2b3d53 178 Standard_NullObject_Raise_if (myInitialShape.IsNull(),
179 "BRepOffsetAPI_DraftAngle::Status() - initial shape is not set");
c5f3a425 180 return Handle(Draft_Modification)::DownCast (myModification)->Error();
7fd59977 181}
182
183
184//=======================================================================
185//function : ConnectedFaces
186//purpose :
187//=======================================================================
188
189const TopTools_ListOfShape& BRepOffsetAPI_DraftAngle::ConnectedFaces
190 (const TopoDS_Face& F) const
191{
2d2b3d53 192 Standard_NullObject_Raise_if (myInitialShape.IsNull(),
193 "BRepOffsetAPI_DraftAngle::ConnectedFaces() - initial shape is not set");
c5f3a425 194 return Handle(Draft_Modification)::DownCast (myModification)->ConnectedFaces(F);
7fd59977 195}
196
197
198//=======================================================================
199//function : ModifiedFaces
200//purpose :
201//=======================================================================
202
203const TopTools_ListOfShape& BRepOffsetAPI_DraftAngle::ModifiedFaces() const
204{
2d2b3d53 205 Standard_NullObject_Raise_if (myInitialShape.IsNull(),
206 "BRepOffsetAPI_DraftAngle::ModifiedFaces() - initial shape is not set");
c5f3a425 207 return Handle(Draft_Modification)::DownCast (myModification)->ModifiedFaces();
7fd59977 208}
209
210//=======================================================================
2651bfde 211//function : Generated
7fd59977 212//purpose :
213//=======================================================================
214
215const TopTools_ListOfShape& BRepOffsetAPI_DraftAngle::Generated(const TopoDS_Shape& S)
216{
217 myGenerated.Clear();
2d2b3d53 218 Standard_NullObject_Raise_if (myInitialShape.IsNull(),
219 "BRepOffsetAPI_DraftAngle::Generated() - initial shape is not set");
c5f3a425 220 Handle(Draft_Modification) DMod = Handle(Draft_Modification)::DownCast (myModification);
7fd59977 221
222 if (S.ShapeType() == TopAbs_FACE) {
223 Handle(Geom_Surface) Surf;
224 TopLoc_Location L;
225 Standard_Real Tol;
226 Standard_Boolean RW,RF;
227 if (DMod->NewSurface(TopoDS::Face(S), Surf, L, Tol, RW, RF)) {
2651bfde 228 if(myVtxToReplace.IsEmpty())
229 {
230 myGenerated.Append(ModifiedShape (S));
231 }
232 else
233 {
234 myGenerated.Append(mySubs.Value(ModifiedShape (S)));
235 }
7fd59977 236 }
237 }
238 return myGenerated;
239}
240
241//=======================================================================
2651bfde 242//function : Modified
7fd59977 243//purpose :
244//=======================================================================
245
246const TopTools_ListOfShape& BRepOffsetAPI_DraftAngle::Modified(const TopoDS_Shape& S)
247{
248 myGenerated.Clear();
2d2b3d53 249 Standard_NullObject_Raise_if (myInitialShape.IsNull(),
250 "BRepOffsetAPI_DraftAngle::Modified() - initial shape is not set");
c5f3a425 251 Handle(Draft_Modification) DMod = Handle(Draft_Modification)::DownCast (myModification);
7fd59977 252
253 if (S.ShapeType() == TopAbs_FACE) {
254 Handle(Geom_Surface) Surf;
255 TopLoc_Location L;
256 Standard_Real Tol;
257 Standard_Boolean RW,RF;
258
259 if (!DMod->NewSurface(TopoDS::Face(S), Surf, L, Tol, RW, RF)) {
260 // Ce n est pas une generation => peut etre une modif
2651bfde 261 if(myVtxToReplace.IsEmpty())
262 {
263 myGenerated.Append(ModifiedShape (S));
264 }
265 else
266 {
267 myGenerated.Append(mySubs.Value(ModifiedShape (S)));
268 }
7fd59977 269 if (myGenerated.Extent() == 1 && myGenerated.First().IsSame(S)) {
2651bfde 270 myGenerated.Clear();
7fd59977 271 }
272 }
273 }
274 return myGenerated;
275}
276
345d3056 277//=======================================================================
278//function : ModifiedShape
279//purpose :
280//=======================================================================
281
282TopoDS_Shape BRepOffsetAPI_DraftAngle::ModifiedShape
283 (const TopoDS_Shape& S) const
284{
285 if(S.ShapeType() == TopAbs_VERTEX)
286 {
287 if(myVtxToReplace.IsBound(S))
288 {
289 return myVtxToReplace(S);
290 }
291 }
2651bfde 292 if(myVtxToReplace.IsEmpty())
293 {
294 return myModifier.ModifiedShape(S);
295 }
296 else
297 {
298 const TopoDS_Shape& aNS = myModifier.ModifiedShape(S);
299 return mySubs.Value(aNS);
300 }
345d3056 301}
7fd59977 302
303//=======================================================================
304//function : Build
305//purpose :
306//=======================================================================
307
308void BRepOffsetAPI_DraftAngle::Build()
309{
c5f3a425 310 Handle(Draft_Modification)::DownCast (myModification)->Perform();
311 if (!Handle(Draft_Modification)::DownCast (myModification)->IsDone()) {
7fd59977 312 NotDone();
313 }
314 else {
315 DoModif(myInitialShape);
7fd59977 316 CorrectWires();
345d3056 317 CorrectVertexTol();
7fd59977 318 }
319}
320
321//=======================================================================
322//function : CorrectWires
c48e2889 323//purpose :
7fd59977 324//=======================================================================
325
326void BRepOffsetAPI_DraftAngle::CorrectWires()
327{
328 Standard_Real TolInter = 1.e-7;
329 Standard_Integer i, j, k;
330
331 TopTools_SequenceOfShape Eseq;
332 TopTools_SequenceOfShape Wseq;
333 TopTools_SequenceOfShape Fseq;
334 TopoDS_Shape CurEdge, CurWire, CurFace;
335 TopoDS_Iterator wit, eit;
336
337 TopExp_Explorer fexp( myShape, TopAbs_FACE );
338 for (; fexp.More(); fexp.Next())
345d3056 339 {
340 CurFace = fexp.Current();
341 wit.Initialize( CurFace );
342 for (; wit.More(); wit.Next())
7fd59977 343 {
345d3056 344 CurWire = wit.Value();
345 TopTools_MapOfShape emap;
346 eit.Initialize( CurWire );
347 for (; eit.More(); eit.Next())
348 emap.Add( eit.Value() );
349 TopTools_MapIteratorOfMapOfShape mapit( emap );
350 for (; mapit.More(); mapit.Next())
351 {
352 CurEdge = mapit.Key();
353 if (BRepTools::IsReallyClosed( TopoDS::Edge(CurEdge), TopoDS::Face(CurFace) ))
354 {
355 Eseq.Append( CurEdge );
356 Wseq.Append( CurWire );
357 Fseq.Append( CurFace );
358 }
359 }
7fd59977 360 }
345d3056 361 }
7fd59977 362
363 BRepFill_DataMapOfShapeSequenceOfReal Emap;
364
365 TopTools_SequenceOfShape NonSeam;
366 TopTools_SequenceOfShape NonSeamWires;
367 BRepOffsetAPI_SequenceOfSequenceOfReal ParsNonSeam;
368 BRepOffsetAPI_SequenceOfSequenceOfShape Seam;
369 BRepOffsetAPI_SequenceOfSequenceOfReal ParsSeam;
370
371 TopTools_DataMapOfShapeShape WFmap;
372 TopTools_DataMapOfShapeListOfShape WWmap;
373 for (i = 1; i <= Eseq.Length(); i++)
345d3056 374 {
375 CurEdge = Eseq(i);
376 CurWire = Wseq(i);
377 CurFace = Fseq(i);
3b77eff6 378 //
379 const TopoDS_Face& aFace = TopoDS::Face(CurFace);
380 //
381 // Prepare 2D adaptors for intersection.
382 // The seam edge has two 2D curve, thus we have to create 2 adaptors
383 BRepAdaptor_Curve2d aBAC2D1(TopoDS::Edge(CurEdge), aFace);
384 BRepAdaptor_Curve2d aBAC2D1R(TopoDS::Edge(CurEdge.Reversed()), aFace);
385 // Get surface of the face to get 3D intersection point
386 TopLoc_Location aLoc;
387 const Handle(Geom_Surface)& aSurf = BRep_Tool::Surface(aFace, aLoc);
388 // Get the tolerance of the current edge to compare intersection points
389 Standard_Real aTolCurE = BRep_Tool::Tolerance(TopoDS::Edge(CurEdge));
390 //
345d3056 391 wit.Initialize( CurFace );
392 for (; wit.More(); wit.Next())
7fd59977 393 {
345d3056 394 TopoDS_Shape aWire = wit.Value();
395 if (! aWire.IsSame( CurWire ))
396 {
397 TColgp_SequenceOfPnt pts;
345d3056 398 Standard_Boolean Wadd = Standard_False;
399 eit.Initialize( aWire );
400 for (; eit.More(); eit.Next())
401 {
3b77eff6 402 const TopoDS_Edge& anEdge = TopoDS::Edge(eit.Value());
403 //
404 // Prepare 2D adaptor for intersection
405 BRepAdaptor_Curve2d aBAC2D2(anEdge, aFace);
406 // Perform intersection
407 Geom2dInt_GInter aGInter;
408 aGInter.Perform(aBAC2D1, aBAC2D2, TolInter, TolInter);
409 if (!aGInter.IsDone() || aGInter.IsEmpty()) {
410 // If first intersection is empty try intersection with reversed edge
411 aGInter.Perform(aBAC2D1R, aBAC2D2, TolInter, TolInter);
412 if (!aGInter.IsDone() || aGInter.IsEmpty()) {
345d3056 413 continue;
3b77eff6 414 }
345d3056 415 }
3b77eff6 416 //
345d3056 417 Wadd = Standard_True;
418 if (! WFmap.IsBound( aWire ))
419 WFmap.Bind( aWire, CurFace );
420 Standard_Integer ind = 0;
3b77eff6 421 for (j = 1; j <= NonSeam.Length(); j++) {
422 if (anEdge.IsSame(NonSeam(j)))
345d3056 423 {
424 ind = j;
425 break;
426 }
3b77eff6 427 }
428 if (ind == 0)
429 {
430 NonSeam.Append(anEdge);
431 NonSeamWires.Append(aWire);
432 ind = NonSeam.Length();
433 TColStd_SequenceOfReal emptyseq1, emptyseq2;
434 TopTools_SequenceOfShape emptyedgeseq;
435 ParsNonSeam.Append(emptyseq1);
436 Seam.Append(emptyedgeseq);
437 ParsSeam.Append(emptyseq2);
438 }
439 if (!Emap.IsBound(CurEdge))
440 {
441 TColStd_SequenceOfReal emptyseq;
442 Emap.Bind(CurEdge, emptyseq);
443 }
444 //
445 // Get the tolerance of edge to compare intersection points
446 Standard_Real aTolE = BRep_Tool::Tolerance(anEdge);
447 // Tolerance to compare the intersection points is the maximal
448 // tolerance of intersecting edges
449 Standard_Real aTolCmp = Max(aTolCurE, aTolE);
450 //
811d6b7d 451 Standard_Integer aNbIntPnt = aGInter.NbPoints();
3b77eff6 452 for (k = 1; k <= aNbIntPnt; ++k) {
453 const IntRes2d_IntersectionPoint& aP2DInt = aGInter.Point(k);
454 const gp_Pnt2d& aP2D = aP2DInt.Value();
455 gp_Pnt aP3D = aSurf->Value(aP2D.X(), aP2D.Y());
456 //
457 // Check if the intersection point is new
458 Standard_Integer ied = 0;
459 for (j = 1; j <= pts.Length(); j++) {
460 if (aP3D.IsEqual(pts(j), aTolCmp))
461 {
462 ied = j;
463 break;
464 }
345d3056 465 }
3b77eff6 466 if (ied == 0)
345d3056 467 {
3b77eff6 468 pts.Append(aP3D);
469 Emap(CurEdge).Append(aP2DInt.ParamOnFirst());
470 ParsNonSeam(ind).Append(aP2DInt.ParamOnSecond());
471 Seam(ind).Append(CurEdge);
472 ParsSeam(ind).Append(aP2DInt.ParamOnFirst());
345d3056 473 }
3b77eff6 474 }
345d3056 475 } //for (; eit.More(); eit.Next())
476 if (Wadd)
477 {
478 if (! WWmap.IsBound( CurWire ))
479 {
480 TopTools_ListOfShape emptylist;
481 WWmap.Bind( CurWire, emptylist );
482 }
483 WWmap(CurWire).Append( aWire );
484 }
485 } //if (! aWire.IsSame( CurWire ))
486 } //for (; wit.More(); wit.Next())
487 } //for (i = 1; i <= Eseq.Length(); i++)
7fd59977 488
489 //Sorting
490 for (i = 1; i <= NonSeam.Length(); i++)
c48e2889 491 {
7fd59977 492 for (j = 1; j < ParsNonSeam(i).Length(); j++)
c48e2889 493 {
7fd59977 494 for (k = j+1; k <= ParsNonSeam(i).Length(); k++)
c48e2889 495 {
345d3056 496 if (ParsNonSeam(i)(k) < ParsNonSeam(i)(j))
497 {
498 Standard_Real temp = ParsNonSeam(i)(j);
499 ParsNonSeam(i)(j) = ParsNonSeam(i)(k);
500 ParsNonSeam(i)(k) = temp;
501 TopoDS_Shape tmp = Seam(i)(j);
502 Seam(i)(j) = Seam(i)(k);
503 Seam(i)(k) = tmp;
504 temp = ParsSeam(i)(j);
505 ParsSeam(i)(j) = ParsSeam(i)(k);
506 ParsSeam(i)(k) = temp;
507 }
c48e2889 508 }
509 }
510 }
511 BRepFill_DataMapIteratorOfDataMapOfShapeSequenceOfReal iter (Emap);
512 for (; iter.More (); iter.Next ())
513 {
514 TColStd_SequenceOfReal Seq = iter.Value ();
515 for (i = 1; i < Seq.Length (); i++)
516 {
517 for (j = i + 1; j <= Seq.Length (); j++)
518 {
519 if (Seq (j) < Seq (i))
345d3056 520 {
c48e2889 521 Standard_Real temp = Seq (i);
522 Seq (i) = Seq (j);
523 Seq (j) = temp;
345d3056 524 }
c48e2889 525 }
526 }
527 Emap (iter.Key ()) = Seq;
528 }
529 BRepFill_DataMapOfShapeSequenceOfReal EPmap;
530 TopTools_DataMapOfShapeSequenceOfShape EVmap; //Seam
531 TopTools_DataMapOfShapeSequenceOfShape EWmap; //Seam and wires intersecting it
532 iter.Initialize (Emap);
533 for (; iter.More (); iter.Next ())
534 {
535 TColStd_SequenceOfReal parseq;
536 EPmap.Bind (iter.Key (), parseq);
537 TopTools_SequenceOfShape shapeseq;
538 EVmap.Bind (iter.Key (), shapeseq);
539 TopTools_SequenceOfShape shapeseq2;
540 EWmap.Bind (iter.Key (), shapeseq2);
541 }
542
543 //Reconstruction of non-seam edges
544 BRepTools_Substitution aSub;
545 BRep_Builder BB;
546 for (i = 1; i <= NonSeam.Length (); i++)
547 {
548 TopoDS_Edge anEdge = TopoDS::Edge (NonSeam (i));
549 TopTools_ListOfShape NewEdges;
550 TopoDS_Edge NewE;
551 TopoDS_Vertex Vfirst, Vlast;
552 TopExp::Vertices (anEdge, Vfirst, Vlast);
553 Standard_Real par, FirstPar, LastPar;
554 BRep_Tool::Range (anEdge, FirstPar, LastPar);
555 Standard_Integer firstind = 1;
556 par = ParsNonSeam (i)(1);
557 TopoDS_Edge SeamEdge = TopoDS::Edge (Seam (i)(1));
558 //Find the face
559 for (j = 1; j <= Eseq.Length (); j++)
560 if (SeamEdge.IsSame (Eseq (j)))
561 break;
562 TopoDS_Face theFace = TopoDS::Face (Fseq (j));
563 TopLoc_Location L;
564 Handle (Geom_Surface) theSurf = BRep_Tool::Surface (theFace, L);
565 if (Abs (par - FirstPar) <= Precision::Confusion ())
566 {
567 BB.UpdateVertex (Vfirst, ParsSeam (i)(1), SeamEdge, BRep_Tool::Tolerance (Vfirst));
568 EPmap (SeamEdge).Append (ParsSeam (i)(1));
569 EVmap (SeamEdge).Append (Vfirst);
570 EWmap (SeamEdge).Append (NonSeamWires (i));
571 firstind = 2;
572 }
573 Standard_Real prevpar = FirstPar;
574 TopoDS_Vertex PrevV = Vfirst;
575 for (j = firstind; j <= ParsNonSeam (i).Length (); j++)
576 {
577 TopoDS_Shape aLocalShape = anEdge.EmptyCopied ();
578 NewE = TopoDS::Edge (aLocalShape);
579 //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
580 TopoDS_Vertex NewV;
581 par = ParsNonSeam (i)(j);
582 BB.Range (NewE, prevpar, par);
583 SeamEdge = TopoDS::Edge (Seam (i)(j));
584 if (j == ParsNonSeam (i).Length () && Abs (par - LastPar) <= Precision::Confusion ())
585 {
586 NewV = Vlast;
587 if (firstind == 2 && j == 2)
345d3056 588 {
c48e2889 589 BB.UpdateVertex (Vlast, ParsSeam (i)(j), SeamEdge, BRep_Tool::Tolerance (Vlast));
590 EPmap (SeamEdge).Append (ParsSeam (i)(j));
591 EVmap (SeamEdge).Append (Vlast);
592 EWmap (SeamEdge).Append (NonSeamWires (i));
593 break;
345d3056 594 }
c48e2889 595 }
596 else
597 {
598 BRepAdaptor_Curve bcur (NewE);
599 gp_Pnt Point = bcur.Value (par);
600 NewV = BRepLib_MakeVertex (Point);
601 BB.UpdateVertex (NewV, par, NewE, 10.*Precision::Confusion ());
602 }
603 BB.UpdateVertex (NewV, ParsSeam (i)(j), SeamEdge, 10.*Precision::Confusion ());
604 NewE.Orientation (TopAbs_FORWARD);
605 BB.Add (NewE, PrevV.Oriented (TopAbs_FORWARD));
606 BB.Add (NewE, NewV.Oriented (TopAbs_REVERSED));
607
608 NewEdges.Append (NewE);
609 EPmap (SeamEdge).Append (ParsSeam (i)(j));
610 EVmap (SeamEdge).Append (NewV);
611 EWmap (SeamEdge).Append (NonSeamWires (i));
612
613 prevpar = par;
614 PrevV = NewV;
615 }
616 //The last edge
617 TopoDS_Shape aLocalShape = anEdge.EmptyCopied ();
618 NewE = TopoDS::Edge (aLocalShape);
619 //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
620 par = LastPar;
621 if (Abs (prevpar - par) > Precision::Confusion ())
622 {
623 BB.Range (NewE, prevpar, par);
624 NewE.Orientation (TopAbs_FORWARD);
625 BB.Add (NewE, PrevV.Oriented (TopAbs_FORWARD));
626 BB.Add (NewE, Vlast.Oriented (TopAbs_REVERSED));
627 NewEdges.Append (NewE);
628 }
345d3056 629
c48e2889 630 //Substitute anEdge by NewEdges
631 aSub.Substitute (anEdge, NewEdges);
632 }
345d3056 633
c48e2889 634 //Sorting of EPmap and EVmap and removing repeating points from them
635 iter.Initialize (EPmap);
636 for (; iter.More (); iter.Next ())
637 {
638 TColStd_SequenceOfReal Seq;
639 Seq = iter.Value ();
640 TopTools_SequenceOfShape SeqShape;
641 SeqShape = EVmap (iter.Key ());
642 TopTools_SequenceOfShape SeqShape2;
643 SeqShape2 = EWmap (iter.Key ());
644 for (i = 1; i < Seq.Length (); i++)
645 {
646 for (j = i + 1; j <= Seq.Length (); j++)
647 {
648 if (Seq (j) < Seq (i))
649 {
650 Standard_Real temp = Seq (i);
651 Seq (i) = Seq (j);
652 Seq (j) = temp;
653 TopoDS_Shape tmp = SeqShape (i);
654 SeqShape (i) = SeqShape (j);
655 SeqShape (j) = tmp;
656 tmp = SeqShape2 (i);
657 SeqShape2 (i) = SeqShape2 (j);
658 SeqShape2 (j) = tmp;
345d3056 659 }
c48e2889 660 }
661 }
345d3056 662
c48e2889 663 EPmap (iter.Key ()) = Seq;
664 EVmap (iter.Key ()) = SeqShape;
665 EWmap (iter.Key ()) = SeqShape2;
666 }
667 iter.Initialize (EPmap);
668 for (; iter.More (); iter.Next ())
669 {
670 TColStd_SequenceOfReal Seq;
671 Seq = iter.Value ();
672 TopTools_SequenceOfShape SeqShape;
673 SeqShape = EVmap (iter.Key ());
674 TopTools_SequenceOfShape SeqShape2;
675 SeqShape2 = EWmap (iter.Key ());
676 Standard_Boolean remove = Standard_True;
677 while (remove)
678 {
679 remove = Standard_False;
680 for (i = 1; i < Seq.Length (); i++)
681 {
682 if (Abs (Seq (i) - Seq (i + 1)) <= Precision::Confusion ())
345d3056 683 {
c48e2889 684 Seq.Remove (i + 1);
685 SeqShape.Remove (i + 1);
686 SeqShape2.Remove (i + 1);
687 remove = Standard_True;
345d3056 688 }
c48e2889 689 }
690 }
691 EPmap (iter.Key ()) = Seq;
692 EVmap (iter.Key ()) = SeqShape;
693 EWmap (iter.Key ()) = SeqShape2;
694 }
695
696 //Reconstruction of seam edges
697 TopTools_DataMapOfShapeShape VEmap;
698 iter.Initialize (Emap);
699 for (; iter.More (); iter.Next ())
700 {
701 TopoDS_Edge anEdge = TopoDS::Edge (iter.Key ());
702 Standard_Boolean onepoint = Standard_False;
703 TopTools_ListOfShape NewEdges;
704 TColStd_SequenceOfReal Seq;
705 Seq = iter.Value ();
706 TColStd_SequenceOfReal Seq2;
707 Seq2 = EPmap (anEdge);
708 TopTools_SequenceOfShape SeqVer;
709 SeqVer = EVmap (anEdge);
710 TopTools_SequenceOfShape SeqWire;
711 SeqWire = EWmap (anEdge);
712 TopoDS_Vertex Vfirst, Vlast;
713 TopExp::Vertices (anEdge, Vfirst, Vlast);
714 Standard_Real fpar, lpar, FirstPar, LastPar;
715 BRep_Tool::Range (anEdge, FirstPar, LastPar);
716 fpar = FirstPar;
717 lpar = Seq (1);
718 TopoDS_Edge NewE;
719 Standard_Integer firstind = 1;
720 if (Abs (fpar - lpar) <= Precision::Confusion ())
721 {
722 firstind = 2;
723 fpar = Seq (1);
724 lpar = Seq (2);
725 }
726 else
727 {
728 if (Seq.Length () % 2 != 0)
729 {
730 VEmap.Bind (Vfirst, anEdge);
731 firstind = 2;
732 fpar = Seq (1);
733 if (Seq.Length () > 2)
734 lpar = Seq (2);
735 else
736 onepoint = Standard_True;
737 }
738 }
739 if (!onepoint)
740 {
741 TopoDS_Shape aLocalShape = anEdge.EmptyCopied ();
742 NewE = TopoDS::Edge (aLocalShape);
743 //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
744 BB.Range (NewE, fpar, lpar);
745 NewE.Orientation (TopAbs_FORWARD);
746 if (firstind == 1)
747 {
748 BB.Add (NewE, Vfirst.Oriented (TopAbs_FORWARD));
749 aLocalShape = SeqVer (1).Oriented (TopAbs_REVERSED);
750 BB.Add (NewE, TopoDS::Vertex (aLocalShape));
751 //BB.Add( NewE, TopoDS::Vertex( SeqVer(1).Oriented(TopAbs_REVERSED) ) );
752 }
753 else
754 {
755 aLocalShape = SeqVer (1).Oriented (TopAbs_FORWARD);
756 BB.Add (NewE, TopoDS::Vertex (aLocalShape));
757 aLocalShape = SeqVer (2).Oriented (TopAbs_REVERSED);
758 BB.Add (NewE, TopoDS::Vertex (aLocalShape));
759 //BB.Add( NewE, TopoDS::Vertex( SeqVer(1).Oriented(TopAbs_FORWARD) ) );
760 //BB.Add( NewE, TopoDS::Vertex( SeqVer(2).Oriented(TopAbs_REVERSED) ) );
761 }
762 NewEdges.Append (NewE);
763
764 firstind++;
765 for (i = firstind; i < Seq.Length (); i += 2)
766 {
767 aLocalShape = anEdge.EmptyCopied ();
768 NewE = TopoDS::Edge (aLocalShape);
769 //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
770 fpar = Seq (i);
771 lpar = Seq (i + 1);
772 BB.Range (NewE, fpar, lpar);
773 //Find vertices
774 for (j = 1; j <= Seq2.Length (); j++)
345d3056 775 {
c48e2889 776 if (Abs (fpar - Seq2 (j)) <= Precision::Confusion ())
345d3056 777 {
c48e2889 778 break;
345d3056 779 }
345d3056 780 }
c48e2889 781 NewE.Orientation (TopAbs_FORWARD);
782 TopoDS_Shape aLocalShapeCur = SeqVer (j).Oriented (TopAbs_FORWARD);
783 BB.Add (NewE, TopoDS::Vertex (aLocalShapeCur));
784 aLocalShapeCur = SeqVer (j + 1).Oriented (TopAbs_REVERSED);
785 BB.Add (NewE, TopoDS::Vertex (aLocalShapeCur));
786 //BB.Add( NewE, TopoDS::Vertex( SeqVer(j).Oriented(TopAbs_FORWARD) ) );
787 //BB.Add( NewE, TopoDS::Vertex( SeqVer(j+1).Oriented(TopAbs_REVERSED) ) );
788 NewEdges.Append (NewE);
789 }
790 }
345d3056 791
c48e2889 792 i = Seq.Length ();
793 fpar = Seq (i);
794 lpar = LastPar;
795 if (Abs (fpar - lpar) <= Precision::Confusion ())
796 continue;
797 TopoDS_Shape aLocalShape = anEdge.EmptyCopied ();
798 NewE = TopoDS::Edge (aLocalShape);
799 //NewE = TopoDS::Edge( anEdge.EmptyCopied() );
800 BB.Range (NewE, fpar, lpar);
801 NewE.Orientation (TopAbs_FORWARD);
802 aLocalShape = SeqVer (SeqVer.Length ()).Oriented (TopAbs_FORWARD);
803 BB.Add (NewE, TopoDS::Vertex (aLocalShape));
804 //BB.Add( NewE, TopoDS::Vertex( SeqVer(SeqVer.Length()).Oriented(TopAbs_FORWARD) ) );
805 BB.Add (NewE, Vlast.Oriented (TopAbs_REVERSED));
806 NewEdges.Append (NewE);
807
808 //Substitute anEdge by NewEdges
809 aSub.Substitute (anEdge, NewEdges);
810 }
345d3056 811
c48e2889 812 //Removing edges connected with missing extremities of seam edges
813 TopTools_DataMapIteratorOfDataMapOfShapeShape itve (VEmap);
814 for (; itve.More (); itve.Next ())
815 {
816 TopoDS_Shape V = itve.Key ();
817 TopoDS_Shape E = itve.Value ();
818 TopoDS_Shape W;
819 for (i = 1; i <= Eseq.Length (); i++)
820 {
821 if (E.IsSame (Eseq (i)))
822 {
823 W = Wseq (i);
824 break;
825 }
826 }
827 TopoDS_Shape Etoremove;
828 eit.Initialize (W);
829 for (; eit.More (); eit.Next ())
830 {
831 TopoDS_Edge CurE = TopoDS::Edge (eit.Value ());
832 if (CurE.IsSame (E))
833 continue;
834 TopoDS_Vertex Vfirst, Vlast;
835 TopExp::Vertices (CurE, Vfirst, Vlast);
836 if (Vfirst.IsSame (V) || Vlast.IsSame (V))
837 {
838 Etoremove = CurE;
839 break;
840 }
841 }
842 if (!Etoremove.IsNull ())
843 {
844 W.Free (Standard_True);
845 BB.Remove (W, Etoremove);
846 }
847 }
345d3056 848
c48e2889 849 aSub.Build (myShape);
850 if (aSub.IsCopied (myShape))
851 {
852 const TopTools_ListOfShape& listSh = aSub.Copy (myShape);
853 if (!listSh.IsEmpty ())
854 myShape = listSh.First ();
855 }
345d3056 856
c48e2889 857 //Reconstruction of wires
858 TopTools_ListOfShape theCopy;
859 TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itww (WWmap);
860 for (; itww.More (); itww.Next ())
861 {
862 CurWire = itww.Key ();
863 theCopy = aSub.Copy (CurWire);
864 CurWire = theCopy.First ();
865 CurWire.Free (Standard_True);
866 TopTools_ListIteratorOfListOfShape itl (itww.Value ());
867 for (; itl.More (); itl.Next ())
868 {
869 TopoDS_Shape aWire = itl.Value ();
870 CurFace = WFmap (aWire);
871 theCopy = aSub.Copy (aWire);
872 aWire = theCopy.First ();
873 //Adjusting period
874 TopLoc_Location L;
875 Handle (Geom_Surface) theSurf = BRep_Tool::Surface (TopoDS::Face (CurFace), L);
876 eit.Initialize (aWire);
877 for (; eit.More (); eit.Next ())
878 {
879 TopoDS_Edge anEdge = TopoDS::Edge (eit.Value ());
880 gp_Pnt2d Pfirst, Plast, Pmid;
881 BRep_Tool::UVPoints (anEdge, TopoDS::Face (CurFace), Pfirst, Plast);
882 BRepAdaptor_Curve2d bc2d (anEdge, TopoDS::Face (CurFace));
883 Pmid = bc2d.Value ((bc2d.FirstParameter () + bc2d.LastParameter ()) / 2.);
884 gp_Vec2d offset;
885 Standard_Boolean translate = Standard_False;
886 if (Pfirst.X () - 2.*M_PI > Precision::Confusion () ||
887 Plast.X () - 2.*M_PI > Precision::Confusion () ||
888 Pmid.X () - 2.*M_PI > Precision::Confusion ())
345d3056 889 {
c48e2889 890 offset.SetCoord (-2.*M_PI, 0);
891 translate = Standard_True;
345d3056 892 }
c48e2889 893 if (Pfirst.X () < -Precision::Confusion () ||
894 Plast.X () < -Precision::Confusion () ||
895 Pmid.X () < -Precision::Confusion ())
345d3056 896 {
c48e2889 897 offset.SetCoord (2.*M_PI, 0);
898 translate = Standard_True;
345d3056 899 }
c48e2889 900 if (translate)
345d3056 901 {
c48e2889 902 const Handle (BRep_TEdge)& TE = *((Handle (BRep_TEdge)*) &anEdge.TShape ());
903 BRep_ListIteratorOfListOfCurveRepresentation itcr (TE->ChangeCurves ());
904 Handle (BRep_GCurve) GC;
905
906 for (; itcr.More (); itcr.Next ())
345d3056 907 {
c48e2889 908 GC = Handle (BRep_GCurve)::DownCast (itcr.Value ());
909 if (!GC.IsNull () && GC->IsCurveOnSurface (theSurf, L))
345d3056 910 {
c48e2889 911 Handle (Geom2d_Curve) PC = GC->PCurve ();
912 PC = Handle (Geom2d_Curve)::DownCast (PC->Translated (offset));
913 GC->PCurve (PC);
914 TE->ChangeCurves ().Remove (itcr);
915 TE->ChangeCurves ().Append (GC);
916 break;
345d3056 917 }
345d3056 918 }
919 }
c48e2889 920 }
921 ///////////////////
922 eit.Initialize (aWire, Standard_False);
923 for (; eit.More (); eit.Next ())
924 {
925 TopoDS_Shape anEdge = eit.Value ();
926 BB.Add (CurWire, anEdge);
927 }
928 if (aSub.IsCopied (CurFace))
929 {
930 theCopy = aSub.Copy (CurFace);
931 CurFace = theCopy.First ();
932 }
933 CurFace.Free (Standard_True);
934 BB.Remove (CurFace, aWire);
935 }
936 }
345d3056 937}
938//=======================================================================
939//function : CorrectVertexTol
940//purpose :
941//=======================================================================
7fd59977 942
345d3056 943void BRepOffsetAPI_DraftAngle::CorrectVertexTol()
944{
945 TopTools_MapOfShape anInitVertices, anInitEdges, aNewEdges;
946 TopExp_Explorer anExp(myInitialShape, TopAbs_EDGE);
947 for(; anExp.More(); anExp.Next())
948 {
949 anInitEdges.Add(anExp.Current());
950 TopoDS_Iterator anIter(anExp.Current());
951 for(; anIter.More(); anIter.Next())
7fd59977 952 {
345d3056 953 anInitVertices.Add(anIter.Value());
7fd59977 954 }
345d3056 955 }
956 //
957
958 BRep_Builder aBB;
959 myVtxToReplace.Clear();
960 anExp.Init(myShape, TopAbs_EDGE);
961 for(; anExp.More(); anExp.Next())
962 {
963 const TopoDS_Shape& anE = anExp.Current();
964 //Skip old (not modified) edges
965 if(anInitEdges.Contains(anE))
966 continue;
967 //
968 //Skip processed edges
969 if(aNewEdges.Contains(anE))
970 continue;
971 //
972 aNewEdges.Add(anE);
973 //
974 Standard_Real anETol = BRep_Tool::Tolerance(TopoDS::Edge(anE));
975 TopoDS_Iterator anIter(anE);
976 for(; anIter.More(); anIter.Next())
7fd59977 977 {
345d3056 978 const TopoDS_Vertex& aVtx = TopoDS::Vertex(anIter.Value());
979 if(anInitVertices.Contains(aVtx))
980 {
981 if(myVtxToReplace.IsBound(aVtx))
982 {
983 aBB.UpdateVertex(TopoDS::Vertex(myVtxToReplace(aVtx)), anETol + Epsilon(anETol));
984 }
985 else
986 {
987 Standard_Real aVTol = BRep_Tool::Tolerance(aVtx);
988 if(aVTol < anETol)
989 {
990 TopoDS_Vertex aNewVtx;
991 gp_Pnt aVPnt = BRep_Tool::Pnt(aVtx);
992 aBB.MakeVertex(aNewVtx, aVPnt,anETol + Epsilon(anETol));
2651bfde 993 aNewVtx.Orientation(aVtx.Orientation());
345d3056 994 myVtxToReplace.Bind(aVtx, aNewVtx);
995 }
996 }
997 }
7fd59977 998 else
345d3056 999 {
1000 aBB.UpdateVertex(aVtx, anETol + Epsilon(anETol));
1001 }
7fd59977 1002 }
345d3056 1003 }
1004 //
1005 if(myVtxToReplace.IsEmpty())
1006 {
1007 return;
1008 }
1009 //
2651bfde 1010 mySubs.Clear();
345d3056 1011 TopTools_DataMapIteratorOfDataMapOfShapeShape anIter(myVtxToReplace);
1012 for(; anIter.More(); anIter.Next())
1013 {
2651bfde 1014 mySubs.Replace(anIter.Key(), anIter.Value());
345d3056 1015 }
2651bfde 1016 mySubs.Apply( myShape );
1017 myShape = mySubs.Value(myShape);
345d3056 1018 //
7fd59977 1019}