0023625: New functionality building reflect lines on a shape
[occt.git] / src / IntStart / IntStart_SearchOnBoundaries_2.gxx
1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2012 OPEN CASCADE SAS
3 //
4 // The content of this file is subject to the Open CASCADE Technology Public
5 // License Version 6.5 (the "License"). You may not use the content of this file
6 // except in compliance with the License. Please obtain a copy of the License
7 // at http://www.opencascade.org and read it completely before using this file.
8 //
9 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
10 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
11 //
12 // The Original Code and all software distributed under the License is
13 // distributed on an "AS IS" basis, without warranty of any kind, and the
14 // Initial Developer hereby disclaims all such warranties, including without
15 // limitation, any warranties of merchantability, fitness for a particular
16 // purpose or non-infringement. Please see the License for the specific terms
17 // and conditions governing the rights and limitations under the License.
18
19 #include <Precision.hxx>
20 //=======================================================================
21 //function : IntStart_SearchOnBoundaries::IntStart_SearchOnBoundaries
22 //purpose  : 
23 //=======================================================================
24 IntStart_SearchOnBoundaries::IntStart_SearchOnBoundaries ()
25 :  done(Standard_False) 
26 {
27 }  
28
29 //=======================================================================
30 //function : Perform
31 //purpose  : 
32 //=======================================================================
33   void IntStart_SearchOnBoundaries::Perform (TheFunction& Func,
34                                              const Handle(TheTopolTool)& Domain,
35                                              const Standard_Real TolBoundary,
36                                              const Standard_Real TolTangency,
37                                              const Standard_Boolean RecheckOnRegularity)
38 {
39   
40   done = Standard_False;
41   spnt.Clear();
42   sseg.Clear();
43
44   Standard_Boolean Arcsol;
45   Standard_Real PDeb,PFin, prm, tol;
46   Standard_Integer i, nbknown, nbfound,index;
47   gp_Pnt pt;
48   
49   Domain->Init();
50
51   if (Domain->More()) {
52     all  = Standard_True;
53   }
54   else {
55     all = Standard_False;
56   }
57
58   while (Domain->More()) {
59     TheArc A = Domain->Value();
60     if (!TheSOBTool::HasBeenSeen(A)) {
61       Func.Set(A);
62       FindVertex(A,Domain,Func,spnt,TolBoundary);
63       TheSOBTool::Bounds(A,PDeb,PFin);
64       if(Precision::IsNegativeInfinite(PDeb) || 
65          Precision::IsPositiveInfinite(PFin)) { 
66
67         InfiniteArc(A,Domain,PDeb,PFin,Func,spnt,sseg,
68                     TolBoundary,TolTangency,Arcsol);
69       }
70       else { 
71         BoundedArc(A,Domain,PDeb,PFin,Func,spnt,sseg,
72                    TolBoundary,TolTangency,Arcsol,RecheckOnRegularity);
73       }
74       all = (all && Arcsol);
75     }
76     
77     else {
78       // as it seems we'll never be here, because 
79       // TheSOBTool::HasBeenSeen(A) always returns FALSE
80       nbfound = spnt.Length();
81
82       // On recupere les points connus
83       nbknown = TheSOBTool::NbPoints(A);
84       for (i=1; i<=nbknown; i++) {
85         TheSOBTool::Value(A,i,pt,tol,prm);
86         if (TheSOBTool::IsVertex(A,i)) {
87           TheVertex vtx;
88           TheSOBTool::Vertex(A,i,vtx);
89           spnt.Append(IntStart_ThePathPoint(pt,tol,vtx,A,prm));
90         }
91         else {
92           spnt.Append(IntStart_ThePathPoint(pt,tol,A,prm));
93         }
94       }
95       // On recupere les arcs solutions
96       nbknown = TheSOBTool::NbSegments(A);
97       for (i=1; i<=nbknown; i++) {
98         IntStart_TheSegment newseg;
99         newseg.SetValue(A);
100         if (TheSOBTool::HasFirstPoint(A,i,index)) {
101           newseg.SetLimitPoint(spnt.Value(nbfound+index),Standard_True);
102         }
103         if (TheSOBTool::HasLastPoint(A,i,index)) {
104           newseg.SetLimitPoint(spnt.Value(nbfound+index),Standard_False);
105         }
106         sseg.Append(newseg);
107       }
108
109       all = (all& TheSOBTool::IsAllSolution(A));
110     }
111     Domain->Next();
112   }
113   done = Standard_True;
114 }
115