From eb5e791835199ccdee3f7752ac0c900ea72f2ae4 Mon Sep 17 00:00:00 2001 From: wmayer Date: Mon, 16 Oct 2017 20:13:43 +0200 Subject: [PATCH] fixes #0003169: Mesh Design WB tools does not work on translated object --- src/Gui/Utilities.cpp | 17 +++++++++ src/Gui/Utilities.h | 9 +++-- src/Mod/Mesh/Gui/ViewProvider.cpp | 44 ++++++++-------------- src/Mod/Mesh/Gui/ViewProviderCurvature.cpp | 3 ++ 4 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/Gui/Utilities.cpp b/src/Gui/Utilities.cpp index 3faa5bd420..df08844f9d 100644 --- a/src/Gui/Utilities.cpp +++ b/src/Gui/Utilities.cpp @@ -39,12 +39,18 @@ using namespace Gui; ViewVolumeProjection::ViewVolumeProjection (const SbViewVolume &vv) : viewVolume(vv) + , hasTransform(false) { } Base::Vector3f ViewVolumeProjection::operator()(const Base::Vector3f &pt) const { SbVec3f pt3d(pt.x,pt.y,pt.z); + if (hasTransform) { + Base::Vector3f ptt = transform * pt; + pt3d.setValue(ptt.x, ptt.y, ptt.z); + } + viewVolume.projectToScreen(pt3d,pt3d); return Base::Vector3f(pt3d[0],pt3d[1],pt3d[2]); } @@ -79,6 +85,17 @@ Base::Vector3d ViewVolumeProjection::inverse (const Base::Vector3d &pt) const return Base::convertTo(ptf); } +/*! + * \brief This method applies an additional transformation to the input points + * passed with the () operator. + * \param mat + */ +void ViewVolumeProjection::setTransform(const Base::Matrix4D& mat) +{ + transform = mat; + hasTransform = (mat != Base::Matrix4D()); +} + Base::Matrix4D ViewVolumeProjection::getProjectionMatrix () const { // Inventor stores the transposed matrix diff --git a/src/Gui/Utilities.h b/src/Gui/Utilities.h index cf3252ad89..6c42537716 100644 --- a/src/Gui/Utilities.h +++ b/src/Gui/Utilities.h @@ -26,8 +26,8 @@ #include #include #include -#include -#include +#include +#include #include class SbViewVolume; @@ -96,17 +96,20 @@ class GuiExport ViewVolumeProjection : public Base::ViewProjMethod { public: ViewVolumeProjection (const SbViewVolume &vv); - virtual ~ViewVolumeProjection(){}; + virtual ~ViewVolumeProjection(){} Base::Vector3f operator()(const Base::Vector3f &rclPt) const; Base::Vector3d operator()(const Base::Vector3d &rclPt) const; Base::Vector3f inverse (const Base::Vector3f &rclPt) const; Base::Vector3d inverse (const Base::Vector3d &rclPt) const; + void setTransform(const Base::Matrix4D&); Base::Matrix4D getProjectionMatrix () const; protected: SbViewVolume viewVolume; + bool hasTransform; + Base::Matrix4D transform; }; class GuiExport Tessellator diff --git a/src/Mod/Mesh/Gui/ViewProvider.cpp b/src/Mod/Mesh/Gui/ViewProvider.cpp index 69931b4710..860b0756c3 100644 --- a/src/Mod/Mesh/Gui/ViewProvider.cpp +++ b/src/Mod/Mesh/Gui/ViewProvider.cpp @@ -840,6 +840,8 @@ void ViewProviderMesh::clipMeshCallback(void * ud, SoEventCallback * n) SoCamera* cam = view->getSoRenderManager()->getCamera(); SbViewVolume vv = cam->getViewVolume(); Gui::ViewVolumeProjection proj(vv); + proj.setTransform(static_cast(self->getObject())-> + Placement.getValue().toMatrix()); self->cutMesh(clPoly, proj, clip_inner); } } @@ -878,6 +880,8 @@ void ViewProviderMesh::trimMeshCallback(void * ud, SoEventCallback * n) SoCamera* cam = view->getSoRenderManager()->getCamera(); SbViewVolume vv = cam->getViewVolume(); Gui::ViewVolumeProjection proj(vv); + proj.setTransform(static_cast(self->getObject())-> + Placement.getValue().toMatrix()); self->trimMesh(clPoly, proj, clip_inner); } } @@ -909,7 +913,7 @@ void ViewProviderMesh::partMeshCallback(void * ud, SoEventCallback * cb) // get the normal of the front clipping plane SbVec3f b,n; view->getNearPlane(b, n); - Base::Vector3f cPoint(b[0],b[1],b[2]), cNormal(n[0],n[1],n[2]); + Base::Vector3f cNormal(n[0],n[1],n[2]); SoCamera* pCam = view->getSoRenderManager()->getCamera(); SbViewVolume vol = pCam->getViewVolume(); @@ -932,7 +936,11 @@ void ViewProviderMesh::partMeshCallback(void * ud, SoEventCallback * cb) ViewProviderMesh* that = static_cast(*it); if (that->getEditingMode() > -1) { that->finishEditing(); - that->splitMesh(toolMesh, cNormal, clip_inner); + Base::Placement plm = static_cast(that->getObject())->Placement.getValue(); + plm.invert(); + MeshCore::MeshKernel copyToolMesh(toolMesh); + copyToolMesh.Transform(plm.toMatrix()); + that->splitMesh(copyToolMesh, cNormal, clip_inner); } } } @@ -966,7 +974,7 @@ void ViewProviderMesh::segmMeshCallback(void * ud, SoEventCallback * cb) // get the normal of the front clipping plane SbVec3f b,n; view->getNearPlane(b, n); - Base::Vector3f cPoint(b[0],b[1],b[2]), cNormal(n[0],n[1],n[2]); + Base::Vector3f cNormal(n[0],n[1],n[2]); SoCamera* pCam = view->getSoRenderManager()->getCamera(); SbViewVolume vol = pCam->getViewVolume(); @@ -989,7 +997,11 @@ void ViewProviderMesh::segmMeshCallback(void * ud, SoEventCallback * cb) ViewProviderMesh* that = static_cast(*it); if (that->getEditingMode() > -1) { that->finishEditing(); - that->segmentMesh(toolMesh, cNormal, clip_inner); + Base::Placement plm = static_cast(that->getObject())->Placement.getValue(); + plm.invert(); + MeshCore::MeshKernel copyToolMesh(toolMesh); + copyToolMesh.Transform(plm.toMatrix()); + that->segmentMesh(copyToolMesh, cNormal, clip_inner); } } } @@ -1059,7 +1071,6 @@ void ViewProviderMesh::getFacetsFromPolygon(const std::vector& picked, SbBool inner, std::vector& indices) const { -#if 1 const bool ok = true; Base::Polygon2d polygon; for (std::vector::const_iterator it = picked.begin(); it != picked.end(); ++it) @@ -1069,30 +1080,7 @@ void ViewProviderMesh::getFacetsFromPolygon(const std::vector& picked, Mesh::PropertyMeshKernel& meshProp = static_cast(pcObject)->Mesh; MeshCore::MeshAlgorithm cAlg(meshProp.getValue().getKernel()); cAlg.CheckFacets(&proj, polygon, true, indices); -#else - // get the normal of the front clipping plane - SbVec3f b,n; - Viewer.getNearPlane(b, n); - Base::Vector3f cPoint(b[0],b[1],b[2]), cNormal(n[0],n[1],n[2]); - SoCamera* pCam = Viewer.getCamera(); - SbViewVolume vol = pCam->getViewVolume(); - // create a tool shape from these points - std::vector aFaces; - bool ok = ViewProviderMesh::createToolMesh(picked, vol, cNormal, aFaces); - - // Get the attached mesh property - Mesh::PropertyMeshKernel& meshProp = static_cast(pcObject)->Mesh; - - // Get the facet indices inside the tool mesh - MeshCore::MeshKernel cToolMesh; - bool locked = Base::Sequencer().setLocked(true); - cToolMesh = aFaces; - Base::Sequencer().setLocked(locked); - MeshCore::MeshFacetGrid cGrid(meshProp.getValue().getKernel()); - MeshCore::MeshAlgorithm cAlg(meshProp.getValue().getKernel()); - cAlg.GetFacetsFromToolMesh(cToolMesh, cNormal, cGrid, indices); -#endif if (!inner) { // get the indices that are completely outside std::vector complete(meshProp.getValue().countFacets()); diff --git a/src/Mod/Mesh/Gui/ViewProviderCurvature.cpp b/src/Mod/Mesh/Gui/ViewProviderCurvature.cpp index 13a9c61e15..0699a24cbe 100644 --- a/src/Mod/Mesh/Gui/ViewProviderCurvature.cpp +++ b/src/Mod/Mesh/Gui/ViewProviderCurvature.cpp @@ -301,6 +301,9 @@ void ViewProviderMeshCurvature::updateData(const App::Property* prop) Gui::Document* pDoc = Gui::Application::Instance->getDocument(rDoc); ViewProviderMesh* view = static_cast(pDoc->getViewProvider(object)); this->pcLinkRoot->addChild(view->getHighlightNode()); + + Base::Placement p = static_cast(view->getObject())->Placement.getValue(); + ViewProviderMesh::updateTransform(p, pcTransform); } } else if (prop->getTypeId() == Mesh::PropertyCurvatureList::getClassTypeId()) {