0032041: Modeling Data - Access violation ExchangeUV in Geom_BezierSurface
[occt.git] / src / Geom / Geom_BezierSurface.cxx
index 9e14f23..664fd90 100644 (file)
@@ -505,31 +505,33 @@ void Geom_BezierSurface::ExchangeUV ()
   Standard_Integer LR = poles->LowerRow();
   Standard_Integer UR = poles->UpperRow();
 
-  Handle(TColgp_HArray2OfPnt) npoles = 
-    new TColgp_HArray2OfPnt (LC, UC, LR, UR);
-  Handle(TColStd_HArray2OfReal) nweights =
-    new TColStd_HArray2OfReal (LC, UC, LR, UR);
-
-  const TColgp_Array2OfPnt   & spoles   = poles->Array2();
-  const TColStd_Array2OfReal & sweights = weights->Array2();
-
-  TColgp_Array2OfPnt&   snpoles   = npoles->ChangeArray2();
-  TColStd_Array2OfReal& snweights = nweights->ChangeArray2();
-  Standard_Integer i, j;
-  for (i = LC; i <= UC; i++) {
-    for (j = LR; j <= UR; j++) {
-      snpoles   (i,j) = spoles   (j,i);
-      snweights (i,j) = sweights (j,i);
+  Handle(TColgp_HArray2OfPnt) npoles = new TColgp_HArray2OfPnt (LC, UC, LR, UR);
+  Handle(TColStd_HArray2OfReal) nweights;
+  if (!weights.IsNull())
+  {
+    nweights = new TColStd_HArray2OfReal (LC, UC, LR, UR);
+  }
+
+  const TColgp_Array2OfPnt& spoles = poles->Array2();
+  const TColStd_Array2OfReal* sweights = !weights.IsNull() ? &weights->Array2() : NULL;
+
+  TColgp_Array2OfPnt& snpoles = npoles->ChangeArray2();
+  TColStd_Array2OfReal* snweights = !nweights.IsNull() ? &nweights->ChangeArray2() : NULL;
+  for (Standard_Integer i = LC; i <= UC; i++)
+  {
+    for (Standard_Integer j = LR; j <= UR; j++)
+    {
+      snpoles (i, j) = spoles (j, i);
+      if (snweights != NULL)
+      {
+        snweights->ChangeValue (i, j) = sweights->Value (j, i);
+      }
     }
   }
-
   poles   = npoles;
   weights = nweights;
 
-  Standard_Boolean temp = urational;
-  urational = vrational;
-  vrational = temp;
+  std::swap (urational, vrational);
 }
 
 //=======================================================================