0024135: Result of reading step file is invalid.
[occt.git] / src / StepToGeom / StepToGeom_MakeBSplineCurve.pxx
index 57e7dc8..7eb21df 100755 (executable)
@@ -1,6 +1,23 @@
-// File:       StepToGeom_MakeBSplineCurve.pxx
-// Created:    Fri Jul  2 15:16:54 1993
-// Author:     Martine LANGLOIS
+// Created on: 1993-07-02
+// Created by: Martine LANGLOIS
+// Copyright (c) 1993-1999 Matra Datavision
+// Copyright (c) 1999-2012 OPEN CASCADE SAS
+//
+// The content of this file is subject to the Open CASCADE Technology Public
+// License Version 6.5 (the "License"). You may not use the content of this file
+// except in compliance with the License. Please obtain a copy of the License
+// at http://www.opencascade.org and read it completely before using this file.
+//
+// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
+// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+//
+// The Original Code and all software distributed under the License is
+// distributed on an "AS IS" basis, without warranty of any kind, and the
+// Initial Developer hereby disclaims all such warranties, including without
+// limitation, any warranties of merchantability, fitness for a particular
+// purpose or non-infringement. Please see the License for the specific terms
+// and conditions governing the rights and limitations under the License.
+
 
 {
   Handle(StepGeom_BSplineCurveWithKnots)   BSCW;
 
   const Standard_Integer Deg = BSCW->Degree();
   const Standard_Integer NbPoles = BSCW->NbControlPointsList();
-  //aControlPointsList = new StepGeom_HArray1OfCartesianPoint(1,NbPoles);
-  const Handle(StepGeom_HArray1OfCartesianPoint)& aControlPointsList = BSCW->ControlPointsList();
-  Array1OfPnt_gen Poles(1,NbPoles);
+  const Standard_Integer NbKnots = BSCW->NbKnotMultiplicities();
 
+  //aKnotMultiplicities = new TColStd_HArray1OfInteger(1,NbKnots);
+  const Handle(TColStd_HArray1OfInteger)& aKnotMultiplicities = BSCW->KnotMultiplicities();
+  
   Standard_Integer i;
+  Standard_Integer aFMulDiff = 0,aLMulDiff = 0;
+  TColStd_Array1OfInteger Mult(1,NbKnots);
+  for (i=1; i<=NbKnots; ++i) {
+    Standard_Integer aCurrentVal = aKnotMultiplicities->Value(i);
+    if (aCurrentVal > Deg + 1)
+    {
+      if (i == 1)       aFMulDiff = aCurrentVal - Deg - 1;
+      if (i == NbKnots) aLMulDiff = aCurrentVal - Deg - 1;
+#ifdef DEB
+      cout << "\nWrong multiplicity " << aCurrentVal <<  " on " << i 
+           << " knot!" << "\nChanged to " << Deg + 1 << endl;
+#endif
+      aCurrentVal = Deg + 1;
+    }
+    Mult.SetValue(i,aCurrentVal);
+  }
+  
+  //aControlPointsList = new StepGeom_HArray1OfCartesianPoint(1,NbPoles);
+  const Handle(StepGeom_HArray1OfCartesianPoint)& aControlPointsList = BSCW->ControlPointsList();
+  Standard_Integer aSumMulDiff = aFMulDiff + aLMulDiff;
+  Array1OfPnt_gen Poles(1,NbPoles - aSumMulDiff);
   CartesianPoint_gen P;
-  for (i=1; i<=NbPoles; i++)
+  
+  for (i = 1 + aFMulDiff; i<= NbPoles - aLMulDiff; ++i)
   {
     if (StepToGeom_MakeCartesianPoint_gen::Convert(aControlPointsList->Value(i),P))
-      Poles.SetValue(i,P->Pnt_fonc());
+      Poles.SetValue(i - aFMulDiff,P->Pnt_fonc());
     else
       return Standard_False;
   }
   
-  const Standard_Integer NbKnots = BSCW->NbKnotMultiplicities();
-
-  //aKnotMultiplicities = new TColStd_HArray1OfInteger(1,NbKnots);
-  const Handle(TColStd_HArray1OfInteger)& aKnotMultiplicities = BSCW->KnotMultiplicities();
-  TColStd_Array1OfInteger Mult(1,NbKnots);
-  for (i=1; i<=NbKnots; i++) {
-    Mult.SetValue(i,aKnotMultiplicities->Value(i));
-  }
-  
   //aKnots = new TColStd_HArray1OfReal(1,NbKnots);
   const Handle(TColStd_HArray1OfReal)& aKnots = BSCW->Knots();
   TColStd_Array1OfReal Kn(1,NbKnots);
     shouldBePeriodic = Standard_False;
     //cout << "Strange BSpline Curve Descriptor" << endl;
   }
-
+  
   if (SC->IsKind(STANDARD_TYPE(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve))) {
     const Handle(TColStd_HArray1OfReal)& aWeight = BSCWR->WeightsData();
     TColStd_Array1OfReal W(1,NbPoles);