36 #include <ctkPluginContext.h> 37 #include <vtkRenderWindow.h> 38 #include <vtkRenderWindowInteractor.h> 88 void ViewImplService::init()
103 connect(
settings(), SIGNAL(valueChangedFor(QString)),
this, SLOT(settingsChangedSlot(QString)));
105 const unsigned VIEW_GROUP_COUNT = 5;
107 for (
unsigned i = 0; i < VIEW_GROUP_COUNT; ++i)
110 mViewGroups.push_back(group);
116 mActiveLayout = QStringList() <<
"" <<
"";
120 connect(
this, SIGNAL(
activeViewChanged()),
this, SLOT(updateCameraStyleActions()));
122 this->loadGlobalSettings();
125 this->initializeGlobal2DZoom();
126 this->initializeActiveView();
135 std::vector<ViewGroupPtr> ViewImplService::getViewGroups()
156 void ViewImplService::initializeGlobal2DZoom()
160 for (
unsigned i = 0; i < mViewGroups.size(); ++i)
161 mViewGroups[i]->getData()->initializeGlobal2DZoom(mGlobal2DZoomVal);
164 void ViewImplService::initializeActiveView()
167 connect(mActiveView.get(), SIGNAL(changed()),
this, SIGNAL(
activeViewChanged()));
169 for (
unsigned i = 0; i < mViewGroups.size(); ++i)
170 mViewGroups[i]->initializeActiveView(mActiveView);
176 mCameraControl->refreshView(this->
get3DView(group));
194 bool optimizedViews =
settings()->
value(
"optimizedViews").toBool();
227 for (
unsigned i = 0; i < mViewGroups.size(); ++i)
229 mViewGroups[i]->removeViews();
232 this->setActiveView(
"");
233 mSlicePlanesProxy->clearViewports();
236 mActiveLayout[0] =
"";
240 void ViewImplService::updateViews()
242 for(
unsigned i=0; i<mViewGroups.size(); ++i)
245 for (
unsigned j=0; j<group->getWrappers().size(); ++j)
246 group->getWrappers()[j]->updateView();
250 void ViewImplService::settingsChangedSlot(QString key)
252 if (key ==
"smartRender")
256 if (key ==
"renderingInterval")
260 if (key ==
"renderSpeedLogging")
268 return mInteractiveCropper;
273 CX_ASSERT(mActiveLayout.size() > widgetIndex);
274 return mActiveLayout[widgetIndex];
277 QString ViewImplService::getActiveView()
const 279 return mActiveView->get().value<QString>();
282 void ViewImplService::setActiveView(QString uid)
284 mActiveView->set(uid);
290 QString activeView = mActiveView->value<QString>();
292 for (
unsigned i = 0; i < mViewGroups.size(); ++i)
294 ViewWrapperPtr viewWrapper = mViewGroups[i]->getViewWrapperFromViewUid(activeView);
302 void ViewImplService::addXml(QDomNode& parentNode)
309 QDomElement slicePlanes3DNode = base.addElement(
"slicePlanes3D");
310 slicePlanes3DNode.setAttribute(
"use", mSlicePlanesProxy->getVisible());
311 slicePlanes3DNode.setAttribute(
"opaque", mSlicePlanesProxy->getDrawPlanes());
313 XMLNodeAdder viewGroupsNode(base.addElement(
"viewGroups"));
314 for (
unsigned i = 0; i < mViewGroups.size(); ++i)
316 QDomElement viewGroupNode = viewGroupsNode.
addElement(
"viewGroup");
317 viewGroupNode.setAttribute(
"index", i);
318 mViewGroups[i]->addXml(viewGroupNode);
322 void ViewImplService::parseXml(QDomNode viewmanagerNode)
330 QDomElement slicePlanes3DNode = base.
parseElement(
"slicePlanes3D");
331 mSlicePlanesProxy->setVisible(slicePlanes3DNode.attribute(
"use").toInt());
332 mSlicePlanesProxy->setDrawPlanes(slicePlanes3DNode.attribute(
"opaque").toInt());
334 QDomElement viewgroups = base.
parseElement(
"viewGroups");
335 QDomNode viewgroup = viewgroups.firstChild();
336 while (!viewgroup.isNull())
338 if (viewgroup.toElement().tagName() !=
"viewGroup")
340 viewgroup = viewgroup.nextSibling();
343 int index = viewgroup.toElement().attribute(
"index").toInt();
345 if (index < 0 || index >=
int(mViewGroups.size()))
347 viewgroup = viewgroup.nextSibling();
351 mViewGroups[index]->parseXml(viewgroup);
353 viewgroup = viewgroup.nextSibling();
357 void ViewImplService::clear()
359 for (
unsigned i = 0; i < mViewGroups.size(); ++i)
361 mViewGroups[i]->clearPatientData();
370 std::vector<ViewPtr> views = mViewGroups[group]->getViews();
371 for (
unsigned i = 0; i < views.size(); ++i)
377 if (index == count++)
386 void ViewImplService::deactivateCurrentLayout()
394 for (
unsigned i = 0; i < mViewGroups.size(); ++i)
396 mViewGroups[i]->removeViews();
399 this->setActiveView(
"");
400 mSlicePlanesProxy->clearViewports();
405 if (( groupIdx>=0 )&&( groupIdx < mViewGroups.size() ))
406 return mViewGroups[groupIdx]->getData();
410 unsigned ViewImplService::viewGroupCount()
const 422 if(!mLayoutRepository->exists(layout))
425 CX_ASSERT(mActiveLayout.size() > widgetIndex);
427 if (mActiveLayout[widgetIndex] == layout)
430 mActiveLayout[widgetIndex] = layout;
434 if (!mViewGroups[0]->getViews().empty())
435 this->setActiveView(mViewGroups[0]->getViews()[0]->getUid());
439 QString layoutName = mLayoutRepository->get(layout).getName();
440 report(QString(
"Layout %1 changed to %2").arg(widgetIndex).arg(layoutName));
445 this->deactivateCurrentLayout();
449 LayoutData next = mLayoutRepository->get(mActiveLayout[i]);
454 this->setSlicePlanesProxyInViewsUpTo2DViewgroup();
456 mCameraControl->refreshView(this->
get3DView());
459 void ViewImplService::setSlicePlanesProxyInViewsUpTo2DViewgroup()
464 for (
unsigned i = 0; i < mViewGroups.size(); ++i)
466 bool foundSlice =
false;
467 std::vector<ViewWrapperPtr> wrappers = mViewGroups[i]->getWrappers();
468 for (
unsigned j = 0; j < wrappers.size(); ++j)
470 wrappers[j]->setSlicePlanesProxy(mSlicePlanesProxy);
471 foundSlice = foundSlice || wrappers[j]->getView()->getType() ==
View::VIEW_2D;
485 this->activateView(widget, *iter);
488 void ViewImplService::setRenderingInterval(
int interval)
503 interactor->EnableRenderOff();
505 double rate =
settings()->
value(
"stillUpdateRate").value<
double>();
506 interactor->SetStillUpdateRate(rate);
509 interactor->SetDesiredUpdateRate(rate);
513 CX_LOG_WARNING() <<
"ViewImplService::activateView: got not shared OpenGL context";
522 wrapper->initializePlane(viewData.
mPlane);
531 mInteractiveCropper->setView(view);
549 return mLayoutRepository;
552 void ViewImplService::onLayoutRepositoryChanged(QString uid)
554 this->saveGlobalSettings();
556 bool activeChange = mActiveLayout[0] == uid;
559 mActiveLayout[0] =
"";
564 void ViewImplService::loadGlobalSettings()
567 mLayoutRepository->load(file);
570 void ViewImplService::saveGlobalSettings()
573 mLayoutRepository->save(file);
579 return mCameraStyleInteractor->getInteractorStyleActionGroup();
582 void ViewImplService::updateCameraStyleActions()
585 int index = this->findGroupContaining3DViewGivenGuess(active);
594 mCameraStyleInteractor->connectCameraStyle(group->getData());
595 mCameraControl->setView(this->
get3DView(index, 0));
601 int ViewImplService::findGroupContaining3DViewGivenGuess(
int preferredGroup)
603 if (preferredGroup>=0)
604 if (mViewGroups[preferredGroup]->contains3DView())
605 return preferredGroup;
607 for (
unsigned i=0; i<mViewGroups.size(); ++i)
608 if (mViewGroups[i]->contains3DView())
615 if (
settings()->value(
"Automation/autoShowNewData").toBool() && data)
617 this->autoShowInViewGroups(data);
618 this->autoResetCameraToSuperiorView();
619 this->autoCenterToImageCenter();
625 void ViewImplService::autoShowInViewGroups(
DataPtr data)
628 foreach (
unsigned i, showInViewGroups)
629 this->getViewGroups()[i]->getData()->addDataSorted(data->getUid());
634 QList<unsigned> showInViewGroups;
635 if(
settings()->value(
"Automation/autoShowNewDataInViewGroup0").toBool())
636 showInViewGroups << 0;
637 if(
settings()->value(
"Automation/autoShowNewDataInViewGroup1").toBool())
638 showInViewGroups << 1;
639 if(
settings()->value(
"Automation/autoShowNewDataInViewGroup2").toBool())
640 showInViewGroups << 2;
641 if(
settings()->value(
"Automation/autoShowNewDataInViewGroup3").toBool())
642 showInViewGroups << 3;
643 if(
settings()->value(
"Automation/autoShowNewDataInViewGroup4").toBool())
644 showInViewGroups << 4;
645 return showInViewGroups;
648 void ViewImplService::autoResetCameraToSuperiorView()
650 if(
settings()->value(
"Automation/autoResetCameraToSuperiorViewWhenAutoShowingNewData").toBool())
652 for (
unsigned i=0; i<mViewGroups.size(); ++i)
653 if (mViewGroups[i]->contains3DView())
655 mCameraControl->setView(this->
get3DView(i));
656 mCameraControl->setSuperiorView();
661 void ViewImplService::autoCenterToImageCenter()
663 if(
settings()->value(
"Automation/autoCenterToImageCenterViewWhenAutoShowingNewData").toBool())
667 foreach (
unsigned i, showInViewGroups)
668 this->centerToImageCenterInViewGroup(i);
672 void ViewImplService::centerToImageCenterInViewGroup(
unsigned groupNr)
685 if (!mViewGroups[groupIdx]->getViews().empty())
686 this->setActiveView(mViewGroups[groupIdx]->getViews()[0]->getUid());
689 for(
int i = 0; i < actions.size(); ++i)
691 if (actions[i]->data().toString() ==
enum2string(style))
692 actions[i]->trigger();
702 viewGroup3D->zoomCamera3D(zoomFactor);
707 mLayoutRepository->addDefault(layoutData);
722 this->
getGroup(0)->setRegistrationMode(mode);
737 return this->mClippers;
745 void ViewImplService::onSessionChanged()
748 void ViewImplService::onSessionCleared()
754 void ViewImplService::onSessionLoad(QDomElement& node)
757 QDomElement viewManagerNode = root.
descend(
"managers/viewManager").
node().toElement();
758 if (!viewManagerNode.isNull())
759 this->parseXml(viewManagerNode);
761 mClippers->parseXml(node);
763 void ViewImplService::onSessionSave(QDomElement& node)
766 QDomElement managerNode = root.
descend(
"managers").
node().toElement();
767 this->addXml(managerNode);
768 mClippers->addXml(node);
QString qstring_cast(const T &val)
double parseDoubleFromElementWithDefault(QString name, double defaultValue)
virtual QWidget * getLayoutWidget(int index)
Get the specified layout widget, NULL if not created.
int mGroup
what group to connect to. -1 means not set.
boost::shared_ptr< class CyclicActionLogger > CyclicActionLoggerPtr
cxResource_EXPORT ProfilePtr profile()
boost::shared_ptr< class LayoutRepository > LayoutRepositoryPtr
RenderLoopPtr mRenderLoop
boost::shared_ptr< class ViewGroupData > ViewGroupDataPtr
virtual void zoomCamera3D(int viewGroup3DNumber, int zoomFactor)
void reportError(QString msg)
void isLoading(QDomElement &root)
emitted while loading a session. Xml storage is available, getRootFolder() is set to loaded value...
RenderWindowFactoryPtr mRenderWindowFactory
virtual int getActiveGroupId() const
virtual ViewPtr get3DView(int group=0, int index=0)
ViewDataContainer::iterator iterator
#define CX_ASSERT(statement)
boost::shared_ptr< class CameraControl > CameraControlPtr
XMLNodeAdder descend(QString path)
QDomElement addElement(QString name)
QList< unsigned > getViewGroupsToAutoShowIn()
virtual InteractiveCropperPtr getCropper()
void fps(int number)
Emits number of frames per second.
virtual CyclicActionLoggerPtr getRenderTimer()
vtkSmartPointer< class vtkRenderWindowInteractor > vtkRenderWindowInteractorPtr
virtual ViewGroupDataPtr getGroup(int groupIdx) const
virtual QString getActiveLayout(int widgetIndex=0) const
virtual void enableContextMenuForViews(bool enable=true)
virtual bool renderingIsEnabled() const
boost::shared_ptr< class ViewWrapper > ViewWrapperPtr
virtual void setRegistrationMode(REGISTRATION_STATUS mode)
Use to create all vtkRenderWindows, and store a single shared render window.
static VisServicesPtr create(ctkPluginContext *context)
static SessionStorageServicePtr create(ctkPluginContext *pluginContext)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
virtual void centerToImageCenterInActiveViewGroup()
boost::shared_ptr< class InteractiveCropper > InteractiveCropperPtr
virtual void addDefaultLayout(LayoutData layoutData)
boost::shared_ptr< class View > ViewPtr
boost::shared_ptr< class Clippers > ClippersPtr
std::vector< QPointer< ViewCollectionWidget > > mLayoutWidgets
void pointSampled(Vector3D p_r)
void sessionChanged()
emitted after change to a new session (new or loaded or cleared)
virtual ~ViewImplService()
virtual void autoShowData(DataPtr data)
boost::shared_ptr< ViewWrapper2D > ViewWrapper2DPtr
void renderingEnabledChanged()
emitted then rendering is enabled/disabled
boost::shared_ptr< class Data > DataPtr
virtual LayoutRepositoryPtr getLayoutRepository()
PLANE_TYPE mPlane
ptNOPLANE means 3D
virtual ClippersPtr getClippers()
static SyncedValuePtr create(QVariant val=QVariant())
void layoutChanged(QString uid)
ViewImplService(ctkPluginContext *context)
void fps(int number)
Emits number of frames per second.
virtual void aboutToStop()
QDomElement addTextToElement(QString name, QString text)
XMLNodeParser descend(QString path)
void activeViewChanged()
emitted when the active view changes
Settings * settings()
Shortcut for accessing the settings instance.
void layoutWidgetDestroyed(QObject *object)
void cleared()
emitted when session is cleared, before isLoading is called
virtual QWidget * createLayoutWidget(QWidget *parent, int index)
Get the specified layout widget, create if necessary.
Helper class for managing a set of slice planes.
void activeLayoutChanged()
emitted when the active layout changes
Clipper container. Used by ClippersWidget.
boost::shared_ptr< ViewWrapperVideo > ViewWrapperVideoPtr
boost::shared_ptr< ViewWrapper3D > ViewWrapper3DPtr
virtual NavigationPtr getNavigation(int group=0)
boost::shared_ptr< class ViewGroup > ViewGroupPtr
QString parseTextFromElement(QString name)
virtual CameraControlPtr getCameraControl()
void save()
save entire document.
boost::shared_ptr< class Navigation > NavigationPtr
boost::shared_ptr< class RenderWindowFactory > RenderWindowFactoryPtr
virtual void setCameraStyle(CAMERA_STYLE_TYPE style, int groupIdx)
QString enum2string(const ENUM &val)
void isSaving(QDomElement &root)
xml storage is available
bool getOffScreenRendering() const
Helper class for xml files used to store ssc/cx data.
virtual void setActiveLayout(const QString &uid, int widgetIndex)
virtual void enableRender(bool val)
void pointSampled(Vector3D p_r)
QDomElement parseElement(QString name)
virtual QActionGroup * getInteractorStyleActionGroup()
Namespace for all CustusX production code.