0022680: Empty result after STEP import
authormartinsiggel <martin.siggel@dlr.de>
Thu, 21 Aug 2014 10:37:04 +0000 (14:37 +0400)
committerbugmaster <bugmaster@opencascade.com>
Thu, 21 Aug 2014 11:51:20 +0000 (15:51 +0400)
Fixed identical knots not correctly handled in STEP import

Test cases for issue CR22680

Correction test cases for CR22680

src/StepToGeom/StepToGeom_MakeBSplineCurve.pxx
src/StepToGeom/StepToGeom_MakeBSplineSurface.cxx
tests/bugs/step/bug22680 [new file with mode: 0644]
tests/de/step_2/C9 [changed mode: 0644->0755]
tests/de/step_3/D1 [changed mode: 0644->0755]

index 5955747..5c5ba09 100644 (file)
 
   //aKnotMultiplicities = new TColStd_HArray1OfInteger(1,NbKnots);
   const Handle(TColStd_HArray1OfInteger)& aKnotMultiplicities = BSCW->KnotMultiplicities();
+  //aKnots = new TColStd_HArray1OfReal(1,NbKnots);
+  const Handle(TColStd_HArray1OfReal)& aKnots = BSCW->Knots();
   
+  // Count number of unique knots
   Standard_Integer i;
