From a4f0f5c12921cd2f665c820a726ddcea8b8bd308 Mon Sep 17 00:00:00 2001 From: wmayer Date: Mon, 4 Apr 2016 12:48:58 +0200 Subject: [PATCH] + fix crash when viewer has no camera --- src/Gui/CommandView.cpp | 16 ++++++++++++---- src/Gui/Quarter/SoQTQuarterAdaptor.cpp | 19 +++++++++++++++---- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/Gui/CommandView.cpp b/src/Gui/CommandView.cpp index c148bd64f..80f252b44 100644 --- a/src/Gui/CommandView.cpp +++ b/src/Gui/CommandView.cpp @@ -103,7 +103,9 @@ void StdOrthographicCamera::activated(int iMsg) { if (iMsg == 1) { View3DInventor* view = qobject_cast(getMainWindow()->activeWindow()); - if (view->getViewer()->getSoRenderManager()->getCamera()->getTypeId() != SoOrthographicCamera::getClassTypeId()) + SoCamera* cam = view->getViewer()->getSoRenderManager()->getCamera(); + if (!cam || cam->getTypeId() != SoOrthographicCamera::getClassTypeId()) + doCommand(Command::Gui,"Gui.activeDocument().activeView().setCameraType(\"Orthographic\")"); } } @@ -114,7 +116,9 @@ bool StdOrthographicCamera::isActive(void) if (view) { // update the action group if needed bool check = _pcAction->isChecked(); - bool mode = view->getViewer()->getSoRenderManager()->getCamera()->getTypeId() == SoOrthographicCamera::getClassTypeId(); + SoCamera* cam = view->getViewer()->getSoRenderManager()->getCamera(); + bool mode = cam ? cam->getTypeId() == SoOrthographicCamera::getClassTypeId() : false; + if (mode != check) _pcAction->setChecked(mode); return true; @@ -149,7 +153,9 @@ void StdPerspectiveCamera::activated(int iMsg) { if (iMsg == 1) { View3DInventor* view = qobject_cast(getMainWindow()->activeWindow()); - if (view->getViewer()->getSoRenderManager()->getCamera()->getTypeId() != SoPerspectiveCamera::getClassTypeId()) + SoCamera* cam = view->getViewer()->getSoRenderManager()->getCamera(); + if (!cam || cam->getTypeId() != SoPerspectiveCamera::getClassTypeId()) + doCommand(Command::Gui,"Gui.activeDocument().activeView().setCameraType(\"Perspective\")"); } } @@ -160,7 +166,9 @@ bool StdPerspectiveCamera::isActive(void) if (view) { // update the action group if needed bool check = _pcAction->isChecked(); - bool mode = view->getViewer()->getSoRenderManager()->getCamera()->getTypeId() == SoPerspectiveCamera::getClassTypeId(); + SoCamera* cam = view->getViewer()->getSoRenderManager()->getCamera(); + bool mode = cam ? cam->getTypeId() == SoPerspectiveCamera::getClassTypeId() : false; + if (mode != check) _pcAction->setChecked(mode); diff --git a/src/Gui/Quarter/SoQTQuarterAdaptor.cpp b/src/Gui/Quarter/SoQTQuarterAdaptor.cpp index e5b8fb903..46db13d75 100644 --- a/src/Gui/Quarter/SoQTQuarterAdaptor.cpp +++ b/src/Gui/Quarter/SoQTQuarterAdaptor.cpp @@ -196,19 +196,20 @@ QWidget* SIM::Coin3D::Quarter::SoQTQuarterAdaptor::getGLWidget() const void SIM::Coin3D::Quarter::SoQTQuarterAdaptor::setCameraType(SoType type) { if(!getSoRenderManager()->getCamera()->isOfType(SoPerspectiveCamera::getClassTypeId()) && - !getSoRenderManager()->getCamera()->isOfType(SoOrthographicCamera::getClassTypeId())) { + !getSoRenderManager()->getCamera()->isOfType(SoOrthographicCamera::getClassTypeId())) { Base::Console().Warning("Quarter::setCameraType", "Only SoPerspectiveCamera and SoOrthographicCamera is supported."); return; } + SoCamera* cam = getSoRenderManager()->getCamera(); SoType perspectivetype = SoPerspectiveCamera::getClassTypeId(); - SbBool oldisperspective = getSoRenderManager()->getCamera()->getTypeId().isDerivedFrom(perspectivetype); + SbBool oldisperspective = cam ? cam->getTypeId().isDerivedFrom(perspectivetype) : false; SbBool newisperspective = type.isDerivedFrom(perspectivetype); if((oldisperspective && newisperspective) || - (!oldisperspective && !newisperspective)) // Same old, same old.. + (!oldisperspective && !newisperspective)) // Same old, same old.. return; @@ -506,7 +507,12 @@ void SIM::Coin3D::Quarter::SoQTQuarterAdaptor::seeksensorCB(void* data, SoSensor void SIM::Coin3D::Quarter::SoQTQuarterAdaptor::saveHomePosition(void) { - SoType t = getSoRenderManager()->getCamera()->getTypeId(); + SoCamera* cam = getSoRenderManager()->getCamera(); + if (!cam) { + return; + } + + SoType t = cam->getTypeId(); assert(t.isDerivedFrom(SoNode::getClassTypeId())); assert(t.canCreateInstance()); @@ -522,6 +528,11 @@ void SIM::Coin3D::Quarter::SoQTQuarterAdaptor::saveHomePosition(void) void SIM::Coin3D::Quarter::SoQTQuarterAdaptor::resetToHomePosition(void) { + SoCamera* cam = getSoRenderManager()->getCamera(); + if (!cam) { + return; + } + if(!m_storedcamera) { return; }