1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-16 10:08:36 +03:00

0030785: Mesh - protect BRepMesh_IncrementalMesh::Perform from raising exception

IMeshTools_ModelAlgo and IMeshTools_ModelBuilder have been changed to provide exception protected interfaces for performing the operations.
Protect single Edge/Face discretization methods from raising exceptions to skip broken Edges/Faces and allow mesh construction on the whole model.
This commit is contained in:
emv 2019-06-17 16:26:45 +03:00 committed by bugmaster
parent fe525c6f7c
commit c2a25d522b
17 changed files with 235 additions and 140 deletions

View File

@ -65,7 +65,7 @@ void BRepMesh_BaseMeshAlgo::Perform(
commitSurfaceTriangulation(); commitSurfaceTriangulation();
} }
} }
catch (Standard_Failure& /*theExeption*/) catch (Standard_Failure const& /*theExeption*/)
{ {
} }

View File

@ -83,7 +83,7 @@ Handle(IMeshTools_CurveTessellator) BRepMesh_EdgeDiscret::CreateEdgeTessellation
// Function: Perform // Function: Perform
// Purpose : // Purpose :
//======================================================================= //=======================================================================
Standard_Boolean BRepMesh_EdgeDiscret::Perform ( Standard_Boolean BRepMesh_EdgeDiscret::performInternal (
const Handle (IMeshData_Model)& theModel, const Handle (IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters) const IMeshTools_Parameters& theParameters)
{ {
@ -108,69 +108,78 @@ Standard_Boolean BRepMesh_EdgeDiscret::Perform (
void BRepMesh_EdgeDiscret::process (const Standard_Integer theEdgeIndex) const void BRepMesh_EdgeDiscret::process (const Standard_Integer theEdgeIndex) const
{ {
const IMeshData::IEdgeHandle& aDEdge = myModel->GetEdge (theEdgeIndex); const IMeshData::IEdgeHandle& aDEdge = myModel->GetEdge (theEdgeIndex);
BRepMesh_Deflection::ComputeDeflection (aDEdge, myModel->GetMaxSize (), myParameters); try
Handle (IMeshTools_CurveTessellator) aEdgeTessellator;
if (!aDEdge->IsFree ())
{ {
// Iterate over pcurves and check deflection on corresponding face. OCC_CATCH_SIGNALS
Standard_Real aMinDeflection = RealLast ();
Standard_Integer aMinPCurveIndex = -1; BRepMesh_Deflection::ComputeDeflection (aDEdge, myModel->GetMaxSize (), myParameters);
for (Standard_Integer aPCurveIt = 0; aPCurveIt < aDEdge->PCurvesNb (); ++aPCurveIt)
Handle (IMeshTools_CurveTessellator) aEdgeTessellator;
if (!aDEdge->IsFree ())
{ {
const IMeshData::IPCurveHandle& aPCurve = aDEdge->GetPCurve (aPCurveIt); // Iterate over pcurves and check deflection on corresponding face.
const Standard_Real aTmpDeflection = checkExistingPolygonAndUpdateStatus(aDEdge, aPCurve); Standard_Real aMinDeflection = RealLast ();
if (aTmpDeflection < aMinDeflection) Standard_Integer aMinPCurveIndex = -1;
for (Standard_Integer aPCurveIt = 0; aPCurveIt < aDEdge->PCurvesNb (); ++aPCurveIt)
{ {
// Identify pcurve with the smallest deflection in order to const IMeshData::IPCurveHandle& aPCurve = aDEdge->GetPCurve (aPCurveIt);
// retrieve polygon that represents the most smooth discretization. const Standard_Real aTmpDeflection = checkExistingPolygonAndUpdateStatus(aDEdge, aPCurve);
aMinDeflection = aTmpDeflection; if (aTmpDeflection < aMinDeflection)
aMinPCurveIndex = aPCurveIt; {
// Identify pcurve with the smallest deflection in order to
// retrieve polygon that represents the most smooth discretization.
aMinDeflection = aTmpDeflection;
aMinPCurveIndex = aPCurveIt;
}
BRepMesh_ShapeTool::CheckAndUpdateFlags (aDEdge, aPCurve);
} }
BRepMesh_ShapeTool::CheckAndUpdateFlags (aDEdge, aPCurve); if (aMinPCurveIndex != -1)
}
if (aMinPCurveIndex != -1)
{
aDEdge->SetDeflection (aMinDeflection);
const IMeshData::IFaceHandle aDFace = aDEdge->GetPCurve(aMinPCurveIndex)->GetFace();
aEdgeTessellator = CreateEdgeTessellationExtractor(aDEdge, aDFace);
}
else
{
const IMeshData::IPCurveHandle& aPCurve = aDEdge->GetPCurve(0);
const IMeshData::IFaceHandle aDFace = aPCurve->GetFace();
aEdgeTessellator = BRepMesh_EdgeDiscret::CreateEdgeTessellator(
aDEdge, aPCurve->GetOrientation(), aDFace, myParameters);
}
}
else
{
TopLoc_Location aLoc;
const Handle (Poly_Polygon3D)& aPoly3D = BRep_Tool::Polygon3D (aDEdge->GetEdge (), aLoc);
if (!aPoly3D.IsNull ())
{
if (aPoly3D->HasParameters () &&
aPoly3D->Deflection () < 1.1 * aDEdge->GetDeflection ())
{ {
// Edge already has suitable 3d polygon. aDEdge->SetDeflection (aMinDeflection);
aDEdge->SetStatus(IMeshData_Reused); const IMeshData::IFaceHandle aDFace = aDEdge->GetPCurve(aMinPCurveIndex)->GetFace();
return; aEdgeTessellator = CreateEdgeTessellationExtractor(aDEdge, aDFace);
} }
else else
{ {
aDEdge->SetStatus(IMeshData_Outdated); const IMeshData::IPCurveHandle& aPCurve = aDEdge->GetPCurve(0);
const IMeshData::IFaceHandle aDFace = aPCurve->GetFace();
aEdgeTessellator = BRepMesh_EdgeDiscret::CreateEdgeTessellator(
aDEdge, aPCurve->GetOrientation(), aDFace, myParameters);
} }
} }
else
{
TopLoc_Location aLoc;
const Handle (Poly_Polygon3D)& aPoly3D = BRep_Tool::Polygon3D (aDEdge->GetEdge (), aLoc);
if (!aPoly3D.IsNull ())
{
if (aPoly3D->HasParameters () &&
aPoly3D->Deflection () < 1.1 * aDEdge->GetDeflection ())
{
// Edge already has suitable 3d polygon.
aDEdge->SetStatus(IMeshData_Reused);
return;
}
else
{
aDEdge->SetStatus(IMeshData_Outdated);
}
}
aEdgeTessellator = CreateEdgeTessellator(aDEdge, myParameters); aEdgeTessellator = CreateEdgeTessellator(aDEdge, myParameters);
}
Tessellate3d (aDEdge, aEdgeTessellator, Standard_True);
if (!aDEdge->IsFree())
{
Tessellate2d(aDEdge, Standard_True);
}
} }
catch (Standard_Failure const&)
Tessellate3d (aDEdge, aEdgeTessellator, Standard_True);
if (!aDEdge->IsFree())
{ {
Tessellate2d(aDEdge, Standard_True); aDEdge->SetStatus (IMeshData_Failure);
} }
} }

View File

@ -52,11 +52,6 @@ public:
const IMeshData::IEdgeHandle& theDEdge, const IMeshData::IEdgeHandle& theDEdge,
const IMeshData::IFaceHandle& theDFace); const IMeshData::IFaceHandle& theDFace);
//! Performs processing of edges of the given model.
Standard_EXPORT virtual Standard_Boolean Perform (
const Handle (IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters) Standard_OVERRIDE;
//! Functor API to discretize the given edge. //! Functor API to discretize the given edge.
inline void operator() (const Standard_Integer theEdgeIndex) const { inline void operator() (const Standard_Integer theEdgeIndex) const {
process (theEdgeIndex); process (theEdgeIndex);
@ -75,6 +70,13 @@ public:
DEFINE_STANDARD_RTTI_INLINE(BRepMesh_EdgeDiscret, IMeshTools_ModelAlgo) DEFINE_STANDARD_RTTI_INLINE(BRepMesh_EdgeDiscret, IMeshTools_ModelAlgo)
protected:
//! Performs processing of edges of the given model.
Standard_EXPORT virtual Standard_Boolean performInternal (
const Handle (IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters) Standard_OVERRIDE;
private: private:
//! Checks existing discretization of the edge and updates data model. //! Checks existing discretization of the edge and updates data model.

View File

@ -43,7 +43,7 @@ BRepMesh_FaceDiscret::~BRepMesh_FaceDiscret()
// Function: Perform // Function: Perform
// Purpose : // Purpose :
//======================================================================= //=======================================================================
Standard_Boolean BRepMesh_FaceDiscret::Perform( Standard_Boolean BRepMesh_FaceDiscret::performInternal(
const Handle(IMeshData_Model)& theModel, const Handle(IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters) const IMeshTools_Parameters& theParameters)
{ {
@ -73,14 +73,23 @@ void BRepMesh_FaceDiscret::process(const Standard_Integer theFaceIndex) const
return; return;
} }
Handle(IMeshTools_MeshAlgo) aMeshingAlgo = try
myAlgoFactory->GetAlgo(aDFace->GetSurface()->GetType(), myParameters);
if (aMeshingAlgo.IsNull())
{ {
aDFace->SetStatus(IMeshData_Failure); OCC_CATCH_SIGNALS
return;
}
aMeshingAlgo->Perform(aDFace, myParameters); Handle(IMeshTools_MeshAlgo) aMeshingAlgo =
myAlgoFactory->GetAlgo(aDFace->GetSurface()->GetType(), myParameters);
if (aMeshingAlgo.IsNull())
{
aDFace->SetStatus(IMeshData_Failure);
return;
}
aMeshingAlgo->Perform(aDFace, myParameters);
}
catch (Standard_Failure const&)
{
aDFace->SetStatus (IMeshData_Failure);
}
} }

View File

@ -23,7 +23,7 @@
//! Class implements functionality starting triangulation of model's faces. //! Class implements functionality starting triangulation of model's faces.
//! Each face is processed separately and can be executed in parallel mode. //! Each face is processed separately and can be executed in parallel mode.
//! Uses mesh algo factory passed as initializer to create instace of triangulation //! Uses mesh algo factory passed as initializer to create instance of triangulation
//! algorithm according to type of surface of target face. //! algorithm according to type of surface of target face.
class BRepMesh_FaceDiscret : public IMeshTools_ModelAlgo class BRepMesh_FaceDiscret : public IMeshTools_ModelAlgo
{ {
@ -36,11 +36,6 @@ public:
//! Destructor. //! Destructor.
Standard_EXPORT virtual ~BRepMesh_FaceDiscret(); Standard_EXPORT virtual ~BRepMesh_FaceDiscret();
//! Performs processing of edges of the given model.
Standard_EXPORT virtual Standard_Boolean Perform(
const Handle(IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters) Standard_OVERRIDE;
//! Functor API to discretize the given edge. //! Functor API to discretize the given edge.
inline void operator() (const Standard_Integer theFaceIndex) const { inline void operator() (const Standard_Integer theFaceIndex) const {
process(theFaceIndex); process(theFaceIndex);
@ -48,6 +43,13 @@ public:
DEFINE_STANDARD_RTTI_INLINE(BRepMesh_FaceDiscret, IMeshTools_ModelAlgo) DEFINE_STANDARD_RTTI_INLINE(BRepMesh_FaceDiscret, IMeshTools_ModelAlgo)
protected:
//! Performs processing of faces of the given model.
Standard_EXPORT virtual Standard_Boolean performInternal (
const Handle(IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters) Standard_OVERRIDE;
private: private:
//! Checks existing discretization of the face and updates data model. //! Checks existing discretization of the face and updates data model.

View File

@ -18,7 +18,6 @@
#include <BRepMesh_ShapeVisitor.hxx> #include <BRepMesh_ShapeVisitor.hxx>
#include <BRepMesh_ShapeTool.hxx> #include <BRepMesh_ShapeTool.hxx>
#include <IMeshTools_ShapeExplorer.hxx> #include <IMeshTools_ShapeExplorer.hxx>
#include <Standard_ErrorHandler.hxx>
#include <Bnd_Box.hxx> #include <Bnd_Box.hxx>
#include <BRepBndLib.hxx> #include <BRepBndLib.hxx>
@ -43,52 +42,42 @@ BRepMesh_ModelBuilder::~BRepMesh_ModelBuilder ()
// Function: Perform // Function: Perform
// Purpose : // Purpose :
//======================================================================= //=======================================================================
Handle (IMeshData_Model) BRepMesh_ModelBuilder::Perform ( Handle (IMeshData_Model) BRepMesh_ModelBuilder::performInternal (
const TopoDS_Shape& theShape, const TopoDS_Shape& theShape,
const IMeshTools_Parameters& theParameters) const IMeshTools_Parameters& theParameters)
{ {
ClearStatus ();
Handle (BRepMeshData_Model) aModel; Handle (BRepMeshData_Model) aModel;
try
Bnd_Box aBox;
BRepBndLib::Add (theShape, aBox, Standard_False);
if (!aBox.IsVoid ())
{ {
OCC_CATCH_SIGNALS // Build data model for further processing.
aModel = new BRepMeshData_Model (theShape);
Bnd_Box aBox; if (theParameters.Relative)
BRepBndLib::Add (theShape, aBox, Standard_False);
if (!aBox.IsVoid ())
{ {
// Build data model for further processing. Standard_Real aMaxSize;
aModel = new BRepMeshData_Model (theShape); BRepMesh_ShapeTool::BoxMaxDimension (aBox, aMaxSize);
aModel->SetMaxSize(aMaxSize);
if (theParameters.Relative)
{
Standard_Real aMaxSize;
BRepMesh_ShapeTool::BoxMaxDimension (aBox, aMaxSize);
aModel->SetMaxSize(aMaxSize);
}
else
{
aModel->SetMaxSize(Max(theParameters.Deflection,
theParameters.DeflectionInterior));
}
Handle (IMeshTools_ShapeVisitor) aVisitor =
new BRepMesh_ShapeVisitor (aModel);
IMeshTools_ShapeExplorer aExplorer (theShape);
aExplorer.Accept (aVisitor);
SetStatus (Message_Done1);
} }
else else
{ {
SetStatus(Message_Fail1); aModel->SetMaxSize(Max(theParameters.Deflection,
theParameters.DeflectionInterior));
} }
Handle (IMeshTools_ShapeVisitor) aVisitor =
new BRepMesh_ShapeVisitor (aModel);
IMeshTools_ShapeExplorer aExplorer (theShape);
aExplorer.Accept (aVisitor);
SetStatus (Message_Done1);
} }
catch (Standard_Failure&) else
{ {
SetStatus (Message_Fail2); SetStatus (Message_Fail1);
} }
return aModel; return aModel;

View File

@ -36,13 +36,15 @@ public:
//! Destructor. //! Destructor.
Standard_EXPORT virtual ~BRepMesh_ModelBuilder (); Standard_EXPORT virtual ~BRepMesh_ModelBuilder ();
DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelBuilder, IMeshTools_ModelBuilder)
protected:
//! Creates discrete model for the given shape. //! Creates discrete model for the given shape.
//! Returns nullptr in case of failure. //! Returns nullptr in case of failure.
Standard_EXPORT virtual Handle (IMeshData_Model) Perform ( Standard_EXPORT virtual Handle (IMeshData_Model) performInternal (
const TopoDS_Shape& theShape, const TopoDS_Shape& theShape,
const IMeshTools_Parameters& theParameters) Standard_OVERRIDE; const IMeshTools_Parameters& theParameters) Standard_OVERRIDE;
DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelBuilder, IMeshTools_ModelBuilder)
}; };
#endif #endif

View File

@ -115,7 +115,7 @@ BRepMesh_ModelHealer::~BRepMesh_ModelHealer()
// Function: Perform // Function: Perform
// Purpose : // Purpose :
//======================================================================= //=======================================================================
Standard_Boolean BRepMesh_ModelHealer::Perform( Standard_Boolean BRepMesh_ModelHealer::performInternal(
const Handle(IMeshData_Model)& theModel, const Handle(IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters) const IMeshTools_Parameters& theParameters)
{ {
@ -226,22 +226,31 @@ Standard_Boolean BRepMesh_ModelHealer::popEdgesToUpdate(
//======================================================================= //=======================================================================
void BRepMesh_ModelHealer::process(const IMeshData::IFaceHandle& theDFace) const void BRepMesh_ModelHealer::process(const IMeshData::IFaceHandle& theDFace) const
{ {
Handle(IMeshData::MapOfIEdgePtr)& aIntersections = myFaceIntersectingEdges->ChangeFind(theDFace.get()); try
aIntersections.Nullify();
fixFaceBoundaries(theDFace);
if (!theDFace->IsSet(IMeshData_Failure))
{ {
BRepMesh_FaceChecker aChecker(theDFace, myParameters); OCC_CATCH_SIGNALS
if (!aChecker.Perform())
Handle(IMeshData::MapOfIEdgePtr)& aIntersections = myFaceIntersectingEdges->ChangeFind(theDFace.get());
aIntersections.Nullify();
fixFaceBoundaries(theDFace);
if (!theDFace->IsSet(IMeshData_Failure))
{ {
BRepMesh_FaceChecker aChecker(theDFace, myParameters);
if (!aChecker.Perform())
{
#ifdef DEBUG_HEALER #ifdef DEBUG_HEALER
std::cout << "Failed : #" << aChecker.GetIntersectingEdges()->Size() << std::endl; std::cout << "Failed : #" << aChecker.GetIntersectingEdges()->Size() << std::endl;
#endif #endif
aIntersections = aChecker.GetIntersectingEdges(); aIntersections = aChecker.GetIntersectingEdges();
}
} }
} }
catch (Standard_Failure const&)
{
theDFace->SetStatus (IMeshData_Failure);
}
} }
//======================================================================= //=======================================================================

View File

@ -44,11 +44,6 @@ public:
//! Destructor. //! Destructor.
Standard_EXPORT virtual ~BRepMesh_ModelHealer(); Standard_EXPORT virtual ~BRepMesh_ModelHealer();
//! Performs processing of edges of the given model.
Standard_EXPORT virtual Standard_Boolean Perform(
const Handle(IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters) Standard_OVERRIDE;
//! Functor API to discretize the given edge. //! Functor API to discretize the given edge.
inline void operator() (const Standard_Integer theEdgeIndex) const { inline void operator() (const Standard_Integer theEdgeIndex) const {
process(theEdgeIndex); process(theEdgeIndex);
@ -61,6 +56,13 @@ public:
DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelHealer, IMeshTools_ModelAlgo) DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelHealer, IMeshTools_ModelAlgo)
protected:
//! Performs processing of edges of the given model.
Standard_EXPORT virtual Standard_Boolean performInternal (
const Handle(IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters) Standard_OVERRIDE;
private: private:
//! Checks existing discretization of the face and updates data model. //! Checks existing discretization of the face and updates data model.

View File

@ -177,7 +177,7 @@ BRepMesh_ModelPostProcessor::~BRepMesh_ModelPostProcessor()
// Function: Perform // Function: Perform
// Purpose : // Purpose :
//======================================================================= //=======================================================================
Standard_Boolean BRepMesh_ModelPostProcessor::Perform( Standard_Boolean BRepMesh_ModelPostProcessor::performInternal(
const Handle(IMeshData_Model)& theModel, const Handle(IMeshData_Model)& theModel,
const IMeshTools_Parameters& /*theParameters*/) const IMeshTools_Parameters& /*theParameters*/)
{ {

View File

@ -32,12 +32,14 @@ public:
//! Destructor. //! Destructor.
Standard_EXPORT virtual ~BRepMesh_ModelPostProcessor(); Standard_EXPORT virtual ~BRepMesh_ModelPostProcessor();
DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelPostProcessor, IMeshTools_ModelAlgo)
protected:
//! Performs processing of edges of the given model. //! Performs processing of edges of the given model.
Standard_EXPORT virtual Standard_Boolean Perform( Standard_EXPORT virtual Standard_Boolean performInternal (
const Handle(IMeshData_Model)& theModel, const Handle(IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters) Standard_OVERRIDE; const IMeshTools_Parameters& theParameters) Standard_OVERRIDE;
DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelPostProcessor, IMeshTools_ModelAlgo)
}; };
#endif #endif

View File

@ -242,7 +242,7 @@ BRepMesh_ModelPreProcessor::~BRepMesh_ModelPreProcessor()
// Function: Perform // Function: Perform
// Purpose : // Purpose :
//======================================================================= //=======================================================================
Standard_Boolean BRepMesh_ModelPreProcessor::Perform( Standard_Boolean BRepMesh_ModelPreProcessor::performInternal(
const Handle(IMeshData_Model)& theModel, const Handle(IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters) const IMeshTools_Parameters& theParameters)
{ {

View File

@ -33,12 +33,14 @@ public:
//! Destructor. //! Destructor.
Standard_EXPORT virtual ~BRepMesh_ModelPreProcessor(); Standard_EXPORT virtual ~BRepMesh_ModelPreProcessor();
DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelPreProcessor, IMeshTools_ModelAlgo)
protected:
//! Performs processing of edges of the given model. //! Performs processing of edges of the given model.
Standard_EXPORT virtual Standard_Boolean Perform( Standard_EXPORT virtual Standard_Boolean performInternal (
const Handle(IMeshData_Model)& theModel, const Handle(IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters) Standard_OVERRIDE; const IMeshTools_Parameters& theParameters) Standard_OVERRIDE;
DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelPreProcessor, IMeshTools_ModelAlgo)
}; };
#endif #endif

View File

@ -17,6 +17,7 @@
#include <gp_Pnt2d.hxx> #include <gp_Pnt2d.hxx>
#include <BRepMesh_OrientedEdge.hxx> #include <BRepMesh_OrientedEdge.hxx>
#include <BRepMesh_Vertex.hxx> #include <BRepMesh_Vertex.hxx>
#include <Standard_OutOfRange.hxx>
//======================================================================= //=======================================================================
// Function: Constructor // Function: Constructor
@ -74,6 +75,9 @@ void BRepMeshData_PCurve::AddPoint (
//======================================================================= //=======================================================================
gp_Pnt2d& BRepMeshData_PCurve::GetPoint (const Standard_Integer theIndex) gp_Pnt2d& BRepMeshData_PCurve::GetPoint (const Standard_Integer theIndex)
{ {
Standard_OutOfRange_Raise_if (
theIndex < 0 || theIndex >= static_cast<Standard_Integer>(myPoints2d.size()),
"BRepMeshData_PCurve::GetPoint");
return myPoints2d[theIndex]; return myPoints2d[theIndex];
} }
@ -83,6 +87,9 @@ gp_Pnt2d& BRepMeshData_PCurve::GetPoint (const Standard_Integer theIndex)
//======================================================================= //=======================================================================
Standard_Integer& BRepMeshData_PCurve::GetIndex(const Standard_Integer theIndex) Standard_Integer& BRepMeshData_PCurve::GetIndex(const Standard_Integer theIndex)
{ {
Standard_OutOfRange_Raise_if (
theIndex < 0 || theIndex >= static_cast<Standard_Integer>(myIndices.size()),
"BRepMeshData_PCurve::GetIndex");
return myIndices[theIndex]; return myIndices[theIndex];
} }
@ -92,6 +99,9 @@ Standard_Integer& BRepMeshData_PCurve::GetIndex(const Standard_Integer theIndex)
//======================================================================= //=======================================================================
Standard_Real& BRepMeshData_PCurve::GetParameter (const Standard_Integer theIndex) Standard_Real& BRepMeshData_PCurve::GetParameter (const Standard_Integer theIndex)
{ {
Standard_OutOfRange_Raise_if (
theIndex < 0 || theIndex >= ParametersNb(),
"BRepMeshData_PCurve::GetParameter");
return myParameters[theIndex]; return myParameters[theIndex];
} }

View File

@ -16,6 +16,8 @@
#ifndef _IMeshTools_ModelAlgo_HeaderFile #ifndef _IMeshTools_ModelAlgo_HeaderFile
#define _IMeshTools_ModelAlgo_HeaderFile #define _IMeshTools_ModelAlgo_HeaderFile
#include <Standard_ErrorHandler.hxx>
#include <Standard_Failure.hxx>
#include <Standard_Transient.hxx> #include <Standard_Transient.hxx>
#include <Standard_Type.hxx> #include <Standard_Type.hxx>
@ -32,10 +34,22 @@ public:
{ {
} }
//! Performs processing of edges of the given model. //! Exceptions protected processing of the given model.
Standard_EXPORT virtual Standard_Boolean Perform ( Standard_Boolean Perform (
const Handle (IMeshData_Model)& theModel, const Handle (IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters) = 0; const IMeshTools_Parameters& theParameters)
{
try
{
OCC_CATCH_SIGNALS
return performInternal (theModel, theParameters);
}
catch (Standard_Failure const&)
{
return Standard_False;
}
}
DEFINE_STANDARD_RTTI_INLINE(IMeshTools_ModelAlgo, Standard_Transient) DEFINE_STANDARD_RTTI_INLINE(IMeshTools_ModelAlgo, Standard_Transient)
@ -45,6 +59,11 @@ protected:
Standard_EXPORT IMeshTools_ModelAlgo() Standard_EXPORT IMeshTools_ModelAlgo()
{ {
} }
//! Performs processing of the given model.
Standard_EXPORT virtual Standard_Boolean performInternal (
const Handle (IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters) = 0;
}; };
#endif #endif

View File

@ -17,6 +17,8 @@
#define _IMeshTools_ModelBuilder_HeaderFile #define _IMeshTools_ModelBuilder_HeaderFile
#include <Message_Algorithm.hxx> #include <Message_Algorithm.hxx>
#include <Standard_ErrorHandler.hxx>
#include <Standard_Failure.hxx>
#include <Standard_Type.hxx> #include <Standard_Type.hxx>
#include <TopoDS_Shape.hxx> #include <TopoDS_Shape.hxx>
@ -38,11 +40,26 @@ public:
{ {
} }
//! Creates discrete model for the given shape. //! Exceptions protected method to create discrete model for the given shape.
//! Returns nullptr in case of failure. //! Returns nullptr in case of failure.
Standard_EXPORT virtual Handle (IMeshData_Model) Perform ( Handle (IMeshData_Model) Perform (
const TopoDS_Shape& theShape, const TopoDS_Shape& theShape,
const IMeshTools_Parameters& theParameters) = 0; const IMeshTools_Parameters& theParameters)
{
ClearStatus ();
try
{
OCC_CATCH_SIGNALS
return performInternal (theShape, theParameters);
}
catch (Standard_Failure const&)
{
SetStatus (Message_Fail2);
return NULL;
}
}
DEFINE_STANDARD_RTTI_INLINE(IMeshTools_ModelBuilder, Message_Algorithm) DEFINE_STANDARD_RTTI_INLINE(IMeshTools_ModelBuilder, Message_Algorithm)
@ -52,6 +69,12 @@ protected:
Standard_EXPORT IMeshTools_ModelBuilder() Standard_EXPORT IMeshTools_ModelBuilder()
{ {
} }
//! Creates discrete model for the given shape.
//! Returns nullptr in case of failure.
Standard_EXPORT virtual Handle (IMeshData_Model) performInternal (
const TopoDS_Shape& theShape,
const IMeshTools_Parameters& theParameters) = 0;
}; };
#endif #endif

15
tests/bugs/mesh/bug30785 Normal file
View File

@ -0,0 +1,15 @@
puts "========="
puts "0030785: Mesh - protect BRepMesh_IncrementalMesh::Perform from crash"
puts "========="
puts ""
puts "REQUIRED All: Failure"
restore [locate_data_file bug30785.brep] s
# just check if the exception is not raised
if {[catch {incmesh s 0.1}]} {
puts "Error: Exception is raised by BRepMesh_IncrementalMesh"
}
checktrinfo s -tri