mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-16 10:08:36 +03:00
0029717: Shape Healing - ShapeFix_Face::FixSmallAreaWire delivers a face with wrong-oriented wires + 1 small crash-fix
- Fix FixSmallAreaWire for the reversed faces. - Add nullptr check for FixOrient... - Test bugs heal bug25923 is corrected to avoid relying on wrong orientation of face after fixing small wire
This commit is contained in:
parent
bbd8ce1008
commit
3f50e94e33
@ -1156,6 +1156,10 @@ Standard_Boolean ShapeFix_Face::FixOrientation(TopTools_DataMapOfShapeListOfShap
|
|||||||
for(;ew.More(); ew.Next()) {
|
for(;ew.More(); ew.Next()) {
|
||||||
TopoDS_Edge ed = TopoDS::Edge (ew.Value());
|
TopoDS_Edge ed = TopoDS::Edge (ew.Value());
|
||||||
Handle(Geom2d_Curve) cw = BRep_Tool::CurveOnSurface (ed,myFace,cf,cl);
|
Handle(Geom2d_Curve) cw = BRep_Tool::CurveOnSurface (ed,myFace,cf,cl);
|
||||||
|
if (cw.IsNull ())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
Geom2dAdaptor_Curve gac;
|
Geom2dAdaptor_Curve gac;
|
||||||
Standard_Real aFirst = cw->FirstParameter();
|
Standard_Real aFirst = cw->FirstParameter();
|
||||||
Standard_Real aLast = cw->LastParameter();
|
Standard_Real aLast = cw->LastParameter();
|
||||||
@ -1888,6 +1892,7 @@ Standard_Boolean ShapeFix_Face::FixSmallAreaWire(const Standard_Boolean theIsRem
|
|||||||
|
|
||||||
TopoDS_Shape anEmptyCopy = myFace.EmptyCopied();
|
TopoDS_Shape anEmptyCopy = myFace.EmptyCopied();
|
||||||
TopoDS_Face aFace = TopoDS::Face(anEmptyCopy);
|
TopoDS_Face aFace = TopoDS::Face(anEmptyCopy);
|
||||||
|
aFace.Orientation (TopAbs_FORWARD);
|
||||||
|
|
||||||
const Standard_Real aTolerance3d = ShapeFix_Root::Precision();
|
const Standard_Real aTolerance3d = ShapeFix_Root::Precision();
|
||||||
for (TopoDS_Iterator aWIt(myFace, Standard_False); aWIt.More(); aWIt.Next())
|
for (TopoDS_Iterator aWIt(myFace, Standard_False); aWIt.More(); aWIt.Next())
|
||||||
@ -1931,8 +1936,9 @@ Standard_Boolean ShapeFix_Face::FixSmallAreaWire(const Standard_Boolean theIsRem
|
|||||||
#ifdef OCCT_DEBUG
|
#ifdef OCCT_DEBUG
|
||||||
std::cout << "Warning: ShapeFix_Face: " << nbRemoved << " small area wire(s) removed" << std::endl;
|
std::cout << "Warning: ShapeFix_Face: " << nbRemoved << " small area wire(s) removed" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
if ( !Context().IsNull() )
|
aFace.Orientation (myFace.Orientation ());
|
||||||
Context()->Replace(myFace, aFace);
|
if (!Context ().IsNull ())
|
||||||
|
Context ()->Replace (myFace, aFace);
|
||||||
|
|
||||||
myFace = aFace;
|
myFace = aFace;
|
||||||
return Standard_True;
|
return Standard_True;
|
||||||
|
@ -1,28 +1,13 @@
|
|||||||
puts "REQUIRED All: Faulty shapes in variables faulty_1 to faulty_"
|
|
||||||
puts "========"
|
puts "========"
|
||||||
puts "OCC25923"
|
puts "0025923: Remove small wires on face read from STEP"
|
||||||
puts "========"
|
puts "========"
|
||||||
puts ""
|
puts ""
|
||||||
#############################################
|
|
||||||
# Remove small wires on face read from STEP
|
|
||||||
#############################################
|
|
||||||
|
|
||||||
smallview
|
|
||||||
restore [locate_data_file OCC25923_FixSmallWire_Orientation.brep] a
|
restore [locate_data_file OCC25923_FixSmallWire_Orientation.brep] a
|
||||||
fit
|
|
||||||
|
|
||||||
checkshape a
|
checkshape a
|
||||||
|
|
||||||
fixshape r1 a +s +o 1e-3
|
fixshape r a +s +o 1e-3
|
||||||
|
|
||||||
fixshape r2 r1 +o
|
checkshape r
|
||||||
|
checknbshapes r -face 1 -wire 2 -edge 32 -vertex 32
|
||||||
if {[regexp {This shape seems to be valid} [checkshape r1] ]} {
|
|
||||||
puts "ERRROR: OCC25923 is reproduced. Algorythm of removing small wires on face does not work."
|
|
||||||
}
|
|
||||||
|
|
||||||
if {![regexp {This shape seems to be valid} [checkshape r2] ]} {
|
|
||||||
puts "ERRROR: OCC25923 is reproduced. Algorythm of removing small wires on face does not work."
|
|
||||||
}
|
|
||||||
|
|
||||||
checkview -screenshot -2d -path ${imagedir}/${test_image}.png
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user