X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMAlgo%2FGEOMAlgo_Gluer.cxx;h=53f7a6957f56ca8fb64a82f1c7b2fa49e99abedf;hb=aa5ce1d37feb958c51e3c5ad596c3825c3ff89a8;hp=ad1a7c79c3572cd94cbfc23f056ad4579b97a8aa;hpb=6101c761432c310cdbc39f0a9715dcc343ac77fd;p=modules%2Fgeom.git diff --git a/src/GEOMAlgo/GEOMAlgo_Gluer.cxx b/src/GEOMAlgo/GEOMAlgo_Gluer.cxx index ad1a7c79c..53f7a6957 100755 --- a/src/GEOMAlgo/GEOMAlgo_Gluer.cxx +++ b/src/GEOMAlgo/GEOMAlgo_Gluer.cxx @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -18,7 +19,6 @@ #include #include #include -#include #include #include @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -45,17 +46,26 @@ #include #include +#include +#include +#include #include #include #include #include +#include #include #include #include #include #include +// + +static + void GetSubShapes(const TopoDS_Shape& aS, + TopTools_IndexedMapOfShape& aMSS); //======================================================================= //function : GEOMAlgo_Gluer @@ -68,7 +78,7 @@ GEOMAlgo_Gluer::GEOMAlgo_Gluer() myTolerance=0.0001; myTol=myTolerance; myCheckGeometry=Standard_True; - myTypeResult=TopAbs_SOLID; + myNbAlone=0; } //======================================================================= //function : ~GEOMAlgo_Gluer @@ -93,7 +103,14 @@ Standard_Boolean GEOMAlgo_Gluer::CheckGeometry() const { return myCheckGeometry; } - +//======================================================================= +//function : AloneShapes +//purpose : +//======================================================================= +Standard_Integer GEOMAlgo_Gluer::AloneShapes()const +{ + return myNbAlone; +} //======================================================================= //function : Images //purpose : @@ -120,118 +137,139 @@ void GEOMAlgo_Gluer::Perform() myWarningStatus=0; // Standard_Integer i; - const Standard_Integer aNb=9; + const Standard_Integer aNb=8; void (GEOMAlgo_Gluer::* pF[aNb])()={ &GEOMAlgo_Gluer::CheckData, &GEOMAlgo_Gluer::InnerTolerance, &GEOMAlgo_Gluer::MakeVertices, &GEOMAlgo_Gluer::MakeEdges, &GEOMAlgo_Gluer::MakeFaces, &GEOMAlgo_Gluer::MakeShells, - &GEOMAlgo_Gluer::MakeSolids, &GEOMAlgo_Gluer::BuildResult, - &GEOMAlgo_Gluer::CheckResult + &GEOMAlgo_Gluer::MakeSolids, &GEOMAlgo_Gluer::CheckResult }; // - //TimeReset(); - //StartChrono(); - // for (i=0; i*pF[i])(); if (myErrorStatus) { return; } } - // - //StopChrono(); - //TimeShow(); } //======================================================================= -//function : CheckResult +//function : MakeVertices //purpose : //======================================================================= -void GEOMAlgo_Gluer::CheckResult() +void GEOMAlgo_Gluer::MakeVertices() { myErrorStatus=0; // - if (myResult.IsNull()) { - myErrorStatus=6; - return; + Standard_Integer j, i, aNbV, aIndex, aNbVSD; + TColStd_ListIteratorOfListOfInteger aIt; + Handle(Bnd_HArray1OfBox) aHAB; + Bnd_BoundSortBox aBSB; + TopoDS_Shape aSTmp, aVF; + TopoDS_Vertex aVnew; + TopTools_IndexedMapOfShape aMV, aMVProcessed; + TopTools_ListIteratorOfListOfShape aItS; + TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItIm; + TopTools_DataMapOfShapeListOfShape aMVV; + GEOMAlgo_IndexedDataMapOfIntegerShape aMIS; + GEOMAlgo_IndexedDataMapOfShapeBox aMSB; + // + TopExp::MapShapes(myShape, TopAbs_VERTEX, aMV); + aNbV=aMV.Extent(); + if (!aNbV) { + myErrorStatus=2; // no vertices in source shape + return; } - // - Standard_Boolean bFound; - Standard_Integer i, j, aNbS, aNbFS, aNbSx; - TopTools_IndexedMapOfShape aMS, aMFS; - TopTools_IndexedDataMapOfShapeListOfShape aMFR; // - TopExp::MapShapesAndAncestors(myResult, TopAbs_FACE, myTypeResult, aMFR); - TopExp::MapShapes(myResult, myTypeResult, aMS); + aHAB=new Bnd_HArray1OfBox(1, aNbV); // - aNbS=aMS.Extent(); - for (i=1; i<=aNbS; ++i) { - const TopoDS_Shape& aSolid=aMS(i); + for (i=1; i<=aNbV; ++i) { + const TopoDS_Shape& aV=aMV(i); + Bnd_Box aBox; // - aMFS.Clear(); - TopExp::MapShapes(aSolid, TopAbs_FACE, aMFS); + aBox.SetGap(myTol); + BRepBndLib::Add(aV, aBox); + aHAB->SetValue(i, aBox); + aMIS.Add(i, aV); + aMSB.Add(aV, aBox); + } + // + aBSB.Initialize(aHAB); + // + for (i=1; i<=aNbV; ++i) { + const TopoDS_Shape& aV=aMV(i); // - bFound=Standard_False; - aNbFS=aMFS.Extent(); - for (j=1; j<=aNbFS; ++j) { - const TopoDS_Shape& aFS=aMFS(j); - if (aMFR.Contains(aFS)) { - const TopTools_ListOfShape& aLSx=aMFR.FindFromKey(aFS); - aNbSx=aLSx.Extent(); - if (aNbSx==2) { - bFound=!bFound; - break; - } - } + if (aMVProcessed.Contains(aV)) { + continue; } // - if (!bFound) { - myWarningStatus=1; - break; + const Bnd_Box& aBoxV=aMSB.FindFromKey(aV); + const TColStd_ListOfInteger& aLI=aBSB.Compare(aBoxV); + aNbVSD=aLI.Extent(); + if (!aNbVSD) { + myErrorStatus=3; // it must not be + return; + } + // + // Images + // + TopTools_ListOfShape aLVSD; + // + aIt.Initialize(aLI); + for (j=0; aIt.More(); aIt.Next(), ++j) { + aIndex=aIt.Value(); + const TopoDS_Shape& aVx=aMIS.FindFromKey(aIndex); + if(!j) { + aVF=aVx; + } + aLVSD.Append(aVx); + aMVProcessed.Add(aVx); } + // + myImages.Bind(aVF, aLVSD); } -} -//======================================================================= -//function : CheckData -//purpose : -//======================================================================= -void GEOMAlgo_Gluer::CheckData() -{ - myErrorStatus=0; // - if (myShape.IsNull()) { - myErrorStatus=5; - return; + // Make new vertices + aMV.Clear(); + aItIm.Initialize(myImages); + for (; aItIm.More(); aItIm.Next()) { + const TopoDS_Shape& aV=aItIm.Key(); + const TopTools_ListOfShape& aLVSD=aItIm.Value(); + aNbVSD=aLVSD.Extent(); + if (aNbVSD>1) { + aMV.Add(aV); + MakeVertex(aLVSD, aVnew); + aMVV.Bind(aVnew, aLVSD); + } } - -} -//======================================================================= -//function : InnerTolerance -//purpose : -//======================================================================= -void GEOMAlgo_Gluer::InnerTolerance() -{ - myErrorStatus=0; - // - Standard_Integer i; - Standard_Real aX[3][2], dH, dHmin, aCoef, aTolTresh; - Bnd_Box aBox; // - BRepBndLib::Add(myShape, aBox); - aBox.Get(aX[0][0], aX[1][0], aX[2][0], aX[0][1], aX[1][1], aX[2][1]); + // UnBind old vertices + aNbV=aMV.Extent(); + for (i=1; i<=aNbV; ++i) { + const TopoDS_Shape& aV=aMV(i); + myImages.UnBind(aV); + } // - dHmin=aX[0][1]-aX[0][0]; - for (i=1; i<3; ++i) { - dH=aX[i][1]-aX[i][0]; - if (dHaTolTresh) { - myTol=aTolTresh; + // Origins + aItIm.Initialize(myImages); + for (; aItIm.More(); aItIm.Next()) { + const TopoDS_Shape& aV=aItIm.Key(); + const TopTools_ListOfShape& aLVSD=aItIm.Value(); + // + aItS.Initialize(aLVSD); + for (; aItS.More(); aItS.Next()) { + const TopoDS_Shape& aVSD=aItS.Value(); + if (!myOrigins.IsBound(aVSD)) { + myOrigins.Bind(aVSD, aV); + } + } } } //======================================================================= @@ -242,17 +280,25 @@ void GEOMAlgo_Gluer::MakeSolids() { myErrorStatus=0; // - Standard_Integer i, aNbS; + Standard_Integer aNbS; TopAbs_Orientation anOr; + TopoDS_Compound aCmp; TopoDS_Solid aNewSolid; TopTools_IndexedMapOfShape aMS; - TopExp_Explorer aExp; + TopExp_Explorer aExpS, aExp; BRep_Builder aBB; // - TopExp::MapShapes(myShape, TopAbs_SOLID, aMS); + aBB.MakeCompound(aCmp); + // aNbS=aMS.Extent(); - for (i=1; i<=aNbS; ++i) { - const TopoDS_Solid& aSolid=TopoDS::Solid(aMS(i)); + aExpS.Init(myShape, TopAbs_SOLID); + for (; aExpS.More(); aExpS.Next()) { + const TopoDS_Solid& aSolid=TopoDS::Solid(aExpS.Current()); + if (aMS.Contains(aSolid)) { + continue; + } + aMS.Add(aSolid); + // anOr=aSolid.Orientation(); // aBB.MakeSolid(aNewSolid); @@ -264,11 +310,22 @@ void GEOMAlgo_Gluer::MakeSolids() const TopoDS_Shape& aShellR=myOrigins.Find(aShell); aBB.Add(aNewSolid, aShellR); } + // TopTools_ListOfShape aLS; // aLS.Append(aSolid); myImages.Bind(aNewSolid, aLS); myOrigins.Bind(aSolid, aNewSolid); + // + aBB.Add(aCmp, aNewSolid); + } + // + myResult=aCmp; + // + aNbS=aMS.Extent(); + if (aNbS) { + //Standard_Real aTol=1.e-7; + BOP_CorrectTolerances::CorrectCurveOnSurface(myResult); } } //======================================================================= @@ -343,6 +400,7 @@ void GEOMAlgo_Gluer::MakeShapes(const TopAbs_ShapeEnum aType) { myErrorStatus=0; // + Standard_Boolean bHasNewSubShape; Standard_Integer i, aNbF, aNbSDF, iErr; TopoDS_Shape aNewShape; TopTools_IndexedMapOfShape aMF; @@ -383,7 +441,7 @@ void GEOMAlgo_Gluer::MakeShapes(const TopAbs_ShapeEnum aType) } // check geometric coincidence if (myCheckGeometry) { - iErr=GEOMAlgo_Tools::RefineSDShapes(aMPKLF, myTol, myContext); //XX + iErr=GEOMAlgo_Tools::RefineSDShapes(aMPKLF, myTol, myContext); if (iErr) { myErrorStatus=200; return; @@ -391,6 +449,7 @@ void GEOMAlgo_Gluer::MakeShapes(const TopAbs_ShapeEnum aType) } // // Images/Origins + // aNbF=aMPKLF.Extent(); for (i=1; i<=aNbF; ++i) { const TopTools_ListOfShape& aLSDF=aMPKLF(i); @@ -400,19 +459,36 @@ void GEOMAlgo_Gluer::MakeShapes(const TopAbs_ShapeEnum aType) } // const TopoDS_Shape& aS1=aLSDF.First(); - if (aType==TopAbs_FACE) { - TopoDS_Face aNewFace; - // - const TopoDS_Face& aF1=TopoDS::Face(aS1); - MakeFace(aF1, aNewFace); - aNewShape=aNewFace; + // + //modified by NIZNHY-PKV Fri Jan 21 15:34:00 2005 f + // + bHasNewSubShape=Standard_True; + // prevent creation of a new shape if there are not + // new subshapes of aSS among the originals + if (aNbSDF==1) { + bHasNewSubShape=HasNewSubShape(aS1); + if (!bHasNewSubShape) { + aNewShape=aS1; + aNewShape.Orientation(TopAbs_FORWARD); + } } - else if (aType==TopAbs_EDGE) { - TopoDS_Edge aNewEdge; - // - const TopoDS_Edge& aE1=TopoDS::Edge(aS1); - MakeEdge(aE1, aNewEdge); - aNewShape=aNewEdge; + //modified by NIZNHY-PKV Fri Jan 21 15:34:05 2005 t + // + if (bHasNewSubShape) {//modified by NIZNHY-PKV Fri Jan 21 15:34:10 2005ft + if (aType==TopAbs_FACE) { + TopoDS_Face aNewFace; + // + const TopoDS_Face& aF1=TopoDS::Face(aS1); + MakeFace(aF1, aNewFace); + aNewShape=aNewFace; + } + else if (aType==TopAbs_EDGE) { + TopoDS_Edge aNewEdge; + // + const TopoDS_Edge& aE1=TopoDS::Edge(aS1); + MakeEdge(aE1, aNewEdge); + aNewShape=aNewEdge; + } } // myImages.Bind(aNewShape, aLSDF); @@ -427,116 +503,101 @@ void GEOMAlgo_Gluer::MakeShapes(const TopAbs_ShapeEnum aType) } } //======================================================================= -//function : MakeVertices +//function : CheckResult //purpose : //======================================================================= -void GEOMAlgo_Gluer::MakeVertices() +void GEOMAlgo_Gluer::CheckResult() { myErrorStatus=0; // - Standard_Boolean bFound; - Standard_Integer i, aNbV, aIndex, aNbVSD; - TColStd_ListIteratorOfListOfInteger aIt; - Handle(Bnd_HArray1OfBox) aHAB; - Bnd_BoundSortBox aBSB; - TopoDS_Shape aSTmp; - TopTools_IndexedMapOfShape aMV; - TopTools_ListIteratorOfListOfShape aItS; - TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItIm; - GEOMAlgo_IndexedDataMapOfIntegerShape aMIS; - GEOMAlgo_IndexedDataMapOfShapeBox aMSB; - // - TopExp::MapShapes(myShape, TopAbs_VERTEX, aMV); - aNbV=aMV.Extent(); - if (!aNbV) { - myErrorStatus=2; // no vertices in source shape - return; - } - // - aHAB=new Bnd_HArray1OfBox(1, aNbV); - // - for (i=1; i<=aNbV; ++i) { - const TopoDS_Shape& aV=aMV(i); - Bnd_Box aBox; - // - aBox.SetGap(myTol);//XX - BRepBndLib::Add(aV, aBox); - aHAB->SetValue(i, aBox); - aMIS.Add(i, aV); - aMSB.Add(aV, aBox); + if (myResult.IsNull()) { + myErrorStatus=6; + return; } + // + Standard_Boolean bFound; + Standard_Integer i, j, aNbS, aNbFS, aNbSx; + TopTools_IndexedMapOfShape aMS, aMFS; + TopTools_IndexedDataMapOfShapeListOfShape aMFR; // - aBSB.Initialize(aHAB); + TopExp::MapShapesAndAncestors(myResult, TopAbs_FACE, TopAbs_SOLID, aMFR); + TopExp::MapShapes(myResult, TopAbs_SOLID, aMS); // - for (i=1; i<=aNbV; ++i) { - const TopoDS_Shape& aV=aMV(i); - const Bnd_Box& aBoxV=aMSB.FindFromKey(aV); - const TColStd_ListOfInteger& aLI=aBSB.Compare(aBoxV); - aNbVSD=aLI.Extent(); - if (!aNbVSD) { - myErrorStatus=3; // it must not be - return; - } + + myNbAlone=0; + aNbS=aMS.Extent(); + for (i=1; i<=aNbS; ++i) { + const TopoDS_Shape& aSolid=aMS(i); // - // Images - TopTools_ListOfShape aLVSD; - TopoDS_Shape aVF; + aMFS.Clear(); + TopExp::MapShapes(aSolid, TopAbs_FACE, aMFS); // bFound=Standard_False; - aIt.Initialize(aLI); - for (; aIt.More(); aIt.Next()) { - aIndex=aIt.Value(); - const TopoDS_Shape& aVx=aMIS.FindFromKey(aIndex); - if (myImages.IsBound(aVx)) { - bFound=Standard_True; - aVF=aVx; + aNbFS=aMFS.Extent(); + for (j=1; j<=aNbFS; ++j) { + const TopoDS_Shape& aFS=aMFS(j); + if (aMFR.Contains(aFS)) { + const TopTools_ListOfShape& aLSx=aMFR.FindFromKey(aFS); + aNbSx=aLSx.Extent(); + if (aNbSx==2) { + bFound=!bFound; + break; + } } - aLVSD.Append(aVx); } - if (bFound) { - TopTools_ListOfShape& aLVI=myImages.ChangeFind(aVF); - aLVI.Append(aLVSD); - } - else { - myImages.Bind(aV, aLVSD); + // + if (!bFound) { + myWarningStatus=1; + ++myNbAlone; + //break; } } +} +//======================================================================= +//function : CheckData +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::CheckData() +{ + myErrorStatus=0; // - // Refine Images - aItIm.Initialize(myImages); - for (; aItIm.More(); aItIm.Next()) { - TopTools_ListOfShape aLVSDNew; - TopTools_MapOfShape aM; - // - const TopoDS_Shape& aV=aItIm.Key(); - const TopTools_ListOfShape& aLVSD=aItIm.Value(); - aItS.Initialize(aLVSD); - for (; aItS.More(); aItS.Next()) { - const TopoDS_Shape& aVSD=aItS.Value(); - if (aM.Add(aVSD)) { - aLVSDNew.Append(aVSD); - } - } - TopTools_ListOfShape& aLVI=myImages.ChangeFind(aV); - aLVI.Clear(); - aLVI.Append(aLVSDNew); + if (myShape.IsNull()) { + myErrorStatus=5; + return; } +} +//======================================================================= +//function : InnerTolerance +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::InnerTolerance() +{ + myErrorStatus=0; // - // Origins - aItIm.Initialize(myImages); - for (; aItIm.More(); aItIm.Next()) { - const TopoDS_Shape& aV=aItIm.Key(); - // - const TopTools_ListOfShape& aLVSD=myImages.Find(aV); - aItS.Initialize(aLVSD); - for (; aItS.More(); aItS.Next()) { - const TopoDS_Shape& aVSD=aItS.Value(); - if (!myOrigins.IsBound(aVSD)) { - myOrigins.Bind(aVSD, aV); - } + /* + Standard_Integer i; + Standard_Real aX[3][2], dH, dHmin, aCoef, aTolTresh; + Bnd_Box aBox; + // + BRepBndLib::Add(myShape, aBox); + aBox.Get(aX[0][0], aX[1][0], aX[2][0], aX[0][1], aX[1][1], aX[2][1]); + // + dHmin=aX[0][1]-aX[0][0]; + for (i=1; i<3; ++i) { + dH=aX[i][1]-aX[i][0]; + if (dHaTolTresh) { + myTol=aTolTresh; + } + */ + myTol=myTolerance; } //======================================================================= //function : FacePassKey @@ -588,6 +649,52 @@ void GEOMAlgo_Gluer::EdgePassKey(const TopoDS_Edge& aE, aPK.SetIds(aVR1, aVR2); } //======================================================================= +//function : MakeVertex +//purpose : +//======================================================================= +void GEOMAlgo_Gluer::MakeVertex(const TopTools_ListOfShape& aLV, + TopoDS_Vertex& aNewVertex) +{ + Standard_Integer aNbV; + Standard_Real aTolV, aD, aDmax; + gp_XYZ aGC; + gp_Pnt aP3D, aPGC; + TopoDS_Vertex aVx; + BRep_Builder aBB; + TopTools_ListIteratorOfListOfShape aIt; + // + aNbV=aLV.Extent(); + if (!aNbV) { + return; + } + // + // center of gravity + aGC.SetCoord(0.,0.,0.); + aIt.Initialize(aLV); + for (; aIt.More(); aIt.Next()) { + aVx=TopoDS::Vertex(aIt.Value()); + aP3D=BRep_Tool::Pnt(aVx); + aGC+=aP3D.XYZ(); + } + aGC/=(Standard_Real)aNbV; + aPGC.SetXYZ(aGC); + // + // tolerance value + aDmax=-1.; + aIt.Initialize(aLV); + for (; aIt.More(); aIt.Next()) { + aVx=TopoDS::Vertex(aIt.Value()); + aP3D=BRep_Tool::Pnt(aVx); + aTolV=BRep_Tool::Tolerance(aVx); + aD=aPGC.Distance(aP3D)+aTolV; + if (aD>aDmax) { + aDmax=aD; + } + } + // + aBB.MakeVertex (aNewVertex, aPGC, aDmax); +} +//======================================================================= //function : MakeEdge //purpose : //======================================================================= @@ -596,10 +703,13 @@ void GEOMAlgo_Gluer::MakeEdge(const TopoDS_Edge& aE, { myErrorStatus=0; // + Standard_Boolean bIsDE; Standard_Real aT1, aT2; TopoDS_Vertex aV1, aV2, aVR1, aVR2; TopoDS_Edge aEx; // + bIsDE=BRep_Tool::Degenerated(aE); + // aEx=aE; aEx.Orientation(TopAbs_FORWARD); // @@ -613,7 +723,30 @@ void GEOMAlgo_Gluer::MakeEdge(const TopoDS_Edge& aE, aVR2=TopoDS::Vertex(myOrigins.Find(aV2)); aVR2.Orientation(TopAbs_REVERSED); // - BOPTools_Tools::MakeSplitEdge(aEx, aVR1, aT1, aVR2, aT2, aNewEdge); + if (bIsDE) { + Standard_Real aTol; + BRep_Builder aBB; + TopoDS_Edge E; + TopAbs_Orientation anOrE; + // + anOrE=aE.Orientation(); + aTol=BRep_Tool::Tolerance(aE); + // + E=aEx; + E.EmptyCopy(); + // + aBB.Add (E, aVR1); + aBB.Add (E, aVR2); + aBB.Range(E, aT1, aT2); + aBB.Degenerated(E, Standard_True); + aBB.UpdateEdge(E, aTol); + // + aNewEdge=E; + } + // + else { + BOPTools_Tools::MakeSplitEdge(aEx, aVR1, aT1, aVR2, aT2, aNewEdge); + } } // //======================================================================= @@ -625,13 +758,14 @@ void GEOMAlgo_Gluer::MakeFace(const TopoDS_Face& aF, { myErrorStatus=0; // - Standard_Boolean bIsToReverse; - Standard_Real aTol; + Standard_Boolean bIsToReverse, bIsUPeriodic; + Standard_Real aTol, aUMin, aUMax, aVMin, aVMax; TopoDS_Edge aER; TopoDS_Wire newWire; TopoDS_Face aFFWD, newFace; TopLoc_Location aLoc; Handle(Geom_Surface) aS; + Handle(Geom2d_Curve) aC2D; TopExp_Explorer aExpW, aExpE; BRep_Builder aBB; // @@ -639,7 +773,9 @@ void GEOMAlgo_Gluer::MakeFace(const TopoDS_Face& aF, aFFWD.Orientation(TopAbs_FORWARD); // aS=BRep_Tool::Surface(aFFWD, aLoc); + bIsUPeriodic=GEOMAlgo_Tools::IsUPeriodic(aS); aTol=BRep_Tool::Tolerance(aFFWD); + BRepTools::UVBounds(aF, aUMin, aUMax, aVMin, aVMax); // aBB.MakeFace (newFace, aS, aLoc, aTol); // @@ -651,17 +787,36 @@ void GEOMAlgo_Gluer::MakeFace(const TopoDS_Face& aF, for (; aExpE.More(); aExpE.Next()) { const TopoDS_Edge& aE=TopoDS::Edge(aExpE.Current()); aER=TopoDS::Edge(myOrigins.Find(aE)); + // aER.Orientation(TopAbs_FORWARD); - // build p-curve - BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aER, aFFWD); - // orient image - bIsToReverse=BOPTools_Tools3D::IsSplitToReverse1(aER, aE, myContext); - if (bIsToReverse) { - aER.Reverse(); + if (!BRep_Tool::Degenerated(aER)) { + // build p-curve + if (bIsUPeriodic) { + GEOMAlgo_Tools::RefinePCurveForEdgeOnFace(aER, aFFWD, aUMin, aUMax); + } + BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aER, aFFWD); + + // orient image + bIsToReverse=BOPTools_Tools3D::IsSplitToReverse1(aER, aE, myContext); + if (bIsToReverse) { + aER.Reverse(); + } + } + else { + aER.Orientation(aE.Orientation()); } // aBB.Add(newWire, aER); } + //modified by NIZNHY-PKV Mon Jan 31 17:26:36 2005f + // + TopTools_ListOfShape aLW; + // + aLW.Append(aW); + myImages.Bind(newWire, aLW); + myOrigins.Bind(aW, newWire); + // + //modified by NIZNHY-PKV Mon Jan 31 17:26:41 2005 t aBB.Add(newFace, newWire); } aNewFace=newFace; @@ -683,54 +838,144 @@ Standard_Boolean GEOMAlgo_Gluer::IsToReverse(const TopoDS_Face& aFR, bRet=Standard_False; // aExp.Init(aF, TopAbs_EDGE); - if (!aExp.More()) { - return bRet; + for (; aExp.More(); aExp.Next()) { + const TopoDS_Edge& aE=TopoDS::Edge(aExp.Current()); + // + if (BRep_Tool::Degenerated(aE)) { + continue; + } + // + const TopoDS_Edge& aER=TopoDS::Edge(myOrigins.Find(aE)); + // + aC3D=BRep_Tool::Curve(aE, aT1, aT2); + aT=BOPTools_Tools2D::IntermediatePoint(aT1, aT2); + aC3D->D0(aT, aP); + myContext.ProjectPointOnEdge(aP, aER, aTR); + // + BOPTools_Tools3D::GetNormalToFaceOnEdge (aE, aF, aT, aDNF); + if (aF.Orientation()==TopAbs_REVERSED) { + aDNF.Reverse(); + } + // + BOPTools_Tools3D::GetNormalToFaceOnEdge (aER, aFR, aTR, aDNFR); + if (aFR.Orientation()==TopAbs_REVERSED) { + aDNFR.Reverse(); + } + // + aScPr=aDNF*aDNFR; + return (aScPr<0.); } - const TopoDS_Edge& aE=TopoDS::Edge(aExp.Current()); - const TopoDS_Edge& aER=TopoDS::Edge(myOrigins.Find(aE)); + return bRet; +} +// +//modified by NIZNHY-PKV Fri Jan 21 10:55:42 2005 f +//======================================================================= +//function : HasNewSubShape +//purpose : +//======================================================================= +Standard_Boolean GEOMAlgo_Gluer::HasNewSubShape(const TopoDS_Shape& aS)const +{ + Standard_Boolean bRet; + Standard_Integer i, aNbSS; + TopTools_IndexedMapOfShape aMSS; // - aC3D=BRep_Tool::Curve(aE, aT1, aT2); - aT=BOPTools_Tools2D::IntermediatePoint(aT1, aT2); - aC3D->D0(aT, aP); - myContext.ProjectPointOnEdge(aP, aER, aTR); + GetSubShapes(aS, aMSS); // - BOPTools_Tools3D::GetNormalToFaceOnEdge (aE, aF, aT, aDNF); - if (aF.Orientation()==TopAbs_REVERSED) { - aDNF.Reverse(); + bRet=Standard_False; + aNbSS=aMSS.Extent(); + for (i=1; i<=aNbSS; ++i) { + const TopoDS_Shape& aSS=aMSS(i); + if (aSS.ShapeType()==TopAbs_WIRE) { + continue; + } + // + bRet=!myOrigins.IsBound(aSS); + if (bRet) { + return bRet; + } + // + const TopoDS_Shape& aSSIm=myOrigins.Find(aSS); + bRet=!aSSIm.IsSame(aSS); + if (bRet) { + return bRet; + } } + return bRet; +} +//======================================================================= +//function : GetSubShapes +//purpose : +//======================================================================= +void GetSubShapes(const TopoDS_Shape& aS, + TopTools_IndexedMapOfShape& aMSS) +{ + Standard_Integer aR; + TopAbs_ShapeEnum aType; + TopoDS_Iterator aIt; // - BOPTools_Tools3D::GetNormalToFaceOnEdge (aER, aFR, aTR, aDNFR); - if (aFR.Orientation()==TopAbs_REVERSED) { - aDNFR.Reverse(); + aType=aS.ShapeType(); + aR=(Standard_Integer)aType+1; + if (aR>TopAbs_VERTEX) { + return; } // - aScPr=aDNF*aDNFR; - return (aScPr<0.); + aIt.Initialize(aS); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSS=aIt.Value(); + aMSS.Add(aSS); + GetSubShapes(aSS, aMSS); + } } -// //======================================================================= -//function : BuildResult +//function : Modified //purpose : //======================================================================= -void GEOMAlgo_Gluer::BuildResult() +const TopTools_ListOfShape& GEOMAlgo_Gluer::Modified (const TopoDS_Shape& aS) { - TopoDS_Compound aCmp; - BRep_Builder aBB; TopAbs_ShapeEnum aType; - TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItIm; // - aBB.MakeCompound(aCmp); - // - aItIm.Initialize(myImages); - for (; aItIm.More(); aItIm.Next()) { - const TopoDS_Shape& aIm=aItIm.Key(); - aType=aIm.ShapeType(); - if(aType==myTypeResult) { - aBB.Add(aCmp, aIm); + myGenerated.Clear(); + // + aType=aS.ShapeType(); + if (aType==TopAbs_VERTEX || + aType==TopAbs_EDGE || + aType==TopAbs_WIRE || //modified by NIZNHY-PKV Mon Jan 31 17:18:36 2005ft + aType==TopAbs_FACE || + aType==TopAbs_SHELL || //modified by NIZNHY-PKV Mon Jan 31 17:18:36 2005ft + aType==TopAbs_SOLID) { //modified by NIZNHY-PKV Mon Jan 31 17:18:36 2005ft + if(myOrigins.IsBound(aS)) { + const TopoDS_Shape& aSnew=myOrigins.Find(aS); + if (!aSnew.IsSame(aS)) { + myGenerated.Append(aSnew); + } } } - myResult=aCmp; + // + return myGenerated; +} +//======================================================================= +//function : Generated +//purpose : +//======================================================================= +const TopTools_ListOfShape& GEOMAlgo_Gluer::Generated(const TopoDS_Shape& ) +{ + myGenerated.Clear(); + return myGenerated; } +//======================================================================= +//function : IsDeleted +//purpose : +//======================================================================= +Standard_Boolean GEOMAlgo_Gluer::IsDeleted (const TopoDS_Shape& aS) +{ + Standard_Boolean bRet=Standard_False; + // + const TopTools_ListOfShape& aL=Modified(aS); + bRet=!aL.IsEmpty(); + // + return bRet; +} +//modified by NIZNHY-PKV Fri Jan 21 10:59:21 2005 t // // ErrorStatus // @@ -748,81 +993,3 @@ void GEOMAlgo_Gluer::BuildResult() // // 1 - some shapes can not be glued by faces // - -/* -// -// CHRONOMETER -// -#include -#include - -static Standard_Real S_ChronoTime; -Standard_STATIC(OSD_Chronometer, S_Chrono); - -static void StartChrono(); -static void StopChrono(); -static void TimeShow(); -static void TimeReset(); -static int HasChrono(); - -//======================================================================= -//function : StartChrono -//purpose : -//======================================================================= -void StartChrono() -{ - if (HasChrono()){ - S_Chrono().Reset(); - S_Chrono().Start(); - } -} - -//======================================================================= -//function : StopChrono -//purpose : -//======================================================================= -void StopChrono() -{ - if (HasChrono()) { - Standard_Real Chrono; - S_Chrono().Stop(); - S_Chrono().Show(Chrono); - // - S_ChronoTime+=Chrono; - } -} -//======================================================================= -//function : TimeReset -//purpose : -//======================================================================= -void TimeReset() -{ - if (HasChrono()){ - S_ChronoTime=0; - } -} -//======================================================================= -//function : TimeShow -//purpose : -//======================================================================= -void TimeShow() -{ - if (HasChrono()){ - cout << "Tps: " << S_ChronoTime << endl; - } -} -//======================================================================= -//function : HasChrono -//purpose : -//======================================================================= -int HasChrono() -{ - char *xr=getenv ("XCHRONO"); - if (xr!=NULL){ - if (!strcmp (xr, "yes")) { - return 1; - } - } - return 0; -} -*/