mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-26 10:19:45 +03:00
0024586: Pipe construction is failed
Test case for issue CR24586
This commit is contained in:
parent
af203d549a
commit
f52d1b53c4
@ -53,6 +53,7 @@
|
|||||||
#include <Geom_OffsetCurve.hxx>
|
#include <Geom_OffsetCurve.hxx>
|
||||||
#include <Geom_BSplineCurve.hxx>
|
#include <Geom_BSplineCurve.hxx>
|
||||||
#include <BRepBuilderAPI_Transform.hxx>
|
#include <BRepBuilderAPI_Transform.hxx>
|
||||||
|
#include <BRepBuilderAPI_Copy.hxx>
|
||||||
#include <TopTools_SequenceOfShape.hxx>
|
#include <TopTools_SequenceOfShape.hxx>
|
||||||
#include <BRepLib.hxx>
|
#include <BRepLib.hxx>
|
||||||
|
|
||||||
@ -60,11 +61,42 @@
|
|||||||
#include <GeomAdaptor_HSurface.hxx>
|
#include <GeomAdaptor_HSurface.hxx>
|
||||||
#include <Adaptor3d_CurveOnSurface.hxx>
|
#include <Adaptor3d_CurveOnSurface.hxx>
|
||||||
|
|
||||||
|
#include <ShapeUpgrade_RemoveLocations.hxx>
|
||||||
|
|
||||||
#ifdef DRAW
|
#ifdef DRAW
|
||||||
#include <DBRep.hxx>
|
#include <DBRep.hxx>
|
||||||
static Standard_Boolean Affich = 0;
|
static Standard_Boolean Affich = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void ReverseModifiedEdges(TopoDS_Shape& aShape,
|
||||||
|
TopTools_MapOfShape& Emap)
|
||||||
|
{
|
||||||
|
TopExp_Explorer Explo(aShape, TopAbs_FACE);
|
||||||
|
BRep_Builder BB;
|
||||||
|
for (; Explo.More(); Explo.Next())
|
||||||
|
{
|
||||||
|
TopoDS_Shape aFace = Explo.Current();
|
||||||
|
TopoDS_Iterator itf(aFace);
|
||||||
|
for (; itf.More(); itf.Next())
|
||||||
|
{
|
||||||
|
TopoDS_Shape aWire = itf.Value();
|
||||||
|
TopTools_SequenceOfShape ModEdges;
|
||||||
|
TopoDS_Iterator itw(aWire);
|
||||||
|
for (; itw.More(); itw.Next())
|
||||||
|
{
|
||||||
|
TopoDS_Shape anEdge = itw.Value();
|
||||||
|
if (Emap.Contains(anEdge))
|
||||||
|
ModEdges.Append(anEdge);
|
||||||
|
}
|
||||||
|
aWire.Free(Standard_True);
|
||||||
|
for (Standard_Integer ii = 1; ii <= ModEdges.Length(); ii++)
|
||||||
|
{
|
||||||
|
BB.Remove(aWire, ModEdges(ii));
|
||||||
|
BB.Add(aWire, ModEdges(ii).Reversed());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void UpdateTolFromTopOrBottomPCurve(const TopoDS_Face& aFace,
|
static void UpdateTolFromTopOrBottomPCurve(const TopoDS_Face& aFace,
|
||||||
TopoDS_Edge& anEdge)
|
TopoDS_Edge& anEdge)
|
||||||
@ -237,6 +269,18 @@ void BRepFill_Pipe::Perform(const TopoDS_Wire& Spine,
|
|||||||
myFirst = BRepBuilderAPI_Transform(myProfile, fila, Standard_True); //copy
|
myFirst = BRepBuilderAPI_Transform(myProfile, fila, Standard_True); //copy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ShapeUpgrade_RemoveLocations RemLoc;
|
||||||
|
RemLoc.Remove(myFirst);
|
||||||
|
myFirst = RemLoc.GetResult();
|
||||||
|
TopLoc_Location theLoc = myFirst.Location();
|
||||||
|
if (!theLoc.IsIdentity())
|
||||||
|
{
|
||||||
|
TopoDS_Shape NewMyFirst = BRepBuilderAPI_Copy(myFirst);
|
||||||
|
TopLoc_Location theIdentity;
|
||||||
|
NewMyFirst.Location(theIdentity);
|
||||||
|
myFirst = BRepBuilderAPI_Transform(NewMyFirst, theLoc.Transformation());
|
||||||
|
}
|
||||||
|
|
||||||
myLoc->Law(myLoc->NbLaw())->GetDomain(first, last);
|
myLoc->Law(myLoc->NbLaw())->GetDomain(first, last);
|
||||||
myLoc->Law(myLoc->NbLaw())->D0(last,M, V);
|
myLoc->Law(myLoc->NbLaw())->D0(last,M, V);
|
||||||
// try { // Not good, but there are no other means to test SetValues
|
// try { // Not good, but there are no other means to test SetValues
|
||||||
@ -256,6 +300,18 @@ void BRepFill_Pipe::Perform(const TopoDS_Wire& Spine,
|
|||||||
else {
|
else {
|
||||||
myLast = myFirst;
|
myLast = myFirst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RemLoc.Remove(myLast);
|
||||||
|
myLast = RemLoc.GetResult();
|
||||||
|
theLoc = myLast.Location();
|
||||||
|
if (!theLoc.IsIdentity())
|
||||||
|
{
|
||||||
|
TopoDS_Shape NewMyLast = BRepBuilderAPI_Copy(myLast);
|
||||||
|
TopLoc_Location theIdentity;
|
||||||
|
NewMyLast.Location(theIdentity);
|
||||||
|
myLast = BRepBuilderAPI_Transform(NewMyLast, theLoc.Transformation());
|
||||||
|
}
|
||||||
|
|
||||||
#if DRAW
|
#if DRAW
|
||||||
if (Affich) {
|
if (Affich) {
|
||||||
DBRep::Set("theprof", TheProf);
|
DBRep::Set("theprof", TheProf);
|
||||||
@ -595,6 +651,9 @@ TopoDS_Shape BRepFill_Pipe::MakeShape(const TopoDS_Shape& S,
|
|||||||
MkSw.Build( myReversedEdges, myTapes,
|
MkSw.Build( myReversedEdges, myTapes,
|
||||||
BRepFill_Modified, myContinuity, GeomFill_Location, myDegmax, mySegmax );
|
BRepFill_Modified, myContinuity, GeomFill_Location, myDegmax, mySegmax );
|
||||||
result = MkSw.Shape();
|
result = MkSw.Shape();
|
||||||
|
//Correct <myFirst> and <myLast>
|
||||||
|
ReverseModifiedEdges(myFirst, myReversedEdges);
|
||||||
|
ReverseModifiedEdges(myLast, myReversedEdges);
|
||||||
|
|
||||||
// Labeling of elements
|
// Labeling of elements
|
||||||
if (mySections.IsNull()) {
|
if (mySections.IsNull()) {
|
||||||
|
@ -2066,26 +2066,6 @@ BRepFill_Sweep::BRepFill_Sweep(const Handle(BRepFill_SectionLaw)& Section,
|
|||||||
Standard_Boolean exuv, singu, singv;
|
Standard_Boolean exuv, singu, singv;
|
||||||
Handle(Geom_Surface) S;
|
Handle(Geom_Surface) S;
|
||||||
|
|
||||||
// Preprocessing: correct <FirstShape> if the profile is shell
|
|
||||||
if (!ReversedEdges.IsEmpty())
|
|
||||||
{
|
|
||||||
TopTools_SequenceOfShape EdgesToReverse;
|
|
||||||
TopoDS_Iterator itw(FirstShape);
|
|
||||||
for (; itw.More(); itw.Next())
|
|
||||||
{
|
|
||||||
const TopoDS_Shape& anEdge = itw.Value();
|
|
||||||
if (ReversedEdges.Contains(anEdge))
|
|
||||||
EdgesToReverse.Append(anEdge);
|
|
||||||
}
|
|
||||||
FirstShape.Free(Standard_True);
|
|
||||||
for (Standard_Integer i = 1; i <= EdgesToReverse.Length(); i++)
|
|
||||||
{
|
|
||||||
B.Remove(FirstShape, EdgesToReverse(i));
|
|
||||||
EdgesToReverse(i).Reverse();
|
|
||||||
B.Add(FirstShape, EdgesToReverse(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// (2.0) return preexisting Edges and vertices
|
// (2.0) return preexisting Edges and vertices
|
||||||
TopoDS_Edge E;
|
TopoDS_Edge E;
|
||||||
TColStd_Array1OfBoolean IsBuilt(1, NbLaw);
|
TColStd_Array1OfBoolean IsBuilt(1, NbLaw);
|
||||||
@ -2296,6 +2276,7 @@ BRepFill_Sweep::BRepFill_Sweep(const Handle(BRepFill_SectionLaw)& Section,
|
|||||||
|
|
||||||
|
|
||||||
// ---------- Creation of Vertex and edge ------------
|
// ---------- Creation of Vertex and edge ------------
|
||||||
|
ReversedEdges.Clear();
|
||||||
for (ipath=1, IPath=IFirst; ipath<=NbPath;
|
for (ipath=1, IPath=IFirst; ipath<=NbPath;
|
||||||
ipath++, IPath++) {
|
ipath++, IPath++) {
|
||||||
for (isec=1; isec <=NbLaw; isec++) {
|
for (isec=1; isec <=NbLaw; isec++) {
|
||||||
|
24
tests/bugs/modalg_5/bug24586
Executable file
24
tests/bugs/modalg_5/bug24586
Executable file
@ -0,0 +1,24 @@
|
|||||||
|
puts "============"
|
||||||
|
puts "OCC24586"
|
||||||
|
puts "============"
|
||||||
|
puts ""
|
||||||
|
#######################################################################
|
||||||
|
# Pipe construction is failed
|
||||||
|
#######################################################################
|
||||||
|
|
||||||
|
restore [locate_data_file bug24586_base.brep] base
|
||||||
|
restore [locate_data_file bug24586_path.brep] path
|
||||||
|
|
||||||
|
pipe result path base
|
||||||
|
|
||||||
|
set nb_v_good 164
|
||||||
|
set nb_e_good 379
|
||||||
|
set nb_w_good 240
|
||||||
|
set nb_f_good 240
|
||||||
|
set nb_sh_good 24
|
||||||
|
set nb_sol_good 24
|
||||||
|
set nb_compsol_good 0
|
||||||
|
set nb_compound_good 1
|
||||||
|
set nb_shape_good 1072
|
||||||
|
|
||||||
|
set 2dviewer 1
|
Loading…
x
Reference in New Issue
Block a user