0023377: Error in importing a rational spline IGES surface [Type 128, PROP3 = 0]...
[occt.git] / src / IGESGeom / IGESGeom_BSplineSurface.cxx
1 // Created by: CKY / Contract Toubro-Larsen
2 // Copyright (c) 1993-1999 Matra Datavision
3 // Copyright (c) 1999-2012 OPEN CASCADE SAS
4 //
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
9 //
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 //
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
19
20 //--------------------------------------------------------------------
21 //--------------------------------------------------------------------
22
23 #include <IGESGeom_BSplineSurface.ixx>
24 #include <Standard_OutOfRange.hxx>
25 #include <gp_GTrsf.hxx>
26
27
28 IGESGeom_BSplineSurface::IGESGeom_BSplineSurface ()    {  }
29
30
31     void IGESGeom_BSplineSurface::Init
32   (const Standard_Integer anIndexU, 
33    const Standard_Integer anIndexV, const Standard_Integer aDegU,
34    const Standard_Integer aDegV, const Standard_Boolean aCloseU,
35    const Standard_Boolean aCloseV, const Standard_Boolean aPolynom,
36    const Standard_Boolean aPeriodU, const Standard_Boolean aPeriodV,
37    const Handle(TColStd_HArray1OfReal)& allKnotsU,
38    const Handle(TColStd_HArray1OfReal)& allKnotsV,
39    const Handle(TColStd_HArray2OfReal)& allWeights,
40    const Handle(TColgp_HArray2OfXYZ)& allPoles,
41    const Standard_Real aUmin, const Standard_Real aUmax,
42    const Standard_Real aVmin, const Standard_Real aVmax)
43 {
44   if (allWeights->RowLength() !=  allPoles->RowLength() || 
45       allWeights->ColLength() !=  allPoles->ColLength())
46     Standard_DimensionMismatch::Raise("IGESGeom_BSplineSurface : Init");
47   if (allKnotsU->Lower() != -aDegU       || allKnotsV->Lower() != -aDegV     ||
48       allKnotsU->Upper() != anIndexU+1   || allKnotsV->Upper() != anIndexV+1 ||
49       allWeights->LowerRow() != 0        || allWeights->LowerCol() != 0 ||
50       allPoles->LowerRow()   != 0        || allPoles->LowerCol()   != 0 ||
51       allPoles->UpperRow()   != anIndexU || allPoles->UpperCol()   != anIndexV)
52     Standard_DimensionMismatch::Raise("IGESGeom_BSplineSurface : Init");
53
54   theIndexU    = anIndexU;
55   theIndexV    = anIndexV;
56   theDegreeU   = aDegU;
57   theDegreeV   = aDegV;
58   isClosedU    = aCloseU;
59   isClosedV    = aCloseV;
60   isPolynomial = aPolynom;
61   isPeriodicU  = aPeriodU;
62   isPeriodicV  = aPeriodV;
63   theKnotsU    = allKnotsU; 
64   theKnotsV    = allKnotsV; 
65   theWeights   = allWeights;
66   thePoles     = allPoles;
67   theUmin      = aUmin;
68   theUmax      = aUmax;
69   theVmin      = aVmin;
70   theVmax      = aVmax;
71   InitTypeAndForm(128,FormNumber());
72 // FormNumber  precises the shape  0-9
73 }
74
75     void  IGESGeom_BSplineSurface::SetFormNumber (const Standard_Integer form)
76 {
77   if (form < 0 || form > 9) Standard_OutOfRange::Raise
78     ("IGESGeom_BSplineSurface : SetFormNumber");
79   InitTypeAndForm(128,form);
80 }
81
82     Standard_Integer IGESGeom_BSplineSurface::UpperIndexU () const
83 {
84   return theIndexU;
85 }
86
87     Standard_Integer IGESGeom_BSplineSurface::UpperIndexV () const
88 {
89   return theIndexV;
90 }
91
92     Standard_Integer IGESGeom_BSplineSurface::DegreeU () const
93 {
94   return theDegreeU;
95 }
96
97     Standard_Integer IGESGeom_BSplineSurface::DegreeV () const
98 {
99   return theDegreeV;
100 }
101
102     Standard_Boolean IGESGeom_BSplineSurface::IsClosedU () const
103 {
104   return isClosedU;
105 }
106
107     Standard_Boolean IGESGeom_BSplineSurface::IsClosedV () const
108 {
109   return isClosedV;
110 }
111
112     Standard_Boolean IGESGeom_BSplineSurface::IsPolynomial
113   (const Standard_Boolean flag) const
114 {
115   if (flag) return isPolynomial;
116   Standard_Integer i,j;
117   Standard_Real w0 = theWeights->Value(0,0);
118   /*CR23377
119   * Following fix is needed to address Rational surface with non-unitary weights at last index
120   * Limit for indices are changed from theIndexV-->theIndexV+1 (=NbPolesV())
121   *                                    theIndexU--> theIndexU+1 (=NbPolesU())
122   */
123   for ( j = 0; j < (theIndexV+1); j ++)
124     for (i = 0; i < (theIndexU+1); i ++)
125       if (Abs(theWeights->Value(i,j) - w0) > 1.e-10) return Standard_False;
126   return Standard_True;
127 }
128
129     Standard_Boolean IGESGeom_BSplineSurface::IsPeriodicU () const
130 {
131   return isPeriodicU;
132 }
133
134     Standard_Boolean IGESGeom_BSplineSurface::IsPeriodicV () const
135 {
136   return isPeriodicV;
137 }
138
139     Standard_Integer IGESGeom_BSplineSurface::NbKnotsU () const
140 {
141   return theKnotsU->Length();
142 }
143
144     Standard_Integer IGESGeom_BSplineSurface::NbKnotsV () const
145 {
146   return theKnotsV->Length();
147 }
148
149     Standard_Real IGESGeom_BSplineSurface::KnotU
150   (const Standard_Integer anIndex) const
151 {
152   return theKnotsU->Value(anIndex);
153 }
154
155     Standard_Real IGESGeom_BSplineSurface::KnotV
156   (const Standard_Integer anIndex) const
157 {
158   return theKnotsV->Value(anIndex);
159 }
160
161     Standard_Integer IGESGeom_BSplineSurface::NbPolesU () const
162 {
163   return theIndexU+1;
164 }
165
166     Standard_Integer IGESGeom_BSplineSurface::NbPolesV () const
167 {
168   return theIndexV+1;
169 }
170
171     Standard_Real IGESGeom_BSplineSurface::Weight
172   (const Standard_Integer anIndex1, const Standard_Integer anIndex2) const 
173 {
174   return theWeights->Value(anIndex1, anIndex2);
175 }
176
177     gp_Pnt IGESGeom_BSplineSurface::Pole
178   (const Standard_Integer anIndex1, const Standard_Integer anIndex2) const
179 {
180   gp_XYZ tempXYZ = thePoles->Value(anIndex1,anIndex2);
181   // Reversal of the order of indices since the poles are
182   // stored in the array like that. See ReadOwnParams()
183   gp_Pnt Pole(tempXYZ);
184   return Pole;
185 }
186
187     gp_Pnt IGESGeom_BSplineSurface::TransformedPole
188   (const Standard_Integer anIndex1, const Standard_Integer anIndex2) const
189 {
190   gp_XYZ tempXYZ = thePoles->Value(anIndex1, anIndex2);
191   // Reversal of the order of indices since the poles are
192   // stored in the array like that. See ReadOwnParams()
193   if (HasTransf()) Location().Transforms(tempXYZ);
194   gp_Pnt Pole(tempXYZ);
195   return Pole;
196 }
197
198     Standard_Real IGESGeom_BSplineSurface::UMin ()  const
199 {
200   return theUmin;
201 }
202
203     Standard_Real IGESGeom_BSplineSurface::UMax ()  const
204 {
205   return theUmax;
206 }
207
208     Standard_Real IGESGeom_BSplineSurface::VMin ()  const
209 {
210   return theVmin;
211 }
212
213     Standard_Real IGESGeom_BSplineSurface::VMax ()  const
214 {
215   return theVmax;
216 }