]> OCCT Git - occt-copy.git/commitdiff
0027890: BndLib_Add2dCurve::Add(..) works incorrect on some curves
authorisn <isn@opencascade.com>
Thu, 22 Sep 2016 11:42:30 +0000 (14:42 +0300)
committerisn <isn@opencascade.com>
Thu, 22 Sep 2016 11:42:30 +0000 (14:42 +0300)
new testcase: extension for 'gbounding' command. now this command allows to pass curve2d as args and works in two modes ('normal' and optimal)

src/BRepTest/BRepTest_BasicCommands.cxx

index 87424fc45952f07d11ac3cfd2dac149eac8fb54c..fca78e69b7d91d9da4a1b434653531bdc9564f96 100644 (file)
@@ -38,6 +38,7 @@
 #include <BRep_Builder.hxx>
 #include <BRepBndLib.hxx>
 #include <Bnd_Box.hxx>
+#include <Bnd_Box2d.hxx>
 #include <TopExp_Explorer.hxx>
 #include <TopoDS.hxx>
 #include <BRepTools_WireExplorer.hxx>
@@ -486,46 +487,98 @@ static Standard_Integer optbounding(Draw_Interpretor& di,Standard_Integer n,cons
 #include <GeomAdaptor_Surface.hxx>
 #include <BndLib_AddSurface.hxx>
 #include <BndLib_Add3dCurve.hxx>
+#include <BndLib_Add2dCurve.hxx>
+#include <Draw_Segment2D.hxx>
 static Standard_Integer gbounding(Draw_Interpretor& di,Standard_Integer n,const char** a)
 {
-  if (n < 2
+  if (n != 2 && n != 3
   {
-    di << "Usage: gbounding surf/curve \n";
+    di << "Usage: gbounding surf/curve/curve2d [-o] \n";
+    di << "[-o] turn off Optimal mode ('on' by default) \n";
     return 1;
   }
-  Standard_Real axmin,aymin,azmin,axmax,aymax,azmax;
-  Bnd_Box B; Handle(Draw_Box) DB;
-  
-  if (n == 2) { 
+  else
+  {
+    Standard_Boolean IsOptimal = Standard_True;
+    if (n == 3 && !strcmp(a[2], "-o"))
+      IsOptimal = Standard_False;
+    
+    Standard_Real axmin,aymin,azmin,axmax,aymax,azmax;
+    Bnd_Box B;
+    Bnd_Box2d B2d;
+    Handle(Draw_Box) DB;
+    Standard_Boolean Is3d = Standard_True;
     Handle(Geom_Curve) C;
     Handle(Geom_Surface) S;
+    Handle_Geom2d_Curve C2d;
     S = DrawTrSurf::GetSurface(a[1]);
-    if (S.IsNull())
+    if (!S.IsNull())
     {
-      C = DrawTrSurf::GetCurve(a[1]);
+      //add surf
+      GeomAdaptor_Surface aGAS(S);
+      if (IsOptimal)
+        BndLib_AddSurface::AddOptimal(aGAS, Precision::Confusion(), B);
+      else
+        BndLib_AddSurface::Add(aGAS, Precision::Confusion(), B);
     }
-    if(!S.IsNull())
+    else
     {
-      GeomAdaptor_Surface aGAS(S);
-      BndLib_AddSurface::AddOptimal(aGAS, Precision::Confusion(), B);
+      C = DrawTrSurf::GetCurve(a[1]);
+      if (!C.IsNull())
+      {
+        // add cur
+        GeomAdaptor_Curve aGAC(C);
+        if (IsOptimal)
+          BndLib_Add3dCurve::AddOptimal(aGAC, Precision::Confusion(), B);
+        else
+          BndLib_Add3dCurve::Add(aGAC, Precision::Confusion(), B);
+      }
+      else
+      {
+        C2d = DrawTrSurf::GetCurve2d(a[1]);
+        if (!C2d.IsNull())
+        {
+          //add cur2d
+          Is3d = Standard_False;
+          if (IsOptimal)
+            BndLib_Add2dCurve::AddOptimal(C2d, C2d->FirstParameter(), C2d->LastParameter(), Precision::Confusion(), B2d); 
+          else
+            BndLib_Add2dCurve::Add(C2d, C2d->FirstParameter(), C2d->LastParameter(), Precision::Confusion(), B2d); 
+        }
+        else
+        {
+          di << "Wrong argument \n";
+          return 1;
+        }
+      }
     }
-    else if(!C.IsNull())
+
+    if (Is3d)
     {
-      GeomAdaptor_Curve aGAC(C);
-      BndLib_Add3dCurve::AddOptimal(aGAC, Precision::Confusion(), B);
+      B.Get(axmin,aymin,azmin,axmax,aymax,azmax);
+      DB = new Draw_Box(gp_Pnt(axmin,aymin,azmin),gp_Pnt(axmax,aymax,azmax),Draw_vert);
+      dout<<DB;
+      di << axmin<<" "<< aymin<<" "<< azmin<<" "<< axmax<<" "<< aymax<<" "<< azmax;
     }
     else
     {
-      di << "Wrong argument \n";
-      return 1;
+      B2d.Get(axmin,aymin,axmax,aymax);
+      gp_Pnt2d p1(axmin, aymin);
+      gp_Pnt2d p2(axmax, aymin);
+      gp_Pnt2d p3(axmax, aymax);
+      gp_Pnt2d p4(axmin, aymax);
+      Draw_Segment2D* S1 = new Draw_Segment2D(p1, p2, Draw_vert);
+      Draw_Segment2D* S2 = new Draw_Segment2D(p2, p3, Draw_vert);
+      Draw_Segment2D* S3 = new Draw_Segment2D(p3, p4, Draw_vert);
+      Draw_Segment2D* S4 = new Draw_Segment2D(p4, p1, Draw_vert);
+      dout << S1 << S2 << S3 << S4;
+      di << axmin<<" "<< aymin<<" "<< axmax<<" "<< aymax;
     }
-    B.Get(axmin,aymin,azmin,axmax,aymax,azmax);
-    DB = new Draw_Box(gp_Pnt(axmin,aymin,azmin),gp_Pnt(axmax,aymax,azmax),Draw_vert);
-    dout<<DB;
-    di << axmin<<" "<< aymin<<" "<< azmin<<" "<< axmax<<" "<< aymax<<" "<< azmax;
   }
   return 0;
-}//=======================================================================
+}
+
+//=======================================================================
 //function : findplane
 //purpose  : 
 //=======================================================================
@@ -1045,7 +1098,7 @@ void  BRepTest::BasicCommands(Draw_Interpretor& theCommands)
                  optbounding,g);
  //
   theCommands.Add("gbounding",
-                 "gbounding curve/surf ",
+                 "gbounding surf/curve/curve2d [-o] ",
                  __FILE__,
                  gbounding,g);