0026937: Eliminate NO_CXX_EXCEPTION macro support
[occt.git] / src / IntCurveSurface / IntCurveSurface_Intersection.cxx
1 // Created on: 1993-04-16
2 // Created by: Laurent BUCHARD
3 // Copyright (c) 1993-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 <IntCurveSurface_Intersection.hxx>
19 #include <IntCurveSurface_IntersectionPoint.hxx>
20 #include <IntCurveSurface_IntersectionSegment.hxx>
21 #include <IntCurveSurface_TransitionOnCurve.hxx>
22 #include <Standard_OutOfRange.hxx>
23 #include <StdFail_NotDone.hxx>
24
25 #define PARAMEQUAL(a,b) (Abs((a)-(b))< (1e-8))
26
27 //================================================================================
28 IntCurveSurface_Intersection::IntCurveSurface_Intersection(): done(Standard_False) { 
29 }
30 //================================================================================
31 Standard_Boolean IntCurveSurface_Intersection::IsDone() const { return(done); } 
32 //================================================================================
33 Standard_Integer IntCurveSurface_Intersection::NbPoints() const { 
34   if (!done) {throw StdFail_NotDone();}
35   return lpnt.Length();
36 }
37 //================================================================================
38 Standard_Integer IntCurveSurface_Intersection::NbSegments() const { 
39   if (!done) {throw StdFail_NotDone();}
40   return lseg.Length();
41 }
42 //================================================================================
43 const IntCurveSurface_IntersectionPoint& IntCurveSurface_Intersection::Point( const Standard_Integer N) const {
44   if (!done) {throw StdFail_NotDone();}
45   return lpnt.Value(N);
46 }
47 //================================================================================
48 const IntCurveSurface_IntersectionSegment& IntCurveSurface_Intersection::Segment( const Standard_Integer N) const {
49   if (!done) {throw StdFail_NotDone();}
50   return lseg.Value(N);
51 }
52 //================================================================================
53 void IntCurveSurface_Intersection::SetValues(const IntCurveSurface_Intersection& Other) {
54   if(Other.done) {
55     lseg.Clear();
56     lpnt.Clear();
57     Standard_Integer N = Other.lpnt.Length();
58     Standard_Integer i ;
59     for( i=1; i<= N ; i++) { 
60       lpnt.Append(Other.lpnt.Value(i));
61     }
62     N = Other.lseg.Length();
63     for(i=1; i<= N ; i++) { 
64       lseg.Append(Other.lseg.Value(i));
65     } 
66     done=Standard_True;
67   }
68   else {
69     done=Standard_False;
70   }
71 }
72 //================================================================================
73 void IntCurveSurface_Intersection::Append(const IntCurveSurface_Intersection& Other,
74 //                                        const Standard_Real a,
75                                           const Standard_Real ,
76 //                                        const Standard_Real b) 
77                                           const Standard_Real ) 
78
79   Standard_Integer i,ni;
80   if(Other.done) { 
81     ni = Other.lpnt.Length();
82     for(i=1;i<=ni;i++) {   Append(Other.Point(i)); }
83     ni = Other.lseg.Length();
84     for(i=1;i<=ni;i++) {   Append(Other.Segment(i)); }
85   }
86 }
87 //================================================================================
88 void IntCurveSurface_Intersection::Append(const IntCurveSurface_IntersectionPoint& OtherPoint) { 
89   Standard_Integer i,ni;
90   Standard_Real anu,anv,anw,u,v,w;
91   IntCurveSurface_TransitionOnCurve   TrOnCurve,anTrOnCurve;
92   gp_Pnt P,anP;
93   ni = lpnt.Length();
94   for(i=1;i<=ni;i++) {
95     OtherPoint.Values(P,u,v,w,TrOnCurve);
96     lpnt(i).Values(anP,anu,anv,anw,anTrOnCurve);
97     if(PARAMEQUAL(u,anu)) { 
98       if(PARAMEQUAL(v,anv)) { 
99         if(PARAMEQUAL(w,anw)) { 
100           if(anTrOnCurve==TrOnCurve) { 
101             return;
102           }
103         }
104       }
105     }
106   }
107   lpnt.Append(OtherPoint);
108 }
109 //================================================================================
110 void IntCurveSurface_Intersection::Append(const IntCurveSurface_IntersectionSegment& OtherSegment) { 
111   lseg.Append(OtherSegment);
112 }
113 //================================================================================
114 void IntCurveSurface_Intersection::ResetFields() {
115   if(done) {
116     lseg.Clear();
117     lpnt.Clear();
118     done=Standard_False;
119   }
120 }
121 //================================================================================
122 void IntCurveSurface_Intersection::Dump() const { 
123   if(done) { 
124     Standard_Integer i,ni;
125     ni = lpnt.Length();
126     for(i=1;i<=ni;i++) {   Point(i).Dump(); }
127     ni = lseg.Length();
128     for(i=1;i<=ni;i++) {   Segment(i).Dump(); }
129   }
130   else { 
131     cout<<" Intersection NotDone"<<endl;
132   }
133 }