From 87f1e93feaf208561e1bd190d7661e9791f1b9bd Mon Sep 17 00:00:00 2001 From: wmayer Date: Mon, 21 May 2012 15:53:46 +0200 Subject: [PATCH] Mesh segmentation --- src/Mod/Mesh/App/Core/Segmentation.h | 6 ++++++ src/Mod/Mesh/Gui/Segmentation.cpp | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Mod/Mesh/App/Core/Segmentation.h b/src/Mod/Mesh/App/Core/Segmentation.h index c894147ad..1b29f4bff 100644 --- a/src/Mod/Mesh/App/Core/Segmentation.h +++ b/src/Mod/Mesh/App/Core/Segmentation.h @@ -41,6 +41,7 @@ public: : minFacets(minFacets) {} virtual ~MeshSurfaceSegment() {} virtual bool TestFacet (const MeshFacet &rclFacet) const = 0; + virtual const char* GetType() const = 0; virtual void Initialize(unsigned long); virtual void AddFacet(const MeshFacet& rclFacet); void AddSegment(const std::vector&); @@ -70,6 +71,7 @@ public: MeshDistancePlanarSegment(const MeshKernel& mesh, unsigned long minFacets, float tol); virtual ~MeshDistancePlanarSegment(); bool TestFacet (const MeshFacet& rclFacet) const; + const char* GetType() const { return "Plane"; } void Initialize(unsigned long); void AddFacet(const MeshFacet& rclFacet); @@ -97,6 +99,7 @@ public: MeshCurvaturePlanarSegment(const std::vector& ci, unsigned long minFacets, float tol) : MeshCurvatureSurfaceSegment(ci, minFacets), tolerance(tol) {} virtual bool TestFacet (const MeshFacet &rclFacet) const; + virtual const char* GetType() const { return "Plane"; } private: float tolerance; @@ -109,6 +112,7 @@ public: float tolMin, float tolMax, float radius) : MeshCurvatureSurfaceSegment(ci, minFacets), toleranceMin(tolMin), toleranceMax(tolMax) { curvature = 1/radius;} virtual bool TestFacet (const MeshFacet &rclFacet) const; + virtual const char* GetType() const { return "Cylinder"; } private: float curvature; @@ -122,6 +126,7 @@ public: MeshCurvatureSphericalSegment(const std::vector& ci, unsigned long minFacets, float tol, float radius) : MeshCurvatureSurfaceSegment(ci, minFacets), tolerance(tol) { curvature = 1/radius;} virtual bool TestFacet (const MeshFacet &rclFacet) const; + virtual const char* GetType() const { return "Sphere"; } private: float curvature; @@ -136,6 +141,7 @@ public: : MeshCurvatureSurfaceSegment(ci, minFacets), c1(c1), c2(c2), toleranceMin(tolMin), toleranceMax(tolMax) {} virtual bool TestFacet (const MeshFacet &rclFacet) const; + virtual const char* GetType() const { return "Freeform"; } private: float c1, c2; diff --git a/src/Mod/Mesh/Gui/Segmentation.cpp b/src/Mod/Mesh/Gui/Segmentation.cpp index 223479c56..de2b81d48 100644 --- a/src/Mod/Mesh/Gui/Segmentation.cpp +++ b/src/Mod/Mesh/Gui/Segmentation.cpp @@ -24,12 +24,14 @@ #include "PreCompiled.h" #ifndef _PreComp_ +# include #endif #include "Segmentation.h" #include "ui_Segmentation.h" #include #include +#include #include #include @@ -89,18 +91,32 @@ void Segmentation::accept() finder.FindSegments(segm); App::Document* document = App::GetApplication().getActiveDocument(); + document->openTransaction("Segmentation"); + + std::string internalname = "Segments_"; + internalname += myMesh->getNameInDocument(); + App::DocumentObjectGroup* group = static_cast(document->addObject + ("App::DocumentObjectGroup", internalname.c_str())); + std::string labelname = "Segments "; + labelname += myMesh->Label.getValue(); + group->Label.setValue(labelname); for (std::vector::iterator it = segm.begin(); it != segm.end(); ++it) { const std::vector& data = (*it)->GetSegments(); for (std::vector::const_iterator jt = data.begin(); jt != data.end(); ++jt) { Mesh::MeshObject* segment = mesh->meshFromSegment(*jt); - Mesh::Feature* feaSegm = static_cast(document->addObject("Mesh::Feature", "Segment")); + Mesh::Feature* feaSegm = static_cast(group->addObject("Mesh::Feature", "Segment")); Mesh::MeshObject* feaMesh = feaSegm->Mesh.startEditing(); feaMesh->swap(*segment); feaSegm->Mesh.finishEditing(); delete segment; + + std::stringstream label; + label << feaSegm->Label.getValue() << " (" << (*it)->GetType() << ")"; + feaSegm->Label.setValue(label.str()); } delete (*it); } + document->commitTransaction(); } void Segmentation::changeEvent(QEvent *e)