1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00
occt/src/BOP/BOP_WireSolidHistoryCollector.cxx
bugmaster b311480ed5 0023024: Update headers of OCCT files
Added appropriate copyright and license information in source files
2012-03-21 19:43:04 +04:00

665 lines
21 KiB
C++
Executable File

// Copyright (c) 1999-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 <BOP_WireSolidHistoryCollector.ixx>
#include <TopExp_Explorer.hxx>
#include <TopAbs.hxx>
#include <BooleanOperations_ShapesDataStructure.hxx>
#include <BooleanOperations_IndexedDataMapOfShapeInteger.hxx>
#include <BOPTools_SSInterference.hxx>
#include <BOPTools_InterferencePool.hxx>
#include <BOPTools_CArray1OfSSInterference.hxx>
#include <BOPTools_ListIteratorOfListOfPaveBlock.hxx>
#include <BOPTools_Curve.hxx>
#include <BOPTools_PaveBlock.hxx>
#include <BOPTools_DSFiller.hxx>
#include <BOPTools_PaveFiller.hxx>
#include <BOPTools_CommonBlock.hxx>
#include <BOPTools_ListOfCommonBlock.hxx>
#include <BOPTools_ListIteratorOfListOfCommonBlock.hxx>
#include <BOPTools_ListIteratorOfListOfPave.hxx>
#include <BOPTools_PShapeShapeInterference.hxx>
#include <BOPTools_VVInterference.hxx>
#include <BOP_BuilderTools.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopExp.hxx>
static Standard_Boolean AddNewShape(const TopoDS_Shape& theKey,
const TopoDS_Shape& theItem,
TopTools_DataMapOfShapeListOfShape& theMap);
static void GetAncestorFaces(const Standard_Integer theShapeIndex,
const BooleanOperations_ShapesDataStructure& theDS,
TopTools_IndexedMapOfShape& theFaces);
static Standard_Integer GetShapeWire(const BooleanOperations_ShapesDataStructure& theDS,
const TopoDS_Shape& S1,
const TopoDS_Shape& S2,
TopoDS_Shape& WS);
// ====================================================================================================
// function: Constructor
// purpose:
// ====================================================================================================
BOP_WireSolidHistoryCollector::BOP_WireSolidHistoryCollector(const TopoDS_Shape& theShape1,
const TopoDS_Shape& theShape2,
const BOP_Operation theOperation) :
BOP_HistoryCollector(theShape1, theShape2, theOperation)
{
}
// ====================================================================================================
// function: SetResult
// purpose:
// ====================================================================================================
void BOP_WireSolidHistoryCollector::SetResult(const TopoDS_Shape& theResult,
const BOPTools_PDSFiller& theDSFiller)
{
myResult = theResult;
FillSection(theDSFiller);
FillEdgeHistory(theDSFiller);
myHasDeleted = Standard_False;
TopExp_Explorer anExp(myS1, TopAbs_FACE);
if(!anExp.More()) {
anExp.Init(myS2, TopAbs_FACE);
if(anExp.More()) {
myHasDeleted = Standard_True;
return;
}
}
else {
myHasDeleted = Standard_True;
return;
}
Standard_Integer i = 0;
for(i = (Standard_Integer)TopAbs_EDGE; !myHasDeleted && (i < (Standard_Integer)TopAbs_VERTEX); i++) {
TopAbs_ShapeEnum aType = (TopAbs_ShapeEnum) i;
TopTools_IndexedMapOfShape aMap;
TopExp::MapShapes(myResult, aType, aMap);
TopExp_Explorer anExpObj(myS1, aType);
for(; anExpObj.More(); anExpObj.Next()) {
const TopoDS_Shape& aS = anExpObj.Current();
if(!aMap.Contains(aS)) {
if((!myModifMap.IsBound(aS) || myModifMap(aS).IsEmpty()) &&
(!myGenMap.IsBound(aS) || myGenMap(aS).IsEmpty())) {
myHasDeleted = Standard_True;
break;
}
}
}
TopExp_Explorer anExpTool(myS2, aType);
for(; anExpTool.More(); anExpTool.Next()) {
const TopoDS_Shape& aS = anExpTool.Current();
if(!aMap.Contains(aS)) {
if((!myModifMap.IsBound(aS) || myModifMap(aS).IsEmpty()) &&
(!myGenMap.IsBound(aS) || myGenMap(aS).IsEmpty())) {
myHasDeleted = Standard_True;
break;
}
}
}
}
}
// ====================================================================================================
// function: FillSection
// purpose:
// ====================================================================================================
void BOP_WireSolidHistoryCollector::FillSection(const BOPTools_PDSFiller& theDSFiller)
{
// for edges
BOPTools_InterferencePool* pIntrPool = (BOPTools_InterferencePool*)&theDSFiller->InterfPool();
const BOPTools_PavePool& aPavePool = theDSFiller->PaveFiller().PavePool();
const BooleanOperations_ShapesDataStructure& aDS = theDSFiller->DS();
Standard_Integer nb = aDS.NumberOfShapesOfTheObject() + aDS.NumberOfShapesOfTheTool();
Standard_Integer i = 0;
TopTools_IndexedMapOfShape aResultMap;
if(!myResult.IsNull()) {
TopExp::MapShapes(myResult, TopAbs_VERTEX, aResultMap);
}
for(i = 1; i <= nb; i++) {
if(aDS.GetShapeType(i) != TopAbs_EDGE)
continue;
const BOPTools_PaveSet& aPaveSet = aPavePool.Value(aDS.RefEdge(i));
const BOPTools_ListOfPave& aListOfPave = aPaveSet.Set();
BOPTools_ListIteratorOfListOfPave anIt(aListOfPave);
TopTools_IndexedMapOfShape aMapOfVertex;
for(; anIt.More(); anIt.Next()) {
const BOPTools_Pave& aPave = anIt.Value();
if((aPave.Type() == BooleanOperations_EdgeSurface) ||
(aPave.Type() == BooleanOperations_EdgeEdge) ||
(aPave.Type() == BooleanOperations_VertexEdge)) {
BOPTools_PShapeShapeInterference anInter = pIntrPool->GetInterference(aPave.Interference(), aPave.Type());
if(anInter != NULL) {
const TopoDS_Shape& aS1 = aDS.Shape(anInter->Index1());
const TopoDS_Shape& aS2 = aDS.Shape(anInter->Index2());
const TopoDS_Shape& aNewShape = aDS.Shape(anInter->NewShape());
if(aNewShape.ShapeType() != TopAbs_VERTEX)
continue;
Standard_Boolean addfirst = Standard_False;
Standard_Boolean addsecond = Standard_False;
if(aResultMap.Contains(aNewShape)) {
if(i == anInter->Index1()) {
addfirst = Standard_True;
if(aS1.IsSame(aNewShape)) {
aMapOfVertex.Add(aNewShape);
continue;
}
if(aPave.Type() != BooleanOperations_EdgeEdge) {
addsecond = Standard_True;
if(aS2.IsSame(aNewShape)) {
aMapOfVertex.Add(aNewShape);
continue;
}
}
}
else {
addsecond = Standard_True;
if(aS2.IsSame(aNewShape)) {
aMapOfVertex.Add(aNewShape);
continue;
}
if(aPave.Type() != BooleanOperations_EdgeEdge) {
addfirst = Standard_True;
if(aS1.IsSame(aNewShape)) {
aMapOfVertex.Add(aNewShape);
continue;
}
}
}
TopTools_ListOfShape thelist;
if(addfirst) {
// modified by NIZHNY-3643 Thu Nov 13 17:33:38 2003 .b
if( aPave.Type() == BooleanOperations_EdgeEdge) {
TopTools_IndexedMapOfShape aSharedFaces;
aSharedFaces.Clear();
GetAncestorFaces(i,aDS,aSharedFaces);
Standard_Integer anbFaces = aSharedFaces.Extent();
if( anbFaces != 0 ) {
Standard_Integer iFace = 0;
for( iFace = 1; iFace <= anbFaces; iFace++ ) {
if(!myGenMap.IsBound(aSharedFaces.FindKey(iFace)))
myGenMap.Bind(aSharedFaces.FindKey(iFace), thelist);
myGenMap.ChangeFind(aSharedFaces.FindKey(iFace)).Append(aNewShape);
}
}
else {
if(!myGenMap.IsBound(aS1))
myGenMap.Bind(aS1, thelist);
myGenMap.ChangeFind(aS1).Append(aNewShape);
}
}
else {
if(!myGenMap.IsBound(aS1))
myGenMap.Bind(aS1, thelist);
myGenMap.ChangeFind(aS1).Append(aNewShape);
}
// modified by NIZHNY-3643 Thu Nov 13 17:34:45 2003 .e
}
if(addsecond) {
// modified by NIZHNY-3643 Thu Nov 13 17:33:38 2003 .b
if( aPave.Type() == BooleanOperations_EdgeEdge) {
TopTools_IndexedMapOfShape aSharedFaces;
aSharedFaces.Clear();
GetAncestorFaces(i,aDS,aSharedFaces);
Standard_Integer anbFaces = aSharedFaces.Extent();
if( anbFaces != 0 ) {
Standard_Integer iFace = 0;
for( iFace = 1; iFace <= anbFaces; iFace++ ) {
if(!myGenMap.IsBound(aSharedFaces.FindKey(iFace)))
myGenMap.Bind(aSharedFaces.FindKey(iFace), thelist);
myGenMap.ChangeFind(aSharedFaces.FindKey(iFace)).Append(aNewShape);
}
}
else {
if(!myGenMap.IsBound(aS2))
myGenMap.Bind(aS2, thelist);
myGenMap.ChangeFind(aS2).Append(aNewShape);
}
}
else {
if(!myGenMap.IsBound(aS2))
myGenMap.Bind(aS2, thelist);
myGenMap.ChangeFind(aS2).Append(aNewShape);
}
// modified by NIZHNY-3643 Thu Nov 13 19:01:19 2003 .e
}
}
}
}
}
// end for(; anIt.More...
// fill history for edges which vertices are on other shape.begin
TopTools_IndexedDataMapOfShapeListOfShape aMapOfOldNewVertex, aVEMap;
TopExp::MapShapesAndAncestors(myResult, TopAbs_VERTEX, TopAbs_EDGE, aVEMap);
Standard_Integer j = 0, k = 0;
TopTools_ListOfShape thelist1;
for(j = 1; j <= aDS.NumberOfSuccessors(i); j++) {
Standard_Integer avindex = aDS.GetSuccessor(i, j);
BOPTools_CArray1OfVVInterference& VVs = pIntrPool->VVInterferences();
Standard_Integer aNb = VVs.Extent();
for (k = 1; k <= aNb; k++) {
BOPTools_VVInterference& VV=VVs(k);
Standard_Integer anIndex1 = VV.Index1();
Standard_Integer anIndex2 = VV.Index2();
if((avindex == anIndex1) || (avindex == anIndex2)) {
Standard_Integer aNewShapeIndex = VV.NewShape();
TopoDS_Shape aNewShape = aDS.Shape(aNewShapeIndex);
if(!aVEMap.Contains(aNewShape))
continue;
if(aVEMap.FindFromKey(aNewShape).Extent() >= 2)
continue;
for(Standard_Integer vit = 0; vit < 2; vit++) {
TopoDS_Shape aShape = (vit == 0) ? aDS.Shape(anIndex1) : aDS.Shape(anIndex2);
if(!aMapOfOldNewVertex.Contains(aShape))
aMapOfOldNewVertex.Add(aShape, thelist1);
aMapOfOldNewVertex.ChangeFromKey(aShape).Append(aNewShape);
}
break;
}
}
for(Standard_Integer aninterit = 0; aninterit < 2; aninterit++) {
if(aninterit == 0)
aNb = pIntrPool->VEInterferences().Extent();
else
aNb = pIntrPool->VSInterferences().Extent();
for (k = 1; k <= aNb; k++) {
BOPTools_ShapeShapeInterference* anInterference = NULL;
if(aninterit == 0)
anInterference = (BOPTools_ShapeShapeInterference*)(&pIntrPool->VEInterferences().Value(k));
else
anInterference = (BOPTools_ShapeShapeInterference*)(&pIntrPool->VSInterferences().Value(k));
Standard_Integer anIndex1 = anInterference->Index1();
Standard_Integer anIndex2 = anInterference->Index2();
if((avindex == anIndex1) || (avindex == anIndex2)) {
Standard_Integer aNewShapeIndex = anInterference->NewShape();
TopoDS_Shape aNewShape = aDS.Shape(aNewShapeIndex);
if(!aVEMap.Contains(aNewShape))
continue;
if(aVEMap.FindFromKey(aNewShape).Extent() >= 2)
continue;
TopoDS_Shape aShape1 = aDS.Shape(avindex);
TopoDS_Shape aShape2 = (avindex == anIndex1) ? aDS.Shape(anIndex2) : aDS.Shape(anIndex1);
if(!aMapOfOldNewVertex.Contains(aShape1))
aMapOfOldNewVertex.Add(aShape1, thelist1);
aMapOfOldNewVertex.ChangeFromKey(aShape1).Append(aNewShape);
AddNewShape(aShape2, aNewShape, myGenMap);
}
}
}
}
// modified by NIZHNY-3643 Fri Nov 14 09:59:47 2003 .b
TopoDS_Shape WShape;
Standard_Integer wRank = GetShapeWire(aDS,myS1,myS2,WShape);
// modified by NIZHNY-3643 Fri Nov 14 09:59:53 2003 .e
if(!aMapOfOldNewVertex.IsEmpty()) {
TopTools_IndexedDataMapOfShapeListOfShape aMapVE;
// modified by NIZHNY-3643 Fri Nov 14 10:01:32 2003 .b
Standard_Integer iSh = 0;
TopoDS_Shape aCShape;
for( iSh = 1; iSh <= 2; iSh ++ ) {
if( iSh == 1 ) {
TopExp::MapShapesAndAncestors(myS1, TopAbs_VERTEX, TopAbs_EDGE, aMapVE);
aCShape = myS1;
}
else {
aMapVE.Clear();
TopExp::MapShapesAndAncestors(myS2, TopAbs_VERTEX, TopAbs_EDGE, aMapVE);
aCShape = myS2;
}
Standard_Integer vit = 0;
for(vit = 1; vit <= aMapOfOldNewVertex.Extent(); vit++) {
const TopoDS_Shape& aV = aMapOfOldNewVertex.FindKey(vit);
if(!aMapVE.Contains(aV))
continue;
TopTools_ListIteratorOfListOfShape aEIt(aMapVE.FindFromKey(aV));
const TopTools_ListOfShape& aNewVList = aMapOfOldNewVertex.FindFromIndex(vit);
if(aNewVList.IsEmpty())
continue;
TopoDS_Shape aNewShape = aNewVList.First();
// for wire old
if( aCShape.IsSame(WShape) ) {
for(; aEIt.More(); aEIt.Next()) {
const TopoDS_Shape& aE = aEIt.Value();
AddNewShape(aE, aNewShape, myGenMap);
}
// avoid shared edges from solids here
Standard_Integer eRank = aDS.Rank(i);
if( eRank != wRank ) {
TopTools_IndexedMapOfShape aSharedFaces;
aSharedFaces.Clear();
GetAncestorFaces(i,aDS,aSharedFaces);
if( aSharedFaces.Extent() == 1 ) {
TopoDS_Shape aE = aDS.Shape(i);
AddNewShape(aE, aNewShape, myGenMap);
}
}
else {
TopoDS_Shape aE = aDS.Shape(i);
AddNewShape(aE, aNewShape, myGenMap);
}
}
else {
// for solid new
TopTools_IndexedMapOfShape aSharedFaces;
aSharedFaces.Clear();
Standard_Integer sRank = (wRank == 1) ? 2 : 1;
for(; aEIt.More(); aEIt.Next()) {
const TopoDS_Shape& aE = aEIt.Value();
Standard_Integer iE = aDS.ShapeIndex(aE,sRank);
if( iE != 0 )
GetAncestorFaces(iE,aDS,aSharedFaces);
}
TopoDS_Shape aE = aDS.Shape(i);
Standard_Integer iE = aDS.ShapeIndex(aE,sRank);
if( iE != 0 )
GetAncestorFaces(iE,aDS,aSharedFaces);
if( aSharedFaces.Extent() != 0 ) {
Standard_Integer anbFaces = aSharedFaces.Extent();
Standard_Integer iFace = 0;
for( iFace = 1; iFace <= anbFaces; iFace++ ) {
AddNewShape(aSharedFaces.FindKey(iFace), aNewShape, myGenMap);
}
}
}
}
}
// modified by NIZHNY-3643 Fri Nov 14 10:02:19 2003 .e
}
// fill history for edges which vertices are on other shape.end
if(!aMapOfVertex.IsEmpty()) {
if(!myResult.IsNull()) {
TopTools_IndexedDataMapOfShapeListOfShape aMapVE;
TopExp::MapShapesAndAncestors(myS1, TopAbs_VERTEX, TopAbs_EDGE, aMapVE);
TopExp::MapShapesAndAncestors(myS2, TopAbs_VERTEX, TopAbs_EDGE, aMapVE);
Standard_Integer vit = 0;
for(vit = 1; vit <= aMapOfVertex.Extent(); vit++) {
const TopoDS_Shape& aV = aMapOfVertex(vit);
if(!aMapVE.Contains(aV))
continue;
TopTools_ListIteratorOfListOfShape aEIt(aMapVE.FindFromKey(aV));
for(; aEIt.More(); aEIt.Next()) {
const TopoDS_Shape& aE = aEIt.Value();
AddNewShape(aE, aV, myGenMap);
}
TopoDS_Shape aE = aDS.Shape(i);
AddNewShape(aE, aV, myGenMap);
}
}
}
}
}
// ====================================================================================================
// function: FillEdgeHistory
// purpose: Fills modified map for edges,
// fills generated map for edges (vertex type of intersection, edge type of intersection)
// ====================================================================================================
void BOP_WireSolidHistoryCollector::FillEdgeHistory(const BOPTools_PDSFiller& theDSFiller)
{
const BooleanOperations_ShapesDataStructure& aDS = theDSFiller->DS();
const BOPTools_PaveFiller& aPaveFiller = theDSFiller->PaveFiller();
const BOPTools_SplitShapesPool& aSplitShapesPool = aPaveFiller.SplitShapesPool();
TopTools_IndexedMapOfShape aResultMap;
if(!myResult.IsNull()) {
TopExp::MapShapes(myResult, TopAbs_EDGE, aResultMap);
}
Standard_Integer iRank = 1;
for(; iRank <= 2; iRank++) {
BooleanOperations_StateOfShape aStateCmp, aState;
aStateCmp = BOP_BuilderTools::StateToCompare(iRank, myOp);
Standard_Integer i = 0;
Standard_Integer nb = aDS.NumberOfShapesOfTheObject();
nb = (iRank == 1) ? nb : (nb + aDS.NumberOfShapesOfTheTool());
Standard_Integer startindex = (iRank == 1) ? 1 : (aDS.NumberOfShapesOfTheObject() + 1);
for(i = startindex; i <= nb; i++) {
if(aDS.GetShapeType(i) != TopAbs_EDGE)
continue;
const BOPTools_ListOfPaveBlock& aLPB = aSplitShapesPool(aDS.RefEdge(i));
const TopoDS_Shape& anOldShape = aDS.Shape(i);
if(!aLPB.IsEmpty()) {
BOPTools_ListIteratorOfListOfPaveBlock aPBIt(aLPB);
for(; aPBIt.More(); aPBIt.Next()) {
const BOPTools_PaveBlock& aPB = aPBIt.Value();
Standard_Integer nSp = aPB.Edge();
if(nSp == i)
continue;
aState=aDS.GetState(nSp);
if ((aState == aStateCmp) || (myOp==BOP_COMMON && (aState == BooleanOperations_ON))) {
const TopoDS_Shape& aNewShape = aDS.Shape(nSp);
if(aResultMap.Contains(aNewShape)) {
Standard_Integer bIsGenerated = Standard_True;
if((myOp == BOP_CUT) || (myOp == BOP_FUSE)) {
bIsGenerated = (iRank == 2);
}
else {
if(myOp == BOP_CUT21) {
bIsGenerated = (iRank == 1);
}
else if(myOp == BOP_COMMON) {
bIsGenerated = Standard_False;
}
}
TopTools_DataMapOfShapeListOfShape& aHistoryMap = (bIsGenerated) ? myGenMap : myModifMap;
if(aHistoryMap.IsBound(anOldShape)) {
aHistoryMap.ChangeFind(anOldShape).Append(aNewShape);
}
else {
TopTools_ListOfShape aShapeList;
aShapeList.Append(aNewShape);
aHistoryMap.Bind(anOldShape, aShapeList);
}
}
}
}
}
//end if(!aLPB.IsEmpty...
const BOPTools_CommonBlockPool& aCBPool = aPaveFiller.CommonBlockPool();
const BOPTools_ListOfCommonBlock& aLCB = aCBPool(aDS.RefEdge(i));
BOPTools_ListIteratorOfListOfCommonBlock anItCB(aLCB);
Standard_Boolean bWireIsObject = (myS1.ShapeType() == TopAbs_WIRE);
Standard_Boolean bFillWithCommonPart = bWireIsObject ? (iRank == 1) : (iRank == 2);
for (; bFillWithCommonPart && anItCB.More(); anItCB.Next()) {
const BOPTools_CommonBlock& aCB = anItCB.Value();
const BOPTools_PaveBlock& aPB = aCB.PaveBlock1();
Standard_Integer nSp = aPB.Edge();
TopoDS_Shape aNewShape = aDS.Shape(nSp);
Standard_Boolean found = Standard_True;
if(!aResultMap.Contains(aNewShape)) {
nSp = aCB.PaveBlock2().Edge();
found = Standard_False;
if(nSp) {
aNewShape = aDS.Shape(nSp);
found = aResultMap.Contains(aNewShape);
}
}
if(found) {
TopTools_DataMapOfShapeListOfShape& aHistoryMap = myModifMap;
if(aHistoryMap.IsBound(anOldShape)) {
aHistoryMap.ChangeFind(anOldShape).Append(aNewShape);
}
else {
TopTools_ListOfShape aShapeList;
aShapeList.Append(aNewShape);
aHistoryMap.Bind(anOldShape, aShapeList);
}
}
}
}
// end for(i = startindex...
}
}
// --------------------------------------------------------------------------------
// static function: AddNewShape
// purpose:
// --------------------------------------------------------------------------------
Standard_Boolean AddNewShape(const TopoDS_Shape& theKey,
const TopoDS_Shape& theItem,
TopTools_DataMapOfShapeListOfShape& theMap) {
if(!theMap.IsBound(theKey)) {
TopTools_ListOfShape aList;
aList.Append(theItem);
theMap.Bind(theKey, aList);
return Standard_True;
}
Standard_Boolean found = Standard_False;
TopTools_ListOfShape& aList = theMap.ChangeFind(theKey);
TopTools_ListIteratorOfListOfShape aVIt(aList);
for(; aVIt.More(); aVIt.Next()) {
if(theItem.IsSame(aVIt.Value())) {
found = Standard_True;
break;
}
}
if(!found) {
aList.Append(theItem);
}
return !found;
}
void GetAncestorFaces(const Standard_Integer theShapeIndex,
const BooleanOperations_ShapesDataStructure& theDS,
TopTools_IndexedMapOfShape& theFaces)
{
// find ancestors for the edge
Standard_Integer nbeA = theDS.NumberOfAncestors(theShapeIndex);
if( nbeA == 0 ) return;
Standard_Integer ieA = 0;
for( ieA = 1; ieA <= nbeA; ieA++ ) {
Standard_Integer indxA = theDS.GetAncestor(theShapeIndex,ieA);
TopAbs_ShapeEnum aShapeType = theDS.GetShapeType(indxA);
if( aShapeType == TopAbs_FACE ) {
theFaces.Add(theDS.Shape(indxA));
}
else if( aShapeType == TopAbs_WIRE ) {
GetAncestorFaces(indxA,theDS,theFaces);
}
else {
return;
}
}
}
Standard_Integer GetShapeWire(const BooleanOperations_ShapesDataStructure& theDS,
const TopoDS_Shape& S1,
const TopoDS_Shape& S2,
TopoDS_Shape& WS)
{
Standard_Integer wRank = 0;
if( S1.ShapeType() == TopAbs_WIRE ) {
if( S1.IsSame(theDS.Object()) )
wRank = 1;
else
wRank = 2;
WS = S1;
}
else {
if( S2.IsSame(theDS.Object()) )
wRank = 1;
else
wRank = 2;
WS = S2;
}
return wRank;
}