diff --git a/src/Mod/Mesh/App/Mesh.cpp b/src/Mod/Mesh/App/Mesh.cpp index ba022cfd81..5864e6d93d 100644 --- a/src/Mod/Mesh/App/Mesh.cpp +++ b/src/Mod/Mesh/App/Mesh.cpp @@ -83,7 +83,7 @@ MeshObject::MeshObject(const MeshObject& mesh) : _Mtrx(mesh._Mtrx),_kernel(mesh._kernel) { // copy the mesh structure - this->_segments = mesh._segments; + copySegments(mesh); } MeshObject::~MeshObject() @@ -161,13 +161,33 @@ Base::BoundBox3d MeshObject::getBoundBox(void)const return Bnd2; } +void MeshObject::copySegments(const MeshObject& mesh) +{ + // After copying the segments the mesh pointers must be adjusted + this->_segments = mesh._segments; + std::for_each(this->_segments.begin(), this->_segments.end(), [this](Segment& s) { + s._mesh = this; + }); +} + +void MeshObject::swapSegments(MeshObject& mesh) +{ + this->_segments.swap(mesh._segments); + std::for_each(this->_segments.begin(), this->_segments.end(), [this](Segment& s) { + s._mesh = this; + }); + std::for_each(mesh._segments.begin(), mesh._segments.end(), [&mesh](Segment& s) { + s._mesh = &mesh; + }); +} + void MeshObject::operator = (const MeshObject& mesh) { if (this != &mesh) { // copy the mesh structure setTransform(mesh._Mtrx); this->_kernel = mesh._kernel; - this->_segments = mesh._segments; + copySegments(mesh); } } @@ -188,7 +208,7 @@ void MeshObject::swap(MeshCore::MeshKernel& Kernel) void MeshObject::swap(MeshObject& mesh) { this->_kernel.Swap(mesh._kernel); - this->_segments.swap(mesh._segments); + swapSegments(mesh); Base::Matrix4D tmp=this->_Mtrx; this->_Mtrx = mesh._Mtrx; mesh._Mtrx = tmp; diff --git a/src/Mod/Mesh/App/Mesh.h b/src/Mod/Mesh/App/Mesh.h index 4ea028fcb9..aa622f382a 100644 --- a/src/Mod/Mesh/App/Mesh.h +++ b/src/Mod/Mesh/App/Mesh.h @@ -386,6 +386,8 @@ private: void updateMesh(const std::vector&); void updateMesh(); void swapKernel(MeshCore::MeshKernel& m, const std::vector& g); + void copySegments(const MeshObject&); + void swapSegments(MeshObject&); private: Base::Matrix4D _Mtrx;