static
- void CheckEdge (const TopoDS_Edge& E,
- const Standard_Real aMaxTol);
+ void CheckEdge (const TopoDS_Edge& E);
static
void CorrectEdgeTolerance (const TopoDS_Edge& myShape,
- const TopoDS_Face& S,
- const Standard_Real aMaxTol);
+ const TopoDS_Face& S);
static
Standard_Boolean Validate(const Adaptor3d_Curve& CRef,
const Adaptor3d_Curve& Other,
static
void CorrectVertexTolerance(const TopoDS_Edge& aE);
//
-
//=======================================================================
// Function : CorrectTolerances
// purpose :
//=======================================================================
- void BOP_CorrectTolerances::CorrectTolerances(const TopoDS_Shape& aShape,
- const Standard_Real aMaxTol)
+ void BOP_CorrectTolerances::CorrectTolerances(const TopoDS_Shape& aShape)
{
- BOP_CorrectTolerances::CorrectPointOnCurve(aShape, aMaxTol);
- BOP_CorrectTolerances::CorrectCurveOnSurface(aShape, aMaxTol);
+ BOP_CorrectTolerances::CorrectPointOnCurve(aShape);
+ BOP_CorrectTolerances::CorrectCurveOnSurface(aShape);
}
-
//=======================================================================
// Function : CorrectPointOnCurve
// purpose :
//=======================================================================
- void BOP_CorrectTolerances::CorrectPointOnCurve(const TopoDS_Shape& S,
- const Standard_Real aMaxTol)
+ void BOP_CorrectTolerances::CorrectPointOnCurve(const TopoDS_Shape& S)
{
Standard_Integer i, aNb;
TopTools_IndexedMapOfShape Edges;
aNb=Edges.Extent();
for (i=1; i<=aNb; i++) {
const TopoDS_Edge& E= TopoDS::Edge(Edges(i));
- CheckEdge(E, aMaxTol);
+ CheckEdge(E);
}
}
// Function : CorrectCurveOnSurface
// purpose :
//=======================================================================
- void BOP_CorrectTolerances::CorrectCurveOnSurface(const TopoDS_Shape& S,
- const Standard_Real aMaxTol)
+ void BOP_CorrectTolerances::CorrectCurveOnSurface(const TopoDS_Shape& S)
{
Standard_Integer i, aNbFaces, j, aNbEdges;
TopTools_IndexedMapOfShape Faces;
aNbEdges=Edges.Extent();
for (j=1; j<=aNbEdges; j++) {
const TopoDS_Edge& E= TopoDS::Edge(Edges(j));
- CorrectEdgeTolerance (E, F, aMaxTol);
+ CorrectEdgeTolerance (E, F);
}
}
}
// purpose : Correct tolerances for Edge
//=======================================================================
void CorrectEdgeTolerance (const TopoDS_Edge& myShape,
- const TopoDS_Face& S,
- const Standard_Real aMaxTol)
+ const TopoDS_Face& S)
{
//
// 1. Minimum of conditions to Perform
Adaptor3d_CurveOnSurface ACS(GHPC,GAHS);
ok = Validate(myHCurve->Curve(), ACS, Tol, SameParameter, aNewTol);
if (ok) {
- if (cr->IsCurveOnClosedSurface()) {
- //return ;// BRepCheck::Add(lst,BRepCheck_InvalidCurveOnClosedSurface);
- }
- else {
- //return;//BRepCheck::Add(lst,BRepCheck_InvalidCurveOnSurface);
- }
- if (SameParameter) {
- //return;//BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
- }
- //
+ //modified by NIZNHY-PKV Thu Sep 27 10:28:27 2012f
+ TE->UpdateTolerance(aNewTol+Delta);
+ CorrectVertexTolerance(myShape);
+ /*
if (aNewTol<aMaxTol) {
TE->UpdateTolerance(aNewTol+Delta);
- //
CorrectVertexTolerance(myShape);
- }
+ //}
+ */
+ //modified by NIZNHY-PKV Thu Sep 27 10:28:44 2012t
}
if (cr->IsCurveOnClosedSurface()) {
ACS.Load(GHPC); // meme remarque...
ok = Validate(myHCurve->Curve(),ACS,Tol,SameParameter, aNewTol);
if (ok) {
- //return;//BRepCheck::Add(lst,BRepCheck_InvalidCurveOnClosedSurface);
- if (SameParameter) {
- //return;//BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
- }
+ //modified by NIZNHY-PKV Thu Sep 27 10:33:36 2012f
+ TE->UpdateTolerance(aNewTol+Delta);
+ CorrectVertexTolerance(myShape);
+ /*
if (aNewTol<aMaxTol) {
TE->UpdateTolerance(aNewTol+Delta);
CorrectVertexTolerance(myShape);
}
+ */
+ //modified by NIZNHY-PKV Thu Sep 27 10:34:00 2012t
}
}
}
P = Handle(Geom_Plane)::DownCast(Su);
}
if (P.IsNull()) { // not a plane
- return;//BRepCheck::Add(lst,BRepCheck_NoCurveOnSurface);
+ return;
}
else {// on fait la projection a la volee, comme BRep_Tool
Standard_Boolean okx = Validate(myHCurve->Curve(),ACS,
Tol,Standard_True, aNewTol); // voir dub...
if (okx) {
- //return;//BRepCheck::Add(lst,BRepCheck_InvalidCurveOnSurface);
+ //modified by NIZNHY-PKV Thu Sep 27 10:34:10 2012f
+ TE->UpdateTolerance(aNewTol+Delta);
+ CorrectVertexTolerance(myShape);
+ /*
if (aNewTol<aMaxTol) {
TE->UpdateTolerance(aNewTol+Delta);
CorrectVertexTolerance(myShape);
}
+ */
}
}
// Function : CheckEdge
// purpose : Correct tolerances for Vertices on Edge
//=======================================================================
-void CheckEdge (const TopoDS_Edge& Ed, const Standard_Real aMaxTol)
+void CheckEdge (const TopoDS_Edge& Ed)
{
TopoDS_Edge E=Ed;
E.Orientation(TopAbs_FORWARD);
aD2=prep.SquareDistance(Controlp);
if (aD2 > Tol) {
aNewTolerance=sqrt(aD2)+dd;
+ //modified by NIZNHY-PKV Thu Sep 27 10:34:41 2012f
+ TV->UpdateTolerance(aNewTolerance);
+ /*
if (aNewTolerance<aMaxTol)
TV->UpdateTolerance(aNewTolerance);
+ */
}
}
itpr.Next();
if (aD2 > Tol) {
aNewTolerance=sqrt(aD2)+dd;
+ //modified by NIZNHY-PKV Thu Sep 27 10:34:55 2012f
+ TV->UpdateTolerance(aNewTolerance);
+ /*
if (aNewTolerance<aMaxTol)
TV->UpdateTolerance(aNewTolerance);
+ */
+ //modified by NIZNHY-PKV Thu Sep 27 10:35:01 2012t
}
}
}
--- /dev/null
+// Created on: 2001-03-13
+// Created by: Peter KURNEV
+// Copyright (c) 2001-2012 OPEN CASCADE SAS
+//
+// The content of this file is subject to the Open CASCADE Technology Public
+// License Version 6.5 (the "License"). You may not use the content of this file
+// except in compliance with the License. Please obtain a copy of the License
+// at http://www.opencascade.org and read it completely before using this file.
+//
+// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
+// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+//
+// The Original Code and all software distributed under the License is
+// distributed on an "AS IS" basis, without warranty of any kind, and the
+// Initial Developer hereby disclaims all such warranties, including without
+// limitation, any warranties of merchantability, fitness for a particular
+// purpose or non-infringement. Please see the License for the specific terms
+// and conditions governing the rights and limitations under the License.
+
+#include <BOPTools_PaveFiller.ixx>
+
+#include <TColStd_ListOfInteger.hxx>
+#include <TColStd_ListIteratorOfListOfInteger.hxx>
+#include <TColStd_IndexedMapOfInteger.hxx>
+
+#include <gp_Pnt.hxx>
+#include <Geom_Curve.hxx>
+
+#include <TopoDS_Edge.hxx>
+#include <BRep_Builder.hxx>
+
+#include <BooleanOperations_ShapesDataStructure.hxx>
+
+#include <IntTools_Curve.hxx>
+#include <IntTools_Tools.hxx>
+
+#include <BOPTools_Tools.hxx>
+#include <BOPTools_SequenceOfCurves.hxx>
+#include <BOPTools_Curve.hxx>
+#include <BOPTools_ListOfPaveBlock.hxx>
+#include <BOPTools_ListIteratorOfListOfPaveBlock.hxx>
+#include <BOPTools_Pave.hxx>
+#include <BOPTools_ListOfCommonBlock.hxx>
+#include <BOPTools_ListIteratorOfListOfCommonBlock.hxx>
+#include <BOPTools_CommonBlock.hxx>
+
+//modified by NIZNHY-PKV Tue Aug 28 09:45:19 2012ft
+//=======================================================================
+//function : TreatTechnoVertices
+//purpose :
+//=======================================================================
+void BOPTools_PaveFiller::TreatTechnoVertices(BOPTools_SSInterference& aFFi)
+{
+ Standard_Boolean bFlag, bSplitted;
+ Standard_Integer nF1, nF2, aBid, j, aNbCurves, aNbVT, aNbLPB, nE, nVT, iFlag;
+ Standard_Integer nF, nE1, nE2, k;
+ Standard_Real aT;
+ TColStd_IndexedMapOfInteger aMVT;
+
+ TColStd_ListIteratorOfListOfInteger aItLI;
+ BOPTools_Pave aPave;
+ BOPTools_ListOfPaveBlock aLPB, aLPBS;
+ BOPTools_ListIteratorOfListOfPaveBlock aItLPB, aItLPB1;
+ //
+ nF1=aFFi.Index1();
+ nF2=aFFi.Index2();
+ BOPTools_SequenceOfCurves& aBCs=aFFi.Curves();
+ //
+ aNbCurves=aBCs.Length();
+ for (j=1; j<=aNbCurves; j++) {
+ BOPTools_Curve& aBC=aBCs(j);
+ //Handle(Geom_Curve) aC3D= aBC.Curve().Curve(); //DEB
+ TColStd_ListOfInteger& aLVT=aBC.TechnoVertices();
+ aItLI.Initialize(aLVT);
+ for (; aItLI.More(); aItLI.Next()) {
+ nVT=aItLI.Value();
+ aMVT.Add(nVT);
+ }
+ }
+ //
+ aNbVT=aMVT.Extent();
+ if (!aNbVT) {// nothing to do
+ return;
+ }
+ //------------------------------
+ //
+ aBid=0;
+ SplitsInFace (aBid, nF1, nF2, aLPB);
+ SplitsInFace (aBid, nF2, nF1, aLPB);
+ SplitsOnFace (aBid, nF1, nF2, aLPB);
+ //
+ aNbLPB=aLPB.Extent();
+ if (!aNbLPB) {// nothing to do
+ return;
+ }
+ //
+ for (k=1; k<=aNbVT; ++k) {
+ nVT=aMVT(k);
+ const TopoDS_Vertex& aV=*((TopoDS_Vertex*)&(myDS->Shape(nVT)));
+ //
+ // 1.Collect Pave Blocks (pretenders) to split by nVT => aLPBS
+ aLPBS.Clear();
+ aItLPB.Initialize(aLPB);
+ for (; aItLPB.More(); aItLPB.Next()) {
+ const BOPTools_PaveBlock& aPB=aItLPB.Value();
+ nE=aPB.OriginalEdge();
+ const TopoDS_Edge& aE=*((TopoDS_Edge*)&(myDS->Shape(nE)));
+ //
+ iFlag=myContext->ComputeVE(aV, aE, aT);
+ if (iFlag) {
+ continue;
+ }
+ //
+ aPave.SetIndex(nVT);
+ aPave.SetParam(aT);
+ //
+ BOPTools_ListOfPaveBlock& aLPBE=mySplitShapesPool(myDS->RefEdge(nE));
+ aItLPB1.Initialize(aLPBE);
+ for (; aItLPB1.More(); aItLPB1.Next()) {
+ const BOPTools_PaveBlock& aPBE=aItLPB1.Value();
+ if (aPBE.IsInBlock(aPave)) {
+ aLPBS.Append(aPBE);
+ }
+ }
+ }//for (; aItLPB.More(); aItLPB.Next()) {
+ //
+ // 2.Split Pave Blocks [aLPBS] by the vertex [nVT]
+ BOPTools_ListIteratorOfListOfCommonBlock aItCB1, aItCB2;
+ BOPTools_PaveBlock aPB11, aPB12, aPB21, aPB22, aPB1, aPB2;
+ //
+ aItLPB.Initialize(aLPBS);
+ for (; aItLPB.More(); aItLPB.Next()) {
+ const BOPTools_PaveBlock& aPBS=aItLPB.Value();
+ nE=aPBS.OriginalEdge();
+ //
+ BOPTools_ListOfCommonBlock& aLCB1=myCommonBlockPool(myDS->RefEdge(nE));
+ aItCB1.Initialize(aLCB1);
+ for (; aItCB1.More(); aItCB1.Next()) {
+ BOPTools_CommonBlock& aCB1=aItCB1.Value();
+ aPB1=aCB1.PaveBlock1(nE);
+ nE1=aPB1.OriginalEdge();
+ //
+ if (aPB1.IsEqual(aPBS)) {
+ //
+ SplitPaveBlock(aPB1, nVT, aPB11, aPB12);
+ //
+ nF=aCB1.Face();
+ if (nF) {
+ BOPTools_CommonBlock aCBa, aCBb;
+ //
+ aLCB1.Remove(aItCB1);
+ //
+ aCBa.SetPaveBlock1(aPB11);
+ aCBa.SetFace(nF);
+ aCBb.SetPaveBlock2(aPB12);
+ aCBb.SetFace(nF);
+ //
+ aLCB1.Append(aCBa);
+ aLCB1.Append(aCBb);
+ //
+ break;
+ }// if (nF) {
+ else { // 1
+ BOPTools_CommonBlock aCBa, aCBb;
+ //
+ aPB2=aCB1.PaveBlock2(nE);
+ nE2=aPB2.OriginalEdge();
+ //
+ SplitPaveBlock(aPB2, nVT, aPB21, aPB22);
+ //
+ //aLCB1.Remove(aItCB1);
+ //
+ iFlag=0;
+ BOPTools_ListOfCommonBlock& aLCB2=myCommonBlockPool(myDS->RefEdge(nE2));
+ aItCB2.Initialize(aLCB2);
+ for (; aItCB2.More(); aItCB2.Next()) {
+ BOPTools_CommonBlock& aCB2=aItCB2.Value();
+ BOPTools_PaveBlock& aPBx=aCB2.PaveBlock1(nE2);
+ if (aPBx.IsEqual(aPB2)) {
+ aLCB2.Remove(aItCB2);
+ aLCB1.Remove(aItCB1);
+ //
+ bFlag=CheckCoincidence(aPB11, aPB21);
+ if (bFlag) {
+ aCBa.SetPaveBlock1(aPB11);
+ aCBa.SetPaveBlock2(aPB21);
+ aCBb.SetPaveBlock1(aPB12);
+ aCBb.SetPaveBlock2(aPB22);
+ }
+ else {
+ aCBa.SetPaveBlock1(aPB11);
+ aCBa.SetPaveBlock2(aPB22);
+ aCBb.SetPaveBlock1(aPB12);
+ aCBb.SetPaveBlock2(aPB21);
+ }
+ //
+ aLCB1.Append(aCBa);
+ aLCB1.Append(aCBb);
+ aLCB2.Append(aCBa);
+ aLCB2.Append(aCBb);
+ //
+ iFlag=1;
+ break;
+ }//if (aPB1.IsEqual(aPB2)) {
+ }//for (; aItCB2.More(); aItCB2.Next()) {
+ }//else { // 1
+ }//if (aPB1.IsEqual(aPBS)) {
+ if (iFlag) {
+ break;
+ }
+ }//for (; aItCB.More(); aItCB.Next()) {
+ }//for (; aItLPB.More(); aItLPB.Next()) {
+ }//for (k=1; k<=aNbVT; ++k) {
+}
+//=======================================================================
+//function : SplitPaveBlock
+//purpose :
+//=======================================================================
+void BOPTools_PaveFiller::SplitPaveBlock(const BOPTools_PaveBlock& aPBE,
+ const Standard_Integer nVT,
+ BOPTools_PaveBlock& aPB1,
+ BOPTools_PaveBlock& aPB2)
+{
+ Standard_Integer nE, iFlag;
+ Standard_Real aT;
+ BOPTools_Pave aPave;
+ BOPTools_ListIteratorOfListOfPaveBlock aItLPB;
+ //
+ const TopoDS_Vertex& aVT=*((TopoDS_Vertex*)&(myDS->Shape(nVT)));
+ //
+ nE=aPBE.OriginalEdge();
+ const TopoDS_Edge& aE=*((TopoDS_Edge*)&(myDS->Shape(nE)));
+ //
+ BOPTools_ListOfPaveBlock& aLPB=mySplitShapesPool(myDS->RefEdge(nE));
+ //
+ aItLPB.Initialize(aLPB);
+ for (; aItLPB.More(); aItLPB.Next()) {
+ const BOPTools_PaveBlock& aPB=aItLPB.Value();
+ if (aPB.IsEqual(aPBE)) {
+ aLPB.Remove(aItLPB);
+ break;
+ }
+ }
+ //
+ iFlag=myContext->ComputeVE(aVT, aE, aT);
+ //
+ aPave.SetIndex(nVT);
+ aPave.SetParam(aT);
+ //
+ aPB1.SetOriginalEdge(nE);
+ aPB1.SetPave1(aPBE.Pave1());
+ aPB1.SetPave2(aPave);
+ //
+ aPB2.SetOriginalEdge(nE);
+ aPB2.SetPave1(aPave);
+ aPB2.SetPave2(aPBE.Pave2());
+ //
+ aLPB.Append(aPB1);
+ aLPB.Append(aPB2);
+}
+
+//=======================================================================
+//function : CheckCoincidence
+//purpose :
+//=======================================================================
+Standard_Boolean
+ BOPTools_PaveFiller::CheckCoincidence(const BOPTools_PaveBlock& aPB1,
+ const BOPTools_PaveBlock& aPB2)
+
+{
+ Standard_Boolean bRet;
+ Standard_Integer nV11, nV12, nV21, nV22, nE1, nE2, iFlag;
+ Standard_Real aT11, aT12, aT21, aT22, aTM, aTN, aTolE1;
+ gp_Pnt aPM;
+ TopoDS_Vertex aVM;
+ BRep_Builder aBB;
+ //
+ const BOPTools_Pave& aPave11=aPB1.Pave1();
+ nV11=aPave11.Index();
+ aT11=aPave11.Param();
+ //
+ const BOPTools_Pave& aPave12=aPB1.Pave2();
+ aT12=aPave12.Param();
+ nV12=aPave12.Index();
+ //
+ const BOPTools_Pave& aPave21=aPB2.Pave1();
+ nV21=aPave21.Index();
+ aT21=aPave21.Param();
+ //
+ const BOPTools_Pave& aPave22=aPB2.Pave2();
+ nV22=aPave22.Index();
+ aT22=aPave22.Param();
+ //
+ bRet=((nV11==nV21 && nV12==nV22) || (nV11==nV22 && nV12==nV21));
+ if (!bRet) {
+ return bRet;
+ }
+ //
+ nE1=aPB1.OriginalEdge();
+ const TopoDS_Edge& aE1=*((TopoDS_Edge*)&(myDS->Shape(nE1)));
+ aTolE1=BRep_Tool::Tolerance(aE1);
+ //
+ nE2=aPB2.OriginalEdge();
+ const TopoDS_Edge& aE2=*((TopoDS_Edge*)&(myDS->Shape(nE2)));
+ //
+ aTM=IntTools_Tools::IntermediatePoint (aT11, aT12);
+ BOPTools_Tools::PointOnEdge(aE1, aTM, aPM);
+ //
+ aBB.MakeVertex (aVM, aPM, aTolE1);
+ //
+ iFlag=myContext->ComputeVE(aVM, aE2, aTN);
+ if (iFlag) {
+ bRet=!bRet; //False
+ }
+ //
+ if (aT21 <aT22) {
+ bRet=(aTN>aT21 && aTN<aT22);
+ }
+ else {
+ bRet=(aTN>aT22 && aTN<aT21);
+ }
+ return bRet;
+}