0027557: Unstable HLR tests
[occt.git] / src / HLRTopoBRep / HLRTopoBRep_DSFiller.cxx
CommitLineData
b311480e 1// Created on: 1993-08-10
2// Created by: Christophe MARION
3// Copyright (c) 1993-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
7fd59977 18#include <AppDef_BSplineCompute.hxx>
19#include <AppDef_MultiLine.hxx>
20#include <AppDef_MultiPointConstraint.hxx>
21#include <AppParCurves_MultiBSpCurve.hxx>
7fd59977 22#include <BRep_Builder.hxx>
42cf5bc1 23#include <BRep_CurveRepresentation.hxx>
24#include <BRep_ListIteratorOfListOfCurveRepresentation.hxx>
25#include <BRep_TEdge.hxx>
26#include <BRep_Tool.hxx>
7fd59977 27#include <BRepAdaptor_Curve.hxx>
28#include <BRepAdaptor_Curve2d.hxx>
29#include <BRepAdaptor_HCurve2d.hxx>
42cf5bc1 30#include <BRepApprox_Approx.hxx>
31#include <BRepApprox_ApproxLine.hxx>
32#include <BRepExtrema_ExtPC.hxx>
7fd59977 33#include <BRepTopAdaptor_HVertex.hxx>
7fd59977 34#include <BRepTopAdaptor_Tool.hxx>
42cf5bc1 35#include <BRepTopAdaptor_TopolTool.hxx>
36#include <Contap_Contour.hxx>
e2065c2f 37#include <Contap_Line.hxx>
42cf5bc1 38#include <Contap_Point.hxx>
7fd59977 39#include <Extrema_LocateExtPC.hxx>
42cf5bc1 40#include <Geom2d_BSplineCurve.hxx>
41#include <Geom2d_Curve.hxx>
42#include <Geom_BSplineCurve.hxx>
43#include <Geom_Circle.hxx>
44#include <Geom_Line.hxx>
45#include <Geom_Surface.hxx>
46#include <GeomProjLib.hxx>
47#include <HLRTopoBRep_Data.hxx>
48#include <HLRTopoBRep_DSFiller.hxx>
49#include <HLRTopoBRep_FaceIsoLiner.hxx>
50#include <math_Vector.hxx>
7fd59977 51#include <Precision.hxx>
42cf5bc1 52#include <Standard_ProgramError.hxx>
53#include <TColgp_Array1OfPnt.hxx>
54#include <TColgp_Array1OfPnt2d.hxx>
55#include <TColStd_Array1OfInteger.hxx>
56#include <TColStd_Array1OfReal.hxx>
57#include <TopExp.hxx>
58#include <TopExp_Explorer.hxx>
59#include <TopoDS.hxx>
60#include <TopoDS_Edge.hxx>
61#include <TopoDS_Face.hxx>
62#include <TopoDS_Shape.hxx>
63#include <TopoDS_Vertex.hxx>
bda83605 64#include <TopTools_ListIteratorOfListOfShape.hxx>
7fd59977 65
66#define INTERPOLATE 0
67#define BRISE 0
68#define APPROX 1
69
bda83605 70
7fd59977 71//=======================================================================
72//function : Insert
73//purpose : explore the faces and insert them
74//=======================================================================
75
76void HLRTopoBRep_DSFiller::Insert (const TopoDS_Shape& S,
77 Contap_Contour& FO,
78 HLRTopoBRep_Data& DS,
79 BRepTopAdaptor_MapOfShapeTool& MST,
80 const Standard_Integer nbIso)
81{
82 TopTools_MapOfShape ShapeMap;
83 TopExp_Explorer ex(S,TopAbs_FACE);
84 DS.Clear();
85 Standard_Boolean withPCurve = Standard_True; // instead of nbIso != 0;
86 Standard_Integer f = 0;
87
88 while (ex.More()) {
89 if (ShapeMap.Add(ex.Current())) {
90 f++;
91 TopoDS_Face S1 = TopoDS::Face(ex.Current());
92 S1.Orientation(TopAbs_FORWARD);
93 Handle(BRepTopAdaptor_TopolTool) Domain;
94 Handle(Adaptor3d_HSurface) Surface;
95 if(MST.IsBound(S1)) {
96 BRepTopAdaptor_Tool& BRT = MST.ChangeFind(S1);
97 Domain = BRT.GetTopolTool();
98 Surface = BRT.GetSurface();
99 }
100 else {
101 BRepTopAdaptor_Tool BRT(S1,Precision::PConfusion());
102 MST.Bind(S1,BRT);
103 Domain = BRT.GetTopolTool();
104 Surface = BRT.GetSurface();
105 }
bda83605 106 FO.Perform(Surface, Domain);
7fd59977 107 if (FO.IsDone()) {
108 if (!FO.IsEmpty())
109 InsertFace(f,S1,FO,DS,withPCurve);
110 }
111 if (nbIso != 0) HLRTopoBRep_FaceIsoLiner::Perform(f,S1,DS,nbIso);
112 }
113 ex.Next();
114 }
115 ProcessEdges(DS);
116}
117
118//=======================================================================
119//function : InsertFace
120//purpose : private, insert the outlines of a face
121//=======================================================================
122
35e08fe8 123void HLRTopoBRep_DSFiller::InsertFace (const Standard_Integer /*FI*/,
7fd59977 124 const TopoDS_Face& F,
125 Contap_Contour& FO,
126 HLRTopoBRep_Data& DS,
127 const Standard_Boolean withPCurve)
128{
129 // Insert the intersections of FO in DS
130
5c953701 131 const Standard_Real tol = BRep_Tool::Tolerance(F);
7fd59977 132 TopTools_ListOfShape& IntL = DS.AddIntL(F);
133 TopTools_ListOfShape& OutL = DS.AddOutL(F);
5c953701 134
7fd59977 135 TopoDS_Vertex VF,VL;
5c953701 136 /*
137 TopTools_MapOfShape VM;
7fd59977 138 TopExp_Explorer ex(F,TopAbs_EDGE);
7fd59977 139 while (ex.More()) {
140 const TopoDS_Edge& E = TopoDS::Edge(ex.Current());
141 if (BRep_Tool::IsClosed(E,F)) {
142 TopExp::Vertices(E,VF,VL);
143 VM.Add(VF);
144 VM.Add(VL);
145 }
146 ex.Next();
147 }
5c953701 148 */
7fd59977 149
5c953701 150 const Standard_Integer NbLines = FO.NbLines();
bda83605 151 Standard_Integer CurLine;
152 for (CurLine = 1; CurLine <= NbLines; CurLine++)
5c953701 153 {
e2065c2f 154 const Contap_Line& Line = FO.Line(CurLine);
5c953701 155 const Standard_Integer NbPoints = Line.NbVertex();
7fd59977 156 Standard_Integer CurPoint;
5c953701 157 if (Line.TypeContour() == Contap_Restriction)
158 {
7fd59977 159 // OutLine on restriction
5c953701 160 TopoDS_Edge E = (*(BRepAdaptor_Curve2d*)&(Line.Arc()->Curve2d())).Edge();
7fd59977 161 OutL.Append(E);
162 TopExp::Vertices(E,VF,VL);
163 // insert the Internal points.
164
165 for (CurPoint = 1; CurPoint <= NbPoints; CurPoint++) {
e2065c2f 166 Contap_Point P = Line.Vertex(CurPoint);
5c953701 167 if (P.IsInternal()) {
168 if (P.Value().IsEqual(BRep_Tool::Pnt(VF),BRep_Tool::Tolerance(VF))) {
169 if (P.Value().IsEqual(BRep_Tool::Pnt(VL),BRep_Tool::Tolerance(VL))) {
170 InsertVertex(P,tol,E,DS);
171 }
172 }
173 }
7fd59977 174 }
175 }
5c953701 176 else
177 {
7fd59977 178 for (CurPoint = 1; CurPoint <= NbPoints; CurPoint++) {
7fd59977 179
e2065c2f 180 const Contap_Point PF = Line.Vertex(CurPoint);
5c953701 181 if (PF.IsInternal() && CurPoint != 1)
182 VF = VL;
183 else
184 VF = MakeVertex(PF,tol,DS);
185 const Standard_Real parF = PF.ParameterOnLine();
7fd59977 186
5c953701 187 if (CurPoint < NbPoints) {
e2065c2f 188 const Contap_Point PL = Line.Vertex(CurPoint+1);
5c953701 189 VL = MakeVertex(PL,tol,DS);
190 const Standard_Real parL = PL.ParameterOnLine();
191
192 if( (parL-parF) > Precision::PConfusion() ) {
193
194 Handle(Geom_Curve) C;
195 Handle(Geom2d_Curve) C2d;
196 Standard_Real first = parF;
197 Standard_Real last = parL;
198 Standard_Boolean InsuffisantNumberOfPoints=Standard_False;
199
200 switch (Line.TypeContour()) {
7fd59977 201
5c953701 202 case Contap_Lin :
203 {
204 C = new Geom_Line(Line.Line());
205 if (withPCurve) {
206 Handle(Geom_Surface) S = BRep_Tool::Surface(F);
207 Standard_Real Tol = 1e-7;
208 C2d = GeomProjLib::Curve2d(C,first,last,S,Tol);
209 }
210 }
211 break;
7fd59977 212
5c953701 213 case Contap_Circle :
214 {
215 C = new Geom_Circle(Line.Circle());
216 if (withPCurve) {
217 TopLoc_Location Loc;
218 Handle(Geom_Surface) S = BRep_Tool::Surface(F,Loc);
219 if (!Loc.IsIdentity()) {
220 S = Handle(Geom_Surface)::DownCast(S->Transformed(Loc.Transformation()));
221 }
222 Standard_Real Tol = 1e-7;
223 C2d = GeomProjLib::Curve2d(C,first,last,S,Tol);
224 }
225 }
226 break;
7fd59977 227
5c953701 228 case Contap_Walking :
229 {
230 // copy the points
231 Standard_Integer ipF = Standard_Integer(parF);
232 Standard_Integer ipL = Standard_Integer(parL);
7fd59977 233
5c953701 234 if(ipL-ipF < 1) {
235 InsuffisantNumberOfPoints=Standard_True;
236 //cout<<"\n !! Pb ds HLRTopoBRep_DSFiller.cxx (Contour App Nbp <3)"<<endl;
237 }
238/*
7fd59977 239 else if(ipL-ipF < 6) {
240 // compute the tangents
e2065c2f 241 Contap_SurfFunction& SFunc =
7fd59977 242 FO.SurfaceFunction();
243
244 Standard_Boolean isTg1,isTg2;
245 gp_Vec tg1,tg2;
246 gp_Vec2d uv1,uv2;
247 math_Vector UV(1,2),F(1,1);
248
249 Line.Point(ipF).ParametersOnS2(UV(1),UV(2));
250 SFunc.Value(UV,F);
251 isTg1 = SFunc.IsTangent();
252 if (!isTg1) {
253 tg1 = SFunc.Direction3d();
254 if (withPCurve) uv1 = SFunc.Direction2d();
255 }
256
257 Line.Point(ipL).ParametersOnS2(UV(1),UV(2));
258 SFunc.Value(UV,F);
259 isTg2 = SFunc.IsTangent();
260 if (!isTg2) {
261 tg2 = SFunc.Direction3d();
262 if (withPCurve) uv2 = SFunc.Direction2d();
263 }
264 // interpolate
265 Standard_Integer nbp = ipL - ipF + 1;
266 AppDef_MultiLine MLine(nbp);
267 Standard_Integer nb2d = 0;
268 if (withPCurve) nb2d = 1;
269
270 for (Standard_Integer i = 1; i <= nbp; i++) {
271 AppDef_MultiPointConstraint MP(1, nb2d);
272 MP.SetPoint(1,Line.Point(i + ipF - 1).Value());
273 if (withPCurve) {
274 Line.Point(i + ipF - 1).ParametersOnS2(UV(1),UV(2));
275 MP.SetPoint2d(2,gp_Pnt2d(UV(1),UV(2)));
276 }
277
278 if (i == 1 && !isTg1) {
279 MP.SetTang (1,tg1);
280 if (withPCurve) MP.SetTang2d(2,uv1);
281 }
282 if (i == nbp && !isTg2) {
283 MP.SetTang (1,tg2);
284 if (withPCurve) MP.SetTang2d(2,uv2);
285 }
286 MLine.SetValue(i,MP);
287 }
288 AppDef_BSplineCompute interp;
289 interp.Interpol(MLine);
290 AppParCurves_MultiBSpCurve TheCurve = interp.Value();
291 Standard_Integer Degree = TheCurve.Degree();
292 TColgp_Array1OfPnt Poles(1,TheCurve.NbPoles());
293 TheCurve.Curve(1,Poles);
294 C = new Geom_BSplineCurve(Poles,
295 TheCurve.Knots(),
296 TheCurve.Multiplicities(),
297 Degree);
298 if (withPCurve) {
299 TColgp_Array1OfPnt2d Pol2d(1,TheCurve.NbPoles());
300 TheCurve.Curve(2,Pol2d);
301 C2d = new Geom2d_BSplineCurve(Pol2d,
302 TheCurve.Knots(),
303 TheCurve.Multiplicities(),
304 Degree);
305 }
306 first = 0;
307 last = 1;
308 }
5c953701 309*/
310 else if(ipL-ipF < 5) {
311 const Standard_Integer nbp = ipL - ipF + 1;
312 TColStd_Array1OfReal knots(1,nbp);
313 TColStd_Array1OfInteger mults(1,nbp);
314 TColgp_Array1OfPnt Points(1,nbp);
7fd59977 315
5c953701 316 for(Standard_Integer i=1;i<=nbp;i++) {
317 knots.SetValue(i,(Standard_Real)i);
318 mults.SetValue(i,1);
319 Points.SetValue(i,Line.Point(i+ipF-1).Value());
320 }
321 mults(1)=mults(nbp)=2;
322 C = new Geom_BSplineCurve(Points,knots,mults,1);
7fd59977 323
5c953701 324 if(withPCurve) {
325 TColgp_Array1OfPnt2d Points2d(1,nbp);
326 for(Standard_Integer i=1;i<=nbp;i++) {
327 Standard_Real u,v;
328 Line.Point(i+ipF-1).ParametersOnS2(u,v);
329 Points2d.SetValue(i,gp_Pnt2d(u,v));
330 }
331 C2d = new Geom2d_BSplineCurve(Points2d,knots,mults,1);
332 }
333 first = 1;
334 last = nbp;
335 }
336 else {
337 const Standard_Integer nbp = ipL - ipF + 1;
338 TColStd_Array1OfReal knots(1,nbp);
339 TColStd_Array1OfInteger mults(1,nbp);
340 TColgp_Array1OfPnt Points(1,nbp);
341
342 Standard_Real Maxx,Maxy,Maxz,Maxu,Maxv;
343 Standard_Real Minx,Miny,Minz,Minu,Minv;
344 Maxx=Maxy=Maxz=Maxu=Maxv=-RealLast();
345 Minx=Miny=Minz=Minu=Minv=RealLast();
7fd59977 346
5c953701 347 for(Standard_Integer i=1;i<=nbp;i++) {
348 knots.SetValue(i,(Standard_Real)i);
349 mults.SetValue(i,1);
350 const gp_Pnt& P= Line.Point(i+ipF-1).Value();
351 if(P.X()<Minx) Minx=P.X();
352 if(P.Y()<Miny) Miny=P.Y();
353 if(P.Z()<Minz) Minz=P.Z();
354 if(P.X()>Maxx) Maxx=P.X();
355 if(P.Y()>Maxy) Maxy=P.Y();
356 if(P.Z()>Maxz) Maxz=P.Z();
357 Points.SetValue(i,P);
358 }
359 mults(1)=mults(nbp)=2;
360 Handle(Geom_BSplineCurve) AppC;
361 Handle(Geom2d_BSplineCurve) AppC2d;
362 AppC = new Geom_BSplineCurve(Points,knots,mults,1);
363
364 if(withPCurve) {
365 TColgp_Array1OfPnt2d Points2d(1,nbp);
366 for(Standard_Integer i=1;i<=nbp;i++) {
367 Standard_Real u,v;
368 Line.Point(i+ipF-1).ParametersOnS2(u,v);
369 if(u<Minu) Minu=u;
370 if(v<Minv) Minv=v;
371 if(u>Maxu) Maxu=u;
372 if(v>Maxv) Maxv=v;
373 Points2d.SetValue(i,gp_Pnt2d(u,v));
374 }
375 AppC2d = new Geom2d_BSplineCurve(Points2d,knots,mults,1);
376 }
377 first = 1;
378 last = nbp;
7fd59977 379
5c953701 380 Handle(BRepApprox_ApproxLine) AppLine;
381 Handle(Geom2d_BSplineCurve) CNull;
382 AppLine = new BRepApprox_ApproxLine(AppC,AppC2d,CNull);
7fd59977 383
5c953701 384 Standard_Integer dmin=4,dmax=8,niter=0;
385 Standard_Boolean tg= Standard_False;
386 BRepApprox_Approx Approx;
387 Standard_Real TOL3d,TOL2d,TOL=0.0001;
7fd59977 388
5c953701 389 Maxx-=Minx; Maxy-=Miny; Maxz-=Minz;
390 Maxu-=Minu; Maxv-=Minv;
391 if(Maxy>Maxx) Maxx=Maxy;
392 if(Maxz>Maxx) Maxx=Maxy;
393 if(Maxv>Maxu) Maxu=Maxv;
7fd59977 394
5c953701 395 TOL3d=TOL*Maxx; if(TOL3d<1e-12) TOL3d=1e-12; else if(TOL3d>0.1) TOL3d=0.1;
396 TOL2d=TOL*Maxu; if(TOL2d<1e-12) TOL2d=1e-12; else if(TOL2d>0.1) TOL2d=0.1;
7fd59977 397
5c953701 398 //-- cout<<"\nHLRTopoBRep_DSFiller : nbp="<<nbp<<" Tol3d="<<TOL3d<<" Tol2d="<<TOL2d<<endl;
7fd59977 399
4e14c88f 400 Approx.SetParameters(TOL3d, TOL2d, dmin, dmax, niter, 30, tg);
5c953701 401 Approx.Perform(AppLine,Standard_True,Standard_True,Standard_False,1,nbp);
402 if (!Approx.IsDone()) {
403 C = AppC;
404 C2d=AppC2d;
405 first = 1;
406 last = nbp;
407 }
408 else {
409 const AppParCurves_MultiBSpCurve& AppVal = Approx.Value(1);
410 TColgp_Array1OfPnt poles3d(1,AppVal.NbPoles());
411 AppVal.Curve(1,poles3d);
412 C = new Geom_BSplineCurve(poles3d,AppVal.Knots(),AppVal.Multiplicities(),AppVal.Degree());
7fd59977 413
5c953701 414 const AppParCurves_MultiBSpCurve& AppVal2 = Approx.Value(2);
415 TColgp_Array1OfPnt2d poles2d(1,AppVal2.NbPoles());
416 AppVal2.Curve(2,poles2d);
417 C2d = new Geom2d_BSplineCurve(poles2d,AppVal2.Knots(),AppVal2.Multiplicities(),AppVal2.Degree());
418 first = C2d->FirstParameter();
419 last = C2d->LastParameter();
420 }
421 }
422 }
423 break;
7fd59977 424
5c953701 425 case Contap_Restriction :
426 {
427 Standard_ProgramError::Raise("HLRTopoBRep_DSFiller::InsertFace : Restriction");
428 }
429 break;
430 }
7fd59977 431
5c953701 432 // compute the PCurve
433 // make the edge
434 if (!InsuffisantNumberOfPoints) {
435 TopoDS_Edge E;
436 BRep_Builder B;
437 B.MakeEdge(E,C,tol);
438 VF.Orientation(TopAbs_FORWARD);
439 VL.Orientation(TopAbs_REVERSED);
440 B.Add(E,VF);
441 B.Add(E,VL);
442 B.Range(E,first,last);
443
444 if (!C2d.IsNull()) {
5c953701 445 B.UpdateEdge(E,C2d,F,BRep_Tool::Tolerance(F));
446 }
7fd59977 447
5c953701 448 // add the edge in the DS
449 if (!E.IsNull())
450 IntL.Append(E);
451 }
452 }
453 }
7fd59977 454 }
455 }
456 }
854e0d4a 457
458 //Correction of internal outlines: unite coinciding vertices
459 const Standard_Real SqTol = tol*tol;
460 TopTools_ListIteratorOfListOfShape itl1(IntL);
461 for (; itl1.More(); itl1.Next())
462 {
463 TopoDS_Edge anIntLine = TopoDS::Edge(itl1.Value());
464 anIntLine.Orientation(TopAbs_FORWARD);
465 TopoDS_Vertex aVer [2];
466 TopExp::Vertices(anIntLine, aVer[0], aVer[1]);
467 TopTools_ListIteratorOfListOfShape itl2 = itl1;
468 for (; itl2.More(); itl2.Next())
469 {
470 TopoDS_Edge anIntLine2 = TopoDS::Edge(itl2.Value());
471 anIntLine2.Orientation(TopAbs_FORWARD);
472 if (anIntLine2.IsSame(anIntLine))
473 continue;
474 TopoDS_Vertex aVer2 [2];
475 TopExp::Vertices(anIntLine2, aVer2[0], aVer2[1]);
476 for (Standard_Integer i = 0; i < 2; i++)
477 {
478 if (i == 1 && aVer[0].IsSame(aVer[1]))
479 continue;
480 gp_Pnt Pnt1 = BRep_Tool::Pnt(aVer[i]);
481 for (Standard_Integer j = 0; j < 2; j++)
482 {
483 if (aVer[i].IsSame(aVer2[j]))
484 continue;
485 gp_Pnt Pnt2 = BRep_Tool::Pnt(aVer2[j]);
486 if (Pnt1.SquareDistance(Pnt2) <= SqTol)
487 {
488 BRep_Builder aBB;
489 aBB.Remove(anIntLine2, aVer2[j]);
490 aVer[i].Orientation((j==0)? TopAbs_FORWARD : TopAbs_REVERSED);
491 aBB.Add(anIntLine2, aVer[i]);
492 }
493 }
494 }
495 }
496 }
7fd59977 497}
498
499//=======================================================================
500//function : MakeVertex
501//purpose : private, make a vertex from an intersection point
502//=======================================================================
503
504TopoDS_Vertex
e2065c2f 505HLRTopoBRep_DSFiller::MakeVertex (const Contap_Point& P,
7fd59977 506 const Standard_Real tol,
507 HLRTopoBRep_Data& DS)
508{
509 BRep_Builder B;
510 TopoDS_Vertex V;
511 if (P.IsVertex()) {
512 V = Handle(BRepTopAdaptor_HVertex)::DownCast(P.Vertex())->Vertex();
513 DS.AddOutV(V);
514 }
515 else {
516 // if on arc, insert in the DS
517 if (P.IsOnArc()) {
518 const TopoDS_Edge& E =
519 (*(BRepAdaptor_Curve2d*)&((P.Arc())->Curve2d())).Edge();
520 Standard_Real Par = P.ParameterOnArc();
521 const gp_Pnt& P3d = P.Value();
522
523 for (DS.InitVertex(E); DS.MoreVertex(); DS.NextVertex()) {
524 TopoDS_Vertex curV = DS.Vertex();
525 Standard_Real curP = DS.Parameter();
526 const gp_Pnt& PPP=BRep_Tool::Pnt(curV);
527 Standard_Real TTT=BRep_Tool::Tolerance(curV);
528 if (P3d.IsEqual(PPP,TTT)) {
529 V = curV;
530 break;
531 }
532 else if (Par < curP) {
533 B.MakeVertex(V,P.Value(),tol);
534 DS.InsertBefore(V,Par);
535 break;
536 }
537 }
538 if (!DS.MoreVertex()) {
539 B.MakeVertex(V,P.Value(),tol);
540 DS.Append(V,Par);
541 }
542 DS.AddOutV(V);
543 }
544 // if internal create a vertex and insert in the DS
545 else {
546 B.MakeVertex(V,P.Value(),tol);
547 if (P.IsInternal())
548 DS.AddIntV(V);
549 else
550 DS.AddOutV(V);
551 }
552 }
553 return V;
554}
555
556//=======================================================================
557//function : InsertVertex
558//purpose : private, insert a vertex from an internal intersection point
559// on resctriction
560//=======================================================================
561
562void
e2065c2f 563HLRTopoBRep_DSFiller::InsertVertex (const Contap_Point& P,
7fd59977 564 const Standard_Real tol,
565 const TopoDS_Edge& E,
566 HLRTopoBRep_Data& DS)
567{
568 BRep_Builder B;
569 TopoDS_Vertex V;
570
571 if (P.IsVertex()) {
572 V = Handle(BRepTopAdaptor_HVertex)::DownCast(P.Vertex())->Vertex();
573 }
574 else {
575 Standard_Real Par = P.ParameterOnLine();
576
577 for (DS.InitVertex(E); DS.MoreVertex(); DS.NextVertex()) {
578 TopoDS_Vertex curV = DS.Vertex();
579 Standard_Real curP = DS.Parameter();
580 if (P.Value().IsEqual(BRep_Tool::Pnt(curV),
581 BRep_Tool::Tolerance(curV))) {
582 V = curV;
583 break;
584 }
585 else if (Par < curP) {
586 B.MakeVertex(V,P.Value(),tol);
587 DS.InsertBefore(V,Par);
588 break;
589 }
590 }
591 if (!DS.MoreVertex()) {
592 B.MakeVertex(V,P.Value(),tol);
593 DS.Append(V,Par);
594 }
595 }
596 DS.AddIntV(V);
597}
598
599//=======================================================================
600//function : ProcessEdges
601//purpose : private, split edges with outline vertices
602//=======================================================================
603
604void HLRTopoBRep_DSFiller::ProcessEdges (HLRTopoBRep_Data& DS)
605{
606 BRep_Builder B;
607 TopoDS_Edge newE;
608 TopoDS_Vertex VF,VL,VI;
609 Standard_Real PF,PL,PI;
610
611 for (DS.InitEdge(); DS.MoreEdge(); DS.NextEdge()) {
612 TopoDS_Edge E = DS.Edge();
613 TopTools_ListOfShape& SplE = DS.AddSplE(E);
614 VF = TopExp::FirstVertex(E);
615 VL = TopExp::LastVertex(E);
616 BRep_Tool::Range(E,PF,PL);
617 VF.Orientation(TopAbs_FORWARD);
618 VL.Orientation(TopAbs_REVERSED);
619
620 for (DS.InitVertex(E); DS.MoreVertex(); DS.NextVertex()) {
621 VI = DS.Vertex();
622 PI = DS.Parameter();
623 VI.Orientation(TopAbs_REVERSED);
624 newE = E;
625 newE.EmptyCopy();
626 newE.Orientation(TopAbs_FORWARD);
627 B.Add(newE,VF);
628 B.UpdateVertex(VF,PF,newE,BRep_Tool::Tolerance(VF));
629 B.Add(newE,VI);
630 B.UpdateVertex(VI,PI,newE,BRep_Tool::Tolerance(VI));
631 newE.Orientation(E.Orientation());
632 SplE.Append(newE);
633 VF = VI;
634 PF = PI;
635 VF.Orientation(TopAbs_FORWARD);
636 }
637 newE = E;
638 newE.EmptyCopy();
639 newE.Orientation(TopAbs_FORWARD);
640 B.Add(newE,VF);
641 B.UpdateVertex(VF,PF,newE,BRep_Tool::Tolerance(VF));
642 B.Add(newE,VL);
643 B.UpdateVertex(VL,PL,newE,BRep_Tool::Tolerance(VL));
644 newE.Orientation(E.Orientation());
645 SplE.Append(newE);
646 }
647}
648