From: jgv Date: Thu, 8 Jun 2017 14:44:45 +0000 (+0300) Subject: 0026907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of... X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=2375a405e53b1a6464a3df129c82edc929d0bc4e;p=occt-copy.git 0026907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges --- diff --git a/src/BRepBlend/BRepBlend_BlendTool.cxx b/src/BRepBlend/BRepBlend_BlendTool.cxx index 34b38fb212..e97b910032 100644 --- a/src/BRepBlend/BRepBlend_BlendTool.cxx +++ b/src/BRepBlend/BRepBlend_BlendTool.cxx @@ -18,7 +18,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -134,3 +136,16 @@ void BRepBlend_BlendTool::Bounds(const Handle(Adaptor2d_HCurve2d)& A, Ufirst = BRepBlend_HCurve2dTool::FirstParameter(A); Ulast = BRepBlend_HCurve2dTool::LastParameter(A); } + +//======================================================================= +//function : IsSeam +//purpose : +//======================================================================= +Standard_Boolean BRepBlend_BlendTool::IsSeam(const Handle(Adaptor2d_HCurve2d)& C) +{ + Handle(BRepAdaptor_HCurve2d) brhc = + Handle(BRepAdaptor_HCurve2d)::DownCast(C); + + return BRepTools::IsReallyClosed(((BRepAdaptor_Curve2d *)&(brhc->Curve2d()))->Edge(), + ((BRepAdaptor_Curve2d *)&(brhc->Curve2d()))->Face()); +} diff --git a/src/BRepBlend/BRepBlend_BlendTool.hxx b/src/BRepBlend/BRepBlend_BlendTool.hxx index 8ef6dee328..a34342dbdc 100644 --- a/src/BRepBlend/BRepBlend_BlendTool.hxx +++ b/src/BRepBlend/BRepBlend_BlendTool.hxx @@ -76,6 +76,10 @@ public: //! or a bounding box for an infinite arc. Standard_EXPORT static void Bounds (const Handle(Adaptor2d_HCurve2d)& C, Standard_Real& Ufirst, Standard_Real& Ulast); + //! Returns the status of edge: + //! is it a seam edge or not + Standard_EXPORT static Standard_Boolean IsSeam (const Handle(Adaptor2d_HCurve2d)& C); + static Handle(Adaptor2d_HCurve2d) CurveOnSurf (const Handle(Adaptor2d_HCurve2d)& C, const Handle(Adaptor3d_HSurface)& S); diff --git a/src/Blend/Blend_Walking_3.gxx b/src/Blend/Blend_Walking_3.gxx index 1a0586c82d..1561d5bc59 100644 --- a/src/Blend/Blend_Walking_3.gxx +++ b/src/Blend/Blend_Walking_3.gxx @@ -41,7 +41,15 @@ Standard_Integer Blend_Walking::ArcToRecadre(const Standard_Boolean OnFirst, lastpt2d.SetCoord(uprev,vprev); Iter->Init(); while (Iter->More()) { + nbarc++; ok = 0; + + if (TheBlendTool::IsSeam(Iter->Value())) + { + Iter->Next(); + continue; + } + if (OnFirst) { if(byinter) { ok = okinter = TheBlendTool::Inters(pt2d,lastpt2d, diff --git a/src/Blend/Blend_Walking_4.gxx b/src/Blend/Blend_Walking_4.gxx index 85a766a4a5..d9c8ba92e7 100644 --- a/src/Blend/Blend_Walking_4.gxx +++ b/src/Blend/Blend_Walking_4.gxx @@ -200,10 +200,10 @@ void Blend_Walking::InternalPerform(Blend_Function& Func, rsnld.Root(sol); if(clasonS1) situ1 = domain1->Classify(gp_Pnt2d(sol(1),sol(2)), - Min(tolerance(1),tolerance(2)),0); + Min(tolerance(1),tolerance(2)),Standard_True/*0*/); else situ1 = TopAbs_IN; if(clasonS2) situ2 = domain2->Classify(gp_Pnt2d(sol(3),sol(4)), - Min(tolerance(3),tolerance(4)),0); + Min(tolerance(3),tolerance(4)),Standard_True/*0*/); else situ2 = TopAbs_IN; } if(bonpoint && line->NbPoints() == 1 && (situ1 != TopAbs_IN || situ2 != TopAbs_IN)){ diff --git a/src/ChFi3d/ChFi3d_Builder.cxx b/src/ChFi3d/ChFi3d_Builder.cxx index 9514f7cc10..78de668471 100644 --- a/src/ChFi3d/ChFi3d_Builder.cxx +++ b/src/ChFi3d/ChFi3d_Builder.cxx @@ -45,6 +45,8 @@ #include #include #include +#include +#include #include #include #include @@ -68,6 +70,8 @@ #include #include #include +//#include +#include #include #include #include @@ -79,6 +83,9 @@ #include #include #include +#include +#include +#include #ifdef OCCT_DEBUG #include @@ -107,6 +114,450 @@ extern Standard_Boolean ChFi3d_GettraceCHRON(); #endif +//======================================================================= +//function : NearestWholePeriod +//purpose : +//======================================================================= + +Standard_Real NearestWholePeriod(const Standard_Real theValue, + const Standard_Real thePeriod, + const Standard_Boolean theFromBelow) +{ + Standard_Real Result = 0.; + Standard_Real Sign = (theValue < 0.)? -1 : 1; + + while (Abs(Result - theValue) > thePeriod) + Result += Sign * thePeriod; + + if (Result > theValue && theFromBelow) + Result -= thePeriod; + + return Result; +} + +//======================================================================= +//function : FindPeriod +//purpose : +//======================================================================= + +Standard_Real FindPeriod(const TopoDS_Face& theFace, + const Standard_Boolean theIsUdirection) +{ + Standard_Real aPeriod = 0.; + + BRepAdaptor_Surface BAsurf(theFace, Standard_False); + if (theIsUdirection) + { + if (BAsurf.IsUPeriodic()) + aPeriod = BAsurf.UPeriod(); + else + { + Standard_Real Umin = BAsurf.FirstUParameter(), + Umax = BAsurf.LastUParameter(); + aPeriod = Umax - Umin; + } + } + else + { + //temporary + } + + return aPeriod; +} + +//======================================================================= +//function : ContainsEdge +//purpose : +//======================================================================= + +Standard_Boolean ContainsEdge(const TopoDS_Shape& theShape, + const TopoDS_Shape& theEdge) +{ + TopExp_Explorer Explo(theShape, TopAbs_EDGE); + for (; Explo.More(); Explo.Next()) + { + const TopoDS_Shape& anEdge = Explo.Current(); + if (anEdge.IsSame(theEdge)) + return Standard_True; + } + + return Standard_False; +} + +//======================================================================= +//function : FindProperSubShape +//purpose : +//======================================================================= + +TopoDS_Shape FindProperSubShape(const TopoDS_Shape& theNewFace, + const TopoDS_Shape& theShape) +{ + TopoDS_Shape NullShape; + + TopTools_IndexedMapOfShape Emap; + TopExp::MapShapes(theNewFace, TopAbs_EDGE, Emap); + + TopoDS_Iterator iter(theShape); + for (; iter.More(); iter.Next()) + { + const TopoDS_Shape& aShape = iter.Value(); + if (aShape.ShapeType() == TopAbs_FACE) + { + TopExp_Explorer Explo(aShape, TopAbs_EDGE); + for (; Explo.More(); Explo.Next()) + { + const TopoDS_Shape& anEdge = Explo.Current(); + if (Emap.Contains(anEdge)) + return theShape; + } + } + else + { + TopoDS_Shape aResult = FindProperSubShape(theNewFace, aShape); + if (!aResult.IsNull()) + return aResult; + } + } + + return NullShape; +} + +//======================================================================= +//function : DeleteEdgesFromMap +//purpose : +//======================================================================= + +void DeleteEdgesFromMap(TopTools_IndexedDataMapOfShapeListOfShape& theVEmap, + const TopTools_SequenceOfShape& theEdges, + //const TopoDS_Edge& theCurEdge, + const TopoDS_Edge& theNextEdge, + const TopoDS_Vertex& theVertex, + const Standard_Integer theIndOr) +{ + for (Standard_Integer i = 1; i <= theEdges.Length(); i++) + { + const TopoDS_Edge& anEdge = TopoDS::Edge(theEdges(i)); + if (anEdge == theNextEdge) + continue; + TopoDS_Vertex VV [2]; + TopExp::Vertices(anEdge, VV[0], VV[1], Standard_True); + if (VV[theIndOr].IsSame(theVertex)) + { + //theDeletedEdges.Append(anEdge); + for (Standard_Integer j = 1; j <= theVEmap.Extent(); j++) + { + TopoDS_Vertex aVertex = TopoDS::Vertex(theVEmap.FindKey(j)); + TopTools_ListIteratorOfListOfShape itl(theVEmap(j)); + for (; itl.More(); itl.Next()) + { + if (anEdge == itl.Value()) + { + theVEmap(j).Remove(itl); + break; + } + } + } + } + } +} + +//======================================================================= +//function : BuildNewWire +//purpose : +//======================================================================= + +TopoDS_Wire BuildNewWire(const TopoDS_Wire& theWire, + TopTools_IndexedDataMapOfShapeListOfShape& theVEmap, + //const TopoDS_Compound& theNewEdges, + const TopTools_IndexedMapOfShape& theNewEdges, + const TopoDS_Face& theFace) +{ + //Temporary + BRep_Builder BB; + TopoDS_Compound aNE; + BB.MakeCompound(aNE); + for (Standard_Integer ind = 1; ind <= theNewEdges.Extent(); ind++) + { + const TopoDS_Shape& aNewEdge = theNewEdges(ind); + BB.Add(aNE, aNewEdge); + } + /////////// + + Standard_Boolean Uclosed, Vclosed; + Standard_Real Uperiod = 0., Vperiod = 0.; + BRepTools::DetectClosedness(theFace, Uclosed, Vclosed); + if (Uclosed) + Uperiod = FindPeriod(theFace, Standard_True); + if (Vclosed) + Vperiod = FindPeriod(theFace, Standard_False); + + TopTools_IndexedMapOfShape OldVertices; + TopExp::MapShapes(theWire, TopAbs_VERTEX, OldVertices); + //TopExp::MapShapes(theNewEdges, TopAbs_EDGE, NewEdges); + + //Find , and calculate minimum distance + //between extremities of edge in 2d + TopoDS_Vertex StartVertex; + TopoDS_Edge StartEdge, SecondEdge; + Standard_Real MinDist = RealLast(); + TopTools_ListIteratorOfListOfShape itl; + TopTools_MapOfOrientedShape Emap; + for (Standard_Integer i = 1; i <= OldVertices.Extent(); i++) + { + TopoDS_Vertex aVertex = TopoDS::Vertex(OldVertices(i)); + const TopTools_ListOfShape& Elist = theVEmap.FindFromKey(aVertex); + for (itl.Initialize(Elist); itl.More(); itl.Next()) + { + const TopoDS_Edge& anEdge = TopoDS::Edge(itl.Value()); + if (!Emap.Add(anEdge)) + continue; + if (StartEdge.IsNull() && + theNewEdges.Contains(anEdge)) + { + //StartEdge = anEdge; + Standard_Integer anIndex = theNewEdges.FindIndex(anEdge); + StartEdge = TopoDS::Edge(theNewEdges(anIndex)); + StartVertex = aVertex; + } + BRepAdaptor_Curve2d BAcurve(anEdge, theFace); + gp_Pnt2d aFirstPoint = BAcurve.Value(BAcurve.FirstParameter()); + gp_Pnt2d aLastPoint = BAcurve.Value(BAcurve.LastParameter()); + Standard_Real aDist = aFirstPoint.SquareDistance(aLastPoint); + if (aDist < MinDist) + MinDist = aDist; + } + } + + if (StartEdge.IsNull()) + return theWire; + + TopoDS_Wire NewWire; + //BRep_Builder BB; + BB.MakeWire(NewWire); + + BB.Add(NewWire, StartEdge); + + //Define the direction of loop: forward or reversed + TopAbs_Orientation Direction; + Standard_Integer IndOr; + //Here and further orientation of edge is taken into account + TopoDS_Vertex V1 = TopExp::FirstVertex(StartEdge, Standard_True); + if (V1.IsSame(StartVertex)) + { + Direction = TopAbs_FORWARD; + IndOr = 0; + } + else + { + Direction = TopAbs_REVERSED; + IndOr = 1; + } + + BRepAdaptor_Curve2d StartBAcurve(StartEdge, theFace); + Standard_Real StartParam = BRep_Tool::Parameter(StartVertex, StartEdge); + gp_Pnt2d StartPoint = StartBAcurve.Value(StartParam); + + //Find second edge; + TopTools_SequenceOfShape Candidates; //, DeletedEdges; + TopoDS_Vertex VV [2]; + + //Main loop + TopoDS_Edge CurEdge = StartEdge, NextEdge, PrevEdge; + TopoDS_Vertex CurVertex = (Direction == TopAbs_FORWARD)? + TopExp::LastVertex(CurEdge, Standard_True) : + TopExp::FirstVertex(CurEdge, Standard_True); + BRepAdaptor_Curve2d CurCurve(CurEdge, theFace); + Standard_Real CurParam = BRep_Tool::Parameter(CurVertex, CurEdge); + gp_Pnt2d CurPoint = CurCurve.Value(CurParam); + Standard_Boolean IsPrevSeamJustBuilt = Standard_False; + for (;;) + { + const TopTools_ListOfShape& Elist = theVEmap.FindFromKey(CurVertex); + Candidates.Clear(); + Standard_Boolean ToAdd = Standard_True; + //Standard_Boolean IsPrevEdgeCorrect = Standard_True; + + //Candidates are the edges close to in 2d + for (itl.Initialize(Elist); itl.More(); itl.Next()) + { + const TopoDS_Edge& anEdge = TopoDS::Edge(itl.Value()); + if (anEdge.IsSame(CurEdge)) + continue; + BRepAdaptor_Curve2d BAcurve(anEdge, theFace); + gp_Pnt2d aPoint = BAcurve.Value(BAcurve.FirstParameter()); + Standard_Real aDist = CurPoint.SquareDistance(aPoint); + if (aDist < MinDist) + Candidates.Append(anEdge); + else + { + aPoint = BAcurve.Value(BAcurve.LastParameter()); + aDist = CurPoint.SquareDistance(aPoint); + if (aDist < MinDist) + Candidates.Append(anEdge); + } + } + + TopoDS_Edge NextEdge, aCandidate; + if (Candidates.IsEmpty()) //hanging edge + { + //need to build additional edges + Standard_Real fpar, lpar; + if (BRep_Tool::Degenerated(CurEdge) && + !BRep_Tool::Degenerated(PrevEdge)) + { + //enlarge current degenerated edge + TopoDS_Vertex OtherVertex = CurVertex; + OtherVertex.Reverse(); + Standard_Real OtherParam = BRep_Tool::Parameter(OtherVertex, CurEdge); + gp_Pnt2d OtherPoint = CurCurve.Value(OtherParam); + + if (Uclosed) + { + Standard_Real DirOfCurEdge = CurPoint.X() - OtherPoint.X(); + Standard_Boolean FromBelow = (DirOfCurEdge < 0.); + Standard_Real NewX = NearestWholePeriod( CurPoint.X(), Uperiod, FromBelow ); + CurPoint.SetX(NewX); + } + Handle(Geom2d_Line) aLine; + if (CurEdge.Orientation() == TopAbs_FORWARD) + aLine = GCE2d_MakeLine(OtherPoint, CurPoint); + else + aLine = GCE2d_MakeLine(CurPoint, OtherPoint); + BB.UpdateEdge(CurEdge, aLine, theFace, 0.); + BB.Range(CurEdge, 0., CurPoint.Distance(OtherPoint)); + NextEdge = CurEdge; + IsPrevSeamJustBuilt = Standard_False; + ToAdd = Standard_False; + } + else if (IsPrevSeamJustBuilt) + { + //Find degenerated edge and enlarge it + for (itl.Initialize(Elist); itl.More(); itl.Next()) + { + TopoDS_Edge anEdge = TopoDS::Edge(itl.Value()); + if (anEdge.IsSame(CurEdge)) + continue; + if (BRep_Tool::Degenerated(anEdge)) + { + //enlarge found degenerated edge + TopoDS_Vertex OtherVertex = CurVertex; + if (anEdge.Orientation() == TopAbs_FORWARD) + OtherVertex.Reverse(); + Standard_Real OtherParam = BRep_Tool::Parameter(OtherVertex, anEdge); + BRepAdaptor_Curve2d aCurve(anEdge, theFace); + gp_Pnt2d OtherPoint = aCurve.Value(OtherParam); + + Handle(Geom2d_Line) aLine; + if (anEdge.Orientation() == TopAbs_FORWARD) + aLine = GCE2d_MakeLine(OtherPoint, CurPoint); + else + aLine = GCE2d_MakeLine(CurPoint, OtherPoint); + BB.UpdateEdge(anEdge, aLine, theFace, 0.); + BB.Range(anEdge, 0., CurPoint.Distance(OtherPoint)); + NextEdge = anEdge; + IsPrevSeamJustBuilt = Standard_False; + } + } + } + else + { + //build additional seam edge from existing edge + for (itl.Initialize(Elist); itl.More(); itl.Next()) + { + TopoDS_Edge anEdge = TopoDS::Edge(itl.Value()); + if (anEdge.IsSame(CurEdge)) + continue; + TopExp::Vertices(anEdge, VV[0], VV[1], Standard_True); + if (VV[1-IndOr].IsSame(CurVertex)) + { + if (!BRep_Tool::IsClosed(anEdge, theFace)) + { + Handle(Geom2d_Curve) aPCurve = BRep_Tool::CurveOnSurface(anEdge, theFace, fpar, lpar); + Standard_Real aParam = BRep_Tool::Parameter(CurVertex, anEdge); + gp_Pnt2d aPoint = aPCurve->Value(aParam); + gp_Vec2d Offset(0.,0.); + if (Uclosed) + Offset.SetX( CurPoint.X() - aPoint.X() ); + else + Offset.SetY( CurPoint.Y() - aPoint.Y() ); + Handle(Geom2d_Curve) aPCurve2 = Handle(Geom2d_Curve)::DownCast(aPCurve->Translated(Offset)); + BB.UpdateEdge(anEdge, aPCurve, aPCurve2, theFace, 0.); + } + NextEdge = TopoDS::Edge(anEdge.Reversed()); + IsPrevSeamJustBuilt = Standard_True; + break; + } + } + } + } + + for (Standard_Integer i = 1; i <= Candidates.Length(); i++) + { + IsPrevSeamJustBuilt = Standard_False; + const TopoDS_Edge& anEdge = TopoDS::Edge(Candidates(i)); + if (theNewEdges.Contains(anEdge)) + { + TopExp::Vertices(anEdge, VV[0], VV[1], Standard_True); + if (VV[IndOr].IsSame(CurVertex)) + { + BRepAdaptor_Curve2d BAcurve(anEdge, theFace); + Standard_Real aParam = BRep_Tool::Parameter(CurVertex, anEdge); + gp_Pnt2d aPoint = BAcurve.Value(aParam); + Standard_Real aDist = CurPoint.SquareDistance(aPoint); + if (aDist < MinDist) + { + NextEdge = anEdge; + break; + } + } + else //previous edge is incorrect + { + //error ? + + //remove previous edge from wire + //build additional edges + //NextEdge = anEdge; + } + } + else if (aCandidate.IsNull()) + { + TopExp::Vertices(anEdge, VV[0], VV[1], Standard_True); + if (VV[IndOr].IsSame(CurVertex)) + { + BRepAdaptor_Curve2d BAcurve(anEdge, theFace); + Standard_Real aParam = BRep_Tool::Parameter(VV[IndOr], anEdge); + gp_Pnt2d aPoint = BAcurve.Value(aParam); + Standard_Real aDist = CurPoint.SquareDistance(aPoint); + if (aDist < MinDist) + aCandidate = anEdge; + } + } + } + if (NextEdge.IsNull()) + NextEdge = aCandidate; + + DeleteEdgesFromMap(theVEmap, Candidates, NextEdge, CurVertex, 1-IndOr); + + PrevEdge = CurEdge; + CurEdge = NextEdge; + CurVertex = (Direction == TopAbs_FORWARD)? + TopExp::LastVertex(CurEdge, Standard_True) : + TopExp::FirstVertex(CurEdge, Standard_True); + CurCurve.Initialize(CurEdge, theFace); + CurParam = BRep_Tool::Parameter(CurVertex, CurEdge); + CurPoint = CurCurve.Value(CurParam); + + if (ToAdd) + BB.Add(NewWire, CurEdge); + + if (CurVertex.IsSame(StartVertex) && + CurPoint.SquareDistance(StartPoint) < MinDist) + break; + } + + return NewWire; +} + //======================================================================= //function : CompleteDS //purpose : @@ -372,7 +823,7 @@ void ChFi3d_Builder::Compute() if (done) { - BRep_Builder B1; + BRep_Builder BB; CompleteDS(DStr,myShape); //Update tolerances on vertex to max adjacent edges or //Update tolerances on degenerated edge to max of adjacent vertexes. @@ -398,7 +849,7 @@ void ChFi3d_Builder::Compute() if( tolc < tolv ) tolc = tolv + 0.00001; } if(degen && tolc < tolv) tolc = tolv; - else if(tolc>tolv) B1.UpdateVertex(v,tolc); + else if(tolc>tolv) BB.UpdateVertex(v,tolc); } else if(gk == TopOpeBRepDS_POINT){ TopOpeBRepDS_Point& p = DStr.ChangePoint(gi); @@ -409,7 +860,324 @@ void ChFi3d_Builder::Compute() } if(degen) c.Tolerance(tolc); } + + //jgv + + //for (on modified faces) + //compound of wires from each face + //compound of new edges for this face + //general fuse (compound of wires from a face, compound of new edges for this face) + //method building new face from old and new edges + //assembling of resulting shape from modified and unmodified faces. + + TopTools_ListOfShape aChFiFaces; + TopTools_IndexedDataMapOfShapeShape aFacesModifiedFaces; + + TopTools_IndexedMapOfShape MapNewEdges; + //TopTools_DataMapOfShapeListOfShape FaceListEdges; + NCollection_DataMap FaceMapEdges; + + BOPAlgo_Builder GenFuse; + + for (Standard_Integer i = 1; i <= myNewFaces.Extent(); i++) + { + TopoDS_Face aFace = TopoDS::Face(myNewFaces(i)); + //TopAbs_Orientation anOrOfFace = aFace.Orientation(); + aFace.Orientation(TopAbs_FORWARD); + + TopTools_IndexedMapOfShape* aEmap = FaceMapEdges.Bound(aFace, TopTools_IndexedMapOfShape()); + + //TopoDS_Compound aNewEdges; + //BB.MakeCompound(aNewEdges); + //TopTools_ListOfShape ListNewEdges; + + //ChFi3d_ListIteratorOfListOfQualifiedEdge itl(myFaceNewEdges.FindFromKey(i)); + TColStd_ListIteratorOfListOfInteger itl(myFaceNewEdges.FindFromKey(i)); + for (; itl.More(); itl.Next()) + { + Standard_Integer aSignedIndex = itl.Value(); + Standard_Integer anIndex = Abs(aSignedIndex); + TopoDS_Shape aNewEdge = myNewEdges(anIndex); + TopAbs_Orientation anOr = (aSignedIndex > 0)? + TopAbs_FORWARD : TopAbs_REVERSED; + aNewEdge.Orientation(anOr); + //BB.Add(aNewEdges, aNewEdge); + //ListNewEdges.Append(aNewEdge); + aEmap->Add(aNewEdge); + } + + if (myIndsChFiFaces.Contains(i)) //absolutely new face + { + } + else //a modified old face + { + GenFuse.AddArgument(aFace); + //TopTools_ListIteratorOfListOfShape itl(ListNewEdges); + //for (; itl.More(); itl.Next()) + //MapNewEdges.Add(itl.Value()); + for (Standard_Integer iedge = 1; iedge <= aEmap->Extent(); iedge++) + MapNewEdges.Add(aEmap->FindKey(iedge)); + } + } + + //Fusing + //GenFuse.AddArgument(aNewEdges); + for (Standard_Integer i = 1; i <= MapNewEdges.Extent(); i++) + GenFuse.AddArgument(MapNewEdges(i)); + GenFuse.Perform(); + //Temporary + const TopoDS_Shape& aResFuse = GenFuse.Shape(); + /////////// + const TopTools_DataMapOfShapeListOfShape& ModifiedShapes = GenFuse.Images(); + + for (Standard_Integer i = 1; i <= myNewFaces.Extent(); i++) + { + TopoDS_Face aFace = TopoDS::Face(myNewFaces(i)); + if (myIndsChFiFaces.Contains(i)) //absolutely new face + { + TopAbs_Orientation anOrOfFace = aFace.Orientation(); + aFace.Orientation(TopAbs_FORWARD); + + TopoDS_Wire aWire; + BB.MakeWire(aWire); + for (Standard_Integer iedge = 1; iedge <= FaceMapEdges(aFace).Extent(); iedge++) + { + const TopoDS_Shape& anEdge = FaceMapEdges(aFace).FindKey(iedge); + TopAbs_Orientation anOr = anEdge.Orientation(); + if (ModifiedShapes.IsBound(anEdge)) + { + const TopTools_ListOfShape& aListOfSplits = ModifiedShapes(anEdge); + TopTools_ListIteratorOfListOfShape itl(aListOfSplits); + for (; itl.More(); itl.Next()) + BB.Add(aWire, itl.Value().Oriented(anOr)); + } + else + BB.Add(aWire, anEdge); + } + BB.Add(aFace, aWire); + aFace.Orientation(anOrOfFace); + aChFiFaces.Append(aFace); + } + else //modify old face + { + //Build compound for construction of new face + const TopTools_ListOfShape& aListOfModifiedFromFace = ModifiedShapes(aFace); + TopoDS_Compound ResFuseForFace; + BB.MakeCompound(ResFuseForFace); + TopTools_ListIteratorOfListOfShape itl(aListOfModifiedFromFace); + for (; itl.More(); itl.Next()) + BB.Add(ResFuseForFace, itl.Value()); + + //Update FaceMapEdges(aFace) + TopTools_ListOfShape ToDelete, ToAdd; + for (Standard_Integer ind = 1; ind <= FaceMapEdges(aFace).Extent(); ind++) + { + const TopoDS_Shape& aNewEdgeOfFace = FaceMapEdges(aFace)(ind); + TopAbs_Orientation anOr = aNewEdgeOfFace.Orientation(); + if (ModifiedShapes.IsBound(aNewEdgeOfFace)) + { + const TopTools_ListOfShape& aListOfSplits = ModifiedShapes(aNewEdgeOfFace); + for (itl.Initialize(aListOfSplits); itl.More(); itl.Next()) + ToAdd.Append(itl.Value().Oriented(anOr)); + ToDelete.Append(aNewEdgeOfFace); + } + } + for (itl.Initialize(ToDelete); itl.More(); itl.Next()) + FaceMapEdges(aFace).RemoveKey(itl.Value()); + for (itl.Initialize(ToAdd); itl.More(); itl.Next()) + FaceMapEdges(aFace).Add(itl.Value()); + + //Build the map of splits for edges of old face + TopTools_MapOfShape Splits; + TopExp_Explorer Explo(aFace, TopAbs_EDGE); + for (; Explo.More(); Explo.Next()) + { + const TopoDS_Shape& anEdge = Explo.Current(); + if (ModifiedShapes.IsBound(anEdge)) + { + const TopTools_ListOfShape& aListOfSplits = ModifiedShapes(anEdge); + for (itl.Initialize(aListOfSplits); itl.More(); itl.Next()) + Splits.Add(itl.Value()); + } + } + + ToDelete.Clear(); + for (Standard_Integer ind = 1; ind <= FaceMapEdges(aFace).Extent(); ind++) + { + const TopoDS_Shape& aNewEdgeOfFace = FaceMapEdges(aFace)(ind); + if (Splits.Contains(aNewEdgeOfFace)) + { + ToDelete.Append(aNewEdgeOfFace); + continue; + } + TopAbs_Orientation anOr = aNewEdgeOfFace.Orientation(); + if (ModifiedShapes.IsBound(aNewEdgeOfFace)) + { + const TopTools_ListOfShape& aListOfModifiedFromEdge = ModifiedShapes(aNewEdgeOfFace); + for (itl.Initialize(aListOfModifiedFromEdge); itl.More(); itl.Next()) + { + const TopoDS_Shape& aModifiedNewEdgeOfFace = itl.Value(); + if (!ContainsEdge(ResFuseForFace, aModifiedNewEdgeOfFace)) + BB.Add(ResFuseForFace, aModifiedNewEdgeOfFace.Oriented(anOr)); + } + } + else + BB.Add(ResFuseForFace, aNewEdgeOfFace); + } + for (itl.Initialize(ToDelete); itl.More(); itl.Next()) + FaceMapEdges(aFace).RemoveKey(itl.Value()); + + TopTools_IndexedDataMapOfShapeListOfShape VEmapOfNewFace; + TopExp::MapShapesAndUniqueAncestors(ResFuseForFace, TopAbs_VERTEX, TopAbs_EDGE, + VEmapOfNewFace, Standard_True); //with orientation + + TopoDS_Shape aNewFace = aFace.EmptyCopied(); + TopoDS_Iterator itw(aFace); + for (; itw.More(); itw.Next()) + { + const TopoDS_Shape& aWire = itw.Value(); + TopTools_ListOfShape ListOfWires; + if (ModifiedShapes.IsBound(aWire)) + { + const TopTools_ListOfShape& aListOfModified = ModifiedShapes(aWire); + for (itl.Initialize(aListOfModified); itl.More(); itl.Next()) + ListOfWires.Append(itl.Value()); + } + else + ListOfWires.Append(aWire); + for (itl.Initialize(ListOfWires); itl.More(); itl.Next()) + { + const TopoDS_Wire& aModifiedWire = TopoDS::Wire(itl.Value()); + cout<<"a Modified Wire ..."<Perform(myDS); + //jgv// + TColStd_MapIteratorOfMapOfInteger It(MapIndSo); for(; It.More(); It.Next()){ Standard_Integer indsol = It.Key(); @@ -431,18 +1199,18 @@ void ChFi3d_Builder::Compute() for (; exv.More(); exv.Next() ) { const TopoDS_Vertex& v = TopoDS::Vertex(exv.Current()); Standard_Real tolv = BRep_Tool::Tolerance(v); - if (tole>tolv) B1.UpdateVertex(v,tole); + if (tole>tolv) BB.UpdateVertex(v,tole); } } } if (!hasresult) { - B1.MakeCompound(TopoDS::Compound(myShapeResult)); + BB.MakeCompound(TopoDS::Compound(myShapeResult)); for(It.Reset(); It.More(); It.Next()){ Standard_Integer indsol = It.Key(); const TopoDS_Shape& curshape = DStr.Shape(indsol); TopTools_ListIteratorOfListOfShape its = myCoup->Merged(curshape,TopAbs_IN); - if(!its.More()) B1.Add(myShapeResult,curshape); + if(!its.More()) BB.Add(myShapeResult,curshape); else { //If the old type of Shape is Shell, Shell is placed instead of Solid, //However there is a problem for compound of open Shell. @@ -452,11 +1220,11 @@ void ChFi3d_Builder::Compute() TopExp_Explorer expsh2(its.Value(),TopAbs_SHELL); const TopoDS_Shape& cursh = expsh2.Current(); TopoDS_Shape tt = cursh; - B1.Add(myShapeResult,cursh); + BB.Add(myShapeResult,cursh); its.Next(); } else { - B1.Add(myShapeResult,its.Value()); + BB.Add(myShapeResult,its.Value()); its.Next(); } } @@ -465,21 +1233,23 @@ void ChFi3d_Builder::Compute() } else { done=Standard_False; - B1.MakeCompound(TopoDS::Compound(badShape)); + BB.MakeCompound(TopoDS::Compound(badShape)); for(It.Reset(); It.More(); It.Next()){ Standard_Integer indsol = It.Key(); const TopoDS_Shape& curshape = DStr.Shape(indsol); TopTools_ListIteratorOfListOfShape its = myCoup->Merged(curshape,TopAbs_IN); - if(!its.More()) B1.Add(badShape,curshape); + if(!its.More()) BB.Add(badShape,curshape); else { while (its.More()) { - B1.Add(badShape,its.Value()); + BB.Add(badShape,its.Value()); its.Next(); } } } } + */ + #ifdef OCCT_DEBUG //perf ChFi3d_ResultChron(cl_reconstruction ,t_reconstruction); ChFi3d_InitChron(cl_setregul); @@ -571,6 +1341,8 @@ void ChFi3d_Builder::Compute() // if it is necessary if (IsDone()) { + //Temporary + /* Standard_Real SameParTol = Precision::Confusion(); Standard_Integer aNbSurfaces, iF; TopTools_ListIteratorOfListOfShape aIt; @@ -586,6 +1358,7 @@ void ChFi3d_Builder::Compute() ShapeFix::SameParameter(aF, Standard_False, SameParTol); } } + */ } } @@ -837,11 +1610,14 @@ const TopTools_ListOfShape& ChFi3d_Builder::Generated(const TopoDS_Shape& EouV) TColStd_ListIteratorOfListOfInteger IL; for(IL.Initialize(L); IL.More(); IL.Next()){ Standard_Integer I = IL.Value(); - const TopTools_ListOfShape& LS = myCoup->NewFaces(I); + //const TopTools_ListOfShape& LS = myCoup->NewFaces(I); + const TopoDS_Face& aNewFace = TopoDS::Face(myNewFaces(I)); + /* TopTools_ListIteratorOfListOfShape ILS; - for(ILS.Initialize(LS); ILS.More(); ILS.Next()){ + for(ILS.Initialize(LS); ILS.More(); ILS.Next()) myGenerated.Append(ILS.Value()); - } + */ + myGenerated.Append(aNewFace); } } return myGenerated; diff --git a/src/ChFi3d/ChFi3d_Builder.hxx b/src/ChFi3d/ChFi3d_Builder.hxx index d07ad09b60..73095d3c2f 100644 --- a/src/ChFi3d/ChFi3d_Builder.hxx +++ b/src/ChFi3d/ChFi3d_Builder.hxx @@ -31,11 +31,14 @@ #include #include #include +#include +#include #include #include #include #include #include +//#include #include #include @@ -74,6 +77,22 @@ class TopoDS_Face; class AppBlend_Approx; class Geom2d_Curve; +struct QualifiedEdge +{ + Standard_Integer Index; + TopAbs_Orientation Orientation; + //BRepOffset_Type Convexity; + + QualifiedEdge(Standard_Integer theIndex, + TopAbs_Orientation theOrientation) + : Index(theIndex), + Orientation(theOrientation) + { + } +}; + +typedef NCollection_List ChFi3d_ListOfQualifiedEdge; +typedef ChFi3d_ListOfQualifiedEdge::Iterator ChFi3d_ListIteratorOfListOfQualifiedEdge; //! Root class for calculation of surfaces (fillets, //! chamfers) destined to smooth edges of @@ -779,6 +798,12 @@ protected: ChFiDS_Map myVFMap; ChFiDS_Map myVEMap; Handle(TopOpeBRepDS_HDataStructure) myDS; + //TopTools_IndexedDataMapOfShapeListOfShape myFaceNewEdges; + NCollection_IndexedDataMap myFaceNewEdges; + //NCollection_IndexedDataMap myFaceNewEdges; + TopTools_IndexedMapOfShape myNewFaces; + TopTools_IndexedMapOfShape myNewEdges; + TColStd_MapOfInteger myIndsChFiFaces; Handle(TopOpeBRepBuild_HBuilder) myCoup; ChFiDS_ListOfStripe myListStripe; ChFiDS_StripeMap myVDataMap; diff --git a/src/ChFi3d/ChFi3d_Builder_0.cxx b/src/ChFi3d/ChFi3d_Builder_0.cxx index 1d92766f8e..f0a8616fa9 100644 --- a/src/ChFi3d/ChFi3d_Builder_0.cxx +++ b/src/ChFi3d/ChFi3d_Builder_0.cxx @@ -90,6 +90,7 @@ #include #include #include +#include #include #include #include @@ -192,6 +193,211 @@ Standard_Real ChFi3d_InPeriod(const Standard_Real U, if ( u < UFirst) u = UFirst; return u; } + +//======================================================================= +//function : ChFi3d_AdjustSecondPointToFirstPoint +//purpose : +//======================================================================= +void ChFi3d_AdjustSecondPointToFirstPoint(const gp_Pnt2d& theFirstPoint, + gp_Pnt2d& theSecondPoint, + const BRepAdaptor_Surface& theSurf) +{ + if (theSurf.IsUPeriodic()) + { + Standard_Real UPeriod = theSurf.UPeriod(); + Standard_Real NewU = ElCLib::InPeriod(theSecondPoint.X(), + theFirstPoint.X() - UPeriod/2, + theFirstPoint.X() + UPeriod/2); + theSecondPoint.SetX(NewU); + } + if (theSurf.IsVPeriodic()) + { + Standard_Real VPeriod = theSurf.VPeriod(); + Standard_Real NewV = ElCLib::InPeriod(theSecondPoint.Y(), + theFirstPoint.Y() - VPeriod/2, + theFirstPoint.Y() + VPeriod/2); + theSecondPoint.SetY(NewV); + } +} + +//======================================================================= +//function : ChFi3d_SplitAndAdjust +//purpose : +//======================================================================= +void ChFi3d_SplitAndAdjust(const TopTools_ListOfShape& theElist, + TopTools_ListOfShape& theNewElist, + const BRepAdaptor_Surface& theBAsurf) +{ + TopoDS_Face aFace = theBAsurf.Face(); + Handle(Geom_Surface) aSurf, aBasisSurf; + TopLoc_Location aLoc; + aSurf = BRep_Tool::Surface(aFace, aLoc); + aBasisSurf = aSurf; + if (aSurf->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) + aBasisSurf = (Handle(Geom_RectangularTrimmedSurface)::DownCast(aSurf))->BasisSurface(); + + if (!aBasisSurf->IsUClosed() && !aBasisSurf->IsVClosed()) + return; + + TColGeom2d_SequenceOfCurve Boundaries; + Standard_Real Ubounds [2], Vbounds [2]; + aSurf->Bounds(Ubounds[0], Ubounds[1], Vbounds[0], Vbounds[1]); + for (Standard_Integer i = 0; i < 2; i++) + if (!Precision::IsInfinite(Ubounds[i])) + { + gp_Pnt2d Origin(Ubounds[i], 0.); + Handle(Geom2d_Curve) aLine = new Geom2d_Line(Origin, gp::DY2d()); + if (!Precision::IsInfinite(Vbounds[0]) || !Precision::IsInfinite(Vbounds[1])) + aLine = new Geom2d_TrimmedCurve(aLine, Vbounds[0], Vbounds[1]); + Boundaries.Append(aLine); + } + for (Standard_Integer i = 0; i < 2; i++) + if (!Precision::IsInfinite(Vbounds[i])) + { + gp_Pnt2d Origin(0., Vbounds[i]); + Handle(Geom2d_Curve) aLine = new Geom2d_Line(Origin, gp::DX2d()); + if (!Precision::IsInfinite(Ubounds[0]) || !Precision::IsInfinite(Ubounds[1])) + aLine = new Geom2d_TrimmedCurve(aLine, Ubounds[0], Ubounds[1]); + Boundaries.Append(aLine); + } + + Geom2dInt_GInter Intersector; + BRep_Builder BB; + TopTools_ListIteratorOfListOfShape itl(theElist); + for (; itl.More(); itl.Next()) + { + TopoDS_Edge anEdge = TopoDS::Edge(itl.Value()); + TopAbs_Orientation anOr = anEdge.Orientation(); + Standard_Real aTol = BRep_Tool::Tolerance(anEdge); + TColStd_SequenceOfReal Params; + Standard_Real fpar, lpar; + Handle(Geom2d_Curve) aPCurve = BRep_Tool::CurveOnSurface(anEdge, aFace, fpar, lpar); + Geom2dAdaptor_Curve aGAcurve(aPCurve, fpar, lpar); + Standard_Real LeftTol = Precision::PConfusion(), RightTol = Precision::PConfusion(); + BRepAdaptor_Curve BAcurve(anEdge); + gp_Pnt FirstPnt = BAcurve.Value(fpar); + gp_Pnt LastPnt = BAcurve.Value(lpar); + Standard_Real Offset = 0.01*(lpar - fpar); + gp_Pnt PntOffset = BAcurve.Value(fpar + Offset); + Standard_Real dist3d = FirstPnt.Distance(PntOffset); + if (dist3d > gp::Resolution()) + LeftTol = Offset*aTol/dist3d; + PntOffset = BAcurve.Value(lpar - Offset); + dist3d = LastPnt.Distance(PntOffset); + if (dist3d > gp::Resolution()) + RightTol = Offset*aTol/dist3d; + for (Standard_Integer i = 1; i <= Boundaries.Length(); i++) + { + Geom2dAdaptor_Curve aGAboundary(Boundaries(i)); + Intersector.Perform(aGAcurve, aGAboundary, + Precision::PIntersection(), + Precision::PIntersection()); + if (Intersector.IsDone() && !Intersector.IsEmpty()) + { + for (Standard_Integer j = 1; j <= Intersector.NbPoints(); j++) + { + IntRes2d_IntersectionPoint int2d = Intersector.Point(j); + Standard_Real aParam = int2d.ParamOnFirst(); + if (Abs(aParam - fpar) > LeftTol && + Abs(aParam - lpar) > RightTol) + Params.Append(aParam); + } + for (Standard_Integer j = 1; j <= Intersector.NbSegments(); j++) + { + IntRes2d_IntersectionSegment seg2d = Intersector.Segment(j); + IntRes2d_IntersectionPoint int2d = seg2d.FirstPoint(); + Standard_Real aParam = int2d.ParamOnFirst(); + if (Abs(aParam - fpar) > LeftTol && + Abs(aParam - lpar) > RightTol) + Params.Append(aParam); + int2d = seg2d.LastPoint(); + aParam = int2d.ParamOnFirst(); + if (Abs(aParam - fpar) > LeftTol && + Abs(aParam - lpar) > RightTol) + Params.Append(aParam); + } + } + } //for (Standard_Integer i = 1; i <= Boundaries.Length(); i++) + + //Sort parameters + for (Standard_Integer i = 1; i < Params.Length(); i++) + for (Standard_Integer j = i+1; j <= Params.Length(); j++) + if (Params(i) > Params(j)) + { Standard_Real tmp = Params(i); Params(i) = Params(j); Params(j) = tmp; } + //Delete duplicating parameters + Standard_Real ParamTol = Max(LeftTol, RightTol); + Standard_Integer i = 2; + while (i <= Params.Length()) + if (Params(i) - Params(i-1) > ParamTol) + Params.Remove(i); + else + i++; + + //Split + TopoDS_Vertex FirstVertex = TopExp::FirstVertex(anEdge), LastVertex; + Standard_Real FirstPar = fpar, LastPar; + for (i = 1; i <= Params.Length(); i++) + { + LastPar = Params(i); + TopoDS_Edge aNewEdge = TopoDS::Edge(anEdge.EmptyCopied()); + aNewEdge.Orientation(TopAbs_FORWARD); + BB.Range(aNewEdge, FirstPar, LastPar); + gp_Pnt LastPnt = BAcurve.Value(LastPar); + LastVertex = BRepLib_MakeVertex(LastPnt); + BB.UpdateVertex(LastVertex, ParamTol); + BB.Add(aNewEdge, FirstVertex.Oriented(TopAbs_FORWARD)); + BB.Add(aNewEdge, LastVertex.Oriented(TopAbs_REVERSED)); + aNewEdge.Orientation(anOr); + BB.UpdateEdge(aNewEdge, aTol); + theNewElist.Append(aNewEdge); + FirstVertex = LastVertex; + FirstPar = LastPar; + } + LastPar = lpar; + LastVertex = TopExp::LastVertex(anEdge); + TopoDS_Edge aNewEdge = TopoDS::Edge(anEdge.EmptyCopied()); + aNewEdge.Orientation(TopAbs_FORWARD); + BB.Range(aNewEdge, FirstPar, LastPar); + BB.Add(aNewEdge, FirstVertex.Oriented(TopAbs_FORWARD)); + BB.Add(aNewEdge, LastVertex.Oriented(TopAbs_REVERSED)); + aNewEdge.Orientation(anOr); + BB.UpdateEdge(aNewEdge, aTol); + theNewElist.Append(aNewEdge); + } + + if (theNewElist.IsEmpty()) + theNewElist.Assign(theElist); + + //Adjust + for (itl.Initialize(theNewElist); itl.More(); itl.Next()) + { + TopoDS_Edge anEdge = TopoDS::Edge(itl.Value()); + Standard_Real fpar, lpar; + Handle(Geom2d_Curve) aPCurve = BRep_Tool::CurveOnSurface(anEdge, aFace, fpar, lpar); + gp_Pnt2d MidP2d = aPCurve->Value(0.5*(fpar + lpar)); + Standard_Real aU = MidP2d.X(), aV = MidP2d.Y(); + if (aU < Ubounds[0] || aU > Ubounds[1]) + { + Standard_Real Period = Ubounds[1] - Ubounds[0]; + Standard_Real Sign = (aU < Ubounds[0])? 1 : -1; + while (aU < Ubounds[0] || aU > Ubounds[1]) + aU += Sign*Period; + } + if (aV < Vbounds[0] || aV > Vbounds[1]) //??? sphere? cone? + { + Standard_Real Period = Vbounds[1] - Vbounds[0]; + Standard_Real Sign = (aV < Vbounds[0])? 1 : -1; + while (aV < Vbounds[0] || aV > Vbounds[1]) + aV += Sign*Period; + } + if (aU != MidP2d.X() || aV != MidP2d.Y()) + { + gp_Vec2d OffsetVec(aU - MidP2d.X(), aV - MidP2d.Y()); + aPCurve->Translate(OffsetVec); + } + } +} + //======================================================================= //function : Box //purpose : Calculation of min/max uv of the fillet to intersect. @@ -4756,6 +4962,24 @@ Standard_Integer ChFi3d_NumberOfSharpEdges(const TopoDS_Vertex& Vtx, return nba; } +//======================================================================= +//function : IsInSingularity +//purpose : +// +//======================================================================= +Standard_Boolean ChFi3d_IsInSingularity(const TopoDS_Vertex& Vtx, + const ChFiDS_Map& VEMap) +{ + TopTools_ListIteratorOfListOfShape ItE; + for (ItE.Initialize(VEMap(Vtx)); ItE.More(); ItE.Next()) + { + const TopoDS_Edge& cur = TopoDS::Edge(ItE.Value()); + if (BRep_Tool::Degenerated(cur)) + return Standard_True; + } + return Standard_False; +} + //===================================================== // function cherche_vertex // finds common vertex between two edges diff --git a/src/ChFi3d/ChFi3d_Builder_0.hxx b/src/ChFi3d/ChFi3d_Builder_0.hxx index 315b4ade36..7261eba498 100644 --- a/src/ChFi3d/ChFi3d_Builder_0.hxx +++ b/src/ChFi3d/ChFi3d_Builder_0.hxx @@ -81,6 +81,14 @@ Standard_Real ChFi3d_InPeriod(const Standard_Real U, const Standard_Real ULast, const Standard_Real Eps); +void ChFi3d_AdjustSecondPointToFirstPoint(const gp_Pnt2d& theFirstPoint, + gp_Pnt2d& theSecondPoint, + const BRepAdaptor_Surface& theSurf); + +void ChFi3d_SplitAndAdjust(const TopTools_ListOfShape& theElist, + TopTools_ListOfShape& theNewElist, + const BRepAdaptor_Surface& theBAsurf); + void ChFi3d_Boite(const gp_Pnt2d& p1,const gp_Pnt2d& p2, Standard_Real& mu,Standard_Real& Mu, Standard_Real& mv,Standard_Real& Mv); @@ -566,6 +574,9 @@ Standard_Integer ChFi3d_NumberOfSharpEdges(const TopoDS_Vertex& Vtx, const ChFiDS_Map& VEMap, const ChFiDS_Map& EFmap); +Standard_Boolean ChFi3d_IsInSingularity(const TopoDS_Vertex& Vtx, + const ChFiDS_Map& VEMap); + void ChFi3d_cherche_vertex (const TopoDS_Edge & E1, const TopoDS_Edge & E2, TopoDS_Vertex & vertex, diff --git a/src/ChFi3d/ChFi3d_Builder_2.cxx b/src/ChFi3d/ChFi3d_Builder_2.cxx index aac4206a57..bf4773ae65 100644 --- a/src/ChFi3d/ChFi3d_Builder_2.cxx +++ b/src/ChFi3d/ChFi3d_Builder_2.cxx @@ -2419,7 +2419,8 @@ void ChFi3d_Builder::PerformSetOfKPart(Handle(ChFiDS_Stripe)& Stripe, Handle(ChFiDS_SurfData) SD = new ChFiDS_SurfData(); ChFiDS_SequenceOfSurfData LSD; - if(!ChFiKPart_ComputeData::Compute(DStr,SD,HS1,HS2,Or1,Or2,Spine,iedge)){ + if(!ChFiKPart_ComputeData::Compute(DStr,myNewFaces,myNewEdges,myFaceNewEdges,myIndsChFiFaces, + SD,HS1,HS2,Or1,Or2,Spine,iedge)){ #ifdef OCCT_DEBUG cout<<"failed calculation KPart"<Surf()); + //myEVIMap.ChangeFind(Ej).Append(cursd->Surf()); + myEVIMap.ChangeFind(Ej).Append(cursd->IndexOfFace()); } } else if(IF < IL){ diff --git a/src/ChFi3d/ChFi3d_Builder_6.cxx b/src/ChFi3d/ChFi3d_Builder_6.cxx index a43192a558..23a40bdd8a 100644 --- a/src/ChFi3d/ChFi3d_Builder_6.cxx +++ b/src/ChFi3d/ChFi3d_Builder_6.cxx @@ -98,6 +98,7 @@ #include #include #include +#include #include @@ -795,6 +796,28 @@ Standard_Boolean ChFi3d_Builder::StoreData(Handle(ChFiDS_SurfData)& Data, if(Reversed) TraOn1 = ChFi3d_TrsfTrans(lin->TransitionOnS2()); else TraOn1 = ChFi3d_TrsfTrans(lin->TransitionOnS1()); Fint1.SetInterference(Index1OfCurve,TraOn1,PCurveOnFace,PCurveOnSurf); + + //jgv + TopoDS_Edge Boundary1, Boundary2; + Boundary1 = BRepLib_MakeEdge(Crv3d1, pppdeb, pppfin); + BRep_Builder BB; + BB.UpdateEdge(Boundary1, tolcheck); + TopLoc_Location aLoc; + BB.UpdateEdge(Boundary1, PCurveOnSurf, Surf, aLoc, 0.); + BB.UpdateEdge(Boundary1, PCurveOnFace, BS1->ChangeSurface().Face(), 0.); + myNewEdges.Add(Boundary1); + + Standard_Integer IndF1, IndF2; + if (!myNewFaces.Contains(BS1->ChangeSurface().Face())) + myNewFaces.Add(BS1->ChangeSurface().Face()); + IndF1 = myNewFaces.FindIndex(BS1->ChangeSurface().Face()); + if (!myFaceNewEdges.Contains(IndF1)) + { + //ChFi3d_ListOfQualifiedEdge aList; + TColStd_ListOfInteger aList; + myFaceNewEdges.Add(IndF1, aList); + } + ///// // SurfData is filled in what concerns S2, Handle(Geom_Curve) Crv3d2 = Surf->UIso(Uon2); @@ -848,6 +871,24 @@ Standard_Boolean ChFi3d_Builder::StoreData(Handle(ChFiDS_SurfData)& Data, if(Reversed) TraOn2 = ChFi3d_TrsfTrans(lin->TransitionOnS1()); else TraOn2 = ChFi3d_TrsfTrans(lin->TransitionOnS2()); Fint2.SetInterference(Index2OfCurve,TraOn2,PCurveOnFace,PCurveOnSurf); + + //jgv + Boundary2 = BRepLib_MakeEdge(Crv3d2, pppdeb, pppfin); + BB.UpdateEdge(Boundary2, tolcheck); + BB.UpdateEdge(Boundary2, PCurveOnSurf, Surf, aLoc, 0.); + BB.UpdateEdge(Boundary2, PCurveOnFace, BS2->ChangeSurface().Face(), 0.); + myNewEdges.Add(Boundary2); + + if (!myNewFaces.Contains(BS2->ChangeSurface().Face())) + myNewFaces.Add(BS2->ChangeSurface().Face()); + IndF2 = myNewFaces.FindIndex(BS2->ChangeSurface().Face()); + if (!myFaceNewEdges.Contains(IndF2)) + { + //ChFi3d_ListOfQualifiedEdge aList; + TColStd_ListOfInteger aList; + myFaceNewEdges.Add(IndF2, aList); + } + ///// } else { Handle(Geom2d_Curve) bidpc; @@ -910,6 +951,49 @@ Standard_Boolean ChFi3d_Builder::StoreData(Handle(ChFiDS_SurfData)& Data, break; } // Modified by skv - Wed Jun 9 17:16:26 2004 OCC5898 End + + //Add new face and its new edges in the maps + TopoDS_Face aNewFace; + BB.MakeFace(aNewFace); + BB.UpdateFace(aNewFace, Surf, aLoc, Precision::Confusion()); + aNewFace.Orientation(Data->Orientation()); + Standard_Integer IndNewFace = myNewFaces.Add(aNewFace); + myIndsChFiFaces.Add(IndNewFace); + //ChFi3d_ListOfQualifiedEdge aList; + TColStd_ListOfInteger aList; + myFaceNewEdges.Add(IndNewFace, aList); + Data->ChangeIndexOfFace(IndNewFace); + + TopAbs_Orientation Et = (Reversed)? TopAbs_REVERSED : TopAbs_FORWARD; + Standard_Integer IndE1 = myNewEdges.FindIndex(Boundary1); + Data->ChangeIndexOfE1(IndE1); + //QualifiedEdge aQE1(IndE1, Et); + if (Et == TopAbs_REVERSED) + IndE1 *= -1; + if (Data->Orientation() == TopAbs_REVERSED) + IndE1 *= -1; + myFaceNewEdges.ChangeFromKey(IndF1).Append(IndE1); + Standard_Integer IndE1_forNewFace = IndE1; + if (Data->Orientation() == TopAbs_FORWARD) + IndE1_forNewFace *= -1; + //myFaceNewEdges.ChangeFromKey(IndNewFace).Append(-IndE1); + myFaceNewEdges.ChangeFromKey(IndNewFace).Append(IndE1_forNewFace); + + Standard_Integer IndE2 = myNewEdges.FindIndex(Boundary2); + Data->ChangeIndexOfE2(IndE2); + //QualifiedEdge aQE2(IndE2, TopAbs::Reverse(Et)); + TopAbs_Orientation RevEt = TopAbs::Reverse(Et); + if (RevEt == TopAbs_REVERSED) + IndE2 *= -1; + if (Data->Orientation() == TopAbs_REVERSED) + IndE2 *= -1; + myFaceNewEdges.ChangeFromKey(IndF2).Append(IndE2); + Standard_Integer IndE2_forNewFace = IndE2; + if (Data->Orientation() == TopAbs_FORWARD) + IndE2_forNewFace *= -1; + //myFaceNewEdges.ChangeFromKey(IndNewFace).Append(-IndE2); + myFaceNewEdges.ChangeFromKey(IndNewFace).Append(IndE2_forNewFace); + //////////////////////// if(!Gd1 && !S1.IsNull()) ChFi3d_FilCommonPoint(lin->StartPointOnFirst(),lin->TransitionOnS1(), diff --git a/src/ChFi3d/ChFi3d_Builder_C1.cxx b/src/ChFi3d/ChFi3d_Builder_C1.cxx index b63ad08337..68dac68dfe 100644 --- a/src/ChFi3d/ChFi3d_Builder_C1.cxx +++ b/src/ChFi3d/ChFi3d_Builder_C1.cxx @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -140,6 +141,7 @@ #include #include #include +//#include #ifdef OCCT_DEBUG # ifdef DRAW @@ -598,6 +600,9 @@ void ChFi3d_Builder::PerformOneCorner(const Standard_Integer Index, } Handle(ChFiDS_SurfData)& Fd = SeqFil.ChangeValue(num); + //jgv + Standard_Integer IndexOfNewFace = Fd->IndexOfFace(); + ///// ChFiDS_CommonPoint& CV1 = Fd->ChangeVertex(isfirst,1); ChFiDS_CommonPoint& CV2 = Fd->ChangeVertex(isfirst,2); //To evaluate the new points. @@ -621,6 +626,7 @@ void ChFi3d_Builder::PerformOneCorner(const Standard_Integer Index, BRepAdaptor_Surface& Bs = HBs->ChangeSurface(); BRepAdaptor_Surface& Bad = HBad->ChangeSurface(); BRepAdaptor_Surface& Bop = HBop->ChangeSurface(); + TopoDS_Edge aNewEdge; Handle(Geom_Curve) Cc; Handle(Geom2d_Curve) Pc,Ps; Standard_Real Ubid,Vbid;//,mu,Mu,mv,Mv; @@ -631,6 +637,7 @@ void ChFi3d_Builder::PerformOneCorner(const Standard_Integer Index, Standard_Integer IFadArc = 1, IFopArc = 2; Fop = TopoDS::Face(DStr.Shape(Fd->Index(IFopArc))); TopExp_Explorer ex; + BRep_Builder BB; #ifdef OCCT_DEBUG ChFi3d_InitChron(ch); // init perf condition if (onsame) @@ -731,12 +738,11 @@ void ChFi3d_Builder::PerformOneCorner(const Standard_Integer Index, TopoDS_Face FFv; Standard_Real tol; Standard_Integer prol=0; - BRep_Builder BRE; Handle(Geom_Surface ) Sface; Sface=BRep_Tool::Surface(Fv); ChFi3d_ExtendSurface(Sface,prol); tol=BRep_Tool::Tolerance(Fv); - BRE.MakeFace(FFv,Sface,tol); + BB.MakeFace(FFv,Sface,tol); if (prol) { Bs.Initialize(FFv,Standard_False); DStr.SetNewSurface(Fv,Sface); @@ -753,6 +759,7 @@ void ChFi3d_Builder::PerformOneCorner(const Standard_Integer Index, ChFiDS_FaceInterference& FiopArc = Fd->ChangeInterference(IFopArc); ChFiDS_CommonPoint& CPadArc = Fd->ChangeVertex(isfirst,IFadArc); ChFiDS_FaceInterference& FiadArc = Fd->ChangeInterference(IFadArc); + TopoDS_Vertex VerFopFad [3]; //the parameter of the vertex in the air is initialiced with the value of //its opposite (point on arc). Standard_Real wop = Fd->ChangeInterference(IFadArc).Parameter(isfirst); @@ -768,6 +775,26 @@ void ChFi3d_Builder::PerformOneCorner(const Standard_Integer Index, inters = IntersUpdateOnSame (HGs,HBs,c3df,Fop,Fv,Arcprol,Vtx,isfirst,10*tolesp, // in FiopArc,CPopArc,p2dbout,wop); // out + //jgv + for (Standard_Integer is = 1; is <= 2; is++) + { + ChFiDS_FaceInterference& Interf = Fd->ChangeInterference(is); + Standard_Integer IndEsurf = Fd->IndexOfEdge(is); + TopoDS_Edge EdgeSurf = TopoDS::Edge(myNewEdges(IndEsurf)); + Standard_Real fpar, lpar; + Handle(Geom_Curve) CurveEdgeSurf = BRep_Tool::Curve(EdgeSurf, fpar, lpar); + //BRep_Tool::Range(EdgeSurf, fpar, lpar); + if (isfirst) + fpar = Interf.FirstParameter(); + else + lpar = Interf.LastParameter(); + BB.Range(EdgeSurf, fpar, lpar); + VerFopFad[is] = (isfirst)? TopExp::FirstVertex(EdgeSurf) + : TopExp::LastVertex(EdgeSurf); + gp_Pnt aPnt = CurveEdgeSurf->Value((isfirst)? fpar : lpar); + BB.UpdateVertex(VerFopFad[is], aPnt, 0.); + } + ///// Handle(BRepAdaptor_HCurve2d) pced = new BRepAdaptor_HCurve2d(); pced->ChangeCurve2d().Initialize(CPadArc.Arc(),Fv); @@ -794,6 +821,35 @@ void ChFi3d_Builder::PerformOneCorner(const Standard_Integer Index, Update(HBs,pced,HGs,Fd->ChangeInterferenceOnS1(),CV1,isfirst); pced->ChangeCurve2d().Initialize(CV2.Arc(),Fv); Update(HBs,pced,HGs,Fd->ChangeInterferenceOnS2(),CV2,isfirst); + //jgv + for (Standard_Integer is = 1; is <= 2; is++) + { + const ChFiDS_FaceInterference& Interf = Fd->Interference(is); + Standard_Integer IndEsurf = Fd->IndexOfEdge(is); + TopoDS_Edge EdgeSurf = TopoDS::Edge(myNewEdges(IndEsurf)); + EdgeSurf.Orientation(TopAbs_FORWARD); + Standard_Real fpar, lpar; + Handle(Geom_Curve) CurveEdgeSurf = BRep_Tool::Curve(EdgeSurf, fpar, lpar); + if (isfirst) + fpar = Interf.FirstParameter(); + else + lpar = Interf.LastParameter(); + BB.Range(EdgeSurf, fpar, lpar); + VerFopFad[is] = (isfirst)? TopExp::FirstVertex(EdgeSurf) + : TopExp::LastVertex(EdgeSurf); + gp_Pnt aPnt = CurveEdgeSurf->Value((isfirst)? fpar : lpar); + if (VerFopFad[is].IsNull()) + { + VerFopFad[is] = BRepLib_MakeVertex(aPnt); + TopAbs_Orientation OrOfVer = TopAbs_FORWARD; + if (!isfirst) + OrOfVer = TopAbs_REVERSED; + BB.Add(EdgeSurf, VerFopFad[is].Oriented(OrOfVer)); + } + else + BB.UpdateVertex(VerFopFad[is], aPnt, 0.); + } + ///// } @@ -829,6 +885,26 @@ void ChFi3d_Builder::PerformOneCorner(const Standard_Integer Index, Hc2 = BRep_Tool::CurveOnSurface(CV2.Arc(),Fv,Ubid,Ubid); pfac2 = Hc2->Value(CV2.ParameterOnArc()); } + //jgv + if (Bs.IsUPeriodic() || Bs.IsVPeriodic()) + { + gp_Pnt Pnt1 = BRep_Tool::Pnt(VerFopFad[1]); + gp_Pnt Pnt2 = BRep_Tool::Pnt(VerFopFad[2]); + gp_Pnt MidPnt((Pnt1.XYZ() + Pnt2.XYZ())/2); + //Project middle point onto surface + Extrema_ExtPS ProjPS(MidPnt, Bs, + Precision::PConfusion(), Precision::PConfusion()); + Standard_Integer indmin = 1; + for (Standard_Integer iext = 2; iext <= ProjPS.NbExt(); iext++) + if (ProjPS.SquareDistance(iext) < ProjPS.SquareDistance(indmin)) + indmin = iext; + Standard_Real uu, vv; + ProjPS.Point(indmin).Parameter(uu,vv); + gp_Pnt2d MidPnt2d(uu, vv); + ChFi3d_AdjustSecondPointToFirstPoint(MidPnt2d, pfac1, Bs); + ChFi3d_AdjustSecondPointToFirstPoint(MidPnt2d, pfac2, Bs); + } + ///// if (Fi1.LineIndex() != 0) { pfil1 = Fi1.PCurveOnSurf()->Value(Fi1.Parameter(isfirst)); } @@ -857,6 +933,43 @@ void ChFi3d_Builder::PerformOneCorner(const Standard_Integer Index, Pc,tolesp,tol2d,tolreached)) throw Standard_Failure("OneCorner : echec calcul intersection"); + //jgv + /* + gp_Pnt Pver, Pcur; + Pver = BRep_Tool::Pnt(VerFopFad[IFopArc]); + Pcur = Cc->Value(Cc->FirstParameter()); + Standard_Real aDist = Pver.Distance(Pcur); + BB.UpdateVertex(VerFopFad[IFopArc], 1.01*aDist); + Pver = BRep_Tool::Pnt(VerFopFad[IFadArc]); + Pcur = Cc->Value(Cc->LastParameter()); + aDist = Pver.Distance(Pcur); + BB.UpdateVertex(VerFopFad[IFadArc], 1.01*aDist); + */ + Standard_Integer ind_first, ind_last; + if (onsame) + { + ind_first = IFopArc; ind_last = IFadArc; + } + else + { + ind_first = IFadArc; ind_last = IFopArc; + } + aNewEdge = BRepLib_MakeEdge(Cc, + VerFopFad[ind_first], VerFopFad[ind_last], + Cc->FirstParameter(), Cc->LastParameter()); + BB.UpdateEdge(aNewEdge, tolreached); + TopLoc_Location aLoc; + BB.UpdateEdge(aNewEdge, Ps, DStr.Surface(Fd->Surf()).Surface(), aLoc, 0.); + /* + Handle(Geom2d_Curve) AdjustedPc; + BOPTools_AlgoTools2D::AdjustPCurveOnSurf(Bs, Cc->FirstParameter(), Cc->LastParameter(), + Pc, AdjustedPc); + Pc = AdjustedPc; + */ + BB.UpdateEdge(aNewEdge, Pc, Bs.Face(), 0.); + myNewEdges.Add(aNewEdge); + ///// + Udeb = Cc->FirstParameter(); Ufin = Cc->LastParameter(); @@ -933,11 +1046,28 @@ void ChFi3d_Builder::PerformOneCorner(const Standard_Integer Index, break; } } + } -// - - + Standard_Integer IndFv; + if (!myNewFaces.Contains(Fv)) + myNewFaces.Add(Fv); + IndFv = myNewFaces.FindIndex(Fv); + if (!myFaceNewEdges.Contains(IndFv)) + { + //ChFi3d_ListOfQualifiedEdge aList; + TColStd_ListOfInteger aList; + myFaceNewEdges.Add(IndFv, aList); } + Standard_Integer IndE = myNewEdges.FindIndex(aNewEdge); + //QualifiedEdge aQE(IndE, Et); + if (Et == TopAbs_REVERSED) + IndE *= -1; + myFaceNewEdges.ChangeFromKey(IndFv).Append(IndE); + Standard_Integer IndE_forNewFace = IndE; + if (Fd->Orientation() == TopAbs_FORWARD) + IndE_forNewFace *= -1; + //myFaceNewEdges.ChangeFromKey(IndexOfNewFace).Append(-IndE); + myFaceNewEdges.ChangeFromKey(IndexOfNewFace).Append(IndE_forNewFace); #ifdef OCCT_DEBUG ChFi3d_ResultChron(ch ,t_inter); //result perf condition if (inter) @@ -1246,6 +1376,8 @@ void ChFi3d_Builder::PerformOneCorner(const Standard_Integer Index, Hc = BRep_Tool::CurveOnSurface(Arcprol,Fop,Ubid,Ubid); pop1 = Hc->Value(parVtx); pop2 = Fiop.PCurveOnFace()->Value(Fiop.Parameter(isfirst)); + if (!ChFi3d_IsInSingularity(Vtx, myVEMap)) + ChFi3d_AdjustSecondPointToFirstPoint(pop1, pop2, Bop); Hc = BRep_Tool::CurveOnSurface(Arcprol,Fv,Ubid,Ubid); pv1 = Hc->Value(parVtx); pv2 = p2dbout; @@ -1268,127 +1400,101 @@ void ChFi3d_Builder::PerformOneCorner(const Standard_Integer Index, zob2dv,tolesp,tol2d,tolreached)) throw Standard_Failure("OneCorner : echec calcul intersection"); + //jgv + //TopoDS_Vertex CommonVertexForNewEdgeAndZobEdge = TopExp::FirstVertex(aNewEdge); + gp_Pnt aPnt = BRep_Tool::Pnt(Vtx); + gp_Pnt aPntFromCurve = zob3d->Value(zob3d->FirstParameter()); + Standard_Real aDist = aPnt.Distance(aPntFromCurve); + BB.UpdateVertex(Vtx, 1.01*aDist); + TopoDS_Edge aZobEdge = BRepLib_MakeEdge(zob3d, + Vtx, VerFopFad[IFopArc], + zob3d->FirstParameter(), zob3d->LastParameter()); + BB.UpdateEdge(aZobEdge, tolreached); + /* + Handle(Geom2d_Curve) AdjustedZob2dop; + BOPTools_AlgoTools2D::AdjustPCurveOnSurf(Bop, zob3d->FirstParameter(), zob3d->LastParameter(), + zob2dop, AdjustedZob2dop); + zob2dop = AdjustedZob2dop; + */ + BB.UpdateEdge(aZobEdge, zob2dop, Bop.Face(), 0.); + /* + Handle(Geom2d_Curve) AdjustedZob2dv; + BOPTools_AlgoTools2D::AdjustPCurveOnSurf(Bs, zob3d->FirstParameter(), zob3d->LastParameter(), + zob2dv, AdjustedZob2dv); + zob2dv = AdjustedZob2dv; + */ + BB.UpdateEdge(aZobEdge, zob2dv, Bs.Face(), 0.); + TopTools_ListOfShape aZobList, aNewZobList; + aZobList.Append(aZobEdge); + ChFi3d_SplitAndAdjust(aZobList, aNewZobList, Bop); + TopTools_ListIteratorOfListOfShape itl(aNewZobList); + for (; itl.More(); itl.Next()) + myNewEdges.Add(itl.Value()); + Udeb = zob3d->FirstParameter(); Ufin = zob3d->LastParameter(); TopOpeBRepDS_Curve Zob(zob3d,tolreached); Standard_Integer IZob = DStr.AddCurve(Zob); -// it is determined if Fop has an edge of sewing -// it is determined if the curve has an intersection with the edge of sewing + Et = TopAbs::Reverse(TopAbs::Compose(OVtx,OArcprolv)); - //TopoDS_Edge edgecouture; - //Standard_Boolean couture; - ChFi3d_Couture(Fop,couture,edgecouture); - - if (couture && !BRep_Tool::Degenerated(edgecouture)) { - BRepLib_MakeEdge Bedge (zob3d); - TopoDS_Edge edg =Bedge. Edge(); - BRepExtrema_ExtCC extCC (edgecouture,edg); - if (extCC.IsDone()&&extCC.NbExt()!=0) { - for (Standard_Integer i=1; i<=extCC.NbExt()&&!intcouture;i++) { - if (extCC.SquareDistance(i)<=1.e-8) { - par1=extCC.ParameterOnE1(i); - par2=extCC.ParameterOnE2(i); - gp_Pnt P1=extCC.PointOnE1(i); - TopOpeBRepDS_Point tpoint(P1,1.e-4); - indpt=DStr.AddPoint(tpoint); - intcouture=Standard_True; - curv1 = new Geom_TrimmedCurve(zob3d,Udeb,par2); - curv2 = new Geom_TrimmedCurve(zob3d,par2,Ufin); - TopOpeBRepDS_Curve tcurv1(curv1,tolreached); - TopOpeBRepDS_Curve tcurv2(curv2,tolreached); - Icurv1=DStr.AddCurve(tcurv1); - Icurv2=DStr.AddCurve(tcurv2); - } - } - } + Standard_Integer IndFop; + if (!myNewFaces.Contains(Fop)) + myNewFaces.Add(Fop); + IndFop = myNewFaces.FindIndex(Fop); + if (!myFaceNewEdges.Contains(IndFop)) + { + //ChFi3d_ListOfQualifiedEdge aList; + TColStd_ListOfInteger aList; + myFaceNewEdges.Add(IndFop, aList); } - if (intcouture) { - -// interference of curv1 and curv2 on Ishape - Et = TopAbs::Reverse(TopAbs::Compose(OVtx,OArcprolv)); - ComputeCurve2d(curv1,Fop,c2d1); - Handle(TopOpeBRepDS_SurfaceCurveInterference) - InterFv = ChFi3d_FilCurveInDS(Icurv1,IShape,/*zob2dv*/c2d1,Et); - DStr.ChangeShapeInterferences(IShape).Append(InterFv); - ComputeCurve2d(curv2,Fop,c2d2); - InterFv = ChFi3d_FilCurveInDS(Icurv2,IShape,/*zob2dv*/c2d2,Et); - DStr.ChangeShapeInterferences(IShape).Append(InterFv); - - // limitation of the sewing edge - Standard_Integer Iarc=DStr.AddShape(edgecouture); - Handle(TopOpeBRepDS_CurvePointInterference) Interfedge; - TopAbs_Orientation ori; - TopoDS_Vertex Vdeb,Vfin; - Vdeb=TopExp::FirstVertex(edgecouture); - Vfin=TopExp::LastVertex(edgecouture); - Standard_Real pard,parf; - pard=BRep_Tool::Parameter(Vdeb,edgecouture); - parf=BRep_Tool::Parameter(Vfin,edgecouture); - if (Abs(par1-pard)IndexPoint(isfirst,IFopArc); - interfprol = ChFi3d_FilPointInDS(TopAbs_FORWARD,Icurv2,indpt,par2); - DStr.ChangeCurveInterferences(Icurv2).Append(interfprol); - interfprol = ChFi3d_FilPointInDS(TopAbs_REVERSED,Icurv2,icc,Ufin); - DStr.ChangeCurveInterferences(Icurv2).Append(interfprol); + for (itl.Initialize(aNewZobList); itl.More(); itl.Next()) + { + Standard_Integer IndZobE = myNewEdges.FindIndex(itl.Value()); + //QualifiedEdge aQzobE(IndZobE, Et); + if (Et == TopAbs_REVERSED) + IndZobE *= -1; + myFaceNewEdges.ChangeFromKey(IndFv).Append(IndZobE); + //QualifiedEdge aQzopEonFop(IndZobE, TopAbs::Reverse(Et)); + myFaceNewEdges.ChangeFromKey(IndFop).Append(-IndZobE); } - else { - Et = TopAbs::Reverse(TopAbs::Compose(OVtx,OArcprolv)); - Handle(TopOpeBRepDS_SurfaceCurveInterference) - InterFv = ChFi3d_FilCurveInDS(IZob,IShape,zob2dv,Et); - DStr.ChangeShapeInterferences(IShape).Append(InterFv); - Et = TopAbs::Reverse(TopAbs::Compose(OVtx,OArcprolop)); - Standard_Integer Iop = DStr.AddShape(Fop); - Handle(TopOpeBRepDS_SurfaceCurveInterference) - Interfop = ChFi3d_FilCurveInDS(IZob,Iop,zob2dop,Et); - DStr.ChangeShapeInterferences(Iop).Append(Interfop); - Handle(TopOpeBRepDS_CurvePointInterference) interfprol; - #ifdef VARIANT1 - interfprol = ChFi3d_FilVertexInDS(TopAbs_FORWARD,IZob,IVtx,Udeb); - #else - { - Standard_Integer IV2 = DStr.AddShape(V2); // VARIANT 2 - interfprol = ChFi3d_FilVertexInDS(TopAbs_FORWARD,IZob,IV2,Udeb); - } - #endif - DStr.ChangeCurveInterferences(IZob).Append(interfprol); - Standard_Integer icc = stripe->IndexPoint(isfirst,IFopArc); - interfprol = ChFi3d_FilPointInDS(TopAbs_REVERSED,IZob,icc,Ufin); - DStr.ChangeCurveInterferences(IZob).Append(interfprol); - #ifdef VARIANT1 - { - if (IFopArc == 1) box1.Add( zob3d->Value(Ufin) ); - else box2.Add( zob3d->Value(Ufin) ); - } - #else - { - // cut off existing Arcprol - Standard_Integer iArcprol = DStr.AddShape(Arcprol); - interfprol = ChFi3d_FilPointInDS(OVtx,iArcprol,icc,Udeb); - DStr.ChangeShapeInterferences(Arcprol).Append(interfprol); - } - #endif + + Handle(TopOpeBRepDS_SurfaceCurveInterference) + InterFv = ChFi3d_FilCurveInDS(IZob,IShape,zob2dv,Et); + DStr.ChangeShapeInterferences(IShape).Append(InterFv); + Et = TopAbs::Reverse(TopAbs::Compose(OVtx,OArcprolop)); + Standard_Integer Iop = DStr.AddShape(Fop); + Handle(TopOpeBRepDS_SurfaceCurveInterference) + Interfop = ChFi3d_FilCurveInDS(IZob,Iop,zob2dop,Et); + DStr.ChangeShapeInterferences(Iop).Append(Interfop); + Handle(TopOpeBRepDS_CurvePointInterference) interfprol; +#ifdef VARIANT1 + interfprol = ChFi3d_FilVertexInDS(TopAbs_FORWARD,IZob,IVtx,Udeb); +#else + { + Standard_Integer IV2 = DStr.AddShape(V2); // VARIANT 2 + interfprol = ChFi3d_FilVertexInDS(TopAbs_FORWARD,IZob,IV2,Udeb); } - } +#endif + DStr.ChangeCurveInterferences(IZob).Append(interfprol); + Standard_Integer icc = stripe->IndexPoint(isfirst,IFopArc); + interfprol = ChFi3d_FilPointInDS(TopAbs_REVERSED,IZob,icc,Ufin); + DStr.ChangeCurveInterferences(IZob).Append(interfprol); +#ifdef VARIANT1 + { + if (IFopArc == 1) box1.Add( zob3d->Value(Ufin) ); + else box2.Add( zob3d->Value(Ufin) ); + } +#else + { + // cut off existing Arcprol + Standard_Integer iArcprol = DStr.AddShape(Arcprol); + interfprol = ChFi3d_FilPointInDS(OVtx,iArcprol,icc,Udeb); + DStr.ChangeShapeInterferences(Arcprol).Append(interfprol); + } +#endif + } //if (onsame && inters) + ChFi3d_EnlargeBox(DStr,stripe,Fd,box1,box2,isfirst); if (CV1.IsOnArc()) { ChFi3d_EnlargeBox(CV1.Arc(),myEFMap(CV1.Arc()),CV1.ParameterOnArc(),box1); diff --git a/src/ChFi3d/ChFi3d_Builder_C2.cxx b/src/ChFi3d/ChFi3d_Builder_C2.cxx index 381eb21448..2c55fb9311 100644 --- a/src/ChFi3d/ChFi3d_Builder_C2.cxx +++ b/src/ChFi3d/ChFi3d_Builder_C2.cxx @@ -94,6 +94,8 @@ #include #include #include +#include +#include static void Reduce(const Standard_Real& p1, const Standard_Real& p2, @@ -146,6 +148,8 @@ Standard_Boolean ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer done = 0; const TopoDS_Vertex& Vtx = myVDataMap.FindKey(Index); TopOpeBRepDS_DataStructure& DStr = myDS->ChangeDS(); + BRep_Builder BB; + TopoDS_Vertex Vertices [3]; //Information on fillets is extracted //------------------------------------------------------ @@ -161,6 +165,9 @@ Standard_Boolean ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer ChFiDS_SequenceOfSurfData& SeqFil1 = Corner1->ChangeSetOfSurfData()->ChangeSequence(); Handle(ChFiDS_SurfData)& Fd1 = SeqFil1.ChangeValue(IFd1); + //jgv + Standard_Integer IndexOfNewFace1 = Fd1->IndexOfFace(); + ///// //the second //---------- @@ -176,6 +183,9 @@ Standard_Boolean ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer ChFiDS_SequenceOfSurfData& SeqFil2 = Corner2->ChangeSetOfSurfData()->ChangeSequence(); Handle(ChFiDS_SurfData)& Fd2 = SeqFil2.ChangeValue(IFd2); + //jgv + Standard_Integer IndexOfNewFace2 = Fd2->IndexOfFace(); + ///// // The concavities are analysed in case of differents concavities, // preview an evolutionary connection of type ThreeCorner of R to 0. @@ -265,7 +275,7 @@ Standard_Boolean ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer } gp_Pnt psp1 = Hpivot->Value(parCP1); gp_Pnt psp2 = Hpivot->Value(parCP2); - Standard_Real sameparam = (psp1.Distance(psp2) < 10 * tolesp); + Standard_Boolean sameparam = (psp1.Distance(psp2) < 10 * tolesp); TopoDS_Face FF1 = TopoDS::Face(DStr.Shape(Fd1->Index(IFaArc1))); TopoDS_Face FF2 = TopoDS::Face(DStr.Shape(Fd2->Index(IFaArc2))); @@ -346,6 +356,54 @@ Standard_Boolean ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer // CornerData are updated with results of the intersection. Standard_Real WFirst = Gc->FirstParameter(); Standard_Real WLast = Gc->LastParameter(); + + //jgv + ChFiDS_FaceInterference& InterfArc1 = Fd1->ChangeInterference(IFaArc1); + Standard_Integer IndEarc1 = Fd1->IndexOfEdge(IFaArc1); + TopoDS_Edge EdgeArc1 = TopoDS::Edge(myNewEdges(IndEarc1)); + EdgeArc1.Orientation(TopAbs_FORWARD); + Standard_Real fpar, lpar; + Handle(Geom_Curve) CurveEdgeArc1 = BRep_Tool::Curve(EdgeArc1, fpar, lpar); + if (isfirst1) + fpar = InterfArc1.FirstParameter(); + else + lpar = InterfArc1.LastParameter(); + BB.Range(EdgeArc1, fpar, lpar); + Vertices[1] = (isfirst1)? TopExp::FirstVertex(EdgeArc1) + : TopExp::LastVertex(EdgeArc1); + gp_Pnt aPnt = CurveEdgeArc1->Value((isfirst1)? fpar : lpar); + if (Vertices[1].IsNull()) + { + Vertices[1] = BRepLib_MakeVertex(aPnt); + TopAbs_Orientation OrOfVer = TopAbs_FORWARD; + if (!isfirst1) + OrOfVer = TopAbs_REVERSED; + BB.Add(EdgeArc1, Vertices[1].Oriented(OrOfVer)); + } + else + BB.UpdateVertex(Vertices[1], aPnt, 0.); + + ChFiDS_FaceInterference& InterfArc2 = Fd2->ChangeInterference(IFaArc2); + Standard_Integer IndEarc2 = Fd2->IndexOfEdge(IFaArc2); + TopoDS_Edge EdgeArc2 = TopoDS::Edge(myNewEdges(IndEarc2)); + EdgeArc2.Orientation(TopAbs_FORWARD); + Handle(Geom_Curve) CurveEdgeArc2 = BRep_Tool::Curve(EdgeArc2, fpar, lpar); + if (isfirst2) + fpar = InterfArc2.FirstParameter(); + else + lpar = InterfArc2.LastParameter(); + BB.Range(EdgeArc2, fpar, lpar); + TopoDS_Vertex aVertexArc2 = (isfirst2)? TopExp::FirstVertex(EdgeArc2) + : TopExp::LastVertex(EdgeArc2); + if (!aVertexArc2.IsSame(Vertices[1])) + { + BB.Remove(EdgeArc2, aVertexArc2); + TopAbs_Orientation OrOfVer = TopAbs_FORWARD; + if (!isfirst2) + OrOfVer = TopAbs_REVERSED; + BB.Add(EdgeArc2, Vertices[1].Oriented(OrOfVer)); + } + ///// Standard_Integer Ipoin1; Standard_Integer Ipoin2; ChFiDS_CommonPoint& cpco1 = Fd1->ChangeVertex(isfirst1,IFaCo1); @@ -363,6 +421,32 @@ Standard_Boolean ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer cpco1.SetPoint(PFaCo); cpco1.SetTolerance(Max(tolreached,tolpco)); Fd1->ChangeInterference(IFaCo1).SetParameter(UIntPC1,isfirst1); + //jgv + ChFiDS_FaceInterference& Interf1 = Fd1->ChangeInterference(IFaCo1); + Standard_Integer IndEsurf1 = Fd1->IndexOfEdge(IFaCo1); + TopoDS_Edge EdgeSurf1 = TopoDS::Edge(myNewEdges(IndEsurf1)); + EdgeSurf1.Orientation(TopAbs_FORWARD); + Handle(Geom_Curve) CurveEdgeSurf1 = BRep_Tool::Curve(EdgeSurf1, fpar, lpar); + //BRep_Tool::Range(EdgeSurf, fpar, lpar); + if (isfirst1) + fpar = Interf1.FirstParameter(); + else + lpar = Interf1.LastParameter(); + BB.Range(EdgeSurf1, fpar, lpar); + Vertices[2] = (isfirst1)? TopExp::FirstVertex(EdgeSurf1) + : TopExp::LastVertex(EdgeSurf1); + aPnt = CurveEdgeSurf1->Value((isfirst1)? fpar : lpar); + if (Vertices[2].IsNull()) + { + Vertices[2] = BRepLib_MakeVertex(aPnt); + TopAbs_Orientation OrOfVer = TopAbs_FORWARD; + if (!isfirst1) + OrOfVer = TopAbs_REVERSED; + BB.Add(EdgeSurf1, Vertices[2].Oriented(OrOfVer)); + } + else + BB.UpdateVertex(Vertices[2], aPnt, 0.); + ///// tolparc = Max(tolparc,tolreached); cparc1.SetTolerance(Max(tolparc,tolreached)); Ipoin1 = ChFi3d_IndexPointInDS(Fd1->Vertex(isfirst1,1),DStr); @@ -374,6 +458,69 @@ Standard_Boolean ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer Corner2->SetCurve(ICurv,isfirst2); Corner2->ChangePCurve(isfirst2) = PGc2; Fd2->ChangeInterference(IFaCo2).SetParameter(UIntPC2,isfirst2); + //jgv + ChFiDS_FaceInterference& Interf2 = Fd2->ChangeInterference(IFaCo2); + Standard_Integer IndEsurf2 = Fd2->IndexOfEdge(IFaCo2); + TopoDS_Edge EdgeSurf2 = TopoDS::Edge(myNewEdges(IndEsurf2)); + EdgeSurf2.Orientation(TopAbs_FORWARD); + Handle(Geom_Curve) CurveEdgeSurf2 = BRep_Tool::Curve(EdgeSurf2, fpar, lpar); + //BRep_Tool::Range(EdgeSurf, fpar, lpar); + if (isfirst2) + fpar = Interf2.FirstParameter(); + else + lpar = Interf2.LastParameter(); + BB.Range(EdgeSurf2, fpar, lpar); + TopoDS_Vertex aVertex2 = (isfirst2)? TopExp::FirstVertex(EdgeSurf2) + : TopExp::LastVertex(EdgeSurf2); + if (!aVertex2.IsSame(Vertices[2])) + { + BB.Remove(EdgeSurf2, aVertex2); + TopAbs_Orientation OrOfVer = TopAbs_FORWARD; + if (!isfirst2) + OrOfVer = TopAbs_REVERSED; + BB.Add(EdgeSurf2, Vertices[2].Oriented(OrOfVer)); + } + + //Create new edge + gp_Pnt aPntVer = BRep_Tool::Pnt(Vertices[IFaArc1]); + gp_Pnt aPntFromCurve = Gc->Value(WFirst); + Standard_Real aDist = aPntVer.Distance(aPntFromCurve); + BB.UpdateVertex(Vertices[IFaArc1], 1.01*aDist); + TopoDS_Edge aNewEdge = BRepLib_MakeEdge(Gc, + Vertices[IFaArc1], Vertices[IFaCo1], + WFirst, WLast); + BB.UpdateEdge(aNewEdge, tolreached); + TopLoc_Location aLoc; + BB.UpdateEdge(aNewEdge, PGc1, DStr.Surface(Fd1->Surf()).Surface(), aLoc, 0.); + BB.UpdateEdge(aNewEdge, PGc2, DStr.Surface(Fd2->Surf()).Surface(), aLoc, 0.); + myNewEdges.Add(aNewEdge); + //Temporary + //TopAbs_Orientation Or1 = Fd1->Orientation(); + //TopAbs_Orientation Or2 = Fd2->Orientation(); + /////////// + Standard_Integer IndE = myNewEdges.FindIndex(aNewEdge); + Standard_Boolean IsFirstArcForward = Standard_True; + const TColStd_ListOfInteger& Elist = myFaceNewEdges.FindFromKey(IndexOfNewFace1); + TColStd_ListIteratorOfListOfInteger itl(Elist); + for (; itl.More(); itl.Next()) + { + Standard_Integer anIndexOfEdge = itl.Value(); + if (Abs(anIndexOfEdge) == IndEarc1) + { + IsFirstArcForward = (anIndexOfEdge > 0); + break; + } + } + if ((isfirst1 && IFaArc1 == 1 && IsFirstArcForward) || + (!isfirst1 && IFaArc1 == 2 && IsFirstArcForward)) + IndE *= -1; + //QualifiedEdge aQE(IndE, Et); + myFaceNewEdges.ChangeFromKey(IndexOfNewFace1).Append(IndE); + Standard_Integer IndE_forNewFace2 = IndE; + if (Fd1->Orientation() == Fd2->Orientation()) + IndE_forNewFace2 *= -1; + myFaceNewEdges.ChangeFromKey(IndexOfNewFace2).Append(IndE_forNewFace2); + ///// Fd2->ChangeVertex(isfirst2,IFaCo2) = Fd1->Vertex(isfirst1,IFaCo1); Fd2->ChangeVertex(isfirst2,IFaArc2) = Fd1->Vertex(isfirst1,IFaArc1); if (IFaCo1!=IFaCo2) Corner2->SetOrientation(TopAbs_REVERSED,isfirst2); @@ -414,6 +561,7 @@ Standard_Boolean ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer Standard_Integer IFaCoBig, IFaCoSma, IFaArcBig, IFaArcSma; Standard_Boolean isfirstBig, isfirstSma; Standard_Real UIntPCBig, UIntPCSma; + Standard_Integer IndexOfSmaNewFace, IndexOfBigNewFace; if((parcrois && parCP2 > parCP1) || (!parcrois && parCP2 < parCP1)){ UIntPCBig = UIntPC2; UIntPCSma = UIntPC1; @@ -423,6 +571,7 @@ Standard_Boolean ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer IFaCoBig = IFaCo2; IFaCoSma = IFaCo1; IFaArcBig = IFaArc2; IFaArcSma = IFaArc1; isfirstBig = isfirst2; isfirstSma = isfirst1; + IndexOfSmaNewFace = IndexOfNewFace1; IndexOfBigNewFace = IndexOfNewFace2; } else{ UIntPCBig = UIntPC1, UIntPCSma = UIntPC2; @@ -432,6 +581,7 @@ Standard_Boolean ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer IFaCoBig = IFaCo1; IFaCoSma = IFaCo2; IFaArcBig = IFaArc1; IFaArcSma = IFaArc2; isfirstBig = isfirst1; isfirstSma = isfirst2; + IndexOfSmaNewFace = IndexOfNewFace2; IndexOfBigNewFace = IndexOfNewFace1; } //Intersection of the big with the small : @@ -511,10 +661,62 @@ Standard_Boolean ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer psmaco.SetPoint(PFaCo); psmaco.SetTolerance(Max(tolpco,tolreached)); SmaFD->ChangeInterference(IFaCoSma).SetParameter(UIntPCSma,isfirstSma); + //jgv + ChFiDS_FaceInterference& SmaInterf = SmaFD->ChangeInterference(IFaCoSma); + Standard_Integer IndEsmall = SmaFD->IndexOfEdge(IFaCoSma); + TopoDS_Edge EdgeSmall = TopoDS::Edge(myNewEdges(IndEsmall)); + EdgeSmall.Orientation(TopAbs_FORWARD); + Standard_Real fpar, lpar; + Handle(Geom_Curve) CurveEdgeSma = BRep_Tool::Curve(EdgeSmall, fpar, lpar); + //BRep_Tool::Range(EdgeSmall, fpar, lpar); + if (isfirstSma) + fpar = SmaInterf.FirstParameter(); + else + lpar = SmaInterf.LastParameter(); + BB.Range(EdgeSmall, fpar, lpar); + Vertices[2] = (isfirstSma)? TopExp::FirstVertex(EdgeSmall) + : TopExp::LastVertex(EdgeSmall); + gp_Pnt aPnt = CurveEdgeSma->Value((isfirstSma)? fpar : lpar); + if (Vertices[2].IsNull()) + { + Vertices[2] = BRepLib_MakeVertex(aPnt); + TopAbs_Orientation OrOfVer = TopAbs_FORWARD; + if (!isfirstSma) + OrOfVer = TopAbs_REVERSED; + BB.Add(EdgeSmall, Vertices[2].Oriented(OrOfVer)); + } + else + BB.UpdateVertex(Vertices[2], aPnt, 0.); + ///// psmamil.Reset(); psmamil.SetPoint(PMil); psmamil.SetTolerance(Max(tolpmil,tolreached)); SmaFD->ChangeInterference(IFaArcSma).SetParameter(wi,isfirstSma); + //jgv + ChFiDS_FaceInterference& SmaArcInterf = SmaFD->ChangeInterference(IFaArcSma); + Standard_Integer IndEarcsmall = SmaFD->IndexOfEdge(IFaArcSma); + TopoDS_Edge EdgeArcSmall = TopoDS::Edge(myNewEdges(IndEarcsmall)); + EdgeArcSmall.Orientation(TopAbs_FORWARD); + Handle(Geom_Curve) CurveEdgeArcSma = BRep_Tool::Curve(EdgeArcSmall, fpar, lpar); + if (isfirstSma) + fpar = SmaArcInterf.FirstParameter(); + else + lpar = SmaArcInterf.LastParameter(); + BB.Range(EdgeArcSmall, fpar, lpar); + Vertices[1] = (isfirstSma)? TopExp::FirstVertex(EdgeArcSmall) + : TopExp::LastVertex(EdgeArcSmall); + aPnt = CurveEdgeArcSma->Value((isfirstSma)? fpar : lpar); + if (Vertices[1].IsNull()) + { + Vertices[1] = BRepLib_MakeVertex(aPnt); + TopAbs_Orientation OrOfVer = TopAbs_FORWARD; + if (!isfirstSma) + OrOfVer = TopAbs_REVERSED; + BB.Add(EdgeArcSmall, Vertices[1].Oriented(OrOfVer)); + } + else + BB.UpdateVertex(Vertices[1], aPnt, 0.); + ///// IpointCo = ChFi3d_IndexPointInDS(psmaco,DStr); SmaCD->SetIndexPoint(IpointCo,isfirstSma,IFaCoSma); IpointMil = ChFi3d_IndexPointInDS(psmamil,DStr); @@ -525,6 +727,87 @@ Standard_Boolean ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer BigCD->SetIndexPoint(IpointCo,isfirstBig,IFaCoBig); BigFD->ChangeVertex(isfirstBig,IFaCoBig) = psmaco; BigFD->ChangeInterference(IFaCoBig).SetParameter(UIntPCBig,isfirstBig); + //jgv + ChFiDS_FaceInterference& BigInterf = BigFD->ChangeInterference(IFaCoBig); + Standard_Integer IndEbig = BigFD->IndexOfEdge(IFaCoBig); + TopoDS_Edge EdgeBig = TopoDS::Edge(myNewEdges(IndEbig)); + EdgeBig.Orientation(TopAbs_FORWARD); + + //??? + TopoDS_Vertex BigVer [3]; + Handle(Geom_Curve) CurveEdgeBig = BRep_Tool::Curve(EdgeBig, fpar, lpar); + //BRep_Tool::Range(EdgeBig, fpar, lpar); + if (isfirstBig) + fpar = BigInterf.FirstParameter(); + else + lpar = BigInterf.LastParameter(); + BB.Range(EdgeBig, fpar, lpar); + BigVer[2] = (isfirstBig)? TopExp::FirstVertex(EdgeBig) + : TopExp::LastVertex(EdgeBig); + aPnt = CurveEdgeBig->Value((isfirstBig)? fpar : lpar); + //if (BigVer[2].IsNull()) + if (!BigVer[2].IsSame(Vertices[2])) + { + //BigVer[2] = BRepLib_MakeVertex(aPnt); + BB.Remove(EdgeBig, BigVer[2]); + TopAbs_Orientation OrOfVer = TopAbs_FORWARD; + if (!isfirstBig) + OrOfVer = TopAbs_REVERSED; + BB.Add(EdgeBig, Vertices[2].Oriented(OrOfVer)); + } + ///// + + ChFiDS_FaceInterference& BigArcInterf = BigFD->ChangeInterference(IFaArcBig); + Standard_Integer IndEarcbig = BigFD->IndexOfEdge(IFaArcBig); + TopoDS_Edge EdgeArcBig = TopoDS::Edge(myNewEdges(IndEarcbig)); + EdgeArcBig.Orientation(TopAbs_FORWARD); + + //??? + Handle(Geom_Curve) CurveEdgeArcBig = BRep_Tool::Curve(EdgeArcBig, fpar, lpar); + if (isfirstBig) + fpar = BigArcInterf.FirstParameter(); + else + lpar = BigArcInterf.LastParameter(); + BB.Range(EdgeArcBig, fpar, lpar); + BigVer[1] = (isfirstBig)? TopExp::FirstVertex(EdgeArcBig) + : TopExp::LastVertex(EdgeArcBig); + aPnt = CurveEdgeArcBig->Value((isfirstBig)? fpar : lpar); + if (BigVer[1].IsNull()) + { + BigVer[1] = BRepLib_MakeVertex(aPnt); + TopAbs_Orientation OrOfVer = TopAbs_FORWARD; + if (!isfirstBig) + OrOfVer = TopAbs_REVERSED; + BB.Add(EdgeArcBig, BigVer[1].Oriented(OrOfVer)); + } + else + BB.UpdateVertex(BigVer[1], aPnt, 0.); + ///// + + //Create new edge + gp_Pnt aPntVer = BRep_Tool::Pnt(Vertices[2]); + gp_Pnt aPntFromCurve = Gc->Value(WFirst); + Standard_Real aDist = aPntVer.Distance(aPntFromCurve); + BB.UpdateVertex(Vertices[2], 1.01*aDist); + TopoDS_Edge aNewEdge = BRepLib_MakeEdge(Gc, + Vertices[2], Vertices[1], + WFirst, WLast); + BB.UpdateEdge(aNewEdge, tolreached); + TopLoc_Location aLoc; + BB.UpdateEdge(aNewEdge, PGc1, DStr.Surface(SmaFD->Surf()).Surface(), aLoc, 0.); + BB.UpdateEdge(aNewEdge, PGc2, DStr.Surface(BigFD->Surf()).Surface(), aLoc, 0.); + myNewEdges.Add(aNewEdge); + Standard_Integer IndE = myNewEdges.FindIndex(aNewEdge); + if (isfirstSma && IFaArcSma == 1 || + !isfirstSma && IFaArcSma == 2) + IndE *= -1; + //QualifiedEdge aQE(IndE, Et); + myFaceNewEdges.ChangeFromKey(IndexOfSmaNewFace).Append(IndE); + Standard_Integer IndE_forBigNewFace = IndE; + if (SmaFD->Orientation() == BigFD->Orientation()) + IndE_forBigNewFace *= -1; + myFaceNewEdges.ChangeFromKey(IndexOfBigNewFace).Append(IndE_forBigNewFace); + ///// TopOpeBRepDS_ListOfInterference& Li = DStr.ChangeCurveInterferences(ICurv); Handle(TopOpeBRepDS_CurvePointInterference) Interfp; @@ -619,6 +902,37 @@ Standard_Boolean ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer // End of update of the BigCD and the DS. WFirst = Gc->FirstParameter(); WLast = Gc->LastParameter(); + + //Create additional new edge + TopoDS_Edge anAdditionalNewEdge = BRepLib_MakeEdge(Gc, + Vertices[1], BigVer[1], + WFirst, WLast); + BB.UpdateEdge(anAdditionalNewEdge, tolreached); + BB.UpdateEdge(anAdditionalNewEdge, PGc1, F, 0.); + BB.UpdateEdge(anAdditionalNewEdge, PGc2, DStr.Surface(BigFD->Surf()).Surface(), aLoc, 0.); + myNewEdges.Add(anAdditionalNewEdge); + IndE = myNewEdges.FindIndex(anAdditionalNewEdge); + if (IndE_forBigNewFace < 0) + IndE *= -1; + //QualifiedEdge aQE(IndE, Et); + myFaceNewEdges.ChangeFromKey(IndexOfBigNewFace).Append(IndE); + Standard_Integer IndE_forOldFace = IndE; + if (BigFD->Orientation() == F.Orientation()) + IndE_forOldFace *= -1; + + Standard_Integer IndF; + if (!myNewFaces.Contains(F)) + myNewFaces.Add(F); + IndF = myNewFaces.FindIndex(F); + if (!myFaceNewEdges.Contains(IndF)) + { + //ChFi3d_ListOfQualifiedEdge aList; + TColStd_ListOfInteger aList; + myFaceNewEdges.Add(IndF, aList); + } + myFaceNewEdges.ChangeFromKey(IndF).Append(IndE_forOldFace); + ///// + ICurv = DStr.AddCurve(TopOpeBRepDS_Curve(Gc,tolreached)); cpend.SetTolerance(Max(cpend.Tolerance(),tolreached)); IpointArc = ChFi3d_IndexPointInDS(cpend,DStr); diff --git a/src/ChFiDS/ChFiDS_SurfData.cxx b/src/ChFiDS/ChFiDS_SurfData.cxx index c08f399e59..fc4425a5bf 100644 --- a/src/ChFiDS/ChFiDS_SurfData.cxx +++ b/src/ChFiDS/ChFiDS_SurfData.cxx @@ -24,9 +24,11 @@ IMPLEMENT_STANDARD_RTTIEXT(ChFiDS_SurfData,Standard_Transient) -ChFiDS_SurfData::ChFiDS_SurfData () : -indexOfS1(0),indexOfS2(0),indexOfConge(0), -isoncurv1(0),isoncurv2(0),twistons1(0),twistons2(0) +ChFiDS_SurfData::ChFiDS_SurfData () +: indexOfS1(0),indexOfS2(0), + indexOfE1(0),indexOfE2(0), + indexOfConge(0), + isoncurv1(0),isoncurv2(0),twistons1(0),twistons2(0) {} //======================================================================= @@ -38,6 +40,8 @@ void ChFiDS_SurfData::Copy(const Handle(ChFiDS_SurfData)& Other) { indexOfS1 = Other->indexOfS1; indexOfS2 = Other->indexOfS2; +indexOfE1 = Other->indexOfE1; +indexOfE2 = Other->indexOfE2; indexOfConge = Other->indexOfConge; orientation = Other->orientation; intf1 = Other->intf1; @@ -75,6 +79,19 @@ Standard_Integer ChFiDS_SurfData::Index(const Standard_Integer OfS) const else return indexOfS2; } +//======================================================================= +//function : IndexOfEdge +//purpose : +//======================================================================= + +inline Standard_Integer ChFiDS_SurfData::IndexOfEdge(const Standard_Integer OnS) const +{ + if (OnS == 1) + return indexOfE1; + else + return indexOfE2; +} + //======================================================================= //function : Interference //purpose : @@ -87,9 +104,8 @@ const ChFiDS_FaceInterference& ChFiDS_SurfData::Interference else return intf2; } - //======================================================================= -//function : Interference +//function : ChangeInterference //purpose : //======================================================================= diff --git a/src/ChFiDS/ChFiDS_SurfData.hxx b/src/ChFiDS/ChFiDS_SurfData.hxx index 4229f7fb13..87ac0a938a 100644 --- a/src/ChFiDS/ChFiDS_SurfData.hxx +++ b/src/ChFiDS/ChFiDS_SurfData.hxx @@ -81,6 +81,12 @@ public: void ChangeIndexOfS2 (const Standard_Integer Index); + void ChangeIndexOfFace (const Standard_Integer Index); + + void ChangeIndexOfE1 (const Standard_Integer Index); + + void ChangeIndexOfE2 (const Standard_Integer Index); + void ChangeSurf (const Standard_Integer Index); void SetIndexOfC1 (const Standard_Integer Index); @@ -105,8 +111,12 @@ public: Standard_EXPORT ChFiDS_FaceInterference& ChangeInterference (const Standard_Integer OnS); + Standard_EXPORT Standard_Integer IndexOfFace () const; + Standard_EXPORT Standard_Integer Index (const Standard_Integer OfS) const; + Standard_EXPORT Standard_Integer IndexOfEdge(const Standard_Integer OfS) const; + //! returns one of the four vertices wether First is true //! or wrong and OnS equals 1 or 2. Standard_EXPORT const ChFiDS_CommonPoint& Vertex (const Standard_Boolean First, const Standard_Integer OnS) const; @@ -187,7 +197,11 @@ private: Standard_Integer indexOfC1; Standard_Integer indexOfS2; Standard_Integer indexOfC2; + Standard_Integer indexOfE1; + Standard_Integer indexOfE2; + Standard_Integer indexOfFace; Standard_Integer indexOfConge; + Standard_Boolean isoncurv1; Standard_Boolean isoncurv2; Standard_Boolean twistons1; diff --git a/src/ChFiDS/ChFiDS_SurfData.lxx b/src/ChFiDS/ChFiDS_SurfData.lxx index 06b562ec70..86fd1f4771 100644 --- a/src/ChFiDS/ChFiDS_SurfData.lxx +++ b/src/ChFiDS/ChFiDS_SurfData.lxx @@ -98,6 +98,16 @@ inline void ChFiDS_SurfData::SetIndexOfC2 (const Standard_Integer theIndex) isoncurv2 = (theIndex != 0); } +//======================================================================= +//function : IndexOfFace +//purpose : +//======================================================================= + +inline Standard_Integer ChFiDS_SurfData::IndexOfFace()const +{ + return indexOfFace; +} + //======================================================================= //function : Surf //purpose : @@ -201,6 +211,36 @@ inline void ChFiDS_SurfData::ChangeIndexOfS2(const Standard_Integer Index) indexOfS2 = Index; } +//======================================================================= +//function : ChangeIndexOfFace +//purpose : +//======================================================================= + +inline void ChFiDS_SurfData::ChangeIndexOfFace(const Standard_Integer Index) +{ + indexOfFace = Index; +} + +//======================================================================= +//function : ChangeIndexOfE1 +//purpose : +//======================================================================= + +inline void ChFiDS_SurfData::ChangeIndexOfE1(const Standard_Integer Index) +{ + indexOfE1 = Index; +} + +//======================================================================= +//function : ChangeIndexOfE2 +//purpose : +//======================================================================= + +inline void ChFiDS_SurfData::ChangeIndexOfE2(const Standard_Integer Index) +{ + indexOfE2 = Index; +} + //======================================================================= //function : ChangeSurf //purpose : diff --git a/src/ChFiKPart/ChFiKPart_ComputeData.cxx b/src/ChFiKPart/ChFiKPart_ComputeData.cxx index efd8213bfe..ad51abf11b 100644 --- a/src/ChFiKPart/ChFiKPart_ComputeData.cxx +++ b/src/ChFiKPart/ChFiKPart_ComputeData.cxx @@ -82,6 +82,8 @@ #include #include #include +#include +#include //#include //#include @@ -91,9 +93,15 @@ //======================================================================= Standard_Boolean ChFiKPart_ComputeData::Compute (TopOpeBRepDS_DataStructure& DStr, + TopTools_IndexedMapOfShape& theNewFaces, + TopTools_IndexedMapOfShape& theNewEdges, + NCollection_IndexedDataMap& theFaceNewEdges, + TColStd_MapOfInteger& theIndsChFiFaces, Handle(ChFiDS_SurfData)& Data, - const Handle(Adaptor3d_HSurface)& S1, - const Handle(Adaptor3d_HSurface)& S2, + //const Handle(Adaptor3d_HSurface)& S1, + //const Handle(Adaptor3d_HSurface)& S2, + const Handle(BRepAdaptor_HSurface)& S1, + const Handle(BRepAdaptor_HSurface)& S2, const TopAbs_Orientation Or1, const TopAbs_Orientation Or2, const Handle(ChFiDS_Spine)& Sp, @@ -115,15 +123,16 @@ // Return orientations. TopAbs_Orientation OrFace1 = TopAbs_FORWARD, OrFace2 = TopAbs_FORWARD; - Handle(BRepAdaptor_HSurface) HS = Handle(BRepAdaptor_HSurface)::DownCast(S1); - if (!HS.IsNull()) OrFace1 = HS->ChangeSurface().Face().Orientation(); - HS = Handle(BRepAdaptor_HSurface)::DownCast(S2); - if (!HS.IsNull()) OrFace2 = HS->ChangeSurface().Face().Orientation(); + //Handle(BRepAdaptor_HSurface) HS = Handle(BRepAdaptor_HSurface)::DownCast(S1); + OrFace1 = S1->ChangeSurface().Face().Orientation(); + //HS = Handle(BRepAdaptor_HSurface)::DownCast(S2); + OrFace2 = S2->ChangeSurface().Face().Orientation(); if(!Spine.IsNull()){ Standard_Real Radius = Spine->Radius(Iedge); if ( typ1 == GeomAbs_Plane && typ2 == GeomAbs_Plane ){ - surfok = ChFiKPart_MakeFillet(DStr,Data,S1->Plane(),S2->Plane(), + surfok = ChFiKPart_MakeFillet(DStr,theNewFaces,theNewEdges,theFaceNewEdges,theIndsChFiFaces, + Data,S1,S2, Or1,Or2,Radius,Spine->Line(), Wref,OrFace1); } diff --git a/src/ChFiKPart/ChFiKPart_ComputeData.hxx b/src/ChFiKPart/ChFiKPart_ComputeData.hxx index 7c14d98f12..b04b387c9a 100644 --- a/src/ChFiKPart/ChFiKPart_ComputeData.hxx +++ b/src/ChFiKPart/ChFiKPart_ComputeData.hxx @@ -25,9 +25,16 @@ #include #include #include + +#include +#include +#include +#include + class TopOpeBRepDS_DataStructure; class ChFiDS_SurfData; class Adaptor3d_HSurface; +class BRepAdaptor_HSurface; class ChFiDS_Spine; class gp_Pnt2d; @@ -49,16 +56,62 @@ public: //! Computes a simple fillet in several particular //! cases. - Standard_EXPORT static Standard_Boolean Compute (TopOpeBRepDS_DataStructure& DStr, Handle(ChFiDS_SurfData)& Data, const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_HSurface)& S2, const TopAbs_Orientation Or1, const TopAbs_Orientation Or2, const Handle(ChFiDS_Spine)& Sp, const Standard_Integer Iedge); + Standard_EXPORT static Standard_Boolean Compute (TopOpeBRepDS_DataStructure& DStr, + TopTools_IndexedMapOfShape& theNewFaces, + TopTools_IndexedMapOfShape& theNewEdges, + NCollection_IndexedDataMap& theFaceNewEdges, + TColStd_MapOfInteger& theIndsChFiFaces, + Handle(ChFiDS_SurfData)& Data, + //const Handle(Adaptor3d_HSurface)& S1, + //const Handle(Adaptor3d_HSurface)& S2, + const Handle(BRepAdaptor_HSurface)& S1, + const Handle(BRepAdaptor_HSurface)& S2, + const TopAbs_Orientation Or1, + const TopAbs_Orientation Or2, + const Handle(ChFiDS_Spine)& Sp, + const Standard_Integer Iedge); //! Computes a toric or spheric corner fillet. - Standard_EXPORT static Standard_Boolean ComputeCorner (TopOpeBRepDS_DataStructure& DStr, const Handle(ChFiDS_SurfData)& Data, const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_HSurface)& S2, const TopAbs_Orientation OrFace1, const TopAbs_Orientation OrFace2, const TopAbs_Orientation Or1, const TopAbs_Orientation Or2, const Standard_Real minRad, const Standard_Real majRad, const gp_Pnt2d& P1S1, const gp_Pnt2d& P2S1, const gp_Pnt2d& P1S2, const gp_Pnt2d& P2S2); + Standard_EXPORT static Standard_Boolean ComputeCorner (TopOpeBRepDS_DataStructure& DStr, + const Handle(ChFiDS_SurfData)& Data, + const Handle(Adaptor3d_HSurface)& S1, + const Handle(Adaptor3d_HSurface)& S2, + const TopAbs_Orientation OrFace1, + const TopAbs_Orientation OrFace2, + const TopAbs_Orientation Or1, + const TopAbs_Orientation Or2, + const Standard_Real minRad, + const Standard_Real majRad, + const gp_Pnt2d& P1S1, + const gp_Pnt2d& P2S1, + const gp_Pnt2d& P1S2, + const gp_Pnt2d& P2S2); //! Computes spheric corner fillet with non iso pcurve on S2. - Standard_EXPORT static Standard_Boolean ComputeCorner (TopOpeBRepDS_DataStructure& DStr, const Handle(ChFiDS_SurfData)& Data, const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_HSurface)& S2, const TopAbs_Orientation OrFace1, const TopAbs_Orientation OrFace2, const TopAbs_Orientation Or1, const TopAbs_Orientation Or2, const Standard_Real Rad, const gp_Pnt2d& PS1, const gp_Pnt2d& P1S2, const gp_Pnt2d& P2S2); + Standard_EXPORT static Standard_Boolean ComputeCorner (TopOpeBRepDS_DataStructure& DStr, + const Handle(ChFiDS_SurfData)& Data, + const Handle(Adaptor3d_HSurface)& S1, + const Handle(Adaptor3d_HSurface)& S2, + const TopAbs_Orientation OrFace1, + const TopAbs_Orientation OrFace2, + const TopAbs_Orientation Or1, + const TopAbs_Orientation Or2, + const Standard_Real Rad, + const gp_Pnt2d& PS1, + const gp_Pnt2d& P1S2, + const gp_Pnt2d& P2S2); //! Computes a toric corner rotule. - Standard_EXPORT static Standard_Boolean ComputeCorner (TopOpeBRepDS_DataStructure& DStr, const Handle(ChFiDS_SurfData)& Data, const Handle(Adaptor3d_HSurface)& S, const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_HSurface)& S2, const TopAbs_Orientation OfS, const TopAbs_Orientation OS, const TopAbs_Orientation OS1, const TopAbs_Orientation OS2, const Standard_Real Radius); + Standard_EXPORT static Standard_Boolean ComputeCorner (TopOpeBRepDS_DataStructure& DStr, + const Handle(ChFiDS_SurfData)& Data, + const Handle(Adaptor3d_HSurface)& S, + const Handle(Adaptor3d_HSurface)& S1, + const Handle(Adaptor3d_HSurface)& S2, + const TopAbs_Orientation OfS, + const TopAbs_Orientation OS, + const TopAbs_Orientation OS1, + const TopAbs_Orientation OS2, + const Standard_Real Radius); diff --git a/src/ChFiKPart/ChFiKPart_ComputeData_FilPlnPln.cxx b/src/ChFiKPart/ChFiKPart_ComputeData_FilPlnPln.cxx index cf7a499565..dd025f35c1 100644 --- a/src/ChFiKPart/ChFiKPart_ComputeData_FilPlnPln.cxx +++ b/src/ChFiKPart/ChFiKPart_ComputeData_FilPlnPln.cxx @@ -15,7 +15,8 @@ // commercial license or contractual agreement. -#include +//#include +#include #include #include #include @@ -40,15 +41,25 @@ #include #include #include +#include +#include +#include +#include //======================================================================= //function : MakeFillet //Purpose : cas plan/plan. //======================================================================= Standard_Boolean ChFiKPart_MakeFillet(TopOpeBRepDS_DataStructure& DStr, + TopTools_IndexedMapOfShape& theNewFaces, + TopTools_IndexedMapOfShape& theNewEdges, + NCollection_IndexedDataMap& theFaceNewEdges, + TColStd_MapOfInteger& theIndsChFiFaces, const Handle(ChFiDS_SurfData)& Data, - const gp_Pln& Pl1, - const gp_Pln& Pl2, + //const gp_Pln& Pl1, + //const gp_Pln& Pl2, + const Handle(BRepAdaptor_HSurface)& S1, + const Handle(BRepAdaptor_HSurface)& S2, const TopAbs_Orientation Or1, const TopAbs_Orientation Or2, const Standard_Real Radius, @@ -56,6 +67,28 @@ Standard_Boolean ChFiKPart_MakeFillet(TopOpeBRepDS_DataStructure& DStr, const Standard_Real First, const TopAbs_Orientation Of1) { + Standard_Integer IndF1, IndF2; + if (!theNewFaces.Contains(S1->ChangeSurface().Face())) + theNewFaces.Add(S1->ChangeSurface().Face()); + IndF1 = theNewFaces.FindIndex(S1->ChangeSurface().Face()); + if (!theFaceNewEdges.Contains(IndF1)) + { + //ChFi3d_ListOfQualifiedEdge aList; + TColStd_ListOfInteger aList; + theFaceNewEdges.Add(IndF1, aList); + } + if (!theNewFaces.Contains(S2->ChangeSurface().Face())) + theNewFaces.Add(S2->ChangeSurface().Face()); + IndF2 = theNewFaces.FindIndex(S2->ChangeSurface().Face()); + if (!theFaceNewEdges.Contains(IndF2)) + { + //ChFi3d_ListOfQualifiedEdge aList; + TColStd_ListOfInteger aList; + theFaceNewEdges.Add(IndF2, aList); + } + + gp_Pln Pl1 = S1->Plane(); + gp_Pln Pl2 = S2->Plane(); //calcul du cylindre gp_Ax3 Pos1 = Pl1.Position(); @@ -146,6 +179,56 @@ Standard_Boolean ChFiKPart_MakeFillet(TopOpeBRepDS_DataStructure& DStr, Data->ChangeInterferenceOnS2(). SetInterference(ChFiKPart_IndexCurveInDS(GLinPln2,DStr), trans,GLin2dPln2,GLin2dCyl2); + + //Add new face and its new edges in the maps + BRep_Builder BB; + TopLoc_Location aLoc; + TopoDS_Face aNewFace; + BB.MakeFace(aNewFace); + BB.UpdateFace(aNewFace, gcyl, aLoc, Precision::Confusion()); + aNewFace.Orientation(Data->Orientation()); + Standard_Integer IndNewFace = theNewFaces.Add(aNewFace); + theIndsChFiFaces.Add(IndNewFace); + //ChFi3d_ListOfQualifiedEdge aList; + TColStd_ListOfInteger aList; + theFaceNewEdges.Add(IndNewFace, aList); + Data->ChangeIndexOfFace(IndNewFace); + + TopoDS_Edge Boundary1, Boundary2; + Boundary1 = BRepLib_MakeEdge(GLinPln1); + BB.UpdateEdge(Boundary1, GLin2dPln1, S1->ChangeSurface().Face(), 0.); + BB.UpdateEdge(Boundary1, GLin2dCyl1, aNewFace, 0.); + theNewEdges.Add(Boundary1); + + Standard_Integer IndE1 = theNewEdges.FindIndex(Boundary1); + Data->ChangeIndexOfE1(IndE1); + //QualifiedEdge aQE1(IndE1, Et); + if (Data->Orientation() == TopAbs_REVERSED) + IndE1 *= -1; + theFaceNewEdges.ChangeFromKey(IndF1).Append(IndE1); + Standard_Integer IndE1_forNewFace = IndE1; + if (Data->Orientation() == TopAbs_FORWARD) + IndE1_forNewFace *= -1; + //theFaceNewEdges.ChangeFromKey(IndNewFace).Append(-IndE1); + theFaceNewEdges.ChangeFromKey(IndNewFace).Append(IndE1_forNewFace); + + Boundary2 = BRepLib_MakeEdge(GLinPln2); + BB.UpdateEdge(Boundary2, GLin2dPln2, S2->ChangeSurface().Face(), 0.); + BB.UpdateEdge(Boundary2, GLin2dCyl2, aNewFace, 0.); + theNewEdges.Add(Boundary2); + + Standard_Integer IndE2 = theNewEdges.FindIndex(Boundary2); + Data->ChangeIndexOfE2(IndE2); + IndE2 *= -1; + if (Data->Orientation() == TopAbs_REVERSED) + IndE2 *= -1; + theFaceNewEdges.ChangeFromKey(IndF2).Append(IndE2); + Standard_Integer IndE2_forNewFace = IndE2; + if (Data->Orientation() == TopAbs_FORWARD) + IndE2_forNewFace *= -1; + //theFaceNewEdges.ChangeFromKey(IndNewFace).Append(-IndE2); + theFaceNewEdges.ChangeFromKey(IndNewFace).Append(IndE2_forNewFace); + return Standard_True; } diff --git a/src/ChFiKPart/ChFiKPart_ComputeData_FilPlnPln.hxx b/src/ChFiKPart/ChFiKPart_ComputeData_FilPlnPln.hxx index 1b5d087c08..0ef494818c 100644 --- a/src/ChFiKPart/ChFiKPart_ComputeData_FilPlnPln.hxx +++ b/src/ChFiKPart/ChFiKPart_ComputeData_FilPlnPln.hxx @@ -18,9 +18,15 @@ #define ChFiKPart_ComputeData_PlnPln_HeaderFile Standard_Boolean ChFiKPart_MakeFillet(TopOpeBRepDS_DataStructure& DStr, + TopTools_IndexedMapOfShape& theNewFaces, + TopTools_IndexedMapOfShape& theNewEdges, + NCollection_IndexedDataMap& theFaceNewEdges, + TColStd_MapOfInteger& theIndsChFiFaces, const Handle(ChFiDS_SurfData)& Data, - const gp_Pln& Pl1, - const gp_Pln& Pl2, + //const gp_Pln& Pl1, + //const gp_Pln& Pl2, + const Handle(BRepAdaptor_HSurface)& S1, + const Handle(BRepAdaptor_HSurface)& S2, const TopAbs_Orientation Or1, const TopAbs_Orientation Or2, const Standard_Real Radius, diff --git a/tests/blend/grids.list b/tests/blend/grids.list index b0e126a7e1..362435a824 100644 --- a/tests/blend/grids.list +++ b/tests/blend/grids.list @@ -5,3 +5,4 @@ 005 tolblend_buildvol 006 complex 007 encoderegularity +008 seam_and_degenerated \ No newline at end of file diff --git a/tests/blend/seam_and_degenerated/A1 b/tests/blend/seam_and_degenerated/A1 new file mode 100644 index 0000000000..49c178081c --- /dev/null +++ b/tests/blend/seam_and_degenerated/A1 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-5 +set volume 3.66429e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_1 + +checknbshapes result -solid 1 -shell 1 -face 5 -wire 5 -edge 14 -vertex 9 diff --git a/tests/blend/seam_and_degenerated/A10 b/tests/blend/seam_and_degenerated/A10 new file mode 100644 index 0000000000..6b238a375d --- /dev/null +++ b/tests/blend/seam_and_degenerated/A10 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-5 +set volume 3.66337e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_1 5 a_3 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 15 -vertex 10 diff --git a/tests/blend/seam_and_degenerated/A100 b/tests/blend/seam_and_degenerated/A100 new file mode 100644 index 0000000000..00b14f6b86 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A100 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-5 +set volume 3.66482e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_3 5 a_8 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 18 -vertex 12 diff --git a/tests/blend/seam_and_degenerated/A11 b/tests/blend/seam_and_degenerated/A11 new file mode 100644 index 0000000000..ca4d1bc715 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A11 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-5 +set volume 3.66337e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_1 5 a_6 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 15 -vertex 10 diff --git a/tests/blend/seam_and_degenerated/A12 b/tests/blend/seam_and_degenerated/A12 new file mode 100644 index 0000000000..8a7d7547b6 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A12 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-5 +set volume 3.66337e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_3 5 a_6 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 16 -vertex 10 diff --git a/tests/blend/seam_and_degenerated/A13 b/tests/blend/seam_and_degenerated/A13 new file mode 100644 index 0000000000..4e2fe38bff --- /dev/null +++ b/tests/blend/seam_and_degenerated/A13 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-7 +set volume 3.66592e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 3 a_7 5 a_8 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 17 -vertex 11 diff --git a/tests/blend/seam_and_degenerated/A13_1 b/tests/blend/seam_and_degenerated/A13_1 new file mode 100644 index 0000000000..181d8a3292 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A13_1 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-7 +set volume 3.66592e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_7 3 a_8 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 17 -vertex 11 diff --git a/tests/blend/seam_and_degenerated/A14 b/tests/blend/seam_and_degenerated/A14 new file mode 100644 index 0000000000..d8b2937431 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A14 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-7 +set volume 3.66592e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 3 a_7 5 a_9 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 16 -vertex 10 diff --git a/tests/blend/seam_and_degenerated/A14_1 b/tests/blend/seam_and_degenerated/A14_1 new file mode 100644 index 0000000000..b0e0a6e0ef --- /dev/null +++ b/tests/blend/seam_and_degenerated/A14_1 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-7 +set volume 3.66592e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_7 3 a_9 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 16 -vertex 10 diff --git a/tests/blend/seam_and_degenerated/A15 b/tests/blend/seam_and_degenerated/A15 new file mode 100644 index 0000000000..530a93c324 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A15 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-7 +set volume 3.66592e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 3 a_8 5 a_9 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 16 -vertex 10 diff --git a/tests/blend/seam_and_degenerated/A15_1 b/tests/blend/seam_and_degenerated/A15_1 new file mode 100644 index 0000000000..2953c0d285 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A15_1 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-7 +set volume 3.66592e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_8 3 a_9 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 16 -vertex 10 diff --git a/tests/blend/seam_and_degenerated/A16 b/tests/blend/seam_and_degenerated/A16 new file mode 100644 index 0000000000..77208f3934 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A16 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-5 +set volume 3.66397e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 3 a_1 5 a_3 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 17 -vertex 12 diff --git a/tests/blend/seam_and_degenerated/A16_1 b/tests/blend/seam_and_degenerated/A16_1 new file mode 100644 index 0000000000..fdd8174314 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A16_1 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-5 +set volume 3.66397e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_1 3 a_3 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 17 -vertex 12 diff --git a/tests/blend/seam_and_degenerated/A17 b/tests/blend/seam_and_degenerated/A17 new file mode 100644 index 0000000000..d202818d68 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A17 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-5 +set volume 3.66397e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 3 a_1 5 a_6 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 17 -vertex 12 diff --git a/tests/blend/seam_and_degenerated/A17_1 b/tests/blend/seam_and_degenerated/A17_1 new file mode 100644 index 0000000000..a22c27a528 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A17_1 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-5 +set volume 3.66397e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_1 3 a_6 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 17 -vertex 12 diff --git a/tests/blend/seam_and_degenerated/A18 b/tests/blend/seam_and_degenerated/A18 new file mode 100644 index 0000000000..bcd464942c --- /dev/null +++ b/tests/blend/seam_and_degenerated/A18 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-4 +set volume 3.66397e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 3 a_3 5 a_6 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 18 -vertex 12 diff --git a/tests/blend/seam_and_degenerated/A18_1 b/tests/blend/seam_and_degenerated/A18_1 new file mode 100644 index 0000000000..fcf9b0071d --- /dev/null +++ b/tests/blend/seam_and_degenerated/A18_1 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-4 +set volume 3.66397e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_3 3 a_6 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 18 -vertex 12 diff --git a/tests/blend/seam_and_degenerated/A19 b/tests/blend/seam_and_degenerated/A19 new file mode 100644 index 0000000000..d885a61777 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A19 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-7 +set volume 3.66625e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_3 5 a_9 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 16 -vertex 10 diff --git a/tests/blend/seam_and_degenerated/A2 b/tests/blend/seam_and_degenerated/A2 new file mode 100644 index 0000000000..dbbfcc7233 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A2 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-5 +set volume 3.66429e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_3 + +checknbshapes result -solid 1 -shell 1 -face 5 -wire 5 -edge 14 -vertex 9 diff --git a/tests/blend/seam_and_degenerated/A3 b/tests/blend/seam_and_degenerated/A3 new file mode 100644 index 0000000000..5ae17be1bb --- /dev/null +++ b/tests/blend/seam_and_degenerated/A3 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-5 +set volume 3.66429e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_6 + +checknbshapes result -solid 1 -shell 1 -face 5 -wire 5 -edge 14 -vertex 9 diff --git a/tests/blend/seam_and_degenerated/A4 b/tests/blend/seam_and_degenerated/A4 new file mode 100644 index 0000000000..aca20007b0 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A4 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-7 +set volume 3.66573e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_7 + +checknbshapes result -solid 1 -shell 1 -face 5 -wire 5 -edge 13 -vertex 8 diff --git a/tests/blend/seam_and_degenerated/A5 b/tests/blend/seam_and_degenerated/A5 new file mode 100644 index 0000000000..0e895a9b1a --- /dev/null +++ b/tests/blend/seam_and_degenerated/A5 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-7 +set volume 3.66573e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_8 + +checknbshapes result -solid 1 -shell 1 -face 5 -wire 5 -edge 13 -vertex 8 diff --git a/tests/blend/seam_and_degenerated/A6 b/tests/blend/seam_and_degenerated/A6 new file mode 100644 index 0000000000..8a2bb325eb --- /dev/null +++ b/tests/blend/seam_and_degenerated/A6 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-7 +set volume 3.66573e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_9 + +checknbshapes result -solid 1 -shell 1 -face 5 -wire 5 -edge 12 -vertex 7 diff --git a/tests/blend/seam_and_degenerated/A7 b/tests/blend/seam_and_degenerated/A7 new file mode 100644 index 0000000000..8e26b7474e --- /dev/null +++ b/tests/blend/seam_and_degenerated/A7 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-7 +set volume 3.66625e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_7 5 a_8 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 16 -vertex 10 diff --git a/tests/blend/seam_and_degenerated/A8 b/tests/blend/seam_and_degenerated/A8 new file mode 100644 index 0000000000..9ad72f2f28 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A8 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-7 +set volume 3.66625e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_7 5 a_9 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 15 -vertex 9 diff --git a/tests/blend/seam_and_degenerated/A9 b/tests/blend/seam_and_degenerated/A9 new file mode 100644 index 0000000000..c097c56576 --- /dev/null +++ b/tests/blend/seam_and_degenerated/A9 @@ -0,0 +1,14 @@ +puts "==========================================================================================================================" +puts "OCC26907: ChFi3d_Builder algorithm uses old Boolean operations: wrong processing of shapes with seam and degenerated edges" +puts "==========================================================================================================================" +puts "" + +set maxtol 5.e-7 +set volume 3.66625e+006 + +restore [locate_data_file HollowedBall.brep] a +explode a e + +blend result a 5 a_8 5 a_9 + +checknbshapes result -solid 1 -shell 1 -face 6 -wire 6 -edge 15 -vertex 9 diff --git a/tests/blend/seam_and_degenerated/begin b/tests/blend/seam_and_degenerated/begin new file mode 100644 index 0000000000..136b4ab029 --- /dev/null +++ b/tests/blend/seam_and_degenerated/begin @@ -0,0 +1 @@ +set depsilon 1.e-7 diff --git a/tests/blend/seam_and_degenerated/end b/tests/blend/seam_and_degenerated/end new file mode 100644 index 0000000000..6282e49b25 --- /dev/null +++ b/tests/blend/seam_and_degenerated/end @@ -0,0 +1,10 @@ +set tolres [checkmaxtol result] + +if { ${tolres} > ${maxtol}} { + puts "Error: bad tolerance of result" +} + +checkprops result -v ${volume} -deps ${depsilon} + +# to end a test script +puts "TEST COMPLETED"