1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-14 13:30:48 +03:00

0026555: Modeling Algorithms - Exception-safe status reporting in BRepOffset_MakeOffset

Set safe exit status for:
Standard_NullObject exception,
Standard_NullObject: BRep_Tool:: TopoDS_Vertex hasn't gp_Pnt,
BRep_Tool: no parameter on edge,
BRepOffset_MakeOffset::TrimEdge no projection
This commit is contained in:
akaftasev
2020-05-12 12:21:59 +03:00
committed by bugmaster
parent 453103d191
commit 3e85dfc5e5
8 changed files with 205 additions and 110 deletions

View File

@@ -20,12 +20,15 @@
enum BRepOffset_Error
{
BRepOffset_NoError,
BRepOffset_UnknownError,
BRepOffset_BadNormalsOnGeometry,
BRepOffset_C0Geometry,
BRepOffset_NullOffset,
BRepOffset_NotConnectedShell
BRepOffset_NoError,
BRepOffset_UnknownError,
BRepOffset_BadNormalsOnGeometry,
BRepOffset_C0Geometry,
BRepOffset_NullOffset,
BRepOffset_NotConnectedShell,
BRepOffset_CannotTrimEdges, //!< exception while trim edges
BRepOffset_CannotFuseVertices, //!< exception while fuse vertices
BRepOffset_CannotExtentEdge //!< exception while extent edges
};
#endif // _BRepOffset_Error_HeaderFile

View File

@@ -923,7 +923,7 @@ static Standard_Boolean ExtendPCurve(const Handle(Geom2d_Curve)& aPCurve,
// Modified by skv - Fri Dec 26 17:00:55 2003 OCC4455 Begin
//static void ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE)
void BRepOffset_Inter2d::ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE, const Standard_Real theOffset)
Standard_Boolean BRepOffset_Inter2d::ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE, const Standard_Real theOffset)
{
//BRepLib::BuildCurve3d(E);
@@ -1261,13 +1261,19 @@ void BRepOffset_Inter2d::ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE, const
}
}
}
Handle(Geom2d_Curve) ProjPCurve =
GeomProjLib::Curve2d( C3d, FirstParOnPC, LastParOnPC, theSurf );
if (ProjPCurve.IsNull())
ProjectionSuccess = Standard_False;
if (!C3d.IsNull() && FirstParOnPC < LastParOnPC)
{
Handle(Geom2d_Curve) ProjPCurve =
GeomProjLib::Curve2d(C3d, FirstParOnPC, LastParOnPC, theSurf);
if (ProjPCurve.IsNull())
ProjectionSuccess = Standard_False;
else
CurveRep->PCurve(ProjPCurve);
}
else
CurveRep->PCurve( ProjPCurve );
{
return Standard_False;
}
}
}
}
@@ -1311,7 +1317,7 @@ void BRepOffset_Inter2d::ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE, const
aSegment = new Geom_TrimmedCurve(aLin, 0, aDelta);
if (!aCompCurve.Add(aSegment, aTol))
return;
return Standard_True;
}
if (LastPar < anEl + a2Offset) {
@@ -1321,7 +1327,7 @@ void BRepOffset_Inter2d::ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE, const
aSegment = new Geom_TrimmedCurve(aLin, 0, aDelta);
if (!aCompCurve.Add(aSegment, aTol))
return;
return Standard_True;
}
C3d = aCompCurve.BSplineCurve();
@@ -1341,6 +1347,7 @@ void BRepOffset_Inter2d::ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE, const
BB.Range( NE, FirstPar, LastPar );
}
return Standard_True;
}
// Modified by skv - Fri Dec 26 17:00:57 2003 OCC4455 End
@@ -1455,7 +1462,7 @@ void BRepOffset_Inter2d::Compute (const Handle(BRepAlgo_AsDes)& AsDes,
//function : ConnexIntByInt
//purpose :
//=======================================================================
void BRepOffset_Inter2d::ConnexIntByInt
Standard_Boolean BRepOffset_Inter2d::ConnexIntByInt
(const TopoDS_Face& FI,
BRepOffset_Offset& OFI,
TopTools_DataMapOfShapeShape& MES,
@@ -1493,7 +1500,10 @@ void BRepOffset_Inter2d::ConnexIntByInt
TopoDS_Shape aLocalShape = OFI.Generated(EI);
const TopoDS_Edge& OE = TopoDS::Edge(aLocalShape);
if (!MES.IsBound(OE) && !Build.IsBound(EI)) {
ExtentEdge(OE,NE, Offset);
if (!ExtentEdge(OE, NE, Offset))
{
return Standard_False;
}
MES.Bind (OE,NE);
}
}
@@ -1615,6 +1625,7 @@ void BRepOffset_Inter2d::ConnexIntByInt
ToReverse1 = ToReverse2;
}
}
return Standard_True;
}
//=======================================================================
@@ -1783,8 +1794,8 @@ static void MakeChain(const TopoDS_Shape& theV,
//function : FuseVertices
//purpose :
//=======================================================================
void BRepOffset_Inter2d::FuseVertices(const TopTools_IndexedDataMapOfShapeListOfShape& theDMVV,
const Handle(BRepAlgo_AsDes)& theAsDes)
Standard_Boolean BRepOffset_Inter2d::FuseVertices (const TopTools_IndexedDataMapOfShapeListOfShape& theDMVV,
const Handle(BRepAlgo_AsDes)& theAsDes)
{
BRep_Builder aBB;
TopTools_MapOfShape aMVDone;
@@ -1817,11 +1828,16 @@ void BRepOffset_Inter2d::FuseVertices(const TopTools_IndexedDataMapOfShapeListOf
for (; aItLE.More(); aItLE.Next()) {
const TopoDS_Edge& aE = TopoDS::Edge(aItLE.Value());
Standard_Real aTolE = BRep_Tool::Tolerance(aE);
Standard_Real aT = BRep_Tool::Parameter(aVOldInt, aE);
Standard_Real aT;
if (!BRep_Tool::Parameter(aVOldInt, aE, aT))
{
return Standard_False;
}
aBB.UpdateVertex(aVNewInt, aT, aE, aTolE);
}
// and replace the vertex
theAsDes->Replace(aVOld, aVNew);
}
}
}
return Standard_True;
}

