0031668: Visualization - WebGL sample doesn't work on Emscripten 1.39
[occt.git] / src / BRepProj / BRepProj_Projection.cxx
index c56a0e6..a448b93 100644 (file)
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#include <BRepProj_Projection.ixx>
 
-#include <BRepAlgo_Section.hxx>
-
-#include <Precision.hxx>
+#include <Bnd_Box.hxx>
+#include <BRep_Builder.hxx>
+#include <BRep_Tool.hxx>
+#include <BRepAlgoAPI_Section.hxx>
 #include <BRepBndLib.hxx>
-#include <BRepTools_TrsfModification.hxx>
-#include <BRepTools_Modifier.hxx>
-#include <BRepLib_MakeVertex.hxx>
+#include <BRepFill_Generator.hxx>
 #include <BRepLib_MakeEdge.hxx>
+#include <BRepLib_MakeVertex.hxx>
 #include <BRepLib_MakeWire.hxx>
-#include <BRep_Tool.hxx>
-#include <Bnd_Box.hxx>
-
+#include <BRepProj_Projection.hxx>
 #include <BRepSweep_Prism.hxx>
-#include <BRepFill_Generator.hxx>
-#include <TopExp.hxx>
-#include <TopExp_Explorer.hxx>
-#include <TopLoc_Location.hxx>
+#include <BRepTools_Modifier.hxx>
+#include <BRepTools_TrsfModification.hxx>
 #include <gp_Dir.hxx>
 #include <gp_Pnt.hxx>
-#include <gp_Vec.hxx>
 #include <gp_Trsf.hxx>
+#include <gp_Vec.hxx>
+#include <Precision.hxx>
+#include <ShapeAnalysis_FreeBounds.hxx>
+#include <Standard_ConstructionError.hxx>
+#include <Standard_NoSuchObject.hxx>
+#include <Standard_NullObject.hxx>
+#include <TopExp.hxx>
+#include <TopExp_Explorer.hxx>
+#include <TopLoc_Location.hxx>
 #include <TopoDS.hxx>
-#include <TopoDS_Iterator.hxx>
 #include <TopoDS_Shape.hxx>
-#include <TopTools_ListOfShape.hxx>
 #include <TopTools_ListIteratorOfListOfShape.hxx>
-#include <BRep_Builder.hxx>
-#include <ShapeAnalysis_FreeBounds.hxx>
-
-#include <Standard_NullObject.hxx>
-#include <Standard_ConstructionError.hxx>
+#include <TopTools_ListOfShape.hxx>
 
 //=======================================================================
 //function : DistanceOut
 //purpose  : Compute the minimum distance between input shapes 
 //           (using Bounding Boxes of each Shape)
 //=======================================================================
-
 static Standard_Real DistanceOut (const TopoDS_Shape& S1, const TopoDS_Shape& S2) 
 {
   Bnd_Box BBox1, BBox2;
@@ -126,17 +122,19 @@ void BRepProj_Projection::BuildSection (const TopoDS_Shape& theShape,
     aShape = C;
   }
   if ( aShape.IsNull() )
-    Standard_ConstructionError::Raise(__FILE__": target shape has no faces");
-
-  // build section computing pcurves on the shape
-//  BRepAlgoAPI_Section aSectionTool (aShape, theTool, Standard_False);
-  BRepAlgo_Section aSectionTool (aShape, theTool, Standard_False);
-  aSectionTool.Approximation (Standard_True);
-  aSectionTool.ComputePCurveOn1 (Standard_True);
+    throw Standard_ConstructionError(__FILE__": target shape has no faces");
+
+  // build section computing p-curves on both shapes to get higher precision
+  BRepAlgoAPI_Section aSectionTool(aShape, theTool, Standard_False);
+  aSectionTool.Approximation(Standard_True);
+  aSectionTool.ComputePCurveOn1(Standard_True);
+  aSectionTool.ComputePCurveOn2(Standard_True);
+  // Use Oriented Bounding Boxes inside Booleans to speed up calculation of the section
+  aSectionTool.SetUseOBB(Standard_True);
   aSectionTool.Build();
 
   // check for successful work of the section tool
-  if (! aSectionTool.IsDone()) 
+  if (!aSectionTool.IsDone())
     return;
 
   // get edges of the result
@@ -181,7 +179,7 @@ BRepProj_Projection::BRepProj_Projection(const TopoDS_Shape& Wire,
   Standard_NullObject_Raise_if((Wire.IsNull() || Shape.IsNull()),__FILE__": null input shape");
   if (Wire.ShapeType() != TopAbs_EDGE && 
       Wire.ShapeType() != TopAbs_WIRE ) 
-    Standard_ConstructionError::Raise(__FILE__": projected shape is neither wire nor edge");
+    throw Standard_ConstructionError(__FILE__": projected shape is neither wire nor edge");
 
   // compute the "length" of the cylindrical surface to build
   Standard_Real mdis = DistanceIn(Wire, Shape);
@@ -217,7 +215,7 @@ BRepProj_Projection::BRepProj_Projection (const TopoDS_Shape& Wire,
   Standard_NullObject_Raise_if((Wire.IsNull() || Shape.IsNull()),__FILE__": null input shape");
   if (Wire.ShapeType() != TopAbs_EDGE && 
       Wire.ShapeType() != TopAbs_WIRE ) 
-    Standard_ConstructionError::Raise(__FILE__": projected shape is neither wire nor edge");
+    throw Standard_ConstructionError(__FILE__": projected shape is neither wire nor edge");
 
   // if Wire is only an edge, transform it into a Wire
   TopoDS_Wire aWire;
@@ -243,7 +241,7 @@ BRepProj_Projection::BRepProj_Projection (const TopoDS_Shape& Wire,
   // compute the ratio of the scale transformation
   Standard_Real Scale = PC.Distance(P);
   if ( Abs (Scale) < Precision::Confusion() ) 
-    Standard_ConstructionError::Raise("Projection");
+    throw Standard_ConstructionError("Projection");
   Scale = 1. + mdis / Scale;
   
   // move the base of the conical surface by scaling it with ratio Scale