//=======================================================================
void BRepMesh_Delaun::createTriangles(const Standard_Integer theVertexIndex,
BRepMesh::MapOfIntegerInteger& thePoly)
+{
+ Message_ProgressSentry aSentry(NULL, "", 0, 100, 1);
+ createTriangles(theVertexIndex, thePoly, aSentry);
+}
+
+//=======================================================================
+//function : createTriangles
+//purpose : Creates the triangles beetween the node and the polyline.
+//=======================================================================
+void BRepMesh_Delaun::createTriangles(const Standard_Integer theVertexIndex,
+ BRepMesh::MapOfIntegerInteger& thePoly,
+ Message_ProgressSentry& theProgressEntry)
{
BRepMesh::ListOfInteger aLoopEdges, anExternalEdges;
const gp_XY& aVertexCoord = myMeshData->GetNode( theVertexIndex ).Coord();
BRepMesh::MapOfIntegerInteger::Iterator anEdges( thePoly );
for ( ; anEdges.More(); anEdges.Next() )
{
+ if (!theProgressEntry.More())
+ {
+ return;
+ }
Standard_Integer anEdgeId = anEdges.Key();
const BRepMesh_Edge& anEdge = GetEdge( anEdgeId );
while ( !aLoopEdges.IsEmpty() )
{
+ if (!theProgressEntry.More())
+ {
+ return;
+ }
const BRepMesh_Edge& anEdge = GetEdge( Abs( aLoopEdges.First() ) );
if ( anEdge.Movability() != BRepMesh_Deleted )
{
//=======================================================================
void BRepMesh_Delaun::createTrianglesOnNewVertices(
BRepMesh::Array1OfInteger& theVertexIndexes)
+{
+ Message_ProgressSentry aSentry(NULL, "", 0, 100, 1);
+ createTrianglesOnNewVertices(theVertexIndexes, aSentry);
+}
+
+//=======================================================================
+//function : createTrianglesOnNewVertices
+//purpose : Creation of triangles from the new nodes
+//=======================================================================
+void BRepMesh_Delaun::createTrianglesOnNewVertices(
+ BRepMesh::Array1OfInteger& theVertexIndexes,
+ Message_ProgressSentry& theProgressEntry)
{
Handle(NCollection_IncAllocator) aAllocator =
new NCollection_IncAllocator(BRepMesh::MEMORY_BLOCK_SIZE_HUGE);
Standard_Integer anUpper = theVertexIndexes.Upper();
for( ; anIndex <= anUpper; ++anIndex )
{
+ if (!theProgressEntry.More())
+ {
+ return;
+ }
aAllocator->Reset(Standard_False);
BRepMesh::MapOfIntegerInteger aLoopEdges(10, aAllocator);
isModify = Standard_True;
while ( isModify && !aCirclesList.IsEmpty() )
{
+ if (!theProgressEntry.More())
+ {
+ return;
+ }
isModify = Standard_False;
BRepMesh::ListOfInteger::Iterator aCircleIt1( aCirclesList );
for ( ; aCircleIt1.More(); aCircleIt1.Next() )
}
}
+ if (!theProgressEntry.More())
+ {
+ return;
+ }
// Creation of triangles with the current node and free edges
// and removal of these edges from the list of free edges
- createTriangles( aVertexIdx, aLoopEdges );
+ createTriangles( aVertexIdx, aLoopEdges, theProgressEntry );
}
}
-
- insertInternalEdges();
-
+ if (!theProgressEntry.More())
+ {
+ return;
+ }
+ insertInternalEdges(theProgressEntry);
+ if (!theProgressEntry.More())
+ {
+ return;
+ }
// Adjustment of meshes to boundary edges
frontierAdjust();
}
//purpose :
//=======================================================================
void BRepMesh_Delaun::insertInternalEdges()
+{
+ Message_ProgressSentry aSentry(NULL, "", 0, 100, 1);
+ insertInternalEdges(aSentry);
+}
+
+//=======================================================================
+//function : insertInternalEdges
+//purpose :
+//=======================================================================
+void BRepMesh_Delaun::insertInternalEdges(Message_ProgressSentry& theProgressEntry)
{
BRepMesh::HMapOfInteger anInternalEdges = InternalEdges();
BRepMesh::MapOfInteger::Iterator anInernalEdgesIt( *anInternalEdges );
for ( ; anInernalEdgesIt.More(); anInernalEdgesIt.Next() )
{
+ if (!theProgressEntry.More())
+ {
+ return;
+ }
const Standard_Integer aLinkIndex = anInernalEdgesIt.Key();
const BRepMesh_PairOfIndex& aPair = myMeshData->ElementsConnectedTo(aLinkIndex);
//function : AddVertices
//purpose : Adds some vertices in the triangulation.
//=======================================================================
-void BRepMesh_Delaun::AddVertices(BRepMesh::Array1OfVertexOfDelaun& theVertices)
+void BRepMesh_Delaun::AddVertices(BRepMesh::Array1OfVertexOfDelaun& theVertices,
+ Message_ProgressSentry& theProgressEntry)
{
std::make_heap(theVertices.begin(), theVertices.end(), ComparatorOfVertexOfDelaun());
std::sort_heap(theVertices.begin(), theVertices.end(), ComparatorOfVertexOfDelaun());
for ( Standard_Integer i = aLower; i <= anUpper; ++i )
aVertexIndexes(i) = myMeshData->AddNode( theVertices(i) );
- createTrianglesOnNewVertices( aVertexIndexes );
+ createTrianglesOnNewVertices( aVertexIndexes, theProgressEntry );
}
//=======================================================================
#include <TColStd_Array1OfInteger.hxx>
#include <TColStd_SequenceOfInteger.hxx>
#include <TColStd_MapOfInteger.hxx>
+#include <Message_ProgressSentry.hxx>
class Bnd_B2d;
class Bnd_Box2d;
Standard_EXPORT void RemoveVertex (const BRepMesh_Vertex& theVertex);
//! Adds some vertices into the triangulation.
- Standard_EXPORT void AddVertices (BRepMesh::Array1OfVertexOfDelaun& theVertices);
+ Standard_EXPORT void AddVertices (BRepMesh::Array1OfVertexOfDelaun& theVertices,
+ Message_ProgressSentry& theProgressEntry);
//! Modify mesh to use the edge.
//! @return True if done
//! Creates the triangles beetween the given node and the given polyline.
void createTriangles (const Standard_Integer theVertexIndex,
BRepMesh::MapOfIntegerInteger& thePoly);
+ void createTriangles (const Standard_Integer theVertexIndex,
+ BRepMesh::MapOfIntegerInteger& thePoly,
+ Message_ProgressSentry& theProgressEntry);
//! Add a triangle based on the given oriented edges into mesh
void addTriangle (const Standard_Integer (&theEdgesId)[3],
BRepMesh::SequenceOfBndB2d& thePolyBoxes);
//! Creates the triangles on new nodes.
+ void createTrianglesOnNewVertices (BRepMesh::Array1OfInteger& theVertexIndices,
+ Message_ProgressSentry& theProgressEntry);
+ //! Creates the triangles on new nodes.
void createTrianglesOnNewVertices (BRepMesh::Array1OfInteger& theVertexIndices);
//! Cleanup mesh from the free triangles.
//! Performs insertion of internal edges into mesh.
void insertInternalEdges();
+ //! Performs insertion of internal edges into mesh.
+ void insertInternalEdges(Message_ProgressSentry& theProgressEntry);
+
private:
Handle(BRepMesh_DataStructureOfDelaun) myMeshData;
#include <Standard_Type.hxx>
#include <TopoDS_Shape.hxx>
#include <Standard_Transient.hxx>
+#include <Message_ProgressIndicator.hxx>
//! This is a common interface for meshing algorithms
//! instantiated by Mesh Factory and implemented by plugins.
}
//! Compute triangulation for set shape.
- Standard_EXPORT virtual void Perform() = 0;
+ Standard_EXPORT virtual void Perform (const Handle(Message_ProgressIndicator) &theProgress = NULL) = 0;
DEFINE_STANDARD_RTTIEXT(BRepMesh_DiscretRoot,Standard_Transient)
--- /dev/null
+// Created: 2020-07-27
+//
+// Copyright (c) 2020 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef BRepMesh_FaceSentry_HeaderFile
+#define BRepMesh_FaceSentry_HeaderFile
+
+#include <TopoDS_Face.hxx>
+
+class Message_ProgressSentry;
+
+class BRepMesh_FaceSentry
+{
+public:
+ BRepMesh_FaceSentry()
+ :mySentry(0L), isParallel(Standard_False)
+ {
+ }
+
+ BRepMesh_FaceSentry (const TopoDS_Face& theFace,
+ Message_ProgressSentry* theSentry = 0L,
+ Standard_Boolean theParallel = Standard_False)
+ :myFace(theFace), mySentry(theSentry),
+ isParallel(theParallel)
+ {
+ }
+
+ //! Get progress sentry
+ Message_ProgressSentry* GetProgressEntry() const
+ {
+ return mySentry;
+ }
+
+ //! Return reference on TopoDS_Face
+ const TopoDS_Face& GetFace() const
+ {
+ return myFace;
+ }
+
+ //! Returns isParallel
+ Standard_Boolean IsParallel() const
+ {
+ return isParallel;
+ }
+
+
+private:
+ TopoDS_Face myFace;
+ Message_ProgressSentry* mySentry;
+ Standard_Boolean isParallel;
+};
+
+#endif
\ No newline at end of file
//function : Process
//purpose :
//=======================================================================
-void BRepMesh_FastDiscret::Process(const TopoDS_Face& theFace) const
+void BRepMesh_FastDiscret::Process(const TopoDS_Face& theFace, Message_ProgressSentry& theProgrEntry) const
{
Handle(BRepMesh_FaceAttribute) anAttribute;
- if (GetFaceAttribute(theFace, anAttribute))
+ if (GetFaceAttribute(theFace, anAttribute) && theProgrEntry.More())
{
try
{
BRepMesh_FastDiscretFace aTool(myParameters.Angle, myParameters.MinSize,
myParameters.InternalVerticesMode, myParameters.ControlSurfaceDeflection);
- aTool.Perform(anAttribute);
+ aTool.Perform(anAttribute, theProgrEntry);
}
catch (Standard_Failure)
{
#include <BRepMesh_ShapeTool.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
+#include <Message_ProgressSentry.hxx>
+#include <BRepMesh_FaceSentry.hxx>
+#include <OSD_Parallel.hxx>
class BRepMesh_DataStructureOfDelaun;
class Bnd_Box;
//! Triangulate a face previously recorded for
//! processing by call to Add(). Can be executed in
//! parallel threads.
- Standard_EXPORT void Process(const TopoDS_Face& face) const;
+ Standard_EXPORT void Process(const TopoDS_Face& theFace, Message_ProgressSentry& theProgrEntry) const;
- void operator () (const TopoDS_Face& face) const
+ void operator () (const BRepMesh_FaceSentry& aFaceSentry) const
{
- Process(face);
+ if (!aFaceSentry.GetProgressEntry()->More())
+ {
+ return;
+ }
+ Process(aFaceSentry.GetFace(), *aFaceSentry.GetProgressEntry());
+
+ if (aFaceSentry.IsParallel())
+ {
+ aFaceSentry.GetProgressEntry()->Next(OSD_Parallel::NbLogicalProcessors());
+ }
+ else
+ {
+ aFaceSentry.GetProgressEntry()->Next();
+ }
}
//! Returns parameters of meshing
//function : Perform
//purpose :
//=======================================================================
-void BRepMesh_FastDiscretFace::Perform(const Handle(BRepMesh_FaceAttribute)& theAttribute)
+void BRepMesh_FastDiscretFace::Perform (const Handle(BRepMesh_FaceAttribute)& theAttribute,
+ Message_ProgressSentry& theProgressEntry)
{
- add(theAttribute);
+ add(theAttribute, theProgressEntry);
+ if (!theProgressEntry.More())
+ {
+ return;
+ }
commitSurfaceTriangulation();
}
//function : Add
//purpose :
//=======================================================================
-void BRepMesh_FastDiscretFace::add(const Handle(BRepMesh_FaceAttribute)& theAttribute)
+void BRepMesh_FastDiscretFace::add (const Handle(BRepMesh_FaceAttribute)& theAttribute,
+ Message_ProgressSentry& theProgressEntry)
{
if (!theAttribute->IsValid() || theAttribute->ChangeMeshNodes()->IsEmpty())
return;
(vmax - vmin) < Precision::PConfusion());
Standard_Real aDef = -1;
+ if (!theProgressEntry.More())
+ {
+ return;
+ }
if ( !isaline && myStructure->ElementsOfDomain().Extent() > 0 )
{
if (!rajout)
{
// compute maximal deflection
- aDef = control(trigu, Standard_True);
+ aDef = control(trigu, Standard_True, theProgressEntry);
+ if (!theProgressEntry.More())
+ {
+ return;
+ }
rajout = (aDef > myAttribute->GetDefFace() || aDef < 0.);
}
if (thetype != GeomAbs_Plane)
if (rajout)
{
- insertInternalVertices(trigu);
+ insertInternalVertices(trigu, theProgressEntry);
+ if (!theProgressEntry.More())
+ {
+ return;
+ }
//control internal points
if (myIsControlSurfaceDeflection)
- aDef = control(trigu, Standard_False);
+ {
+ aDef = control(trigu, Standard_False, theProgressEntry);
+ if (!theProgressEntry.More())
+ {
+ return;
+ }
+ }
}
}
}
//=======================================================================
Standard_Boolean BRepMesh_FastDiscretFace::addVerticesToMesh(
const BRepMesh::ListOfVertex& theVertices,
- BRepMesh_Delaun& theMeshBuilder)
+ BRepMesh_Delaun& theMeshBuilder,
+ Message_ProgressSentry& theProgressEntry)
{
if (theVertices.IsEmpty())
return Standard_False;
for (Standard_Integer aVertexId = 0; aVertexIt.More(); aVertexIt.Next())
aArrayOfNewVertices(++aVertexId) = aVertexIt.Value();
- theMeshBuilder.AddVertices(aArrayOfNewVertices);
- return Standard_True;
+ theMeshBuilder.AddVertices(aArrayOfNewVertices, theProgressEntry);
+ return theProgressEntry.More();
}
//=======================================================================
//function : insertInternalVertices
//purpose :
//=======================================================================
-void BRepMesh_FastDiscretFace::insertInternalVertices(BRepMesh_Delaun& theMeshBuilder)
+void BRepMesh_FastDiscretFace::insertInternalVertices (BRepMesh_Delaun& theMeshBuilder,
+ Message_ProgressSentry& theProgressEntry)
{
Handle(NCollection_IncAllocator) anAlloc = new NCollection_IncAllocator;
BRepMesh::ListOfVertex aNewVertices(anAlloc);
break;
}
- addVerticesToMesh(aNewVertices, theMeshBuilder);
+ addVerticesToMesh(aNewVertices, theMeshBuilder, theProgressEntry);
}
//=======================================================================
//=======================================================================
Standard_Real BRepMesh_FastDiscretFace::control(
BRepMesh_Delaun& theTrigu,
- const Standard_Boolean theIsFirst)
+ const Standard_Boolean theIsFirst,
+ Message_ProgressSentry& theProgressEntry)
{
Standard_Integer aTrianglesNb = myStructure->ElementsOfDomain().Extent();
if (aTrianglesNb < 1)
new NCollection_IncAllocator(BRepMesh::MEMORY_BLOCK_SIZE_HUGE);
for (; aPass <= aPassesNb && aInsertedNb && !isAllDegenerated; ++aPass)
{
+ if (!theProgressEntry.More())
+ {
+ return 0;
+ }
aTempAlloc->Reset(Standard_False);
BRepMesh::ListOfVertex aNewVertices(aTempAlloc);
BRepMesh::MapOfInteger::Iterator aTriangleIt(aTriangles);
for (; aTriangleIt.More(); aTriangleIt.Next())
{
+ if (!theProgressEntry.More())
+ {
+ return 0;
+ }
const Standard_Integer aTriangleId = aTriangleIt.Key();
const BRepMesh_Triangle& aCurrentTriangle = myStructure->GetElement(aTriangleId);
ftt << "vertex vt" << aPass << "_" << i << " "
<< aP.X() << " " << aP.Y() << " " << aP.Z() << endl;
}
-#endif
-
- if (addVerticesToMesh(aNewVertices, theTrigu))
+#endif
+ if (!theProgressEntry.More())
+ {
+ return 0;
+ }
+ if (addVerticesToMesh(aNewVertices, theTrigu, theProgressEntry))
++aInsertedNb;
}
#include <BRepMesh_Triangle.hxx>
#include <BRepMesh_Classifier.hxx>
#include <ElSLib.hxx>
+#include <Message_ProgressSentry.hxx>
class BRepMesh_DataStructureOfDelaun;
class BRepMesh_FaceAttribute;
const Standard_Boolean isInternalVerticesMode,
const Standard_Boolean isControlSurfaceDeflection);
- Standard_EXPORT void Perform(const Handle(BRepMesh_FaceAttribute)& theAttribute);
-
+ Standard_EXPORT void Perform(const Handle(BRepMesh_FaceAttribute)& theAttribute, Message_ProgressSentry& theProgressEntry);
+
DEFINE_STANDARD_RTTIEXT(BRepMesh_FastDiscretFace,Standard_Transient)
private:
- void add(const Handle(BRepMesh_FaceAttribute)& theAttribute);
+ void add(const Handle(BRepMesh_FaceAttribute)& theAttribute, Message_ProgressSentry& theProgressEntry);
void add(const TopoDS_Vertex& theVertex);
Standard_Real control(BRepMesh_Delaun& theMeshBuilder,
- const Standard_Boolean theIsFirst);
+ const Standard_Boolean theIsFirst,
+ Message_ProgressSentry& theProgressEntry);
//! Registers the given nodes in mesh data structure and
//! performs refinement of existing mesh.
//! @return TRUE if vertices were been inserted, FALSE elewhere.
Standard_Boolean addVerticesToMesh(
const BRepMesh::ListOfVertex& theVertices,
- BRepMesh_Delaun& theMeshBuilder);
+ BRepMesh_Delaun& theMeshBuilder,
+ Message_ProgressSentry& theProgressEntry);
//! Calculates nodes lying on face's surface and inserts them to a mesh.
//! @param theMeshBuilder initialized tool refining mesh
//! in respect to inserting nodes.
- void insertInternalVertices(BRepMesh_Delaun& theMeshBuilder);
+ void insertInternalVertices(BRepMesh_Delaun& theMeshBuilder,
+ Message_ProgressSentry& theProgressEntry);
//! Calculates nodes lying on spherical surface.
//! @param theNewVertices list of vertices to be extended and added to mesh.
#include <GCPnts_TangentialDeflection.hxx>
+#include <Message_ProgressSentry.hxx>
+#include <BRepMesh_FaceSentry.hxx>
+
+
IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_IncrementalMesh,BRepMesh_DiscretRoot)
namespace
//function : Constructor
//purpose :
//=======================================================================
-BRepMesh_IncrementalMesh::BRepMesh_IncrementalMesh(const TopoDS_Shape& theShape,
- const BRepMesh_FastDiscret::Parameters& theParameters)
+BRepMesh_IncrementalMesh::BRepMesh_IncrementalMesh (const TopoDS_Shape& theShape,
+ const BRepMesh_FastDiscret::Parameters& theParameters,
+ const Handle(Message_ProgressIndicator) &theProgress)
: myParameters(theParameters)
{
myShape = theShape;
- Perform();
+ Perform(theProgress);
}
//=======================================================================
//function : Perform
//purpose :
//=======================================================================
-void BRepMesh_IncrementalMesh::Perform()
+void BRepMesh_IncrementalMesh::Perform(const Handle(Message_ProgressIndicator) &theProgress)
{
init();
if (myMesh.IsNull())
return;
- update();
+ update(theProgress);
}
//=======================================================================
//function : update()
//purpose :
//=======================================================================
-void BRepMesh_IncrementalMesh::update()
+void BRepMesh_IncrementalMesh::update(const Handle(Message_ProgressIndicator) &theProgress)
{
+ Message_ProgressSentry anOuterSentry(theProgress, "Updating", 0, 100, 1);
+
// Update edges data
TopExp_Explorer aExplorer(myShape, TopAbs_EDGE);
- for (; aExplorer.More(); aExplorer.Next())
+ int aEdgeSize = 0;
+ for ( ; aExplorer.More(); aExplorer.Next(), aEdgeSize++)
+ {
+ }
+ anOuterSentry.Next(9);
+ aExplorer.Init(myShape, TopAbs_EDGE);
+ for (Message_ProgressSentry anEdgeSentry(theProgress, "Update edges data", 0, aEdgeSize, 1);
+ aExplorer.More() && anEdgeSentry.More(); aExplorer.Next(), anEdgeSentry.Next())
{
const TopoDS_Edge& aEdge = TopoDS::Edge(aExplorer.Current());
if(!BRep_Tool::IsGeometric(aEdge))
update(aEdge);
}
+ if (!anOuterSentry.More())
+ {
+ myStatus = BRepMesh_UserBreak;
+ return;
+ }
+ anOuterSentry.Next(5);
+
+ NCollection_Vector<BRepMesh_FaceSentry> aFaces;
// Update faces data
NCollection_Vector<TopoDS_Face>::Iterator aFaceIt(myFaces);
- for (; aFaceIt.More(); aFaceIt.Next())
+ for (Message_ProgressSentry aFacesSentry(theProgress, "Update faces data", 0, myFaces.Size(), 1);
+ aFaceIt.More() && aFacesSentry.More(); aFaceIt.Next(), aFacesSentry.Next())
+ {
update(aFaceIt.Value());
+ }
- // Mesh faces
- OSD_Parallel::ForEach(myFaces.begin(), myFaces.end(), *myMesh, !myParameters.InParallel);
+ if (!anOuterSentry.More())
+ {
+ myStatus = BRepMesh_UserBreak;
+ return;
+ }
+ anOuterSentry.Next(80);
- commit();
+ Message_ProgressSentry aProgrSentry(theProgress, "Mesh faces", 0, myFaces.Size(), 1);
+ for (NCollection_Vector<TopoDS_Face>::Iterator aFaceIter(myFaces); aFaceIter.More(); aFaceIter.Next())
+ {
+ aFaces.Append(BRepMesh_FaceSentry(aFaceIter.Value(), &aProgrSentry, myParameters.InParallel));
+ }
+ // Mesh faces
+ OSD_Parallel::ForEach(aFaces.begin(), aFaces.end(), *myMesh, !myParameters.InParallel);
+ if (!anOuterSentry.More())
+ {
+ myStatus = BRepMesh_UserBreak;
+ return;
+ }
+ anOuterSentry.Next(5);
+ Message_ProgressSentry aSentry(theProgress, "Commit", 0, myFaces.Size(), 1);
+ commit(aSentry);
+ anOuterSentry.Next();
clear();
}
//function : commit
//purpose :
//=======================================================================
-void BRepMesh_IncrementalMesh::commit()
+void BRepMesh_IncrementalMesh::commit(Message_ProgressSentry& theSentry)
{
NCollection_Vector<TopoDS_Face>::Iterator aFaceIt(myFaces);
- for (; aFaceIt.More(); aFaceIt.Next())
+ for (; aFaceIt.More() && theSentry.More(); aFaceIt.Next(), theSentry.Next())
commitEdges(aFaceIt.Value());
discretizeFreeEdges();
#include <TopTools_DataMapOfShapeReal.hxx>
#include <BRepMesh_DiscretRoot.hxx>
#include <BRepMesh.hxx>
+#include <Message_ProgressIndicator.hxx>
#include <vector>
//! used for the faces will be the maximum deflection of their edges.
//! @param theAngDeflection angular deflection.
//! @param isInParallel if TRUE shape will be meshed in parallel.
- Standard_EXPORT BRepMesh_IncrementalMesh(
+ Standard_EXPORT BRepMesh_IncrementalMesh (
const TopoDS_Shape& theShape,
const Standard_Real theLinDeflection,
const Standard_Boolean isRelative = Standard_False,
//! @param theShape shape to be meshed.
//! @param theParameters - parameters of meshing
Standard_EXPORT BRepMesh_IncrementalMesh (const TopoDS_Shape& theShape,
- const BRepMesh_FastDiscret::Parameters& theParameters);
+ const BRepMesh_FastDiscret::Parameters& theParameters,
+ const Handle(Message_ProgressIndicator) &theProgress = NULL);
//! Performs meshing ot the shape.
- Standard_EXPORT virtual void Perform() Standard_OVERRIDE;
+ Standard_EXPORT virtual void Perform(const Handle(Message_ProgressIndicator) &theProgress = NULL) Standard_OVERRIDE;
public: //! @name accessing to parameters.
private:
//! Builds the incremental mesh for the shape.
- void update();
+ void update(const Handle(Message_ProgressIndicator) &theProgress = NULL);
//! Checks triangulation of the given face for consistency
//! with the chosen tolerance. If some edge of face has no
const Standard_Boolean isWithCheck);
//! Stores mesh to the shape.
- void commit();
+ void commit(Message_ProgressSentry& theSentry);
//! Stores mesh of internal edges to the face.
void commitEdges(const TopoDS_Face& theFace);
BRepMesh_OpenWire = 0x1,
BRepMesh_SelfIntersectingWire = 0x2,
BRepMesh_Failure = 0x4,
- BRepMesh_ReMesh = 0x8
+ BRepMesh_ReMesh = 0x8,
+ BRepMesh_UserBreak = 0x16
};
#endif
BRepMesh_EdgeTessellator.hxx
BRepMesh_FaceAttribute.cxx
BRepMesh_FaceAttribute.hxx
+BRepMesh_FaceSentry.hxx
BRepMesh_FactoryError.hxx
BRepMesh_FastDiscret.cxx
BRepMesh_FastDiscret.hxx
#include <TopoDS_Wire.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_MapIteratorOfMapOfShape.hxx>
+#include <Draw_ProgressIndicator.hxx>
#include <stdio.h>
//epa Memory leaks test
aMeshParams.ControlSurfaceDeflection = isControlSurDef;
aMeshParams.AdaptiveMin = isAdaptiveMin;
- BRepMesh_IncrementalMesh aMesher (aShape, aMeshParams);
+ Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(di, 1);
+ BRepMesh_IncrementalMesh aMesher(aShape, aMeshParams, aProgress);
di << "Meshing statuses: ";
Standard_Integer statusFlags = aMesher.GetStatusFlags();
else
{
Standard_Integer i;
- for( i = 0; i < 4; i++ )
+ for( i = 0; i < 5; i++ )
{
if( (statusFlags >> i) & (Standard_Integer)1 )
{
case 4:
di << "ReMesh ";
break;
+ case 5:
+ di << "UserBreak";
+ break;
}
}
}
const Standard_Real step,
const Standard_Boolean isInf,
const Standard_Real newScopeSpan) :
- myProgress(progress), myActive(!progress.IsNull())
+ myProgress(progress), myActive(!progress.IsNull()),
+ myThreadId(OSD_Thread::Current())
{
if ( ! myActive ) return;
progress->SetName ( name );
const Standard_Real step,
const Standard_Boolean isInf,
const Standard_Real newScopeSpan) :
- myProgress(progress), myActive(!progress.IsNull())
+ myProgress(progress), myActive(!progress.IsNull()),
+ myThreadId(OSD_Thread::Current())
{
if ( ! myActive ) return;
progress->SetName ( name );
#include <Standard_Boolean.hxx>
#include <Standard_CString.hxx>
#include <Standard_Real.hxx>
+
+#include <Standard_ThreadId.hxx>
+#include <OSD_Thread.hxx>
+
class Message_ProgressIndicator;
class TCollection_HAsciiString;
Handle(Message_ProgressIndicator) myProgress;
Standard_Boolean myActive;
+ Standard_ThreadId myThreadId;
};
inline void Message_ProgressSentry::Relieve ()
{
- if ( ! myActive ) return;
+ if ( !myActive || myThreadId != OSD_Thread::Current()) return;
myProgress->EndScope();
myActive = 0;
}
inline void Message_ProgressSentry::Next (const Standard_CString name) const
{
- if ( myActive ) myProgress->NextScope(name);
+ if ( myActive && myThreadId == OSD_Thread::Current())
+ {
+ myProgress->NextScope(name);
+ }
}
//=======================================================================
inline void Message_ProgressSentry::Next (const Standard_Real span,
const Standard_CString name) const
{
- if ( myActive ) myProgress->NextScope(span, name);
+ if ( myActive && myThreadId == OSD_Thread::Current())
+ {
+ myProgress->NextScope(span, name);
+ }
}
//=======================================================================
inline void Message_ProgressSentry::Next (const Standard_Real span,
const Handle(TCollection_HAsciiString)& name) const
{
- if ( myActive ) {
+ if ( myActive && myThreadId == OSD_Thread::Current())
+ {
myProgress->EndScope();
myProgress->NewScope(span, name);
}
inline void Message_ProgressSentry::Show () const
{
- if ( ! myProgress.IsNull() ) myProgress->Show();
+ if ( !myProgress.IsNull() && myThreadId == OSD_Thread::Current())
+ {
+ myProgress->Show();
+ }
}