Mesh: change MeshSegmentAlgorithm::FindSegments to accept shared instead of raw pointers
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user