diff --git a/src/Mod/Mesh/App/Core/Segmentation.cpp b/src/Mod/Mesh/App/Core/Segmentation.cpp index 9d0d69f325..e862fc32cb 100644 --- a/src/Mod/Mesh/App/Core/Segmentation.cpp +++ b/src/Mod/Mesh/App/Core/Segmentation.cpp @@ -101,6 +101,90 @@ void MeshDistancePlanarSegment::AddFacet(const MeshFacet& face) // -------------------------------------------------------- +PlaneSurfaceFit::PlaneSurfaceFit() + : fitter(new PlaneFit) +{ +} + +PlaneSurfaceFit::~PlaneSurfaceFit() +{ + delete fitter; +} + +void PlaneSurfaceFit::Initialize(const MeshCore::MeshGeomFacet& tria) +{ + fitter->Clear(); + + basepoint = tria.GetGravityPoint(); + normal = tria.GetNormal(); + fitter->AddPoint(tria._aclPoints[0]); + fitter->AddPoint(tria._aclPoints[1]); + fitter->AddPoint(tria._aclPoints[2]); +} + +void PlaneSurfaceFit::AddTriangle(const MeshCore::MeshGeomFacet& tria) +{ + fitter->AddPoint(tria.GetGravityPoint()); +} + +bool PlaneSurfaceFit::Done() const +{ + return fitter->Done(); +} + +float PlaneSurfaceFit::Fit() +{ + return fitter->Fit(); +} + +float PlaneSurfaceFit::GetDistanceToSurface(const Base::Vector3f& pnt) +{ + return fitter->GetDistanceToPlane(pnt); +} + +// -------------------------------------------------------- + +MeshDistanceGenericSurfaceSegment::MeshDistanceGenericSurfaceSegment(AbstractSurfaceFit* fit, + const MeshKernel& mesh, + unsigned long minFacets, + float tol) + : MeshDistanceSurfaceSegment(mesh, minFacets, tol) + , fitter(fit) +{ +} + +MeshDistanceGenericSurfaceSegment::~MeshDistanceGenericSurfaceSegment() +{ + delete fitter; +} + +void MeshDistanceGenericSurfaceSegment::Initialize(unsigned long index) +{ + MeshGeomFacet triangle = kernel.GetFacet(index); + fitter->Initialize(triangle); +} + +bool MeshDistanceGenericSurfaceSegment::TestFacet (const MeshFacet& face) const +{ + if (!fitter->Done()) + fitter->Fit(); + MeshGeomFacet triangle = kernel.GetFacet(face); + for (int i=0; i<3; i++) { + if (fabs(fitter->GetDistanceToSurface(triangle._aclPoints[i])) > tolerance) + return false; + } + + return true; +} + +void MeshDistanceGenericSurfaceSegment::AddFacet(const MeshFacet& face) +{ + MeshGeomFacet triangle = kernel.GetFacet(face); + fitter->AddTriangle(triangle); +} + +// -------------------------------------------------------- + bool MeshCurvaturePlanarSegment::TestFacet (const MeshFacet &rclFacet) const { for (int i=0; i<3; i++) { diff --git a/src/Mod/Mesh/App/Core/Segmentation.h b/src/Mod/Mesh/App/Core/Segmentation.h index 6a6fadc436..33a749ec0a 100644 --- a/src/Mod/Mesh/App/Core/Segmentation.h +++ b/src/Mod/Mesh/App/Core/Segmentation.h @@ -82,6 +82,50 @@ protected: PlaneFit* fitter; }; +class MeshExport AbstractSurfaceFit +{ +public: + AbstractSurfaceFit(){} + virtual ~AbstractSurfaceFit(){} + virtual void Initialize(const MeshGeomFacet&) = 0; + virtual void AddTriangle(const MeshGeomFacet&) = 0; + virtual bool Done() const = 0; + virtual float Fit() = 0; + virtual float GetDistanceToSurface(const Base::Vector3f&) = 0; +}; + +class MeshExport PlaneSurfaceFit : public AbstractSurfaceFit +{ +public: + PlaneSurfaceFit(); + ~PlaneSurfaceFit(); + void Initialize(const MeshGeomFacet&); + void AddTriangle(const MeshGeomFacet&); + bool Done() const; + float Fit(); + float GetDistanceToSurface(const Base::Vector3f&); + +private: + Base::Vector3f basepoint; + Base::Vector3f normal; + PlaneFit* fitter; +}; + +class MeshExport MeshDistanceGenericSurfaceSegment : public MeshDistanceSurfaceSegment +{ +public: + MeshDistanceGenericSurfaceSegment(AbstractSurfaceFit*, const MeshKernel& mesh, + unsigned long minFacets, float tol); + virtual ~MeshDistanceGenericSurfaceSegment(); + bool TestFacet (const MeshFacet& rclFacet) const; + const char* GetType() const { return "Generic"; } + void Initialize(unsigned long); + void AddFacet(const MeshFacet& rclFacet); + +protected: + AbstractSurfaceFit* fitter; +}; + // -------------------------------------------------------- class MeshExport MeshCurvatureSurfaceSegment : public MeshSurfaceSegment diff --git a/src/Mod/Mesh/App/Mesh.cpp b/src/Mod/Mesh/App/Mesh.cpp index a941efde40..56abad9663 100644 --- a/src/Mod/Mesh/App/Mesh.cpp +++ b/src/Mod/Mesh/App/Mesh.cpp @@ -1710,8 +1710,10 @@ std::vector MeshObject::getSegmentsFromType(MeshObject::GeometryType ty std::unique_ptr surf; switch (type) { case PLANE: - surf.reset(new MeshCore::MeshDistancePlanarSegment(this->_kernel, minFacets, dev)); - break; + //surf.reset(new MeshCore::MeshDistancePlanarSegment(this->_kernel, minFacets, dev)); + surf.reset(new MeshCore::MeshDistanceGenericSurfaceSegment(new MeshCore::PlaneSurfaceFit, + this->_kernel, minFacets, dev)); + break; // todo! case CYLINDER: break;