1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00

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.
This commit is contained in:
nbv 2013-12-03 16:05:46 +04:00
parent 52e6db9d8a
commit 6e8ab7b8af
12 changed files with 687 additions and 328 deletions

View File

@ -72,6 +72,7 @@ is
InvalidSameRangeFlag, InvalidSameRangeFlag,
InvalidSameParameterFlag, InvalidSameParameterFlag,
InvalidDegeneratedFlag, InvalidDegeneratedFlag,
CollapsedEdge,
FreeEdge, FreeEdge,
InvalidMultiConnexity, InvalidMultiConnexity,

View File

@ -181,6 +181,13 @@ void BRepCheck::Print(const BRepCheck_Status stat,
case BRepCheck_CheckFail: case BRepCheck_CheckFail:
OS << "BRepCheck_CheckFail\n"; OS << "BRepCheck_CheckFail\n";
break; break;
case BRepCheck_CollapsedEdge:
OS << "BRepCheck_CollapsedEdge\n";
break;
case BRepCheck_InvalidToleranceValue:
OS << "BRepCheck_InvalidToleranceValue\n";
break;
default: default:
break; break;
} }

View File

@ -109,15 +109,17 @@ void BRepCheck_Analyzer::Put(const TopoDS_Shape& S,
void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S) void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S)
{ {
for(TopoDS_Iterator theIterator(S);theIterator.More();theIterator.Next()) { for(TopoDS_Iterator theIterator(S);theIterator.More();theIterator.Next())
Perform(theIterator.Value()); Perform(theIterator.Value());
}
// //
TopAbs_ShapeEnum styp; TopAbs_ShapeEnum styp;
TopExp_Explorer exp; TopExp_Explorer exp;
// //
styp = S.ShapeType(); styp = S.ShapeType();
switch (styp) {
switch (styp)
{
case TopAbs_VERTEX: case TopAbs_VERTEX:
// modified by NIZHNY-MKK Wed May 19 16:56:16 2004.BEGIN // modified by NIZHNY-MKK Wed May 19 16:56:16 2004.BEGIN
// There is no need to check anything. // There is no need to check anything.
@ -127,306 +129,376 @@ void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S)
// modified by NIZHNY-MKK Wed May 19 16:56:23 2004.END // modified by NIZHNY-MKK Wed May 19 16:56:23 2004.END
break; break;
case TopAbs_EDGE: { case TopAbs_EDGE:
// Modified by skv - Tue Apr 27 11:38:08 2004 Begin {
// There is no need to check anything except vertices on single edge. Handle(BRepCheck_Result)& aRes = myMap(S);
// if (myShape.IsSame(S)) {
// myMap(S)->Blind(); try
// } {
// Modified by skv - Tue Apr 27 11:38:09 2004 End BRepCheck_Status ste = Handle(BRepCheck_Edge)::
TopTools_MapOfShape MapS; DownCast(aRes)->CheckTolerance(TopoDS::Edge(S));
for (exp.Init(S,TopAbs_VERTEX);exp.More(); exp.Next()) { if(ste != BRepCheck_NoError)
const TopoDS_Shape& aVertex = exp.Current(); {
try { Handle(BRepCheck_Edge)::DownCast(aRes)->SetStatus(ste);
OCC_CATCH_SIGNALS break;
if (MapS.Add(aVertex)) { }
myMap(aVertex)->InContext(S);
}
} }
catch(Standard_Failure) { catch(Standard_Failure)
{
#ifdef DEB #ifdef DEB
cout<<"BRepCheck_Analyzer : "; cout<<"BRepCheck_Analyzer : ";
Standard_Failure::Caught()->Print(cout); Standard_Failure::Caught()->Print(cout);
cout<<endl; cout<<endl;
#endif #endif
if ( ! myMap(S).IsNull() ) { if ( ! myMap(S).IsNull() )
myMap(S)->SetFailStatus(S); {
} myMap(S)->SetFailStatus(S);
Handle(BRepCheck_Result) aRes = myMap(aVertex); }
if ( ! aRes.IsNull() ) {
aRes->SetFailStatus(aVertex); if ( ! aRes.IsNull() )
aRes->SetFailStatus(S); {
} 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);
}
catch(Standard_Failure)
{
#ifdef DEB
cout<<"BRepCheck_Analyzer : ";
Standard_Failure::Caught()->Print(cout);
cout<<endl;
#endif
if ( ! myMap(S).IsNull() )
myMap(S)->SetFailStatus(S);
Handle(BRepCheck_Result) aRes = myMap(aVertex);
if ( ! aRes.IsNull() )
{
aRes->SetFailStatus(aVertex);
aRes->SetFailStatus(S);
}
}//catch(Standard_Failure)
}//for (exp.Init(S,TopAbs_VERTEX);exp.More(); exp.Next())
} }
break; break;
case TopAbs_WIRE: case TopAbs_WIRE:
// Modified by Sergey KHROMOV - Mon May 6 15:53:39 2002 Begin {
// There is no need to check the orientation of a single wire // TopTools_MapOfShape MapS;
// (not in context of face). // Standard_Boolean InvalidTolerance = Standard_False;
// { //
// if (myShape.IsSame(S)) { // for (exp.Init(S,TopAbs_EDGE);exp.More(); exp.Next())
// Handle(BRepCheck_Wire)::DownCast(myMap(S))->Orientation(TopoDS_Face(), // {
// Standard_True); // try
// } // {
// } // OCC_CATCH_SIGNALS
// Modified by Sergey KHROMOV - Mon May 6 15:53:40 2002 End //
// if (MapS.Add(exp.Current()))
// {
// Handle(BRepCheck_Result)& res = myMap(exp.Current());
// res->InContext(S);
// for (res->InitContextIterator();
// res->MoreShapeInContext();
// res->NextShapeInContext())
// {
// if(res->ContextualShape().IsSame(S))
// break;
// }
//
// BRepCheck_ListIteratorOfListOfStatus itl(res->StatusOnShape());
// for (; itl.More(); itl.Next())
// {
// BRepCheck_Status ste = itl.Value();
// if(ste == BRepCheck_CollapsedEdge)
// {
// InvalidTolerance = Standard_True;
// break;
// }
// }//for (; itl.More(); itl.Next())
// }//if (MapS.Add(exp.Current()))
// }
// catch(Standard_Failure)
// {
//#ifdef DEB
// cout<<"BRepCheck_Analyzer : ";
// Standard_Failure::Caught()->Print(cout);
// cout<<endl;
//#endif
// if ( ! myMap(S).IsNull() )
// myMap(S)->SetFailStatus(S);
//
// Handle(BRepCheck_Result) aRes = myMap(exp.Current());
//
// if ( ! aRes.IsNull() )
// {
// aRes->SetFailStatus(exp.Current());
// aRes->SetFailStatus(S);
// }
// }//catch(Standard_Failure)
// }//for (exp.Init(S,TopAbs_EDGE);exp.More(); exp.Next())
//
// if (InvalidTolerance)
// Handle(BRepCheck_Wire)::DownCast(myMap(S))->
// SetStatus(BRepCheck_InvalidToleranceValue);
}
break; break;
case TopAbs_FACE: case TopAbs_FACE:
{ {
TopTools_MapOfShape MapS; TopTools_MapOfShape MapS;
for (exp.Init(S,TopAbs_VERTEX);exp.More(); exp.Next()) { for (exp.Init(S,TopAbs_VERTEX);exp.More(); exp.Next())
try { {
OCC_CATCH_SIGNALS try
if (MapS.Add(exp.Current())) { {
myMap(exp.Current())->InContext(S); OCC_CATCH_SIGNALS
} if (MapS.Add(exp.Current()))
} {
catch(Standard_Failure) { myMap(exp.Current())->InContext(S);
}
}
catch(Standard_Failure)
{
#ifdef DEB #ifdef DEB
cout<<"BRepCheck_Analyzer : "; cout<<"BRepCheck_Analyzer : ";
Standard_Failure::Caught()->Print(cout); Standard_Failure::Caught()->Print(cout);
cout<<endl; cout<<endl;
#endif #endif
if ( ! myMap(S).IsNull() ) { if ( ! myMap(S).IsNull() )
myMap(S)->SetFailStatus(S); {
} myMap(S)->SetFailStatus(S);
Handle(BRepCheck_Result) aRes = myMap(exp.Current()); }
Handle(BRepCheck_Result) aRes = myMap(exp.Current());
if ( ! aRes.IsNull() ) { if ( ! aRes.IsNull() )
aRes->SetFailStatus(exp.Current()); {
aRes->SetFailStatus(S); aRes->SetFailStatus(exp.Current());
} aRes->SetFailStatus(S);
} }
}
} }
Standard_Boolean performwire = Standard_True; Standard_Boolean performwire = Standard_True;
Standard_Boolean isInvalidTolerance = Standard_False;
MapS.Clear(); MapS.Clear();
for (exp.Init(S,TopAbs_EDGE);exp.More(); exp.Next()) { for (exp.Init(S,TopAbs_EDGE);exp.More(); exp.Next())
try { {
OCC_CATCH_SIGNALS try
if (MapS.Add(exp.Current())) { {
Handle(BRepCheck_Result)& res = myMap(exp.Current()); OCC_CATCH_SIGNALS
res->InContext(S); if (MapS.Add(exp.Current()))
if (performwire) { {
for (res->InitContextIterator(); Handle(BRepCheck_Result)& res = myMap(exp.Current());
res->MoreShapeInContext(); res->InContext(S);
res->NextShapeInContext()) { if (performwire)
if(res->ContextualShape().IsSame(S)) { {
break; for ( res->InitContextIterator();
} res->MoreShapeInContext();
} res->NextShapeInContext())
BRepCheck_ListIteratorOfListOfStatus itl(res->StatusOnShape()); {
for (; itl.More(); itl.Next()) { if(res->ContextualShape().IsSame(S))
BRepCheck_Status ste = itl.Value(); break;
if (ste == BRepCheck_NoCurveOnSurface || }
ste == BRepCheck_InvalidCurveOnSurface ||
ste == BRepCheck_InvalidRange || BRepCheck_ListIteratorOfListOfStatus itl(res->StatusOnShape());
ste == BRepCheck_InvalidCurveOnClosedSurface) { for (; itl.More(); itl.Next())
performwire = Standard_False; {
break; BRepCheck_Status ste = itl.Value();
} if (ste == BRepCheck_NoCurveOnSurface ||
} ste == BRepCheck_InvalidCurveOnSurface ||
} ste == BRepCheck_InvalidRange ||
} ste == BRepCheck_InvalidCurveOnClosedSurface)
} {
catch(Standard_Failure) { performwire = Standard_False;
break;
}
//if(ste == BRepCheck_CollapsedEdge)
//{
// isInvalidTolerance = Standard_True;
// break;
//}
}
}
}
}
catch(Standard_Failure)
{
#ifdef DEB #ifdef DEB
cout<<"BRepCheck_Analyzer : "; cout<<"BRepCheck_Analyzer : ";
Standard_Failure::Caught()->Print(cout); Standard_Failure::Caught()->Print(cout);
cout<<endl; cout<<endl;
#endif #endif
if ( ! myMap(S).IsNull() )
{
myMap(S)->SetFailStatus(S);
}
if ( ! myMap(S).IsNull() ) { Handle(BRepCheck_Result) aRes = myMap(exp.Current());
myMap(S)->SetFailStatus(S);
}
Handle(BRepCheck_Result) aRes = myMap(exp.Current());
if ( ! aRes.IsNull() ) { if ( ! aRes.IsNull() )
aRes->SetFailStatus(exp.Current()); {
aRes->SetFailStatus(S); aRes->SetFailStatus(exp.Current());
} aRes->SetFailStatus(S);
} }
}
} }
Standard_Boolean orientofwires = performwire; Standard_Boolean orientofwires = performwire;
for (exp.Init(S,TopAbs_WIRE);exp.More(); exp.Next()) { for (exp.Init(S,TopAbs_WIRE);exp.More(); exp.Next())
try { {
OCC_CATCH_SIGNALS try
Handle(BRepCheck_Result)& res = myMap(exp.Current()); {
res->InContext(S); OCC_CATCH_SIGNALS
if (orientofwires) { Handle(BRepCheck_Result)& res = myMap(exp.Current());
for (res->InitContextIterator(); res->InContext(S);
res->MoreShapeInContext(); if (orientofwires)
res->NextShapeInContext()) { {
if(res->ContextualShape().IsSame(S)) { for ( res->InitContextIterator();
break; res->MoreShapeInContext();
} res->NextShapeInContext())
} {
BRepCheck_ListIteratorOfListOfStatus itl(res->StatusOnShape()); if(res->ContextualShape().IsSame(S))
for (; itl.More(); itl.Next()) { {
BRepCheck_Status ste = itl.Value(); break;
if (ste != BRepCheck_NoError) { }
orientofwires = Standard_False; }
break; BRepCheck_ListIteratorOfListOfStatus itl(res->StatusOnShape());
} for (; itl.More(); itl.Next())
} {
} BRepCheck_Status ste = itl.Value();
} if (ste != BRepCheck_NoError)
catch(Standard_Failure) { {
orientofwires = Standard_False;
break;
}
}
}
}
catch(Standard_Failure)
{
#ifdef DEB #ifdef DEB
cout<<"BRepCheck_Analyzer : "; cout<<"BRepCheck_Analyzer : ";
Standard_Failure::Caught()->Print(cout); Standard_Failure::Caught()->Print(cout);
cout<<endl; cout<<endl;
#endif #endif
if ( ! myMap(S).IsNull() ) { if ( ! myMap(S).IsNull() )
myMap(S)->SetFailStatus(S); {
} myMap(S)->SetFailStatus(S);
Handle(BRepCheck_Result) aRes = myMap(exp.Current()); }
if ( ! aRes.IsNull() ) { Handle(BRepCheck_Result) aRes = myMap(exp.Current());
aRes->SetFailStatus(exp.Current());
aRes->SetFailStatus(S); if ( ! aRes.IsNull() )
} {
} aRes->SetFailStatus(exp.Current());
aRes->SetFailStatus(S);
}
}
} }
try { try
{
OCC_CATCH_SIGNALS OCC_CATCH_SIGNALS
if (performwire) { if(isInvalidTolerance)
if (orientofwires) { {
Handle(BRepCheck_Face)::DownCast(myMap(S))-> Handle(BRepCheck_Face)::
OrientationOfWires(Standard_True);// on enregistre DownCast(myMap(S))->SetStatus(BRepCheck_InvalidToleranceValue);
} }
// else { else if (performwire)
// Handle(BRepCheck_Face)::DownCast(myMap(S))-> {
// IntersectWires(Standard_True); // on enregistre if (orientofwires)
// } {
else { Handle(BRepCheck_Face)::DownCast(myMap(S))->
Handle(BRepCheck_Face)::DownCast(myMap(S))->SetUnorientable(); OrientationOfWires(Standard_True);// on enregistre
} }
} else
else { {
Handle(BRepCheck_Face)::DownCast(myMap(S))->SetUnorientable(); Handle(BRepCheck_Face)::DownCast(myMap(S))->SetUnorientable();
} }
}
else
{
Handle(BRepCheck_Face)::DownCast(myMap(S))->SetUnorientable();
}
} }
catch(Standard_Failure) { catch(Standard_Failure)
{
#ifdef DEB #ifdef DEB
cout<<"BRepCheck_Analyzer : "; cout<<"BRepCheck_Analyzer : ";
Standard_Failure::Caught()->Print(cout); Standard_Failure::Caught()->Print(cout);
cout<<endl; cout<<endl;
#endif #endif
if ( ! myMap(S).IsNull() )
{
myMap(S)->SetFailStatus(S);
}
if ( ! myMap(S).IsNull() ) { for (exp.Init(S,TopAbs_WIRE);exp.More(); exp.Next())
myMap(S)->SetFailStatus(S); {
} Handle(BRepCheck_Result) aRes = myMap(exp.Current());
for (exp.Init(S,TopAbs_WIRE);exp.More(); exp.Next()) { if ( ! aRes.IsNull() )
Handle(BRepCheck_Result) aRes = myMap(exp.Current()); {
aRes->SetFailStatus(exp.Current());
if ( ! aRes.IsNull() ) { aRes->SetFailStatus(S);
aRes->SetFailStatus(exp.Current()); myMap(S)->SetFailStatus(exp.Current());
aRes->SetFailStatus(S); }
myMap(S)->SetFailStatus(exp.Current()); }
}
}
} }
} }
break; break;
case TopAbs_SHELL: case TopAbs_SHELL:
//modified by NIZNHY-PKV Mon Oct 13 14:23:53 2008f //modified by NIZNHY-PKV Mon Oct 13 14:23:53 2008f
/* {
Standard_Boolean VerifyOrientation, bFlag;
//
VerifyOrientation = Standard_True;
//
exp.Init(S,TopAbs_FACE);
for (; exp.More(); exp.Next()) {
const TopoDS_Shape& aF=exp.Current();
try {
OCC_CATCH_SIGNALS
bFlag= !(Handle(BRepCheck_Face)::DownCast(myMap(aF))->IsUnorientable());
VerifyOrientation = (VerifyOrientation && bFlag);
}
catch(Standard_Failure) {
#ifdef DEB
cout<<"BRepCheck_Analyzer : ";
Standard_Failure::Caught()->Print(cout);
cout<<endl;
#endif
if ( ! myMap(S).IsNull() ) {
myMap(S)->SetFailStatus(S);
}
Handle(BRepCheck_Result) aRes = myMap(exp.Current());
if ( ! aRes.IsNull() ) {
aRes->SetFailStatus(exp.Current());
aRes->SetFailStatus(S);
}
}
} //
try {
OCC_CATCH_SIGNALS
if (VerifyOrientation) {
Handle(BRepCheck_Shell)::DownCast(myMap(S))->Orientation(Standard_True);
}
else {
Handle(BRepCheck_Shell)::DownCast(myMap(S))->SetUnorientable();
}
}
catch(Standard_Failure) {
#ifdef DEB
cout<<"BRepCheck_Analyzer : ";
Standard_Failure::Caught()->Print(cout);
cout<<endl;
#endif
if ( ! myMap(S).IsNull() ) {
myMap(S)->SetFailStatus(S);
}
exp.Init(S,TopAbs_FACE);
for (; exp.More(); exp.Next()) {
Handle(BRepCheck_Result) aRes = myMap(exp.Current());
if ( ! aRes.IsNull() ) {
aRes->SetFailStatus(exp.Current());
aRes->SetFailStatus(S);
myMap(S)->SetFailStatus(exp.Current());
}
}
}
}
*/
//modified by NIZNHY-PKV Mon Oct 13 14:24:04 2008t //modified by NIZNHY-PKV Mon Oct 13 14:24:04 2008t
break; break;
//
case TopAbs_SOLID: { case TopAbs_SOLID:
{
exp.Init(S,TopAbs_SHELL); exp.Init(S,TopAbs_SHELL);
for (; exp.More(); exp.Next()) { for (; exp.More(); exp.Next())
{
const TopoDS_Shape& aShell=exp.Current(); const TopoDS_Shape& aShell=exp.Current();
try { try
{
OCC_CATCH_SIGNALS OCC_CATCH_SIGNALS
myMap(aShell)->InContext(S); myMap(aShell)->InContext(S);
} }
catch(Standard_Failure) { catch(Standard_Failure)
{
#ifdef DEB #ifdef DEB
cout<<"BRepCheck_Analyzer : "; cout<<"BRepCheck_Analyzer : ";
Standard_Failure::Caught()->Print(cout); Standard_Failure::Caught()->Print(cout);
cout<<endl; cout<<endl;
#endif #endif
if ( ! myMap(S).IsNull() ) { 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() ) { if (!aRes.IsNull() )
{
aRes->SetFailStatus(exp.Current()); aRes->SetFailStatus(exp.Current());
aRes->SetFailStatus(S); aRes->SetFailStatus(S);
} }
}//catch(Standard_Failure)
}//for (; exp.More(); exp.Next())
} }
}
}
break;//case TopAbs_SOLID break;//case TopAbs_SOLID
default: default:
break; break;

