mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-10 18:51:21 +03:00
0031926: Shape Healing - ShapeAnalysis::OuterWire() considers next iteration element always to be a wire causing skipping of primal one
ShapeAnalysis::OuterWire(): fixed missed logic when TopoDS_Iterator notifies about more objects to iterate, but there are only vertices and no additional wires at all.
This commit is contained in:
parent
3b5a94a165
commit
59223e118d
@ -229,36 +229,31 @@ Standard_Boolean ShapeAnalysis::IsOuterBound(const TopoDS_Face& face)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : OuterBound
|
//function : OuterWire
|
||||||
//purpose : replacement of bad BRepTools::OuterBound(), to be merged
|
//purpose : Returns positively oriented wire in the face.
|
||||||
// - skips internal vertices in face, if any, without exception
|
// If there is no one - returns the last wire of the face.
|
||||||
// - returns positively oriented wire rather than greater one
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
|
||||||
TopoDS_Wire ShapeAnalysis::OuterWire(const TopoDS_Face& face)
|
TopoDS_Wire ShapeAnalysis::OuterWire(const TopoDS_Face& theFace)
|
||||||
{
|
{
|
||||||
TopoDS_Face F = face;
|
TopoDS_Face aF = theFace;
|
||||||
F.Orientation(TopAbs_FORWARD);
|
aF.Orientation (TopAbs_FORWARD);
|
||||||
|
|
||||||
BRep_Builder B;
|
TopExp_Explorer anIt (aF, TopAbs_WIRE);
|
||||||
TopoDS_Iterator anIt (F, Standard_False);
|
|
||||||
while (anIt.More())
|
while (anIt.More())
|
||||||
{
|
{
|
||||||
TopoDS_Shape aWire = anIt.Value();
|
TopoDS_Wire aWire = TopoDS::Wire (anIt.Value());
|
||||||
anIt.Next();
|
anIt.Next();
|
||||||
|
|
||||||
// skip possible internal vertices in face
|
|
||||||
if (aWire.ShapeType() != TopAbs_WIRE)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// if current wire is the last one, return it without analysis
|
// if current wire is the last one, return it without analysis
|
||||||
if (! anIt.More())
|
if (!anIt.More())
|
||||||
return TopoDS::Wire (aWire);
|
return aWire;
|
||||||
|
|
||||||
TopoDS_Shape aTestFace = F.EmptyCopied();
|
// Check if the wire has positive area
|
||||||
B.Add (aTestFace, aWire);
|
Handle(ShapeExtend_WireData) aSEWD = new ShapeExtend_WireData (aWire);
|
||||||
if (ShapeAnalysis::IsOuterBound (TopoDS::Face (aTestFace)))
|
Standard_Real anArea2d = ShapeAnalysis::TotCross2D (aSEWD, aF);
|
||||||
return TopoDS::Wire (aWire);
|
if (anArea2d >= 0.)
|
||||||
|
return aWire;
|
||||||
}
|
}
|
||||||
return TopoDS_Wire();
|
return TopoDS_Wire();
|
||||||
}
|
}
|
||||||
|
@ -51,12 +51,9 @@ public:
|
|||||||
DEFINE_STANDARD_ALLOC
|
DEFINE_STANDARD_ALLOC
|
||||||
|
|
||||||
|
|
||||||
//! Returns the outer wire on the face <Face>.
|
//! Returns positively oriented wire in the face.
|
||||||
//! This is replacement of the method BRepTools::OuterWire
|
//! If there is no such wire - returns the last wire of the face.
|
||||||
//! until it works badly.
|
Standard_EXPORT static TopoDS_Wire OuterWire (const TopoDS_Face& theFace);
|
||||||
//! Returns the first wire oriented as outer according to
|
|
||||||
//! FClass2d_Classifier. If none, last wire is returned.
|
|
||||||
Standard_EXPORT static TopoDS_Wire OuterWire (const TopoDS_Face& face);
|
|
||||||
|
|
||||||
//! Returns a total area of 2d wire
|
//! Returns a total area of 2d wire
|
||||||
Standard_EXPORT static Standard_Real TotCross2D (const Handle(ShapeExtend_WireData)& sewd, const TopoDS_Face& aFace);
|
Standard_EXPORT static Standard_Real TotCross2D (const Handle(ShapeExtend_WireData)& sewd, const TopoDS_Face& aFace);
|
||||||
|
@ -2,7 +2,6 @@ puts "======="
|
|||||||
puts "0031144: Shape Healing - ShapeAnalysis::OuterWire() infinite loop on solid obtained from IFC"
|
puts "0031144: Shape Healing - ShapeAnalysis::OuterWire() infinite loop on solid obtained from IFC"
|
||||||
puts "======="
|
puts "======="
|
||||||
puts ""
|
puts ""
|
||||||
puts "REQUIRED ALL: Meshing statuses: Failure"
|
|
||||||
|
|
||||||
cpulimit 10
|
cpulimit 10
|
||||||
|
|
||||||
|
39
tests/bugs/mesh/bug31926
Normal file
39
tests/bugs/mesh/bug31926
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
puts "========"
|
||||||
|
puts "0031926: Shape Healing - ShapeAnalysis::OuterWire() considers next iteration element always to be a wire causing skipping of primal one"
|
||||||
|
puts "========"
|
||||||
|
puts ""
|
||||||
|
|
||||||
|
vertex v11 0 1 0; vertex v12 1 0 0; vertex v13 0 0 0
|
||||||
|
edge e11 v11 v12; edge e12 v12 v13; edge e13 v13 v11
|
||||||
|
wire w1 e11 e12 e13
|
||||||
|
mkplane f1 w1
|
||||||
|
|
||||||
|
vertex v21 0 0 2; vertex v22 1 0 0; vertex v23 0 0 0
|
||||||
|
edge e21 v21 v22; edge e22 v22 v23; edge e23 v23 v21
|
||||||
|
wire w2 e21 e22 e23
|
||||||
|
mkplane f2 w2
|
||||||
|
|
||||||
|
vertex v31 0 0 2; vertex v32 0 1 0; vertex v33 1 0 0
|
||||||
|
edge e31 v31 v32; edge e32 v32 v33; edge e33 v33 v31
|
||||||
|
wire w3 e31 e32 e33
|
||||||
|
mkplane f3 w3
|
||||||
|
|
||||||
|
vertex v41 0 0 2; vertex v42 0 0 0; vertex v43 0 1 0
|
||||||
|
edge e41 v41 v42; edge e42 v42 v43; edge e43 v43 v41
|
||||||
|
wire w4 e41 e42 e43
|
||||||
|
mkplane f4 w4
|
||||||
|
|
||||||
|
psphere s1 1
|
||||||
|
sewing sh2 f1 f2 f3 f4
|
||||||
|
ssolid sh2 s2
|
||||||
|
bcut result s1 s2
|
||||||
|
incmesh result 1
|
||||||
|
|
||||||
|
checkview -display result -3d -path ${imagedir}/${test_image}.png
|
||||||
|
|
||||||
|
set log [tricheck result]
|
||||||
|
if { [llength $log] != 0 } {
|
||||||
|
puts "Error : Invalid mesh"
|
||||||
|
} else {
|
||||||
|
puts "Mesh is OK"
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user