# HG changeset patch # User Sebastien Jodogne # Date 1496149344 -7200 # Node ID a33abae6634467a2743b458e5a4c2da4bc16d98d # Parent d18dcc963930cc302ddb17f3851e2988946e043e scrolling over series diff -r d18dcc963930 -r a33abae66344 Applications/Samples/SingleFrameApplication.h --- a/Applications/Samples/SingleFrameApplication.h Tue May 30 14:09:11 2017 +0200 +++ b/Applications/Samples/SingleFrameApplication.h Tue May 30 15:02:24 2017 +0200 @@ -39,7 +39,15 @@ private: class Interactor : public IWorldSceneInteractor { + private: + SingleFrameApplication& application_; + public: + Interactor(SingleFrameApplication& application) : + application_(application) + { + } + virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, const ViewportGeometry& view, MouseButton button, @@ -73,6 +81,21 @@ KeyboardModifiers modifiers, IStatusBar* statusBar) { + unsigned int scale = (modifiers & KeyboardModifiers_Control ? 10 : 1); + + switch (direction) + { + case MouseWheelDirection_Up: + application_.OffsetSlice(-scale); + break; + + case MouseWheelDirection_Down: + application_.OffsetSlice(scale); + break; + + default: + break; + } } virtual void KeyPressed(WorldSceneWidget& widget, @@ -92,36 +115,68 @@ } }; - virtual void NotifyGeometryReady(const ILayerSource& source) + + void OffsetSlice(int offset) { - // Once the geometry of the series is downloaded from Orthanc, - // display its first slice, and adapt the viewport to fit this - // slice - - const OrthancFrameLayerSource& frame = - dynamic_cast(source); + if (source_ != NULL) + { + int slice = static_cast(slice_) + offset; + + if (slice < 0) + { + slice = 0; + } + + if (slice >= static_cast(source_->GetSliceCount())) + { + slice = source_->GetSliceCount() - 1; + } - if (frame.GetSliceCount() > 0) + if (slice != static_cast(slice_)) + { + SetSlice(slice); + } + } + } + + + void SetSlice(size_t index) + { + if (source_ != NULL && + index < source_->GetSliceCount()) { + slice_ = index; + #if 1 - GeometryToolbox::Print(frame.GetSlice(0).GetGeometry().GetOrigin()); - widget_->SetSlice(frame.GetSlice(0).GetGeometry()); + widget_->SetSlice(source_->GetSlice(slice_).GetGeometry()); #else // TEST for scene extents - Rotate the axes double a = 15.0 / 180.0 * M_PI; Vector x; GeometryToolbox::AssignVector(x, cos(a), sin(a), 0); Vector y; GeometryToolbox::AssignVector(y, -sin(a), cos(a), 0); - GeometryToolbox::Print(frame.GetSlice(0).GetGeometry().GetOrigin()); + GeometryToolbox::Print(source_->GetSlice(slice_).GetGeometry().GetOrigin()); GeometryToolbox::Print(x); GeometryToolbox::Print(y); - SliceGeometry s(frame.GetSlice(0).GetGeometry().GetOrigin(), x, y); + SliceGeometry s(source_->GetSlice(slice_).GetGeometry().GetOrigin(), x, y); widget_->SetSlice(s); #endif - - widget_->SetDefaultView(); } } + + + virtual void NotifyGeometryReady(const ILayerSource& source) + { + // Once the geometry of the series is downloaded from Orthanc, + // display its first slice, and adapt the viewport to fit this + // slice + if (source_ == &source) + { + SetSlice(source_->GetSliceCount() / 2); + } + + widget_->SetDefaultView(); + } virtual void NotifyGeometryError(const ILayerSource& source) { @@ -143,11 +198,15 @@ { } - LayerWidget* widget_; + LayerWidget* widget_; + const OrthancFrameLayerSource* source_; + unsigned int slice_; public: SingleFrameApplication() : - widget_(NULL) + widget_(NULL), + source_(NULL), + slice_(0) { } @@ -187,8 +246,11 @@ #if 1 std::auto_ptr layer - (new OrthancFrameLayerSource(context.GetWebService(), instance, frame)); + (new OrthancFrameLayerSource(context.GetWebService())); + layer->LoadInstance(instance, frame); + //layer->LoadSeries("6f1b492a-e181e200-44e51840-ef8db55e-af529ab6"); layer->Register(*this); + source_ = layer.get(); widget->AddLayer(layer.release()); RenderStyle s; @@ -204,13 +266,20 @@ // 0178023P** // Extent of the CT layer: (-35.068 -20.368) => (34.932 49.632) std::auto_ptr ct; - ct.reset(new OrthancFrameLayerSource(context.GetWebService(), "c804a1a2-142545c9-33b32fe2-3df4cec0-a2bea6d6", 0)); - //ct.reset(new OrthancFrameLayerSource(context.GetWebService(), "4bd4304f-47478948-71b24af2-51f4f1bc-275b6c1b", 0)); // BAD SLICE + ct.reset(new OrthancFrameLayerSource(context.GetWebService())); + //ct->LoadInstance("c804a1a2-142545c9-33b32fe2-3df4cec0-a2bea6d6", 0); + //ct->LoadInstance("4bd4304f-47478948-71b24af2-51f4f1bc-275b6c1b", 0); // BAD SLICE + ct->LoadSeries("dd069910-4f090474-7d2bba07-e5c10783-f9e4fb1d"); + ct->Register(*this); widget->AddLayer(ct.release()); std::auto_ptr pet; - pet.reset(new OrthancFrameLayerSource(context.GetWebService(), "a1c4dc6b-255d27f0-88069875-8daed730-2f5ee5c6", 0)); + pet.reset(new OrthancFrameLayerSource(context.GetWebService())); + //pet->LoadInstance("a1c4dc6b-255d27f0-88069875-8daed730-2f5ee5c6", 0); + pet->LoadSeries("aabad2e7-80702b5d-e599d26c-4f13398e-38d58a9e"); + pet->Register(*this); + source_ = pet.get(); widget->AddLayer(pet.release()); { @@ -227,13 +296,14 @@ s.alpha_ = 0.5; s.applyLut_ = true; s.lut_ = Orthanc::EmbeddedResources::COLORMAP_JET; + s.interpolation_ = ImageInterpolation_Linear; widget->SetLayerStyle(1, s); } #endif widget_ = widget.get(); widget_->SetTransmitMouseOver(true); - widget_->SetInteractor(context.AddInteractor(new Interactor)); + widget_->SetInteractor(context.AddInteractor(new Interactor(*this))); context.SetCentralWidget(widget.release()); } }; diff -r d18dcc963930 -r a33abae66344 Applications/Sdl/SdlEngine.cpp --- a/Applications/Sdl/SdlEngine.cpp Tue May 30 14:09:11 2017 +0200 +++ b/Applications/Sdl/SdlEngine.cpp Tue May 30 15:02:24 2017 +0200 @@ -246,6 +246,9 @@ } } } + + // Small delay to avoid using 100% of CPU + SDL_Delay(1); } } diff -r d18dcc963930 -r a33abae66344 Framework/Layers/OrthancFrameLayerSource.cpp --- a/Framework/Layers/OrthancFrameLayerSource.cpp Tue May 30 14:09:11 2017 +0200 +++ b/Framework/Layers/OrthancFrameLayerSource.cpp Tue May 30 15:02:24 2017 +0200 @@ -66,14 +66,23 @@ LayerSourceBase::NotifyLayerReady(NULL, slice, true); } - OrthancFrameLayerSource::OrthancFrameLayerSource(IWebService& orthanc, - const std::string& instanceId, - unsigned int frame) : - instanceId_(instanceId), - frame_(frame), + + OrthancFrameLayerSource::OrthancFrameLayerSource(IWebService& orthanc) : loader_(*this, orthanc) { - loader_.ScheduleLoadInstance(instanceId_, frame_); + } + + + void OrthancFrameLayerSource::LoadInstance(const std::string& instanceId, + unsigned int frame) + { + loader_.ScheduleLoadInstance(instanceId, frame); + } + + + void OrthancFrameLayerSource::LoadSeries(const std::string& seriesId) + { + loader_.ScheduleLoadSeries(seriesId); } diff -r d18dcc963930 -r a33abae66344 Framework/Layers/OrthancFrameLayerSource.h --- a/Framework/Layers/OrthancFrameLayerSource.h Tue May 30 14:09:11 2017 +0200 +++ b/Framework/Layers/OrthancFrameLayerSource.h Tue May 30 15:02:24 2017 +0200 @@ -32,8 +32,6 @@ private OrthancSlicesLoader::ICallback { private: - std::string instanceId_; - unsigned int frame_; OrthancSlicesLoader loader_; virtual void NotifyGeometryReady(const OrthancSlicesLoader& loader); @@ -52,9 +50,12 @@ SliceImageQuality quality); public: - OrthancFrameLayerSource(IWebService& orthanc, - const std::string& instanceId, - unsigned int frame); + OrthancFrameLayerSource(IWebService& orthanc); + + void LoadInstance(const std::string& instanceId, + unsigned int frame); + + void LoadSeries(const std::string& seriesId); virtual size_t GetSliceCount() const {