View File

@ -27,7 +27,8 @@ class Edge from BRepCheck inherits Result from BRepCheck
uses Shape from TopoDS, uses Shape from TopoDS,
Edge from TopoDS, Edge from TopoDS,
CurveRepresentation from BRep, CurveRepresentation from BRep,
HCurve from Adaptor3d HCurve from Adaptor3d,
Status from BRepCheck
is is
@ -61,6 +62,18 @@ is
is static; is static;
SetStatus(me: mutable;
theStatus:Status from BRepCheck)
--- Purpose: Sets status of Edge;
is static;
CheckTolerance(me: mutable; theEdge: Edge from TopoDS)
--- Purpose: Checks, if tolerance of vertexes overlaps
-- theEdge;
returns Status from BRepCheck
is static;
fields fields
myCref : CurveRepresentation from BRep; myCref : CurveRepresentation from BRep;

View File

@ -29,6 +29,8 @@
#include <BRep_TEdge.hxx> #include <BRep_TEdge.hxx>
#include <BRep_TFace.hxx> #include <BRep_TFace.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRep_CurveRepresentation.hxx> #include <BRep_CurveRepresentation.hxx>
#include <BRep_ListOfCurveRepresentation.hxx> #include <BRep_ListOfCurveRepresentation.hxx>
#include <BRep_ListIteratorOfListOfCurveRepresentation.hxx> #include <BRep_ListIteratorOfListOfCurveRepresentation.hxx>
@ -37,6 +39,7 @@
#include <BRep_Tool.hxx> #include <BRep_Tool.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx> #include <TopExp_Explorer.hxx>
#include <Geom_Surface.hxx> #include <Geom_Surface.hxx>
@ -61,8 +64,22 @@
#include <TopoDS.hxx> #include <TopoDS.hxx>
#include <TopAbs_ShapeEnum.hxx> #include <TopAbs_ShapeEnum.hxx>
#include <TopoDS_Face.hxx> #include <TopoDS_Face.hxx>
#include <TopoDS_Vertex.hxx>
#include <Precision.hxx> #include <Precision.hxx>
//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 //modified by NIZNHY-PKV Thu May 05 09:01:57 2011f
static static
@ -70,6 +87,7 @@ static
const Adaptor3d_CurveOnSurface&, const Adaptor3d_CurveOnSurface&,
const Standard_Real, const Standard_Real,
const Standard_Boolean); const Standard_Boolean);
static static
void PrintProblematicPoint(const gp_Pnt&, void PrintProblematicPoint(const gp_Pnt&,
const Standard_Real, const Standard_Real,
@ -89,7 +107,7 @@ static
// const Standard_Boolean); // const Standard_Boolean);
//modified by NIZNHY-PKV Thu May 05 09:02:01 2011t //modified by NIZNHY-PKV Thu May 05 09:02:01 2011t
#define NCONTROL 23 static const Standard_Integer NCONTROL=23;
//======================================================================= //=======================================================================
//function : BRepCheck_Edge //function : BRepCheck_Edge
@ -242,12 +260,24 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S)
return; return;
} }
switch (styp) { switch (styp)
{
case TopAbs_WIRE:
{
//if (CheckTolerance(TopoDS::Edge(myShape)) == BRepCheck_CollapsedEdge)
//{
// BRepCheck::Add(lst,BRepCheck_CollapsedEdge);
// return;
//}
}
break;
case TopAbs_FACE: case TopAbs_FACE:
if (!myCref.IsNull()) { if (!myCref.IsNull()) {
Standard_Boolean SameParameter = TE->SameParameter(); Standard_Boolean SameParameter = TE->SameParameter();
Standard_Boolean SameRange = TE->SameRange(); 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 || !SameRange) {
if (!SameParameter) if (!SameParameter)
@ -279,8 +309,8 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S)
// gka OCC // 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 (SameRange && (fabs(f-First) > Precision::PConfusion() || fabs(l-Last)> Precision::PConfusion())) { //f != First || l != Last)) { gka OCC // if (SameRange && (fabs(f-First) > Precision::PConfusion() || fabs(l-Last)> Precision::PConfusion())) { //f != First || l != Last)) { gka OCC
if (fabs(f-First) > Precision::PConfusion() || if (Abs(f-First) > Precision::PConfusion() ||
fabs(l-Last) > Precision::PConfusion()) { Abs(l-Last) > Precision::PConfusion()) {
BRepCheck::Add(lst,BRepCheck_InvalidSameRangeFlag); BRepCheck::Add(lst,BRepCheck_InvalidSameRangeFlag);
BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag); BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
// if (SameParameter) { // if (SameParameter) {
@ -455,6 +485,16 @@ Standard_Boolean BRepCheck_Edge::GeometricControls() const
return myGctrl; return myGctrl;
} }
//=======================================================================
//function : SetStatus
//purpose :
//=======================================================================
void BRepCheck_Edge::SetStatus(const BRepCheck_Status theStatus)
{
BRepCheck::Add(myMap(myShape),theStatus);
}
@ -554,6 +594,86 @@ Standard_Real BRepCheck_Edge::Tolerance()
return sqrt(tolCal)*1.05; return sqrt(tolCal)*1.05;
} }
//=======================================================================
//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 //function : Validate
//purpose : //purpose :
@ -571,12 +691,13 @@ Standard_Boolean Validate(const Adaptor3d_Curve& CRef,
Error = 0.; Error = 0.;
First = CRef.FirstParameter(); First = CRef.FirstParameter();
Last = CRef.LastParameter(); Last = CRef.LastParameter();
//
aPC=Precision::PConfusion(); aPC=Precision::PConfusion();
proj = (!SameParameter || proj = (!SameParameter ||
fabs(Other.FirstParameter()-First) > aPC || Abs(Other.FirstParameter()-First) > aPC ||
fabs( Other.LastParameter()-Last) > aPC); Abs( Other.LastParameter()-Last) > aPC);
if (!proj) { if (!proj)
{
Standard_Integer i; Standard_Integer i;
Standard_Real Tol2, prm, dD; Standard_Real Tol2, prm, dD;
gp_Pnt pref, pother; gp_Pnt pref, pother;
@ -588,7 +709,7 @@ Standard_Boolean Validate(const Adaptor3d_Curve& CRef,
//Tol2=Tol*Tol; //Tol2=Tol*Tol;
//modified by NIZNHY-PKV Thu May 05 09:06:47 2011t //modified by NIZNHY-PKV Thu May 05 09:06:47 2011t
for (i = 0; i< NCONTROL; ++i) { for (i = 0; i < NCONTROL; ++i) {
prm = ((NCONTROL-1-i)*First + i*Last)/(NCONTROL-1); prm = ((NCONTROL-1-i)*First + i*Last)/(NCONTROL-1);
pref = CRef.Value(prm); pref = CRef.Value(prm);
pother = Other.Value(prm); pother = Other.Value(prm);
@ -666,18 +787,6 @@ Standard_Boolean Validate(const Adaptor3d_Curve& CRef,
} }
} }
} }
//FINISH :
/*
#ifdef DEB
if (! Status) {
cout << " **** probleme de SameParameter au point :" << endl;
cout << " " << problematic_point.Coord(1) << " "
<< problematic_point.Coord(2) << " "
<< problematic_point.Coord(3) << endl ;
cout << " Erreur detectee :" << Error << " Tolerance :" << Tol << endl;
}
#endif
*/
return Status ; return Status ;

View File

@ -73,6 +73,13 @@ is
is static; is static;
SetStatus(me: mutable;
theStatus:Status from BRepCheck)
--- Purpose: Sets status of Face;
is static;
IsUnorientable(me) IsUnorientable(me)

View File

@ -452,6 +452,15 @@ void BRepCheck_Face::SetUnorientable()
BRepCheck::Add(myMap(myShape),BRepCheck_UnorientableShape); BRepCheck::Add(myMap(myShape),BRepCheck_UnorientableShape);
} }
//=======================================================================
//function : SetStatus
//purpose :
//=======================================================================
void BRepCheck_Face::SetStatus(const BRepCheck_Status theStatus)
{
BRepCheck::Add(myMap(myShape),theStatus);
}
//======================================================================= //=======================================================================
//function : IsUnorientable //function : IsUnorientable

