From d2d376f20f39d8d23e66c60a3cb21acbd2c52922 Mon Sep 17 00:00:00 2001 From: pkv Date: Wed, 19 Mar 2014 07:02:28 +0400 Subject: [PATCH] 0024733: Subshape IDs change between two executions of a same script Changes: 1. class BOPTools_Set - method: void BOPTools_Set::AddEdges(const TopoDS_Shape& aS) has been removed as redundant 2. class BOPTools_Set - method: Standard_Boolean BOPTools_Set::IsEqual (const BOPTools_Set& theOther)const has been modified to take into account Locations of the shapes 3. class BOPAlgo_Builder - method: void BOPAlgo_Builder::FillSameDomainFaces() has been modified in accordance with the modifications done in II.1. --- src/BOPAlgo/BOPAlgo_Builder_2.cxx | 120 ++++++----- src/BOPTools/BOPTools_Set.cdl | 57 ++---- src/BOPTools/BOPTools_Set.cxx | 195 ++++++++++++++++++ src/BOPTools/BOPTools_Set.lxx | 325 ------------------------------ 4 files changed, 276 insertions(+), 421 deletions(-) delete mode 100755 src/BOPTools/BOPTools_Set.lxx diff --git a/src/BOPAlgo/BOPAlgo_Builder_2.cxx b/src/BOPAlgo/BOPAlgo_Builder_2.cxx index 8426a7d17e..778c693cb4 100644 --- a/src/BOPAlgo/BOPAlgo_Builder_2.cxx +++ b/src/BOPAlgo/BOPAlgo_Builder_2.cxx @@ -150,8 +150,6 @@ void BOPAlgo_Builder::BuildSplitFaces() anOriF=aF.Orientation(); aFF=aF; aFF.Orientation(TopAbs_FORWARD); - // - // // 1. Fill the egdes set for the face aFF -> LE aLE.Clear(); @@ -300,7 +298,7 @@ void BOPAlgo_Builder::FillSameDomainFaces() BOPCol_MapOfShape aMFence; BOPAlgo_IndexedDataMapOfSetInteger aIDMSS; BOPAlgo_VectorOfVectorOfShape aVVS; -// + // myErrorStatus=0; // const BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF(); @@ -353,63 +351,63 @@ void BOPAlgo_Builder::FillSameDomainFaces() // if (bFlag) { for (k=0; k<2; ++k) { - const TopoDS_Shape& aF=(!k) ? aF1 : aF2; - const BOPCol_ListOfShape& aLF=mySplits.Find(aF); - // - aItF.Initialize(aLF); - for (; aItF.More(); aItF.Next()) { - const TopoDS_Shape& aFx=aItF.Value(); - // - if (aMFence.Add(aFx)) { - BOPTools_Set aSTx; - // - aSTx.AddEdges(aFx); - // - if (!aIDMSS.Contains(aSTx)) { - BOPAlgo_VectorOfShape& aVS=aVVS.Append1(); - aVS.Append(aFx); - // - j=aVVS.Extent()-1; - aIDMSS.Add (aSTx, j); - } - else { - j=aIDMSS.ChangeFromKey(aSTx); - BOPAlgo_VectorOfShape& aVS=aVVS(j); - aVS.Append(aFx); - } - } - } + const TopoDS_Shape& aF=(!k) ? aF1 : aF2; + const BOPCol_ListOfShape& aLF=mySplits.Find(aF); + // + aItF.Initialize(aLF); + for (; aItF.More(); aItF.Next()) { + const TopoDS_Shape& aFx=aItF.Value(); + // + if (aMFence.Add(aFx)) { + BOPTools_Set aSTx; + // + aSTx.Add(aFx, TopAbs_EDGE); + // + if (!aIDMSS.Contains(aSTx)) { + BOPAlgo_VectorOfShape& aVS=aVVS.Append1(); + aVS.Append(aFx); + // + j=aVVS.Extent()-1; + aIDMSS.Add (aSTx, j); + } + else { + j=aIDMSS.ChangeFromKey(aSTx); + BOPAlgo_VectorOfShape& aVS=aVVS(j); + aVS.Append(aFx); + } + } + } } }// if (bFlag) { else {// if (!bFlag) BOPTools_Set aST1, aST2; // - aST1.AddEdges(aF1); - aST2.AddEdges(aF2); + aST1.Add(aF1, TopAbs_EDGE); + aST2.Add(aF2, TopAbs_EDGE); // if (aST1.IsEqual(aST2)) { - if (!aIDMSS.Contains(aST1)) { - BOPAlgo_VectorOfShape& aVS=aVVS.Append1(); - if (aMFence.Add(aF1)) { - aVS.Append(aF1); - } - if (aMFence.Add(aF2)) { - aVS.Append(aF2); - } - // - k=aVVS.Extent()-1; - aIDMSS.Add (aST1, k); - } - else { - k=aIDMSS.ChangeFromKey(aST1); - BOPAlgo_VectorOfShape& aVS=aVVS(k); - if (aMFence.Add(aF1)) { - aVS.Append(aF1); - } - if (aMFence.Add(aF2)) { - aVS.Append(aF2); - } - } + if (!aIDMSS.Contains(aST1)) { + BOPAlgo_VectorOfShape& aVS=aVVS.Append1(); + if (aMFence.Add(aF1)) { + aVS.Append(aF1); + } + if (aMFence.Add(aF2)) { + aVS.Append(aF2); + } + // + k=aVVS.Extent()-1; + aIDMSS.Add (aST1, k); + } + else { + k=aIDMSS.ChangeFromKey(aST1); + BOPAlgo_VectorOfShape& aVS=aVVS(k); + if (aMFence.Add(aF1)) { + aVS.Append(aF1); + } + if (aMFence.Add(aF2)) { + aVS.Append(aF2); + } + } }//if (aST1.IsEqual(aST2)) { }// else {// if (!bFlag) // @@ -433,10 +431,10 @@ void BOPAlgo_Builder::FillSameDomainFaces() for (j=0; j +#include +#include +#include +#include +#include + +static + Standard_Integer NormalizedIds(const Standard_Integer aId, + const Standard_Integer aDiv); + +//======================================================================= +//function : +//purpose : +//======================================================================= +BOPTools_Set::BOPTools_Set() +: + myAllocator(NCollection_BaseAllocator::CommonBaseAllocator()), + myShapes(myAllocator) +{ + myNbShapes=0; + mySum=0; + myUpper=432123; +} +//======================================================================= +//function : +//purpose : +//======================================================================= +BOPTools_Set::BOPTools_Set + (const Handle(NCollection_BaseAllocator)& theAllocator) +: + myAllocator(theAllocator), + myShapes(myAllocator) +{ + myNbShapes=0; + mySum=0; + myUpper=432123; +} +//======================================================================= +//function :~ +//purpose : +//======================================================================= +BOPTools_Set::~BOPTools_Set() +{ + Clear(); +} +//======================================================================= +//function : Clear +//purpose : +//======================================================================= +void BOPTools_Set::Clear() +{ + myNbShapes=0; + mySum=0; + myShapes.Clear(); +} +//======================================================================= +//function : NbShapes +//purpose : +//======================================================================= +Standard_Integer BOPTools_Set::NbShapes()const +{ + return myNbShapes; +} +//======================================================================= +//function :Assign +//purpose : +//======================================================================= +BOPTools_Set& BOPTools_Set::Assign(const BOPTools_Set& theOther) +{ + BOPCol_ListIteratorOfListOfShape aIt; + // + myShape=theOther.myShape; + myNbShapes=theOther.myNbShapes; + mySum=theOther.mySum; + myUpper=theOther.myUpper; + myAllocator=theOther.myAllocator; + // + myShapes.Clear(); + aIt.Initialize(theOther.myShapes); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSx=aIt.Value(); + myShapes.Append(aSx); + } + return *this; +} +//======================================================================= +//function : Shape +//purpose : +//======================================================================= +const TopoDS_Shape& BOPTools_Set::Shape()const +{ + return myShape; +} +//======================================================================= +//function : HashCode +//purpose : +//======================================================================= +Standard_Integer BOPTools_Set::HashCode + (const Standard_Integer theUpper)const +{ + return ::HashCode(mySum, theUpper); +} +//======================================================================= +//function : IsEqual +//purpose : +//======================================================================= +Standard_Boolean BOPTools_Set::IsEqual + (const BOPTools_Set& theOther)const +{ + Standard_Boolean bRet; + // + bRet=Standard_False; + // + if (theOther.myNbShapes!=myNbShapes) { + return bRet; + } + // + BOPCol_MapOfShape aM1; + BOPCol_ListIteratorOfListOfShape aIt; + // + aIt.Initialize(myShapes); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSx1=aIt.Value(); + aM1.Add(aSx1); + } + // + aIt.Initialize(theOther.myShapes); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSx2=aIt.Value(); + if (!aM1.Contains(aSx2)) { + return bRet; + } + } + // + return !bRet; +} +//======================================================================= +//function : Add +//purpose : +//======================================================================= +void BOPTools_Set::Add(const TopoDS_Shape& theS, + const TopAbs_ShapeEnum theType) +{ + Standard_Integer aId, aIdN; + TopExp_Explorer aExp; + // + myShape=theS; + myShapes.Clear(); + myNbShapes=0; + mySum=0; + // + aExp.Init(theS, theType); + for (; aExp.More(); aExp.Next()) { + const TopoDS_Shape& aSx=aExp.Current(); + if (theType==TopAbs_EDGE) { + const TopoDS_Edge& aEx=*((TopoDS_Edge*)&aSx); + if (BRep_Tool::Degenerated(aEx)) { + continue; + } + } + myShapes.Append(aSx); + } + // + myNbShapes=myShapes.Extent(); + if (!myNbShapes) { + return; + } + // + BOPCol_ListIteratorOfListOfShape aIt; + // + aIt.Initialize(myShapes); + for (; aIt.More(); aIt.Next()) { + const TopoDS_Shape& aSx=aIt.Value(); + aId=aSx.HashCode(myUpper); + aIdN=NormalizedIds(aId, myNbShapes); + mySum+=aIdN; + } +} +//======================================================================= +// function: NormalizedIds +// purpose : +//======================================================================= +Standard_Integer NormalizedIds(const Standard_Integer aId, + const Standard_Integer aDiv) +{ + Standard_Integer aMax, aTresh, aIdRet; + // + aIdRet=aId; + aMax=::IntegerLast(); + aTresh=aMax/aDiv; + if (aId>aTresh) { + aIdRet=aId%aTresh; + } + return aIdRet; +} diff --git a/src/BOPTools/BOPTools_Set.lxx b/src/BOPTools/BOPTools_Set.lxx deleted file mode 100755 index 3e7a82aaa1..0000000000 --- a/src/BOPTools/BOPTools_Set.lxx +++ /dev/null @@ -1,325 +0,0 @@ -// Created by: Peter KURNEV -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//#include - -#include -#include - - -static - inline Standard_Boolean operator<(const TopoDS_Shape& theS1, - const TopoDS_Shape& theS2); -static - inline void SortShell(const int n, TopoDS_Shape *a); - -static - inline Standard_Integer NormalizedIds(const Standard_Integer aId, - const Standard_Integer aDiv); -//======================================================================= -//function : -//purpose : -//======================================================================= - inline BOPTools_Set::BOPTools_Set() -: - myAllocator(NCollection_BaseAllocator::CommonBaseAllocator()), - myShapes(myAllocator) -{ - myNbShapes=0; - mySum=0; - myUpper=432123; -} -//======================================================================= -//function : -//purpose : -//======================================================================= - inline BOPTools_Set::BOPTools_Set(const Handle(NCollection_BaseAllocator)& theAllocator) -: - myAllocator(theAllocator), - myShapes(myAllocator) -{ - myNbShapes=0; - mySum=0; - myUpper=432123; -} -//======================================================================= -//function :~ -//purpose : -//======================================================================= - inline BOPTools_Set::~BOPTools_Set() -{ - Clear(); -} -//======================================================================= -//function : Clear -//purpose : -//======================================================================= - inline void BOPTools_Set::Clear() -{ - myNbShapes=0; - mySum=0; - myShapes.Clear(); -} -//======================================================================= -//function : NbShapes -//purpose : -//======================================================================= - inline Standard_Integer BOPTools_Set::NbShapes()const -{ - return myNbShapes; -} -//======================================================================= -//function :Assign -//purpose : -//======================================================================= - inline BOPTools_Set& BOPTools_Set::Assign(const BOPTools_Set& theOther) -{ - BOPCol_ListIteratorOfListOfShape aIt; - // - myShape=theOther.myShape; - myNbShapes=theOther.myNbShapes; - mySum=theOther.mySum; - myUpper=theOther.myUpper; - myAllocator=theOther.myAllocator; - // - myShapes.Clear(); - aIt.Initialize(theOther.myShapes); - for (; aIt.More(); aIt.Next()) { - const TopoDS_Shape& aSx=aIt.Value(); - myShapes.Append(aSx); - } - return *this; -} -//======================================================================= -//function : Shape -//purpose : -//======================================================================= - inline const TopoDS_Shape& BOPTools_Set::Shape()const -{ - return myShape; -} -//======================================================================= -//function : Add -//purpose : -//======================================================================= - inline void BOPTools_Set::Add(const TopoDS_Shape& theS, - const TopAbs_ShapeEnum theType) -{ - if (theType==TopAbs_EDGE) { - AddEdges(theS); - return; - } - // - Standard_Integer i, aNb, aId, aIdN; - TopoDS_Shape *pShapes; - TopExp_Explorer aExp; - // - myNbShapes=0; - mySum=0; - myShape=theS; - // - aExp.Init(theS, theType); - for (aNb=0; aExp.More(); aExp.Next(), ++aNb) { - } - // - if (!aNb) { - return; - } - // - myNbShapes=aNb; - pShapes=(TopoDS_Shape *)myAllocator->Allocate(aNb*sizeof(TopoDS_Shape)); - // - aExp.ReInit(); - for (i=0; aExp.More(); aExp.Next(),++i) { - const TopoDS_Shape& aSx=aExp.Current(); - new (pShapes+i) TopoDS_Shape(); - pShapes[i]=aSx; - } - // - SortShell(aNb, pShapes); - // - myShapes.Clear(); - for (i=0; iFree(pShapes); -} -//======================================================================= -//function : AddEdges -//purpose : -//======================================================================= - inline void BOPTools_Set::AddEdges(const TopoDS_Shape& theS) -{ - Standard_Integer i, aNb, aId, aIdN; - TopoDS_Shape *pShapes; - TopExp_Explorer aExp; - // - myNbShapes=0; - mySum=0; - myShape=theS; - // - aExp.Init(theS, TopAbs_EDGE); - for (aNb=0; aExp.More(); aExp.Next()) { - const TopoDS_Edge& aE=(*(TopoDS_Edge*)(&aExp.Current())); - if (!BRep_Tool::Degenerated(aE)) { - ++aNb; - } - } - // - if (!aNb) { - return; - } - // - myNbShapes=aNb; - pShapes=(TopoDS_Shape *)myAllocator->Allocate(aNb*sizeof(TopoDS_Shape)); - // - i=0; - aExp.ReInit(); - for (; aExp.More(); aExp.Next()) { - const TopoDS_Shape& aSx=aExp.Current(); - const TopoDS_Edge& aE=(*(TopoDS_Edge*)(&aSx)); - if (!BRep_Tool::Degenerated(aE)) { - new (pShapes+i) TopoDS_Shape(); - pShapes[i]=aSx; - ++i; - } - } - // - SortShell(aNb, pShapes); - // - myShapes.Clear(); - for (i=0; iFree(pShapes); -} -//======================================================================= -//function : IsEqual -//purpose : -//======================================================================= - inline Standard_Boolean BOPTools_Set::IsEqual(const BOPTools_Set& theOther)const -{ - Standard_Boolean bRet; - // - bRet=Standard_False; - // - if (theOther.myNbShapes!=myNbShapes) { - return bRet; - } - // - BOPCol_ListIteratorOfListOfShape aIt1, aIt2; - // - aIt1.Initialize(myShapes); - aIt2.Initialize(theOther.myShapes); - for (; aIt1.More()||aIt2.More(); aIt1.Next(), aIt2.Next()) { - const TopoDS_Shape& aSx1=aIt1.Value(); - const TopoDS_Shape& aSx2=aIt2.Value(); - if (aSx1.TShape().operator->() != aSx2.TShape().operator->()) { - return bRet; - } - } - return !bRet; -} -//======================================================================= -//function : HashCode -//purpose : -//======================================================================= - inline Standard_Integer BOPTools_Set::HashCode(const Standard_Integer theUpper)const -{ - return ::HashCode(mySum, theUpper); -} -//======================================================================= -// function: NormalizedIds -// purpose : -//======================================================================= -Standard_Integer NormalizedIds(const Standard_Integer aId, - const Standard_Integer aDiv) -{ - Standard_Integer aMax, aTresh, aIdRet; - // - aIdRet=aId; - aMax=::IntegerLast(); - aTresh=aMax/aDiv; - if (aId>aTresh) { - aIdRet=aId%aTresh; - } - return aIdRet; -} - -//======================================================================= -//function : operator< -//purpose : -//======================================================================= -Standard_Boolean operator<(const TopoDS_Shape& theS1, - const TopoDS_Shape& theS2) -{ - Standard_Address aAddr1, aAddr2; - // - const Handle(TopoDS_TShape)& aTS1=theS1.TShape(); - aAddr1=aTS1.operator->(); - // - const Handle(TopoDS_TShape)& aTS2=theS2.TShape(); - aAddr2=aTS2.operator->(); - // - return (aAddr1 -1) goto m30; - }//if (a[l] < a[j]){ - }//for (i=0; i