diff --git a/src/Gui/Inventor/SoAutoZoomTranslation.cpp b/src/Gui/Inventor/SoAutoZoomTranslation.cpp index 369b2330b..09887bb32 100644 --- a/src/Gui/Inventor/SoAutoZoomTranslation.cpp +++ b/src/Gui/Inventor/SoAutoZoomTranslation.cpp @@ -62,40 +62,32 @@ void SoAutoZoomTranslation::initClass() SO_NODE_INIT_CLASS(SoAutoZoomTranslation, SoTransformation, "AutoZoom"); } -float SoAutoZoomTranslation::getScaleFactor() +float SoAutoZoomTranslation::getScaleFactor(SoAction* action) const { // Dividing by 5 seems to work well - - Gui::MDIView *mdi = Gui::Application::Instance->activeDocument()->getActiveView(); - if (mdi && mdi->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { - Gui::View3DInventorViewer *viewer = static_cast(mdi)->getViewer(); - float fScale = viewer->getSoRenderManager()->getCamera()->getViewVolume(viewer->getSoRenderManager()->getCamera()->aspectRatio.getValue()).getWorldToScreenScale(SbVec3f(0.f, 0.f, 0.f), 0.1f) / 5; - if (fScale != this->scale) this->touch(); - this->scale = fScale; - return this->scale; - } else { - return this->scale; - } + SbViewVolume vv = SoViewVolumeElement::get(action->getState()); + float aspectRatio = SoViewportRegionElement::get(action->getState()).getViewportAspectRatio(); + float scale = vv.getWorldToScreenScale(SbVec3f(0.f, 0.f, 0.f), 0.1f) / (5*aspectRatio); + return scale; } SoAutoZoomTranslation::SoAutoZoomTranslation() { SO_NODE_CONSTRUCTOR(SoAutoZoomTranslation); //SO_NODE_ADD_FIELD(abPos, (SbVec3f(0.f,0.f,0.f))); - //this->scale = -1; } void SoAutoZoomTranslation::GLRender(SoGLRenderAction * action) -{ - //Base::Console().Log("Draw\n"); - SoAutoZoomTranslation::doAction((SoAction *)action); - inherited::GLRender(action); +{ + //Base::Console().Log("Draw\n"); + SoAutoZoomTranslation::doAction((SoAction *)action); + inherited::GLRender(action); } // Doc in superclass. void SoAutoZoomTranslation::doAction(SoAction * action) { - float sf = this->getScaleFactor(); + float sf = this->getScaleFactor(action); SoModelMatrixElement::scaleBy(action->getState(), this, SbVec3f(sf,sf,sf)); //Base::Console().Log("Scale: %f\n",sf); @@ -114,8 +106,8 @@ void SoAutoZoomTranslation::doAction(SoAction * action) void SoAutoZoomTranslation::getMatrix(SoGetMatrixAction * action) { - //Base::Console().Log("Matrix\n"); - float sf = this->getScaleFactor(); + //Base::Console().Log("Matrix\n"); + float sf = this->getScaleFactor(action); SbVec3f scalevec = SbVec3f(sf,sf,sf); SbMatrix m; @@ -125,30 +117,29 @@ void SoAutoZoomTranslation::getMatrix(SoGetMatrixAction * action) m.setScale(SbVec3f(1.0f / scalevec[0], 1.0f / scalevec[1], 1.0f / scalevec[2])); action->getInverse().multRight(m); - } void SoAutoZoomTranslation::callback(SoCallbackAction * action) { - // Base::Console().Log("callback\n"); - SoAutoZoomTranslation::doAction((SoAction*)action); + // Base::Console().Log("callback\n"); + SoAutoZoomTranslation::doAction((SoAction*)action); } void SoAutoZoomTranslation::getBoundingBox(SoGetBoundingBoxAction * action) { - //Base::Console().Log("getBoundingBox\n"); + //Base::Console().Log("getBoundingBox\n"); SoAutoZoomTranslation::doAction((SoAction*)action); } void SoAutoZoomTranslation::pick(SoPickAction * action) { - //Base::Console().Log("pick\n"); + //Base::Console().Log("pick\n"); SoAutoZoomTranslation::doAction((SoAction*)action); } // Doc in superclass. void SoAutoZoomTranslation::getPrimitiveCount(SoGetPrimitiveCountAction * action) { - //Base::Console().Log("getPrimitiveCount\n"); + //Base::Console().Log("getPrimitiveCount\n"); SoAutoZoomTranslation::doAction((SoAction*)action); } \ No newline at end of file diff --git a/src/Gui/Inventor/SoAutoZoomTranslation.h b/src/Gui/Inventor/SoAutoZoomTranslation.h index 19201018d..954a75eb0 100644 --- a/src/Gui/Inventor/SoAutoZoomTranslation.h +++ b/src/Gui/Inventor/SoAutoZoomTranslation.h @@ -38,7 +38,6 @@ public: static void initClass(); SoAutoZoomTranslation(); //SoSFVec3f abPos; - float getScaleFactor(); protected: virtual ~SoAutoZoomTranslation() {}; @@ -49,9 +48,9 @@ protected: virtual void getBoundingBox(SoGetBoundingBoxAction * action); virtual void callback(SoCallbackAction * action); virtual void pick(SoPickAction * action); + float getScaleFactor(SoAction*) const; private: - float scale; //void setAutoScale(void); }; diff --git a/src/Gui/ViewProviderDocumentObject.cpp b/src/Gui/ViewProviderDocumentObject.cpp index 42235a23b..b0085b8e1 100644 --- a/src/Gui/ViewProviderDocumentObject.cpp +++ b/src/Gui/ViewProviderDocumentObject.cpp @@ -38,6 +38,7 @@ #include "Application.h" #include "Document.h" #include "Selection.h" +#include "MainWindow.h" #include "MDIView.h" #include "TaskView/TaskAppearance.h" #include "ViewProviderDocumentObject.h" @@ -160,7 +161,20 @@ Gui::MDIView* ViewProviderDocumentObject::getActiveView() const { App::Document* pAppDoc = pcObject->getDocument(); Gui::Document* pGuiDoc = Gui::Application::Instance->getDocument(pAppDoc); - return pGuiDoc->getActiveView(); + + MDIView* active = getMainWindow()->activeWindow(); + std::list views = pGuiDoc->getViewsOfViewProvider(const_cast(this)); + + // is the active window a 3d view and does it contain this view provider + std::list::iterator it = std::find(views.begin(), views.end(), active); + if (it != views.end()) + return *it; + // if there is a 3d view containing this view provider return the first one + else if (!views.empty()) + return views.front(); + // no 3d view found containing this view provider + else + return 0; } Gui::MDIView* ViewProviderDocumentObject::getEditingView() const diff --git a/src/Mod/Sketcher/Gui/SoZoomTranslation.cpp b/src/Mod/Sketcher/Gui/SoZoomTranslation.cpp index fb3d87c8a..aa918c3fa 100644 --- a/src/Mod/Sketcher/Gui/SoZoomTranslation.cpp +++ b/src/Mod/Sketcher/Gui/SoZoomTranslation.cpp @@ -60,25 +60,19 @@ void SoZoomTranslation::initClass() SO_NODE_INIT_CLASS(SoZoomTranslation, SoTranslation, "Translation"); } -float SoZoomTranslation::getScaleFactor() +float SoZoomTranslation::getScaleFactor(SoAction* action) const { // Dividing by 5 seems to work well - - Gui::MDIView *mdi = Gui::Application::Instance->activeDocument()->getActiveView(); - if (mdi && mdi->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { - Gui::View3DInventorViewer *viewer = static_cast(mdi)->getViewer(); - this->scale = viewer->getSoRenderManager()->getCamera()->getViewVolume(viewer->getSoRenderManager()->getCamera()->aspectRatio.getValue()).getWorldToScreenScale(SbVec3f(0.f, 0.f, 0.f), 0.1f) / 5; - return this->scale; - } else { - return this->scale; - } + SbViewVolume vv = SoViewVolumeElement::get(action->getState()); + float aspectRatio = SoViewportRegionElement::get(action->getState()).getViewportAspectRatio(); + float scale = vv.getWorldToScreenScale(SbVec3f(0.f, 0.f, 0.f), 0.1f) / (5*aspectRatio); + return scale; } SoZoomTranslation::SoZoomTranslation() { SO_NODE_CONSTRUCTOR(SoZoomTranslation); SO_NODE_ADD_FIELD(abPos, (SbVec3f(0.f,0.f,0.f))); - this->scale = -1; } void SoZoomTranslation::GLRender(SoGLRenderAction * action) @@ -96,7 +90,7 @@ void SoZoomTranslation::doAction(SoAction * action) SbVec3f absVtr = this->abPos.getValue(); SbVec3f relVtr = this->translation.getValue(); - float sf = this->getScaleFactor(); + float sf = this->getScaleFactor(action); // For Sketcher Keep Z value the same relVtr[0] = (relVtr[0] != 0) ? sf * relVtr[0] : 0; relVtr[1] = (relVtr[1] != 0) ? sf * relVtr[1] : 0; @@ -116,7 +110,7 @@ void SoZoomTranslation::getMatrix(SoGetMatrixAction * action) SbVec3f absVtr = this->abPos.getValue(); SbVec3f relVtr = this->translation.getValue(); - float sf = this->getScaleFactor(); + float sf = this->getScaleFactor(action); // For Sketcher Keep Z value the same relVtr[0] = (relVtr[0] != 0) ? sf * relVtr[0] : 0; relVtr[1] = (relVtr[1] != 0) ? sf * relVtr[1] : 0; diff --git a/src/Mod/Sketcher/Gui/SoZoomTranslation.h b/src/Mod/Sketcher/Gui/SoZoomTranslation.h index 40e022c70..7ea0e1343 100644 --- a/src/Mod/Sketcher/Gui/SoZoomTranslation.h +++ b/src/Mod/Sketcher/Gui/SoZoomTranslation.h @@ -38,7 +38,6 @@ public: static void initClass(); SoZoomTranslation(); SoSFVec3f abPos; - float getScaleFactor(); protected: virtual ~SoZoomTranslation() {}; @@ -49,9 +48,7 @@ protected: virtual void getBoundingBox(SoGetBoundingBoxAction * action); virtual void callback(SoCallbackAction * action); virtual void pick(SoPickAction * action); - -private: - float scale; + float getScaleFactor(SoAction * action) const; }; }