1 // Created on: 1994-02-23
2 // Created by: Laurent BOURESCHE
3 // Copyright (c) 1994-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 <Geom_BSplineCurve.hxx>
19 #include <Geom_Curve.hxx>
20 #include <Geom_TrimmedCurve.hxx>
21 #include <GeomAbs_Shape.hxx>
22 #include <GeomLProp.hxx>
23 #include <GeomLProp_CLProps.hxx>
24 #include <gp_Dir.hxx>
25 #include <gp_Vec.hxx>
26 #include <Precision.hxx>
27 
GeomAbsToInteger(const GeomAbs_Shape gcont)28 static Standard_Integer GeomAbsToInteger(const GeomAbs_Shape  gcont)
29 {
30   Standard_Integer cont=0 ;
31   switch (gcont) {
32   case GeomAbs_C0 :
33       cont = 0 ;
34       break ;
35   case GeomAbs_G1 :
36       cont = 1 ;
37       break ;
38   case GeomAbs_C1 :
39       cont = 2 ;
40       break ;
41   case GeomAbs_G2 :
42       cont = 3 ;
43       break ;
44   case GeomAbs_C2 :
45       cont = 4 ;
46       break ;
47   case GeomAbs_C3 :
48       cont = 5 ;
49       break ;
50   case GeomAbs_CN :
51       cont = 6 ;
52       break ;
53   }
54  return cont ;
55 }
56 //=======================================================================
57 //function : Continuity
58 //purpose  :
59 //=======================================================================
60 
Continuity(const Handle (Geom_Curve)& C1,const Handle (Geom_Curve)& C2,const Standard_Real u1,const Standard_Real u2,const Standard_Boolean r1,const Standard_Boolean r2,const Standard_Real tl,const Standard_Real ta)61 GeomAbs_Shape GeomLProp::Continuity(const Handle(Geom_Curve)& C1,
62 				    const Handle(Geom_Curve)& C2,
63 				    const Standard_Real u1,
64 				    const Standard_Real u2,
65 				    const Standard_Boolean r1,
66 				    const Standard_Boolean r2,
67 				    const Standard_Real tl,
68 				    const Standard_Real ta)
69 {
70   GeomAbs_Shape cont = GeomAbs_C0;
71   Standard_Integer index1,
72     index2 ;
73   Standard_Real  tolerance ;
74   Standard_Boolean fini = Standard_False;
75   gp_Vec d1,d2;
76   gp_Dir dir1,dir2;
77   Standard_Integer cont1, cont2 ;
78   GeomAbs_Shape gcont1 = C1->Continuity(), gcont2 = C2->Continuity();
79   cont1 = GeomAbsToInteger(gcont1) ;
80   cont2 = GeomAbsToInteger(gcont2) ;
81 
82   Handle(Geom_Curve) aCurve1 = C1 ;
83   Handle(Geom_Curve) aCurve2 = C2 ;
84   if (C1->IsKind(STANDARD_TYPE(Geom_TrimmedCurve))){
85     Handle(Geom_TrimmedCurve) aTrimmed =
86       Handle(Geom_TrimmedCurve) ::DownCast(aCurve1) ;
87     aCurve1 = aTrimmed->BasisCurve() ;
88   }
89   if (C2->IsKind(STANDARD_TYPE(Geom_TrimmedCurve))){
90     Handle(Geom_TrimmedCurve) aTrimmed =
91       Handle(Geom_TrimmedCurve) ::DownCast(aCurve2) ;
92     aCurve2 = aTrimmed->BasisCurve() ;
93   }
94   if (aCurve1->IsKind(STANDARD_TYPE(Geom_BSplineCurve))){
95     Handle(Geom_BSplineCurve) BSplineCurve =
96       Handle(Geom_BSplineCurve)::DownCast(aCurve1) ;
97     BSplineCurve->Resolution(tl,
98 			 tolerance) ;
99     BSplineCurve->LocateU(
100 		   u1,
101 		   tolerance,
102 		   index1,
103 		   index2) ;
104 
105     if (index1 > 1 && index2 < BSplineCurve->NbKnots() && index1 == index2) {
106        cont1 = BSplineCurve->Degree() - BSplineCurve->Multiplicity(index1) ;
107     }
108     else {
109       cont1 = 5 ;
110     }
111   }
112   if (aCurve2->IsKind(STANDARD_TYPE(Geom_BSplineCurve))){
113     Handle(Geom_BSplineCurve) BSplineCurve =
114       Handle(Geom_BSplineCurve)::DownCast(aCurve2) ;
115     BSplineCurve->Resolution(tl,
116 			 tolerance) ;
117     BSplineCurve->LocateU(
118 		   u2,
119 		   tolerance,
120 		   index1,
121 		   index2) ;
122 
123     if (index1 > 1 && index2 < BSplineCurve->NbKnots() && index1 == index2) {
124        cont2 = BSplineCurve->Degree() - BSplineCurve->Multiplicity(index1) ;
125     }
126     else {
127       cont2 = 5 ;
128     }
129   }
130   Standard_Integer n1 = 0, n2 = 0;
131   if (cont1 >= 5) n1 = 3;
132   else if(cont1 == 4) n1 = 2;
133   else if(cont1 == 2) n1 = 1;
134   if (cont2 >= 5) n2 = 3;
135   else if(cont2 == 4) n2 = 2;
136   else if(cont2 == 2) n2 = 1;
137   GeomLProp_CLProps clp1(C1,u1,n1,tl);
138   GeomLProp_CLProps clp2(C2,u2,n2,tl);
139   if(!(clp1.Value().IsEqual(clp2.Value(),tl))) {
140     throw Standard_Failure("Courbes non jointives");
141   }
142   Standard_Integer min = Min(n1,n2);
143   if ( min >= 1 ) {
144     d1 = clp1.D1();
145     d2 = clp2.D1();
146     if(r1) d1.Reverse();
147     if(r2) d2.Reverse();
148     if(d1.IsEqual(d2,tl,ta)) {
149       cont = GeomAbs_C1;
150     }
151     else if(clp1.IsTangentDefined() && clp2.IsTangentDefined()){
152       clp1.Tangent(dir1);
153       clp2.Tangent(dir2);
154       if(r1) dir1.Reverse();
155       if(r2) dir2.Reverse();
156       if(dir1.IsEqual(dir2,ta)){
157 	cont = GeomAbs_G1;
158       }
159       fini = Standard_True;
160     }
161     else {fini = Standard_True; }
162   }
163   if ( min >= 2 && !fini ) {
164     d1 = clp1.D2();
165     d2 = clp2.D2();
166     if(d1.IsEqual(d2,tl,ta)){
167       cont = GeomAbs_C2;
168     }
169   }
170   return cont;
171 }
172 
173 
174 //=======================================================================
175 //function : Continuity
176 //purpose  :
177 //=======================================================================
178 
Continuity(const Handle (Geom_Curve)& C1,const Handle (Geom_Curve)& C2,const Standard_Real u1,const Standard_Real u2,const Standard_Boolean r1,const Standard_Boolean r2)179 GeomAbs_Shape GeomLProp::Continuity(const Handle(Geom_Curve)& C1,
180 				    const Handle(Geom_Curve)& C2,
181 				    const Standard_Real u1,
182 				    const Standard_Real u2,
183 				    const Standard_Boolean r1,
184 				    const Standard_Boolean r2)
185 {
186   return Continuity(C1,C2,u1,u2,r1,r2,
187 		    Precision::Confusion(),Precision::Angular());
188 }
189