Files
OCCT/src/ModelingAlgorithms/TKBool/TopOpeBRepBuild/TopOpeBRepBuild_BuilderON.cxx
T
Pasukhin Dmitry 1a2e039ab9 Coding - Clean up the trace debug files (#1487)
Some *trace* old debug classes existed for long time.
Their purpose is accumulte some trace logic for TopOpe or BRepFeat packages.
The problem is that that functionality is no longer used by active developers.
And the functionality in some cases changes behavior and make more complicated to debug.
Lack of documentation how to work with and impact on behavior and
  usage of global/static variables make these classes heavy legacy.
2026-08-23 15:00:47 +01:00

3093 lines
81 KiB
C++

// Created on: 1996-03-07
// Created by: Jean Yves LEBEY
// Copyright (c) 1996-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 <BRep_Tool.hxx>
#include <BRepLProp_SLProps.hxx>
#include <BRepLProp_SurfaceTool.hxx>
#include <GeomAbs_SurfaceType.hxx>
#include <Precision.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Shape.hxx>
#include <TopOpeBRepBuild_BuilderON.hxx>
#include <TopOpeBRepBuild_define.hxx>
#include <TopOpeBRepDS_connex.hxx>
#include <TopOpeBRepDS_Interference.hxx>
#include <TopOpeBRepDS_ProcessInterferencesTool.hxx>
#include <TopOpeBRepDS_ShapeShapeInterference.hxx>
#include <TopOpeBRepTool_GEOMETRY.hxx>
#include <TopOpeBRepTool_PROJECT.hxx>
#include <TopOpeBRepTool_TOPOLOGY.hxx>
#include <TopOpeBRepTool_SC.hxx>
#include <TopOpeBRepTool_TOOL.hxx>
#ifdef OCCT_DEBUG
Standard_EXPORT void debON(const int iF)
{
std::cout << "++ debON " << iF << " " << std::endl;
}
Standard_EXPORT void debON(const int iF, const TopAbs_State TB1, const TopAbs_State TB2)
{
std::cout << "++ debON " << iF << " :TB1=";
TopAbs::Print(TB1, std::cout);
std::cout << ",TB2=";
TopAbs::Print(TB2, std::cout);
std::cout << std::endl;
}
Standard_EXPORT void debfillonf(const int iF)
{
std::cout << "++ debfillonf " << iF << " " << std::endl;
}
Standard_EXPORT void debfillone(const int iE)
{
std::cout << "++ debfillone " << iE << " " << std::endl;
}
Standard_EXPORT void debfillonfe() {}
Standard_EXPORT void debfillonfemess(const int f, const int e)
{
std::cout << "++ debfillonfe f" << f << " e" << e << std::endl;
debfillonfe();
}
Standard_EXPORT void debfillonfe3d() {}
Standard_EXPORT void debfillonfemess3d(const int f, const int e)
{
std::cout << "++ debfillonfe3d f" << f << " e" << e << std::endl;
debfillonfe3d();
}
Standard_EXPORT void debfillonfemess(const int iFOR,
const int iEG,
TopOpeBRepBuild_Builder* const& PB,
TopOpeBRepBuild_WireEdgeSet* const& PWES,
const TCollection_AsciiString& str)
{
PB->GdumpSHASTA(iEG, TopAbs_ON, *PWES, str);
debfillonfemess(iFOR, iEG);
}
Standard_EXPORT void debaddpwes(const int iFOR,
const TopAbs_State TB1,
const int iEG,
const TopAbs_Orientation neworiE,
TopOpeBRepBuild_Builder* const& PB,
TopOpeBRepBuild_WireEdgeSet* const& PWES,
const TCollection_AsciiString& str1,
const TCollection_AsciiString& str2)
{
PB->GdumpSHASTA(iFOR, TB1, *PWES, str1, str2);
std::cout << iEG << " : 1 edge ";
TopAbs::Print(neworiE, std::cout);
std::cout << std::endl;
}
Standard_EXPORT bool DEBTEFOR(const TopOpeBRepBuild_Builder& B, const int iFOR, const int GI)
{
return B.GtraceSPS(iFOR, GI);
}
#endif
#ifdef OCCT_DEBUG
Standard_EXPORT void FUN_RaiseON()
{
throw Standard_Failure("BuilderON");
}
static void FUN_cout(const TopoDS_Shape& eON)
{
TopAbs_Orientation oE = eON.Orientation();
if (oE == TopAbs_FORWARD)
std::cout << "-> + eONF" << std::endl;
if (oE == TopAbs_REVERSED)
std::cout << "-> + eONR" << std::endl;
if (oE == TopAbs_INTERNAL)
std::cout << "-> + eONI" << std::endl;
if (oE == TopAbs_EXTERNAL)
std::cout << "-> + eONE" << std::endl;
}
#endif
#define M_FORWARD(st) (st == TopAbs_FORWARD)
#define M_REVERSED(st) (st == TopAbs_REVERSED)
#define M_INTERNAL(st) (st == TopAbs_INTERNAL)
#define M_EXTERNAL(st) (st == TopAbs_EXTERNAL)
// NYI : TopOpeBRepTool_ShapeTool::ShapesSameOriented -> CurvesSameOriented NYI for E !line
// Standard_IMPORT bool TopOpeBRepBuild_FUN_aresamegeom(const TopoDS_Shape& S1,const
// TopoDS_Shape& S2);
//=================================================================================================
TopOpeBRepBuild_BuilderON::TopOpeBRepBuild_BuilderON() = default;
//=================================================================================================
TopOpeBRepBuild_BuilderON::TopOpeBRepBuild_BuilderON(
TopOpeBRepBuild_Builder* const& PB,
const TopoDS_Shape& FOR,
TopOpeBRepBuild_GTopo* const& PG,
NCollection_List<TopoDS_Shape>* const& PLSclass,
TopOpeBRepBuild_WireEdgeSet* const& PWES)
{
Perform(PB, FOR, PG, PLSclass, PWES);
}
//=================================================================================================
void TopOpeBRepBuild_BuilderON::Perform(TopOpeBRepBuild_Builder* const& PB,
const TopoDS_Shape& FOR,
TopOpeBRepBuild_GTopo* const& PG,
NCollection_List<TopoDS_Shape>* const& PLSclass,
TopOpeBRepBuild_WireEdgeSet* const& PWES)
{
myPB = PB;
myFace = FOR;
myPG = PG;
myPLSclass = PLSclass;
myPWES = PWES;
#ifdef OCCT_DEBUG
int iFOR;
bool tFOR = myPB->GtraceSPS(FOR, iFOR);
if (tFOR)
debfillonf(iFOR);
#endif
const TopOpeBRepDS_DataStructure& BDS = myPB->DataStructure()->DS();
const NCollection_List<occ::handle<TopOpeBRepDS_Interference>>& LI =
BDS.ShapeInterferences(myFace);
for (NCollection_List<occ::handle<TopOpeBRepDS_Interference>>::Iterator ILI(LI); ILI.More();
ILI.Next())
{
const occ::handle<TopOpeBRepDS_Interference>& I = ILI.Value();
GFillONPartsWES1(I);
}
}
//=================================================================================================
bool TopOpeBRepBuild_BuilderON::GFillONCheckI(const occ::handle<TopOpeBRepDS_Interference>& I) const
{
const TopOpeBRepDS_DataStructure& BDS = myPB->DataStructure()->DS();
occ::handle<TopOpeBRepDS_ShapeShapeInterference> SSI =
occ::down_cast<TopOpeBRepDS_ShapeShapeInterference>(I);
if (SSI.IsNull())
{
return false;
}
TopOpeBRepDS_Kind GT, ST;
int GI, SI;
FDS_data(SSI, GT, GI, ST, SI);
if (GT != TopOpeBRepDS_EDGE || ST != TopOpeBRepDS_FACE)
{
return false;
}
#ifdef OCCT_DEBUG
// int iFOR=BDS.Shape(myFace);
#endif
const TopoDS_Edge& EG = TopoDS::Edge(BDS.Shape(GI, false));
#ifdef OCCT_DEBUG
// int iEG=BDS.Shape(EG, false);
#endif
const TopoDS_Shape& FS = BDS.Shape(SI, false);
#ifdef OCCT_DEBUG
// int iFS=BDS.Shape(FS, false);
#endif
TopAbs_ShapeEnum ShapeInterf = TopAbs_FACE;
const TopOpeBRepDS_Transition& TFE = SSI->Transition();
TopAbs_ShapeEnum shab = TFE.ShapeBefore(), shaa = TFE.ShapeAfter();
if (shaa != ShapeInterf || shab != ShapeInterf)
{
return false;
}
bool isrest = BDS.IsSectionEdge(EG);
bool issplit = myPB->IsSplit(EG, TopAbs_ON);
bool keep = (isrest && issplit);
if (!keep)
{
return false;
}
const NCollection_List<TopoDS_Shape>& lEspON = myPB->Splits(EG, TopAbs_ON);
if (lEspON.Extent() == 0)
{
return false;
}
#ifdef OCCT_DEBUG
// const TopoDS_Shape& EspON=lEspON.First();
#endif
int rankFS = myPB->GShapeRank(FS);
int rankFOR = myPB->GShapeRank(myFace);
return rankFS != 0 && rankFOR != 0;
} // GFillONCheckI
//=================================================================================================
void TopOpeBRepBuild_BuilderON::GFillONPartsWES1(const occ::handle<TopOpeBRepDS_Interference>& I)
{
const TopOpeBRepDS_DataStructure& BDS = myPB->DataStructure()->DS();
#ifdef OCCT_DEBUG
int iFOR =
#endif
BDS.Shape(myFace);
TopOpeBRepDS_Kind GT, ST;
int GI, SI;
FDS_data(I, GT, GI, ST, SI);
bool Iok = GFillONCheckI(I);
if (!Iok)
{
return;
}
const TopoDS_Edge& EG = TopoDS::Edge(BDS.Shape(GI));
// const TopoDS_Shape& FS=BDS.Shape(SI);
#ifdef OCCT_DEBUG
// int iEG=BDS.Shape(EG);
// int iFS=BDS.Shape(FS);
#endif
#ifdef OCCT_DEBUG
bool tEFOR = DEBTEFOR(*myPB, iFOR, GI);
if (tEFOR)
debfillonfemess(iFOR, GI, myPB, myPWES, "--- GFillONPartsWES1");
#endif
const NCollection_List<TopoDS_Shape>& lEspON = myPB->Splits(EG, TopAbs_ON);
#ifdef OCCT_DEBUG
// int nEspON=lEspON.Extent();
#endif
for (NCollection_List<TopoDS_Shape>::Iterator it(lEspON); it.More(); it.Next())
{
const TopoDS_Shape& EspON = it.Value();
GFillONPartsWES2(I, EspON);
}
} // GFillONPartsWES1
#ifdef OCCT_DEBUG
Standard_EXPORT void FUN_coutmess(const TCollection_AsciiString& m)
{
std::cout << m;
}
#else
Standard_EXPORT void FUN_coutmess(const TCollection_AsciiString&) {}
#endif
//------------------------------------------------------
#ifdef OCCT_DEBUG
bool FUN_keepEON(const TopOpeBRepBuild_Builder& B,
#else
bool FUN_keepEON(const TopOpeBRepBuild_Builder&,
#endif
const TopoDS_Shape& sEG,
const TopoDS_Shape& sFOR,
const TopoDS_Shape& sFS,
#ifdef OCCT_DEBUG
const bool EGBoundFOR,
#else
const bool,
#endif
const TopOpeBRepDS_Transition& TFE,
const TopAbs_State TB1,
const TopAbs_State)
//------------------------------------------------------
{
// on construit l'etat TB1 de FOR par rapport a FS.
// sur face FOR,on transitionne (TFE) en l'arete EG par rapport a la face FS.
// TFE est defini sur la geometrie naturelle de la face orientee FOR,
// c'est a dire sur FF=FOR orientee FORWARD,par rapport a la matiere
// definie par la face orientee FS.
// on cherche oEGFF=orientation de EG dans FF
TopoDS_Edge EG = TopoDS::Edge(sEG);
TopoDS_Face FF = TopoDS::Face(sFOR);
FF.Orientation(TopAbs_FORWARD);
TopoDS_Face FS = TopoDS::Face(sFS);
#ifdef OCCT_DEBUG
int iEG; /*bool tEG=*/
B.GtraceSPS(EG, iEG);
int iFF; /*bool tFF=*/
B.GtraceSPS(FF, iFF);
int iFS; /*bool tFS=*/
B.GtraceSPS(FS, iFS);
bool tFFEG = DEBTEFOR(B, iFF, iEG);
if (tFFEG)
debfillonfemess(iFF, iEG);
bool tFSEG = DEBTEFOR(B, iFS, iEG);
if (tFSEG)
debfillonfemess(iFS, iEG);
#endif
#ifdef OCCT_DEBUG
bool keep1 = true;
bool keep2 = true;
#endif
bool keep3 = true;
bool isclosedFF = BRep_Tool::IsClosed(EG, FF);
if (isclosedFF)
{
#ifdef OCCT_DEBUG
keep1 = true;
keep2 = true;
#endif
keep3 = true;
}
else
{
TopAbs_Orientation oEGFF = TopAbs_FORWARD;
FUN_tool_orientEinF(EG, FF, oEGFF);
#ifdef OCCT_DEBUG
TopAbs_Orientation omatFS1 = TFE.Orientation(TB1);
if (oEGFF == TopAbs_REVERSED)
omatFS1 = TopAbs::Complement(omatFS1);
keep1 = (omatFS1 == TopAbs_FORWARD);
TopAbs_Orientation omatFS2 = TFE.Orientation(TB1);
keep2 = (omatFS2 == oEGFF);
#endif
TopAbs_State tfeb = TFE.Before();
TopAbs_State tfea = TFE.After();
if (oEGFF == TopAbs_FORWARD)
{
keep3 = (tfea == TB1);
}
else if (oEGFF == TopAbs_REVERSED)
{
keep3 = (tfeb == TB1);
}
else if (oEGFF == TopAbs_EXTERNAL)
{
keep3 = (tfea == TB1 || tfeb == TB1);
}
else if (oEGFF == TopAbs_INTERNAL)
{
keep3 = (tfea == TB1 || tfeb == TB1);
}
}
#ifdef OCCT_DEBUG
if (tFFEG || tFSEG)
{
if (keep1 != keep2 || keep1 != keep3 || keep2 != keep3)
{
std::cout << "\nkeepEON : EGB " << EGBoundFOR << " EG " << iEG << " FOR " << iFF << " FS "
<< iFS;
std::cout << " keep1 " << keep1 << " keep2 " << keep2 << " keep3 " << keep3;
std::cout << " !=!=!=!=!=!=!=!=!=!=!=!=!=!=!=";
std::cout << std::endl;
}
}
#endif
return keep3;
}
Standard_EXPORT TopAbs_State FUN_build_TB(TopOpeBRepBuild_Builder* const& PB, const int rank)
{
bool opeFus = PB->Opefus();
bool opec12 = PB->Opec12();
bool opec21 = PB->Opec21();
bool opeCom = PB->Opecom();
TopAbs_State sta = TopAbs_UNKNOWN;
if (opeFus)
{
sta = TopAbs_OUT;
}
if (opeCom)
{
sta = TopAbs_IN;
}
if (opec12)
{
sta = (rank == 1) ? TopAbs_OUT : TopAbs_IN;
}
if (opec21)
{
sta = (rank == 2) ? TopAbs_OUT : TopAbs_IN;
}
return sta;
}
static bool FUN_Kpart0(const GeomAbs_SurfaceType& ST1, const GeomAbs_SurfaceType& ST2)
{
bool plane1 = (ST1 == GeomAbs_Plane);
bool cyli1 = (ST1 == GeomAbs_Cylinder);
bool cone1 = (ST1 == GeomAbs_Cone);
bool cyli2 = (ST2 == GeomAbs_Cylinder);
bool cone2 = (ST2 == GeomAbs_Cone);
bool sphe2 = (ST2 == GeomAbs_Sphere);
bool quad2 = cyli2 || cone2 || sphe2 || (ST2 == GeomAbs_Torus);
if (plane1 && quad2)
{
return true;
}
if (cyli1 && sphe2)
{
return true;
}
if (cone1 && sphe2)
{
return true;
}
return false;
}
static int FUN_Kpart(const GeomAbs_SurfaceType& ST1, const GeomAbs_SurfaceType& ST2)
{
bool kpart0 = FUN_Kpart0(ST1, ST2);
if (kpart0)
{
return 1;
}
kpart0 = FUN_Kpart0(ST2, ST1);
if (kpart0)
{
return 2;
}
return 0;
}
static int FUN_findeSD(const TopOpeBRepDS_DataStructure& BDS,
const TopoDS_Edge& EspON,
const TopoDS_Edge& EG,
const TopoDS_Face& FOR,
TopAbs_Orientation& oeSD,
const int D)
{
// chercher eSD = SameDomain3d/2d de EG, arete de FOR, qui contient EspON
gp_Pnt ptON;
double parON;
FUN_tool_findPinE(EspON, ptON, parON);
NCollection_List<TopoDS_Shape> lesdSD;
if (D == 3)
{
FDS_HasSameDomain3d(BDS, EG, &lesdSD);
}
if (D == 2)
{
FDS_HasSameDomain2d(BDS, EG, &lesdSD);
}
for (NCollection_List<TopoDS_Shape>::Iterator it(lesdSD); it.More(); it.Next())
{
TopoDS_Edge eSD = TopoDS::Edge(it.Value());
TopAbs_Orientation oesd;
bool eSDofFOR = FUN_tool_orientEinFFORWARD(eSD, FOR, oesd);
if (!eSDofFOR)
{
continue;
}
TopAbs_State staeSD = FUN_tool_staPinE(ptON, eSD);
if (staeSD == TopAbs_IN)
{
int i = BDS.Shape(eSD);
oeSD = oesd;
return i;
}
}
return 0;
}
static bool ComputeFaceCrvtInSec(const TopoDS_Face& aFace,
const gp_Pnt2d& aP2d,
const gp_Dir& aSecDir,
double& aCrvt)
{
BRepAdaptor_Surface aSurf(aFace);
int cn = BRepLProp_SurfaceTool::Continuity(aSurf);
if (cn < 2)
{
return false;
}
BRepLProp_SLProps aProp(aSurf, aP2d.X(), aP2d.Y(), 2, Precision::Confusion());
if (!aProp.IsCurvatureDefined())
{
return false;
}
if (aProp.IsUmbilic())
{
aCrvt = aProp.MaxCurvature();
return true;
}
double maxCrv = aProp.MaxCurvature();
double minCrv = aProp.MinCurvature();
gp_Dir maxDir, minDir;
aProp.CurvatureDirections(maxDir, minDir);
double cosMax = aSecDir * maxDir;
double cosMin = aSecDir * minDir;
aCrvt = maxCrv * cosMax + minCrv * cosMin;
return true;
}
//=================================================================================================
void TopOpeBRepBuild_BuilderON::GFillONPartsWES2(const occ::handle<TopOpeBRepDS_Interference>& I,
const TopoDS_Shape& EspON)
{
const occ::handle<TopOpeBRepDS_HDataStructure>& HDS = myPB->DataStructure();
const TopOpeBRepDS_DataStructure& BDS = HDS->DS();
occ::handle<TopOpeBRepDS_ShapeShapeInterference> SSI(
occ::down_cast<TopOpeBRepDS_ShapeShapeInterference>(I));
TopAbs_State TB1, TB2;
myPG->StatesON(TB1, TB2);
TopAbs_State TB = TB1;
TopOpeBRepDS_Kind GT, ST;
int GI, SI;
FDS_data(SSI, GT, GI, ST, SI);
const TopOpeBRepDS_Transition& TFE = SSI->Transition();
bool EGBoundFOR = SSI->GBound();
const TopoDS_Face& FOR = TopoDS::Face(myFace);
int iFOR = BDS.Shape(FOR);
const TopoDS_Edge& eON = TopoDS::Edge(EspON);
const TopoDS_Edge& EG = TopoDS::Edge(BDS.Shape(GI));
#ifdef OCCT_DEBUG
int iEG =
#endif
BDS.Shape(EG);
const TopoDS_Face& FS = TopoDS::Face(BDS.Shape(SI));
int iFS = BDS.Shape(FS);
double tola = Precision::Angular() * 1.e3; // nyitol
TopAbs_Orientation oFOR = BDS.Shape(iFOR).Orientation();
TopAbs_Orientation oFS = BDS.Shape(iFS).Orientation();
// clang-format off
bool isclosedFF=FUN_tool_IsClosingE(EG,FOR,FOR); //xpu240898 : cto900J5 faulty yapc2(FOR17,FS18,EG15)
// clang-format on
bool isclosedFS = FUN_tool_IsClosingE(EG, FS, FS); // xpu240898
bool isclosed = (isclosedFF || isclosedFS);
bool isrest = BDS.IsSectionEdge(EG);
#ifdef OCCT_DEBUG
// bool issplit=myPB->IsSplit(EG,TopAbs_ON);
#endif
int rankFS = myPB->GShapeRank(FS);
int rankEG = myPB->GShapeRank(EG);
int rankFOR = myPB->GShapeRank(FOR);
TopAbs_Orientation OTFE = TFE.Orientation(TopAbs_IN);
TopAbs_State TFEbef = TFE.Before();
TopAbs_State TFEaft = TFE.After();
#ifdef OCCT_DEBUG
// bool EGboundFOR =
// occ::down_cast<TopOpeBRepDS_ShapeShapeInterference>(I)->GBound();
#endif
bool eghassd = HDS->HasSameDomain(EG);
NCollection_List<TopoDS_Shape> le3;
bool eghassd3d = FDS_HasSameDomain3d(BDS, EG, &le3);
int ie3d = 0;
TopAbs_Orientation oe3d = TopAbs_EXTERNAL;
int ie2d = 0;
TopAbs_Orientation oe2d = TopAbs_EXTERNAL;
NCollection_List<TopoDS_Shape> lfcx;
FDSCNX_FaceEdgeConnexFaces(FS, EG, HDS, lfcx);
int nlfcx = lfcx.Extent();
bool hsdFOR = HDS->HasSameDomain(FOR);
TopOpeBRepDS_Config cFOR = TopOpeBRepDS_UNSHGEOMETRY;
int irefFOR = 0;
TopAbs_Orientation orefFOR = TopAbs_EXTERNAL;
bool FORisref = false;
if (hsdFOR)
{
cFOR = BDS.SameDomainOri(iFOR);
if (hsdFOR)
{
irefFOR = BDS.SameDomainRef(FOR);
}
if (irefFOR != 0)
{
orefFOR = BDS.Shape(irefFOR).Orientation();
}
FORisref = (irefFOR == iFOR);
}
bool opeFus = myPB->Opefus();
bool opec12 = myPB->Opec12();
#ifdef OCCT_DEBUG
// bool opec21 = myPB->Opec21();
#endif
bool opeCut = myPB->Opec12() || myPB->Opec21();
bool opeCom = myPB->Opecom();
// clang-format off
bool ComOfCut = opeCut && (TB1 == TB2) && (TB1 == TopAbs_IN); //xpu200598 only if FFSDSO
// clang-format on
TopAbs_State TBFOR = FUN_build_TB(myPB, rankFOR);
#ifdef OCCT_DEBUG
bool tFOR = myPB->GtraceSPS(iFOR);
bool tE = myPB->GtraceSPS(GI);
bool tEFOR = DEBTEFOR(*myPB, iFOR, GI);
if (tFOR)
debON(iFOR);
#endif
double factor = 1.e2;
double tolEG = BRep_Tool::Tolerance(EG) * factor; // NYITOLXPU
double tolFOR = BRep_Tool::Tolerance(FOR) * factor; // NYITOLXPU
double tolFS = BRep_Tool::Tolerance(FS) * factor; // NYITOLXPU
double f, l;
FUN_tool_bounds(eON, f, l);
double x = 0.456189;
double parON = (1 - x) * f + x * l;
// xpu150698 : spON(EG)=spON1+spON2+.., spON1 ON EsdEG, spON2 shares no
// geometry with any other edge.
// FRA11018 (FOR=f5,EG=e18,EsdEG=e7)
bool espONesd = false;
int Iesd = 0; // xpu150698
if (eghassd)
{
espONesd = FUN_ds_ONesd(BDS, GI, EspON, Iesd); // xpu150698
}
bool eONsoEsd = false;
if (eghassd && (Iesd != 0))
{
const TopoDS_Edge& Esd = TopoDS::Edge(BDS.Shape(Iesd));
bool ok = FUN_tool_curvesSO(eON, Esd, eONsoEsd);
if (!ok)
{
return;
}
}
bool eONFS = true; // xpu240898
if (eghassd && (!espONesd))
{
gp_Pnt pON;
bool ok = FUN_tool_value(parON, eON, pON);
if (!ok)
{
return;
}
gp_Pnt2d uvFS;
double d = 1.;
ok = FUN_tool_projPonboundedF(pON, FS, uvFS, d);
if (!ok)
{
return;
}
double tolF = FUN_tool_maxtol(FS);
eONFS = (d < tolF);
}
// ------------------------------------
bool eghassdON = eghassd && espONesd;
bool eghassd3dON = eghassd3d && espONesd;
// ------------------------------------
bool yap00 = true; // xpu180998 : cto900Q2
yap00 = yap00 && (!isclosed);
yap00 = yap00 && (EGBoundFOR);
yap00 = yap00 && (espONesd);
yap00 = yap00 && (!hsdFOR); // xpu280998 : PRO14892 (FOR16,FS30,GI20)
if (yap00)
{
const NCollection_List<occ::handle<TopOpeBRepDS_Interference>>& lI =
BDS.ShapeInterferences(FOR);
NCollection_List<occ::handle<TopOpeBRepDS_Interference>> lIcopy;
FDS_assign(lI, lIcopy);
NCollection_List<occ::handle<TopOpeBRepDS_Interference>> lIGesd;
int nGesd = FUN_selectGIinterference(lIcopy, Iesd, lIGesd);
if (nGesd != 0)
{
yap00 = false; // ES has interference on G=edge(Iesd)
}
}
bool yap0 = true;
yap0 = yap0 && (!isclosed);
yap0 = yap0 && (EGBoundFOR);
yap0 = yap0 && (!eghassd);
bool yap0bis = true; // xpu160698
yap0bis = yap0bis && (!isclosed);
yap0bis = yap0bis && (EGBoundFOR);
yap0bis = yap0bis && (eghassd); // xpu300798 : cto 902 B7
yap0bis = yap0bis && (!eghassdON);
yap0bis = yap0bis && eONFS; // xpu240898 : cto900J3 (e7on_2 NOT ON FS, FOR18,FS17,EG7)
yap0bis = yap0bis && !ComOfCut; // xpu270798 : boxes240798, f14in,GI=34
if (yap0bis)
{
yap0 = true;
}
bool hassd3dON = false;
// if (isclosed && !EGBoundFOR && eghassd3d) { -xpu110898 -> yapc3
if (!EGBoundFOR && eghassd3d)
{
ie3d = ::FUN_findeSD(BDS, eON, EG, FOR, oe3d, 3);
hassd3dON = (ie3d != 0);
}
bool yapc1 = true;
yapc1 = yapc1 && (isclosed);
yapc1 = yapc1 && (!EGBoundFOR);
yapc1 = yapc1 && (eghassd3d);
yapc1 = yapc1 && hassd3dON; // xpu230798
bool yapc2a = true;
yapc2a = yapc2a && (isclosed);
yapc2a = yapc2a && (!eghassd3d);
// xpu240798 cto902A3 (iFOR=5,GI=3,iFCX=6) : complement yapc1
bool yapc2b = true;
yapc2b = yapc2b && (isclosed);
yapc2b = yapc2b && (!EGBoundFOR);
yapc2b = yapc2b && (eghassd3d);
yapc2b = yapc2b && (!hassd3dON);
bool yapc2c = true;
yapc2c = yapc2c && (isclosed);
yapc2c = yapc2c && (EGBoundFOR);
yapc2c = yapc2c && (eghassd3d);
bool yapc2 = yapc2a;
yapc2 = yapc2 || yapc2b || yapc2c; // xpu240798
bool yapc3 = true;
yapc3 = yapc3 && (!isclosed);
yapc3 = yapc3 && (eghassd3d);
yapc3 = yapc3 && (hassd3dON);
bool e3closedFOR = false;
if (hassd3dON)
{
const TopoDS_Edge& e3d = TopoDS::Edge(BDS.Shape(ie3d));
e3closedFOR = BRep_Tool::IsClosed(e3d, FOR);
}
yapc3 = yapc3 && e3closedFOR; // => !EGBoundFOR
//=========================================
if (yap00)
{
#ifdef OCCT_DEBUG
if (tEFOR)
debfillonfemess(iFOR, iEG, myPB, myPWES, "yap0 GFillON");
if (tE)
{
std::cout << "yap00(FOR" << iFOR << " FS" << iFS << " EG" << GI << ") ";
std::cout << "TB1=";
TopAbs::Print(TB1, std::cout);
std::cout << " TB2=";
TopAbs::Print(TB2, std::cout);
std::cout << std::endl;
}
#endif
TopAbs_Orientation oeff;
FUN_tool_orientEinFFORWARD(EG, FOR, oeff);
bool add = false;
if (oeff == TopAbs_FORWARD)
{
add = (TFEaft == TB);
}
else if (oeff == TopAbs_REVERSED)
{
add = (TFEbef == TB);
}
else if (oeff == TopAbs_INTERNAL)
{
add = true;
}
else if (oeff == TopAbs_EXTERNAL)
{
add = true;
}
if (!add)
{
return;
}
const TopoDS_Shape& Esd = BDS.Shape(Iesd);
bool isONFS = false;
TopExp_Explorer ex(FS, TopAbs_EDGE);
for (; ex.More(); ex.Next())
{
if (ex.Current().IsSame(Esd))
{
isONFS = true;
break;
}
}
if (!isONFS)
{
return;
}
double parEG;
bool ok = FUN_tool_parE(eON, parON, EG, parEG, tolEG);
if (!ok)
{
return;
}
bool samegeom;
ok = FUN_tool_curvesSO(EG, parEG, eON, samegeom);
if (!ok)
{
return;
}
TopAbs_Orientation neworiE = oeff;
if (!samegeom && (M_FORWARD(neworiE) || M_REVERSED(neworiE)))
{
neworiE = TopAbs::Complement(neworiE);
}
TopoDS_Shape newE = EspON;
newE.Orientation(neworiE);
#ifdef OCCT_DEBUG
if (tEFOR)
debaddpwes(iFOR, TB1, iEG, neworiE, myPB, myPWES, "yap00 GFillON", "WES+ EspON ");
if (tE)
FUN_cout(newE);
#endif
myPWES->AddStartElement(newE);
return;
}
//=========================================
if (yap0)
{
#ifdef OCCT_DEBUG
if (tEFOR)
debfillonfemess(iFOR, iEG, myPB, myPWES, "yap0 GFillON");
if (tE)
{
std::cout << "yap0(FOR" << iFOR << " FS" << iFS << " EG" << GI << ") ";
std::cout << "TB1=";
TopAbs::Print(TB1, std::cout);
std::cout << " TB2=";
TopAbs::Print(TB2, std::cout);
std::cout << std::endl;
}
#endif
TopAbs_Orientation oeff;
FUN_tool_orientEinFFORWARD(EG, FOR, oeff);
bool add = false;
if (oeff == TopAbs_FORWARD)
{
add = (TFEaft == TB);
}
else if (oeff == TopAbs_REVERSED)
{
add = (TFEbef == TB);
}
else if (oeff == TopAbs_INTERNAL)
{
add = true;
}
else if (oeff == TopAbs_EXTERNAL)
{
add = true;
}
if (!add)
{
return; // xpu100698
}
// parEG :
double parEG;
bool ok = FUN_tool_parE(eON, parON, EG, parEG, tolEG);
if (!ok)
{
return;
}
// ngFS, ngFOR, xxFOR :
double tolON = std::max(tolFS, tolEG);
tolON *= 1.e2; //*****CAREFUL***** : xpu040998, cto 904 A3
gp_Vec ngFS;
ok = FUN_tool_nggeomF(parEG, EG, FS, ngFS, tolON);
if (!ok)
{
return;
}
tolON = std::max(tolFOR, tolEG);
tolON *= 1.e2; //*****CAREFUL***** : xpu040998, cto 904 A3
gp_Vec ngFOR;
ok = FUN_tool_nggeomF(parEG, EG, FOR, ngFOR, tolON);
if (!ok)
{
return;
}
gp_Dir xxFOR;
ok = FUN_tool_getxx(FOR, EG, parEG, ngFOR, xxFOR);
if (!ok)
{
return;
}
// ntFS, ntFOR, ntdot :
gp_Dir ntFS(ngFS);
if (M_REVERSED(oFS))
{
ntFS.Reverse();
}
gp_Dir ntFOR(ngFOR);
if (M_REVERSED(oFOR))
{
ntFOR.Reverse();
}
double ntdot = ntFOR.Dot(ntFS);
// xpu180698 : Kpart=FOR tangent to FS at EG
bool Kpart = (OTFE == TopAbs_EXTERNAL) || (OTFE == TopAbs_INTERNAL);
if (Kpart)
{
bool Ktg = (std::abs(1 - std::abs(ntdot)) < tola * 1.e2);
Kpart = Ktg;
}
if (Kpart)
{
gp_Pnt2d UVfor, UVfs;
ok = FUN_tool_paronEF(EG, parEG, FOR, UVfor, tolFOR);
if (!ok)
{
return;
}
gp_Pnt Pfor, Pfs;
FUN_tool_value(UVfor, FOR, Pfor);
tolON = std::max(std::max(tolFOR, tolFS), tolEG) * 10.;
double d;
BRepAdaptor_Surface BSfor(FOR);
GeomAbs_SurfaceType STfor = BSfor.GetType();
BRepAdaptor_Surface BSfs(FS);
GeomAbs_SurfaceType STfs = BSfs.GetType();
int kpart = FUN_Kpart(STfor, STfs);
if (kpart == 0)
{
// MSV: general case, such as BSpline or Bezier surface or two cylinders.
// We should detect if FOR and FS have different curvature in section
// by plane perpendicular to EG at point parEG.
double crvFOR, crvFS;
if (!ComputeFaceCrvtInSec(FOR, UVfor, xxFOR, crvFOR))
{
return;
}
if (!FUN_tool_projPonF(Pfor, FS, UVfs, d))
{
return;
}
if (!ComputeFaceCrvtInSec(FS, UVfs, xxFOR, crvFS))
{
return;
}
if (M_REVERSED(oFOR))
{
crvFOR = -crvFOR;
}
if (M_REVERSED(oFS))
{
crvFS = -crvFS;
}
if (ntdot < 0.)
{
crvFS = -crvFS;
}
double eps = Precision::Confusion();
double absCrvFOR = std::abs(crvFOR), absCrvFS = std::abs(crvFS);
if (absCrvFOR <= eps && absCrvFS <= eps)
{
return;
}
if (absCrvFOR > eps && absCrvFS > eps)
{
double tolR = tolON;
double rcrvFOR = 1. / crvFOR, rcrvFS = 1. / crvFS;
if (std::abs(rcrvFOR - rcrvFS) <= tolR)
{
return;
}
}
// if we are here the curvatures are different
}
// SO :
bool SO = (ntdot > 0.);
// Pfor :
Pfor.Translate(xxFOR.XYZ() * tolON * 10.);
ok = FUN_tool_projPonF(Pfor, FOR, UVfor, d);
if (!ok)
{
return;
}
FUN_tool_value(UVfor, FOR, Pfor);
// Pfs :
ok = FUN_tool_projPonF(Pfor, FS, UVfs, d);
if (!ok)
{
return;
}
FUN_tool_value(UVfs, FS, Pfs);
// Dforfs :
gp_Dir Dforfs(gp_Vec(Pfor, Pfs));
bool keep = true;
double dot = Dforfs.Dot(ntFOR); // xpu250698
if (SO)
{
bool so2and3 = (dot > 0); // xpu250698
bool so2 = so2and3; // xpu250698
if (opeFus)
{
keep = !so2;
}
if (opeCom)
{
keep = so2;
}
if (opeCut)
{
if (TBFOR == TopAbs_OUT)
{
keep = !so2;
}
else
{
keep = so2;
}
}
} // SO
else
{
bool do1and2 = (dot > 0); // xpu250698
bool do1 = do1and2; // xpu250698
if (opeFus)
{
keep = do1;
}
if (opeCom)
{
keep = !do1;
}
if (opeCut)
{
if (TBFOR == TopAbs_OUT)
{
keep = do1;
}
else
{
keep = !do1;
}
}
} // !SO
if (!keep)
{
return;
}
} // Kpart
else
{
// dot :
double dot = ntFS.Dot(xxFOR);
bool positive = (dot > 0);
bool keep = true;
if (opeFus)
{
keep = positive;
}
if (opeCom)
{
keep = !positive;
}
if (opeCut)
{
if (positive)
{
keep = (TBFOR == TopAbs_OUT);
}
else
{
keep = (TBFOR != TopAbs_OUT);
}
}
if (!keep)
{
return;
}
}
TopoDS_Face newF = FOR;
TopoDS_Shape newE = EspON;
TopAbs_Orientation neworiE;
FUN_tool_orientEinFFORWARD(EG, newF, neworiE);
if (hsdFOR)
{
// xpu260698 : cto902A5 : fonds de poche (FOR=f14,GI=e24,refFOR=f13)
bool reverse = false;
if (!FORisref)
{
// xpu170698 : PRO13555 (FOR=f19,GI=e10,FS=f15)
bool FORDO = (cFOR == TopOpeBRepDS_DIFFORIENTED);
if (FORDO)
{
reverse = !reverse;
}
if (oFOR != orefFOR)
{
reverse = !reverse;
}
}
if (opeFus)
{ // nyixpu260698
}
if (opeCom)
{ // nyixpu260698
}
if (opeCut)
{
if (TBFOR == TopAbs_IN)
{
// xpu290798 : cto902C1 (FOR19,FS16,GI22) f9ou is DO f19in
// sp(f9)+sp(f19) are in same WES, e22on is OUT f9 =>
// do NOT reverse neworiE
// reverse = true;
}
else
{
}
}
if (reverse)
{
neworiE = TopAbs::Complement(neworiE);
}
} // hsdFOR
newE.Orientation(neworiE);
#ifdef OCCT_DEBUG
if (tEFOR)
debaddpwes(iFOR, TB1, iEG, neworiE, myPB, myPWES, "yap0 GFillON", "WES+ EspON ");
if (tE)
FUN_cout(newE);
#endif
myPWES->AddStartElement(newE);
return;
} // yap0
//=========================================
if (yapc1)
{
#ifdef OCCT_DEBUG
if (tEFOR)
debfillonfemess(iFOR, iEG, myPB, myPWES, "yapc1 GFillON");
if (tE)
{
std::cout << "yapc1(FOR" << iFOR << " FS" << iFS << " EG" << GI << ") ";
std::cout << "TB1=";
TopAbs::Print(TB1, std::cout);
std::cout << " TB2=";
TopAbs::Print(TB2, std::cout);
std::cout << std::endl;
}
#endif
const TopoDS_Edge& e3d = TopoDS::Edge(BDS.Shape(ie3d));
// e3d = SameDomain3d de EG, arete de FOR, qui contient EspON
TopOpeBRepDS_Config cf;
bool cfok = FDS_Config3d(EspON, e3d, cf);
if (!cfok)
{
return;
}
TopAbs_Orientation oe3dk = oe3d;
// bool samegeom = ::TopOpeBRepBuild_FUN_aresamegeom(EG,e3d);
double parEG;
bool ok = FUN_tool_parE(eON, parON, EG, parEG, tolEG);
if (!ok)
{
return; // nyiRAISE
}
bool samegeom;
ok = FUN_tool_curvesSO(EG, parEG, e3d, samegeom);
if (!ok)
{
return; // nyiRAISE
}
if (!samegeom)
{
oe3dk = TopAbs::Complement(oe3dk);
}
bool keep3d = false;
if (oe3dk == TopAbs_FORWARD)
{
keep3d = (TFEaft == TB1);
}
else if (oe3dk == TopAbs_REVERSED)
{
keep3d = (TFEbef == TB1);
}
else if (oe3dk == TopAbs_INTERNAL)
{
keep3d = true;
}
else if (oe3dk == TopAbs_EXTERNAL)
{
keep3d = false;
}
#ifdef OCCT_DEBUG
// if(tEFOR) {std::cout<<std::endl<<"yapc1 keep3d :
// "<<keep3d<<std::endl;debfillonfemess3d(iFOR,iEG);}
#endif
if (keep3d)
{
TopAbs_Orientation neworiE = oe3d;
if (cf == TopOpeBRepDS_DIFFORIENTED)
{
neworiE = TopAbs::Complement(neworiE);
}
TopoDS_Shape newE = EspON;
newE.Orientation(neworiE);
#ifdef OCCT_DEBUG
if (tEFOR)
debaddpwes(iFOR, TB1, iEG, neworiE, myPB, myPWES, "yapc1 GFillON", "WES+ EspON ");
if (tE)
FUN_cout(newE);
#endif
myPWES->AddStartElement(newE);
}
return;
} // yapc1
//=========================================
if (yapc2)
{
#ifdef OCCT_DEBUG
if (tEFOR)
debfillonfemess(iFOR, iEG, myPB, myPWES, "yapc2 GFillON");
if (tE)
{
std::cout << "yapc2(FOR" << iFOR << " FS" << iFS << " EG" << GI << ") ";
std::cout << "TB1=";
TopAbs::Print(TB1, std::cout);
std::cout << " TB2=";
TopAbs::Print(TB2, std::cout);
std::cout << std::endl;
}
#endif
bool keep = false;
if (EGBoundFOR)
{
keep = FUN_keepEON(*myPB, EG, FOR, FS, EGBoundFOR, TFE, TB1, TB2);
}
else
{
keep = true;
}
if (!keep)
{
return;
}
TopAbs_Orientation neworiE = TFE.Orientation(TB1);
bool giveoEinFOR = EGBoundFOR && (!isclosedFF) && (M_EXTERNAL(neworiE) || M_INTERNAL(neworiE));
if (giveoEinFOR)
{
FUN_tool_orientEinFFORWARD(EG, FOR, neworiE);
}
// xpu230798 : cto902A3 (iFOR=5,GI=3,iFCX=6)
// (iFOR=20,GI=3,iFCX=6)
if (yapc2b && (!M_EXTERNAL(neworiE)))
{
TopOpeBRepTool_ShapeClassifier& PSC = FSC_GetPSC(FOR);
TopAbs_State state2d = FSC_StateEonFace(EspON, 0.345, FOR, PSC);
if (state2d != TopAbs_IN)
{
return;
}
}
TopoDS_Shape newE = EspON;
bool addFORREV = false;
TopAbs_Orientation neworiEk = TopAbs_EXTERNAL;
if (!isclosedFF)
{
neworiEk = neworiE;
}
else if (M_FORWARD(neworiE) || M_REVERSED(neworiE))
{
neworiEk = neworiE;
}
else if (M_INTERNAL(neworiE))
{
addFORREV = true;
}
newE.Orientation(neworiEk);
#ifdef OCCT_DEBUG
if (tEFOR)
{
if (!isclosedFF)
debaddpwes(iFOR, TB1, iEG, neworiE, myPB, myPWES, "yapc2 GFillON", "WES+ EspON not closed");
else if (M_FORWARD(neworiE) || M_REVERSED(neworiE))
debaddpwes(iFOR,
TB1,
iEG,
neworiEk,
myPB,
myPWES,
"yapc2 GFillON closed",
"WES+ EspON F|R");
else if (M_INTERNAL(neworiE))
{
debaddpwes(iFOR,
TB1,
iEG,
TopAbs_FORWARD,
myPB,
myPWES,
"yapc2 GFillON closed",
"WES+ EspON INTERNAL");
debaddpwes(iFOR,
TB1,
iEG,
TopAbs_REVERSED,
myPB,
myPWES,
"yapc2 GFillON closed",
"WES+ EspON INTERNAL");
}
}
if (tE)
{
if (addFORREV)
{
newE.Orientation(TopAbs_FORWARD);
FUN_cout(newE);
newE.Orientation(TopAbs_REVERSED);
FUN_cout(newE);
}
else
FUN_cout(newE);
}
#endif
if (addFORREV)
{
newE.Orientation(TopAbs_FORWARD);
myPWES->AddStartElement(newE);
newE.Orientation(TopAbs_REVERSED);
myPWES->AddStartElement(newE);
}
else
{
myPWES->AddStartElement(newE);
}
return;
} // yapc2
//=========================================
if (yapc3)
{
#ifdef OCCT_DEBUG
if (tEFOR)
debfillonfemess(iFOR, iEG, myPB, myPWES, "yapc3 GFillON");
if (tE)
{
std::cout << "yapc3(FOR" << iFOR << " FS" << iFS << " EG" << GI << ") ";
std::cout << "TB1=";
TopAbs::Print(TB1, std::cout);
std::cout << " TB2=";
TopAbs::Print(TB2, std::cout);
std::cout << std::endl;
}
#endif
bool keep = false;
if (EGBoundFOR)
{
keep = FUN_keepEON(*myPB, EG, FOR, FS, EGBoundFOR, TFE, TB1, TB2);
}
else
{
keep = true;
}
if (!keep)
{
return;
}
TopAbs_Orientation neworiE = TFE.Orientation(TB1);
bool giveoEinFOR = EGBoundFOR && !isclosedFF && (M_EXTERNAL(neworiE) || M_INTERNAL(neworiE));
if (giveoEinFOR)
{
FUN_tool_orientEinFFORWARD(EG, FOR, neworiE);
}
TopoDS_Shape newE = EspON;
bool addFORREV = false;
TopAbs_Orientation neworiEk = TopAbs_EXTERNAL;
// xpu110798 : cto902B4 (FOR6,EG15,FS17)
if (M_INTERNAL(OTFE) || M_EXTERNAL(OTFE))
{
bool SO = false; // "approximate same oriented (FOR,FS)"
// parEG :
double parEG;
bool ok = FUN_tool_parE(eON, parON, EG, parEG, tolEG);
if (!ok)
{
return; // nyiRAISE
}
// ntFS :
gp_Pnt2d uvFS;
ok = FUN_tool_paronEF(EG, parEG, FS, uvFS, tolFS); // !EGBoundFOR
if (!ok)
{
return; // nyiRAISE
}
gp_Vec ngFS = FUN_tool_nggeomF(uvFS, FS);
gp_Dir ntFS(ngFS);
if (M_REVERSED(oFS))
{
ntFS.Reverse();
}
// ntFOR :
gp_Pnt2d uvFOR;
ok = FUN_tool_parF(EG, parEG, FOR, uvFOR, tolFOR);
if (!ok)
{
return; // nyiRAISE
}
gp_Vec ngFOR = FUN_tool_nggeomF(uvFOR, FOR);
gp_Dir ntFOR(ngFOR);
if (M_REVERSED(oFOR))
{
ntFOR.Reverse();
}
double dot = ntFOR.Dot(ntFS);
bool nulldot = (std::abs(dot) < tola);
if (nulldot)
{
// xxFS :
gp_Dir xxFS;
ok = FUN_tool_getxx(FS, EG, parEG, ngFS, xxFS);
if (!ok)
{
return; // nyiRAISE
}
double dot2 = ntFOR.Dot(xxFS);
SO = (dot2 < 0.);
}
else
{
SO = (dot > 0.);
}
bool unkeepclo = false;
if (SO && M_EXTERNAL(OTFE) && opeCom)
{
unkeepclo = true;
}
if (SO && M_INTERNAL(OTFE) && opeFus)
{
unkeepclo = true;
}
addFORREV = !unkeepclo;
}
if (!addFORREV)
{
neworiEk = neworiE;
bool samegeom;
bool ok = FUN_tool_curvesSO(eON, EG, samegeom);
if (!ok)
{
return; // nyiRAISE
}
bool reverse = (!samegeom);
if (reverse)
{
neworiEk = TopAbs::Complement(neworiEk);
}
newE.Orientation(neworiEk);
}
#ifdef OCCT_DEBUG
if (tEFOR)
{
if (!addFORREV)
debaddpwes(iFOR, TB1, iEG, neworiEk, myPB, myPWES, "yapc3 GFillON", "WES+ EspON ");
else
{
debaddpwes(iFOR,
TB1,
iEG,
TopAbs_FORWARD,
myPB,
myPWES,
"yapc3 GFillON closed",
"WES+ EspON ");
debaddpwes(iFOR,
TB1,
iEG,
TopAbs_REVERSED,
myPB,
myPWES,
"yapc3 GFillON closed",
"WES+ EspON ");
}
}
#endif
if (addFORREV)
{
newE.Orientation(TopAbs_FORWARD);
myPWES->AddStartElement(newE);
newE.Orientation(TopAbs_REVERSED);
myPWES->AddStartElement(newE);
}
else
{
myPWES->AddStartElement(newE);
}
return;
} // yapc3
if (nlfcx == 0)
{
return;
}
const TopoDS_Face& FCX = TopoDS::Face(lfcx.First());
int iFCX = BDS.Shape(FCX);
// faces samedomain de FCX
NCollection_List<TopoDS_Shape> LFSO, LFDO, LFSO1, LFDO1, LFSO2, LFDO2;
myPB->GFindSamDomSODO(FCX, LFSO, LFDO);
int rankFCX = myPB->GShapeRank(FCX), rankX = (rankFCX) ? ((rankFCX == 1) ? 2 : 1) : 0;
// DEB : rankFCX doit etre=rankFS
// LFSO2,LFDO2=faces samedomain de FCX dans le shape oppose (rankX)
// rankX=shape oppose=shape de FOR.
myPB->GFindSameRank(LFSO, rankFCX, LFSO1);
myPB->GFindSameRank(LFDO, rankFCX, LFDO1);
myPB->GFindSameRank(LFSO, rankX, LFSO2);
myPB->GFindSameRank(LFDO, rankX, LFDO2);
// FFinSO=appartenance de FOR a l'ensemble des faces sameoriented de FCX=LFSO2
bool FFinSDSO = false;
{
for (NCollection_List<TopoDS_Shape>::Iterator i(LFSO2); i.More(); i.Next())
{
const TopoDS_Shape& F = i.Value();
if (F.IsSame(FOR))
{
FFinSDSO = true;
break;
}
}
}
// FFinDO=appartenance de FOR a l'ensemble des faces difforiented de FCX=LFDO2
bool FFinSDDO = false;
{
for (NCollection_List<TopoDS_Shape>::Iterator i(LFDO2); i.More(); i.Next())
{
const TopoDS_Shape& F = i.Value();
if (F.IsSame(FOR))
{
FFinSDDO = true;
break;
}
}
}
// FFinSD=appartenance de FOR a l'ensemble des faces samedomain de FCX
bool FFinSD = (FFinSDSO || FFinSDDO);
TopAbs_Orientation oFCX = BDS.Shape(iFCX).Orientation();
TopOpeBRepDS_Config cFCX = BDS.SameDomainOri(iFCX);
int irefFCX = BDS.SameDomainRef(FCX);
TopAbs_Orientation orefFCX = BDS.Shape(irefFCX).Orientation();
bool FCXisref = (irefFCX == iFCX);
#ifdef OCCT_DEBUG
// double tolFCX = factor*BRep_Tool::Tolerance(FCX); //NYITOLXPU
#endif
TopAbs_Orientation oegFCXF;
bool EGBoundFCX = FUN_tool_orientEinFFORWARD(EG, FCX, oegFCXF);
TopAbs_Orientation oegFCX;
FUN_tool_orientEinF(EG, FCX, oegFCX);
if (!EGBoundFOR && !espONesd)
{ // xpu220998 : ctocylcongA1 (FOR10,FS19,EG8)
gp_Pnt ptON;
bool ok = FUN_tool_value(parON, eON, ptON);
if (!ok)
{
return; // nyiRAISE
}
double d = 1.;
gp_Pnt2d uvFOR;
ok = FUN_tool_projPonboundedF(ptON, FOR, uvFOR, d);
if (!ok)
{
return; // nyiRAISE
}
double tolON = std::max(tolEG, tolFOR); // xpu291098 cto900L7(f7,e7on)
// xpu051198 PRO12953(f6,e4on)
tolON *= 1.e2; //*****CAREFUL***** : xpu040998, cto 904 A3
bool eONFOR = (d < tolON);
if (!eONFOR)
{
return;
}
}
bool yap1 = true;
yap1 = yap1 && FFinSD;
yap1 = yap1 && (!EGBoundFOR);
yap1 = yap1 && EGBoundFCX;
yap1 = yap1 && eghassd3dON;
bool yap2 = true;
yap2 = yap2 && FFinSD;
yap2 = yap2 && (!EGBoundFOR);
yap2 = yap2 && EGBoundFCX; // yap2 = yap2 && !eghassdON;
yap2 = yap2 && !eghassd; // yap2 = yap2 && !eghassd3dON;
bool yap1b = true;
yap1b = yap1b && FFinSD;
yap1b = yap1b && (!EGBoundFOR);
yap1b = yap1b && EGBoundFCX;
yap1b = yap1b && eghassd3d;
yap1b = yap1b && !eghassd3dON;
yap1b = yap1b && eONFS; // xpu240898
if (yap1b)
{
yap2 = true; // xpu220998 : ctocylcongA1 yap1b(FOR12,FS5,EG8)
}
bool yap6 = true; // cto001F3 : f18ou,EG=e23
yap6 = yap6 && FFinSD;
yap6 = yap6 && (!EGBoundFOR);
yap6 = yap6 && EGBoundFCX;
yap6 = yap6 && eghassdON;
yap6 = yap6 && !eghassd3d; // yap6 = yap6 && !eghassd3dON;
bool yap6b = true;
yap6b = yap6b && FFinSD;
yap6b = yap6b && (!EGBoundFOR);
yap6b = yap6b && EGBoundFCX;
yap6b = yap6b && eghassd;
yap6b = yap6b && !eghassdON;
yap6b = yap6b && eONFS; // xpu240898
yap6b = yap6b && !eghassd3d; // yap6b = yap6b && !eghassd3dON;
if (yap6b)
{
#ifdef OCCT_DEBUG
// FUN_RaiseON();
#endif
yap2 = true;
}
// CTS20205 spOUT(f30), e4 = eghassd3dON
// mais f30 !sdm lfcx(e4)
bool eghassd3fcx = eghassdON;
eghassd3fcx = eghassd3fcx && !FUN_ds_sdm(BDS, FOR, FS);
eghassd3fcx = eghassd3fcx && !FFinSD; //! FUN_ds_sdm(BDS,FOR,FCX)
bool yap5 = true;
yap5 = yap5 && !EGBoundFOR;
yap5 = yap5 && eghassd3fcx;
bool yap3 = true;
yap3 = yap3 && !FFinSD;
yap3 = yap3 && !EGBoundFOR;
yap3 = yap3 && eghassd3dON;
bool yap4 = true;
yap4 = yap4 && !FFinSD;
yap4 = yap4 && isrest;
yap4 = yap4 && !yap5;
yap4 = yap4 && !hsdFOR; // xpu290598
bool yap3b = true;
yap3b = yap3b && !FFinSD;
yap3b = yap3b && !EGBoundFOR;
yap3b = yap3b && eghassd3d;
yap3b = yap3b && !eghassd3dON;
yap3b = yap3b && eONFS; // xpu240898
if (yap3b)
{
yap4 = true; // xpu191098 : cto016F3(yap3b(FOR7,EG4))
}
// xpu290598
bool yap7 = true;
yap7 = yap7 && !FFinSD;
yap7 = yap7 && isrest;
yap7 = yap7 && !yap5;
yap7 = yap7 && hsdFOR;
TopAbs_State staFOR = TB1;
TopAbs_State staFS = (rankFS == rankFOR) ? TB1 : TB2;
#ifdef OCCT_DEBUG
// if(tEFOR) std::cout<<std::endl<<"yap1 yap2 yap3 yap4 = ";
// if(tEFOR) std::cout<<yap1<<" "<<yap2<<" "<<yap3<<" "<<yap4<<std::endl<<std::endl;
// if(tEFOR) debfillonfemess(iFOR,iEG);
#endif
//=========================================
if (yap1)
{
#ifdef OCCT_DEBUG
if (tEFOR)
debfillonfemess(iFOR, iEG, myPB, myPWES, "yap1 GFillON");
if (tE)
{
std::cout << "yap1(FOR" << iFOR << " FCX" << iFCX << " EG" << GI << ") ";
std::cout << "TB1=";
TopAbs::Print(TB1, std::cout);
std::cout << " TB2=";
TopAbs::Print(TB2, std::cout);
std::cout << std::endl;
}
#endif
// FF est samedomain avec FCX
// on evalue la transition de FOR par rapport a la matiere 2d de la face FCX
// au lieu de la transition par rapport a la matiere 3d de la face FS
// EG est une arete de FCX, oegFCXF=O.T. de EG dans FCX orientee FORWARD
// EG a des aretes 3d same domain : le3
TopAbs_State staFCX = staFS; // FS et FCX connexes par EG => meme shape origine => meme etat
bool b3d = false;
bool b2d = false;
// staFOR : etat demande sur FOR
bool b3de3 = false;
bool b2de3 = false;
const TopoDS_Edge& e3 = TopoDS::Edge(le3.First());
int ie3 = BDS.Shape(e3);
bool ssif = false;
occ::handle<TopOpeBRepDS_ShapeShapeInterference> ssie3;
NCollection_List<occ::handle<TopOpeBRepDS_Interference>>::Iterator itssi(
BDS.ShapeInterferences(FCX));
for (; itssi.More(); itssi.Next())
{
occ::handle<TopOpeBRepDS_ShapeShapeInterference> ssi(
occ::down_cast<TopOpeBRepDS_ShapeShapeInterference>(itssi.Value()));
if (ssi.IsNull())
{
continue;
}
TopOpeBRepDS_Kind GT1, ST1;
int G1, S1;
FDS_data(ssi, GT1, G1, ST1, S1);
bool cond = (GT1 == TopOpeBRepDS_EDGE && ST1 == TopOpeBRepDS_FACE);
cond = cond && (G1 == ie3);
// NYI cond = cond && e(S1 est une face connexe a iFOR par ie3)
if (cond)
{
ssif = true;
ssie3 = ssi;
break;
}
}
TopOpeBRepDS_Transition TFEe3;
TopAbs_State TFEe3bef = TFEe3.Before();
TopAbs_State TFEe3aft = TFEe3.After();
TopAbs_Orientation oe3FORF = TopAbs_FORWARD;
if (ssif)
{
TFEe3 = ssie3->Transition();
TFEe3bef = TFEe3.Before();
FUN_tool_orientEinFFORWARD(e3, FOR, oe3FORF);
}
if (FFinSDSO)
{
if (oFOR != oFCX)
{
oegFCXF = TopAbs::Complement(oegFCXF);
oe3FORF = TopAbs::Complement(oe3FORF);
}
TopOpeBRepDS_Transition T1(oegFCXF);
TopAbs_State T1aft = T1.After();
TopAbs_State T1bef = T1.Before();
if (oegFCXF == TopAbs_FORWARD)
{
b3d = (TFEaft == staFCX);
}
else if (oegFCXF == TopAbs_REVERSED)
{
b3d = (TFEbef == staFCX);
}
else
{
FUN_coutmess("DEBUG GFillONPartsWES2_1 orientation != F,R\n");
}
if (oegFCXF == TopAbs_FORWARD)
{
b2d = (T1aft == TopAbs_IN);
}
else if (oegFCXF == TopAbs_REVERSED)
{
b2d = (T1bef == TopAbs_IN);
}
else
{
FUN_coutmess("DEBUG GFillONPartsWES2_2 orientation != F,R\n");
}
if (ssif)
{
TopOpeBRepDS_Transition T11(oe3FORF);
TopAbs_State T11aft = T11.After();
TopAbs_State T11bef = T11.Before();
if (oe3FORF == TopAbs_FORWARD)
{
b3de3 = (TFEe3aft == staFOR);
}
else if (oe3FORF == TopAbs_REVERSED)
{
b3de3 = (TFEe3bef == staFOR);
}
else
{
FUN_coutmess("DEBUG GFillONPartsWES2_1 orientation != F,R\n");
}
if (oe3FORF == TopAbs_FORWARD)
{
b2de3 = (T11aft == TopAbs_IN);
}
else if (oe3FORF == TopAbs_REVERSED)
{
b2de3 = (T11bef == TopAbs_IN);
}
else
{
FUN_coutmess("DEBUG GFillONPartsWES2_2 orientation != F,R\n");
}
}
}
if (FFinSDDO)
{
if (oFOR == oFCX)
{
oegFCXF = TopAbs::Complement(oegFCXF);
oe3FORF = TopAbs::Complement(oe3FORF);
}
TopOpeBRepDS_Transition T2(oegFCXF);
TopAbs_State Taft = T2.After();
TopAbs_State Tbef = T2.Before();
if (oegFCXF == TopAbs_FORWARD)
{
b3d = (TFEaft == staFCX);
}
else if (oegFCXF == TopAbs_REVERSED)
{
b3d = (TFEbef == staFCX);
}
else
{
FUN_coutmess("DEBUG GFillONPartsWES2_3 orientation != F,R\n");
}
if (oegFCXF == TopAbs_FORWARD)
{
b2d = (Taft == TopAbs_IN);
}
else if (oegFCXF == TopAbs_REVERSED)
{
b2d = (Tbef == TopAbs_IN);
}
else
{
FUN_coutmess("DEBUG GFillONPartsWES2_4 orientation != F,R\n");
}
if (ssif)
{
TopOpeBRepDS_Transition T22(oe3FORF);
TopAbs_State T22aft = T22.After();
TopAbs_State T22bef = T22.Before();
if (oe3FORF == TopAbs_FORWARD)
{
b3de3 = (TFEe3aft == staFOR);
}
else if (oe3FORF == TopAbs_REVERSED)
{
b3de3 = (TFEe3bef == staFOR);
}
else
{
FUN_coutmess("DEBUG GFillONPartsWES2_3 orientation != F,R\n");
}
if (oe3FORF == TopAbs_FORWARD)
{
b2de3 = (T22aft == TopAbs_IN);
}
else if (oe3FORF == TopAbs_REVERSED)
{
b2de3 = (T22bef == TopAbs_IN);
}
else
{
FUN_coutmess("DEBUG GFillONPartsWES2_4 orientation != F,R\n");
}
}
}
bool b = (b3d && b2d && b3de3 && b2de3);
if (!b)
{
return;
}
// on garde EspON pour la reconstruction de la face FOR
// si elle est IN/ON la face FOR (EGBoundFOR = 0 ==> projection)
TopOpeBRepTool_ShapeClassifier& PSC = FSC_GetPSC(FOR);
TopAbs_State state2d = FSC_StateEonFace(EspON, 0.345, FOR, PSC);
bool isin = (state2d == TopAbs_IN);
if (!isin)
{
return;
}
TopAbs_State TBEG = TB1;
TopAbs_Orientation neworiE = TFE.Orientation(TBEG);
// if (FCXisref && FFinSDDO) {
if (FCXisref && !EGBoundFOR)
{
FUN_tool_orientEinFFORWARD(EG, FCX, neworiE);
bool rev = TopOpeBRepBuild_Builder::Reverse(staFCX, staFOR);
neworiE = TopOpeBRepBuild_Builder::Orient(neworiE, rev);
}
// xpu280798 : never occurs as yap1 -> !EGBoundFOR
// else if (FORisref && EGBoundFOR) {
// FUN_tool_orientEinFFORWARD(EG,FOR,neworiE);
// bool rev = myPB->Reverse(staFOR,staFCX);
// neworiE = myPB->Orient(neworiE,rev);
// }
else if (FORisref && !EGBoundFOR)
{
const TopoDS_Edge& Esd = TopoDS::Edge(BDS.Shape(Iesd));
FUN_tool_orientEinFFORWARD(Esd, TopoDS::Face(FOR), neworiE);
bool reverse = (M_FORWARD(neworiE) || M_REVERSED(neworiE)) && (!eONsoEsd);
if (reverse)
{
neworiE = TopAbs::Complement(neworiE);
}
bool rev = TopOpeBRepBuild_Builder::Reverse(staFOR, staFCX);
neworiE = TopOpeBRepBuild_Builder::Orient(neworiE, rev);
}
else if (!EGBoundFOR)
{ // xpu210898
int rankrefFOR = BDS.AncestorRank(irefFOR);
if (rankrefFOR == rankFCX)
{
FUN_tool_orientEinFFORWARD(EG, FCX, neworiE);
}
else if (rankrefFOR == rankFOR)
{
const TopoDS_Edge& Esd = TopoDS::Edge(BDS.Shape(Iesd));
FUN_tool_orientEinFFORWARD(Esd, TopoDS::Face(FOR), neworiE);
bool reverse = (M_FORWARD(neworiE) || M_REVERSED(neworiE)) && (!eONsoEsd);
if (reverse)
{
neworiE = TopAbs::Complement(neworiE);
}
}
bool rev = TopOpeBRepBuild_Builder::Reverse(staFOR, staFCX);
neworiE = TopOpeBRepBuild_Builder::Orient(neworiE, rev);
}
TopoDS_Shape newE = EspON;
newE.Orientation(neworiE);
#ifdef OCCT_DEBUG
if (tEFOR)
debaddpwes(iFOR, TB1, iEG, neworiE, myPB, myPWES, "yap1 GFillON", "WES+ EspON ");
if (tE)
FUN_cout(newE);
#endif
myPWES->AddStartElement(newE);
return;
} // yap1
//=========================================
if (yap2)
{
#ifdef OCCT_DEBUG
if (tEFOR)
debfillonfemess(iFOR, iEG, myPB, myPWES, "yap2 GFillON");
if (tE)
{
std::cout << "yap2(FOR" << iFOR << " FCX" << iFCX << " EG" << GI << ") ";
std::cout << "TB1=";
TopAbs::Print(TB1, std::cout);
std::cout << " TB2=";
TopAbs::Print(TB2, std::cout);
std::cout << std::endl;
}
#endif
// FF est samedomain avec FCX
// on evalue la transition de FOR par rapport a la matiere 2d de la face FCX
// au lieu de la transition par rapport a la matiere 3d de la face FS
// EG est une arete de FCX, oegFCXF=O.T. de EG dans FCX orientee FORWARD
TopAbs_State staFCX = staFS; // FS et FCX connexes par EG => meme shape origine => meme etat
bool b3d = false;
bool b2d = false;
bool b = (b3d && b2d);
if (FFinSDSO)
{
if (oFOR != oFCX)
{
// orientation topologique de EG dans la face mere
oegFCXF = TopAbs::Complement(oegFCXF);
}
TopOpeBRepDS_Transition T1(oegFCXF);
TopAbs_State Taft = T1.After();
TopAbs_State Tbef = T1.Before();
if (oegFCXF == TopAbs_FORWARD)
{
b3d = (TFEaft == staFCX);
}
else if (oegFCXF == TopAbs_REVERSED)
{
b3d = (TFEbef == staFCX);
}
else
{
FUN_coutmess("DEBUG GFillONPartsWES2_1 orientation != F,R\n");
}
if (oegFCXF == TopAbs_FORWARD)
{
b2d = (Taft == TopAbs_IN);
}
else if (oegFCXF == TopAbs_REVERSED)
{
b2d = (Tbef == TopAbs_IN);
}
else
{
FUN_coutmess("DEBUG GFillONPartsWES2_2 orientation != F,R\n");
}
}
if (FFinSDDO)
{
if (oFOR == oFCX)
{
// orientation topologique de EG dans la face mere
oegFCXF = TopAbs::Complement(oegFCXF);
}
TopOpeBRepDS_Transition T2(oegFCXF);
TopAbs_State Taft = T2.After();
TopAbs_State Tbef = T2.Before();
if (oegFCXF == TopAbs_FORWARD)
{
b3d = (TFEaft == staFCX);
}
else if (oegFCXF == TopAbs_REVERSED)
{
b3d = (TFEbef == staFCX);
}
else
{
FUN_coutmess("DEBUG GFillONPartsWES2_3 orientation != F,R\n");
}
if (oegFCXF == TopAbs_FORWARD)
{
b2d = (Taft == TopAbs_IN);
}
else if (oegFCXF == TopAbs_REVERSED)
{
b2d = (Tbef == TopAbs_IN);
}
else
{
FUN_coutmess("DEBUG GFillONPartsWES2_4 orientation != F,R\n");
}
}
// #ifdef OCCT_DEBUG
// if(tEFOR) {std::cout<<std::endl<<"yap2 : b3d,b2d
// "<<b3d<<","<<b2d<<std::endl;debfillonfemess(iFOR,iEG);}
// #endif
// bcl1;bcl2; c12;tsp(f9),tspON(e7)
if (ComOfCut)
{
b3d = true;
b2d = true;
} // xpu200598
gp_Vec ngFS, ngFOR;
double parEG = 0.;
// bcl1;bcl2; tsp(f9),tspON(e7)
bool sdm = FUN_ds_sdm(BDS, BDS.Shape(iFOR), BDS.Shape(iFS));
bool isfafa = sdm; // such interferences are computed IN fafa case
if (!isfafa)
{
// parEG :
bool ok = FUN_tool_parE(eON, parON, EG, parEG, tolEG);
if (!ok)
{
return;
}
// xxFS :
gp_Pnt2d uvFS;
ok = FUN_tool_parF(EG, parEG, FS, uvFS, tolFS);
if (!ok)
{
return; // nyiRAISE
}
ngFS = FUN_tool_nggeomF(uvFS, FS);
gp_Dir xxFS;
ok = FUN_tool_getxx(FS, EG, parEG, ngFS, xxFS);
if (!ok)
{
return; // nyiRAISE
}
// ntFOR :
gp_Pnt2d uvFOR;
ok = FUN_tool_parF(EG, parEG, FOR, uvFOR, tolFOR);
if (!ok)
{
return; // nyiRAISE
}
ngFOR = FUN_tool_nggeomF(uvFOR, FOR);
gp_Dir ntFOR(ngFOR);
if (M_REVERSED(oFOR))
{
ntFOR.Reverse();
}
double dot = xxFS.Dot(ntFOR);
// xpu040698 : FS tg to FCX at EG - CTS20578 (FOR=F8,EG=E6,FS=F4) -
bool nulldot = (std::abs(dot) < tola);
if (nulldot)
{ // approximate xxFS :
gp_Pnt2d newuvFS;
gp_Vec2d dxx;
ok = FUN_tool_getdxx(FS, EG, parEG, dxx);
if (!ok)
{
return;
}
newuvFS = uvFS.Translated(dxx * 0.25);
gp_Dir newngFS = FUN_tool_nggeomF(newuvFS, FS);
ok = FUN_tool_getxx(FS, EG, parEG, newngFS, xxFS);
if (!ok)
{
return;
}
dot = xxFS.Dot(ntFOR);
}
// xpu040698
TopAbs_State TBFS = FUN_build_TB(myPB, rankFS);
bool positive = (dot > 0);
bool keep = true;
if (FFinSDSO)
{
if (opeFus)
{
keep = positive; // xpu090698 : PRO14033 (iFOR=15,GI=10,iFS=9)
}
if (opeCom)
{
keep = true;
}
if (opeCut)
{
if (positive)
{
keep = (TBFS == TopAbs_OUT); // xpu230698 cto100G1
}
else
{
keep = (TBFS == TopAbs_IN);
}
}
}
if (FFinSDDO)
{
if (opeFus)
{
keep = positive;
// xpu050698 : (fuse = OU/IN + IN/OU) -CTS20578-
if (keep)
{
int rkOU = (TB1 == TopAbs_OUT) ? 1 : 2;
int rkfspOU = (rankFOR == rkOU) ? 1 : 2;
bool spOUFOR = (rankFOR == rkfspOU);
keep = spOUFOR;
}
}
if (opeCom)
{
keep = !positive;
}
if (opeCut)
{
bool FORmoinsFS = (TBFS == TopAbs_IN);
if (positive)
{
if (FORmoinsFS)
{
keep = true;
}
else
{
keep = ComOfCut;
}
// if (TBFS == TopAbs_OUT) keep = true;
// else keep = (rankFS == 1);
}
else
{
// keep = !FORmoinsFS; // xpu230698 : cto100A1
// keep = false;
if (!FORmoinsFS)
{
keep = true; // xpu230698 : cto100A1
}
else
{
keep = ComOfCut; // xpu120898 PRO12859 (FOR26,FS12,FCX18,EG14)
}
}
}
}
// #ifdef OCCT_DEBUG
// if(tEFOR) {std::cout<<std::endl<<"yap2 : keep
// "<<keep<<std::endl;debfillonfemess(iFOR,iEG);}
// #endif
if (!keep)
{
return;
}
} // !isfafa
else
{
if (!b)
{
return;
}
}
// on garde EspON pour la reconstruction de la face FOR
// si elle est IN/ON la face FOR (EGBoundFOR = 0 ==> projection)
TopOpeBRepTool_ShapeClassifier& PSC = FSC_GetPSC(FOR);
TopAbs_State state2d = FSC_StateEonFace(EspON, 0.345, FOR, PSC);
bool isin = (state2d == TopAbs_IN);
if (!isin)
{
return;
}
TopAbs_State TBEG = TB1;
TopAbs_Orientation neworiE = TFE.Orientation(TBEG);
FUN_tool_orientEinFFORWARD(EG, FCX, neworiE);
bool forw = M_FORWARD(neworiE), reve = M_REVERSED(neworiE);
bool ok = forw || reve;
if (FFinSDSO && ok)
{
if (opeCut)
{
neworiE = TopAbs::Complement(neworiE);
}
} // FFinSDSO && ok
// bcl1;bcl2; tsp(f9)
if (FFinSDDO && ok)
{
if (opeCut)
{
if (!ComOfCut)
{
// TopAbs_State TBEG = (rankEG == 1)? TB1 : TB2;
// if (TBEG == TopAbs_IN) neworiE = TopAbs::Complement(neworiE);
neworiE = TopAbs::Complement(neworiE); // xpu270898 : cto905E2 (FOR33,FCX16,EG19)
}
else if (ComOfCut)
{
// rien a faire
}
}
if (opeFus)
{
// en principe , l'operation locale est tjrs = OUT,IN
neworiE = TopAbs::Complement(neworiE);
}
if (opeCom)
{
// SDDO et oT anti// => oG //
// xxFCX :
gp_Dir xxFCX;
ok = FUN_tool_getxx(FCX, EG, parEG, xxFCX);
if (!ok)
{
return; // nyiRAISE
}
// ntFS :
gp_Dir ntFS(ngFS);
if (M_REVERSED(oFS))
{
ntFS.Reverse();
}
double dot = xxFCX.Dot(ntFS);
bool toreverse = (dot > 0);
if (toreverse)
{
neworiE = TopAbs::Complement(neworiE);
}
}
} // FFinSDDO && ok
bool reverse = false; // xpu270598 : reverse=false=>FCX has same geom ori
if (!FCXisref)
{ // xpu270598
if (cFCX == TopOpeBRepDS_DIFFORIENTED)
{
reverse = true;
}
if (oFCX != orefFCX)
{
reverse = !reverse;
}
} // xpu270598
if (reverse)
{
neworiE = TopAbs::Complement(neworiE); // xpu270598
}
TopoDS_Shape newE = EspON;
newE.Orientation(neworiE);
#ifdef OCCT_DEBUG
if (tEFOR)
debaddpwes(iFOR, TB1, iEG, neworiE, myPB, myPWES, "yap2 GFillON", "WES+ EspON ");
if (tE)
FUN_cout(newE);
#endif
myPWES->AddStartElement(newE);
return;
} // yap2
//=========================================
if (yap6)
{
#ifdef OCCT_DEBUG
if (tEFOR)
debfillonfemess(iFOR, iEG, myPB, myPWES, "yap6 GFillON");
if (tE)
{
std::cout << "yap6(FOR" << iFOR << " FCX" << iFCX << " EG" << GI << ") ";
std::cout << "TB1=";
TopAbs::Print(TB1, std::cout);
std::cout << " TB2=";
TopAbs::Print(TB2, std::cout);
std::cout << std::endl;
}
#endif
TopAbs_Orientation neworiE;
// FF est samedomain avec FCX
// on evalue la transition de FOR par rapport a la matiere 2d de la face FCX
// au lieu de la transition par rapport a la matiere 3d de la face FS
// EG est une arete de FCX, oegFCXF=O.T. de EG dans FCX orientee FORWARD
TopAbs_State staFCX = staFS; // FS et FCX connexes par EG => meme shape origine => meme etat
bool b3d = false;
bool b2d = false;
bool b = false;
bool SO = FFinSDSO; //(FFinSDSO && (oFOR == oFCX)) || (FFinSDDO && (oFOR != oFCX));
bool DO = FFinSDDO; //(FFinSDSO && (oFOR != oFCX)) || (FFinSDDO && (oFOR == oFCX));
#ifdef OCCT_DEBUG
// int rkToFill = BDS.AncestorRank(myFace);
#endif
// bool samerk = (rankEG == rkToFill);
// TopAbs_Orientation oegFOR;
bool shareG;
bool ok = FUN_ds_shareG(myPB->DataStructure(), iFOR, iFCX, GI, TopoDS::Edge(EspON), shareG);
if (!ok)
{
return; // nyiFUNRAISE
}
if (SO)
{
// FOR and FCX share geometric domain.
bool forcekeep = opeFus && shareG && (rankEG == 1); // newnew
if (opeFus)
{
// b = shareG;
// xpu231198 :PRO15946 (FOR11,EG24,FCX20)
// xpu090299 (JAP60247, FOR6,FCX33,EG34)
const TopoDS_Edge& Esd = TopoDS::Edge(BDS.Shape(Iesd));
NCollection_List<TopoDS_Shape> lfor;
FDSCNX_FaceEdgeConnexFaces(FOR, Esd, HDS, lfor);
int nfor = lfor.Extent();
if (nfor < 1)
{
b = shareG; // Esd is FOR's closing edge
}
else if (nfor > 1)
{
return; // NYIRaise (invalid shape)
}
else
{
const TopoDS_Face& FF = TopoDS::Face(lfor.First());
double tola1 = Precision::Angular() * 1.e2; // nyitolxpu
double parEG;
bool ok1 = FUN_tool_parE(eON, parON, EG, parEG, tolEG);
if (!ok1)
{
return;
}
double matfs;
ok1 = TopOpeBRepTool_TOOL::Matter(FS, FCX, EG, parEG, tola1, matfs);
if (!ok1)
{
return;
}
double tolEsd = BRep_Tool::Tolerance(Esd) * factor; // NYITOLXPU
double parEsd;
bool ok2 = FUN_tool_parE(eON, parON, Esd, parEsd, tolEsd);
if (!ok2)
{
return;
}
double matfor;
ok2 = TopOpeBRepTool_TOOL::Matter(FOR, FF, Esd, parEsd, tola1, matfor);
if (!ok2)
{
return;
}
double sum = matfs + matfor;
bool sumisPI = (std::abs(sum - M_PI) < tola1);
bool fsinfPI = (matfs < M_PI);
bool forinfPI = (matfor < M_PI);
if (sumisPI)
{
b = false;
}
else if (sum < M_PI)
{
b = true;
}
else
{ // sum > M_PI
if (fsinfPI && forinfPI)
{
b = false;
}
else
{ // (!fsinfPI) || (!forinfPI)
bool sammat = (std::abs(matfs - matfor) < tola1);
if (sammat)
{
b = false;
}
else
{
b = (matfs < matfor);
}
}
}
if (b)
{
forcekeep = true;
}
}
// NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNYIXPU
/*if (shareG) b = true;
else {
// xpu231198 :PRO15946 (FOR11,EG24,FCX20)
double parEG; bool ok = FUN_tool_parE(eON,parON,EG,parEG,tolEG);
if (!ok) return;
gp_Dir xxFCX; ok = FUN_tool_getxx(FCX,EG,parEG,xxFCX);
if (!ok) return;// nyiRAISE
gp_Vec ntFS; ok = FUN_tool_nggeomF(parEG,EG,FS,ntFS,tolFS);
if (!ok) return;// nyiRAISE
if (M_REVERSED(oFS)) ntFS.Reverse();
double dot = ntFS.Dot(xxFCX);
if (std::abs(dot) < tola) b = false; // xpu231198nyi tangent config
else {b = (dot <0.); if (b) forcekeep=true;}
}//!shareG*/
}
else if (opeCut)
{
b = (!shareG);
}
else if (opeCom)
{
b = shareG && (rankEG == 1);
}
if (b)
{ // nyi : a revoir
if (oFOR != oFCX)
{
// orientation topologique de EG dans la face mere
oegFCXF = TopAbs::Complement(oegFCXF);
}
TopOpeBRepDS_Transition T1(oegFCXF);
TopAbs_State Taft = T1.After();
TopAbs_State Tbef = T1.Before();
if (oegFCXF == TopAbs_FORWARD)
{
b3d = (TFEaft == staFCX);
}
else if (oegFCXF == TopAbs_REVERSED)
{
b3d = (TFEbef == staFCX);
}
if (oegFCXF == TopAbs_FORWARD)
{
b2d = (Taft == TopAbs_IN);
}
else if (oegFCXF == TopAbs_REVERSED)
{
b2d = (Tbef == TopAbs_IN);
}
b = (b3d && b2d);
}
if (forcekeep)
{
b = true; // newnew
}
}
if (DO)
{ // we do NOT keep the splitON
if (opeFus)
{
b = (!shareG); // cto001D2 spOU(f18)
}
if (opeCut)
{
int rankREF = opec12 ? 1 : 2;
bool binin = false, binou = false;
if (TB1 == TB2)
{
binin = (rankEG == rankREF); // partie IN/IN
}
else
{
// xpu291098 cto001D3 (f17ou)
binou = (rankFOR == 1) && (TBFOR == TopAbs_OUT) && (!shareG);
if (binou)
{
// xpu181198 CTS21302(FOR22,EG9,FCX5)
// ntOOFOR :
const TopoDS_Edge& Esd = TopoDS::Edge(BDS.Shape(Iesd)); // rkEsd=rkFOR
NCollection_List<TopoDS_Shape> lfcFk;
FDSCNX_FaceEdgeConnexFaces(FOR, Esd, HDS, lfcFk);
if (lfcFk.Extent() != 1)
{
return; // shape bizarre
}
double parEsd;
ok = FUN_tool_parE(eON, parON, Esd, parEsd, tolEG);
if (!ok)
{
return;
}
const TopoDS_Face& OOFOR = TopoDS::Face(lfcFk.First());
gp_Pnt2d uv;
double dummy = 0;
ok = FUN_tool_paronEF(Esd, parEsd, OOFOR, uv, dummy); // rkEsd=rkOOFOR
gp_Vec ntOOFOR = FUN_tool_nggeomF(uv, OOFOR);
if (OOFOR.Orientation() == TopAbs_REVERSED)
{
ntOOFOR.Reverse();
}
// xxFCX :
#ifdef OCCT_DEBUG
// double t1 =factor*BRep_Tool::Tolerance(Esd);
#endif
double parEG;
ok = FUN_tool_parE(Esd, parEsd, EG, parEG);
if (!ok)
{
return;
}
gp_Dir xxFCX;
ok = FUN_tool_getxx(FCX, EG, parEG, xxFCX);
if (!ok)
{
return;
}
// dot :
double dot = ntOOFOR.Dot(xxFCX);
if (std::abs(dot) < tola)
{
binou = true; // nyixpu181198
}
else if (dot < 0.)
{
binou = false;
}
}
}
b = binin || binou;
}
}
if (!b)
{
return;
}
TopAbs_State TBEG = TB1;
neworiE = TFE.Orientation(TBEG);
if (FCXisref && !EGBoundFOR)
{
FUN_tool_orientEinFFORWARD(EG, FCX, neworiE);
bool rev = TopOpeBRepBuild_Builder::Reverse(staFCX, staFOR);
neworiE = TopOpeBRepBuild_Builder::Orient(neworiE, rev);
}
else if (FORisref && !EGBoundFOR)
{
// xpu280798 : cto902C1 (FOR=f9,FCX=f19,FS,f33,EG,e18)
// as eghassdON : Esd = edge(Iesd) = bound FOR; eON is IN1d(Esd)
const TopoDS_Edge& Esd = TopoDS::Edge(BDS.Shape(Iesd));
FUN_tool_orientEinFFORWARD(Esd, TopoDS::Face(FOR), neworiE);
bool reverse = (M_FORWARD(neworiE) || M_REVERSED(neworiE)) && (!eONsoEsd);
if (reverse)
{
neworiE = TopAbs::Complement(neworiE);
}
bool rev = TopOpeBRepBuild_Builder::Reverse(staFOR, staFCX);
neworiE = TopOpeBRepBuild_Builder::Orient(neworiE, rev);
}
else if (!EGBoundFOR)
{
// xpu210898 : CTS20875 : yap6(FOR13,GI15,FCX6), !FCXisref && !FORisref
int rankrefFOR = BDS.AncestorRank(irefFOR);
if (rankrefFOR == rankFCX)
{
FUN_tool_orientEinFFORWARD(EG, FCX, neworiE);
}
else if (rankrefFOR == rankFOR)
{
const TopoDS_Edge& Esd = TopoDS::Edge(BDS.Shape(Iesd));
FUN_tool_orientEinFFORWARD(Esd, TopoDS::Face(FOR), neworiE);
bool reverse = (M_FORWARD(neworiE) || M_REVERSED(neworiE)) && (!eONsoEsd);
if (reverse)
{
neworiE = TopAbs::Complement(neworiE);
}
}
bool rev = TopOpeBRepBuild_Builder::Reverse(staFOR, staFCX);
neworiE = TopOpeBRepBuild_Builder::Orient(neworiE, rev);
}
TopoDS_Shape newE = EspON;
newE.Orientation(neworiE);
#ifdef OCCT_DEBUG
if (tEFOR)
debaddpwes(iFOR, TB1, iEG, neworiE, myPB, myPWES, "yap6 GFillON", "WES+ EspON ");
if (tE)
FUN_cout(newE);
#endif
myPWES->AddStartElement(newE);
// xpu290798 : cto 902 C1, f9ou,f19in, spON(e7) = spON(e18)
// splits IN and OUT generated on reference surface should be diff oriented
// they share same edge eON which is FORWARD in one, REVERSED in the other
bool addtwice = SO && !shareG && opeCut;
addtwice = addtwice && (M_FORWARD(neworiE) || M_REVERSED(neworiE));
if (addtwice)
{
// we have splitIN
TopoDS_Shape FtospIN = (TBFOR == TopAbs_IN) ? FOR : FCX;
addtwice = false;
TopExp_Explorer ex;
for (ex.Init(FtospIN, TopAbs_EDGE); ex.More(); ex.Next())
{
// for (TopExp_Explorer ex(FtospIN,TopAbs_EDGE); ex.More(); ex.Next()){
const TopoDS_Shape& ee = ex.Current();
if (!BDS.HasShape(ee))
{
continue;
}
bool issp = myPB->IsSplit(ee, TopAbs_IN);
if (issp)
{
addtwice = !myPB->Splits(ee, TopAbs_IN).IsEmpty();
}
if (addtwice)
{
break;
}
}
}
if (addtwice)
{
neworiE = TopAbs::Complement(neworiE);
newE.Orientation(neworiE);
#ifdef OCCT_DEBUG
if (tEFOR)
debaddpwes(iFOR, TB1, iEG, neworiE, myPB, myPWES, "yap6 GFillON", "WES+ EspON ");
if (tE)
FUN_cout(newE);
#endif
myPWES->AddStartElement(newE);
}
return;
} // yap6
//=========================================
if (yap3)
{
#ifdef OCCT_DEBUG
if (tEFOR)
debfillonfemess(iFOR, iEG, myPB, myPWES, "yap3 GFillON");
if (tE)
{
std::cout << "yap3(FOR" << iFOR << " FCX" << iFCX << " EG" << GI << ") ";
std::cout << "TB1=";
TopAbs::Print(TB1, std::cout);
std::cout << " TB2=";
TopAbs::Print(TB2, std::cout);
std::cout << std::endl;
}
#endif
ie3d = ::FUN_findeSD(BDS, eON, EG, FOR, oe3d, 3);
if (ie3d == 0)
{
return;
}
const TopoDS_Edge& e3d = TopoDS::Edge(BDS.Shape(ie3d));
TopOpeBRepDS_Config cf;
bool cfok = FDS_Config3d(EspON, e3d, cf);
if (!cfok)
{
return;
}
TopAbs_Orientation oe3dk = oe3d;
// bool samegeom = ::TopOpeBRepBuild_FUN_aresamegeom(EG,e3d);
double parEG;
bool ok = FUN_tool_parE(eON, parON, EG, parEG, tolEG);
if (!ok)
{
return; // nyiRAISE
}
bool samegeom;
ok = FUN_tool_curvesSO(EG, parEG, e3d, samegeom);
if (!ok)
{
return; // nyiRAISE
}
if (!samegeom)
{
oe3dk = TopAbs::Complement(oe3dk);
}
bool keep3d = false;
// l'etat a construire sur FOR est TB1,
if (oe3dk == TopAbs_FORWARD)
{
keep3d = (TFEaft == TB1);
}
else if (oe3dk == TopAbs_REVERSED)
{
keep3d = (TFEbef == TB1);
}
else if (oe3dk == TopAbs_INTERNAL)
{
keep3d = true;
}
else if (oe3dk == TopAbs_EXTERNAL)
{
keep3d = false;
}
#ifdef OCCT_DEBUG
if (tEFOR)
{
std::cout << std::endl << "yap3 keep3d : " << keep3d << std::endl;
debfillonfemess3d(iFOR, iEG);
}
#endif
if (keep3d)
{
TopAbs_Orientation neworiE = oe3d;
if (cf == TopOpeBRepDS_DIFFORIENTED)
{
neworiE = TopAbs::Complement(neworiE);
}
TopoDS_Shape newE = EspON;
newE.Orientation(neworiE);
#ifdef OCCT_DEBUG
if (tEFOR)
debaddpwes(iFOR, TB1, iEG, neworiE, myPB, myPWES, "yap3 GFillON", "WES+ EspON ");
if (tE)
FUN_cout(newE);
#endif
myPWES->AddStartElement(newE);
}
return;
} // yap3
//=========================================
if (yap5)
{
#ifdef OCCT_DEBUG
if (tEFOR)
debfillonfemess(iFOR, iEG, myPB, myPWES, "yap5 GFillON");
if (tE)
{
std::cout << "yap5(FOR" << iFOR << " FCX" << iFCX << " EG" << GI << ") ";
std::cout << "TB1=";
TopAbs::Print(TB1, std::cout);
std::cout << " TB2=";
TopAbs::Print(TB2, std::cout);
std::cout << std::endl;
}
#endif
ie2d = ::FUN_findeSD(BDS, eON, EG, FOR, oe2d, 2);
if (ie2d == 0)
{
return;
}
const TopoDS_Edge& e2d = TopoDS::Edge(BDS.Shape(ie2d));
TopOpeBRepDS_Config cf;
bool cfok = FDS_Config3d(EspON, e2d, cf);
if (!cfok)
{
return;
}
TopAbs_Orientation oe2dk = oe2d;
double parEG;
bool ok = FUN_tool_parE(eON, parON, EG, parEG, tolEG);
if (!ok)
{
return; // nyiRAISE
}
bool samegeom;
ok = FUN_tool_curvesSO(EG, parEG, e2d, samegeom);
if (!ok)
{
return; // nyiRAISE
}
if (!samegeom)
{
oe2dk = TopAbs::Complement(oe2dk);
}
bool keep2d = false;
// l'etat a construire sur FOR est TB1,
if (oe2dk == TopAbs_FORWARD)
{
keep2d = (TFEaft == TB1);
}
else if (oe2dk == TopAbs_REVERSED)
{
keep2d = (TFEbef == TB1);
}
else if (oe2dk == TopAbs_INTERNAL)
{
keep2d = true;
}
else if (oe2dk == TopAbs_EXTERNAL)
{
keep2d = false;
}
if (keep2d)
{
TopAbs_Orientation neworiE = oe2d;
if (cf == TopOpeBRepDS_DIFFORIENTED)
{
neworiE = TopAbs::Complement(neworiE);
}
TopoDS_Shape newE = EspON;
newE.Orientation(neworiE);
#ifdef OCCT_DEBUG
if (tEFOR)
debaddpwes(iFOR, TB1, iEG, neworiE, myPB, myPWES, "yap5 GFillON", "WES+ EspON ");
if (tE)
FUN_cout(newE);
#endif
myPWES->AddStartElement(newE);
}
return;
} // yap5
//=========================================
if (yap4)
{
#ifdef OCCT_DEBUG
if (tEFOR)
debfillonfemess(iFOR, iEG, myPB, myPWES, "yap4 GFillON");
if (tE)
{
std::cout << "yap4(FOR" << iFOR << " FCX" << iFCX << " EG" << GI << ") ";
std::cout << "TB1=";
TopAbs::Print(TB1, std::cout);
std::cout << " TB2=";
TopAbs::Print(TB2, std::cout);
std::cout << std::endl;
}
#endif
TopAbs_Orientation oTFE = TFE.Orientation(TB1);
TopAbs_Orientation neworiE = oTFE;
TopoDS_Shape newE = EspON;
newE.Orientation(neworiE);
#ifdef OCCT_DEBUG
if (tEFOR)
debaddpwes(iFOR, TB1, iEG, neworiE, myPB, myPWES, "yap4 GFillON", "WES+ EspON ");
if (tE)
FUN_cout(newE);
#endif
myPWES->AddStartElement(newE);
return;
} // yap4
//=========================================
if (yap7)
{
// xpu290598 : CTS20212
#ifdef OCCT_DEBUG
if (tEFOR)
debfillonfemess(iFOR, iEG, myPB, myPWES, "yap7 GFillON");
if (tE)
{
std::cout << "yap7(FOR" << iFOR << " FCX" << iFCX << " EG" << GI << ") ";
std::cout << "TB1=";
TopAbs::Print(TB1, std::cout);
std::cout << " TB2=";
TopAbs::Print(TB2, std::cout);
std::cout << std::endl;
}
#endif
bool isbound = false;
for (NCollection_List<TopoDS_Shape>::Iterator it(BDS.ShapeSameDomain(iFOR)); it.More();
it.Next())
{
TopExp_Explorer ex(it.Value(), TopAbs_EDGE);
for (; ex.More(); ex.Next())
{
const TopoDS_Shape& E = ex.Current();
if (E.IsSame(EG))
{
isbound = true;
break;
}
}
}
TopAbs_Orientation oTFE = TFE.Orientation(TB1);
TopAbs_Orientation neworiE = oTFE;
if (ComOfCut)
{ // CTS20212 : tspIN(f7),tspON(e4)
if (!EGBoundFOR)
{
if (!isbound)
{
return;
}
}
}
// CTS20212 : tspIN(f7),tspON(e5)
bool samegeomref = false;
if (FORisref)
{
samegeomref = true;
}
else
{
samegeomref = (cFOR == TopOpeBRepDS_SAMEORIENTED);
if (oFOR != orefFOR)
{
samegeomref = !samegeomref;
}
}
if (!samegeomref)
{
neworiE = TopAbs::Complement(neworiE);
}
TopoDS_Shape newE = EspON;
newE.Orientation(neworiE);
#ifdef OCCT_DEBUG
if (tEFOR)
debaddpwes(iFOR, TB1, iEG, neworiE, myPB, myPWES, "yap7 GFillON", "WES+ EspON ");
if (tE)
FUN_cout(newE);
#endif
myPWES->AddStartElement(newE);
return;
} // yap7
} // GFillONPartsWES2