View File

@@ -57,7 +57,7 @@ public:
//! When all faces of the shape are treated the intersection vertices
//! have to be fused using the FuseVertices method.
//! theDMVV contains the vertices that should be fused.
Standard_EXPORT static void ConnexIntByInt (const TopoDS_Face& FI,
Standard_EXPORT static Standard_Boolean ConnexIntByInt (const TopoDS_Face& FI,
BRepOffset_Offset& OFI,
TopTools_DataMapOfShapeShape& MES,
const TopTools_DataMapOfShapeShape& Build,
@@ -87,12 +87,12 @@ public:
//! Fuses the chains of vertices in the theDMVV
//! and updates AsDes by replacing the old vertices
//! with the new ones.
Standard_EXPORT static void FuseVertices(const TopTools_IndexedDataMapOfShapeListOfShape& theDMVV,
const Handle(BRepAlgo_AsDes)& theAsDes);
Standard_EXPORT static Standard_Boolean FuseVertices (const TopTools_IndexedDataMapOfShapeListOfShape& theDMVV,
const Handle(BRepAlgo_AsDes)& theAsDes);
//! extents the edge
Standard_EXPORT static void ExtentEdge(const TopoDS_Edge& E,
TopoDS_Edge& NE,
const Standard_Real theOffset);
Standard_EXPORT static Standard_Boolean ExtentEdge (const TopoDS_Edge& E,
TopoDS_Edge& NE,
const Standard_Real theOffset);
protected:

View File

@@ -284,23 +284,23 @@ static
Standard_Boolean IsPlanar(const TopoDS_Shape& theS);
static
void TrimEdge(TopoDS_Edge& NE,
const Handle(BRepAlgo_AsDes)& AsDes2d,
Handle(BRepAlgo_AsDes)& AsDes,
TopTools_DataMapOfShapeShape& theETrimEInf);
Standard_Boolean TrimEdge(TopoDS_Edge& NE,
const Handle(BRepAlgo_AsDes)& AsDes2d,
Handle(BRepAlgo_AsDes)& AsDes,
TopTools_DataMapOfShapeShape& theETrimEInf);
static
void TrimEdges(const TopoDS_Shape& theShape,
const Standard_Real theOffset,
const BRepOffset_Analyse& Analyse,
BRepOffset_DataMapOfShapeOffset& theMapSF,
TopTools_DataMapOfShapeShape& theMES,
TopTools_DataMapOfShapeShape& theBuild,
Handle(BRepAlgo_AsDes)& theAsDes,
Handle(BRepAlgo_AsDes)& theAsDes2d,
TopTools_IndexedMapOfShape& theNewEdges,
TopTools_DataMapOfShapeShape& theETrimEInf,
TopTools_DataMapOfShapeListOfShape& theEdgesOrigins);
Standard_Boolean TrimEdges(const TopoDS_Shape& theShape,
const Standard_Real theOffset,
const BRepOffset_Analyse& Analyse,
BRepOffset_DataMapOfShapeOffset& theMapSF,
TopTools_DataMapOfShapeShape& theMES,
TopTools_DataMapOfShapeShape& theBuild,
Handle(BRepAlgo_AsDes)& theAsDes,
Handle(BRepAlgo_AsDes)& theAsDes2d,
TopTools_IndexedMapOfShape& theNewEdges,
TopTools_DataMapOfShapeShape& theETrimEInf,
TopTools_DataMapOfShapeListOfShape& theEdgesOrigins);
static
void AppendToList(TopTools_ListOfShape& theL,
@@ -797,7 +797,7 @@ void BRepOffset_MakeOffset::MakeOffsetShape()
// Check Error() method.
return;
}
myError = BRepOffset_NoError;
TopAbs_State Side = TopAbs_IN;
if (myOffset < 0.) Side = TopAbs_OUT;
@@ -826,6 +826,10 @@ void BRepOffset_MakeOffset::MakeOffsetShape()
BuildOffsetByArc();
else if (myJoin == GeomAbs_Intersection)
BuildOffsetByInter();
if (myError != BRepOffset_NoError)
{
return;
}
//-----------------
// Auto unwinding.
//-----------------
@@ -1149,15 +1153,17 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
TopTools_ListOfShape aLFaces;
for (Exp.Init(myShape,TopAbs_FACE) ; Exp.More(); Exp.Next())
aLFaces.Append (Exp.Current());
for (TopTools_ListOfShape::Iterator it (myAnalyse.NewFaces()); it.More(); it.Next())
aLFaces.Append (it.Value());
//---------------------------------------------------------------------------------
// Extension of neighbor edges of new edges and intersection between neighbors.
//--------------------------------------------------------------------------------
Handle(BRepAlgo_AsDes) AsDes2d = new BRepAlgo_AsDes();
IntersectEdges(aLFaces, MapSF, MES, Build, AsDes, AsDes2d);
if (myError != BRepOffset_NoError)
{
return;
}
//-----------------------------------------------------------
// Great restriction of new edges and update of AsDes.
//------------------------------------------ ----------------
@@ -1168,7 +1174,11 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
//Map of edges obtained after FACE-FACE (offsetted) intersection.
//Key1 is edge trimmed by intersection points with other edges;
//Item is not-trimmed edge.
TrimEdges(myShape, myOffset, myAnalyse, MapSF, MES, Build, AsDes, AsDes2d, NewEdges, aETrimEInf, anEdgesOrigins);
if (!TrimEdges(myShape, myOffset, myAnalyse, MapSF, MES, Build, AsDes, AsDes2d, NewEdges, aETrimEInf, anEdgesOrigins))
{
myError = BRepOffset_CannotTrimEdges;
return;
}
//
//---------------------------------
// Intersection 2D on //
@@ -3904,8 +3914,12 @@ void BRepOffset_MakeOffset::IntersectEdges(const TopTools_ListOfShape& theFaces,
{
const TopoDS_Face& aF = TopoDS::Face (it.Value());
aTolF = BRep_Tool::Tolerance (aF);
BRepOffset_Inter2d::ConnexIntByInt
(aF, theMapSF (aF), theMES, theBuild, theAsDes2d, myOffset, aTolF, myAnalyse, aMFV, aDMVV);
if (!BRepOffset_Inter2d::ConnexIntByInt(aF, theMapSF(aF), theMES, theBuild, theAsDes2d,
myOffset, aTolF, myAnalyse, aMFV, aDMVV))
{
myError = BRepOffset_CannotExtentEdge;
return;
}
}
// intersect edges created from vertices
Standard_Integer i, aNbF = aMFV.Extent();
@@ -3917,24 +3931,28 @@ void BRepOffset_MakeOffset::IntersectEdges(const TopTools_ListOfShape& theFaces,
}
//
// fuse vertices on edges
BRepOffset_Inter2d::FuseVertices(aDMVV, theAsDes2d);
if (!BRepOffset_Inter2d::FuseVertices(aDMVV, theAsDes2d))
{
myError = BRepOffset_CannotFuseVertices;
return;
}
}
//=======================================================================
//function : TrimEdges
//purpose :
//=======================================================================
void TrimEdges(const TopoDS_Shape& theShape,
const Standard_Real theOffset,
const BRepOffset_Analyse& Analyse,
BRepOffset_DataMapOfShapeOffset& theMapSF,
TopTools_DataMapOfShapeShape& theMES,
TopTools_DataMapOfShapeShape& theBuild,
Handle(BRepAlgo_AsDes)& theAsDes,
Handle(BRepAlgo_AsDes)& theAsDes2d,
TopTools_IndexedMapOfShape& theNewEdges,
TopTools_DataMapOfShapeShape& theETrimEInf,
TopTools_DataMapOfShapeListOfShape& theEdgesOrigins)
Standard_Boolean TrimEdges(const TopoDS_Shape& theShape,
const Standard_Real theOffset,
const BRepOffset_Analyse& Analyse,
BRepOffset_DataMapOfShapeOffset& theMapSF,
TopTools_DataMapOfShapeShape& theMES,
TopTools_DataMapOfShapeShape& theBuild,
Handle(BRepAlgo_AsDes)& theAsDes,
Handle(BRepAlgo_AsDes)& theAsDes2d,
TopTools_IndexedMapOfShape& theNewEdges,
TopTools_DataMapOfShapeShape& theETrimEInf,
TopTools_DataMapOfShapeListOfShape& theEdgesOrigins)
{
TopExp_Explorer Exp,Exp2,ExpC;
TopoDS_Shape NE;
@@ -3992,7 +4010,8 @@ void TrimEdges(const TopoDS_Shape& theShape,
// trim edges
if (NE.ShapeType() == TopAbs_EDGE) {
if (theNewEdges.Add(NE)) {
TrimEdge (TopoDS::Edge(NE),theAsDes2d,theAsDes, theETrimEInf);
if (!TrimEdge (TopoDS::Edge(NE),theAsDes2d,theAsDes, theETrimEInf))
return Standard_False;
}
}
else {
@@ -4005,7 +4024,8 @@ void TrimEdges(const TopoDS_Shape& theShape,
TopoDS_Edge NEC = TopoDS::Edge(ExpC.Current());
if (theNewEdges.Add(NEC)) {
if (!theAsDes2d->Descendant(NEC).IsEmpty()) {
TrimEdge (NEC,theAsDes2d, theAsDes, theETrimEInf);
if(!TrimEdge (NEC,theAsDes2d, theAsDes, theETrimEInf))
return Standard_False;
}
else {
if (theAsDes->HasAscendant(NEC)) {
@@ -4037,7 +4057,8 @@ void TrimEdges(const TopoDS_Shape& theShape,
NE = theMES(NE);
NE.Orientation(aS.Orientation());
if (theNewEdges.Add(NE)) {
TrimEdge (TopoDS::Edge(NE), theAsDes2d, theAsDes, theETrimEInf);
if (!TrimEdge (TopoDS::Edge(NE), theAsDes2d, theAsDes, theETrimEInf))
return Standard_False;
}
}
else {
@@ -4053,6 +4074,7 @@ void TrimEdges(const TopoDS_Shape& theShape,
}
}
}
return Standard_True;
}
//=======================================================================
@@ -4060,7 +4082,7 @@ void TrimEdges(const TopoDS_Shape& theShape,
//purpose : Trim the edge of the largest of descendants in AsDes2d.
// Order in AsDes two vertices that have trimmed the edge.
//=======================================================================
void TrimEdge(TopoDS_Edge& NE,
Standard_Boolean TrimEdge(TopoDS_Edge& NE,
const Handle(BRepAlgo_AsDes)& AsDes2d,
Handle(BRepAlgo_AsDes)& AsDes,
TopTools_DataMapOfShapeShape& theETrimEInf)
@@ -4098,7 +4120,9 @@ void TrimEdge(TopoDS_Edge& NE,
gp_Pnt thePoint = BRep_Tool::Pnt(V);
GeomAPI_ProjectPointOnCurve Projector(thePoint, theCurve);
if (Projector.NbPoints() == 0)
return;
{
return Standard_False;
}
U = Projector.LowerDistanceParameter();
}
if (U < UMin) {
@@ -4110,7 +4134,7 @@ void TrimEdge(TopoDS_Edge& NE,
}
//
if (V1.IsNull() || V2.IsNull()) {
throw Standard_ConstructionError("BRepOffset_MakeOffset::TrimEdge");
return Standard_False;
}
if (!V1.IsSame(V2)) {
NE.Free( Standard_True );
@@ -4147,6 +4171,7 @@ void TrimEdge(TopoDS_Edge& NE,
theETrimEInf.Bind(NE, aSourceEdge);
}
}
return Standard_True;
}
//=======================================================================