0026118: Implement FastSewing algorithm
[occt.git] / src / BRepTest / BRepTest_SurfaceCommands.cxx
old mode 100755 (executable)
new mode 100644 (file)
index 7c59750..72ec470
@@ -1,11 +1,19 @@
-// File:       DBRep_4.cxx
-// Created:    Thu Jul 22 16:39:43 1993
-// Author:     Remi LEQUETTE
-//             <rle@nonox>
+// Created on: 1993-07-22
+// Created by: Remi LEQUETTE
+// Copyright (c) 1993-1999 Matra Datavision
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
 
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
 #include <stdio.h>
 #include <BRepTest.hxx>
 #include <GeometryTest.hxx>
 #include <TopTools_SequenceOfShape.hxx>
 #include <Precision.hxx>
 #include <Draw_ProgressIndicator.hxx>
+#include <NCollection_Vector.hxx>
+#include <BRepBuilderAPI_FastSewing.hxx>
 
-#ifdef WNT
+#ifdef _WIN32
 //#define strcasecmp strcmp Already defined
 #include <stdio.h>
 #endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
 
 //-----------------------------------------------------------------------
 // suppressarg : suppress a[d],modifie na--
@@ -94,9 +101,9 @@ static Standard_Integer mkface(Draw_Interpretor& , Standard_Integer n, const cha
   }
   else {
     if (mkface)
-      res = BRepBuilderAPI_MakeFace(S,atof(a[3]),atof(a[4]),atof(a[5]),atof(a[6]),Precision::Confusion());
+      res = BRepBuilderAPI_MakeFace(S,Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]),Draw::Atof(a[6]),Precision::Confusion());
     else
-      res = BRepBuilderAPI_MakeShell(S,atof(a[3]),atof(a[4]),atof(a[5]),atof(a[6]),
+      res = BRepBuilderAPI_MakeShell(S,Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5]),Draw::Atof(a[6]),
                              Segment);
   }
   
@@ -230,7 +237,7 @@ static Standard_Integer pcurve(Draw_Interpretor& , Standard_Integer n, const cha
       col = DBRep_ColorOrientation(ex.Current().Orientation());
       DrawTrSurf_CurveColor(col);
 
-      sprintf(name,"%s_%d",a[1],i);
+      Sprintf(name,"%s_%d",a[1],i);
       DrawTrSurf::Set(name,new Geom2d_TrimmedCurve(c,f,l));
     }
     DrawTrSurf_CurveColor(savecol);