View File

@ -126,6 +126,12 @@ is
---Purpose: set SelfIntersect() to be checked ---Purpose: set SelfIntersect() to be checked
is static; is static;
SetStatus(me: mutable;
theStatus:Status from BRepCheck)
--- Purpose: Sets status of Wire;
is static;
fields fields

View File

@ -1512,6 +1512,17 @@ BRepCheck_Status BRepCheck_Wire::SelfIntersect(const TopoDS_Face& F,
// //
return (BRepCheck_NoError); return (BRepCheck_NoError);
} }
//=======================================================================
//function : SetStatus
//purpose :
//=======================================================================
void BRepCheck_Wire::SetStatus(const BRepCheck_Status theStatus)
{
BRepCheck::Add(myMap(myShape),theStatus);
}
//======================================================================= //=======================================================================
//function : GeometricControls //function : GeometricControls
//purpose : //purpose :

View File

@ -80,6 +80,11 @@
# include <strings.h> # include <strings.h>
#endif #endif
//Number of BRepCheck_Statuses in BRepCheck_Status.hxx file
//(BRepCheck_NoError is not considered, i.e. general status
//is smaller by one specified in file)
static const Standard_Integer NumberOfStatus = 34;
static char* checkfaultyname = NULL; static char* checkfaultyname = NULL;
Standard_EXPORT void BRepTest_CheckCommands_SetFaultyName(const char* name) Standard_EXPORT void BRepTest_CheckCommands_SetFaultyName(const char* name)
{ {
@ -216,6 +221,7 @@ static void Print(Standard_OStream& OS,
OS << "On Shape " << Name << " :\n"; OS << "On Shape " << Name << " :\n";
for (;itl.More(); itl.Next()) { for (;itl.More(); itl.Next()) {
if (itl.Value() != BRepCheck_NoError)
BRepCheck::Print(itl.Value(),OS); BRepCheck::Print(itl.Value(),OS);
} }
} }
@ -229,6 +235,10 @@ static void Print(Standard_OStream& OS,
case TopAbs_EDGE: case TopAbs_EDGE:
PrintSub(OS,Ana,S,TopAbs_VERTEX); PrintSub(OS,Ana,S,TopAbs_VERTEX);
break; break;
case TopAbs_WIRE:
PrintSub(OS,Ana,S,TopAbs_EDGE);
PrintSub(OS,Ana,S,TopAbs_VERTEX);
break;
case TopAbs_FACE: case TopAbs_FACE:
PrintSub(OS,Ana,S,TopAbs_WIRE); PrintSub(OS,Ana,S,TopAbs_WIRE);
PrintSub(OS,Ana,S,TopAbs_EDGE); PrintSub(OS,Ana,S,TopAbs_EDGE);
@ -509,46 +519,50 @@ static void FillProblems(const BRepCheck_Status stat,
NbProblems->SetValue(11,NbProblems->Value(11)+1); break; NbProblems->SetValue(11,NbProblems->Value(11)+1); break;
case BRepCheck_InvalidDegeneratedFlag: case BRepCheck_InvalidDegeneratedFlag:
NbProblems->SetValue(12,NbProblems->Value(12)+1); break; NbProblems->SetValue(12,NbProblems->Value(12)+1); break;
case BRepCheck_FreeEdge: case BRepCheck_CollapsedEdge:
NbProblems->SetValue(13,NbProblems->Value(13)+1); break; NbProblems->SetValue(13,NbProblems->Value(13)+1); break;
case BRepCheck_InvalidMultiConnexity: case BRepCheck_FreeEdge:
NbProblems->SetValue(14,NbProblems->Value(14)+1); break; NbProblems->SetValue(14,NbProblems->Value(14)+1); break;
case BRepCheck_InvalidRange: case BRepCheck_InvalidMultiConnexity:
NbProblems->SetValue(15,NbProblems->Value(15)+1); break; NbProblems->SetValue(15,NbProblems->Value(15)+1); break;
case BRepCheck_EmptyWire: case BRepCheck_InvalidRange:
NbProblems->SetValue(16,NbProblems->Value(16)+1); break; NbProblems->SetValue(16,NbProblems->Value(16)+1); break;
case BRepCheck_RedundantEdge: case BRepCheck_EmptyWire:
NbProblems->SetValue(17,NbProblems->Value(17)+1); break; NbProblems->SetValue(17,NbProblems->Value(17)+1); break;
case BRepCheck_SelfIntersectingWire: case BRepCheck_RedundantEdge:
NbProblems->SetValue(18,NbProblems->Value(18)+1); break; NbProblems->SetValue(18,NbProblems->Value(18)+1); break;
case BRepCheck_NoSurface: case BRepCheck_SelfIntersectingWire:
NbProblems->SetValue(19,NbProblems->Value(19)+1); break; NbProblems->SetValue(19,NbProblems->Value(19)+1); break;
case BRepCheck_InvalidWire: case BRepCheck_NoSurface:
NbProblems->SetValue(20,NbProblems->Value(20)+1); break; NbProblems->SetValue(20,NbProblems->Value(20)+1); break;
case BRepCheck_RedundantWire: case BRepCheck_InvalidWire:
NbProblems->SetValue(21,NbProblems->Value(21)+1); break; NbProblems->SetValue(21,NbProblems->Value(21)+1); break;
case BRepCheck_IntersectingWires: case BRepCheck_RedundantWire:
NbProblems->SetValue(22,NbProblems->Value(22)+1); break; NbProblems->SetValue(22,NbProblems->Value(22)+1); break;
case BRepCheck_InvalidImbricationOfWires: case BRepCheck_IntersectingWires:
NbProblems->SetValue(23,NbProblems->Value(23)+1); break; NbProblems->SetValue(23,NbProblems->Value(23)+1); break;
case BRepCheck_EmptyShell: case BRepCheck_InvalidImbricationOfWires:
NbProblems->SetValue(24,NbProblems->Value(24)+1); break; NbProblems->SetValue(24,NbProblems->Value(24)+1); break;
case BRepCheck_RedundantFace: case BRepCheck_EmptyShell:
NbProblems->SetValue(25,NbProblems->Value(25)+1); break; NbProblems->SetValue(25,NbProblems->Value(25)+1); break;
case BRepCheck_UnorientableShape: case BRepCheck_RedundantFace:
NbProblems->SetValue(26,NbProblems->Value(26)+1); break; NbProblems->SetValue(26,NbProblems->Value(26)+1); break;
case BRepCheck_NotClosed: case BRepCheck_UnorientableShape:
NbProblems->SetValue(27,NbProblems->Value(27)+1); break; NbProblems->SetValue(27,NbProblems->Value(27)+1); break;
case BRepCheck_NotConnected: case BRepCheck_NotClosed:
NbProblems->SetValue(28,NbProblems->Value(28)+1); break; NbProblems->SetValue(28,NbProblems->Value(28)+1); break;
case BRepCheck_SubshapeNotInShape: case BRepCheck_NotConnected:
NbProblems->SetValue(29,NbProblems->Value(29)+1); break; NbProblems->SetValue(29,NbProblems->Value(29)+1); break;
case BRepCheck_BadOrientation: case BRepCheck_SubshapeNotInShape:
NbProblems->SetValue(30,NbProblems->Value(30)+1); break; NbProblems->SetValue(30,NbProblems->Value(30)+1); break;
case BRepCheck_BadOrientationOfSubshape: case BRepCheck_BadOrientation:
NbProblems->SetValue(31,NbProblems->Value(31)+1); break; NbProblems->SetValue(31,NbProblems->Value(31)+1); break;
case BRepCheck_CheckFail: case BRepCheck_BadOrientationOfSubshape:
NbProblems->SetValue(32,NbProblems->Value(32)+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;
default: default:
break; break;
} }
@ -674,8 +688,9 @@ void StructuralDump(Draw_Interpretor& theCommands,
theCommands<<" Check Count"<<"\n"; theCommands<<" Check Count"<<"\n";
theCommands<<" ------------------------------------------------"<<"\n"; theCommands<<" ------------------------------------------------"<<"\n";
Handle(TColStd_HArray1OfInteger) NbProblems = new TColStd_HArray1OfInteger(1,32); Handle(TColStd_HArray1OfInteger) NbProblems = new
for(i=1; i<=32; i++) NbProblems->SetValue(i,0); TColStd_HArray1OfInteger(1,NumberOfStatus);
for(i=1; i<=NumberOfStatus; i++) NbProblems->SetValue(i,0);
Handle(TopTools_HSequenceOfShape) sl,slv,sle,slw,slf,sls,slo; Handle(TopTools_HSequenceOfShape) sl,slv,sle,slw,slf,sls,slo;
sl = new TopTools_HSequenceOfShape(); sl = new TopTools_HSequenceOfShape();
theMap.Clear(); theMap.Clear();
@ -719,64 +734,70 @@ void StructuralDump(Draw_Interpretor& theCommands,
theCommands<<" Invalid Degenerated Flag ................. "<<NbProblems->Value(12)<<"\n"; theCommands<<" Invalid Degenerated Flag ................. "<<NbProblems->Value(12)<<"\n";
//cout<<" Invalid Degenerated Flag ................. "<<NbProblems->Value(12)<<endl; //cout<<" Invalid Degenerated Flag ................. "<<NbProblems->Value(12)<<endl;
if(NbProblems->Value(13)>0) if(NbProblems->Value(13)>0)
theCommands<<" Free Edge ................................ "<<NbProblems->Value(13)<<"\n"; theCommands<<" Edge is collapsed in vertex............... "<<NbProblems->Value(13)<<"\n";
//cout<<" Free Edge ................................ "<<NbProblems->Value(13)<<endl; //cout<<" Invalid Degenerated Flag ................. "<<NbProblems->Value(12)<<endl;
if(NbProblems->Value(14)>0) if(NbProblems->Value(14)>0)
theCommands<<" Invalid MultiConnexity ................... "<<NbProblems->Value(14)<<"\n"; theCommands<<" Free Edge ................................ "<<NbProblems->Value(14)<<"\n";
//cout<<" Invalid MultiConnexity ................... "<<NbProblems->Value(14)<<endl; //cout<<" Free Edge ................................ "<<NbProblems->Value(13)<<endl;
if(NbProblems->Value(15)>0) if(NbProblems->Value(15)>0)
theCommands<<" Invalid Range ............................ "<<NbProblems->Value(15)<<"\n"; theCommands<<" Invalid MultiConnexity ................... "<<NbProblems->Value(15)<<"\n";
//cout<<" Invalid Range ............................ "<<NbProblems->Value(15)<<endl; //cout<<" Invalid MultiConnexity ................... "<<NbProblems->Value(14)<<endl;
if(NbProblems->Value(16)>0) if(NbProblems->Value(16)>0)
theCommands<<" Empty Wire ............................... "<<NbProblems->Value(16)<<"\n"; theCommands<<" Invalid Range ............................ "<<NbProblems->Value(16)<<"\n";
//cout<<" Empty Wire ............................... "<<NbProblems->Value(16)<<endl; //cout<<" Invalid Range ............................ "<<NbProblems->Value(15)<<endl;
if(NbProblems->Value(17)>0) if(NbProblems->Value(17)>0)
theCommands<<" Redundant Edge ........................... "<<NbProblems->Value(17)<<"\n"; theCommands<<" Empty Wire ............................... "<<NbProblems->Value(17)<<"\n";
//cout<<" Redundant Edge ........................... "<<NbProblems->Value(17)<<endl; //cout<<" Empty Wire ............................... "<<NbProblems->Value(16)<<endl;
if(NbProblems->Value(18)>0) if(NbProblems->Value(18)>0)
theCommands<<" Self Intersecting Wire ................... "<<NbProblems->Value(18)<<"\n"; theCommands<<" Redundant Edge ........................... "<<NbProblems->Value(18)<<"\n";
//cout<<" Self Intersecting Wire ................... "<<NbProblems->Value(18)<<endl; //cout<<" Redundant Edge ........................... "<<NbProblems->Value(17)<<endl;
if(NbProblems->Value(19)>0) if(NbProblems->Value(19)>0)
theCommands<<" No Surface ............................... "<<NbProblems->Value(19)<<"\n"; theCommands<<" Self Intersecting Wire ................... "<<NbProblems->Value(19)<<"\n";
//cout<<" No Surface ............................... "<<NbProblems->Value(19)<<endl; //cout<<" Self Intersecting Wire ................... "<<NbProblems->Value(18)<<endl;
if(NbProblems->Value(20)>0) if(NbProblems->Value(20)>0)
theCommands<<" Invalid Wire ............................. "<<NbProblems->Value(20)<<"\n"; theCommands<<" No Surface ............................... "<<NbProblems->Value(20)<<"\n";
//cout<<" Invalid Wire ............................. "<<NbProblems->Value(20)<<endl; //cout<<" No Surface ............................... "<<NbProblems->Value(19)<<endl;
if(NbProblems->Value(21)>0) if(NbProblems->Value(21)>0)
theCommands<<" Redundant Wire ........................... "<<NbProblems->Value(21)<<"\n"; theCommands<<" Invalid Wire ............................. "<<NbProblems->Value(21)<<"\n";
//cout<<" Redundant Wire ........................... "<<NbProblems->Value(21)<<endl; //cout<<" Invalid Wire ............................. "<<NbProblems->Value(20)<<endl;
if(NbProblems->Value(22)>0) if(NbProblems->Value(22)>0)
theCommands<<" Intersecting Wires ....................... "<<NbProblems->Value(22)<<"\n"; theCommands<<" Redundant Wire ........................... "<<NbProblems->Value(22)<<"\n";
//cout<<" Intersecting Wires ....................... "<<NbProblems->Value(22)<<endl; //cout<<" Redundant Wire ........................... "<<NbProblems->Value(21)<<endl;
if(NbProblems->Value(23)>0) if(NbProblems->Value(23)>0)
theCommands<<" Invalid Imbrication of Wires ............. "<<NbProblems->Value(23)<<"\n"; theCommands<<" Intersecting Wires ....................... "<<NbProblems->Value(23)<<"\n";
//cout<<" Invalid Imbrication of Wires ............. "<<NbProblems->Value(23)<<endl; //cout<<" Intersecting Wires ....................... "<<NbProblems->Value(22)<<endl;
if(NbProblems->Value(24)>0) if(NbProblems->Value(24)>0)
theCommands<<" Empty Shell .............................. "<<NbProblems->Value(24)<<"\n"; theCommands<<" Invalid Imbrication of Wires ............. "<<NbProblems->Value(24)<<"\n";
//cout<<" Empty Shell .............................. "<<NbProblems->Value(24)<<endl; //cout<<" Invalid Imbrication of Wires ............. "<<NbProblems->Value(23)<<endl;
if(NbProblems->Value(25)>0) if(NbProblems->Value(25)>0)
theCommands<<" Redundant Face ........................... "<<NbProblems->Value(25)<<"\n"; theCommands<<" Empty Shell .............................. "<<NbProblems->Value(25)<<"\n";
//cout<<" Redundant Face ........................... "<<NbProblems->Value(25)<<endl; //cout<<" Empty Shell .............................. "<<NbProblems->Value(24)<<endl;
if(NbProblems->Value(26)>0) if(NbProblems->Value(26)>0)
theCommands<<" Unorientable Shape ....................... "<<NbProblems->Value(26)<<"\n"; theCommands<<" Redundant Face ........................... "<<NbProblems->Value(26)<<"\n";
//cout<<" Unorientable Shape ....................... "<<NbProblems->Value(26)<<endl; //cout<<" Redundant Face ........................... "<<NbProblems->Value(25)<<endl;
if(NbProblems->Value(27)>0) if(NbProblems->Value(27)>0)
theCommands<<" Not Closed ............................... "<<NbProblems->Value(27)<<"\n"; theCommands<<" Unorientable Shape ....................... "<<NbProblems->Value(27)<<"\n";
//cout<<" Not Closed ............................... "<<NbProblems->Value(27)<<endl; //cout<<" Unorientable Shape ....................... "<<NbProblems->Value(26)<<endl;
if(NbProblems->Value(28)>0) if(NbProblems->Value(28)>0)
theCommands<<" Not Connected ............................ "<<NbProblems->Value(28)<<"\n"; theCommands<<" Not Closed ............................... "<<NbProblems->Value(28)<<"\n";
//cout<<" Not Connected ............................ "<<NbProblems->Value(28)<<endl; //cout<<" Not Closed ............................... "<<NbProblems->Value(27)<<endl;
if(NbProblems->Value(29)>0) if(NbProblems->Value(29)>0)
theCommands<<" Subshape not in Shape .................... "<<NbProblems->Value(29)<<"\n"; theCommands<<" Not Connected ............................ "<<NbProblems->Value(29)<<"\n";
//cout<<" Subshape not in Shape .................... "<<NbProblems->Value(29)<<endl; //cout<<" Not Connected ............................ "<<NbProblems->Value(28)<<endl;
if(NbProblems->Value(30)>0) if(NbProblems->Value(30)>0)
theCommands<<" Bad Orientation .......................... "<<NbProblems->Value(30)<<"\n"; theCommands<<" Subshape not in Shape .................... "<<NbProblems->Value(30)<<"\n";
//cout<<" Bad Orientation .......................... "<<NbProblems->Value(30)<<endl; //cout<<" Subshape not in Shape .................... "<<NbProblems->Value(29)<<endl;
if(NbProblems->Value(31)>0) if(NbProblems->Value(31)>0)
theCommands<<" Bad Orientation of Subshape .............. "<<NbProblems->Value(31)<<"\n"; theCommands<<" Bad Orientation .......................... "<<NbProblems->Value(31)<<"\n";
//cout<<" Bad Orientation of Subshape .............. "<<NbProblems->Value(31)<<endl; //cout<<" Bad Orientation .......................... "<<NbProblems->Value(30)<<endl;
if(NbProblems->Value(32)>0) if(NbProblems->Value(32)>0)
theCommands<<" checkshape failure......... .............. "<<NbProblems->Value(32)<<"\n"; theCommands<<" Bad Orientation of Subshape .............. "<<NbProblems->Value(32)<<"\n";
//cout<<" Bad Orientation of Subshape .............. "<<NbProblems->Value(31)<<endl;
if(NbProblems->Value(33)>0)
theCommands<<" Invalid tolerance value................... "<<NbProblems->Value(33)<<"\n";
//cout<<" checkshape failure......... .............. "<<NbProblems->Value(32)<<endl;
if(NbProblems->Value(34)>0)
theCommands<<" checkshape failure........................ "<<NbProblems->Value(34)<<"\n";
//cout<<" checkshape failure......... .............. "<<NbProblems->Value(32)<<endl; //cout<<" checkshape failure......... .............. "<<NbProblems->Value(32)<<endl;
//cout<<" ------------------------------------------------"<<endl; //cout<<" ------------------------------------------------"<<endl;

View File

@ -25,7 +25,11 @@
#include <Draw_Interpretor.hxx> #include <Draw_Interpretor.hxx>
#include <Draw_Appli.hxx> #include <Draw_Appli.hxx>
#include <DrawTrSurf.hxx> #include <DrawTrSurf.hxx>
#include <TopExp.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Solid.hxx> #include <TopoDS_Solid.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Edge.hxx>
#include <BRep_Builder.hxx> #include <BRep_Builder.hxx>
#include <BRepBuilderAPI.hxx> #include <BRepBuilderAPI.hxx>
#include <BRepPrimAPI_MakeBox.hxx> #include <BRepPrimAPI_MakeBox.hxx>
@ -263,6 +267,78 @@ static Standard_Integer torus(Draw_Interpretor& , Standard_Integer n, const char
return 0; 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;
}
//======================================================================= //=======================================================================
@ -287,6 +363,9 @@ void BRepTest::PrimitiveCommands(Draw_Interpretor& theCommands)
theCommands.Add("pcone", "pcone name [plane(ax2)] R1 R2 H [angle]",__FILE__,cone,g); theCommands.Add("pcone", "pcone name [plane(ax2)] R1 R2 H [angle]",__FILE__,cone,g);
theCommands.Add("psphere", "psphere name [plane(ax2)] R [angle1 angle2] [angle]",__FILE__,sphere,g); theCommands.Add("psphere", "psphere name [plane(ax2)] R [angle1 angle2] [angle]",__FILE__,sphere,g);
theCommands.Add("ptorus", "ptorus name [plane(ax2)] R1 R2 [angle1 angle2] [angle]",__FILE__,torus,g); theCommands.Add("ptorus", "ptorus name [plane(ax2)] R1 R2 [angle1 angle2] [angle]",__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);
} }

View File

@ -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