0031043: GCPnts_TangentialDeflection generates points which number is inconsistent...
authoroan <oan@opencascade.com>
Tue, 29 Oct 2019 08:04:53 +0000 (11:04 +0300)
committeroan <oan@opencascade.com>
Tue, 29 Oct 2019 08:04:53 +0000 (11:04 +0300)
Updated crvtpoints command API to reproduce reported problem
Generate number of points according to the specified minimum value

src/GCPnts/GCPnts_TangentialDeflection.pxx
src/GeometryTest/GeometryTest_CurveCommands.cxx
tests/bugs/modalg_7/bug31043 [new file with mode: 0644]

index c32e4a0..deadfb6 100644 (file)
@@ -196,10 +196,12 @@ void GCPnts_TangentialDeflection::PerformLinear (const TheCurve& C) {
   D0 (C, firstu, P);
   parameters.Append (firstu);
   points    .Append (P);
-  if (minNbPnts > 2) {
+  if (minNbPnts > 2)
+  {
     Standard_Real Du = (lastu - firstu) / minNbPnts;
     Standard_Real U = firstu + Du;
-    for (Standard_Integer i = 2; i <= minNbPnts; i++) {
+    for (Standard_Integer i = 2; i < minNbPnts; i++)
+    {
       D0 (C, U, P);
       parameters.Append (U);
       points    .Append (P);
@@ -571,14 +573,14 @@ void GCPnts_TangentialDeflection::PerformCurve (const TheCurve& C)
   //-- On rajoute des points aux milieux des segments si le nombre
   //-- mini de points n'est pas atteint
   //--
-  Standard_Integer Nbp =  points.Length();
-  Standard_Integer MinNb= (9*minNbPnts)/10;
-  //if(MinNb<4) MinNb=4;
-
-  //-- if(Nbp <  MinNb) { cout<<"\n*"; } else {  cout<<"\n."; } 
-  while(Nbp < MinNb) { 
-    //-- cout<<" \nGCPnts TangentialDeflection : Ajout de Points ("<<Nbp<<" "<<minNbPnts<<" )"<<endl;
-    for (i = 2; i <= Nbp; i += 2) {
+  Standard_Integer Nbp = points.Length();
+
+  //std::cout << "GCPnts_TangentialDeflection: Number of Points (" << Nbp << " " << minNbPnts << " )" << std::endl;
+
+  while(Nbp < minNbPnts)
+  { 
+    for (i = 2; i <= Nbp; i += 2)
+    {
       MiddleU = (parameters.Value(i-1)+parameters.Value(i))*0.5;
       D0 (C, MiddleU, MiddlePoint); 
       parameters.InsertBefore(i,MiddleU);
index 8feb96c..3aa06fb 100644 (file)
@@ -1007,7 +1007,7 @@ static Standard_Integer crvpoints (Draw_Interpretor& di, Standard_Integer /*n*/,
 
 static Standard_Integer crvtpoints (Draw_Interpretor& di, Standard_Integer n, const char** a)
 {
-  Standard_Integer i, nbp;
+  Standard_Integer i, nbp, aMinPntsNb = 2;
   Standard_Real defl, angle = Precision::Angular();
 
   Handle(Adaptor3d_HCurve) aHCurve;
@@ -1030,10 +1030,13 @@ static Standard_Integer crvtpoints (Draw_Interpretor& di, Standard_Integer n, co
   }
   defl = Draw::Atof(a[3]);
 
-  if(n > 3)
+  if(n > 4)
     angle = Draw::Atof(a[4]);
 
-  GCPnts_TangentialDeflection PntGen(aHCurve->Curve(), angle, defl, 2);
+  if(n > 5)
+    aMinPntsNb = Draw::Atoi (a[5]);
+
+  GCPnts_TangentialDeflection PntGen(aHCurve->Curve(), angle, defl, aMinPntsNb);
   
   nbp = PntGen.NbPoints();
   di << "Nb points : " << nbp << "\n";
diff --git a/tests/bugs/modalg_7/bug31043 b/tests/bugs/modalg_7/bug31043
new file mode 100644 (file)
index 0000000..696a905
--- /dev/null
@@ -0,0 +1,54 @@
+puts "============="
+puts "0031043: GCPnts_TangentialDeflection generates points which number is inconsistent with MinimumOfPoints parameter"
+puts "============="
+
+restore [locate_data_file bug28500_shape_mesh_artifact.brep] result
+
+tclean result
+explode result f
+explode result_7 e
+
+mkcurve c result_7_1
+
+set log [crvtpoints r c 0.01 1.57 1]
+regexp {Nb points : ([0-9]+)} $log full pnts
+
+if { $pnts < 2 } {
+  puts "Error : Incorrect number of points $pnts"
+}
+
+
+set log [crvtpoints r c 0.01 1.57 2]
+regexp {Nb points : ([0-9]+)} $log full pnts
+
+if { $pnts < 2 } {
+  puts "Error : Incorrect number of points $pnts"
+}
+
+set log [crvtpoints r c 0.01 1.57 3]
+regexp {Nb points : ([0-9]+)} $log full pnts
+
+if { $pnts < 3 } {
+  puts "Error : Incorrect number of points $pnts"
+}
+
+set log [crvtpoints r c 0.01 1.57 4]
+regexp {Nb points : ([0-9]+)} $log full pnts
+
+if { $pnts < 4 } {
+  puts "Error : Incorrect number of points $pnts"
+}
+
+set log [crvtpoints r c 0.01 1.57 5]
+regexp {Nb points : ([0-9]+)} $log full pnts
+
+if { $pnts < 5 } {
+  puts "Error : Incorrect number of points $pnts"
+}
+
+set log [crvtpoints r c 0.01 1.57 6]
+regexp {Nb points : ([0-9]+)} $log full pnts
+
+if { $pnts < 6 } {
+  puts "Error : Incorrect number of points $pnts"
+}