-// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
#include <GEOMAlgo_StateCollector.hxx>
#include <GEOMAlgo_SurfaceTools.hxx>
+#include <GEOMUtils.hxx>
+
#include <Bnd_Box.hxx>
#include <BRep_Tool.hxx>
#include <BRepBndLib.hxx>
//
Standard_Boolean bIsConformState, bIsToBreak;
Standard_Integer i, aNb, iCnt, iErr;
- TopAbs_State aSt;
+ TopAbs_State aSt = TopAbs_UNKNOWN; // todo: aSt must be explicitly initilized to avoid warning (see below)
TopTools_IndexedMapOfShape aM;
TopExp_Explorer aExp;
GEOMAlgo_ListIteratorOfListOfPnt aIt;
}
//
if (BRep_Tool::Degenerated(aE)) {
- myMSS.Add(aE, aSt);
+ myMSS.Add(aE, aSt); // todo: aSt must be explicitly initilized to avoid warning (see above)
continue;
}
//
void GEOMAlgo_FinderShapeOn2::InnerPoints(const TopoDS_Face& aF,
GEOMAlgo_ListOfPnt& aLP)
{
- Standard_Integer j, j1, j2, k, n[4], aNbLinks, aNx, aNb, iCnt;//, aNbMax, *pIds;
+ Standard_Integer j, j1, j2, k, n[4], aNx, aNb, iCnt;//, aNbLinks, aNbMax, *pIds;
TopLoc_Location aLoc;
Handle(Poly_Triangulation) aTRF;
TColStd_MapOfInteger aMBN;
//
aLP.Clear();
//
- aTRF=BRep_Tool::Triangulation(aF, aLoc);
- if (aTRF.IsNull()) {
- if (!BuildTriangulation(aF)) {
- myWarningStatus=20; // no triangulation found
- return;
- }
- aTRF=BRep_Tool::Triangulation(aF, aLoc);
+ if (!GEOMUtils::MeshShape(aF, /*deflection*/0.001, /*forced*/false,
+ /*angle deflection*/0.349066, /*isRelative*/true,
+ /*doPostCheck*/true)) {
+ myWarningStatus=20; // no triangulation found
+ return;
}
+ aTRF=BRep_Tool::Triangulation(aF, aLoc);
//
const gp_Trsf& aTrsf=aLoc.Transformation();
- const Poly_Array1OfTriangle& aTrs=aTRF->Triangles();
- const TColgp_Array1OfPnt& aNodes=aTRF->Nodes();
//
// map link/nbtriangles
- j1=aTrs.Lower();
- j2=aTrs.Upper();
+ j1 = 1;
+ j2 = aTRF->NbTriangles();
for (j=j1; j<=j2; ++j) {
- const Poly_Triangle& aTr=aTrs(j);
+ const Poly_Triangle& aTr = aTRF->Triangle(j);
aTr.Get(n[0], n[1], n[2]);
n[3]=n[0];
for (k=0; k<3; ++k) {
}
//
// boundary nodes aMBN
- aNbLinks=aMPKI.Extent();
aIt.Initialize(aMPKI);
for (; aIt.More(); aIt.Next()) {
iCnt=aIt.Value();
}
//
// inner nodes=all_nodes - boundary_nodes
- j1=aNodes.Lower();
- j2=aNodes.Upper();
+ j1=1;
+ j2=aTRF->NbNodes();
for (j=j1; j<=j2; ++j) {
if (!aMBN.Contains(j)) {
- aP=aNodes(j).Transformed(aTrsf);
+ aP=aTRF->Node(j).Transformed(aTrsf);
aLP.Append(aP);
}
}
gp_Pnt aP;
//
aLP.Clear();
+ if (!GEOMUtils::MeshShape(aE, /*deflection*/0.001, /*forced*/false,
+ /*angle deflection*/0.349066, /*isRelative*/true,
+ /*doPostCheck*/true)) {
+ myErrorStatus=20; // no triangulation found
+ return;
+ }
BRep_Tool::PolygonOnTriangulation(aE, aPTE, aTRE, aLoc);
if (aTRE.IsNull() || aPTE.IsNull()) {
Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(aE, aLoc);
- if (aPE.IsNull()) {
- if (!BuildTriangulation(aE)) {
- myErrorStatus=20; // no triangulation found
- return;
- }
- aPE = BRep_Tool::Polygon3D(aE, aLoc);
- }
const gp_Trsf& aTrsf=aLoc.Transformation();
const TColgp_Array1OfPnt& aNodes=aPE->Nodes();
//
}
else {
const gp_Trsf& aTrsf=aLoc.Transformation();
- const TColgp_Array1OfPnt& aNodes=aTRE->Nodes();
//
aNbNodes=aPTE->NbNodes();
const TColStd_Array1OfInteger& aInds=aPTE->Nodes();
for (j=2; j<aNbNodes; ++j) {
aIndex=aInds(j);
- aP=aNodes(aIndex).Transformed(aTrsf);
+ aP=aTRE->Node(aIndex).Transformed(aTrsf);
aLP.Append(aP);
}
}
}
}
-//=======================================================================
-//function : BuildTriangulation
-//purpose :
-//=======================================================================
-Standard_Boolean
- GEOMAlgo_FinderShapeOn2::BuildTriangulation (const TopoDS_Shape& theShape)
-{
- // calculate deflection
- Standard_Real aDeviationCoefficient = 0.001;
-
- Bnd_Box B;
- BRepBndLib::Add(theShape, B);
- Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
- B.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
-
- Standard_Real dx = aXmax - aXmin, dy = aYmax - aYmin, dz = aZmax - aZmin;
- Standard_Real aDeflection = Max(Max(dx, dy), dz) * aDeviationCoefficient * 4;
- Standard_Real aHLRAngle = 0.349066;
-
- // build triangulation
- BRepMesh_IncrementalMesh Inc (theShape, aDeflection, Standard_False, aHLRAngle);
-
- // check triangulation
- bool isTriangulation = true;
-
- TopExp_Explorer exp (theShape, TopAbs_FACE);
- if (exp.More())
- {
- TopLoc_Location aTopLoc;
- Handle(Poly_Triangulation) aTRF;
- aTRF = BRep_Tool::Triangulation(TopoDS::Face(exp.Current()), aTopLoc);
- if (aTRF.IsNull()) {
- isTriangulation = false;
- }
- }
- else // no faces, try edges
- {
- TopExp_Explorer expe (theShape, TopAbs_EDGE);
- if (!expe.More()) {
- isTriangulation = false;
- }
- else {
- TopLoc_Location aLoc;
- Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(TopoDS::Edge(expe.Current()), aLoc);
- if (aPE.IsNull()) {
- isTriangulation = false;
- }
- }
- }
-
- return isTriangulation;
-}
-
//
// myErrorStatus :
//