1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-07 18:30:55 +03:00
occt/src/BRepAlgo/BRepAlgo_DSAccess.cxx
abv 42cf5bc1ca 0024002: Overall code and build procedure refactoring -- automatic
Automatic upgrade of OCCT code by command "occt_upgrade . -nocdl":
- WOK-generated header files from inc and sources from drv are moved to src
- CDL files removed
- All packages are converted to nocdlpack
2015-07-12 07:42:38 +03:00

1773 lines
52 KiB
C++

// Created on: 1997-08-13
// Created by: Prestataire Mary FABIEN
// Copyright (c) 1997-1999 Matra Datavision
// 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 <BRepAlgo_BooleanOperations.hxx>
#include <BRepAlgo_DSAccess.hxx>
#include <BRepAlgo_EdgeConnector.hxx>
#include <TColStd_IndexedMapOfInteger.hxx>
#include <TColStd_ListIteratorOfListOfInteger.hxx>
#include <TColStd_ListOfInteger.hxx>
#include <TColStd_MapIteratorOfMapOfInteger.hxx>
#include <TColStd_MapIteratorOfPackedMapOfInteger.hxx>
#include <TColStd_MapOfInteger.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Compound.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Wire.hxx>
#include <TopOpeBRep_DSFiller.hxx>
#include <TopOpeBRepBuild_FaceBuilder.hxx>
#include <TopOpeBRepBuild_HBuilder.hxx>
#include <TopOpeBRepBuild_WireEdgeSet.hxx>
#include <TopOpeBRepDS_BuildTool.hxx>
#include <TopOpeBRepDS_Check.hxx>
#include <TopOpeBRepDS_CheckStatus.hxx>
#include <TopOpeBRepDS_CurveExplorer.hxx>
#include <TopOpeBRepDS_CurveIterator.hxx>
#include <TopOpeBRepDS_Filter.hxx>
#include <TopOpeBRepDS_HDataStructure.hxx>
#include <TopOpeBRepDS_Interference.hxx>
#include <TopOpeBRepDS_InterferenceIterator.hxx>
#include <TopOpeBRepDS_ListIteratorOfListOfInterference.hxx>
#include <TopOpeBRepDS_ListOfInterference.hxx>
#include <TopOpeBRepDS_PointIterator.hxx>
#include <TopOpeBRepDS_Reducer.hxx>
#include <TopOpeBRepDS_ShapeShapeInterference.hxx>
#include <TopOpeBRepTool_GeomTool.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_ListOfShape.hxx>
#include <TopTools_MapOfShape.hxx>
#ifdef DRAW
//#include <TestTopOpe.hxx>
#endif
//=======================================================================
//function : Create
//purpose :
//=======================================================================
BRepAlgo_DSAccess::BRepAlgo_DSAccess() {
Init();
}
//=======================================================================
//function : Init
//purpose :
//=======================================================================
void BRepAlgo_DSAccess::Init()
{
if(myHDS.IsNull())
myHDS = new TopOpeBRepDS_HDataStructure();
else
myHDS->ChangeDS().Init();
myRecomputeBuilderIsDone = Standard_False;
myGetSectionIsDone = Standard_False;
myListOfCompoundOfEdgeConnected.Clear();
myEC = new BRepAlgo_EdgeConnector();
myHB.Nullify();
// init of the builder
Standard_Real tol3dAPPROX = 1e-7;
Standard_Real tol2dAPPROX = 1e-7;
// set tolerance values used by the APPROX process
TopOpeBRepTool_GeomTool GT;
GT.Define(TopOpeBRepTool_APPROX);
GT.SetTolerances(tol3dAPPROX,tol2dAPPROX);
TopOpeBRepDS_BuildTool BT(GT);
myHB = new TopOpeBRepBuild_HBuilder(BT);
myHB->ChangeBuilder().ChangeClassify(Standard_False);
myState1 = TopAbs_UNKNOWN;
myState2 = TopAbs_UNKNOWN;
}
// Filling of the DS
//=======================================================================
//function : Load
//purpose :
//=======================================================================
void BRepAlgo_DSAccess::Load(const TopoDS_Shape& S)
{
TopOpeBRepDS_DataStructure& DS = myHDS->ChangeDS();
myS1 = S;
DS.AddShape(S, 1);
}
//=======================================================================
//function : Load
//purpose :
//=======================================================================
void BRepAlgo_DSAccess::Load(TopoDS_Shape& S1,
TopoDS_Shape& S2)
{
TopOpeBRepDS_DataStructure& DS = myHDS->ChangeDS();
if ( S1.Orientation() == TopAbs_REVERSED ) {
S1.Orientation(TopAbs_FORWARD);
}
if ( S2.Orientation() == TopAbs_REVERSED ) {
S2.Orientation(TopAbs_FORWARD);
}
DS.AddShape(S1,1);
DS.AddShape(S2,2);
TopOpeBRepTool_ShapeExplorer ex1,ex2;
for (ex1.Init(S1,TopAbs_SOLID); ex1.More(); ex1.Next()) {
const TopoDS_Shape& so1 = ex1.Current();
for (ex2.Init(S2,TopAbs_SOLID); ex2.More(); ex2.Next()) {
const TopoDS_Shape& so2 = ex2.Current();
DS.FillShapesSameDomain(so1,so2);
}
}
myS1 = S1;
myS2 = S2;
#ifdef DRAW
// TestTopOpe::CurrentDS(myHDS);
// TestTopOpe::Shapes(myS1,myS2);
#endif
}
//=======================================================================
//function : Intersect
//purpose :
//=======================================================================
void BRepAlgo_DSAccess::Intersect()
{
myRecomputeBuilderIsDone = Standard_False;
if(!myS1.IsNull() && !myS2.IsNull())
myDSFiller.Insert(myS1, myS2, myHDS);
}
//=======================================================================
//function : Intersect
//purpose :
//=======================================================================
void BRepAlgo_DSAccess::Intersect
(const TopoDS_Shape& S1,
const TopoDS_Shape& S2)
{
myRecomputeBuilderIsDone = Standard_False;
if(S1.IsNull() || S2.IsNull()) {
return;
}
Standard_Boolean orientFORWARD = Standard_False;
TopExp_Explorer exp;
if(S1.ShapeType() != TopAbs_FACE) {
exp.Init(S1, TopAbs_FACE);
if(!exp.More())
return;
}
if(S2.ShapeType() != TopAbs_FACE) {
exp.Init(S2, TopAbs_FACE);
if(!exp.More())
return;
}
myDSFiller.Insert(S1, S2, myHDS, orientFORWARD);
}
//=======================================================================
//function : SameDomain
//purpose :
//=======================================================================
void BRepAlgo_DSAccess::SameDomain
(const TopoDS_Shape& S1,
const TopoDS_Shape& S2)
{
myRecomputeBuilderIsDone = Standard_False;
if(S1.IsNull() || S2.IsNull())
return;
TopExp_Explorer exp1, exp2;
exp1.Init(S1, TopAbs_FACE);
if(!exp1.More())
return;
exp2.Init(S2, TopAbs_FACE);
if(!exp2.More())
return;
myDSFiller.Insert2d(S1, S2, myHDS);
}
// Construction of Sections
#define FindKeep Standard_False
//=======================================================================
//function : GetSectionEdgeSet
//purpose :
//=======================================================================
const TopTools_ListOfShape& BRepAlgo_DSAccess::GetSectionEdgeSet
(const TopoDS_Shape& S1,
const TopoDS_Shape& S2)
{
GetSectionEdgeSet();
// Check if S1 and S2 contain faces
TopExp_Explorer exp1, exp2;
exp1.Init(S1, TopAbs_FACE);
if(!exp1.More())
return myEmptyListOfShape;
exp2.Init(S2, TopAbs_FACE);
if(!exp2.More())
return myEmptyListOfShape;
for(exp1.Init(S1, TopAbs_FACE); exp1.More(); exp1.Next()) {
if(!myHDS->HasShape(exp1.Current(), FindKeep))
return myEmptyListOfShape;
}
for(exp2.Init(S2, TopAbs_FACE); exp2.More(); exp2.Next())
if(!myHDS->HasShape(exp2.Current(), FindKeep))
return myEmptyListOfShape;
TopOpeBRepDS_DataStructure& DS = myHDS->ChangeDS();
TopOpeBRepBuild_Builder& Builder = myHB->ChangeBuilder();
// The purpose is to find interferences associated with faces,
// edges that come from their Geometry (= Edge || Curve)
TopTools_ListOfShape LE;
LE.Clear();
TopExp_Explorer exp;
for(exp1.Init(S1, TopAbs_FACE); exp1.More(); exp1.Next()) {
const TopoDS_Shape& F1 = exp1.Current();
TopOpeBRepDS_ListOfInterference& lof = DS.ChangeShapeInterferences(F1);
TopOpeBRepDS_InterferenceIterator li(lof);
li.SupportKind(TopOpeBRepDS_FACE);
for(exp2.Init(S2, TopAbs_FACE); exp2.More(); exp2.Next()) {
const TopoDS_Shape& F2 = exp2.Current();
Standard_Integer si = DS.Shape(F2, FindKeep);
li.Support(si);
for(; li.More(); li.Next()) {
const TopOpeBRepDS_Interference& CurrInt = li.Value();
TopOpeBRepDS_Kind gk = CurrInt.GeometryType();
Standard_Integer gi = CurrInt.Geometry();
const TopoDS_Shape& geosha = DS.Shape(gi, FindKeep);
if(gk == TopOpeBRepDS_CURVE) {
const TopTools_ListOfShape& lEdge = myHB->NewEdges(gi);
LE.Append(lEdge.First());
} else {
const TopTools_ListOfShape& lEdge = Builder.Splits(geosha, TopAbs_ON);
TopTools_ListIteratorOfListOfShape it(lEdge);
for(; it.More(); it.Next()) {
const TopoDS_Shape& CurrEdge = it.Value();
Standard_Integer ipv1, ipv2;
TopOpeBRepDS_Kind pvk1, pvk2;
PntVtxOnSectEdge(CurrEdge, ipv1, pvk1, ipv2, pvk2);
if(pvk1 != TopOpeBRepDS_VERTEX) {
ipv1 = 0;
if(pvk2 != TopOpeBRepDS_VERTEX) continue;
} else {
if(pvk2 != TopOpeBRepDS_VERTEX)
ipv2 = 0;
}
for(exp.Init(F1, TopAbs_VERTEX); exp.More(); exp.Next()) {
Standard_Integer iVert = DS.Shape(exp.Current());
if(iVert) {
if((iVert == ipv1) || (iVert == ipv2)) {
LE.Append(CurrEdge);
break;
}
}
}
}
}
}
}
}
// find all groups of connected Edges associated to LE
TopTools_ListIteratorOfListOfShape ILE;
myCurrentList.Clear();
TopTools_MapOfShape ME;
ME.Clear();
TopTools_ListIteratorOfListOfShape ILC;
TopExp_Explorer ECE;
ILE.Initialize(LE);
for(;ILE.More();ILE.Next()) {
const TopoDS_Shape& E = ILE.Value();
ILC.Initialize(myListOfCompoundOfEdgeConnected);
for(;ILC.More();ILC.Next()) {
const TopoDS_Shape& Com = ILC.Value();
ECE.Init(Com, TopAbs_EDGE);
for(;ECE.More();ECE.Next()) {
if(ECE.Current().IsSame(E)) {
if(!ME.Contains(Com)) {
myCurrentList.Append(Com);
ME.Add(Com);
break;
}
}
}
}
}
return myCurrentList;
}
//=======================================================================
//function : GetSectionEdgeSet
//purpose :
//=======================================================================
const TopTools_ListOfShape& BRepAlgo_DSAccess::GetSectionEdgeSet()
{
if(!myRecomputeBuilderIsDone) {
// it is possible to call the method many times consecutively
myHDS->AddAncestors(myS1);
// start of lpa modification
if (!myS1.IsSame(myS2) && !myS2.IsNull()) {
myHDS->AddAncestors(myS2);
myHB->Perform(myHDS,myS1,myS2);
}
else {
myHB->Perform(myHDS);
}
// end of modif lpa
myRecomputeBuilderIsDone = Standard_True;
myGetSectionIsDone = Standard_False;
}
if(myGetSectionIsDone)
return myListOfCompoundOfEdgeConnected;
myGetSectionIsDone = Standard_True;
myListOfCompoundOfEdgeConnected.Clear();
// EdgeConnector
Handle(BRepAlgo_EdgeConnector) EC = myEC;
EC->ClearStartElement();
TopTools_MapOfShape ME;
ME.Clear();
myHB->InitSection();
for(; myHB->MoreSection(); myHB->NextSection()) {
const TopoDS_Edge& ES = TopoDS::Edge(myHB->CurrentSection());
if(ME.Contains(ES)) continue;
ME.Add(ES);
EC->AddStart(ES);
}
TopTools_ListOfShape& LW = EC->MakeBlock();
// the wires are tranformed into compounds.
myCompoundWireMap.Clear();
BRep_Builder BB;
TopTools_ListIteratorOfListOfShape ILW(LW);
TopExp_Explorer Explor;
for(;ILW.More();ILW.Next()) {
TopoDS_Compound Compound;
//POP
BB.MakeCompound(Compound);
// BB.MakeCompound(TopoDS::Compound(Compound));
Explor.Init(ILW.Value(), TopAbs_EDGE);
for(;Explor.More(); Explor.Next()) {
BB.Add(Compound, Explor.Current());
}
myListOfCompoundOfEdgeConnected.Append(Compound);
myCompoundWireMap.Bind(Compound,ILW.Value());
}
return myListOfCompoundOfEdgeConnected;
}
//=======================================================================
//function : IsWire
//purpose :
//=======================================================================
Standard_Boolean BRepAlgo_DSAccess::IsWire(const TopoDS_Shape& S)
{
Standard_Boolean b = Standard_False;
if(myEC->IsDone()) {
if (myCompoundWireMap.IsBound(S))
b = myEC->IsWire(myCompoundWireMap(S));
}
return b;
}
//=======================================================================
//function : Wire
//purpose :
//=======================================================================
const TopoDS_Shape& BRepAlgo_DSAccess::Wire(const TopoDS_Shape& S)
{
if(!IsWire(S)) {
myWire.Nullify();
}
else {
BRep_Builder BB;
BB.MakeWire(myWire);
TopExp_Explorer Explor(S, TopAbs_EDGE);
for(;Explor.More(); Explor.Next()) BB.Add(myWire, Explor.Current());
}
return myWire;
}
//=======================================================================
//function : SectionVertex
//purpose :
//=======================================================================
const TopTools_ListOfShape& BRepAlgo_DSAccess::SectionVertex
(const TopoDS_Shape& F,
const TopoDS_Shape& E)
{
TopTools_ListOfShape Result;
Result.Clear();
if(F.ShapeType() != TopAbs_FACE) return myEmptyListOfShape;
if(E.ShapeType() != TopAbs_EDGE) return myEmptyListOfShape;
Standard_Integer iF = myHDS->Shape(F), iE = myHDS->Shape(E);
if((iF == 0) || (iE == 0)) return myEmptyListOfShape;
const TopOpeBRepDS_DataStructure& DS = myHDS->DS();
const TopOpeBRepDS_ListOfInterference& LI =
DS.ShapeInterferences(E, Standard_False);
TopOpeBRepDS_InterferenceIterator II(LI);
Standard_Integer goodIndex = 0;
TopOpeBRepDS_Kind goodKind;
for(;II.More();II.Next()) {
const Handle(TopOpeBRepDS_Interference)& I = II.Value();
const TopOpeBRepDS_Transition& T = I->Transition();
if((T.ONAfter() == TopAbs_FACE) &&
(T.IndexAfter() == iF)) {
goodKind = I->GeometryType();
goodIndex = I->Geometry();
if(goodKind == TopOpeBRepDS_VERTEX)
Result.Append(myHDS->Shape(goodIndex));
else
if (goodKind == TopOpeBRepDS_POINT)
Result.Append(myHB->NewVertex(goodIndex));
}
}
myListOfVertex = Result;
return myListOfVertex;
}
// Editing of the DS
//=======================================================================
//function : SuppressEdgeSet
//purpose :
//=======================================================================
void BRepAlgo_DSAccess::SuppressEdgeSet
(const TopoDS_Shape& C)
{
// It is checked if C really is a Coumpound of connected Edges
myHB->InitExtendedSectionDS();
// myGetSectionIsDone = Standard_False;
TopTools_ListIteratorOfListOfShape LLS(myListOfCompoundOfEdgeConnected);
for(;LLS.More(); LLS.Next())
if(C == LLS.Value())
break;
if(!LLS.More())
return;
// Cleaning
TopoDS_Shape Empty;
Empty.Nullify();
Suppress(C, Empty);
myListOfCompoundOfEdgeConnected.Remove(LLS);
}
//=======================================================================
//function : ChangeEdgeSet
//purpose :
//=======================================================================
void BRepAlgo_DSAccess::ChangeEdgeSet
(const TopoDS_Shape& Old, const TopoDS_Shape& New)
{
// It is checked if Old is a Coumpound of connected Edges
myHB->InitExtendedSectionDS();
TopTools_ListIteratorOfListOfShape LLS(myListOfCompoundOfEdgeConnected);
for(;LLS.More(); LLS.Next())
if(Old == LLS.Value())
break;
if(!LLS.More())
return;
// The compound of Edges to be rotated is constructed
BRep_Builder B;
Standard_Boolean Trouve;
Standard_Integer iC;
TopoDS_Compound C;
TopoDS_Edge E;
B.MakeCompound(C);
TColStd_PackedMapOfInteger RPoint; //The points to be controlled
TopOpeBRepDS_ListIteratorOfListOfInterference iter;
TopExp_Explorer exp(Old, TopAbs_EDGE);
TopExp_Explorer exp2;
for(; exp.More(); exp.Next()) {
const TopoDS_Shape& Edge = exp.Current();
for(exp2.Init(New, TopAbs_EDGE), Trouve=Standard_False;
exp2.More() && (!Trouve); exp2.Next()) {
E = TopoDS::Edge(exp2.Current());
Trouve = E.IsSame(Edge);
}
if (!Trouve) B.Add(C, Edge); // Edge to be removed
else if (!E.IsEqual(Edge)) {
// It is necessary to change Interferences => take the complement
iC = myHB->GetDSCurveFromSectEdge(Edge);
if (!iC) {
#ifdef OCCT_DEBUG
cout << "Warning DSAccess: Modifications of Edge are not implemented" << endl;
#endif
}
else {
// Complete the interferences Curve/Face
Standard_Integer iF;
Handle(TopOpeBRepDS_Interference) interf;
iF = myHB->GetDSFaceFromDSCurve(iC, 1);
TopOpeBRepDS_ListOfInterference& list1 =
myHDS->ChangeDS().ChangeShapeInterferences(iF);
for(iter.Initialize(list1); iter.More(); iter.Next()) {
interf = iter.Value();
if (interf->Geometry() == iC)
interf->Transition(interf->Transition().Complement());
}
iF = myHB->GetDSFaceFromDSCurve(iC, 2);
TopOpeBRepDS_ListOfInterference& list2 =
myHDS->ChangeDS().ChangeShapeInterferences(iF);
for(iter.Initialize(list2); iter.More(); iter.Next()) {
interf = iter.Value();
if (interf->Geometry() == iC)
interf->Transition(interf->Transition().Complement());
}
// The associated points are recorded
Standard_Integer ipv1, ipv2;
//Standard_Boolean bid; // skl
TopOpeBRepDS_Kind k1, k2;
PntVtxOnCurve(iC, ipv1, k1, ipv2, k2);
if (ipv1 != 0) /*bid = */RPoint.Add(ipv1); // skl
if (ipv2 != 0) /*bid = */RPoint.Add(ipv2); // skl
}
}
}
// Cleaning
Suppress(C, New);
// Is it necessary to invert the Interferences "Edge on Fa"
if (!RPoint.IsEmpty()) {
const TopOpeBRepDS_DataStructure & DS = myHDS->DS();
Standard_Integer iP,iE, nbShape = DS.NbShapes();
Handle(TopOpeBRepDS_Interference) interf;
for (iE=1; iE<=nbShape; iE++) {
if (DS.Shape(iE,0).ShapeType() == TopAbs_EDGE) {
const TopOpeBRepDS_ListOfInterference& List =
myHDS->DS().ShapeInterferences(iE);
for(iter.Initialize(List); iter.More(); iter.Next()) {
interf = iter.Value();
if (interf->GeometryType() == TopOpeBRepDS_POINT) {
iP = interf->Geometry();
if (RPoint.Contains(iP))
interf->Transition(interf->Transition().Complement());
}
}
}
}
}
// The old is replaced by new
LLS.Value() = New;
}
//=======================================================================
//function : Remove
//purpose :
//=======================================================================
void BRepAlgo_DSAccess::Suppress(const TopoDS_Shape& C,
const TopoDS_Shape& Keep)
{
TopOpeBRepDS_DataStructure& DS = myHDS->ChangeDS();
TopOpeBRepBuild_Builder& Builder = myHB->ChangeBuilder();
Standard_Integer i, iC = 0, iF1, iF2,iE1, iE2;
// TopOpeBRepDS_ListIteratorOfListOfInterference;
TColStd_ListIteratorOfListOfInteger it1, it2;
//A group of points to be kept is constructed
mySetOfKeepPoint.Clear();
if (!Keep.IsNull()) {
//Standard_Boolean B; // skl
Standard_Integer ipv1, ipv2;
TopOpeBRepDS_Kind k1, k2;
TopExp_Explorer exp(Keep, TopAbs_EDGE);
for(; exp.More(); exp.Next()) {
const TopoDS_Shape& SectEdge = exp.Current();
iC = myHB->GetDSCurveFromSectEdge(SectEdge);
if(!iC)
PntVtxOnSectEdge(SectEdge, ipv1, k1, ipv2, k2);
else
PntVtxOnCurve(iC, ipv1, k1, ipv2, k2);
if (ipv1 != 0) /*B = */mySetOfKeepPoint.Add(ipv1); // skl
if (ipv2 != 0) /*B = */mySetOfKeepPoint.Add(ipv2); // skl
}
}
// The curves, which generated the the Edges, are found
// during the parsing the Edges which come from Edge are found
// (= MapOfInteger : ESE)
// First, the interferences of support 1d.
TopExp_Explorer exp(C, TopAbs_EDGE);
for(; exp.More(); exp.Next()) {
const TopoDS_Shape& SectEdge = exp.Current();
iC = myHB->GetDSCurveFromSectEdge(SectEdge);
if(!iC) {
// the Edges that come from Edge are processed
// the interferences connected with Edges are processed :
iE1 = myHB->GetDSEdgeFromSectEdge(SectEdge, 1);
iE2 = myHB->GetDSEdgeFromSectEdge(SectEdge, 2);
RemoveEdgeInterferences(iE1,iE2,SectEdge);
TColStd_ListOfInteger& loi11 = myHB->GetDSFaceFromDSEdge(iE1, 1);
TColStd_ListOfInteger& loi12 = myHB->GetDSFaceFromDSEdge(iE1, 2);
for(it1.Initialize(loi11); it1.More(); it1.Next()) {
iF1 = it1.Value();
for(it2.Initialize(loi12); it2.More(); it2.Next()) {
iF2 = it2.Value();
// similar to the case of SectEdges coming from curve.
RemoveEdgeInterferences(iF1,iF2,SectEdge);
}
}
TColStd_ListOfInteger& loi21 = myHB->GetDSFaceFromDSEdge(iE2, 1);
TColStd_ListOfInteger& loi22 = myHB->GetDSFaceFromDSEdge(iE2, 2);
for(it1.Initialize(loi21); it1.More(); it1.Next()) {
iF1 = it1.Value();
for(it2.Initialize(loi22); it2.More(); it2.Next()) {
iF2 = it2.Value();
// similar to the case of SectEdges coming from curve.
RemoveEdgeInterferences(iF1,iF2,SectEdge);
}
}
continue;
}
// The Edges that come from Curve are processed
iF1 = myHB->GetDSFaceFromDSCurve(iC, 1);
iF2 = myHB->GetDSFaceFromDSCurve(iC, 2);
RemoveEdgeInterferences(iF1, iF2, iC);
DS.ChangeKeepCurve(iC, FindKeep);
}
// Secondly, the interferences of 2D support.
exp.Init(C, TopAbs_EDGE);
for(; exp.More(); exp.Next()) {
const TopoDS_Shape& SectEdge = exp.Current();
iC = myHB->GetDSCurveFromSectEdge(SectEdge);
if(!iC) {
iE1 = myHB->GetDSEdgeFromSectEdge(SectEdge, 1);
iE2 = myHB->GetDSEdgeFromSectEdge(SectEdge, 2);
TColStd_ListOfInteger& loi11 = myHB->GetDSFaceFromDSEdge(iE1, 1);
TColStd_ListOfInteger& loi12 = myHB->GetDSFaceFromDSEdge(iE1, 2);
for(it1.Initialize(loi11); it1.More(); it1.Next()) {
iF1 = it1.Value();
for(it2.Initialize(loi12); it2.More(); it2.Next()) {
iF2 = it2.Value();
if(iF1 == iF2)
continue;
RemoveFaceInterferences(iF1, iF2, iE1, iE2);
}
}
TColStd_ListOfInteger& loi21 = myHB->GetDSFaceFromDSEdge(iE2, 1);
TColStd_ListOfInteger& loi22 = myHB->GetDSFaceFromDSEdge(iE2, 2);
for(it1.Initialize(loi21); it1.More(); it1.Next()) {
iF1 = it1.Value();
for(it2.Initialize(loi22); it2.More(); it2.Next()) {
iF2 = it2.Value();
if(iF1 == iF2)
continue;
RemoveFaceInterferences(iF1, iF2, iE1, iE2);
}
}
}
else {
iF1 = myHB->GetDSFaceFromDSCurve(iC, 1);
iF2 = myHB->GetDSFaceFromDSCurve(iC, 2);
RemoveFaceInterferences(iF1, iF2, iC);
}
}
// Thirdly, RemoveSameDomain is done for the faces that contain all Edges of C,
// and are SameDomain and without Geometry.
RemoveFaceSameDomain(C);
// Fourthly, the faces, that were not concerned, are removed
Standard_Integer NbSh = DS.NbShapes();
for(i = 1; i <= NbSh; i++) {
const TopoDS_Shape& Face = DS.Shape(i);
if(Face.IsNull())
continue;
if((Face.ShapeType() != TopAbs_FACE) || DS.HasGeometry(Face) ||
(myHDS->HasSameDomain(Face)))
continue;
for(exp.Init(Face, TopAbs_EDGE); exp.More(); exp.Next()){
const TopoDS_Shape& Edge = exp.Current();
if(DS.HasShape(Edge))
break;
}
if(exp.More())
continue;
DS.ChangeKeepShape(Face, Standard_False);
}
// Builder.myKPMAPf1f2 is reconstructed
Builder.FindIsKPart();
// The Edges of section are removed from Builder.mySplitON
exp.Init(C, TopAbs_EDGE);
for(; exp.More(); exp.Next()) {
const TopoDS_Shape& SectE= exp.Current();
TopTools_ListOfShape& losob = Builder.ChangeSplit(SectE, TopAbs_ON);
losob.Clear();
}
}
//=======================================================================
//function : SuppressSectionVertex
//purpose :
//=======================================================================
void BRepAlgo_DSAccess::SuppressSectionVertex
(const TopoDS_Vertex& /*V*/)
{
if(!myRecomputeBuilderIsDone)
return;
}
// Reconstruction of Shapes
//=======================================================================
//function : Merge
//purpose :
//=======================================================================
const TopoDS_Shape& BRepAlgo_DSAccess::Merge
(const TopAbs_State state1,
const TopAbs_State state2)
{
if((state1 != TopAbs_IN) &&
(state1 != TopAbs_OUT))
return myEmptyShape;
if((state2 != TopAbs_IN) &&
(state2 != TopAbs_OUT))
return myEmptyShape;
// if GetSectionEdgeSet has already been called, nothing is done
// in GetSectionEdgeSet.
if(myState1 != TopAbs_UNKNOWN)
if(myState1 != state1 || myState2 != state2)
myGetSectionIsDone = Standard_False;
myState1 = state1;
myState2 = state2;
GetSectionEdgeSet();
myHB->Clear();
myHB->MergeShapes(myS1,state1,myS2,state2);
const TopTools_ListOfShape& L1 = myHB->Merged(myS1,state1);
BRep_Builder BB;
myResultShape.Nullify();
BB.MakeCompound(TopoDS::Compound(myResultShape));
TopTools_ListIteratorOfListOfShape it(L1);
for(;it.More(); it.Next()) {
BB.Add(myResultShape, it.Value());
}
return myResultShape;
}
//=======================================================================
//function : Merge
//purpose :
//=======================================================================
const TopoDS_Shape& BRepAlgo_DSAccess::Merge
(const TopAbs_State state1)
{
if((state1 != TopAbs_IN) &&
(state1 != TopAbs_OUT))
return myEmptyShape;
GetSectionEdgeSet();
myHB->Clear();
myHB->MergeSolid(myS1,state1);
const TopTools_ListOfShape& L1 = myHB->Merged(myS1,state1);
BRep_Builder BB;
myResultShape.Nullify();
BB.MakeCompound(TopoDS::Compound(myResultShape));
TopTools_ListIteratorOfListOfShape it(L1);
for(;it.More(); it.Next()) {
BB.Add(myResultShape, it.Value());
}
return myResultShape;
}
//=======================================================================
//function : Propagate
//purpose :
//=======================================================================
const TopoDS_Shape& BRepAlgo_DSAccess::Propagate
(const TopAbs_State what,
const TopoDS_Shape& /*fromShape*/,
const TopoDS_Shape& /*LoadShape*/)
{
if((what != TopAbs_IN) &&
(what != TopAbs_OUT))
return myEmptyShape;
if(!myRecomputeBuilderIsDone)
return myEmptyShape;
// myHB->MergeShapes(myS1,t1,myS2,t2);
//POP for NT;
static TopoDS_Shape bid;
return bid;
}
//=======================================================================
//function : PropagateFromSection
//purpose :
//=======================================================================
const TopoDS_Shape& BRepAlgo_DSAccess::PropagateFromSection
(const TopoDS_Shape& SectionShape)
{
GetSectionEdgeSet();
TopTools_ListIteratorOfListOfShape ils(myListOfCompoundOfEdgeConnected);
TopExp_Explorer exp;
for(; ils.More(); ils.Next()) {
const TopoDS_Shape& SetEdgSet = ils.Value();
exp.Init(SetEdgSet, TopAbs_EDGE);
for(; exp.More(); exp.Next()) {
if(SectionShape.IsSame(exp.Current()))
return SetEdgSet;
}
}
return myEmptyShape;
}
//=======================================================================
//function : Modified
//purpose :
//=======================================================================
const TopTools_ListOfShape& BRepAlgo_DSAccess::Modified (const TopoDS_Shape& Shape)
{
myModified.Clear() ;
// Handle(TopOpeBRepBuild_HBuilder)& HBuilder = myDSA.myHB ;
TopTools_ListIteratorOfListOfShape Iterator ;
if (myHB->IsSplit (Shape, TopAbs_OUT)) {
for (Iterator.Initialize (myHB->Splits (Shape, TopAbs_OUT)) ;
Iterator.More() ;
Iterator.Next()) {
myModified.Append (Iterator.Value()) ;
}
}
if (myHB->IsSplit (Shape, TopAbs_IN)) {
for (Iterator.Initialize (myHB->Splits (Shape, TopAbs_IN)) ;
Iterator.More() ;
Iterator.Next()) {
myModified.Append (Iterator.Value()) ;
}
}
if (myHB->IsSplit (Shape, TopAbs_ON)) {
for (Iterator.Initialize (myHB->Splits (Shape, TopAbs_ON)) ;
Iterator.More() ;
Iterator.Next()) {
myModified.Append (Iterator.Value()) ;
}
}
if (myHB->IsMerged (Shape, TopAbs_OUT)) {
for (Iterator.Initialize (myHB->Merged (Shape, TopAbs_OUT)) ;
Iterator.More() ;
Iterator.Next()) {
myModified.Append (Iterator.Value()) ;
}
}
if (myHB->IsMerged(Shape, TopAbs_IN)) {
for (Iterator.Initialize (myHB->Merged (Shape, TopAbs_IN)) ;
Iterator.More() ;
Iterator.Next()) {
myModified.Append (Iterator.Value()) ;
}
}
if (myHB->IsMerged(Shape, TopAbs_ON)) {
for (Iterator.Initialize (myHB->Merged (Shape, TopAbs_ON)) ;
Iterator.More() ;
Iterator.Next()) {
myModified.Append (Iterator.Value()) ;
}
}
return myModified ;
}
//=======================================================================
//function : Check
//purpose :
//=======================================================================
BRepAlgo_CheckStatus BRepAlgo_DSAccess::Check()
{
// TopOpeBRepDS_Check Ck(HDS);
// to be precised : in Ck, there is a possibility to know
// exactly the n*n of shapes/points/curves/surfaces,
// which are not correct in the DS.
// Standard_Boolean IsOK = Ck.ChkIntgSamDom() ;
// IsOK = IsOK && Ck.OneVertexOnPnt();
// IsOK = IsOK && Ck.ChkIntg();
// if(IsOK)
// return TopOpeBRepDS_OK;
return BRepAlgo_NOK;
}
//=======================================================================
//function : RemoveEdgeInterferences
//purpose : case of SectEdge coming from Edge(s)
//
// if iE1 and iE2 are Edges :
// Remove interferences of DSEdge(= iE1 or iE2) of
// geometry a vertex of SectEdge, and if there is nothing else,
// make unkeep on DSEdge
// if iE1 or iE2 == 0, no interference on Edges in the DS
// NYI : management of SameDomain
//
// if iE1 and iE2 are Faces :
// for each of faces F1 and F2, explode into Edges
// for each Edge :
// remove the interferences of a SectEdge vertex
// on geometry. If there is no other interferences attached to
// these Edges, and if these Edges are not SameDomain,
// make unKeepShape.
//=======================================================================
void BRepAlgo_DSAccess::RemoveEdgeInterferences
(const Standard_Integer iE1,
const Standard_Integer iE2,
const TopoDS_Shape& SectEdge)
{
if(!iE1 || !iE2)
return;
TopOpeBRepDS_DataStructure& DS = myHDS->ChangeDS();
TopOpeBRepDS_Kind kind1, kind2;
TopExp_Explorer exp(SectEdge, TopAbs_VERTEX);
Standard_Integer i = 1, ipv1, ipv2;
// the Vertex/Points of SectEdge are retrieved
PntVtxOnSectEdge(SectEdge, ipv1, kind1, ipv2, kind2);
const TopoDS_Shape& Shape = DS.Shape(iE1, FindKeep);
if(Shape.IsNull())
return;
if(Shape.ShapeType() == TopAbs_FACE) {
Standard_Integer iF1 = iE1, iF2 = iE2;
RemoveEdgeInterferencesFromFace(iF1, iF2, ipv1, kind1, ipv2, kind2);
return;
}
else if(Shape.ShapeType() != TopAbs_EDGE)
return;
// the interferences are taken from the DS
TopOpeBRepDS_ListIteratorOfListOfInterference lioloi;
TopOpeBRepDS_Kind gk;
Standard_Integer iCurrE1, iCurrE2, gi;
// Standard_Boolean RemInterf;
for(i = 1; i <= 2; i++) {
iCurrE1 = ((i == 1) ? iE1 : iE2);
iCurrE2 = ((i == 1) ? iE2 : iE1);
const TopoDS_Shape& DSEdge = DS.Shape(iCurrE1, FindKeep);
if(DSEdge.IsNull())
continue;
TopOpeBRepDS_ListOfInterference& loi =
DS.ChangeShapeInterferences(DSEdge);
// RemInterf = Standard_True;
for(lioloi.Initialize(loi); lioloi.More(); lioloi.Next()) {
Handle(TopOpeBRepDS_Interference) I = lioloi.Value();
if (I.IsNull()) continue;
if((I->SupportType() != TopOpeBRepDS_EDGE) ||
(I->Support() != iCurrE2)) {
// RemInterf = Standard_False;//debug ...
continue;
}
gk = I->GeometryType();
gi = I->Geometry();
if(gk == kind1) {
if(gi == ipv1) {
DS.RemoveShapeInterference(DSEdge, I);
if(!DS.HasGeometry(DSEdge)) {
// if(RemInterf || (!lioloi.More())) {
RemoveEdgeSameDomain(iCurrE1, iCurrE2); // NYI : SameDomain
DS.ChangeKeepShape(iCurrE1, FindKeep);
// }
}
}
}
else if(gk == kind2) {
if(gi == ipv2) {
DS.RemoveShapeInterference(DSEdge, I);
if(!DS.HasGeometry(DSEdge)) {
// if(RemInterf || (!lioloi.More())) {//debug
RemoveEdgeSameDomain(iCurrE1, iCurrE2); // NYI : SameDomain
DS.ChangeKeepShape(iCurrE1, FindKeep);
// }
}
}
}
}
}
}
//=======================================================================
//function : RemoveEdgeInterferences
//purpose : case of SectEdge coming from Curve
// for each of faces F1 and F2, explode into Edges
// for each Edge :
// remove the interferences that have a vertex of SectEdge
// as a geometry. If no other interferences are attached to
// these Edges, and if the Edges are not SameDomain,
// make unKeepShape.
//=======================================================================
void BRepAlgo_DSAccess::RemoveEdgeInterferences
(const Standard_Integer iF1,
const Standard_Integer iF2,
const Standard_Integer iCurve)
{
TopOpeBRepDS_Kind gk1, gk2;
Standard_Integer gi1, gi2;
PntVtxOnCurve(iCurve, gi1, gk1, gi2, gk2);
if (!mySetOfKeepPoint.IsEmpty()) {
if (mySetOfKeepPoint.Contains(gi1)) gi1 = 0;
if (mySetOfKeepPoint.Contains(gi2)) gi2 = 0;
}
if (gi1 || gi2)
RemoveEdgeInterferencesFromFace(iF1, iF2, gi1, gk1, gi2, gk2);
}
//=======================================================================
//function : RemoveFaceInterferences
//purpose : case of SectEdge coming from Edge(s)
// Remove interferences between F1 and F2 concerning
// DSEdge (= E1 or E2) :
// a) if DSEdge is not SameDomain -> the edge is Removed
// b) if among other interferences of DSEdge of
// GeomtryType == VERTEX, there is none
// with Edge of DSFace(= F1 or F2)
// if DSFace has no more interferences and is not SameDomain,
// make unkeep DSFace.
//=======================================================================
void BRepAlgo_DSAccess::RemoveFaceInterferences
(const Standard_Integer iF1,
const Standard_Integer iF2,
const Standard_Integer iE1,
const Standard_Integer iE2)
{
if(!iF1 || !iF2)
return;
TopOpeBRepDS_DataStructure& DS = myHDS->ChangeDS();
TopOpeBRepDS_ListIteratorOfListOfInterference lioloi;//, lioloei, liolofi;
TopTools_ListIteratorOfListOfShape liolos;
TopOpeBRepDS_Kind gk;
TopExp_Explorer exp;
Standard_Integer i, iCurrF1, iCurrF2, j, iCurrE1, /*iCurrE2,*/ gi; // skl
Standard_Boolean RemInterf;
for(i = 1; i <= 2; i++) {
iCurrF1 = ((i == 1) ? iF1 : iF2);
iCurrF2 = ((i == 1) ? iF2 : iF1);
const TopoDS_Shape& DSFace = DS.Shape(iCurrF1);
if(DSFace.IsNull())
continue;
const TopOpeBRepDS_ListOfInterference& loi = DS.ShapeInterferences(DSFace);
for(lioloi.Initialize(loi); lioloi.More(); lioloi.Next()) {
Handle(TopOpeBRepDS_Interference) I = lioloi.Value();
if (I.IsNull()) continue;
if((I->SupportType() != TopOpeBRepDS_FACE) ||
(I->Support() != iCurrF2)) {
continue;
}
gk = I->GeometryType();
gi = I->Geometry();
if(gk != TopOpeBRepDS_EDGE) continue;
for(j = 1; j <= 2; j++) {
iCurrE1 = ((j == 1) ? iE1 : iE2);
//iCurrE2 = ((j == 1) ? iE2 : iE1); // skl
if(gi != iCurrE1) continue;
// a) if DSEdge is not SameDomain -> the interference is Removed
// et DSEdge
const TopoDS_Shape& DSEdge = DS.Shape(iCurrE1, FindKeep);
if(DSEdge.IsNull())
continue;
if(!myHDS->HasSameDomain(DSEdge)) {
if(!DS.HasGeometry(DSEdge)) {
DS.RemoveShapeInterference(DSFace, I);
DS.ChangeKeepShape(DSEdge, FindKeep);
} else {
// NYI : manage the case when the geometry of DSEdge
// NYI : is not connected anyhow with two faces
}
if(!DS.HasGeometry(DSFace)) {
DS.ChangeKeepShape(DSFace, FindKeep);
}
continue;
}
// b) if no Edges of SameDomain(DSEdge),
// belong to DSFace(= F1 or F2)
// -> the interference is removed
const TopoDS_Shape& Edge = DS.Shape(iCurrE1, FindKeep);
if(Edge.IsNull())
continue;
const TopTools_ListOfShape& loe = DS.ShapeSameDomain(Edge);
RemInterf = Standard_True;
for(liolos.Initialize(loe); liolos.More(); liolos.Next()) {
const TopoDS_Shape& ESD = liolos.Value();
for(exp.Init(DSFace, TopAbs_EDGE); exp.More(); exp.Next()) {
if(ESD.IsSame(exp.Current())) {
RemInterf = Standard_False;
break;
}
}
if(!RemInterf) break;
}
if(RemInterf) {
// RemoveSameDomain(iCurrF1, iCurrF2);
if(!DS.HasGeometry(DSFace)) {
if(!myHDS->HasSameDomain(DSFace))
DS.ChangeKeepShape(DSFace, FindKeep);
}
}
if(!DS.HasGeometry(DSFace) && !myHDS->HasSameDomain(DSFace))
DS.ChangeKeepShape(DSFace, FindKeep);
}
}
}
}
//=======================================================================
//function : RemoveFaceInterferences
//purpose : case of SectEdge from Curve
// remove interferences of Geometry iCurve between F1 and F2.
// if Face(= F1 or F2) has noother interference, and if Face
// is not SameDomain, make unKeepShape Face.
//=======================================================================
void BRepAlgo_DSAccess::RemoveFaceInterferences
(const Standard_Integer iF1,
const Standard_Integer iF2,
const Standard_Integer iCurve)
{
TopOpeBRepDS_DataStructure& DS = myHDS->ChangeDS();
TopOpeBRepDS_ListIteratorOfListOfInterference lioloi;
TopOpeBRepDS_Kind gk;
Standard_Integer i, iCurrF1, iCurrF2, gi;
for(i = 1; i <= 2; i++) {
iCurrF1 = ((i == 1) ? iF1 : iF2);
iCurrF2 = ((i == 1) ? iF2 : iF1);
const TopoDS_Shape& DSFace = DS.Shape(iCurrF1);
const TopOpeBRepDS_ListOfInterference& loi = DS.ShapeInterferences(DSFace);
for(lioloi.Initialize(loi); lioloi.More(); lioloi.Next()) {
Handle(TopOpeBRepDS_Interference) I = lioloi.Value();
if (I.IsNull()) continue;
if((I->SupportType() != TopOpeBRepDS_FACE) ||
(I->Support() != iCurrF2)) {
break;;
}
}
for(lioloi.Initialize(loi); lioloi.More(); lioloi.Next()) {
Handle(TopOpeBRepDS_Interference) I = lioloi.Value();
if (I.IsNull()) continue;
if((I->SupportType() != TopOpeBRepDS_FACE) ||
(I->Support() != iCurrF2)) {
continue;
}
gk = I->GeometryType();
gi = I->Geometry();
if(gk != TopOpeBRepDS_CURVE) continue;
if(gi != iCurve) continue;
DS.RemoveShapeInterference(DSFace, I);
// const TopoDS_Shape& interferenceface = DS.Shape(iCurrF2);
// DS.RemoveShapeInterference(interferenceface, I);
if(!DS.HasGeometry(DSFace)) {
const TopTools_ListOfShape& los = DS.ShapeSameDomain(DSFace);
if(los.IsEmpty())
DS.ChangeKeepShape(DSFace, FindKeep);
}
// if(!DS.HasGeometry(interferenceface)) {
// const TopTools_ListOfShape& los = DS.ShapeSameDomain(interferenceface);
// if(los.IsEmpty())
// DS.ChangeKeepShape(interferenceface, FindKeep);
// }
}
}
}
//=======================================================================
//function : RemoveEdgeInterferencesFromFace
//purpose : Remove interferences of Edges from iF1 or iF2
// that have GeometryType kind1/kind2 and
// Geometry ipv1/ipv2.
// if kind1/kind2 == TopAbs_VERTEX -> RemoveEdgeFromFace
//=======================================================================
void BRepAlgo_DSAccess::RemoveEdgeInterferencesFromFace
(const Standard_Integer iF1,
const Standard_Integer iF2,
const Standard_Integer ipv1,
const TopOpeBRepDS_Kind kind1,
const Standard_Integer ipv2,
const TopOpeBRepDS_Kind kind2)
{
TopOpeBRepDS_DataStructure& DS = myHDS->ChangeDS();
TopOpeBRepDS_ListIteratorOfListOfInterference lioloi;
TopExp_Explorer exp, exp2;
TopOpeBRepDS_Kind sk, gk;
Standard_Integer i, iCurrF1, iCurrF2, iE = 0, si, gi;
for(i = 1; i <= 2; i++) {
iCurrF1 = ((i == 1) ? iF1 : iF2);
iCurrF2 = ((i == 1) ? iF2 : iF1);
const TopoDS_Shape& DSFace = DS.Shape(iCurrF1, FindKeep);
if(DSFace.IsNull())
continue;
exp.Init(DSFace, TopAbs_EDGE);
for(; exp.More(); exp.Next()) {
const TopoDS_Shape& DSEdge = exp.Current();
iE = DS.Shape(DSEdge, FindKeep);
if(!iE) continue;
const TopOpeBRepDS_ListOfInterference& loi =
DS.ShapeInterferences(DSEdge);
for(lioloi.Initialize(loi); lioloi.More(); lioloi.Next()) {
Handle(TopOpeBRepDS_Interference) I = lioloi.Value();
if (I.IsNull()) continue;
sk = I->SupportType();
si = I->Support();
if((sk != TopOpeBRepDS_FACE) || (si != iCurrF2)) {
if(sk != TopOpeBRepDS_EDGE)
continue;
const TopoDS_Shape& DSFace2 = DS.Shape(iCurrF2, FindKeep);
exp2.Init(DSFace2, TopAbs_EDGE);
for(; exp2.More(); exp2.Next()) {
if(si == DS.Shape(exp2.Current(), FindKeep))
break;
}
if(!exp2.More())
continue;
}
gk = I->GeometryType();
gi = I->Geometry();
if(gk == kind1) {
if(gi == ipv1) {
DS.RemoveShapeInterference(DSEdge, I);
// if(!DS.HasGeometry(DSEdge)) {
// const TopTools_ListOfShape& los = DS.ShapeSameDomain(DSEdge);
// if(los.IsEmpty()) {
// DS.ChangeKeepShape(iE, FindKeep);
// }
// }
}
else if(gk == kind2) {
if(gi == ipv2) {
DS.RemoveShapeInterference(DSEdge, I);
// if(!DS.HasGeometry(DSEdge)) {
// const TopTools_ListOfShape& los = DS.ShapeSameDomain(DSEdge);
// if(los.IsEmpty()) {
// DS.ChangeKeepShape(iE, FindKeep);
// }
// }
}
}
else continue;
}
}
}
if(kind1 == TopOpeBRepDS_VERTEX)
RemoveEdgeFromFace(iCurrF1,ipv1);
if(kind2 == TopOpeBRepDS_VERTEX)
RemoveEdgeFromFace(iCurrF1,ipv2);
}
}
//=======================================================================
//function : RemoveEdgeFromFace
//purpose : Remove from DS the Edges, which belong to iF
// and have iV as vertex if they do not have Geometry and
// are not SameDomain.
//=======================================================================
void BRepAlgo_DSAccess::RemoveEdgeFromFace
(const Standard_Integer iF,
const Standard_Integer iV)
{
if(!iF || !iV)
return;
TopOpeBRepDS_DataStructure& DS = myHDS->ChangeDS();
const TopoDS_Shape& DSFace = DS.Shape(iF, FindKeep);
const TopoDS_Shape& Vertex = DS.Shape(iV, FindKeep);
if(DSFace.IsNull() || Vertex.IsNull())
return;
TopExp_Explorer exp(DSFace, TopAbs_EDGE), exp2;
for(; exp.More(); exp.Next()) {
const TopoDS_Shape& Edge = exp.Current();
#ifdef OCCT_DEBUG
// Standard_Integer iEdge2 = DS.Shape(Edge, FindKeep);
// Standard_Integer iEdge3 = DS.Shape(Edge);
#endif
if(!DS.HasShape(Edge))
continue;
exp2.Init(Edge, TopAbs_VERTEX);
for(; exp2.More(); exp2.Next()) {
#ifdef OCCT_DEBUG
// Standard_Integer iEdge5 = DS.Shape(Vertex, FindKeep);
// Standard_Integer iEdge4 = DS.Shape(Vertex);
// Standard_Integer iEdge6 = DS.Shape(exp2.Current(), FindKeep);
// Standard_Integer iEdge7 = DS.Shape(exp2.Current());
#endif
if(Vertex.IsSame(exp2.Current())) {
if(!DS.HasGeometry(Edge)) {
const TopTools_ListOfShape& los = DS.ShapeSameDomain(Edge);
if(los.IsEmpty()) {
#ifdef OCCT_DEBUG
// Standard_Integer iEdge = DS.Shape(Edge);
#endif
DS.ChangeKeepShape(Edge, FindKeep);
}
}
}
}
}
}
//=======================================================================
//function : PntVtxOnCurve
//purpose : To find the points/vertices on curves
//=======================================================================
void BRepAlgo_DSAccess::PntVtxOnCurve
(const Standard_Integer iCurve,
Standard_Integer& ipv1,
TopOpeBRepDS_Kind& pvk1,
Standard_Integer& ipv2,
TopOpeBRepDS_Kind& pvk2)
{
TopOpeBRepDS_DataStructure& DS = myHDS->ChangeDS();
const TopOpeBRepDS_Curve& C = DS.Curve(iCurve);
TopOpeBRepDS_Kind pvk;
Standard_Integer ipv, iMother = C.Mother(), igoodC = iCurve, comp = 0;
if(iMother) igoodC = iMother;
//#ifndef OCCT_DEBUG
TopOpeBRepDS_PointIterator PII = myHDS->CurvePoints(igoodC);
TopOpeBRepDS_PointIterator& PIt = PII; // skl : I change "M_PI" to "PIt"
//#else
// TopOpeBRepDS_PointIterator& PIt = myHDS->CurvePoints(igoodC);
//#endif
for(;PIt.More(); PIt.Next()) {
comp++;
if(comp > 2)
// Standard_Error ...
return;
ipv = PIt.Current();
// a point or a vertex is removed from the DS
if(PIt.IsPoint()) {
pvk = TopOpeBRepDS_POINT;
DS.ChangeKeepPoint(ipv, FindKeep);
}
else if(PIt.IsVertex()) {
pvk = TopOpeBRepDS_VERTEX;
DS.ChangeKeepShape(ipv, FindKeep);
}
else continue;
((comp == 1) ? ipv1 : ipv2) = ipv;
((comp == 1) ? pvk1 : pvk2) = pvk;
}
}
//=======================================================================
//function : PntVtxOnSectEdge
//purpose : Points/Vertexes on SectEdge are found
//=======================================================================
void BRepAlgo_DSAccess::PntVtxOnSectEdge
(const TopoDS_Shape& SectEdge,
Standard_Integer& ipv1,
TopOpeBRepDS_Kind& pvk1,
Standard_Integer& ipv2,
TopOpeBRepDS_Kind& pvk2)
{
// myHB->ChangeBuilder();
TopOpeBRepDS_DataStructure& DS = myHDS->ChangeDS();
TopOpeBRepDS_Kind kind = TopOpeBRepDS_POINT;
TopExp_Explorer exp(SectEdge, TopAbs_VERTEX);
Standard_Integer i = 1, ipv;
for(; exp.More(); exp.Next(), i++) {
const TopoDS_Shape& DSVertex = exp.Current();
ipv = myHB->GetDSPointFromNewVertex(DSVertex);
if(!ipv) {
ipv = DS.Shape(DSVertex, FindKeep);
kind = TopOpeBRepDS_VERTEX;
if(!ipv)
// Standard_Error ...
return;
}
if(i == 1) {
ipv1 = ipv;
pvk1 = kind;
}
else if(i == 2) {
ipv2 = ipv;
pvk2 = kind;
}
else
// Standard_Error ...
return;
}
}
//=======================================================================
//function : RemoveEdgeSameDomain
//purpose :
//=======================================================================
void BRepAlgo_DSAccess::RemoveEdgeSameDomain
(const Standard_Integer /*iE1*/,
const Standard_Integer /*iE2*/)
{
return;
/* TopOpeBRepDS_DataStructure& DS = myHDS->ChangeDS();
const TopoDS_Shape& E1 = DS.Shape(iE1);
const TopoDS_Shape& E2 = DS.Shape(iE2);
TopAbs_ShapeEnum ts1, ts2;
ts1 = E1.ShapeType();
ts2 = E2.ShapeType();
if((ts1 != TopAbs_EDGE) ||
(ts2 != TopAbs_EDGE))
return;
TopTools_ListOfShape& lossd = DS.ChangeShapeSameDomain(E1);
if(lossd.IsEmpty())
return;
Standard_Integer exte = lossd.Extent();
if(exte == 1) {
if(lossd.First().IsSame(E2))
DS.UnfillShapesSameDomain(E1,E2);
return;
}*/
}
//=======================================================================
//function : RemoveFaceSameDomain
//purpose : remove SameDomain information of glued faces
//=======================================================================
void BRepAlgo_DSAccess::RemoveFaceSameDomain
(const TopoDS_Shape& C)
{
// myHB->ChangeBuilder();
TopOpeBRepDS_DataStructure& DS = myHDS->ChangeDS();
//TColStd_ListIteratorOfListOfInteger it;
TopExp_Explorer exp(C, TopAbs_EDGE);
Standard_Integer iE1, iE2, iE, /*NbF,*/ iF1, iF2, iCurrF1, iCurrF2, iC =0; // skl
iF1 = iF2 = iCurrF1 = iCurrF2 = 0;
Standard_Boolean b;
const TopoDS_Shape& SectEdge = exp.Current();
for(; exp.More(); exp.Next()) {
iC = myHB->GetDSCurveFromSectEdge(SectEdge);
if(!iC && !SectEdge.IsNull())
break;
// const TopoDS_Shape& SectEdge = exp.Current();
}
if(!iC && !SectEdge.IsNull()) {
iE1 = myHB->GetDSEdgeFromSectEdge(SectEdge, 1);
iE2 = myHB->GetDSEdgeFromSectEdge(SectEdge, 2);
if(iE1 && iE2) return;
iE = (iE1 ? iE1 : iE2);
if(!iE) return;
TColStd_ListOfInteger& loi = FindGoodFace(iE, iF1, b);
if(!b) return;
if(exp.More())
exp.Next();
//NbF = loi.Extent(); // skl
for(; exp.More(); exp.Next()) {
// skl : I change "SectEdge" to "SectEdg"
const TopoDS_Shape& SectEdg = exp.Current();
iC = myHB->GetDSCurveFromSectEdge(SectEdg);
if(!iC) {
iE1 = myHB->GetDSEdgeFromSectEdge(SectEdg, 1);
iE2 = myHB->GetDSEdgeFromSectEdge(SectEdg, 2);
if(iE1 && iE2) return;
iE = (iE1 ? iE1 : iE2);
if(!iE) return;
TColStd_ListOfInteger& loi2 = FindGoodFace(iE, iCurrF1, b);
if(!b) return;
if(!iCurrF1 || !iF1) return;
if(iCurrF1 != iF1) {
if(loi2.Extent() == 1) iCurrF2 = loi2.First();
if(iCurrF2 == iF1) continue;
if(loi.Extent() == 1) iF2 = loi.First();
if(!iCurrF2 || !iF2) return;
if((iCurrF1 == iF2) ||
(iCurrF2 == iF2)) {
iF1 = iF2;
continue;
}
return;
}
}
}
const TopoDS_Shape& FSD = DS.Shape(iF1);
if(FSD.IsNull())
return;
TopTools_ListOfShape& ssd = DS.ChangeShapeSameDomain(FSD);
TopTools_ListIteratorOfListOfShape itssd(ssd);
TopExp_Explorer exp2;
for(; itssd.More(); itssd.Next()) {
exp2.Init(itssd.Value(), TopAbs_VERTEX);
for(; exp2.More(); exp2.Next()) {
const TopoDS_Shape& exp2Curr = exp2.Current();
exp.Init(C, TopAbs_VERTEX);
for(; exp.More(); exp.Next()) {
if(exp2Curr.IsSame(exp.Current()))
break;
}
if(exp.More())
break;
}
if(exp2.More())
break;
}
if(exp2.More()) {
const TopoDS_Shape& FSD2 = itssd.Value();
Standard_Integer iFSD = DS.Shape(FSD), iFSD2 = DS.Shape(FSD2);
RemoveFaceSameDomain(iFSD, iFSD2);
// DS.UnfillShapesSameDomain(FSD, FSD2);
}
}
}
//=======================================================================
//function : FindGoodFace
//purpose :
//=======================================================================
TColStd_ListOfInteger& BRepAlgo_DSAccess::FindGoodFace
(const Standard_Integer iE,
Standard_Integer& iF1,
Standard_Boolean& b)
{
// myHB->ChangeBuilder();
b = Standard_False;
TColStd_ListOfInteger& loi = myHB->GetDSFaceFromDSEdge(iE, 1);
if(loi.Extent() == 1) {
iF1 = loi.First();
b = Standard_True;
TColStd_ListOfInteger& loi2 = myHB->GetDSFaceFromDSEdge(iE, 2);
return loi2;
}
else {
TColStd_ListOfInteger& loi2 = myHB->GetDSFaceFromDSEdge(iE, 2);
if(loi2.Extent() == 1) {
b = Standard_True;
iF1 = loi2.First();
return loi;
}
}
b = Standard_False;
return myEmptyListOfInteger;
}
//=======================================================================
//function : RemoveFaceSameDomain
//purpose :
//=======================================================================
void BRepAlgo_DSAccess::RemoveFaceSameDomain
(const Standard_Integer iF1,
const Standard_Integer iF2)
{
TopOpeBRepDS_DataStructure& DS = myHDS->ChangeDS();
const TopoDS_Shape& F1 = DS.Shape(iF1, FindKeep);
const TopoDS_Shape& F2 = DS.Shape(iF2, FindKeep);
if(F1.IsNull() || F2.IsNull())
return;
Standard_Integer iref1 = DS.SameDomainRef(F1),
iref2 = DS.SameDomainRef(F2), istart, iend;
if(iref1 == iF1)
DS.SameDomainRef(F2,iF2);
if(iref2 == iF1)
DS.SameDomainRef(F1,iF1);
DS.UnfillShapesSameDomain(F1,F2);
if(iref1 != iref2)
return;
Standard_Boolean iF1iF2IsConnected = Standard_False;
TColStd_IndexedMapOfInteger moi;
moi.Clear();
if(iref2 == iF2) {
istart = iF2;
iend = iF1;
}
else {
istart = iF1;
iend = iF2;
}
moi.Add(istart);
Standard_Integer NbConnect = 0, icurr;
while(moi.Extent() > NbConnect) {
NbConnect++;
icurr = moi.FindKey(NbConnect);
DS.SameDomainRef(icurr, istart);
const TopTools_ListOfShape& los = DS.ShapeSameDomain(icurr);
if(los.IsEmpty()) {
const TopoDS_Shape& SNSD = DS.Shape(icurr);
DS.SameDomainRef(SNSD, 0);
}
TopTools_ListIteratorOfListOfShape li(los);
for(; li.More(); li.Next()) {
Standard_Integer iCurrShap = DS.Shape(li.Value(), FindKeep);
if(!iCurrShap)
return;
if(iCurrShap == iend)
iF1iF2IsConnected = Standard_True;
moi.Add(iCurrShap);
}
}
if(!iF1iF2IsConnected) {
moi.Clear();
moi.Add(iend);
NbConnect = 0;
while(moi.Extent() > NbConnect) {
NbConnect++;
icurr = moi.FindKey(NbConnect);
DS.SameDomainRef(icurr, iend);
const TopTools_ListOfShape& los = DS.ShapeSameDomain(icurr);
if(los.IsEmpty()) {
const TopoDS_Shape& SNSD = DS.Shape(icurr);
DS.SameDomainRef(SNSD, 0);
}
TopTools_ListIteratorOfListOfShape li(los);
for(; li.More(); li.Next()) {
Standard_Integer iCurrShap = DS.Shape(li.Value(), FindKeep);
if(!iCurrShap)
return;
moi.Add(iCurrShap);
}
}
}
}
//=======================================================================
//function : DS
//purpose :
//=======================================================================
const Handle(TopOpeBRepDS_HDataStructure)&
BRepAlgo_DSAccess::DS() const
{
return myHDS;
}
//=======================================================================
//function : changeDS
//purpose :
//=======================================================================
Handle(TopOpeBRepDS_HDataStructure)&
BRepAlgo_DSAccess::ChangeDS()
{
return myHDS;
}
//=======================================================================
//function : Builder
//purpose :
//=======================================================================
const Handle(TopOpeBRepBuild_HBuilder)&
BRepAlgo_DSAccess::Builder() const
{
return myHB;
}
//=======================================================================
//function : ChangeBuilder
//purpose :
//=======================================================================
Handle(TopOpeBRepBuild_HBuilder)&
BRepAlgo_DSAccess::ChangeBuilder()
{
return myHB;
}