@@ -293,9 +300,9 @@ static Standard_Integer sewing (Draw_Interpretor& theDi,
         {
           if (tolower(theArgv[i][2]) == 'i' && i+1 < theArgc)
           {
-            if (atof (theArgv[i+1]))
+            if (Draw::Atof (theArgv[i+1]))
             {
-              aMinTol = atof (theArgv[++i]);
+              aMinTol = Draw::Atof (theArgv[++i]);
               aSetMinTol = Standard_True;
             }
             else
@@ -306,8 +313,8 @@ static Standard_Integer sewing (Draw_Interpretor& theDi,
           }
           if (tolower(theArgv[i][2]) == 'a' && i+1 < theArgc)
           {
-            if (atof (theArgv[i+1]))
-              aMaxTol = atof (theArgv[++i]);
+            if (Draw::Atof (theArgv[i+1]))
+              aMaxTol = Draw::Atof (theArgv[++i]);
             else
             {
               theDi << "Error! max tolerance can't possess the null value" << "\n";
@@ -335,8 +342,8 @@ static Standard_Integer sewing (Draw_Interpretor& theDi,
       }
       else
       {
-        if (atof (theArgv[i]))
-          aTol = atof (theArgv[i]);
+        if (Draw::Atof (theArgv[i]))
+          aTol = Draw::Atof (theArgv[i]);
       }
     }
   }
@@ -399,6 +406,66 @@ static Standard_Integer sewing (Draw_Interpretor& theDi,
   return 0;
 }
 
+//=======================================================================
+//function : fastsewing
+//purpose  : 
+//=======================================================================
+Standard_Integer fastsewing (Draw_Interpretor& theDI, 
+                            Standard_Integer theNArg, 
+                            const char** theArgVal)
+{
+  if(theNArg < 3)
+  {
+    //                0         1       2     3         4
+    theDI << "Use: fastsewing result [-tol <value>] <list_of_faces>\n";
+    return 1;
+  }
+
+  BRepBuilderAPI_FastSewing aFS;
+
+  Standard_Integer aStartIndex = 2;
+
+  if(!strcmp(theArgVal[aStartIndex], "-tol"))
+  {
+    aFS.SetTolerance(Draw::Atof (theArgVal[aStartIndex+1]));
+    aStartIndex = 4;
+  }
+
+  for(Standard_Integer i = aStartIndex; i < theNArg; i++)
+  {
+    TopoDS_Shape aS = DBRep::Get(theArgVal[i]);
+    
+    if(!aFS.Add(aS))
+    {
+      theDI << "Face is not added. See statuses.\n";
+    }
+  }
+
+  BRepBuilderAPI_FastSewing::FS_VARStatuses aStatus = aFS.GetStatuses();
+
+  if(aStatus)
+  {
+    theDI << "Error: There are some problems while adding (" <<
+                        (static_cast<Standard_Integer>(aStatus)) << ")\n";
+    aFS.GetStatuses(&cout);
+  }
+
+  aFS.Perform();
+
+  aStatus = aFS.GetStatuses();
+
+  if(aStatus)
+  {
+    theDI << "Error: There are some problems while performing (" <<
+                        (static_cast<Standard_Integer>(aStatus)) << ")\n";
+    aFS.GetStatuses(&cout);
+  }
+
+  DBRep::Set(theArgVal[1], aFS.GetResult());
+
+  return 0;
+}
+
 //=======================================================================
 // continuity
 //=======================================================================
@@ -414,7 +481,7 @@ static Standard_Integer continuity (Draw_Interpretor& ,
   Standard_Integer i=1;
   if (sh.IsNull()) {
     if (n < 3) return (1);
-    Standard_Real tol = atof(a[1]);
+    Standard_Real tol = Draw::Atof(a[1]);
     aFind.Init(tol, Standard_False);
     i = 2;
   }
@@ -428,24 +495,6 @@ static Standard_Integer continuity (Draw_Interpretor& ,
   aFind.Perform();
   aFind.Dump();
 
-  for (i=1; i<=aFind.NbContigousEdges(); i++) {
-#ifdef DEB
-    const TopoDS_Edge& edge =
-#endif
-                              aFind.ContigousEdge(i);
-    const TopTools_ListOfShape& list = aFind.ContigousEdgeCouple(i);
-    const TopoDS_Edge& sec1 = TopoDS::Edge(list.First());
-    const TopoDS_Edge& sec2 = TopoDS::Edge(list.Last());
-#ifdef DEB
-    const TopoDS_Edge& bound1 =
-#endif
-                                aFind.SectionToBoundary(sec1);
-#ifdef DEB
-    const TopoDS_Edge& bound2 =
-#endif
-                                aFind.SectionToBoundary(sec2);
-  }
-
   return 0;
 }
 
@@ -462,7 +511,7 @@ static Standard_Integer encoderegularity (Draw_Interpretor& ,
   if (n==2) 
     BRepLib::EncodeRegularity(sh);
   else {
-    Standard_Real Tol = atof(a[2]);
+    Standard_Real Tol = Draw::Atof(a[2]);
     Tol *= M_PI/180.;
     BRepLib::EncodeRegularity(sh, Tol);
   }
@@ -521,5 +570,8 @@ void  BRepTest::SurfaceCommands(Draw_Interpretor& theCommands)
   theCommands.Add("encoderegularity", 
                  "encoderegularity shape [tolerance (in degree)]",
                  __FILE__,encoderegularity, g);
+
+  theCommands.Add ("fastsewing", "fastsewing result [-tol <value>] <list_of_faces>", 
+                                                __FILE__, fastsewing, g);
 }