Loading files
// Created on: 2016-04-19
// Copyright (c) 2016 OPEN CASCADE SAS
// Created by: Oleg AGASHIN
//
// 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.
#include <BRepMesh_FaceDiscret.hxx>
#include <NCollection_LinearVector.hxx>
#include <IMeshData_Model.hxx>
#include <IMeshData_Wire.hxx>
#include <IMeshData_Edge.hxx>
#include <IMeshTools_MeshAlgo.hxx>
#include <OSD_Parallel.hxx>
IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_FaceDiscret, IMeshTools_ModelAlgo)
//=================================================================================================
BRepMesh_FaceDiscret::BRepMesh_FaceDiscret(
const occ::handle<IMeshTools_MeshAlgoFactory>& theAlgoFactory)
: myAlgoFactory(theAlgoFactory)
{
}
//=================================================================================================
BRepMesh_FaceDiscret::~BRepMesh_FaceDiscret() = default;
//! Auxiliary functor for parallel processing of Faces.
class BRepMesh_FaceDiscret::FaceListFunctor
{
public:
FaceListFunctor(BRepMesh_FaceDiscret* theAlgo, const Message_ProgressRange& theRange)
: myAlgo(theAlgo),
myScope(theRange, "Face Discret", theAlgo->myModel->FacesNb())
{
myRanges.Reserve(theAlgo->myModel->FacesNb());
for (int aFaceIter = 0; aFaceIter < theAlgo->myModel->FacesNb(); ++aFaceIter)
{
myRanges.Append(myScope.Next());
}
}
void operator()(const int theFaceIndex) const
{
if (!myScope.More())
{
return;
}
Message_ProgressScope aFaceScope(myRanges[theFaceIndex], nullptr, 1);
myAlgo->process(theFaceIndex, aFaceScope.Next());
}
private:
mutable BRepMesh_FaceDiscret* myAlgo;
Message_ProgressScope myScope;
NCollection_LinearVector<Message_ProgressRange> myRanges;
};
//=================================================================================================
bool BRepMesh_FaceDiscret::performInternal(const occ::handle<IMeshData_Model>& theModel,
const IMeshTools_Parameters& theParameters,
const Message_ProgressRange& theRange)
{
myModel = theModel;
myParameters = theParameters;
if (myModel.IsNull())
{
return false;
}
FaceListFunctor aFunctor(this, theRange);
OSD_Parallel::For(0,
myModel->FacesNb(),
aFunctor,
!myParameters.InParallel || myModel->FacesNb() <= 1);
if (!theRange.More())
{
return false;
}
myModel.Nullify(); // Do not hold link to model.
return true;
}
//=================================================================================================
void BRepMesh_FaceDiscret::process(const int theFaceIndex,
const Message_ProgressRange& theRange) const
{
const IMeshData::IFaceHandle& aDFace = myModel->GetFace(theFaceIndex);
if (aDFace->IsSet(IMeshData_Failure) || aDFace->IsSet(IMeshData_Reused))
{
return;
}
try
{
OCC_CATCH_SIGNALS
occ::handle<IMeshTools_MeshAlgo> aMeshingAlgo =
myAlgoFactory->GetAlgo(aDFace->GetSurface()->GetType(), myParameters);
if (aMeshingAlgo.IsNull())
{
aDFace->SetStatus(IMeshData_Failure);
return;
}
if (!theRange.More())
{
aDFace->SetStatus(IMeshData_UserBreak);
return;
}
aMeshingAlgo->Perform(aDFace, myParameters, theRange);
}
catch (Standard_Failure const&)
{
aDFace->SetStatus(IMeshData_Failure);
}
}
3d097a032This file is pinned to the selected release. Download the original to open it in your design tool.