//purpose : Returns the parameter of <V> on <E>.
//=======================================================================
-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;
+ 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<const BRep_TVertex*>(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<const BRep_TVertex*>(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();
}
// 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<const BRep_TVertex*>(V.TShape().get());
+ BRep_Tool::CurveOnSurface(theE, PC, S, L, f, l);
+ L = L.Predivided(theV.Location());
+ const BRep_TVertex* TV = static_cast<const BRep_TVertex*>(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 <V> on <E>.
+//=======================================================================
+
+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");
}
//! Returns the tolerance.
Standard_EXPORT static Standard_Real Tolerance (const TopoDS_Vertex& V);
+ //! Finds the parameter of <theV> on <theE>.
+ //! @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 <V> on <E>.
+ //! 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
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
// 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);
}
}
}
-
- 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;
+ }
}
}
}
aSegment = new Geom_TrimmedCurve(aLin, 0, aDelta);
if (!aCompCurve.Add(aSegment, aTol))
- return;
+ return Standard_True;
}
if (LastPar < anEl + a2Offset) {
aSegment = new Geom_TrimmedCurve(aLin, 0, aDelta);
if (!aCompCurve.Add(aSegment, aTol))
- return;
+ return Standard_True;
}
C3d = aCompCurve.BSplineCurve();
BB.Range( NE, FirstPar, LastPar );
}
+ return Standard_True;
}
// Modified by skv - Fri Dec 26 17:00:57 2003 OCC4455 End
//function : ConnexIntByInt
//purpose :
//=======================================================================
-void BRepOffset_Inter2d::ConnexIntByInt
+Standard_Boolean BRepOffset_Inter2d::ConnexIntByInt
(const TopoDS_Face& FI,
BRepOffset_Offset& OFI,
TopTools_DataMapOfShapeShape& MES,
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);
}
}
ToReverse1 = ToReverse2;
}
}
+ return Standard_True;
}
//=======================================================================
//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;
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
//! 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,
//! 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:
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,
// Check Error() method.
return;
}
-
+ myError = BRepOffset_NoError;
TopAbs_State Side = TopAbs_IN;
if (myOffset < 0.) Side = TopAbs_OUT;
BuildOffsetByArc();
else if (myJoin == GeomAbs_Intersection)
BuildOffsetByInter();
+ if (myError != BRepOffset_NoError)
+ {
+ return;
+ }
//-----------------
// Auto unwinding.
//-----------------
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.
//------------------------------------------ ----------------
//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 //
{
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();
}
//
// 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;
// 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 {
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)) {
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 {
}
}
}
+ return Standard_True;
}
//=======================================================================
//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)
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) {
}
//
if (V1.IsNull() || V2.IsNull()) {
- throw Standard_ConstructionError("BRepOffset_MakeOffset::TrimEdge");
+ return Standard_False;
}
if (!V1.IsSame(V2)) {
NE.Free( Standard_True );
theETrimEInf.Bind(NE, aSourceEdge);
}
}
+ return Standard_True;
}
//=======================================================================
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.";
-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]