diff --git a/src/BRep/BRep_Tool.cxx b/src/BRep/BRep_Tool.cxx index 8fb6ef8638..eaf6f59ba4 100644 --- a/src/BRep/BRep_Tool.cxx +++ b/src/BRep/BRep_Tool.cxx @@ -1264,84 +1264,95 @@ Standard_Real BRep_Tool::Tolerance(const TopoDS_Vertex& V) //purpose : Returns the parameter of on . //======================================================================= -Standard_Real BRep_Tool::Parameter(const TopoDS_Vertex& V, - const TopoDS_Edge& E) +Standard_Boolean BRep_Tool::Parameter (const TopoDS_Vertex& theV, + const TopoDS_Edge& theE, + Standard_Real& theParam) { - // Search the vertex in the edge Standard_Boolean rev = Standard_False; TopoDS_Shape VF; TopAbs_Orientation orient = TopAbs_INTERNAL; - TopoDS_Iterator itv(E.Oriented(TopAbs_FORWARD)); + TopoDS_Iterator itv(theE.Oriented(TopAbs_FORWARD)); // if the edge has no vertices // and is degenerated use the vertex orientation // RLE, june 94 - if (!itv.More() && Degenerated(E)) { - orient = V.Orientation(); + if (!itv.More() && BRep_Tool::Degenerated(theE)) { + orient = theV.Orientation(); } while (itv.More()) { const TopoDS_Shape& Vcur = itv.Value(); - if (V.IsSame(Vcur)) { + if (theV.IsSame(Vcur)) { if (VF.IsNull()) { VF = Vcur; } else { - rev = E.Orientation() == TopAbs_REVERSED; - if (Vcur.Orientation() == V.Orientation()) { + rev = theE.Orientation() == TopAbs_REVERSED; + if (Vcur.Orientation() == theV.Orientation()) { VF = Vcur; } } } itv.Next(); } - - if (!VF.IsNull()) orient = VF.Orientation(); - - Standard_Real f,l; - if (orient == TopAbs_FORWARD) { - BRep_Tool::Range(E,f,l); - return (rev) ? l : f; + if (!VF.IsNull()) orient = VF.Orientation(); + + Standard_Real f, l; + + if (orient == TopAbs_FORWARD) { + BRep_Tool::Range(theE, f, l); + theParam = (rev) ? l : f; + return Standard_True; + } + + else if (orient == TopAbs_REVERSED) { + BRep_Tool::Range(theE, f, l); + theParam = (rev) ? f : l; + return Standard_True; } - - else if (orient == TopAbs_REVERSED) { - BRep_Tool::Range(E,f,l); - return (rev) ? f : l; - } else { TopLoc_Location L; - const Handle(Geom_Curve)& C = BRep_Tool::Curve(E,L,f,l); - L = L.Predivided(V.Location()); - if (!C.IsNull() || Degenerated(E)) { - const BRep_TVertex* TV = static_cast(V.TShape().get()); + const Handle(Geom_Curve)& C = BRep_Tool::Curve(theE, L, f, l); + L = L.Predivided(theV.Location()); + if (!C.IsNull() || BRep_Tool::Degenerated(theE)) { + const BRep_TVertex* TV = static_cast(theV.TShape().get()); BRep_ListIteratorOfListOfPointRepresentation itpr(TV->Points()); while (itpr.More()) { const Handle(BRep_PointRepresentation)& pr = itpr.Value(); - if (pr->IsPointOnCurve(C,L)) { + if (pr->IsPointOnCurve(C, L)) { Standard_Real p = pr->Parameter(); Standard_Real res = p;// SVV 4 nov 99 - to avoid warnings on Linux if (!C.IsNull()) { // Closed curves RLE 16 june 94 - if (Precision::IsNegativeInfinite(f)) return pr->Parameter();//p; - if (Precision::IsPositiveInfinite(l)) return pr->Parameter();//p; + if (Precision::IsNegativeInfinite(f)) + { + theParam = pr->Parameter();//p; + return Standard_True; + }; + if (Precision::IsPositiveInfinite(l)) + { + theParam = pr->Parameter();//p; + return Standard_True; + } gp_Pnt Pf = C->Value(f).Transformed(L.Transformation()); gp_Pnt Pl = C->Value(l).Transformed(L.Transformation()); - Standard_Real tol = BRep_Tool::Tolerance(V); + Standard_Real tol = BRep_Tool::Tolerance(theV); if (Pf.Distance(Pl) < tol) { - if (Pf.Distance(BRep_Tool::Pnt(V)) < tol) { - if (V.Orientation() == TopAbs_FORWARD) res = f;//p = f; + if (Pf.Distance(BRep_Tool::Pnt(theV)) < tol) { + if (theV.Orientation() == TopAbs_FORWARD) res = f;//p = f; else res = l;//p = l; } } } - return res;//p; + theParam = res;//p; + return Standard_True; } itpr.Next(); } @@ -1351,30 +1362,44 @@ Standard_Real BRep_Tool::Parameter(const TopoDS_Vertex& V, // let us try with the first pcurve Handle(Geom2d_Curve) PC; Handle(Geom_Surface) S; - BRep_Tool::CurveOnSurface(E,PC,S,L,f,l); - L = L.Predivided(V.Location()); - const BRep_TVertex* TV = static_cast(V.TShape().get()); + BRep_Tool::CurveOnSurface(theE, PC, S, L, f, l); + L = L.Predivided(theV.Location()); + const BRep_TVertex* TV = static_cast(theV.TShape().get()); BRep_ListIteratorOfListOfPointRepresentation itpr(TV->Points()); while (itpr.More()) { const Handle(BRep_PointRepresentation)& pr = itpr.Value(); - if (pr->IsPointOnCurveOnSurface(PC,S,L)) { + if (pr->IsPointOnCurveOnSurface(PC, S, L)) { Standard_Real p = pr->Parameter(); // Closed curves RLE 16 june 94 if (PC->IsClosed()) { - if ((p == PC->FirstParameter()) || - (p == PC->LastParameter())) { - if (V.Orientation() == TopAbs_FORWARD) p = PC->FirstParameter(); - else p = PC->LastParameter(); + if ((p == PC->FirstParameter()) || + (p == PC->LastParameter())) { + if (theV.Orientation() == TopAbs_FORWARD) p = PC->FirstParameter(); + else p = PC->LastParameter(); } } - return p; + theParam = p; + return Standard_True; } itpr.Next(); } } } - + + return Standard_False; +} + +//======================================================================= +//function : Parameter +//purpose : Returns the parameter of on . +//======================================================================= + +Standard_Real BRep_Tool::Parameter(const TopoDS_Vertex& V, + const TopoDS_Edge& E) +{ + Standard_Real p; + if (Parameter(V, E, p)) return p; throw Standard_NoSuchObject("BRep_Tool:: no parameter on edge"); } diff --git a/src/BRep/BRep_Tool.hxx b/src/BRep/BRep_Tool.hxx index e81eceab23..4d3b4de2f5 100644 --- a/src/BRep/BRep_Tool.hxx +++ b/src/BRep/BRep_Tool.hxx @@ -255,7 +255,17 @@ public: //! Returns the tolerance. Standard_EXPORT static Standard_Real Tolerance (const TopoDS_Vertex& V); + //! Finds the parameter of on . + //! @param theV [in] input vertex + //! @param theE [in] input edge + //! @param theParam [out] calculated parameter on the curve + //! @return TRUE if done + Standard_EXPORT static Standard_Boolean Parameter (const TopoDS_Vertex& theV, + const TopoDS_Edge& theE, + Standard_Real &theParam); + //! Returns the parameter of on . + //! Throws Standard_NoSuchObject if no parameter on edge Standard_EXPORT static Standard_Real Parameter (const TopoDS_Vertex& V, const TopoDS_Edge& E); //! Returns the parameters of the vertex on the diff --git a/src/BRepOffset/BRepOffset_Error.hxx b/src/BRepOffset/BRepOffset_Error.hxx index 447eec83ad..c809f4a983 100644 --- a/src/BRepOffset/BRepOffset_Error.hxx +++ b/src/BRepOffset/BRepOffset_Error.hxx @@ -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 diff --git a/src/BRepOffset/BRepOffset_Inter2d.cxx b/src/BRepOffset/BRepOffset_Inter2d.cxx index 69d234834a..b19f2b2c70 100644 --- a/src/BRepOffset/BRepOffset_Inter2d.cxx +++ b/src/BRepOffset/BRepOffset_Inter2d.cxx @@ -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; +} \ No newline at end of file diff --git a/src/BRepOffset/BRepOffset_Inter2d.hxx b/src/BRepOffset/BRepOffset_Inter2d.hxx index cb70ec898b..cf0f53bafd 100644 --- a/src/BRepOffset/BRepOffset_Inter2d.hxx +++ b/src/BRepOffset/BRepOffset_Inter2d.hxx @@ -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: diff --git a/src/BRepOffset/BRepOffset_MakeOffset.cxx b/src/BRepOffset/BRepOffset_MakeOffset.cxx index 89ad5c0113..2c3077f4cd 100644 --- a/src/BRepOffset/BRepOffset_MakeOffset.cxx +++ b/src/BRepOffset/BRepOffset_MakeOffset.cxx @@ -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; } //======================================================================= diff --git a/src/BRepTest/BRepTest_FeatureCommands.cxx b/src/BRepTest/BRepTest_FeatureCommands.cxx index 1cf6dbcdc1..d673ed7790 100644 --- a/src/BRepTest/BRepTest_FeatureCommands.cxx +++ b/src/BRepTest/BRepTest_FeatureCommands.cxx @@ -380,6 +380,21 @@ static void reportOffsetState(Draw_Interpretor& theCommands, theCommands << "ERROR. Incorrect set of faces to remove, the remaining shell is not connected."; break; } + case BRepOffset_CannotTrimEdges: + { + theCommands << "ERROR. Can not trim edges."; + break; + } + case BRepOffset_CannotFuseVertices: + { + theCommands << "ERROR. Can not fuse vertices."; + break; + } + case BRepOffset_CannotExtentEdge: + { + theCommands << "ERROR. Can not extent edge."; + break; + } default: { theCommands << "ERROR. offsetperform operation not done."; diff --git a/tests/offset/with_intersect_80/J9 b/tests/offset/with_intersect_80/J9 index 55246c9a3b..a58dd4ac61 100644 --- a/tests/offset/with_intersect_80/J9 +++ b/tests/offset/with_intersect_80/J9 @@ -1,5 +1,6 @@ -puts "TODO OCC26577 All: Error : is WRONG because number of EDGE entities in shape" -puts "TODO OCC26577 All: Error : is WRONG because number of SHELL entities in shape" +puts "TODO OCC26528 All:ERROR. Can not trim edges." +puts "TODO OCC26528 All:Error : command \\\"nbshapes result\\\" gives an empty result" +puts "TODO OCC26528 All:TEST INCOMPLETE" restore [locate_data_file bug26663_test_offset_J9.brep] s OFFSETSHAPE ${off_param} {} ${calcul} ${type} checknbshapes result -ref [lrange [nbshapes s] 8 19]