1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-04 13:13:25 +03:00
Files
occt/src/TopOpeBRepDS/TopOpeBRepDS_FIR.cxx
abv c5f3a42524 0024023: Revamp the OCCT Handle -- downcast (automatic)
Automatic update by command "occt_upgrade . -downcast"

C-style cast of Handle to that of derived type (now illegal) is replaced by call to DownCast()
Const reference local variables of Handle type initialized by result of DownCast are replaced by normal variables.
2015-07-11 12:08:05 +03:00

585 lines
21 KiB
C++

// Copyright (c) 1998-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.
// Robert Boehne 30 May 2000 : Dec Osf
#include <TopOpeBRepDS_FIR.ixx>
#include <TopOpeBRepDS_define.hxx>
#include <TopOpeBRepTool_EXPORT.hxx>
#include <TopOpeBRepTool_SC.hxx>
#include <TopOpeBRepDS_ProcessInterferencesTool.hxx>
#include <TopoDS.hxx>
#include <TopExp_Explorer.hxx>
#include <TopOpeBRepDS_FaceInterferenceTool.hxx>
#include <TopOpeBRepDS_CurvePointInterference.hxx>
#include <TopOpeBRepDS_ShapeShapeInterference.hxx>
#include <TopOpeBRepDS_ShapeData.hxx>
#include <TopOpeBRepDS_MapOfShapeData.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
#include <TopOpeBRepDS_ListOfShapeOn1State.hxx>
#include <TopOpeBRepDS_DataMapOfShapeListOfShapeOn1State.hxx>
#define MDSke TopOpeBRepDS_EDGE
#define MDSkf TopOpeBRepDS_FACE
#ifdef OCCT_DEBUG
void debrededg(const Standard_Integer I) {cout<<"+++ debrededg f"<<I<<endl;}
void debredfac(const Standard_Integer I) {cout<<"+++ debredfac f"<<I<<endl;}
void FUN_dumploiS(const TopoDS_Shape& SG,const TopOpeBRepDS_ListOfInterference& loi,const TopOpeBRepDS_DataStructure& BDS,TCollection_AsciiString str)
{
cout<<str<<" G : "<<BDS.Shape(SG)<<" S : ";
for(TopOpeBRepDS_ListIteratorOfListOfInterference it(loi);it.More();it.Next()) cout<<it.Value()->Support()<<" ";
cout<<endl;cout.flush();
}
void FUN_dumpmosd(TopOpeBRepDS_MapOfShapeData& mosd,const TopOpeBRepDS_DataStructure& BDS,const Standard_Integer F,TCollection_AsciiString str)
{
cout<<str<<"GmapS sur ";TopAbs::Print(BDS.Shape(F).ShapeType(),cout);
cout<<" "<<F<<" : "<<mosd.Extent()<<" (GK EDGE)(SK FACE)"<<endl;
for(Standard_Integer i=1,n=mosd.Extent();i<=n;i++) {
FUN_dumploiS(mosd.FindKey(i),mosd.FindFromIndex(i).Interferences(),BDS,str);
}
}
#endif
#ifdef OCCT_DEBUG
extern Standard_Boolean TopOpeBRepDS_GettraceSTRANGE();
extern Standard_Boolean TopOpeBRepDS_GettracePEI();
extern Standard_Boolean TopOpeBRepDS_GettracePFI();
extern Standard_Boolean TopOpeBRepDS_GettracePI();
extern Standard_Boolean TopOpeBRepDS_GettraceSPSX(const Standard_Integer);
static Standard_Boolean FTRCF(const Standard_Integer F) {
Standard_Boolean b1 = TopOpeBRepDS_GettracePFI();
Standard_Boolean b2 = TopOpeBRepDS_GettracePI();
Standard_Boolean b3 = TopOpeBRepDS_GettraceSPSX(F);
return (b1 || b2 || b3);
}
static Standard_Boolean FTRCE(const Standard_Integer E) {
Standard_Boolean b1 = TopOpeBRepDS_GettracePEI();
Standard_Boolean b2 = TopOpeBRepDS_GettracePI();
Standard_Boolean b3 = TopOpeBRepDS_GettraceSPSX(E);
return (b1 || b2 || b3);
}
#endif
Standard_EXPORT Standard_Boolean FUN_Parameters(const gp_Pnt& Pnt,const TopoDS_Shape& F,Standard_Real& u,Standard_Real& v);
Standard_EXPORT Standard_Boolean FUN_edgeofface(const TopoDS_Shape& E,const TopoDS_Shape& F);
//------------------------------------------------------
Standard_Boolean FUN_isPonF(const TopOpeBRepDS_ListOfInterference& LIF,const gp_Pnt& P,const TopOpeBRepDS_DataStructure& BDS,const TopoDS_Edge& E)
{
Standard_Boolean Pok = Standard_True;
TopOpeBRepDS_Kind GT1,ST1; Standard_Integer G1,S1;
TopOpeBRepDS_ListIteratorOfListOfInterference itF(LIF);
for (;itF.More();itF.Next()) {
Handle(TopOpeBRepDS_Interference)& IF = itF.Value(); FDS_data(IF,GT1,G1,ST1,S1);
const TopoDS_Face& F = TopoDS::Face(BDS.Shape(S1));
TopAbs_Orientation oEinF; Standard_Boolean edonfa = FUN_tool_orientEinFFORWARD(E,F,oEinF );
if ( edonfa ) Pok = Standard_True;
else {
// P est NOK pour une face de LIF : arret
Standard_Real u,v; Pok = FUN_Parameters(P,F,u,v);
if (!Pok) break;
}
}
return Pok;
}
//------------------------------------------------------
Standard_Boolean FUN_findPonF(const TopoDS_Edge& E,const TopOpeBRepDS_DataStructure& BDS, const TopOpeBRepDS_ListOfInterference& LIF,gp_Pnt& P,Standard_Real& par)
{
Standard_Boolean Pok = Standard_False;
BRepAdaptor_Curve BAC(E);
const TopOpeBRepDS_ListOfInterference& LIE = BDS.ShapeInterferences(E);
TopOpeBRepDS_ListIteratorOfListOfInterference itI; itI.Initialize(LIE);
if ( !itI.More() ) {
Pok = FUN_tool_findPinBAC(BAC,P,par);
Pok = FUN_isPonF(LIF,P,BDS,E);
return Pok;
}
TopOpeBRepDS_Kind GT1,ST1;Standard_Integer G1,S1;
for (;itI.More();itI.Next()) {
Standard_Boolean pardef = Standard_False;
Handle(TopOpeBRepDS_Interference)& I = itI.Value(); FDS_data(I,GT1,G1,ST1,S1);
Handle(TopOpeBRepDS_CurvePointInterference) CPI (Handle(TopOpeBRepDS_CurvePointInterference)::DownCast(I));
Handle(TopOpeBRepDS_ShapeShapeInterference) SSI (Handle(TopOpeBRepDS_ShapeShapeInterference)::DownCast(I));
if (!CPI.IsNull()) {
par = CPI->Parameter(); pardef = Standard_True;
}
else if (!SSI.IsNull()) {
Standard_Boolean gb = SSI->GBound();
if (gb) {
const TopoDS_Vertex& V = TopoDS::Vertex(BDS.Shape(G1));
P = BRep_Tool::Pnt(V); par = BRep_Tool::Parameter(V,E); pardef = Standard_True;
}
else {
pardef = Standard_False;
if (GT1 == TopOpeBRepDS_POINT) P = BDS.Point(G1).Point();
else if (GT1 == TopOpeBRepDS_VERTEX) P = BRep_Tool::Pnt(TopoDS::Vertex(BDS.Shape(G1)));
if (pardef) {
Standard_Real dist; pardef = FUN_tool_projPonC(P,BAC,par,dist);
}
}
}
else {
continue;
}
if (!pardef) {
continue;
}
BAC.D0(par,P);
Pok = FUN_isPonF(LIF,P,BDS,E);
// P est OK pour toutes les faces de LIF : on arrete de chercher
if (Pok) {
break;
}
}
return Pok;
}
// --------------------------------------------------------
static void FDS_DUMPTRANSITION(const Standard_Boolean
#ifdef OCCT_DEBUG
TRCF
#endif
,const TCollection_AsciiString&
#ifdef OCCT_DEBUG
str
#endif
,const Standard_Integer
#ifdef OCCT_DEBUG
iFI
#endif
,TopOpeBRepDS_FaceInterferenceTool&
#ifdef OCCT_DEBUG
FITool
#endif
)
{
#ifdef OCCT_DEBUG
if (TRCF) {
cout<<str<<iFI<<endl;
Handle(TopOpeBRepDS_Interference) IBID = new TopOpeBRepDS_Interference();
FITool.Transition(IBID);
IBID->Transition().Dump(cout);cout<<endl;
}
#endif
}
// --------------------------------------------------------
static void FDS_ADDEDGE
(const Standard_Boolean
#ifdef OCCT_DEBUG
TRCF
#endif
,const TCollection_AsciiString&
#ifdef OCCT_DEBUG
str
#endif
,const Standard_Integer
#ifdef OCCT_DEBUG
iFI // DEB args
#endif
,TopOpeBRepDS_FaceInterferenceTool& FITool
,const TopoDS_Shape& FI
,const TopoDS_Shape& F
,const TopoDS_Shape& Ecpx
,const Standard_Boolean isEGsp
,const Handle(TopOpeBRepDS_Interference)& I
)
{
#ifdef OCCT_DEBUG
if (TRCF) {TCollection_AsciiString cr("\n"),s=str+iFI+cr;I->Dump(cout,s,cr);}
#endif
FITool.Add(FI,F,Ecpx,isEGsp,I);
#ifdef OCCT_DEBUG
FDS_DUMPTRANSITION(TRCF,"--> resultat partiel sur face ",iFI,FITool);
#endif
}
//------------------------------------------------------
// EGsp = edge splittee de iEG ( Null si iEG n'est pas splittee)
void FUN_reduceEDGEgeometry1
(TopOpeBRepDS_ListOfInterference& LI,const TopOpeBRepDS_DataStructure& BDS,const Standard_Integer iFI,const Standard_Integer iEG,const TopoDS_Shape& EGsp,
// const TopOpeBRepDS_DataMapOfShapeListOfShapeOn1State& MEsp)
const TopOpeBRepDS_DataMapOfShapeListOfShapeOn1State& )
{
Standard_Boolean TRCF = Standard_False;
#ifdef OCCT_DEBUG
Standard_Boolean TRCE = Standard_False;
TRCE = FTRCE(iEG);if (TRCE) debrededg(iEG);
TRCF = FTRCF(iFI);if (TRCF) debredfac(iFI);
#endif
TopOpeBRepDS_ListIteratorOfListOfInterference ili(LI); if (!ili.More()) return;
// choix de l'arete Ecpx, lieu de resolution de la transition complexe
const TopoDS_Face& FI = TopoDS::Face(BDS.Shape(iFI));
Standard_Boolean isEGsp = (! EGsp.IsNull());
TopoDS_Edge Ecpx;
if (isEGsp) Ecpx = TopoDS::Edge(EGsp);
else Ecpx = TopoDS::Edge(BDS.Shape(iEG));
TopOpeBRepDS_PDataStructure pbds = (TopOpeBRepDS_PDataStructure)(void*)&BDS;
TopOpeBRepDS_FaceInterferenceTool FITool(pbds);
gp_Pnt Pok; Standard_Boolean isPok = Standard_False; Standard_Real parPok;
if ( LI.Extent() >= 2) {
if ( isEGsp ) isPok = FUN_tool_findPinE(Ecpx,Pok,parPok);
else isPok = FUN_findPonF(Ecpx,BDS,LI,Pok,parPok); // NYI pas necessaire
if (!isPok) { LI.Clear(); return; }
FITool.SetEdgePntPar(Pok,parPok);
}
// xpu :090498 :
// CTS20205 : sp(e5) = sp(e4 of rank=1) and c3d(e5) c3d(e4) are diff oriented
// As transitions on face<iFI> are given relative to the geometry of e5,
// we have to complement them.
// Standard_Boolean toreverse = Standard_False;
// Standard_Boolean hsdm = !BDS.ShapeSameDomain(iEG).IsEmpty();
// if (hsdm) {
// Standard_Boolean sameoriented = Standard_False;
// Standard_Boolean ok = FUN_tool_curvesSO(TopoDS::Edge(Ecpx),parPok,TopoDS::Edge(BDS.Shape(iEG)),
// sameoriented);
// if (ok) toreverse = !sameoriented;
// }
// xpu :090498
// FI = face de reference (shape), iFI (indice)
// E = arete geometrie d'interference (shape), iEG (indice)
// LI = liste d'interf de geom iEG et dont les Support() sont a transitionner complexe
Handle(TopOpeBRepDS_Interference) I1,I2; TopOpeBRepDS_Kind GT1,ST1,GT2,ST2; Standard_Integer G1,S1,G2,S2;
TopOpeBRepDS_ListIteratorOfListOfInterference it1; it1.Initialize(LI);
while (it1.More()) {
Standard_Boolean u1 = FDS_data(it1,I1,GT1,G1,ST1,S1);if (u1) {it1.Next();continue;}
Standard_Boolean ya1 = (GT1 == MDSke); if (!ya1) {it1.Next();continue;}
Standard_Boolean isComplex = Standard_False; // True if at least two interfs on the same edge
const TopoDS_Face& F1 = TopoDS::Face(BDS.Shape(S1));
TopOpeBRepDS_ListIteratorOfListOfInterference it2(it1); it2.Next();
while (it2.More()) {
Standard_Boolean u2 = FDS_data(it2,I2,GT2,G2,ST2,S2);if (u2) {it2.Next();continue;}
Standard_Boolean ya2 = (GT2==GT1 && G2==G1 && ST2==ST1); if (!ya2) {it2.Next();continue;}
const TopoDS_Face& F2 = TopoDS::Face(BDS.Shape(S2));
if (!isComplex) {
isComplex = Standard_True;
// TopOpeBRepDS_Transition T1 = I1->Transition(); TopAbs_Orientation O1 = T1.Orientation(TopAbs_IN); // xpu :090498
// Standard_Boolean revT1 = toreverse && (M_FORWARD(O1) || M_REVERSED(O1)); // xpu :090498
#ifdef OCCT_DEBUG
// if ((TRCE || TRCF) && revT1) cout<<"-> REVERSE T"<<endl;
#endif
// if (revT1) I1->ChangeTransition() = T1.Complement(); //xpu :090498
FITool.Init(FI,Ecpx,isEGsp,I1);
FDS_ADDEDGE(TRCF,"\ninit transition complexe F",iFI,FITool,FI,F1,Ecpx,isEGsp,I1);
// if (revT1) I1->ChangeTransition() = T1.Complement(); //xpu :090498
}
// TopOpeBRepDS_Transition T2 = I2->Transition(); TopAbs_Orientation O2 = T2.Orientation(TopAbs_IN); // xpu :090498
// Standard_Boolean revT2 = toreverse && (M_FORWARD(O2) || M_REVERSED(O2)); // xpu :090498
#ifdef OCCT_DEBUG
// if ((TRCE || TRCF) && revT2) cout<<"-> REVERSE T"<<endl;
#endif
// if (revT2) I2->ChangeTransition() = T2.Complement(); //xpu :090498
FDS_ADDEDGE(TRCF,"add transition complexe F",iFI,FITool,FI,F2,Ecpx,isEGsp,I2);
// if (revT2) I2->ChangeTransition() = T2.Complement(); //xpu :090498
LI.Remove(it2);
}
if (isComplex) {
FITool.Transition(I1);
FDS_DUMPTRANSITION(TRCF,"--> result transition on face ",iFI,FITool); // DEB
}
it1.Next();
} // it1.More()
} // FUN_reduceEDGEgeometry1
//------------------------------------------------------
void FUN_GmapS(TopOpeBRepDS_ListOfInterference& LI, const TopOpeBRepDS_DataStructure& BDS, TopOpeBRepDS_MapOfShapeData& mosd)
{
mosd.Clear();
TopOpeBRepDS_Kind GT1,ST1;Standard_Integer G1,S1;
for (TopOpeBRepDS_ListIteratorOfListOfInterference it1(LI);it1.More();it1.Next()) {
Handle(TopOpeBRepDS_Interference)& I1=it1.Value(); FDS_data(I1,GT1,G1,ST1,S1);
if ( GT1 != MDSke || ST1 != MDSkf ) continue;
const TopoDS_Shape& SG1 = BDS.Shape(G1);
TopOpeBRepDS_ShapeData thedata;
if (!mosd.Contains(SG1)) mosd.Add(SG1, thedata);
mosd.ChangeFromKey(SG1).ChangeInterferences().Append(I1);
}
}
//------------------------------------------------------
TopAbs_State FUN_stateedgeface(const TopoDS_Shape& E, const TopoDS_Shape& F, gp_Pnt& P)
{
TopAbs_State state = TopAbs_UNKNOWN;
Standard_Real par; FUN_tool_findPinE(E,P,par);
Standard_Real u,v; Standard_Boolean Pok = FUN_Parameters(P,F,u,v);
if (Pok) { // classifier u,v dans F
TopOpeBRepTool_ShapeClassifier& PSC = FSC_GetPSC(F);
gp_Pnt2d Puv(u,v);
PSC.StateP2DReference(Puv);
state = PSC.State();
}
return state;
}
#define M_IN(ssstate) ((ssstate) == TopAbs_IN)
#define M_ON(ssstate) ((ssstate) == TopAbs_ON)
#define M_OUT(ssstate) ((ssstate) == TopAbs_OUT)
#define M_UNK(ssstate) ((ssstate) == TopAbs_UNK)
//------------------------------------------------------
void FUN_reduceEDGEgeometry
(TopOpeBRepDS_ListOfInterference& LI,const TopOpeBRepDS_DataStructure& BDS,const Standard_Integer iFI,
const TopOpeBRepDS_DataMapOfShapeListOfShapeOn1State& MEsp)
{
if (!LI.Extent()) return;
TopOpeBRepDS_MapOfShapeData mosd;
FUN_GmapS(LI,BDS,mosd);
#ifdef OCCT_DEBUG
Standard_Boolean TRC = FTRCF(iFI);
if (TRC) FUN_dumpmosd(mosd,BDS,iFI,"");
if (TRC) debredfac(iFI);
#endif
TopOpeBRepDS_ListOfInterference LIout;
//modified by NIZNHY-PKV Thu Mar 16 09:44:24 2000 f
Standard_Integer i, aN;
aN=mosd.Extent();
//for(Standard_Integer i=1,n=mosd.Extent(); i<=n; i++) {
//modified by NIZNHY-PKV Thu Mar 16 09:44:27 2000 t
for(i=1 ; i<=aN; i++) {
const TopoDS_Shape& EG = mosd.FindKey(i);
Standard_Integer iEG = BDS.Shape(EG);
// donnees samedomain attachees a l'arete iEG
const TopTools_ListOfShape& esdeg = BDS.ShapeSameDomain(iEG);
Standard_Boolean egissect = BDS.IsSectionEdge(TopoDS::Edge(EG));
Standard_Boolean eghasesd = (! esdeg.IsEmpty());
#ifdef OCCT_DEBUG
// Standard_Integer egiref = BDS.SameDomainRef(iEG);
// Standard_Integer egisref = (iEG == egiref);
// TopOpeBRepDS_Config egc = BDS.SameDomainOri(iEG);
#endif
TopOpeBRepDS_ListOfInterference& LIEG = mosd.ChangeFromKey(EG).ChangeInterferences();
Standard_Integer nExt = LIEG.Extent();
// LIEG = toutes les interferences dont le Support() est une
// face possedant une interference dont la Geometry() est EG.
#ifdef OCCT_DEBUG
if (TRC) FUN_dumploiS(EG,LIEG,BDS," ");
#endif
if (nExt == 0) {
continue;
}
if (nExt == 1) {
LIout.Append(LIEG);
}
else if (nExt >= 2) {
Standard_Boolean isEGsp = MEsp.IsBound(EG);
//modified by NIZNHY-PKV Thu Mar 16 11:03:44 2000 from
//Standard_Integer nEGsp = 0;
//modified by NIZNHY-PKV Thu Mar 16 11:03:49 2000 to
if (isEGsp) {
const TopOpeBRepDS_ListOfShapeOn1State& los1 = MEsp.Find(EG);
isEGsp = los1.IsSplit();
//modified by NIZNHY-PKV Thu Mar 16 11:02:40 2000 from
//if ( isEGsp ) {
// const TopTools_ListOfShape& los = los1.ListOnState();
// nEGsp = los.Extent();
//}
//modified by NIZNHY-PKV Thu Mar 16 11:02:46 2000 to
}
if ( isEGsp ) {
const TopTools_ListOfShape& los = MEsp.Find(EG).ListOnState();
TopTools_ListIteratorOfListOfShape itlos(los);
for(;itlos.More();itlos.Next()) {
// EGsp est une arete splitee de EG.
const TopoDS_Shape& EGsp = itlos.Value();
// LISFIN = liste des interferences de LI dont le Support()
// est une face contenant geometriquement l'arete EGsp
TopOpeBRepDS_ListOfInterference LISFIN;
TopOpeBRepDS_ListIteratorOfListOfInterference itLIEG(LIEG);
for(; itLIEG.More(); itLIEG.Next()) {
const Handle(TopOpeBRepDS_Interference)& ILIEG = itLIEG.Value();
Standard_Integer iS = ILIEG->Support();
TopOpeBRepDS_Kind kS = ILIEG->SupportType();
if ( kS == MDSkf ) {
const TopoDS_Shape& SFILIEG = BDS.Shape(iS);
gp_Pnt P;
TopAbs_State staef = FUN_stateedgeface(EGsp,SFILIEG,P);
Standard_Boolean Pok = M_IN(staef);
if ( eghasesd || egissect ) {
Pok = Pok || M_ON(staef);
}
if (Pok) {
LISFIN.Append(ILIEG);
}
}
} // itLIEG.More
Standard_Integer nLISFIN = LISFIN.Extent();
if (nLISFIN >= 2 ) {
Standard_Boolean gb;
gb = Handle(TopOpeBRepDS_ShapeShapeInterference)::DownCast(LISFIN.First())->GBound();
if (gb) {
//modified by NIZNHY-PKV Thu Mar 16 10:40:57 2000 f
// we have to rest at least one Interference on the face.
// To kill all of them is too bravely.
Handle(TopOpeBRepDS_Interference) anInterference = LISFIN.First();
LISFIN.Clear();
LISFIN.Append(anInterference);
//modified by NIZNHY-PKV Thu Mar 16 10:41:01 2000 t
}
else
FUN_reduceEDGEgeometry1(LISFIN,BDS,iFI,iEG,EGsp,MEsp);
}
nLISFIN = LISFIN.Extent();
if (nLISFIN)
LIout.Append(LISFIN);
}
} // isEGsp
else {
// iFI = face de reference (indice)
// E = arete geometrie d'interference (shape), iEG (indice)
// LIEG = liste d'interferences de geometrie EG
// et dont les Support() sont a transitionner complexe
TopoDS_Shape Enull;
FUN_reduceEDGEgeometry1(LIEG,BDS,iFI,iEG,Enull,MEsp);
LIout.Append(LIEG);
}
}
}
LI.Clear();
LI.Append(LIout);
} // FUN_reduceEDGEgeometry
//=======================================================================
//function : TopOpeBRepDS_FIR
//purpose :
//=======================================================================
TopOpeBRepDS_FIR::TopOpeBRepDS_FIR
(const Handle(TopOpeBRepDS_HDataStructure)& HDS) : myHDS(HDS)
{}
//=======================================================================
//function : ProcessFaceInterferences
//purpose :
//=======================================================================
void TopOpeBRepDS_FIR::ProcessFaceInterferences(const TopOpeBRepDS_DataMapOfShapeListOfShapeOn1State& M)
{
TopOpeBRepDS_DataStructure& BDS = myHDS->ChangeDS();
Standard_Integer i,nshape = BDS.NbShapes();
for (i = 1; i <= nshape; i++) {
const TopoDS_Shape& S = BDS.Shape(i);
if(S.IsNull()) continue;
if ( S.ShapeType() == TopAbs_FACE ) {
ProcessFaceInterferences(i,M);
}
}
}
//=======================================================================
//function : ProcessFaceInterferences
//purpose :
//=======================================================================
void TopOpeBRepDS_FIR::ProcessFaceInterferences
(const Standard_Integer SIX,const TopOpeBRepDS_DataMapOfShapeListOfShapeOn1State& MEsp)
{
TopOpeBRepDS_DataStructure& BDS = myHDS->ChangeDS();
#ifdef OCCT_DEBUG
Standard_Boolean TRC = FTRCF(SIX);
if (TRC) debredfac(SIX);
#endif
// F is the Face, LI is list of interferences to compact
#ifdef OCCT_DEBUG
// const TopoDS_Shape& F = BDS.Shape(SIX);
#endif
TopOpeBRepDS_ListOfInterference& LI = BDS.ChangeShapeInterferences(SIX);
TopOpeBRepDS_ListOfInterference lw, lE, lFE, lFEF, lF; lw.Assign(LI);
#ifdef OCCT_DEBUG
Standard_Integer nF, nFE, nFEF, nE;
#endif
::FUN_selectTRASHAinterference(lw,TopAbs_FACE,lF);
::FUN_selectGKinterference(lF,MDSke,lFE);
::FUN_selectSKinterference(lFE,MDSkf,lFEF);
::FUN_selectTRASHAinterference(lw,TopAbs_EDGE,lE);
#ifdef OCCT_DEBUG
nF = lF.Extent();
nFE = lFE.Extent();
nFEF = lFEF.Extent();
nE = lE.Extent();
if(TRC){
if(nF||nFE||nFEF||nE){cout<<endl;cout<<"-----------------------"<<endl;}
if(nF) {cout<<"FACE "<<SIX<<" (FACE) : "<<nF<<endl;FDS_dumpLI(lF," ");}
if(nFE){cout<<"FACE "<<SIX<<" (FACE)(GK EDGE) : "<<nFE<<endl;FDS_dumpLI(lFE," ");}
if(nFEF){cout<<"FACE "<<SIX<<" (FACE)(GK EDGE)(SK FACE) : "<<nFEF<<endl;FDS_dumpLI(lFEF," ");}
if(nE) {cout<<"FACE "<<SIX<<" (EDGE) : "<<nE<<endl;FDS_dumpLI(lE," ");}
}
#endif
FUN_reduceEDGEgeometry(lFEF,BDS,SIX,MEsp);
#ifdef OCCT_DEBUG
nF = lF.Extent();
nFE = lFE.Extent();
nFEF = lFEF.Extent();
nE = lE.Extent();
if(TRC){
if(nF||nFE||nFEF||nE)cout<<endl;
if(nF) {cout<<"FACE "<<SIX<<" (FACE) : "<<nF<<endl;FDS_dumpLI(lF," ");}
if(nFE){cout<<"FACE "<<SIX<<" (FACE)(GK EDGE) : "<<nFE<<endl;FDS_dumpLI(lFE," ");}
if(nFEF){cout<<"FACE "<<SIX<<" (FACE)(GK EDGE)(SK FACE) : "<<nFEF<<endl;FDS_dumpLI(lFEF," ");}
if(nE) {cout<<"FACE "<<SIX<<" (EDGE) : "<<nE<<endl;FDS_dumpLI(lE," ");}
cout<<"-----------------------"<<endl;
}
#endif
LI.Clear();
LI.Append(lF);
LI.Append(lFE);
LI.Append(lFEF);
LI.Append(lE);
// MSV: filter duplicates
::FUN_reducedoublons(LI,BDS,SIX);
}