mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2025-02-20 23:59:42 +05:00
NPAL18111: Bad shape build by partition.
This commit is contained in:
parent
23147de178
commit
435a10574b
@ -44,6 +44,10 @@
|
||||
#include <TopTools_IndexedMapOfShape.hxx>
|
||||
#include <TopTools_DataMapOfShapeShape.hxx>
|
||||
|
||||
#include <Bnd_Box.hxx>
|
||||
#include <BRepBndLib.hxx>
|
||||
#include <BRepMesh_IncrementalMesh.hxx>
|
||||
|
||||
#include <BRep_Builder.hxx>
|
||||
#include <BRep_Tool.hxx>
|
||||
|
||||
@ -527,6 +531,58 @@ void GEOMAlgo_FinderShapeOn::CopySource(const TopoDS_Shape& aE,
|
||||
//
|
||||
aEx.Free(bFree);
|
||||
}
|
||||
//
|
||||
//=======================================================================
|
||||
//function : BuildTriangulation
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
bool GEOMAlgo_FinderShapeOn::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 :
|
||||
@ -544,4 +600,3 @@ void GEOMAlgo_FinderShapeOn::CopySource(const TopoDS_Shape& aE,
|
||||
// myWarningStatus
|
||||
//
|
||||
// 10 -subshapes of type myShapeType can not be fond in myShape
|
||||
|
||||
|
@ -111,9 +111,7 @@ Standard_EXPORT const TopTools_ListOfShape& Shapes() const;
|
||||
|
||||
Standard_EXPORT static void CopySource(const TopoDS_Shape& aS,TopTools_DataMapOfShapeShape& aImages,TopTools_DataMapOfShapeShape& aOriginals,TopoDS_Shape& aSC) ;
|
||||
|
||||
|
||||
|
||||
|
||||
Standard_EXPORT static bool BuildTriangulation (const TopoDS_Shape& theShape);
|
||||
|
||||
protected:
|
||||
|
||||
|
@ -71,6 +71,7 @@
|
||||
|
||||
#include <GEOMAlgo_SurfaceTools.hxx>
|
||||
#include <GEOMAlgo_StateCollector.hxx>
|
||||
#include <GEOMAlgo_FinderShapeOn.hxx>
|
||||
|
||||
#include <GEOMAlgo_PassKey.hxx>
|
||||
#include <GEOMAlgo_DataMapOfPassKeyInteger.hxx>
|
||||
@ -543,8 +544,11 @@ void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Face& aF,
|
||||
//
|
||||
aTRF=BRep_Tool::Triangulation(aF, aLoc);
|
||||
if (aTRF.IsNull()) {
|
||||
myErrorStatus=20; // no triangulation found
|
||||
return;
|
||||
if (!GEOMAlgo_FinderShapeOn::BuildTriangulation(aF)) {
|
||||
myErrorStatus=20; // no triangulation found
|
||||
return;
|
||||
}
|
||||
aTRF=BRep_Tool::Triangulation(aF, aLoc);
|
||||
}
|
||||
//
|
||||
const gp_Trsf& aTrsf=aLoc.Transformation();
|
||||
@ -691,8 +695,11 @@ void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Edge& aE,
|
||||
if (aTRE.IsNull() || aPTE.IsNull()) {
|
||||
Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(aE, aLoc);
|
||||
if (aPE.IsNull()) {
|
||||
myErrorStatus=20; // no triangulation found
|
||||
return;
|
||||
if (!GEOMAlgo_FinderShapeOn::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();
|
||||
|
@ -71,6 +71,7 @@
|
||||
|
||||
#include <GEOMAlgo_SurfaceTools.hxx>
|
||||
#include <GEOMAlgo_StateCollector.hxx>
|
||||
#include <GEOMAlgo_FinderShapeOn.hxx>
|
||||
|
||||
#include <GEOMAlgo_PassKey.hxx>
|
||||
#include <GEOMAlgo_DataMapOfPassKeyInteger.hxx>
|
||||
@ -603,8 +604,11 @@
|
||||
//
|
||||
aTRF=BRep_Tool::Triangulation(aF, aLoc);
|
||||
if (aTRF.IsNull()) {
|
||||
myErrorStatus=20; // no triangulation found
|
||||
return;
|
||||
if (!GEOMAlgo_FinderShapeOn::BuildTriangulation(aF)) {
|
||||
myErrorStatus=20; // no triangulation found
|
||||
return;
|
||||
}
|
||||
aTRF=BRep_Tool::Triangulation(aF, aLoc);
|
||||
}
|
||||
//
|
||||
const gp_Trsf& aTrsf=aLoc.Transformation();
|
||||
@ -751,8 +755,11 @@
|
||||
if (aTRE.IsNull() || aPTE.IsNull()) {
|
||||
Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(aE, aLoc);
|
||||
if (aPE.IsNull()) {
|
||||
myErrorStatus=20; // no triangulation found
|
||||
return;
|
||||
if (!GEOMAlgo_FinderShapeOn::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();
|
||||
|
Loading…
Reference in New Issue
Block a user