myE=aE;
}
//
+ const TopoDS_Edge& GetEdge() const {
+ return myE;
+ }
+ const TopoDS_Face& GetFace() const {
+ return myF;
+ }
+ const Handle_Geom2d_Curve& GetCurve2d() const {
+ return myCurve;
+ }
+ Standard_Boolean IsToUpdate() const {
+ return myToUpdate;
+ }
+ //
void Perform() {
- BOPTools_AlgoTools2D::BuildPCurveForEdgeOnPlane (myE, myF);
+ BOPTools_AlgoTools2D::BuildPCurveForEdgeOnPlane (myE, myF, myCurve, myToUpdate);
};
//
protected:
TopoDS_Edge myE;
TopoDS_Face myF;
+ Handle_Geom2d_Curve myCurve;
+ Standard_Boolean myToUpdate;
};
//=======================================================================
typedef BOPCol_NCVector
return;
}
//
+ // Build pcurves of edges on planes; first collect pairs edge-face.
BOPAlgo_VectorOfBPC aVBPC;
//
for (i = 1; i <= aNbF; ++i) {
//======================================================
BOPAlgo_BPCCnt::Perform(myRunParallel, aVBPC);
//======================================================
+
+ // pcurves are built, and now update edges
+ BRep_Builder aBB;
+ TopoDS_Edge E;
+ for (i = 0; i < aVBPC.Extent(); i++) {
+ const BOPAlgo_BPC& aBPC=aVBPC(i);
+ if (aBPC.IsToUpdate()) {
+ Standard_Real aTolE = BRep_Tool::Tolerance(aBPC.GetEdge());
+ aBB.UpdateEdge(aBPC.GetEdge(), aBPC.GetCurve2d(), aBPC.GetFace(), aTolE);
+ }
+ }
}
//=======================================================================
//function : IsBasedOnPlane
aBB.UpdateEdge(aE, aC2D, aF, aTolE);
}
}
+
+//=======================================================================
+//function : BuildPCurveForEdgeOnPlane
+//purpose :
+//=======================================================================
+void BOPTools_AlgoTools2D::BuildPCurveForEdgeOnPlane
+ (const TopoDS_Edge& aE,
+ const TopoDS_Face& aF,
+ Handle(Geom2d_Curve)& aC2D,
+ Standard_Boolean& bToUpdate)
+{
+ Standard_Real aT1, aT2;
+ aC2D=BRep_Tool_CurveOnSurface(aE, aF, aT1, aT2, bToUpdate);
+}
+
//=======================================================================
// function: BuildPCurveForEdgesOnPlane
// purpose:
//! Compute intermediate value of parameter for the edge <anE>.
Standard_EXPORT static Standard_Real IntermediatePoint (const TopoDS_Edge& anE);
+ //! Build pcurve of edge on face if the surface is plane, and update the edge.
Standard_EXPORT static void BuildPCurveForEdgeOnPlane (const TopoDS_Edge& theE, const TopoDS_Face& theF);
+ //! Build pcurve of edge on face if the surface is plane, but do not update the edge.
+ //! The output are the pcurve and the flag telling that pcurve was built.
+ Standard_EXPORT static void BuildPCurveForEdgeOnPlane (const TopoDS_Edge& theE, const TopoDS_Face& theF,
+ Handle(Geom2d_Curve)& aC2D, Standard_Boolean& bToUpdate);
+
Standard_EXPORT static void BuildPCurveForEdgesOnPlane (const BOPCol_ListOfShape& theLE, const TopoDS_Face& theF);
--- /dev/null
+puts "============"
+puts "OCC26701"
+puts "============"
+puts ""
+###############################
+## BOPAlgo_Builder::Perform crash.
+###############################
+
+restore [locate_data_file bug26701_crash_tbb.brep] d
+
+brunparallel 1
+
+bclearobjects
+eval baddobjects [explode d]
+
+bfillds
+bbuild result
+
+set square 8244.36
+
+set nbshapes_expected "
+Number of shapes in shape
+ VERTEX : 19252
+ EDGE : 19264
+ WIRE : 4824
+ FACE : 1620
+ SHELL : 1600
+ SOLID : 0
+ COMPSOLID : 0
+ COMPOUND : 1
+ SHAPE : 46561
+"
+checknbshapes result -ref ${nbshapes_expected} -t -m "result obtained by Common operator"
+
+set 3dviewer 1