1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-05 18:16:23 +03:00

0030817: Modeling Algorithms - BRepOffsetAPI_MakePipeShell produces invalid result

BRepFill_TrimShellCorner::CheckAndOrientEdges() - When orienting next edge in a sequence take into account the Orientation of the previous edge.
Test cases for the issue.
This commit is contained in:
emv 2019-06-24 11:41:30 +03:00 committed by apn
parent 82c59511b4
commit b6c113d0eb
6 changed files with 111 additions and 20 deletions

View File

@ -1437,16 +1437,13 @@ Standard_Boolean CheckAndOrientEdges(const TopTools_ListOfShape& theOrderedList
gp_Pnt2d ap = aCurve->Value(f); gp_Pnt2d ap = aCurve->Value(f);
Standard_Boolean bFirstFound = Standard_False; Standard_Boolean bFirstFound = Standard_False;
Standard_Boolean bLastFound = Standard_False; Standard_Boolean bLastFound = Standard_False;
Standard_Boolean bforward = Standard_True;
if(ap.Distance(theFirstPoint) < aTolerance1) { if(ap.Distance(theFirstPoint) < aTolerance1) {
bforward = Standard_True;
if(theOrientedList.IsEmpty()) if(theOrientedList.IsEmpty())
theOrientedList.Append(aEPrev.Oriented(TopAbs_FORWARD)); theOrientedList.Append(aEPrev.Oriented(TopAbs_FORWARD));
bFirstFound = Standard_True; bFirstFound = Standard_True;
} }
else if(ap.Distance(theLastPoint) < aTolerance1) { else if(ap.Distance(theLastPoint) < aTolerance1) {
bforward = Standard_False;
if(theOrientedList.IsEmpty()) if(theOrientedList.IsEmpty())
theOrientedList.Append(aEPrev.Oriented(TopAbs_REVERSED)); theOrientedList.Append(aEPrev.Oriented(TopAbs_REVERSED));
bLastFound = Standard_True; bLastFound = Standard_True;
@ -1454,36 +1451,31 @@ Standard_Boolean CheckAndOrientEdges(const TopTools_ListOfShape& theOrderedList
ap = aCurve->Value(l); ap = aCurve->Value(l);
if(ap.Distance(theLastPoint) < aTolerance2) { if(ap.Distance(theLastPoint) < aTolerance2) {
bforward = Standard_True;
if(theOrientedList.IsEmpty()) if(theOrientedList.IsEmpty())
theOrientedList.Append(aEPrev.Oriented(TopAbs_FORWARD)); theOrientedList.Append(aEPrev.Oriented(TopAbs_FORWARD));
bLastFound = Standard_True; bLastFound = Standard_True;
} }
else if(ap.Distance(theFirstPoint) < aTolerance2) { else if(ap.Distance(theFirstPoint) < aTolerance2) {
bforward = Standard_False;
if(theOrientedList.IsEmpty()) if(theOrientedList.IsEmpty())
theOrientedList.Append(aEPrev.Oriented(TopAbs_REVERSED)); theOrientedList.Append(aEPrev.Oriented(TopAbs_REVERSED));
bFirstFound = Standard_True; bFirstFound = Standard_True;
} }
if (!theOrientedList.IsEmpty())
aEPrev = TopoDS::Edge (theOrientedList.Last());
for(; anIt.More(); anIt.Next()) { for(; anIt.More(); anIt.Next()) {
const TopoDS_Edge& aE = TopoDS::Edge(anIt.Value()); const TopoDS_Edge& aE = TopoDS::Edge(anIt.Value());
TopoDS_Vertex aV11, aV12; TopoDS_Vertex aV11, aV12;
TopExp::Vertices(aEPrev, aV11, aV12); TopExp::Vertices(aEPrev, aV11, aV12, Standard_True);
TopoDS_Vertex aV21, aV22; TopoDS_Vertex aV21, aV22;
TopExp::Vertices(aE, aV21, aV22); TopExp::Vertices(aE, aV21, aV22, Standard_False);
TopAbs_Orientation anOri = TopAbs_FORWARD;
if(aV12.IsSame(aV21) || aV11.IsSame(aV22)) { TopAbs_Orientation anOri =
anOri = (bforward) ? TopAbs_FORWARD : TopAbs_REVERSED; (aV12.IsSame (aV21) || aV11.IsSame (aV22)) ? TopAbs_FORWARD : TopAbs_REVERSED;
}
else {
anOri = (bforward) ? TopAbs_REVERSED : TopAbs_FORWARD;
}
theOrientedList.Append(aE.Oriented(anOri)); theOrientedList.Append(aE.Oriented(anOri));
aEPrev = aE; aEPrev = TopoDS::Edge (theOrientedList.Last());
aTolerance1 = (aV21.IsNull()) ? Precision::Confusion() : BRep_Tool::Tolerance(aV21); aTolerance1 = (aV21.IsNull()) ? Precision::Confusion() : BRep_Tool::Tolerance(aV21);
aTolerance2 = (aV22.IsNull()) ? Precision::Confusion() : BRep_Tool::Tolerance(aV22); aTolerance2 = (aV22.IsNull()) ? Precision::Confusion() : BRep_Tool::Tolerance(aV22);
utol = aBAS.UResolution(aTolerance1); utol = aBAS.UResolution(aTolerance1);
@ -1511,9 +1503,7 @@ Standard_Boolean CheckAndOrientEdges(const TopTools_ListOfShape& theOrderedList
} }
} }
if(!bFirstFound || !bLastFound) return bFirstFound && bLastFound;
return Standard_False;
return Standard_True;
} }
// ---------------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------------

View File

@ -0,0 +1,19 @@
puts "========"
puts "0030794: BRepOffsetAPI_MakePipeShell: shape is produced with artifacts"
puts "========"
puts ""
restore [locate_data_file bug30794_shapes1.brep] c
explode c
unifysamedom spine c_1
mksweep spine
addsweep c_2
buildsweep result -C -S
checkshape result
checkprops result -s 1.24302e+06 -v 5.64101e+06
checknbshapes result -wire 14 -face 14 -shell 1 -solid 1 -t
checkview -display result -2d -path ${imagedir}/${test_image}.png

View File

@ -0,0 +1,23 @@
puts "TODO OCC30794 ALL: Faulty shapes in variables"
puts "TODO OCC30794 ALL: Error : The area of result shape is"
puts "TODO OCC30794 ALL: Error : The volume of result shape is"
puts "TODO OCC30794 ALL: Error : is WRONG because number of"
puts "========"
puts "0030794: BRepOffsetAPI_MakePipeShell: shape is produced with artifacts"
puts "========"
puts ""
restore [locate_data_file bug30794_shapes1.brep] c
explode c
mksweep c_1
addsweep c_2
buildsweep result -C -S
checkshape result
checkprops result -s 1.24302e+06 -v 5.64101e+06
checknbshapes result -wire 14 -face 14 -shell 1 -solid 1 -t
checkview -display result -2d -path ${imagedir}/${test_image}.png

View File

@ -0,0 +1,19 @@
puts "========"
puts "0030794: BRepOffsetAPI_MakePipeShell: shape is produced with artifacts"
puts "========"
puts ""
restore [locate_data_file bug30794_shapes2.brep] c
explode c
unifysamedom spine c_1
mksweep spine
addsweep c_2
buildsweep result -C -S
checkshape result
checkprops result -s 883273 -v 1.09918e+07
checknbshapes result -wire 6 -face 6 -shell 1 -solid 1 -t
checkview -display result -2d -path ${imagedir}/${test_image}.png

View File

@ -0,0 +1,22 @@
puts "TODO OCC30794 ALL: Faulty shapes in variables"
puts "TODO OCC30794 ALL: Error : The volume of result shape is"
puts "TODO OCC30794 ALL: Error : is WRONG because number of"
puts "========"
puts "0030794: BRepOffsetAPI_MakePipeShell: shape is produced with artifacts"
puts "========"
puts ""
restore [locate_data_file bug30794_shapes2.brep] c
explode c
mksweep c_1
addsweep c_2
buildsweep result -C -S
checkshape result
checkprops result -s 883273 -v 1.09918e+07
checknbshapes result -wire 6 -face 6 -shell 1 -solid 1 -t
checkview -display result -2d -path ${imagedir}/${test_image}.png

View File

@ -0,0 +1,18 @@
puts "========"
puts "0030817: Modeling Algorithms - BRepOffsetAPI_MakePipeShell produces invalid result"
puts "========"
puts ""
binrestore [locate_data_file bug30794_shapes.bin] c
explode c
mksweep c_1
addsweep c_2
buildsweep result -C -S
checkshape result
checkprops result -s 1.44508e+06 -v 1.78664e+07
checknbshapes result -wire 7 -face 7 -shell 1 -solid 1 -t
checkview -display result -2d -path ${imagedir}/${test_image}.png