-  Standard_Integer aFMulDiff = 0,aLMulDiff = 0;
-  TColStd_Array1OfInteger Mult(1,NbKnots);
+  Standard_Integer NbUniqueKnots = 0;
+  Standard_Real lastKnot = RealFirst();
   for (i=1; i<=NbKnots; ++i) {
-    Standard_Integer aCurrentVal = aKnotMultiplicities->Value(i);
+    if (aKnots->Value(i) - lastKnot > Epsilon (Abs(lastKnot))) {
+      NbUniqueKnots++;
+      lastKnot = aKnots->Value(i);
+    }
+  }
+  
+  TColStd_Array1OfReal Kn(1,NbUniqueKnots);
+  TColStd_Array1OfInteger Mult(1,NbUniqueKnots);
+  lastKnot = aKnots->Value(1);
+  Kn.SetValue(1, aKnots->Value(1));
+  Mult.SetValue(1, aKnotMultiplicities->Value(1));
+  Standard_Integer pos = 1;
+  for (i=2; i<=NbKnots; i++) {
+    if (aKnots->Value(i) - lastKnot > Epsilon (Abs(lastKnot))) {
+      pos++;
+      Kn.SetValue(pos, aKnots->Value(i));
+      Mult.SetValue(pos, aKnotMultiplicities->Value(i));
+      lastKnot = aKnots->Value(i);
+    }
+    else {
+      // Knot not unique, increase multiplicity
+      Standard_Integer curMult = Mult.Value(pos);
+      Mult.SetValue(pos, curMult + aKnotMultiplicities->Value(i));
+    }
+  }
+
+  Standard_Integer aFMulDiff = 0,aLMulDiff = 0;
+  for (i=1; i<=NbUniqueKnots; ++i) {
+    Standard_Integer aCurrentVal = Mult.Value(i);
     if (aCurrentVal > Deg + 1)
     {
       if (i == 1)       aFMulDiff = aCurrentVal - Deg - 1;
       return Standard_False;
   }
   
-  //aKnots = new TColStd_HArray1OfReal(1,NbKnots);
-  const Handle(TColStd_HArray1OfReal)& aKnots = BSCW->Knots();
-  TColStd_Array1OfReal Kn(1,NbKnots);
-  for (i=1; i<=NbKnots; i++) {
-    Kn.SetValue(i,aKnots->Value(i));
-  }
-  
   // --- Does the Curve descriptor LOOKS like a periodic descriptor ? ---
 
   Standard_Integer SumMult = 0;
-  for (i=1; i<=NbKnots; i++) {
-    SumMult += aKnotMultiplicities->Value(i);
+  for (i=1; i<=NbUniqueKnots; i++) {
+    SumMult += Mult.Value(i);
   }
   
   Standard_Boolean shouldBePeriodic;
   if (SumMult == (NbPoles + Deg + 1)) {
     shouldBePeriodic = Standard_False;
   }
-  else if ((aKnotMultiplicities->Value(1) == 
-           aKnotMultiplicities->Value(NbKnots)) &&
-          ((SumMult - aKnotMultiplicities->Value(1)) == NbPoles)) {
+  else if ((Mult.Value(1) == 
+           Mult.Value(NbUniqueKnots)) &&
+          ((SumMult - Mult.Value(1)) == NbPoles)) {
     shouldBePeriodic = Standard_True;
   }
   else {  // --- What is that ??? ---
index 2589be8..461a7ec 100644 (file)
@@ -71,25 +71,71 @@ Standard_Boolean StepToGeom_MakeBSplineSurface::Convert
   }
   const Standard_Integer NUKnots = BS->NbUMultiplicities();
   const Handle(TColStd_HArray1OfInteger)& aUMultiplicities = BS->UMultiplicities();
-  TColStd_Array1OfInteger UMult(1,NUKnots);
+  const Handle(TColStd_HArray1OfReal)& aUKnots = BS->UKnots();
+  
+  // count number of unique uknots
+  Standard_Real lastKnot = RealFirst();
+  Standard_Integer NUKnotsUnique = 0;
   for (i=1; i<=NUKnots; i++) {
-    UMult.SetValue(i,aUMultiplicities->Value(i));
+    if (aUKnots->Value(i) - lastKnot > Epsilon (Abs(lastKnot))) {
+      NUKnotsUnique++;
+      lastKnot = aUKnots->Value(i);
+    }
+  }
+
+  // set umultiplicities and uknots
+  TColStd_Array1OfInteger UMult(1,NUKnotsUnique);
+  TColStd_Array1OfReal KUn(1,NUKnotsUnique);
+  Standard_Integer pos = 1;
+  lastKnot = aUKnots->Value(1);
+  KUn.SetValue(1, aUKnots->Value(1));
+  UMult.SetValue(1, aUMultiplicities->Value(1));
+  for (i=2; i<=NUKnots; i++) {
+    if (aUKnots->Value(i) - lastKnot > Epsilon (Abs(lastKnot))) {
+      pos++;
+      KUn.SetValue(pos, aUKnots->Value(i));
+      UMult.SetValue(pos, aUMultiplicities->Value(i));
+      lastKnot = aUKnots->Value(i);
+    }
+    else {
+      // Knot not unique, increase multiplicity
+      Standard_Integer curMult = UMult.Value(pos);
+      UMult.SetValue(pos, curMult + aUMultiplicities->Value(i));
+    }
   }
   const Standard_Integer NVKnots = BS->NbVMultiplicities();
   const Handle(TColStd_HArray1OfInteger)& aVMultiplicities = BS->VMultiplicities();
-  TColStd_Array1OfInteger VMult(1,NVKnots);
-  for (i=1; i<=NVKnots; i++) {
-    VMult.SetValue(i,aVMultiplicities->Value(i));
-  }
-  const Handle(TColStd_HArray1OfReal)& aUKnots = BS->UKnots();
-  TColStd_Array1OfReal KUn(1,NUKnots);
-  for (i=1; i<=NUKnots; i++) {
-    KUn.SetValue(i,aUKnots->Value(i));
-  }
   const Handle(TColStd_HArray1OfReal)& aVKnots = BS->VKnots();
-  TColStd_Array1OfReal KVn(1,NVKnots);
+  
+  // count number of unique vknots
+  lastKnot = RealFirst();
+  Standard_Integer NVKnotsUnique = 0;
   for (i=1; i<=NVKnots; i++) {
-    KVn.SetValue(i,aVKnots->Value(i));
+    if (aVKnots->Value(i) - lastKnot > Epsilon (Abs(lastKnot))) {
+      NVKnotsUnique++;
+      lastKnot = aVKnots->Value(i);
+    }
+  }
+  
+  // set vmultiplicities and vknots
+  TColStd_Array1OfInteger VMult(1,NVKnotsUnique);
+  TColStd_Array1OfReal KVn(1,NVKnotsUnique);
+  pos = 1;
+  lastKnot = aVKnots->Value(1);
+  KVn.SetValue(1, aVKnots->Value(1));
+  VMult.SetValue(1, aVMultiplicities->Value(1));
+  for (i=2; i<=NVKnots; i++) {
+    if (aVKnots->Value(i) - lastKnot > Epsilon (Abs(lastKnot))) {
+      pos++;
+      KVn.SetValue(pos, aVKnots->Value(i));
+      VMult.SetValue(pos, aVMultiplicities->Value(i));
+      lastKnot = aVKnots->Value(i);
+    }
+    else {
+      // Knot not unique, increase multiplicity
+      Standard_Integer curMult = VMult.Value(pos);
+      VMult.SetValue(pos, curMult + aVMultiplicities->Value(i));
+    }
   }
   
   // --- Does the Surface Descriptor LOOKS like a U and/or V Periodic ---
@@ -98,17 +144,17 @@ Standard_Boolean StepToGeom_MakeBSplineSurface::Convert
   // --- U Periodic ? ---
   
   Standard_Integer SumMult = 0;
-  for (i=1; i<=NUKnots; i++) {
-    SumMult += aUMultiplicities->Value(i);
+  for (i=1; i<=NUKnotsUnique; i++) {
+    SumMult += UMult.Value(i);
   }
   
   Standard_Boolean shouldBeUPeriodic = Standard_False;
   if (SumMult == (NUPoles + UDeg + 1)) {
     //shouldBeUPeriodic = Standard_False;
   }
-  else if ((aUMultiplicities->Value(1) == 
-           aUMultiplicities->Value(NUKnots)) &&
-          ((SumMult - aUMultiplicities->Value(1))== NUPoles)) {
+  else if ((UMult.Value(1) == 
+           UMult.Value(NUKnotsUnique)) &&
+          ((SumMult - UMult.Value(1))== NUPoles)) {
     shouldBeUPeriodic = Standard_True;
   }
   /*else {  // --- What is that ??? ---
@@ -121,17 +167,17 @@ Standard_Boolean StepToGeom_MakeBSplineSurface::Convert
   // --- V Periodic ? ---
   
   SumMult = 0;
-  for (i=1; i<=NVKnots; i++) {
-    SumMult += aVMultiplicities->Value(i);
+  for (i=1; i<=NVKnotsUnique; i++) {
+    SumMult += VMult.Value(i);
   }
   
   Standard_Boolean shouldBeVPeriodic = Standard_False;
   if (SumMult == (NVPoles + VDeg + 1)) {
     //shouldBeVPeriodic = Standard_False;
   }
-  else if ((aVMultiplicities->Value(1) == 
-           aVMultiplicities->Value(NVKnots)) &&
-          ((SumMult - aVMultiplicities->Value(1)) == NVPoles)) {
+  else if ((VMult.Value(1) == 
+           VMult.Value(NVKnotsUnique)) &&
+          ((SumMult - VMult.Value(1)) == NVPoles)) {
     shouldBeVPeriodic = Standard_True;
   }
   /*else {  // --- What is that ??? ---
diff --git a/tests/bugs/step/bug22680 b/tests/bugs/step/bug22680
new file mode 100644 (file)
index 0000000..246b393
--- /dev/null
@@ -0,0 +1,24 @@
+puts "============"
+puts "OCC22680"
+puts "============"
+puts ""
+#####################################################
+# Empty result after STEP import
+#####################################################
+
+stepread [locate_data_file bug22680_C5-390.410-63090C-633112134823466595-1.stp] a *
+tpcompound result
+
+set square 33122.6
+
+set nb_v_good 52
+set nb_e_good 83
+set nb_w_good 41
+set nb_f_good 37
+set nb_sh_good 1
+set nb_sol_good 1
+set nb_compsol_good 0
+set nb_compound_good 1
+set nb_shape_good 216
+
+set 3dviewer 1
old mode 100644 (file)
new mode 100755 (executable)
index 834f9b1..3281ece
@@ -11,12 +11,12 @@ set filename r_77-sy.stp
 
 set ref_data {
 DATA        : Faulties = 0  ( 0 )  Warnings = 0  ( 0 )  Summary  = 0  ( 0 )
-TPSTAT      : Faulties = 6  ( 0 )  Warnings = 8  ( 2 )  Summary  = 14  ( 2 )
+TPSTAT      : Faulties = 5  ( 0 )  Warnings = 8  ( 2 )  Summary  = 13  ( 2 )
 CHECKSHAPE  : Wires    = 0  ( 0 )  Faces    = 0  ( 0 )  Shells   = 0  ( 0 )   Solids   = 0 ( 0 )
-NBSHAPES    : Solid    = 0  ( 0 )  Shell    = 53  ( 59 )  Face     = 53  ( 59 )   Summary  = 745  ( 889 )
-STATSHAPE   : Solid    = 0  ( 0 )  Shell    = 53  ( 59 )  Face     = 53  ( 59 )   FreeWire = 0  ( 0 )   FreeEdge  = 0 ( 0 )   SharedEdge = 293  ( 356 )
-TOLERANCE   : MaxTol   =  0.01782737572  (  0.03722151184 )  AvgTol   =   0.00156896468  (  0.003291526808 )
-LABELS      : N0Labels = 1  ( 1 )  N1Labels = 106  ( 118 )  N2Labels = 0  ( 0 )   TotalLabels = 107  ( 119 )   NameLabels = 1  ( 1 )   ColorLabels = 53  ( 59 )   LayerLabels = 53  ( 59 )
+NBSHAPES    : Solid    = 0  ( 0 )  Shell    = 54  ( 59 )  Face     = 54  ( 59 )   Summary  = 766  ( 889 )
+STATSHAPE   : Solid    = 0  ( 0 )  Shell    = 54  ( 59 )  Face     = 54  ( 59 )   FreeWire = 0  ( 0 )   FreeEdge  = 0 ( 0 )   SharedEdge = 302  ( 356 )
+TOLERANCE   : MaxTol   =  0.01782737572  (  0.03722151184 )  AvgTol   =  0.001549641187  (  0.003291526808 )
+LABELS      : N0Labels = 1  ( 1 )  N1Labels = 108  ( 118 )  N2Labels = 0  ( 0 )   TotalLabels = 109  ( 119 )   NameLabels = 1  ( 1 )   ColorLabels = 54  ( 59 )   LayerLabels = 54  ( 59 )
 PROPS       : Centroid = 0  ( 0 )  Volume   = 0  ( 0 )  Area     = 0  ( 0 )
 NCOLORS     : NColors  = 3  ( 3 )
 COLORS      : Colors   = GREEN RED TURQUOISE  ( GREEN RED TURQUOISE )
old mode 100644 (file)
new mode 100755 (executable)
index 2a3442e..a8902eb
@@ -8,12 +8,12 @@ set filename r0601_sy.stp
 
 set ref_data {
 DATA        : Faulties = 0  ( 0 )  Warnings = 0  ( 0 )  Summary  = 0  ( 0 )
-TPSTAT      : Faulties = 15  ( 0 )  Warnings = 73  ( 24 )  Summary  = 88  ( 24 )
+TPSTAT      : Faulties = 11  ( 0 )  Warnings = 78  ( 24 )  Summary  = 89  ( 24 )
 CHECKSHAPE  : Wires    = 0  ( 0 )  Faces    = 0  ( 0 )  Shells   = 0  ( 0 )   Solids   = 0 ( 0 )
-NBSHAPES    : Solid    = 0  ( 0 )  Shell    = 91  ( 106 )  Face     = 91  ( 106 )   Summary  = 1381  ( 1665 )
-STATSHAPE   : Solid    = 0  ( 0 )  Shell    = 91  ( 106 )  Face     = 91  ( 106 )   FreeWire = 0  ( 0 )   FreeEdge  = 0 ( 0 )   SharedEdge = 551  ( 670 )
-TOLERANCE   : MaxTol   =  0.02881427566  (  0.03703290736 )  AvgTol   =  0.002754968673  (  0.003655741726 )
-LABELS      : N0Labels = 1  ( 1 )  N1Labels = 182  ( 212 )  N2Labels = 0  ( 0 )   TotalLabels = 183  ( 213 )   NameLabels = 1  ( 1 )   ColorLabels = 91  ( 106 )   LayerLabels = 91  ( 106 )
+NBSHAPES    : Solid    = 0  ( 0 )  Shell    = 95  ( 106 )  Face     = 95  ( 106 )   Summary  = 1451  ( 1665 )
+STATSHAPE   : Solid    = 0  ( 0 )  Shell    = 95  ( 106 )  Face     = 95  ( 106 )   FreeWire = 0  ( 0 )   FreeEdge  = 0 ( 0 )   SharedEdge = 580  ( 670 )
+TOLERANCE   : MaxTol   =  0.02881427566  (  0.03703290736 )  AvgTol   =  0.002745495233  (  0.003655741726 )
+LABELS      : N0Labels = 1  ( 1 )  N1Labels = 190  ( 212 )  N2Labels = 0  ( 0 )   TotalLabels = 191  ( 213 )   NameLabels = 1  ( 1 )   ColorLabels = 95  ( 106 )   LayerLabels = 95  ( 106 )
 PROPS       : Centroid = 0  ( 0 )  Volume   = 0  ( 0 )  Area     = 0  ( 0 )
 NCOLORS     : NColors  = 5  ( 5 )
 COLORS      : Colors   = GREEN RED ROYALBLUE STEELBLUE2 TURQUOISE  ( GREEN RED ROYALBLUE STEELBLUE2 TURQUOISE )