mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2025-02-22 02:35:37 +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_IndexedMapOfShape.hxx>
|
||||||
#include <TopTools_DataMapOfShapeShape.hxx>
|
#include <TopTools_DataMapOfShapeShape.hxx>
|
||||||
|
|
||||||
|
#include <Bnd_Box.hxx>
|
||||||
|
#include <BRepBndLib.hxx>
|
||||||
|
#include <BRepMesh_IncrementalMesh.hxx>
|
||||||
|
|
||||||
#include <BRep_Builder.hxx>
|
#include <BRep_Builder.hxx>
|
||||||
#include <BRep_Tool.hxx>
|
#include <BRep_Tool.hxx>
|
||||||
|
|
||||||
@ -527,6 +531,58 @@ void GEOMAlgo_FinderShapeOn::CopySource(const TopoDS_Shape& aE,
|
|||||||
//
|
//
|
||||||
aEx.Free(bFree);
|
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 :
|
// myErrorStatus :
|
||||||
@ -544,4 +600,3 @@ void GEOMAlgo_FinderShapeOn::CopySource(const TopoDS_Shape& aE,
|
|||||||
// myWarningStatus
|
// myWarningStatus
|
||||||
//
|
//
|
||||||
// 10 -subshapes of type myShapeType can not be fond in myShape
|
// 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 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:
|
protected:
|
||||||
|
|
||||||
|
@ -71,6 +71,7 @@
|
|||||||
|
|
||||||
#include <GEOMAlgo_SurfaceTools.hxx>
|
#include <GEOMAlgo_SurfaceTools.hxx>
|
||||||
#include <GEOMAlgo_StateCollector.hxx>
|
#include <GEOMAlgo_StateCollector.hxx>
|
||||||
|
#include <GEOMAlgo_FinderShapeOn.hxx>
|
||||||
|
|
||||||
#include <GEOMAlgo_PassKey.hxx>
|
#include <GEOMAlgo_PassKey.hxx>
|
||||||
#include <GEOMAlgo_DataMapOfPassKeyInteger.hxx>
|
#include <GEOMAlgo_DataMapOfPassKeyInteger.hxx>
|
||||||
@ -543,8 +544,11 @@ void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Face& aF,
|
|||||||
//
|
//
|
||||||
aTRF=BRep_Tool::Triangulation(aF, aLoc);
|
aTRF=BRep_Tool::Triangulation(aF, aLoc);
|
||||||
if (aTRF.IsNull()) {
|
if (aTRF.IsNull()) {
|
||||||
myErrorStatus=20; // no triangulation found
|
if (!GEOMAlgo_FinderShapeOn::BuildTriangulation(aF)) {
|
||||||
return;
|
myErrorStatus=20; // no triangulation found
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
aTRF=BRep_Tool::Triangulation(aF, aLoc);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
const gp_Trsf& aTrsf=aLoc.Transformation();
|
const gp_Trsf& aTrsf=aLoc.Transformation();
|
||||||
@ -691,8 +695,11 @@ void GEOMAlgo_FinderShapeOn1::InnerPoints(const TopoDS_Edge& aE,
|
|||||||
if (aTRE.IsNull() || aPTE.IsNull()) {
|
if (aTRE.IsNull() || aPTE.IsNull()) {
|
||||||
Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(aE, aLoc);
|
Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(aE, aLoc);
|
||||||
if (aPE.IsNull()) {
|
if (aPE.IsNull()) {
|
||||||
myErrorStatus=20; // no triangulation found
|
if (!GEOMAlgo_FinderShapeOn::BuildTriangulation(aE)) {
|
||||||
return;
|
myErrorStatus=20; // no triangulation found
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
aPE = BRep_Tool::Polygon3D(aE, aLoc);
|
||||||
}
|
}
|
||||||
const gp_Trsf& aTrsf=aLoc.Transformation();
|
const gp_Trsf& aTrsf=aLoc.Transformation();
|
||||||
const TColgp_Array1OfPnt& aNodes=aPE->Nodes();
|
const TColgp_Array1OfPnt& aNodes=aPE->Nodes();
|
||||||
|
@ -71,6 +71,7 @@
|
|||||||
|
|
||||||
#include <GEOMAlgo_SurfaceTools.hxx>
|
#include <GEOMAlgo_SurfaceTools.hxx>
|
||||||
#include <GEOMAlgo_StateCollector.hxx>
|
#include <GEOMAlgo_StateCollector.hxx>
|
||||||
|
#include <GEOMAlgo_FinderShapeOn.hxx>
|
||||||
|
|
||||||
#include <GEOMAlgo_PassKey.hxx>
|
#include <GEOMAlgo_PassKey.hxx>
|
||||||
#include <GEOMAlgo_DataMapOfPassKeyInteger.hxx>
|
#include <GEOMAlgo_DataMapOfPassKeyInteger.hxx>
|
||||||
@ -603,8 +604,11 @@
|
|||||||
//
|
//
|
||||||
aTRF=BRep_Tool::Triangulation(aF, aLoc);
|
aTRF=BRep_Tool::Triangulation(aF, aLoc);
|
||||||
if (aTRF.IsNull()) {
|
if (aTRF.IsNull()) {
|
||||||
myErrorStatus=20; // no triangulation found
|
if (!GEOMAlgo_FinderShapeOn::BuildTriangulation(aF)) {
|
||||||
return;
|
myErrorStatus=20; // no triangulation found
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
aTRF=BRep_Tool::Triangulation(aF, aLoc);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
const gp_Trsf& aTrsf=aLoc.Transformation();
|
const gp_Trsf& aTrsf=aLoc.Transformation();
|
||||||
@ -751,8 +755,11 @@
|
|||||||
if (aTRE.IsNull() || aPTE.IsNull()) {
|
if (aTRE.IsNull() || aPTE.IsNull()) {
|
||||||
Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(aE, aLoc);
|
Handle(Poly_Polygon3D) aPE = BRep_Tool::Polygon3D(aE, aLoc);
|
||||||
if (aPE.IsNull()) {
|
if (aPE.IsNull()) {
|
||||||
myErrorStatus=20; // no triangulation found
|
if (!GEOMAlgo_FinderShapeOn::BuildTriangulation(aE)) {
|
||||||
return;
|
myErrorStatus=20; // no triangulation found
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
aPE = BRep_Tool::Polygon3D(aE, aLoc);
|
||||||
}
|
}
|
||||||
const gp_Trsf& aTrsf=aLoc.Transformation();
|
const gp_Trsf& aTrsf=aLoc.Transformation();
|
||||||
const TColgp_Array1OfPnt& aNodes=aPE->Nodes();
|
const TColgp_Array1OfPnt& aNodes=aPE->Nodes();
|
||||||
|
Loading…
Reference in New Issue
Block a user