0029176: Exception while projection 2D-point on 2D-line
authornbv <nbv@opencascade.com>
Tue, 3 Oct 2017 07:30:47 +0000 (10:30 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 6 Oct 2017 07:28:14 +0000 (10:28 +0300)
DRAW-command "2dproj" has been changed. Now, it can return not only 2D-line as extrema but 2D-point.

Test case has been updated.

src/GeomliteTest/GeomliteTest_API2dCommands.cxx
tests/bugs/modalg_6/bug27322
tests/geometry/project/A9 [new file with mode: 0644]

index 5de5e67..28aa55c 100644 (file)
@@ -69,14 +69,23 @@ static Standard_Integer proj (Draw_Interpretor& di, Standard_Integer n, const ch
   Geom2dAPI_ProjectPointOnCurve proj(P,GC,GC->FirstParameter(),
                                          GC->LastParameter());
   
-  for ( Standard_Integer i = 1; i <= proj.NbPoints(); i++) {
-    gp_Pnt2d P1 = proj.Point(i);
-    Handle(Geom2d_Line) L = new Geom2d_Line(P,gp_Vec2d(P,P1));
-    Handle(Geom2d_TrimmedCurve) CT = 
-      new Geom2d_TrimmedCurve(L, 0., P.Distance(P1));
-    Sprintf(name,"%s%d","ext_",i);
-    char* temp = name; // portage WNT
-    DrawTrSurf::Set(temp, CT);
+  for (Standard_Integer i = 1; i <= proj.NbPoints(); i++)
+  {
+    gp_Pnt2d aP1 = proj.Point(i);
+    const Standard_Real aDist = P.Distance(aP1);
+    Sprintf(name, "%s%d", "ext_", i);
+
+    if (aDist > Precision::PConfusion())
+    {
+      Handle(Geom2d_Line) L = new Geom2d_Line(P, gp_Dir2d(aP1.XY() - P.XY()));
+      Handle(Geom2d_TrimmedCurve) CT = new Geom2d_TrimmedCurve(L, 0., aDist);
+      DrawTrSurf::Set(name, CT);
+    }
+    else
+    {
+      DrawTrSurf::Set(name, aP1);
+    }
+
     di << name << " ";
   }
 
index 5cd32ad..24b3a28 100644 (file)
@@ -14,10 +14,11 @@ mk2dcurve c1 en f
 explode f e
 mk2dcurve c2 f_3 f
 2dcvalue c1 0.0025 x y
-2dproj c2 x y
 
-set bug_info [string trim [length ext_1]]
-set bug_info [string trim [string range $bug_info [expr {[string last " " $bug_info] + 1}] [expr {[string length $bug_info] - 1}]]]
-if {$bug_info >= 1.e-9} {
-  puts "ERROR: OCC27322 is reproduced. Incorrect pcurve creation."
+set log [2dproj c2 x y]
+
+if { ![regexp {ext_} $log ] } {
+  puts "Error: empty projection"
+} elseif { ![regexp {point} [whatis ext_1] ] } { 
+  puts "ERROR: OCC27322 is reproduced. Incorrect pcurve creation: too long from the source one"
 }
diff --git a/tests/geometry/project/A9 b/tests/geometry/project/A9
new file mode 100644 (file)
index 0000000..daebfaf
--- /dev/null
@@ -0,0 +1,9 @@
+# Test for the issue # 0029176
+
+line ll 0 0 0 1
+2dproj ll 0 0.0001
+
+if { ![regexp {point} [whatis ext_1] ] } {
+  puts "Error while projection"
+}
+