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.
commitSurfaceTriangulation();
}
}
- catch (Standard_Failure& /*theExeption*/)
+ catch (Standard_Failure const& /*theExeption*/)
{
}
// Function: Perform
// Purpose :
//=======================================================================
-Standard_Boolean BRepMesh_EdgeDiscret::Perform (
+Standard_Boolean BRepMesh_EdgeDiscret::performInternal (
const Handle (IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters)
{
void BRepMesh_EdgeDiscret::process (const Standard_Integer theEdgeIndex) const
{
const IMeshData::IEdgeHandle& aDEdge = myModel->GetEdge (theEdgeIndex);
- BRepMesh_Deflection::ComputeDeflection (aDEdge, myModel->GetMaxSize (), myParameters);
-
- Handle (IMeshTools_CurveTessellator) aEdgeTessellator;
- if (!aDEdge->IsFree ())
+ try
{
- // Iterate over pcurves and check deflection on corresponding face.
- Standard_Real aMinDeflection = RealLast ();
- Standard_Integer aMinPCurveIndex = -1;
- for (Standard_Integer aPCurveIt = 0; aPCurveIt < aDEdge->PCurvesNb (); ++aPCurveIt)
+ OCC_CATCH_SIGNALS
+
+ BRepMesh_Deflection::ComputeDeflection (aDEdge, myModel->GetMaxSize (), myParameters);
+
+ Handle (IMeshTools_CurveTessellator) aEdgeTessellator;
+ if (!aDEdge->IsFree ())
{
- const IMeshData::IPCurveHandle& aPCurve = aDEdge->GetPCurve (aPCurveIt);
- const Standard_Real aTmpDeflection = checkExistingPolygonAndUpdateStatus(aDEdge, aPCurve);
- if (aTmpDeflection < aMinDeflection)
+ // Iterate over pcurves and check deflection on corresponding face.
+ Standard_Real aMinDeflection = RealLast ();
+ Standard_Integer aMinPCurveIndex = -1;
+ for (Standard_Integer aPCurveIt = 0; aPCurveIt < aDEdge->PCurvesNb (); ++aPCurveIt)
{
- // Identify pcurve with the smallest deflection in order to
- // retrieve polygon that represents the most smooth discretization.
- aMinDeflection = aTmpDeflection;
- aMinPCurveIndex = aPCurveIt;
+ const IMeshData::IPCurveHandle& aPCurve = aDEdge->GetPCurve (aPCurveIt);
+ const Standard_Real aTmpDeflection = checkExistingPolygonAndUpdateStatus(aDEdge, aPCurve);
+ if (aTmpDeflection < aMinDeflection)
+ {
+ // 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)
- {
- 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 ())
+
+ if (aMinPCurveIndex != -1)
{
- // Edge already has suitable 3d polygon.
- aDEdge->SetStatus(IMeshData_Reused);
- return;
+ aDEdge->SetDeflection (aMinDeflection);
+ const IMeshData::IFaceHandle aDFace = aDEdge->GetPCurve(aMinPCurveIndex)->GetFace();
+ aEdgeTessellator = CreateEdgeTessellationExtractor(aDEdge, aDFace);
}
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);
}
}
-
- aEdgeTessellator = CreateEdgeTessellator(aDEdge, 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);
+ }
+
+ Tessellate3d (aDEdge, aEdgeTessellator, Standard_True);
+ if (!aDEdge->IsFree())
+ {
+ Tessellate2d(aDEdge, Standard_True);
+ }
}
-
- Tessellate3d (aDEdge, aEdgeTessellator, Standard_True);
- if (!aDEdge->IsFree())
+ catch (Standard_Failure const&)
{
- Tessellate2d(aDEdge, Standard_True);
+ aDEdge->SetStatus (IMeshData_Failure);
}
}
const IMeshData::IEdgeHandle& theDEdge,
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.
inline void operator() (const Standard_Integer theEdgeIndex) const {
process (theEdgeIndex);
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:
//! Checks existing discretization of the edge and updates data model.
// Function: Perform
// Purpose :
//=======================================================================
-Standard_Boolean BRepMesh_FaceDiscret::Perform(
+Standard_Boolean BRepMesh_FaceDiscret::performInternal(
const Handle(IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters)
{
return;
}
- Handle(IMeshTools_MeshAlgo) aMeshingAlgo =
- myAlgoFactory->GetAlgo(aDFace->GetSurface()->GetType(), myParameters);
+ try
+ {
+ OCC_CATCH_SIGNALS
- if (aMeshingAlgo.IsNull())
+ 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);
- return;
+ aDFace->SetStatus (IMeshData_Failure);
}
-
- aMeshingAlgo->Perform(aDFace, myParameters);
}
//! Class implements functionality starting triangulation of model's faces.
//! 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.
class BRepMesh_FaceDiscret : public IMeshTools_ModelAlgo
{
//! Destructor.
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.
inline void operator() (const Standard_Integer theFaceIndex) const {
process(theFaceIndex);
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:
//! Checks existing discretization of the face and updates data model.
#include <BRepMesh_ShapeVisitor.hxx>
#include <BRepMesh_ShapeTool.hxx>
#include <IMeshTools_ShapeExplorer.hxx>
-#include <Standard_ErrorHandler.hxx>
#include <Bnd_Box.hxx>
#include <BRepBndLib.hxx>
// Function: Perform
// Purpose :
//=======================================================================
-Handle (IMeshData_Model) BRepMesh_ModelBuilder::Perform (
+Handle (IMeshData_Model) BRepMesh_ModelBuilder::performInternal (
const TopoDS_Shape& theShape,
const IMeshTools_Parameters& theParameters)
{
- ClearStatus ();
-
Handle (BRepMeshData_Model) aModel;
- try
- {
- OCC_CATCH_SIGNALS
-
- Bnd_Box aBox;
- BRepBndLib::Add (theShape, aBox, Standard_False);
-
- if (!aBox.IsVoid ())
- {
- // Build data model for further processing.
- aModel = new BRepMeshData_Model (theShape);
- if (theParameters.Relative)
- {
- Standard_Real aMaxSize;
- BRepMesh_ShapeTool::BoxMaxDimension (aBox, aMaxSize);
- aModel->SetMaxSize(aMaxSize);
- }
- else
- {
- aModel->SetMaxSize(Max(theParameters.Deflection,
- theParameters.DeflectionInterior));
- }
+ Bnd_Box aBox;
+ BRepBndLib::Add (theShape, aBox, Standard_False);
- Handle (IMeshTools_ShapeVisitor) aVisitor =
- new BRepMesh_ShapeVisitor (aModel);
+ if (!aBox.IsVoid ())
+ {
+ // Build data model for further processing.
+ aModel = new BRepMeshData_Model (theShape);
- IMeshTools_ShapeExplorer aExplorer (theShape);
- aExplorer.Accept (aVisitor);
- SetStatus (Message_Done1);
+ if (theParameters.Relative)
+ {
+ Standard_Real aMaxSize;
+ BRepMesh_ShapeTool::BoxMaxDimension (aBox, aMaxSize);
+ aModel->SetMaxSize(aMaxSize);
}
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;
//! Destructor.
Standard_EXPORT virtual ~BRepMesh_ModelBuilder ();
+ DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelBuilder, IMeshTools_ModelBuilder)
+
+protected:
+
//! Creates discrete model for the given shape.
//! 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 IMeshTools_Parameters& theParameters) Standard_OVERRIDE;
-
- DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelBuilder, IMeshTools_ModelBuilder)
};
#endif
\ No newline at end of file
// Function: Perform
// Purpose :
//=======================================================================
-Standard_Boolean BRepMesh_ModelHealer::Perform(
+Standard_Boolean BRepMesh_ModelHealer::performInternal(
const Handle(IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters)
{
//=======================================================================
void BRepMesh_ModelHealer::process(const IMeshData::IFaceHandle& theDFace) const
{
- Handle(IMeshData::MapOfIEdgePtr)& aIntersections = myFaceIntersectingEdges->ChangeFind(theDFace.get());
- aIntersections.Nullify();
-
- fixFaceBoundaries(theDFace);
-
- if (!theDFace->IsSet(IMeshData_Failure))
+ try
{
- BRepMesh_FaceChecker aChecker(theDFace, myParameters);
- if (!aChecker.Perform())
+ OCC_CATCH_SIGNALS
+
+ 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
- std::cout << "Failed : #" << aChecker.GetIntersectingEdges()->Size() << std::endl;
+ std::cout << "Failed : #" << aChecker.GetIntersectingEdges()->Size() << std::endl;
#endif
- aIntersections = aChecker.GetIntersectingEdges();
+ aIntersections = aChecker.GetIntersectingEdges();
+ }
}
}
+ catch (Standard_Failure const&)
+ {
+ theDFace->SetStatus (IMeshData_Failure);
+ }
}
//=======================================================================
//! Destructor.
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.
inline void operator() (const Standard_Integer theEdgeIndex) const {
process(theEdgeIndex);
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:
//! Checks existing discretization of the face and updates data model.
// Function: Perform
// Purpose :
//=======================================================================
-Standard_Boolean BRepMesh_ModelPostProcessor::Perform(
+Standard_Boolean BRepMesh_ModelPostProcessor::performInternal(
const Handle(IMeshData_Model)& theModel,
const IMeshTools_Parameters& /*theParameters*/)
{
//! Destructor.
Standard_EXPORT virtual ~BRepMesh_ModelPostProcessor();
+ DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelPostProcessor, IMeshTools_ModelAlgo)
+
+protected:
+
//! 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 IMeshTools_Parameters& theParameters) Standard_OVERRIDE;
-
- DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelPostProcessor, IMeshTools_ModelAlgo)
};
#endif
// Function: Perform
// Purpose :
//=======================================================================
-Standard_Boolean BRepMesh_ModelPreProcessor::Perform(
+Standard_Boolean BRepMesh_ModelPreProcessor::performInternal(
const Handle(IMeshData_Model)& theModel,
const IMeshTools_Parameters& theParameters)
{
//! Destructor.
Standard_EXPORT virtual ~BRepMesh_ModelPreProcessor();
+ DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelPreProcessor, IMeshTools_ModelAlgo)
+
+protected:
+
//! 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 IMeshTools_Parameters& theParameters) Standard_OVERRIDE;
-
- DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelPreProcessor, IMeshTools_ModelAlgo)
};
#endif
#include <gp_Pnt2d.hxx>
#include <BRepMesh_OrientedEdge.hxx>
#include <BRepMesh_Vertex.hxx>
+#include <Standard_OutOfRange.hxx>
//=======================================================================
// Function: Constructor
//=======================================================================
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];
}
//=======================================================================
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];
}
//=======================================================================
Standard_Real& BRepMeshData_PCurve::GetParameter (const Standard_Integer theIndex)
{
+ Standard_OutOfRange_Raise_if (
+ theIndex < 0 || theIndex >= ParametersNb(),
+ "BRepMeshData_PCurve::GetParameter");
return myParameters[theIndex];
}
#ifndef _IMeshTools_ModelAlgo_HeaderFile
#define _IMeshTools_ModelAlgo_HeaderFile
+#include <Standard_ErrorHandler.hxx>
+#include <Standard_Failure.hxx>
#include <Standard_Transient.hxx>
#include <Standard_Type.hxx>
{
}
- //! Performs processing of edges of the given model.
- Standard_EXPORT virtual Standard_Boolean Perform (
+ //! Exceptions protected processing of the given model.
+ Standard_Boolean Perform (
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)
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
\ No newline at end of file
#define _IMeshTools_ModelBuilder_HeaderFile
#include <Message_Algorithm.hxx>
+#include <Standard_ErrorHandler.hxx>
+#include <Standard_Failure.hxx>
#include <Standard_Type.hxx>
#include <TopoDS_Shape.hxx>
{
}
- //! Creates discrete model for the given shape.
+ //! Exceptions protected method to create discrete model for the given shape.
//! Returns nullptr in case of failure.
- Standard_EXPORT virtual Handle (IMeshData_Model) Perform (
+ Handle (IMeshData_Model) Perform (
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)
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
\ No newline at end of file
--- /dev/null
+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