Mesh: change MeshSegmentAlgorithm::FindSegments to accept shared instead of raw pointers

This commit is contained in:
wmayer
2020-03-03 12:20:42 +01:00
committed by Bernd Hahnebach
parent 4b77f9f3ac
commit a031816de2
8 changed files with 34 additions and 23 deletions

View File

@@ -30,6 +30,7 @@
#endif
#include "Approximation.h"
#include "Elements.h"
#include "Utilities.h"
#include <Base/BoundBox.h>
@@ -97,6 +98,12 @@ void Approximation::AddPoints(const std::list<Base::Vector3f> &points)
_bIsFitted = false;
}
void Approximation::AddPoints(const MeshPointArray &points)
{
std::copy(points.begin(), points.end(), std::back_inserter(_vPoints));
_bIsFitted = false;
}
Base::Vector3f Approximation::GetGravity() const
{
Base::Vector3f clGravity;

View File

@@ -94,6 +94,7 @@ protected:
}
namespace MeshCore {
class MeshPointArray;
/**
* Abstract base class for approximation of a geometry to a given set of points.
@@ -125,6 +126,10 @@ public:
* Add points for the fit algorithm.
*/
void AddPoints(const std::list<Base::Vector3f> &rsPointList);
/**
* Add points for the fit algorithm.
*/
void AddPoints(const MeshPointArray &points);
/**
* Get all added points.
*/

View File

@@ -471,7 +471,7 @@ bool MeshSurfaceVisitor::Visit (const MeshFacet & face, const MeshFacet &,
// --------------------------------------------------------
void MeshSegmentAlgorithm::FindSegments(std::vector<MeshSurfaceSegment*>& segm)
void MeshSegmentAlgorithm::FindSegments(std::vector<MeshSurfaceSegmentPtr>& segm)
{
// reset VISIT flags
unsigned long startFacet;
@@ -487,7 +487,7 @@ void MeshSegmentAlgorithm::FindSegments(std::vector<MeshSurfaceSegment*>& segm)
cAlgo.CountFacetFlag(MeshCore::MeshFacet::VISIT);
std::vector<unsigned long> resetVisited;
for (std::vector<MeshSurfaceSegment*>::iterator it = segm.begin(); it != segm.end(); ++it) {
for (std::vector<MeshSurfaceSegmentPtr>::iterator it = segm.begin(); it != segm.end(); ++it) {
cAlgo.ResetFacetsFlag(resetVisited, MeshCore::MeshFacet::VISIT);
resetVisited.clear();

View File

@@ -27,6 +27,7 @@
#include "Curvature.h"
#include "Visitor.h"
#include <vector>
#include <memory>
namespace MeshCore {
@@ -55,6 +56,7 @@ protected:
std::vector<MeshSegment> segments;
unsigned long minFacets;
};
typedef std::shared_ptr<MeshSurfaceSegment> MeshSurfaceSegmentPtr;
// --------------------------------------------------------
@@ -263,7 +265,7 @@ class MeshExport MeshSegmentAlgorithm
{
public:
MeshSegmentAlgorithm(const MeshKernel& kernel) : myKernel(kernel) {}
void FindSegments(std::vector<MeshSurfaceSegment*>&);
void FindSegments(std::vector<MeshSurfaceSegmentPtr>&);
private:
const MeshKernel& myKernel;

View File

@@ -1804,7 +1804,7 @@ std::vector<Segment> MeshObject::getSegmentsOfType(MeshObject::GeometryType type
return segm;
MeshCore::MeshSegmentAlgorithm finder(this->_kernel);
std::unique_ptr<MeshCore::MeshDistanceSurfaceSegment> surf;
std::shared_ptr<MeshCore::MeshDistanceSurfaceSegment> surf;
switch (type) {
case PLANE:
//surf.reset(new MeshCore::MeshDistancePlanarSegment(this->_kernel, minFacets, dev));
@@ -1824,8 +1824,8 @@ std::vector<Segment> MeshObject::getSegmentsOfType(MeshObject::GeometryType type
}
if (surf.get()) {
std::vector<MeshCore::MeshSurfaceSegment*> surfaces;
surfaces.push_back(surf.get());
std::vector<MeshCore::MeshSurfaceSegmentPtr> surfaces;
surfaces.push_back(surf);
finder.FindSegments(surfaces);
const std::vector<MeshCore::MeshSegment>& data = surf->GetSegments();

View File

@@ -1887,7 +1887,7 @@ PyObject* MeshPy::getSegmentsByCurvature(PyObject *args)
meshCurv.ComputePerVertex();
Py::Sequence func(l);
std::vector<MeshCore::MeshSurfaceSegment*> segm;
std::vector<MeshCore::MeshSurfaceSegmentPtr> segm;
for (Py::Sequence::iterator it = func.begin(); it != func.end(); ++it) {
Py::Tuple t(*it);
float c1 = (float)Py::Float(t[0]);
@@ -1899,13 +1899,13 @@ PyObject* MeshPy::getSegmentsByCurvature(PyObject *args)
#else
int num = (int)Py::Int(t[4]);
#endif
segm.push_back(new MeshCore::MeshCurvatureFreeformSegment(meshCurv.GetCurvature(), num, tol1, tol2, c1, c2));
segm.emplace_back(new MeshCore::MeshCurvatureFreeformSegment(meshCurv.GetCurvature(), num, tol1, tol2, c1, c2));
}
finder.FindSegments(segm);
Py::List list;
for (std::vector<MeshCore::MeshSurfaceSegment*>::iterator segmIt = segm.begin(); segmIt != segm.end(); ++segmIt) {
for (std::vector<MeshCore::MeshSurfaceSegmentPtr>::iterator segmIt = segm.begin(); segmIt != segm.end(); ++segmIt) {
const std::vector<MeshCore::MeshSegment>& data = (*segmIt)->GetSegments();
for (std::vector<MeshCore::MeshSegment>::const_iterator it = data.begin(); it != data.end(); ++it) {
Py::List ary;
@@ -1918,7 +1918,6 @@ PyObject* MeshPy::getSegmentsByCurvature(PyObject *args)
}
list.append(ary);
}
delete (*segmIt);
}
return Py::new_reference_to(list);

View File

@@ -83,23 +83,23 @@ void Segmentation::accept()
MeshCore::MeshCurvature meshCurv(kernel);
meshCurv.ComputePerVertex();
std::vector<MeshCore::MeshSurfaceSegment*> segm;
std::vector<MeshCore::MeshSurfaceSegmentPtr> segm;
if (ui->groupBoxFree->isChecked()) {
segm.push_back(new MeshCore::MeshCurvatureFreeformSegment
segm.emplace_back(new MeshCore::MeshCurvatureFreeformSegment
(meshCurv.GetCurvature(), ui->numFree->value(),
ui->tol1Free->value(), ui->tol2Free->value(),
ui->crv1Free->value(), ui->crv2Free->value()));
}
if (ui->groupBoxCyl->isChecked()) {
segm.push_back(new MeshCore::MeshCurvatureCylindricalSegment
segm.emplace_back(new MeshCore::MeshCurvatureCylindricalSegment
(meshCurv.GetCurvature(), ui->numCyl->value(), ui->tol1Cyl->value(), ui->tol2Cyl->value(), ui->crvCyl->value()));
}
if (ui->groupBoxSph->isChecked()) {
segm.push_back(new MeshCore::MeshCurvatureSphericalSegment
segm.emplace_back(new MeshCore::MeshCurvatureSphericalSegment
(meshCurv.GetCurvature(), ui->numSph->value(), ui->tolSph->value(), ui->crvSph->value()));
}
if (ui->groupBoxPln->isChecked()) {
segm.push_back(new MeshCore::MeshCurvaturePlanarSegment
segm.emplace_back(new MeshCore::MeshCurvaturePlanarSegment
(meshCurv.GetCurvature(), ui->numPln->value(), ui->tolPln->value()));
}
finder.FindSegments(segm);
@@ -114,7 +114,7 @@ void Segmentation::accept()
std::string labelname = "Segments ";
labelname += myMesh->Label.getValue();
group->Label.setValue(labelname);
for (std::vector<MeshCore::MeshSurfaceSegment*>::iterator it = segm.begin(); it != segm.end(); ++it) {
for (std::vector<MeshCore::MeshSurfaceSegmentPtr>::iterator it = segm.begin(); it != segm.end(); ++it) {
const std::vector<MeshCore::MeshSegment>& data = (*it)->GetSegments();
for (std::vector<MeshCore::MeshSegment>::const_iterator jt = data.begin(); jt != data.end(); ++jt) {
Mesh::MeshObject* segment = mesh->meshFromSegment(*jt);
@@ -128,7 +128,6 @@ void Segmentation::accept()
label << feaSegm->Label.getValue() << " (" << (*it)->GetType() << ")";
feaSegm->Label.setValue(label.str());
}
delete (*it);
}
document->commitTransaction();
}

View File

@@ -382,7 +382,7 @@ void SegmentationBestFit::accept()
MeshCore::MeshSegmentAlgorithm finder(kernel);
std::vector<MeshCore::MeshSurfaceSegment*> segm;
std::vector<MeshCore::MeshSurfaceSegmentPtr> segm;
if (ui->groupBoxCyl->isChecked()) {
MeshCore::AbstractSurfaceFit* fitter;
if (cylinderParameter.size() == 7) {
@@ -395,7 +395,7 @@ void SegmentationBestFit::accept()
else {
fitter = new MeshCore::CylinderSurfaceFit;
}
segm.push_back(new MeshCore::MeshDistanceGenericSurfaceFitSegment
segm.emplace_back(new MeshCore::MeshDistanceGenericSurfaceFitSegment
(fitter, kernel, ui->numCyl->value(), ui->tolCyl->value()));
}
if (ui->groupBoxSph->isChecked()) {
@@ -409,7 +409,7 @@ void SegmentationBestFit::accept()
else {
fitter = new MeshCore::SphereSurfaceFit;
}
segm.push_back(new MeshCore::MeshDistanceGenericSurfaceFitSegment
segm.emplace_back(new MeshCore::MeshDistanceGenericSurfaceFitSegment
(fitter, kernel, ui->numSph->value(), ui->tolSph->value()));
}
if (ui->groupBoxPln->isChecked()) {
@@ -423,7 +423,7 @@ void SegmentationBestFit::accept()
else {
fitter = new MeshCore::PlaneSurfaceFit;
}
segm.push_back(new MeshCore::MeshDistanceGenericSurfaceFitSegment
segm.emplace_back(new MeshCore::MeshDistanceGenericSurfaceFitSegment
(fitter, kernel, ui->numPln->value(), ui->tolPln->value()));
}
finder.FindSegments(segm);
@@ -438,7 +438,7 @@ void SegmentationBestFit::accept()
std::string labelname = "Segments ";
labelname += myMesh->Label.getValue();
group->Label.setValue(labelname);
for (std::vector<MeshCore::MeshSurfaceSegment*>::iterator it = segm.begin(); it != segm.end(); ++it) {
for (std::vector<MeshCore::MeshSurfaceSegmentPtr>::iterator it = segm.begin(); it != segm.end(); ++it) {
const std::vector<MeshCore::MeshSegment>& data = (*it)->GetSegments();
for (std::vector<MeshCore::MeshSegment>::const_iterator jt = data.begin(); jt != data.end(); ++jt) {
Mesh::MeshObject* segment = mesh->meshFromSegment(*jt);
@@ -452,7 +452,6 @@ void SegmentationBestFit::accept()
label << feaSegm->Label.getValue() << " (" << (*it)->GetType() << ")";
feaSegm->Label.setValue(label.str());
}
delete (*it);
}
document->commitTransaction();
}