From: nbv Date: Tue, 3 Dec 2013 12:05:46 +0000 (+0400) Subject: 0023731: The shape obtained by stepread is valid in terms of checkshape but it is... X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=e168d693eda7f0867e3f2079e732a1805c150052;p=occt-copy.git 0023731: The shape obtained by stepread is valid in terms of checkshape but it is not valid in terms of usability. 1. New status "BrepCheck_CollapsedEdge" is added. 2. Draw command "tolsphere": draws a sphere with center in given vertex, radius is tolerance of given vertex. 3. test case added 4. Small correction of output of "checkshape" command result. --- diff --git a/src/BRepCheck/BRepCheck.cxx b/src/BRepCheck/BRepCheck.cxx index e057a54588..dc72f6a94f 100644 --- a/src/BRepCheck/BRepCheck.cxx +++ b/src/BRepCheck/BRepCheck.cxx @@ -42,7 +42,7 @@ void BRepCheck::Add(BRepCheck_ListOfStatus& lst, const BRepCheck_Status stat) } else { if (it.Value() == stat) { - return; + return; } it.Next(); } @@ -55,15 +55,15 @@ void BRepCheck::Add(BRepCheck_ListOfStatus& lst, const BRepCheck_Status stat) //purpose : //======================================================================= Standard_Boolean BRepCheck::SelfIntersection(const TopoDS_Wire& W, - const TopoDS_Face& myFace, - TopoDS_Edge& RetE1, - TopoDS_Edge& RetE2) + const TopoDS_Face& myFace, + TopoDS_Edge& RetE1, + TopoDS_Edge& RetE2) { Handle(BRepCheck_Wire) chkw = new BRepCheck_Wire(W); BRepCheck_Status stat = chkw->SelfIntersect(myFace,RetE1,RetE2); return (stat == BRepCheck_SelfIntersectingWire); } - + //======================================================================= //function : PrecCurve //purpose : @@ -129,7 +129,7 @@ Standard_Real BRepCheck::PrecSurface(const Handle(Adaptor3d_Surface)& aAHSurf) //purpose : //======================================================================= void BRepCheck::Print(const BRepCheck_Status stat, - Standard_OStream& OS) + Standard_OStream& OS) { switch (stat) { @@ -244,6 +244,10 @@ void BRepCheck::Print(const BRepCheck_Status stat, case BRepCheck_EnclosedRegion: OS << "BRepCheck_EnclosedRegion\n"; break; + case BRepCheck_CollapsedEdge: + OS << "BRepCheck_CollapsedEdge\n"; + break; + default: break; } diff --git a/src/BRepCheck/BRepCheck_Analyzer.cxx b/src/BRepCheck/BRepCheck_Analyzer.cxx index a4aee46d21..68e9b82183 100644 --- a/src/BRepCheck/BRepCheck_Analyzer.cxx +++ b/src/BRepCheck/BRepCheck_Analyzer.cxx @@ -40,7 +40,7 @@ //purpose : //======================================================================= void BRepCheck_Analyzer::Init(const TopoDS_Shape& S, - const Standard_Boolean B) + const Standard_Boolean B) { if (S.IsNull()) { throw Standard_NullObject(); @@ -55,7 +55,7 @@ void BRepCheck_Analyzer::Init(const TopoDS_Shape& S, //purpose : //======================================================================= void BRepCheck_Analyzer::Put(const TopoDS_Shape& S, - const Standard_Boolean B) + const Standard_Boolean B) { if (!myMap.IsBound(S)) { Handle(BRepCheck_Result) HR; @@ -114,7 +114,7 @@ void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S) // modified by NIZHNY-MKK Wed May 19 16:56:16 2004.BEGIN // There is no need to check anything. // if (myShape.IsSame(S)) { - // myMap(S)->Blind(); + // myMap(S)->Blind(); // } // modified by NIZHNY-MKK Wed May 19 16:56:23 2004.END @@ -123,6 +123,48 @@ void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S) { Handle(BRepCheck_Result)& aRes = myMap(S); + try + { + BRepCheck_Status ste = Handle(BRepCheck_Edge):: + DownCast(aRes)->CheckTolerance(TopoDS::Edge(S)); + + if(ste != BRepCheck_NoError) + { + Handle(BRepCheck_Edge)::DownCast(aRes)->SetStatus(ste); + break; + } + } + catch(Standard_Failure) + { +#ifdef DEB + cout<<"BRepCheck_Analyzer : "; + Standard_Failure::Caught()->Print(cout); + cout<SetFailStatus(S); + } + + if ( ! aRes.IsNull() ) + { + aRes->SetFailStatus(exp.Current()); + aRes->SetFailStatus(S); + } + } + + TopTools_MapOfShape MapS; + + for (exp.Init(S,TopAbs_VERTEX);exp.More(); exp.Next()) + { + const TopoDS_Shape& aVertex = exp.Current(); + try + { + OCC_CATCH_SIGNALS + if (MapS.Add(aVertex)) + myMap(aVertex)->InContext(S); + } + } try { BRepCheck_Status ste = Handle(BRepCheck_Edge):: @@ -143,13 +185,16 @@ void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S) if ( ! myMap(S).IsNull() ) { myMap(S)->SetFailStatus(S); - } - if ( ! aRes.IsNull() ) - { - aRes->SetFailStatus(S); - } - } + Handle(BRepCheck_Result) aRes = myMap(aVertex); + + if ( ! aRes.IsNull() ) + { + aRes->SetFailStatus(aVertex); + aRes->SetFailStatus(S); + } + + } TopTools_MapOfShape MapS; @@ -256,6 +301,12 @@ void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S) performwire = Standard_False; break; } + + //if(ste == BRepCheck_CollapsedEdge) + //{ + // isInvalidTolerance = Standard_True; + // break; + //} } } } @@ -392,15 +443,15 @@ void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S) case TopAbs_SOLID: { - exp.Init(S,TopAbs_SHELL); + exp.Init(S,TopAbs_SHELL); for (; exp.More(); exp.Next()) { - const TopoDS_Shape& aShell=exp.Current(); + const TopoDS_Shape& aShell=exp.Current(); try { - OCC_CATCH_SIGNALS - myMap(aShell)->InContext(S); - } + OCC_CATCH_SIGNALS + myMap(aShell)->InContext(S); + } catch(Standard_Failure const& anException) { #ifdef OCCT_DEBUG std::cout<<"BRepCheck_Analyzer : "; @@ -410,19 +461,19 @@ void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S) (void)anException; if ( ! myMap(S).IsNull() ) { - myMap(S)->SetFailStatus(S); - } + myMap(S)->SetFailStatus(S); + } - // - Handle(BRepCheck_Result) aRes = myMap(aShell); + // + Handle(BRepCheck_Result) aRes = myMap(aShell); if (!aRes.IsNull() ) { - aRes->SetFailStatus(exp.Current()); - aRes->SetFailStatus(S); - } + aRes->SetFailStatus(exp.Current()); + aRes->SetFailStatus(S); + } }//catch(Standard_Failure) }//for (; exp.More(); exp.Next()) - } + } break;//case TopAbs_SOLID default: break; @@ -496,10 +547,10 @@ Standard_Boolean BRepCheck_Analyzer::ValidSub // for (TopExp_Explorer exp(S,SubType);exp.More(); exp.Next()) { const Handle(BRepCheck_Result)& RV = myMap(exp.Current()); for (RV->InitContextIterator(); - RV->MoreShapeInContext(); - RV->NextShapeInContext()) { + RV->MoreShapeInContext(); + RV->NextShapeInContext()) { if (RV->ContextualShape().IsSame(S)) { - break; + break; } } @@ -507,7 +558,7 @@ Standard_Boolean BRepCheck_Analyzer::ValidSub for (itl.Initialize(RV->StatusOnShape()); itl.More(); itl.Next()) { if (itl.Value() != BRepCheck_NoError) { - return Standard_False; + return Standard_False; } } } diff --git a/src/BRepCheck/BRepCheck_Edge.cxx b/src/BRepCheck/BRepCheck_Edge.cxx index 72c322ab88..adb4194522 100644 --- a/src/BRepCheck/BRepCheck_Edge.cxx +++ b/src/BRepCheck/BRepCheck_Edge.cxx @@ -27,6 +27,15 @@ #include #include #include + +#include + +#include +#include +#include +#include +#include + #include #include #include @@ -40,6 +49,10 @@ #include #include #include + +#include +#include + #include #include #include @@ -60,23 +73,39 @@ #include #include #include +#include +#include IMPLEMENT_STANDARD_RTTIEXT(BRepCheck_Edge,BRepCheck_Result) +//Golden ratio +static const Standard_Real GoldRatio = (sqrt(5.0)-1)/2.0; + +static const Standard_Real DivPoints[] = { + GoldRatio, + 1.0-GoldRatio, + 4.0*GoldRatio-2.0, + 3.0-4.0*GoldRatio, + 0.5 + }; + +static const Standard_Integer maxNIter = sizeof(DivPoints)/sizeof(DivPoints[0]); + //modified by NIZNHY-PKV Thu May 05 09:01:57 2011f static Standard_Boolean Validate(const Adaptor3d_Curve&, - const Adaptor3d_CurveOnSurface&, - const Standard_Real, - const Standard_Boolean); + const Adaptor3d_CurveOnSurface&, + const Standard_Real, + const Standard_Boolean); + static void PrintProblematicPoint(const gp_Pnt&, - const Standard_Real, - const Standard_Real); + const Standard_Real, + const Standard_Real); static Standard_Real Prec(const Adaptor3d_Curve& aAC3D, - const Adaptor3d_CurveOnSurface& aACS); + const Adaptor3d_CurveOnSurface& aACS); //static Standard_Boolean Validate(const Adaptor3d_Curve&, // const Adaptor3d_Curve&, @@ -118,27 +147,27 @@ void BRepCheck_Edge::Minimum() Standard_Boolean unique = Standard_True; // Search for a 3D reference. If no existent one, creates it with the // first encountered CurveOnSurf; if multiple, chooses the first one... - + Standard_Boolean Degenerated = TE->Degenerated(); Standard_Boolean SameParameter = TE->SameParameter(); Standard_Boolean SameRange = TE->SameRange(); if (!SameRange && SameParameter) { BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag); } - // Handle(Geom_Curve) C3d; +// Handle(Geom_Curve) C3d; while (itcr.More()) { const Handle(BRep_CurveRepresentation)& cr = itcr.Value(); if (cr->IsCurve3D()) { - if (!exist) { - exist = Standard_True; - } - else { - unique = Standard_False; - } - if (myCref.IsNull() && !cr->Curve3D().IsNull()) { - myCref = cr; - } + if (!exist) { + exist = Standard_True; + } + else { + unique = Standard_False; + } + if (myCref.IsNull() && !cr->Curve3D().IsNull()) { + myCref = cr; + } } itcr.Next(); } @@ -154,12 +183,12 @@ void BRepCheck_Edge::Minimum() if (myCref.IsNull() && !Degenerated) { itcr.Initialize(TE->Curves()); while (itcr.More()) { - const Handle(BRep_CurveRepresentation)& cr = itcr.Value(); - if (cr->IsCurveOnSurface()) { - myCref = cr; - break; - } - itcr.Next(); + const Handle(BRep_CurveRepresentation)& cr = itcr.Value(); + if (cr->IsCurveOnSurface()) { + myCref = cr; + break; + } + itcr.Next(); } } else if (!myCref.IsNull() && Degenerated){ @@ -172,24 +201,24 @@ void BRepCheck_Edge::Minimum() Standard_Real First,Last; GCref->Range(First,Last); if (Last<=First) { - myCref.Nullify(); - BRepCheck::Add(lst,BRepCheck_InvalidRange); + myCref.Nullify(); + BRepCheck::Add(lst,BRepCheck_InvalidRange); } else { - if (myCref->IsCurve3D()) { + if (myCref->IsCurve3D()) { // eap 6 Jun 2002 occ332 // better transform C3d instead of transforming Surf upto C3d initial location, // on transformed BSpline surface 'same parameter' may seem wrong TopLoc_Location L = myShape.Location() * myCref->Location(); - Handle(Geom_Curve) C3d = Handle(Geom_Curve)::DownCast - (myCref->Curve3D()->Transformed - (/*myCref->Location()*/L.Transformation())); + Handle(Geom_Curve) C3d = Handle(Geom_Curve)::DownCast + (myCref->Curve3D()->Transformed + (/*myCref->Location()*/L.Transformation())); Standard_Boolean IsPeriodic = C3d->IsPeriodic(); Standard_Real aPeriod = RealLast(); if(IsPeriodic) { aPeriod = C3d->Period(); - } + } Standard_Real f = C3d->FirstParameter(), l = C3d->LastParameter(); if (C3d->DynamicType() == STANDARD_TYPE(Geom_TrimmedCurve)) { @@ -219,11 +248,11 @@ void BRepCheck_Edge::Minimum() myHCurve = new GeomAdaptor_Curve(GAC3d); } } - else { // curve on surface - Handle(Geom_Surface) Sref = myCref->Surface(); - Sref = Handle(Geom_Surface)::DownCast - (Sref->Transformed(myCref->Location().Transformation())); - const Handle(Geom2d_Curve)& PCref = myCref->PCurve(); + else { // curve on surface + Handle(Geom_Surface) Sref = myCref->Surface(); + Sref = Handle(Geom_Surface)::DownCast + (Sref->Transformed(myCref->Location().Transformation())); + const Handle(Geom2d_Curve)& PCref = myCref->PCurve(); Standard_Boolean IsPeriodic = PCref->IsPeriodic(); Standard_Real aPeriod = RealLast(); if(IsPeriodic) @@ -257,12 +286,12 @@ void BRepCheck_Edge::Minimum() Handle(GeomAdaptor_Surface) GAHSref = new GeomAdaptor_Surface(Sref); Handle(Geom2dAdaptor_Curve) GHPCref = new Geom2dAdaptor_Curve(PCref,First,Last); - Adaptor3d_CurveOnSurface ACSref(GHPCref,GAHSref); + Adaptor3d_CurveOnSurface ACSref(GHPCref,GAHSref); myHCurve = new Adaptor3d_CurveOnSurface(ACSref); - } - } + } } } + } if (lst.IsEmpty()) { lst.Append(BRepCheck_NoError); } @@ -289,7 +318,7 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S) Standard_Real Tol = BRep_Tool::Tolerance(TopoDS::Edge(myShape)); TopAbs_ShapeEnum styp = S.ShapeType(); - // for (TopExp_Explorer exp(S,TopAbs_EDGE); exp.More(); exp.Next()) { +// for (TopExp_Explorer exp(S,TopAbs_EDGE); exp.More(); exp.Next()) { TopExp_Explorer exp(S,TopAbs_EDGE) ; for ( ; exp.More(); exp.Next()) { if (exp.Current().IsSame(myShape)) { @@ -300,29 +329,35 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S) BRepCheck::Add(lst,BRepCheck_SubshapeNotInShape); return; } - + switch (styp) { case TopAbs_WIRE: { + //if (CheckTolerance(TopoDS::Edge(myShape)) == BRepCheck_CollapsedEdge) + //{ + // BRepCheck::Add(lst,BRepCheck_CollapsedEdge); + // return; + //} } break; case TopAbs_FACE: if (!myCref.IsNull()) { - + Standard_Boolean SameParameter = TE->SameParameter(); Standard_Boolean SameRange = TE->SameRange(); - // Modified by skv - Tue Apr 27 11:48:13 2004 Begin + +// Modified by skv - Tue Apr 27 11:48:13 2004 Begin if (!SameParameter || !SameRange) { - if (!SameParameter) - BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag); - if (!SameRange) - BRepCheck::Add(lst,BRepCheck_InvalidSameRangeFlag); + if (!SameParameter) + BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag); + if (!SameRange) + BRepCheck::Add(lst,BRepCheck_InvalidSameRangeFlag); - return; + return; } - // Modified by skv - Tue Apr 27 11:48:14 2004 End +// Modified by skv - Tue Apr 27 11:48:14 2004 End Standard_Real First = myHCurve->FirstParameter(); Standard_Real Last = myHCurve->LastParameter(); @@ -338,12 +373,12 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S) BRep_ListIteratorOfListOfCurveRepresentation itcr(TE->Curves()); Standard_Real eps = Precision::PConfusion(); while (itcr.More()) { - const Handle(BRep_CurveRepresentation)& cr = itcr.Value(); - if (cr != myCref && cr->IsCurveOnSurface(Su,L)) { - pcurvefound = Standard_True; + const Handle(BRep_CurveRepresentation)& cr = itcr.Value(); + if (cr != myCref && cr->IsCurveOnSurface(Su,L)) { + pcurvefound = Standard_True; Handle(BRep_GCurve) GC (Handle(BRep_GCurve)::DownCast (cr)); - Standard_Real f,l; - GC->Range(f,l); + Standard_Real f,l; + GC->Range(f,l); Standard_Real ff = f, ll = l; if(myCref->IsCurve3D()) { @@ -351,13 +386,13 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S) ll = myCref->Curve3D()->TransformedParameter(l, Etrsf); } // gka OCC - // Modified by skv - Tue Apr 27 11:50:35 2004 Begin +// Modified by skv - Tue Apr 27 11:50:35 2004 Begin if (Abs(ff-First) > eps || Abs(ll-Last) > eps) { - BRepCheck::Add(lst,BRepCheck_InvalidSameRangeFlag); - BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag); - } - // Modified by skv - Tue Apr 27 11:50:37 2004 End + BRepCheck::Add(lst,BRepCheck_InvalidSameRangeFlag); + BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag); + } +// Modified by skv - Tue Apr 27 11:50:37 2004 End // const Handle(Geom2d_Curve)& pc = cr->PCurve(); Standard_Boolean IsPeriodic = pc->IsPeriodic(); @@ -389,95 +424,95 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S) return; } - if (myGctrl) { - Handle(Geom_Surface) Sb = cr->Surface(); - Sb = Handle(Geom_Surface)::DownCast - // (Su->Transformed(L.Transformation())); - (Su->Transformed(/*L*/(Floc * TFloc).Transformation())); - Handle(Geom2d_Curve) PC = cr->PCurve(); + if (myGctrl) { + Handle(Geom_Surface) Sb = cr->Surface(); + Sb = Handle(Geom_Surface)::DownCast +// (Su->Transformed(L.Transformation())); + (Su->Transformed(/*L*/(Floc * TFloc).Transformation())); + Handle(Geom2d_Curve) PC = cr->PCurve(); Handle(GeomAdaptor_Surface) GAHS = new GeomAdaptor_Surface(Sb); Handle(Geom2dAdaptor_Curve) GHPC = new Geom2dAdaptor_Curve(PC,f,l); - Adaptor3d_CurveOnSurface ACS(GHPC,GAHS); + Adaptor3d_CurveOnSurface ACS(GHPC,GAHS); Standard_Boolean ok = Validate (*myHCurve, ACS, Tol, SameParameter); - if (!ok) { - if (cr->IsCurveOnClosedSurface()) { - BRepCheck::Add(lst,BRepCheck_InvalidCurveOnClosedSurface); - } - else { - BRepCheck::Add(lst,BRepCheck_InvalidCurveOnSurface); - } - // Modified by skv - Tue Apr 27 11:53:00 2004 Begin - BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag); - // if (SameParameter) { - // BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag); - // } - // Modified by skv - Tue Apr 27 11:53:01 2004 End - } - if (cr->IsCurveOnClosedSurface()) { + if (!ok) { + if (cr->IsCurveOnClosedSurface()) { + BRepCheck::Add(lst,BRepCheck_InvalidCurveOnClosedSurface); + } + else { + BRepCheck::Add(lst,BRepCheck_InvalidCurveOnSurface); + } +// Modified by skv - Tue Apr 27 11:53:00 2004 Begin + BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag); +// if (SameParameter) { +// BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag); +// } +// Modified by skv - Tue Apr 27 11:53:01 2004 End + } + if (cr->IsCurveOnClosedSurface()) { GHPC->Load(cr->PCurve2(),f,l); // same bounds ACS.Load(GHPC, GAHS); // sans doute inutile ok = Validate(*myHCurve,ACS,Tol,SameParameter); - if (!ok) { - BRepCheck::Add(lst,BRepCheck_InvalidCurveOnClosedSurface); - // Modified by skv - Tue Apr 27 11:53:20 2004 Begin - if (SameParameter) { - BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag); - } - // Modified by skv - Tue Apr 27 11:53:23 2004 End - } - } - } - } - itcr.Next(); + if (!ok) { + BRepCheck::Add(lst,BRepCheck_InvalidCurveOnClosedSurface); +// Modified by skv - Tue Apr 27 11:53:20 2004 Begin + if (SameParameter) { + BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag); + } +// Modified by skv - Tue Apr 27 11:53:23 2004 End + } + } + } + } + itcr.Next(); } if (!pcurvefound) { - Handle(Geom_Plane) P; - Handle(Standard_Type) dtyp = Su->DynamicType(); - if (dtyp == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) { - P = Handle(Geom_Plane)::DownCast - (Handle(Geom_RectangularTrimmedSurface):: - DownCast(Su)->BasisSurface()); - } - else { - P = Handle(Geom_Plane)::DownCast(Su); - } - if (P.IsNull()) { // not a plane - BRepCheck::Add(lst,BRepCheck_NoCurveOnSurface); - } - else { // on fait la projection a la volee, comme BRep_Tool - // plan en position - if (myGctrl) { - P = Handle(Geom_Plane):: - DownCast(P->Transformed(/*L*/(Floc * TFloc).Transformation()));// eap occ332 - //on projette Cref sur ce plan + Handle(Geom_Plane) P; + Handle(Standard_Type) dtyp = Su->DynamicType(); + if (dtyp == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) { + P = Handle(Geom_Plane)::DownCast + (Handle(Geom_RectangularTrimmedSurface):: + DownCast(Su)->BasisSurface()); + } + else { + P = Handle(Geom_Plane)::DownCast(Su); + } + if (P.IsNull()) { // not a plane + BRepCheck::Add(lst,BRepCheck_NoCurveOnSurface); + } + else { // on fait la projection a la volee, comme BRep_Tool + // plan en position + if (myGctrl) { + P = Handle(Geom_Plane):: + DownCast(P->Transformed(/*L*/(Floc * TFloc).Transformation()));// eap occ332 + //on projette Cref sur ce plan Handle(GeomAdaptor_Surface) GAHS = new GeomAdaptor_Surface(P); // Dub - Normalement myHCurve est une GeomAdaptor_Curve Handle(GeomAdaptor_Curve) Gac = Handle(GeomAdaptor_Curve)::DownCast(myHCurve); Handle(Geom_Curve) C3d = Gac->Curve(); - Handle(Geom_Curve) ProjOnPlane = - GeomProjLib::ProjectOnPlane(new Geom_TrimmedCurve(C3d,First,Last), - P, P->Position().Direction(), - Standard_True); + Handle(Geom_Curve) ProjOnPlane = + GeomProjLib::ProjectOnPlane(new Geom_TrimmedCurve(C3d,First,Last), + P, P->Position().Direction(), + Standard_True); Handle(GeomAdaptor_Curve) aHCurve = new GeomAdaptor_Curve(ProjOnPlane); - ProjLib_ProjectedCurve proj(GAHS,aHCurve); - Handle(Geom2d_Curve) PC = Geom2dAdaptor::MakeCurve(proj); + ProjLib_ProjectedCurve proj(GAHS,aHCurve); + Handle(Geom2d_Curve) PC = Geom2dAdaptor::MakeCurve(proj); Handle(Geom2dAdaptor_Curve) GHPC = new Geom2dAdaptor_Curve(PC, - myHCurve->FirstParameter(), - myHCurve->LastParameter()); - - Adaptor3d_CurveOnSurface ACS(GHPC,GAHS); + myHCurve->FirstParameter(), + myHCurve->LastParameter()); + Adaptor3d_CurveOnSurface ACS(GHPC,GAHS); + Standard_Boolean ok = Validate (*myHCurve, ACS, Tol,Standard_True); // voir dub... - if (!ok) { - BRepCheck::Add(lst,BRepCheck_InvalidCurveOnSurface); - } - } - } + if (!ok) { + BRepCheck::Add(lst,BRepCheck_InvalidCurveOnSurface); + } + } + } } } break; @@ -487,22 +522,22 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S) Standard_Integer nbconnection = 0; //TopExp_Explorer exp; for (exp.Init(S,TopAbs_FACE); exp.More(); exp.Next()) { - const TopoDS_Face& fac = TopoDS::Face(exp.Current()); - TopExp_Explorer exp2; - for (exp2.Init(fac,TopAbs_EDGE); exp2.More(); exp2.Next()) { - if (exp2.Current().IsSame(myShape)) { - nbconnection++; - } - } + const TopoDS_Face& fac = TopoDS::Face(exp.Current()); + TopExp_Explorer exp2; + for (exp2.Init(fac,TopAbs_EDGE); exp2.More(); exp2.Next()) { + if (exp2.Current().IsSame(myShape)) { + nbconnection++; + } + } } if (nbconnection < 2 && !TE->Degenerated()) { - BRepCheck::Add(myMap(S),BRepCheck_FreeEdge); + BRepCheck::Add(myMap(S),BRepCheck_FreeEdge); } else if (nbconnection > 2) { - BRepCheck::Add(myMap(S),BRepCheck_InvalidMultiConnexity); + BRepCheck::Add(myMap(S),BRepCheck_InvalidMultiConnexity); } else { - BRepCheck::Add(myMap(S),BRepCheck_NoError); + BRepCheck::Add(myMap(S),BRepCheck_NoError); } } break; @@ -522,12 +557,12 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S) void BRepCheck_Edge::Blind() { - // Modified by skv - Tue Apr 27 11:36:01 2004 Begin - // The body of this function is removed because of its useless. +// Modified by skv - Tue Apr 27 11:36:01 2004 Begin +// The body of this function is removed because of its useless. if (!myBlind) { myBlind = Standard_True; } - // Modified by skv - Tue Apr 27 11:36:02 2004 End +// Modified by skv - Tue Apr 27 11:36:02 2004 End } @@ -556,12 +591,14 @@ Standard_Boolean BRepCheck_Edge::GeometricControls() const //function : SetStatus //purpose : //======================================================================= + void BRepCheck_Edge::SetStatus(const BRepCheck_Status theStatus) { - BRepCheck::Add(myMap(myShape),theStatus); + BRepCheck::Add(myMap(myShape),theStatus); } + //======================================================================= //function : Tolerance //purpose : @@ -591,13 +628,13 @@ Standard_Real BRepCheck_Edge::Tolerance() //// modified by jgv, 20.03.03 //// TopLoc_Location Loc = myShape.Location() * cr->Location(); Handle(Geom_Curve) C3d = Handle(Geom_Curve)::DownCast - (cr->Curve3D()->Transformed( Loc.Transformation() )); + (cr->Curve3D()->Transformed( Loc.Transformation() )); /////////////////////////////////// GeomAdaptor_Curve GAC3d(C3d,First,Last); it=iRep; if (iRep>1) { - theRep(iRep)=theRep(1); - it=1; + theRep(iRep)=theRep(1); + it=1; } theRep(it) = new GeomAdaptor_Curve(GAC3d); iRep++; @@ -605,11 +642,11 @@ Standard_Real BRepCheck_Edge::Tolerance() else if (cr->IsCurveOnSurface()) { { Handle(Geom_Surface) Sref = cr->Surface(); - //// modified by jgv, 20.03.03 //// - TopLoc_Location Loc = myShape.Location() * cr->Location(); + //// modified by jgv, 20.03.03 //// + TopLoc_Location Loc = myShape.Location() * cr->Location(); Sref = Handle(Geom_Surface)::DownCast (Sref->Transformed( Loc.Transformation() )); - /////////////////////////////////// + /////////////////////////////////// const Handle(Geom2d_Curve)& PCref = cr->PCurve(); Handle(GeomAdaptor_Surface) GAHSref = new GeomAdaptor_Surface(Sref); Handle(Geom2dAdaptor_Curve) GHPCref = @@ -619,17 +656,17 @@ Standard_Real BRepCheck_Edge::Tolerance() iRep++; } if (cr->IsCurveOnClosedSurface()) { - Handle(Geom_Surface) Sref = cr->Surface(); - Sref = Handle(Geom_Surface)::DownCast - (Sref->Transformed(cr->Location().Transformation())); - const Handle(Geom2d_Curve)& PCref = cr->PCurve2(); + Handle(Geom_Surface) Sref = cr->Surface(); + Sref = Handle(Geom_Surface)::DownCast + (Sref->Transformed(cr->Location().Transformation())); + const Handle(Geom2d_Curve)& PCref = cr->PCurve2(); Handle(GeomAdaptor_Surface) GAHSref = new GeomAdaptor_Surface(Sref); Handle(Geom2dAdaptor_Curve) GHPCref = new Geom2dAdaptor_Curve(PCref,First,Last); - Adaptor3d_CurveOnSurface ACSref(GHPCref,GAHSref); + Adaptor3d_CurveOnSurface ACSref(GHPCref,GAHSref); theRep(iRep) = new Adaptor3d_CurveOnSurface(ACSref); - iRep++; - nbRep++; + iRep++; + nbRep++; } } else { @@ -778,14 +815,94 @@ BRepCheck_Status BRepCheck_Edge:: return BRepCheck_NoError; } +//======================================================================= +//function : CheckTolerance +//purpose : Cheks, if theEdge lies entirely into sphere, center of which +// is middle point of line segment, which joins first and last +// vertex of an edge, and radius is aTol (see function's body). +//======================================================================= +BRepCheck_Status BRepCheck_Edge::CheckTolerance(const TopoDS_Edge& theEdge) +{ + BRepCheck_Status aStatus = BRepCheck_NoError; + Standard_Real aTol1 = 1.0e-7, aTol2 = 1.0e-7; + + if(BRep_Tool::Degenerated(theEdge)) + { + aStatus = BRepCheck_NoError; + return aStatus; + } + + TopoDS_Vertex aV1 = TopExp::FirstVertex(theEdge), + aV2 = TopExp::LastVertex(theEdge); + + if(aV2.IsNull() || aV1.IsNull()) + { + aStatus = BRepCheck_NoError; + return aStatus; + } + + gp_Pnt aPnt1, aPnt2; + + aPnt1 = BRep_Tool::Pnt(aV1); + aPnt2 = BRep_Tool::Pnt(aV2); + + aTol1 = BRep_Tool::Tolerance(aV1); + aTol2 = BRep_Tool::Tolerance(aV2); + + if( Precision::IsInfinite(aTol1) || + Precision::IsInfinite(aTol2)) + { + aStatus = BRepCheck_CollapsedEdge; + return aStatus; + } + + Standard_Real st = aTol1 + aTol2; + + if(aPnt1.SquareDistance(aPnt2) >= st*st) + { + aStatus = BRepCheck_NoError; + return aStatus; + } + + gp_Pnt aPn( (aPnt1.X() + aPnt2.X())/2.0, + (aPnt1.Y() + aPnt2.Y())/2.0, + (aPnt1.Z() + aPnt2.Z())/2.0); + + + const Standard_Real aTol = Max(aTol1,aTol2) + aPnt1.Distance(aPnt2)/2.0; + const Standard_Real aTols = aTol*aTol; + + BRepAdaptor_Curve BACurve(theEdge); + + const Standard_Real aFirst = BACurve.FirstParameter(), + aLast = BACurve.LastParameter(); + + const Standard_Real dParam = aLast - aFirst; + + for(Standard_Integer i = 0; i < maxNIter; i++) + { + const Standard_Real ParOnC = aFirst + DivPoints[i]*dParam; + + gp_Pnt pt = BACurve.Value(ParOnC); + if((aPn.SquareDistance(pt) >= aTols)) + { + aStatus = BRepCheck_NoError; + return aStatus; + } + } + + aStatus = BRepCheck_CollapsedEdge; + return aStatus; +} + //======================================================================= //function : Validate //purpose : //======================================================================= Standard_Boolean Validate(const Adaptor3d_Curve& CRef, - const Adaptor3d_CurveOnSurface& Other, - const Standard_Real Tol, - const Standard_Boolean SameParameter) + const Adaptor3d_CurveOnSurface& Other, + const Standard_Real Tol, + const Standard_Boolean SameParameter) { Standard_Boolean Status, proj; Standard_Real aPC, First, Last, Error; @@ -812,17 +929,17 @@ Standard_Boolean Validate(const Adaptor3d_Curve& CRef, Tol2=Tol2*Tol2; //Tol2=Tol*Tol; //modified by NIZNHY-PKV Thu May 05 09:06:47 2011t - + for (i = 0; i < NCONTROL; ++i) { prm = ((NCONTROL-1-i)*First + i*Last)/(NCONTROL-1); pref = CRef.Value(prm); pother = Other.Value(prm); if (pref.SquareDistance(pother) > Tol2) { - problematic_point = pref ; - Status = Standard_False; - Error = pref.Distance(pother); - PrintProblematicPoint(problematic_point, Error, Tol); - return Status; + problematic_point = pref ; + Status = Standard_False; + Error = pref.Distance(pother); + PrintProblematicPoint(problematic_point, Error, Tol); + return Status; //goto FINISH ; } } @@ -863,37 +980,37 @@ Standard_Boolean Validate(const Adaptor3d_Curve& CRef, gp_Pnt pother = Other.Value(oprm); refd.Perform(pother,rprm); if (!refd.IsDone() || refd.SquareDistance() > Tol * Tol) { - problematic_point = pref ; - Status = Standard_False ; - if (refd.IsDone()) { - Error = sqrt (refd.SquareDistance()); - } - else { - Error = RealLast(); - } - PrintProblematicPoint(problematic_point, Error, Tol); - return Status; + problematic_point = pref ; + Status = Standard_False ; + if (refd.IsDone()) { + Error = sqrt (refd.SquareDistance()); + } + else { + Error = RealLast(); + } + PrintProblematicPoint(problematic_point, Error, Tol); + return Status; //goto FINISH ; } otherd.Perform(pref,oprm); if (!otherd.IsDone() || otherd.SquareDistance() > Tol * Tol) { - problematic_point = pref ; - Status = Standard_False ; - if (otherd.IsDone()) { - Error = sqrt (otherd.SquareDistance()); - } - else { - Error = RealLast(); - } - PrintProblematicPoint(problematic_point, Error, Tol); - return Status; - //goto FINISH ; + problematic_point = pref ; + Status = Standard_False ; + if (otherd.IsDone()) { + Error = sqrt (otherd.SquareDistance()); + } + else { + Error = RealLast(); + } + PrintProblematicPoint(problematic_point, Error, Tol); + return Status; + //goto FINISH ; } } } return Status ; - + } //======================================================================= @@ -901,14 +1018,14 @@ Standard_Boolean Validate(const Adaptor3d_Curve& CRef, //purpose : //======================================================================= Standard_Real Prec(const Adaptor3d_Curve& aAC3D, - const Adaptor3d_CurveOnSurface& aACS) + const Adaptor3d_CurveOnSurface& aACS) { Standard_Real aXEmax, aXC, aXS; const Handle(Adaptor3d_Surface)& aAHS = aACS.GetSurface(); // aXC = BRepCheck::PrecCurve(aAC3D); aXS = BRepCheck::PrecSurface(aAHS); - aXEmax = (aXC>aXS) ? aXC: aXS; + aXEmax=(aXC>aXS) ? aXC: aXS; return aXEmax; } @@ -918,8 +1035,8 @@ Standard_Real Prec(const Adaptor3d_Curve& aAC3D, //======================================================================= #ifdef OCCT_DEBUG void PrintProblematicPoint(const gp_Pnt& problematic_point, - const Standard_Real Error, - const Standard_Real Tol) + const Standard_Real Error, + const Standard_Real Tol) { std::cout << " **** probleme de SameParameter au point :" << std::endl; std::cout << " " << problematic_point.Coord(1) << " " @@ -928,8 +1045,8 @@ void PrintProblematicPoint(const gp_Pnt& problematic_point, } #else void PrintProblematicPoint(const gp_Pnt&, - const Standard_Real, - const Standard_Real) + const Standard_Real, + const Standard_Real) { } #endif diff --git a/src/BRepTest/BRepTest_CheckCommands.cxx b/src/BRepTest/BRepTest_CheckCommands.cxx index deb880998b..c1eecc34e2 100644 --- a/src/BRepTest/BRepTest_CheckCommands.cxx +++ b/src/BRepTest/BRepTest_CheckCommands.cxx @@ -516,6 +516,31 @@ void ContextualDump(Draw_Interpretor& theCommands, static void FillProblems(const BRepCheck_Status stat, Handle(TColStd_HArray1OfInteger)& NbProblems) { + case BRepCheck_CollapsedEdge: + NbProblems->SetValue(13,NbProblems->Value(13)+1); break; + NbProblems->SetValue(14,NbProblems->Value(14)+1); break; + NbProblems->SetValue(15,NbProblems->Value(15)+1); break; + NbProblems->SetValue(16,NbProblems->Value(16)+1); break; + NbProblems->SetValue(17,NbProblems->Value(17)+1); break; + NbProblems->SetValue(18,NbProblems->Value(18)+1); break; + NbProblems->SetValue(19,NbProblems->Value(19)+1); break; + NbProblems->SetValue(20,NbProblems->Value(20)+1); break; + NbProblems->SetValue(21,NbProblems->Value(21)+1); break; + NbProblems->SetValue(22,NbProblems->Value(22)+1); break; + NbProblems->SetValue(23,NbProblems->Value(23)+1); break; + NbProblems->SetValue(24,NbProblems->Value(24)+1); break; + NbProblems->SetValue(25,NbProblems->Value(25)+1); break; + NbProblems->SetValue(26,NbProblems->Value(26)+1); break; + NbProblems->SetValue(27,NbProblems->Value(27)+1); break; + NbProblems->SetValue(28,NbProblems->Value(28)+1); break; + NbProblems->SetValue(29,NbProblems->Value(29)+1); break; + NbProblems->SetValue(30,NbProblems->Value(30)+1); break; + NbProblems->SetValue(31,NbProblems->Value(31)+1); break; + NbProblems->SetValue(32,NbProblems->Value(32)+1); break; + case BRepCheck_InvalidToleranceValue: + NbProblems->SetValue(33,NbProblems->Value(33)+1); break; + case BRepCheck_CheckFail: + NbProblems->SetValue(34,NbProblems->Value(34)+1); break; const Standard_Integer anID = static_cast (stat); @@ -524,7 +549,7 @@ static void FillProblems(const BRepCheck_Status stat, NbProblems->SetValue(anID, NbProblems->Value(anID)+1); -} + } //======================================================================= @@ -655,9 +680,78 @@ void StructuralDump(Draw_Interpretor& theCommands, GetProblemShapes(theAna, theShape, sl, NbProblems); theMap.Clear(); + if(NbProblems->Value(13)>0) + theCommands<<" Edge is collapsed in vertex............... "<Value(13)<<"\n"; + //cout<<" Invalid Degenerated Flag ................. "<Value(12)<Value(14)>0) + theCommands<<" Free Edge ................................ "<Value(14)<<"\n"; + //cout<<" Free Edge ................................ "<Value(14)<Value(15)>0) + theCommands<<" Invalid MultiConnexity ................... "<Value(15)<<"\n"; + //cout<<" Invalid MultiConnexity ................... "<Value(15)<Value(16)>0) + theCommands<<" Invalid Range ............................ "<Value(16)<<"\n"; + //cout<<" Invalid Range ............................ "<Value(16)<Value(17)>0) + theCommands<<" Empty Wire ............................... "<Value(17)<<"\n"; + //cout<<" Empty Wire ............................... "<Value(17)<Value(18)>0) + theCommands<<" Redundant Edge ........................... "<Value(18)<<"\n"; + //cout<<" Redundant Edge ........................... "<Value(18)<Value(19)>0) + theCommands<<" Self Intersecting Wire ................... "<Value(19)<<"\n"; + //cout<<" Self Intersecting Wire ................... "<Value(19)<Value(20)>0) + theCommands<<" No Surface ............................... "<Value(20)<<"\n"; + //cout<<" No Surface ............................... "<Value(20)<Value(21)>0) + theCommands<<" Invalid Wire ............................. "<Value(21)<<"\n"; + //cout<<" Invalid Wire ............................. "<Value(21)<Value(22)>0) + theCommands<<" Redundant Wire ........................... "<Value(22)<<"\n"; + //cout<<" Redundant Wire ........................... "<Value(22)<Value(23)>0) + theCommands<<" Intersecting Wires ....................... "<Value(23)<<"\n"; + //cout<<" Intersecting Wires ....................... "<Value(23)<Value(24)>0) + theCommands<<" Invalid Imbrication of Wires ............. "<Value(24)<<"\n"; + //cout<<" Invalid Imbrication of Wires ............. "<Value(24)<Value(25)>0) + theCommands<<" Empty Shell .............................. "<Value(25)<<"\n"; + //cout<<" Empty Shell .............................. "<Value(25)<Value(26)>0) + theCommands<<" Redundant Face ........................... "<Value(26)<<"\n"; + //cout<<" Redundant Face ........................... "<Value(26)<Value(27)>0) + theCommands<<" Unorientable Shape ....................... "<Value(27)<<"\n"; + //cout<<" Unorientable Shape ....................... "<Value(27)<Value(28)>0) + theCommands<<" Not Closed ............................... "<Value(28)<<"\n"; + //cout<<" Not Closed ............................... "<Value(28)<Value(29)>0) + theCommands<<" Not Connected ............................ "<Value(29)<<"\n"; + //cout<<" Not Connected ............................ "<Value(29)<Value(30)>0) + theCommands<<" Subshape not in Shape .................... "<Value(30)<<"\n"; + //cout<<" Subshape not in Shape .................... "<Value(30)<Value(31)>0) + theCommands<<" Bad Orientation .......................... "<Value(31)<<"\n"; + //cout<<" Bad Orientation .......................... "<Value(31)<Value(32)>0) + theCommands<<" Bad Orientation of Subshape .............. "<Value(32)<<"\n"; + //cout<<" Bad Orientation of Subshape .............. "<Value(32)<Value(33)>0) + theCommands<<" Invalid tolerance value................... "<Value(33)<<"\n"; + //cout<<" checkshape failure......... .............. "<Value(33)<Value(34)>0) + theCommands<<" checkshape failure......... .............. "<Value(34)<<"\n"; + //cout<<" checkshape failure......... .............. "<Value(34)<(BRepCheck_InvalidPointOnCurve); if(NbProblems->Value(aProblemID) > 0) theCommands<<" Invalid Point on Curve ................... "<Value(aProblemID)<<"\n"; + if(NbProblems->Value(34)>0) + theCommands<<" checkshape failure........................ "<Value(34)<<"\n"; + //cout<<" checkshape failure......... .............. "<Value(32)<(BRepCheck_InvalidPointOnCurveOnSurface); if(NbProblems->Value(aProblemID)>0) @@ -1082,7 +1176,7 @@ static Standard_Integer shapeG1continuity (Draw_Interpretor& di, Standard_Intege face1=TopoDS::Face(It.Value()); It.Next(); face2=TopoDS::Face(It.Value()); - + Standard_Boolean IsSeam = face1.IsEqual(face2); // calcul des deux pcurves @@ -1129,13 +1223,13 @@ static Standard_Integer shapeG1continuity (Draw_Interpretor& di, Standard_Intege { case 7 : epsG1 = Draw::Atof(a[6]); Standard_FALLTHROUGH - case 6 : epsC0 = Draw::Atof(a[5]); + case 6 : epsC0 = Draw::Atof(a[5]); Standard_FALLTHROUGH - case 5 : epsnl = Draw::Atof(a[4]); + case 5 : epsnl = Draw::Atof(a[4]); Standard_FALLTHROUGH case 4 : break; - default : return 1; - } + default : return 1; + } Standard_Real pard1, parf1, U, Uf, deltaU, nb = 0; @@ -1263,11 +1357,11 @@ static Standard_Integer shapeG0continuity (Draw_Interpretor& di, Standard_Intege { case 6 : epsC0 = Draw::Atof(a[5]); Standard_FALLTHROUGH - case 5 : epsnl = Draw::Atof(a[4]); + case 5 : epsnl = Draw::Atof(a[4]); Standard_FALLTHROUGH case 4 : break; - default : return 1; - } + default : return 1; + } Standard_Real pard1, parf1, U, Uf, deltaU, nb = 0; Standard_Boolean isconti = Standard_True; @@ -1389,20 +1483,20 @@ static Standard_Integer shapeG2continuity (Draw_Interpretor& di, Standard_Intege nbeval = (Standard_Integer ) Draw::Atof( a[3]); switch(n) - { - case 9 : maxlen = Draw::Atof(a[8]); + { + case 9 : maxlen = Draw::Atof(a[8]); Standard_FALLTHROUGH - case 8 : percent = Draw::Atof(a[7]); + case 8 : percent = Draw::Atof(a[7]); Standard_FALLTHROUGH - case 7 : epsG1 = Draw::Atof(a[6]); + case 7 : epsG1 = Draw::Atof(a[6]); Standard_FALLTHROUGH - case 6 : epsC0 = Draw::Atof(a[5]); + case 6 : epsC0 = Draw::Atof(a[5]); Standard_FALLTHROUGH - case 5 : epsnl = Draw::Atof(a[4]); + case 5 : epsnl = Draw::Atof(a[4]); Standard_FALLTHROUGH case 4 : break; - default : return 1; - } + default : return 1; + } Standard_Real pard1, parf1, U, Uf, deltaU, nb = 0; diff --git a/src/BRepTest/BRepTest_PrimitiveCommands.cxx b/src/BRepTest/BRepTest_PrimitiveCommands.cxx index 3ad36cedf7..4e6f7525b1 100644 --- a/src/BRepTest/BRepTest_PrimitiveCommands.cxx +++ b/src/BRepTest/BRepTest_PrimitiveCommands.cxx @@ -19,7 +19,11 @@ #include #include #include +#include +#include #include +#include +#include #include #include #include @@ -118,7 +122,7 @@ static Standard_Integer box(Draw_Interpretor& , Standard_Integer n, const char** aParams.SetY (Draw::Atof(a[anArgIter + 4])); aParams.SetZ (Draw::Atof(a[anArgIter + 5])); anArgIter += 5; - } + } else if (aCountReal == 3) { @@ -126,7 +130,7 @@ static Standard_Integer box(Draw_Interpretor& , Standard_Integer n, const char** aParams.SetY (Draw::Atof(a[anArgIter + 1])); aParams.SetZ (Draw::Atof(a[anArgIter + 2])); anArgIter += 2; - } + } else { Message::SendFail() << "Syntax error"; @@ -159,7 +163,7 @@ static Standard_Integer box(Draw_Interpretor& , Standard_Integer n, const char** } S = aPreview; - DBRep::Set(a[1],S); + DBRep::Set(a[1],S); } else { @@ -383,6 +387,78 @@ static Standard_Integer torus(Draw_Interpretor& , Standard_Integer n, const char return 0; } +//======================================================================= +//function : DrawTolerance +//purpose : +//======================================================================= +static Standard_Integer DrawTolerance(Draw_Interpretor& theDI, Standard_Integer theNArg, const char** a) +{ + if(theNArg != 3) + { + theDI << "use toolsphere name vertex\\edge\n"; + return 1; + } + + TopoDS_Shape aS = DBRep::Get(a[2]); + if(aS.IsNull()) + { + theDI << "No source shape found\n"; + return 1; + } + + Standard_Real aRadius; + gp_Pnt aCenter; + + switch(aS.ShapeType()) + { + case TopAbs_VERTEX: + { + TopoDS_Vertex aV = TopoDS::Vertex(aS); + aRadius = BRep_Tool::Tolerance(aV); + aCenter = BRep_Tool::Pnt(aV); + } + break; + case TopAbs_EDGE: + { + TopoDS_Edge anE = TopoDS::Edge(DBRep::Get(a[2])); + TopoDS_Vertex aV1 = TopExp::FirstVertex(anE), + aV2 = TopExp::LastVertex(anE); + + Standard_Real aTol1 = BRep_Tool::Tolerance(aV1); + Standard_Real aTol2 = BRep_Tool::Tolerance(aV2); + + if( Precision::IsInfinite(aTol1) || + Precision::IsInfinite(aTol2)) + { + theDI << "Tolerance is infinity\n"; + return 0; + } + + gp_Pnt aPnt1 = BRep_Tool::Pnt(aV1); + gp_Pnt aPnt2 = BRep_Tool::Pnt(aV2); + + aCenter = gp_Pnt( (aPnt1.X() + aPnt2.X())/2.0, + (aPnt1.Y() + aPnt2.Y())/2.0, + (aPnt1.Z() + aPnt2.Z())/2.0); + + aRadius = Max(aTol1,aTol2) + aPnt1.Distance(aPnt2)/2.0; + } + break; + default: + { + theDI << "Enter a vertex or an edge (see help)\n"; + return 1; + } + } + + TopoDS_Solid S = BRepPrimAPI_MakeSphere(aCenter,aRadius); + + DBRep::Set(a[1],S); + return 0; +} + + + //======================================================================= @@ -459,6 +535,9 @@ void BRepTest::PrimitiveCommands(Draw_Interpretor& theCommands) "\n\t\t: - angle2 second angle to create a torus ring segment" "\n\t\t: - angle angle to create a torus pipe segment", __FILE__, torus, g); + theCommands.Add("tolsphere", "toolsphere name vertex\\edge (if vertex is given, center of sphere is the \"vertex\", " + "radius is a tolerance of vertex; if edge is given, sphere is built, which is determined in " + "BRepCheck_Edge::CheckTolerance(...) function)",__FILE__,DrawTolerance,g); } diff --git a/tests/bugs/modalg_5/bug23731 b/tests/bugs/modalg_5/bug23731 new file mode 100644 index 0000000000..a408ef7cfd --- /dev/null +++ b/tests/bugs/modalg_5/bug23731 @@ -0,0 +1,24 @@ +puts "============" +puts "CR23731" +puts "============" +puts "" +###################################################### +# The shape obtained by stepread is valid in terms of checkshape but it is not valid in terms of usability. +###################################################### + +catch { pload XDE } + +set filepath [locate_data_file OCC6289.stp] +stepread $filepath a * + +explode a_1 f + +renamevar a_1_24 result + +smallview +donly result +fit + +set square 1 + +set only_screen_axo 1