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

0025013: ShapeFix_Wire tweaks for better results

Recalculate of tolerance before edge cutting

Test case for issue CR25013

add try to increase tolerance before splitting in singularity during PCurve adding.

Correction of test cases for issue CR25013
This commit is contained in:
ika 2015-03-05 14:52:06 +03:00 committed by bugmaster
parent 4c5133866b
commit 3163e9fdeb
20 changed files with 318 additions and 198 deletions

View File

@ -109,6 +109,7 @@
#include <Geom_OffsetCurve.hxx>
#include <TColStd_HSequenceOfReal.hxx>
#include <Handle_Geom2dAdaptor_HCurve.hxx>
#include <Adaptor3d_CurveOnSurface.hxx>
#include <Geom2dAdaptor_HCurve.hxx>
#include <GeomAPI_ProjectPointOnCurve.hxx>
@ -596,12 +597,38 @@ Standard_Boolean ShapeFix_Wire::FixEdgeCurves()
//ShapeAnalysis_Edge sae;
V1 = sae.FirstVertex ( E );
V2 = sae.LastVertex ( E );
Handle(ShapeExtend_WireData) sw = new ShapeExtend_WireData;
for ( Standard_Integer k=0; k <= seq.Length(); k++ ) {
for ( Standard_Integer k=0; k <= seq.Length(); k++ )
{
Standard_Real split = ( k < seq.Length() ? seq(k+1) : b );
if ( k < seq.Length() )
{
B.MakeVertex ( V, C->Value(split), BRep_Tool::Tolerance(E) );
else V = V2;
//try increase tolerance before splitting
Standard_Real aDist = BRep_Tool::Pnt(V1).Distance(BRep_Tool::Pnt(V));
if (aDist < BRep_Tool::Tolerance(V1) * 1.01) {
B.UpdateVertex(V1, Max(aDist, BRep_Tool::Tolerance(V1)));
a = split;
V1 = V;
continue;
}
else
{
aDist = BRep_Tool::Pnt(V2).Distance(BRep_Tool::Pnt(V));
if (aDist < BRep_Tool::Tolerance(V2) * 1.01) {
B.UpdateVertex(V, Max(aDist, BRep_Tool::Tolerance(V2)));
b = split;
V2 = V;
continue;
}
}
}
else
{
V = V2;
}
TopoDS_Edge edge = sbe.CopyReplaceVertices ( E, V1, V );
if( BRep_Tool::SameParameter(sbwd->Edge(i)) ) {
//TopoDS_Edge edge = sbe.CopyReplaceVertices ( E, V1, V );
@ -844,11 +871,12 @@ Standard_Boolean ShapeFix_Wire::FixSelfIntersection()
if(LastFixStatus (ShapeExtend_DONE6))
myStatusSelfIntersection |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE6 );
if ( ! myTopoMode || nb < 3 ) {
if ( /*! myTopoMode ||*/ nb < 3 ) {
//#86 rln 22.03.99 sim2.igs, entity 4292: After fixing of self-intersecting
//BRepCheck finds one more self-intersection not found by ShapeAnalysis
//%15 pdn 06.04.99 repeat until fixed CTS18546-2 entity 777
//FixIntersectingEdges ( num );
// if the tolerance was modified we should recheck the result, if it was enough
if ( LastFixStatus ( ShapeExtend_DONE7 ) ) num--;
continue;
}
@ -868,7 +896,9 @@ Standard_Boolean ShapeFix_Wire::FixSelfIntersection()
//#86 rln 22.03.99
//%15 pdn 06.04.99 repeat until fixed CTS18546-2 entity 777
//FixIntersectingEdges ( num );
if ( LastFixStatus ( ShapeExtend_DONE7 ) ) num--;
/*if ( LastFixStatus ( ShapeExtend_DONE7 ) )*/
// Always revisit the fixed edge
num--;
}
}
}
@ -1331,8 +1361,13 @@ Standard_Boolean ShapeFix_Wire::FixShifted()
TopoDS_Edge E1 = sbwd->Edge ( n1 );
TopoDS_Edge E2 = sbwd->Edge ( n2 );
if ( BRep_Tool::Degenerated(E1) || BRep_Tool::Degenerated(E2) ) {
if ( ! degstop ) { stop = n2; degstop = Standard_True; }
if ( BRep_Tool::Degenerated(E1) || BRep_Tool::Degenerated(E2) )
{
if ( ! degstop )
{
stop = n2;
degstop = Standard_True;
}
continue;
}
@ -1376,20 +1411,35 @@ Standard_Boolean ShapeFix_Wire::FixShifted()
}
}
if ( isDeg ) {
if ( ! degstop ) { stop = n2; degstop = Standard_True; }
if ( ! degn2 ) { degn2 = n2; pdeg = p; }
else if ( pdeg.SquareDistance(p) < Precision()*Precision() ) {
degn2 = n2;
// if ( stop < n2 ) { stop = n2; degstop = Standard_True; }
if ( isDeg )
{
if ( ! degstop )
{
stop = n2;
degstop = Standard_True;
}
else {
if ( ! degn2 )
{
degn2 = n2;
pdeg = p;
}
else
{
if ( pdeg.SquareDistance(p) < Precision() * Precision() )
{
degn2 = n2;
//if ( stop < n2 ) { stop = n2; degstop = Standard_True; }
}
else
{
Standard_Real ax1 = 0., bx1 = 0., ax2 = 0., bx2 = 0.;
Handle(Geom2d_Curve) cx1, cx2;
if ( ( c2d1.IsNull() && ! sae.PCurve ( E1, Face(), c2d1, a1, b1, Standard_True ) ) ||
( c2d2.IsNull() && ! sae.PCurve ( E2, Face(), c2d2, a2, b2, Standard_True ) ) ||
! sae.PCurve ( sbwd->Edge ( degn2 >1 ? degn2-1 : nb ), Face(), cx1, ax1, bx1, Standard_True ) ||
! sae.PCurve ( sbwd->Edge ( degn2 ), Face(), cx2, ax2, bx2, Standard_True ) ) {
! sae.PCurve ( sbwd->Edge ( degn2 ), Face(), cx2, ax2, bx2, Standard_True ) )
{
myLastFixStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_FAIL1 );
continue;
}
@ -1409,7 +1459,8 @@ Standard_Boolean ShapeFix_Wire::FixShifted()
scld * scln < -::Precision::PConfusion() &&
Abs ( scln ) > 0.1 * period && Abs ( scld ) > 0.1 * period &&
rot1 * scld > ::Precision::PConfusion() &&
rot2 * scln > ::Precision::PConfusion() ) {
rot2 * scln > ::Precision::PConfusion() )
{
// abv 02 Mar 00: trying more sophisticated analysis (ie_exhaust-A.stp #37520)
Standard_Real sign = ( rot2 >0 ? 1. : -1. );
Standard_Real deep1 = Min ( sign * ( pn2.XY() * x.XY() ),
@ -1428,11 +1479,12 @@ Standard_Boolean ShapeFix_Wire::FixShifted()
// pdn 30 Oct 00: trying correct period [0,period] (trj5_k1-tc-203.stp #4698)
Standard_Real dx = ShapeAnalysis::AdjustToPeriod ( deep, ::Precision::PConfusion(), period+::Precision::PConfusion());
x *= ( scld >0 ? -dx : dx );
// x *= ( Abs(scld-scln) > 1.5 * period ? 2. : 1. ) *
// ( scld >0 ? -period : period );
//x *= ( Abs(scld-scln) > 1.5 * period ? 2. : 1. ) *
// ( scld >0 ? -period : period );
gp_Trsf2d Shift;
Shift.SetTranslation ( x );
for ( Standard_Integer k=degn2; ; k++ ) {
for ( Standard_Integer k=degn2; ; k++ )
{
if ( k > nb ) k = 1;
if ( k == n2 ) break;
TopoDS_Edge edge = sbwd->Edge ( k );
@ -1449,7 +1501,8 @@ Standard_Boolean ShapeFix_Wire::FixShifted()
#endif
continue;
}
// degn2 = n2; pdeg = p; // ie_exhaust-A.stp #37520
//degn2 = n2; pdeg = p; // ie_exhaust-A.stp #37520
}
}
/*
// pdn to fix half sphere
@ -2333,10 +2386,13 @@ Standard_Boolean ShapeFix_Wire::FixIntersectingEdges (const Standard_Integer num
Standard_Real rad = errors.Value(i);
Standard_Real newtol = 1.0001 * ( pnt.Distance ( pint ) + rad );
// GeomAdaptor_Surface& Ads = myAnalyzer->Surface()->Adaptor3d()->ChangeSurface();
//GeomAdaptor_Surface& Ads = myAnalyzer->Surface()->Adaptor3d()->ChangeSurface();
//:r8 abv 12 Apr 99: try increasing tolerance of edge
if ( ! myTopoMode && newtol > tol ) {
Standard_Boolean locMayEdit = myTopoMode;
// Always try to modify the tolerance firstly as a better solution
if ( /*! myTopoMode &&*/ newtol > tol ) {
Standard_Real te1 = rad + ComputeLocalDeviation (E1, pint, pnt,
param1, ( isForward1 ? b1 : a1 ), Face() );
Standard_Real te2 = rad + ComputeLocalDeviation (E2, pint, pnt,
@ -2344,32 +2400,41 @@ Standard_Boolean ShapeFix_Wire::FixIntersectingEdges (const Standard_Integer num
Standard_Real maxte = Max ( te1, te2 );
if ( maxte < MaxTolerance() && maxte < newtol ) {
if ( BRep_Tool::Tolerance(E1) < te1 || BRep_Tool::Tolerance(E2) < te2 ) {
#ifdef OCCT_DEBUG
cout << "Warning: ShapeFix_Wire::FixIE: edges tolerance increased: (" <<
te1 << ", " << te2 << ") / " << newtol << endl;
#endif
B.UpdateEdge ( E1, 1.000001 * te1 );
B.UpdateVertex ( sae.FirstVertex ( E1 ), 1.000001 * te1 );
B.UpdateVertex ( sae.LastVertex ( E1 ), 1.000001 * te1 );
B.UpdateEdge ( E2, 1.000001 * te2 );
B.UpdateVertex ( sae.FirstVertex ( E2 ), 1.000001 * te2 );
B.UpdateVertex ( sae.LastVertex ( E2 ), 1.000001 * te2 );
myLastFixStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE6 );
locMayEdit = Standard_False;
}
newtol = 1.000001 * maxte;
}
}
if ( myTopoMode || newtol <= MaxTolerance() ) {
if ( locMayEdit || newtol <= MaxTolerance() )
{
prevRange1 = newRange1;
prevRange2 = newRange2;
Standard_Boolean locMayEdit = myTopoMode;
if ( myTopoMode ) { //:j6 abv 7 Dec 98: ProSTEP TR10 r0601_id.stp #57676 & #58586: do not cut edges because of influence on adjacent faces
if ( locMayEdit )
{
newtol = 1.0001 * ( pnt.Distance ( pint ) + rad );
//:j6 abv 7 Dec 98: ProSTEP TR10 r0601_id.stp #57676 & #58586: do not cut edges because of influence on adjacent faces
ShapeFix_SplitTool aTool;
//if ( ! ShapeFix::CutEdge ( E1, ( isForward1 ? a1 : b1 ), param1, Face(), IsCutLine ) ) {
if ( ! aTool.CutEdge ( E1, ( isForward1 ? a1 : b1 ), param1, Face(), IsCutLine ) ) {
if ( V1.IsSame ( Vp ) )
myLastFixStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE3 );
else locMayEdit = Standard_False;
}
else cutEdge1 = Standard_True; //:h4
//if ( ! ShapeFix::CutEdge ( E2, ( isForward2 ? b2 : a2 ), param2, Face(), IsCutLine ) ) {
if ( ! aTool.CutEdge ( E2, ( isForward2 ? b2 : a2 ), param2, Face(), IsCutLine ) ) {
if ( V2.IsSame ( Vn ) )
myLastFixStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE4 );
@ -2377,10 +2442,12 @@ Standard_Boolean ShapeFix_Wire::FixIntersectingEdges (const Standard_Integer num
}
else cutEdge2 = Standard_True; //:h4
}
if ( locMayEdit &&
newRange1 <= prevRange1 && newRange2 <= prevRange2 && //rln 09/01/98
BRep_Tool::SameParameter ( E1 ) &&
BRep_Tool::SameParameter ( E2 ) ) {
BRep_Tool::SameParameter ( E2 ) )
{
myLastFixStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE2 );
pnt = pint;
if ( tol <= rad ) {
@ -2388,7 +2455,10 @@ Standard_Boolean ShapeFix_Wire::FixIntersectingEdges (const Standard_Integer num
tol = 1.001 * rad;
}
}
else if(IsCutLine) {
else
{
if(IsCutLine)
{
myLastFixStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE2 );
pnt = pint;
if ( tol <= rad ) {
@ -2396,14 +2466,20 @@ Standard_Boolean ShapeFix_Wire::FixIntersectingEdges (const Standard_Integer num
tol = 1.001 * rad;
}
}
else { // else increase tolerance
if (tol < newtol) { //rln 07.04.99 CCI60005-brep.igs
else
{ // else increase tolerance
if (tol < newtol)
{ //rln 07.04.99 CCI60005-brep.igs
myLastFixStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE1 );
tol = newtol;
}
}
}
else myLastFixStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_FAIL2 );
}
else
{
myLastFixStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_FAIL2 );
}
}
if ( ! LastFixStatus ( ShapeExtend_DONE ) ) return Standard_False;
@ -2679,6 +2755,8 @@ static Standard_Boolean TryBendingPCurve (const TopoDS_Edge &E, const TopoDS_Fac
else return Standard_False;
}
c2d = bs;
if ( ! TryNewPCurve ( E, face, c2d, first, last, tol ) ) return Standard_False;
}
catch ( Standard_Failure ) {
#ifdef OCCT_DEBUG
@ -2688,7 +2766,6 @@ static Standard_Boolean TryBendingPCurve (const TopoDS_Edge &E, const TopoDS_Fac
}
}
if ( ! TryNewPCurve ( E, face, c2d, first, last, tol ) ) return Standard_False;
return Standard_True;
}

14
tests/bugs/heal/bug25013_1 Executable file
View File

@ -0,0 +1,14 @@
puts "========="
puts " OCC25013"
puts "========="
puts ""
##################################################
# ShapeFix_Wire tweaks for better results
##################################################
stepread [locate_data_file bug25013_25013faces.stp] a *
tpcompound result
checkshape result
set 2dviewer 1

14
tests/bugs/heal/bug25013_2 Executable file
View File

@ -0,0 +1,14 @@
puts "========="
puts " OCC25013"
puts "========="
puts ""
##################################################
# ShapeFix_Wire tweaks for better results
##################################################
stepread [locate_data_file bug25013_25013face.stp] a *
tpcompound result
checkshape result
set 2dviewer 1

View File

@ -1,6 +1,6 @@
# !!!! This file is generated automatically, do not edit manually! See end script
puts "TODO CR23096 ALL: LABELS : Faulty"
puts "TODO CR25013 ALL: Error : 1 differences with reference data found"
set filename CTS18546-2.igs

View File

@ -1,4 +1,5 @@
# !!!! This file is generated automatically, do not edit manually! See end script
puts "TODO CR25013 ALL: Error : 2 differences with reference data found"
set filename lh93wsddr3370z2.igs

View File

@ -1,5 +1,6 @@
# !!!! This file is generated automatically, do not edit manually! See end script
puts "TODO CR23096 ALL: STATSHAPE : Faulty"
puts "TODO CR25013 ALL: Error : 3 differences with reference data found"
set filename CCI60011.igs

View File

@ -1,5 +1,6 @@
# !!!! This file is generated automatically, do not edit manually! See end script
puts "TODO CR23096 ALL: LABELS : Faulty"
puts "TODO CR25013 ALL: Error : 1 differences with reference data found"
set LinuxDiff 1
set filename pro5101.igs

View File

@ -3,6 +3,7 @@ puts "TODO CR23096 ALL: CHECKSHAPE : Faulty"
puts "TODO CR23096 ALL: LABELS : Faulty"
puts "TODO CR23096 ALL: COLORS : Faulty"
puts "TODO CR23096 ALL: NBSHAPES : Faulty"
puts "TODO CR25013 ALL: Error : 1 differences with reference data found"
set LinuxDiff 2
set LinuxFaulties {NBSHAPES}

View File

@ -1,6 +1,7 @@
# !!!! This file is generated automatically, do not edit manually! See end script
puts "TODO CR23096 ALL: LABELS : Faulty"
puts "TODO CR23096 ALL: COLORS : Faulty"
puts "TODO CR25013 ALL: Error : 2 differences with reference data found"
set filename kegel.igs

View File

@ -2,7 +2,7 @@
puts "TODO CR23096 ALL: NBSHAPES : Faulty"
puts "TODO CR23096 ALL: LABELS : Faulty"
puts "TODO CR23096 ALL: LAYERS : Faulty"
puts "TODO CR25013 ALL: Error : 3 differences with reference data found"
set filename CATIA01.igs

View File

@ -1,6 +1,7 @@
# !!!! This file is generated automatically, do not edit manually! See end script
puts "TODO CR23096 ALL: TOLERANCE : Faulty"
puts "TODO CR23096 ALL: LABELS : Faulty"
puts "TODO CR25013 ALL: Error : 2 differences with reference data found"
set filename bmarkmdl.igs

View File

@ -1,6 +1,7 @@
# !!!! This file is generated automatically, do not edit manually! See end script
puts "TODO CR23096 ALL: LABELS : Faulty"
puts "TODO CR23096 ALL: COLORS : Faulty"
puts "TODO CR25013 ALL: Error : 1 differences with reference data found"
set filename cts17801.igs

View File

@ -1,7 +1,7 @@
# !!!! This file is generated automatically, do not edit manually! See end script
puts "TODO CR23096 ALL: CHECKSHAPE : Faulty"
puts "TODO CR23096 ALL: LABELS : Faulty"
puts "TODO CR23096 ALL: COLORS : Faulty"
puts "TODO CR25013 ALL: Error : 4 differences with reference data found"
set LinuxDiff 4
set filename PRO11641.igs

View File

@ -3,6 +3,7 @@ puts "TODO CR23096 ALL: CHECKSHAPE : Faulty"
puts "TODO CR23096 ALL: NBSHAPES : Faulty"
puts "TODO CR23096 ALL: LABELS : Faulty"
puts "TODO CR23096 ALL: COLORS : Faulty"
puts "TODO CR25013 ALL: Error : 3 differences with reference data found"
set filename PRO18777-3.igs

View File

@ -2,6 +2,7 @@
puts "TODO CR23096 ALL: NBSHAPES : Faulty"
puts "TODO CR23096 ALL: LABELS : Faulty"
puts "TODO CR23096 ALL: COLORS : Faulty"
puts "TODO CR25013 ALL: Error : 3 differences with reference data found"
set LinuxDiff 4
set LinuxFaulties {STATSHAPE}

View File

@ -4,6 +4,7 @@ puts "TODO CR23096 ALL: NBSHAPES : Faulty"
puts "TODO CR23096 ALL: LABELS : Faulty"
puts "TODO CR23096 ALL: COLORS : Faulty"
puts "TODO CR23096 ALL: LAYERS : Faulty"
puts "TODO CR25013 ALL: Error : 1 differences with reference data found"
set filename BUC60215.igs

View File

@ -5,6 +5,7 @@ puts "TODO CR23096 ALL: STATSHAPE : Faulty"
puts "TODO CR23096 ALL: LABELS : Faulty"
puts "TODO CR23096 ALL: COLORS : Faulty"
puts "TODO CR23096 ALL: LAYERS : Faulty"
puts "TODO CR25013 ALL: Error : 3 differences with reference data found"
set filename BUC40132.igs

View File

@ -1,4 +1,6 @@
# !!!! This file is generated automatically, do not edit manually! See end script
puts "TODO CR25013 ALL: Error : 3 differences with reference data found"
puts "TODO CR25013 ALL: NBSHAPES : Faulty"
set LinuxDiff 2
set LinuxFaulties {STATSHAPE}

View File

@ -1,5 +1,6 @@
# !!!! This file is generated automatically, do not edit manually! See end script
puts "TODO CR23096 ALL: STATSHAPE : Faulty"
puts "TODO CR25013 ALL: Error : 1 differences with reference data found"
set LinuxDiff 2
set filename wgehaeuse_surface.stp

View File

@ -2,6 +2,7 @@
puts "TODO CR23096 ALL: TPSTAT : Faulty"
puts "TODO CR23096 ALL: CHECKSHAPE : Faulty"
puts "TODO CR23096 ALL: STATSHAPE : Faulty"
puts "TODO CR25013 ALL: Error : 4 differences with reference data found"
set LinuxDiff 3
set filename Z8M6SAT.stp