comparison Framework/Deprecated/SmartLoader.cpp @ 1068:04a95ee91327 broker

recovery of OrthancStoneSingleFrame
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 15 Oct 2019 19:36:57 +0200
parents b537002f83a9
children 0ca50d275b9a
comparison
equal deleted inserted replaced
1067:05b2e71ed145 1068:04a95ee91327
111 } 111 }
112 112
113 }; 113 };
114 114
115 115
116 SmartLoader::SmartLoader(OrthancApiClient& orthancApiClient) : 116 SmartLoader::SmartLoader(boost::shared_ptr<OrthancApiClient> orthancApiClient) :
117 imageQuality_(SliceImageQuality_FullPam), 117 imageQuality_(SliceImageQuality_FullPam),
118 orthancApiClient_(orthancApiClient) 118 orthancApiClient_(orthancApiClient)
119 { 119 {
120 } 120 }
121 121
129 // (it can not be immediate because Observers needs to register first and this is done after this method returns) 129 // (it can not be immediate because Observers needs to register first and this is done after this method returns)
130 // - if currently loading, we need to return an object that will observe the existing VolumeSlicer and forward 130 // - if currently loading, we need to return an object that will observe the existing VolumeSlicer and forward
131 // the messages to its observables 131 // the messages to its observables
132 // in both cases, we must be carefull about objects lifecycle !!! 132 // in both cases, we must be carefull about objects lifecycle !!!
133 133
134 std::auto_ptr<IVolumeSlicer> layerSource; 134 boost::shared_ptr<IVolumeSlicer> layerSource;
135 std::string sliceKeyId = instanceId + ":" + boost::lexical_cast<std::string>(frame); 135 std::string sliceKeyId = instanceId + ":" + boost::lexical_cast<std::string>(frame);
136 SmartLoader::CachedSlice* cachedSlice = NULL; 136 SmartLoader::CachedSlice* cachedSlice = NULL;
137 137
138 if (cachedSlices_.find(sliceKeyId) != cachedSlices_.end()) // && cachedSlices_[sliceKeyId]->status_ == CachedSliceStatus_Loaded) 138 if (cachedSlices_.find(sliceKeyId) != cachedSlices_.end()) // && cachedSlices_[sliceKeyId]->status_ == CachedSliceStatus_Loaded)
139 { 139 {
140 layerSource.reset(cachedSlices_[sliceKeyId]->Clone()); 140 layerSource.reset(cachedSlices_[sliceKeyId]->Clone());
141 cachedSlice = dynamic_cast<SmartLoader::CachedSlice*>(layerSource.get()); 141 cachedSlice = dynamic_cast<SmartLoader::CachedSlice*>(layerSource.get());
142 } 142 }
143 else 143 else
144 { 144 {
145 layerSource.reset(new DicomSeriesVolumeSlicer(orthancApiClient_)); 145 layerSource.reset(new DicomSeriesVolumeSlicer);
146 dynamic_cast<DicomSeriesVolumeSlicer*>(layerSource.get())->Connect(orthancApiClient_);
146 dynamic_cast<DicomSeriesVolumeSlicer*>(layerSource.get())->SetImageQuality(imageQuality_); 147 dynamic_cast<DicomSeriesVolumeSlicer*>(layerSource.get())->SetImageQuality(imageQuality_);
147 Register<IVolumeSlicer::GeometryReadyMessage>(*layerSource, &SmartLoader::OnLayerGeometryReady); 148 Register<IVolumeSlicer::GeometryReadyMessage>(*layerSource, &SmartLoader::OnLayerGeometryReady);
148 Register<DicomSeriesVolumeSlicer::FrameReadyMessage>(*layerSource, &SmartLoader::OnFrameReady); 149 Register<DicomSeriesVolumeSlicer::FrameReadyMessage>(*layerSource, &SmartLoader::OnFrameReady);
149 Register<IVolumeSlicer::LayerReadyMessage>(*layerSource, &SmartLoader::OnLayerReady); 150 Register<IVolumeSlicer::LayerReadyMessage>(*layerSource, &SmartLoader::OnLayerReady);
150 dynamic_cast<DicomSeriesVolumeSlicer*>(layerSource.get())->LoadFrame(instanceId, frame); 151 dynamic_cast<DicomSeriesVolumeSlicer*>(layerSource.get())->LoadFrame(instanceId, frame);
151 } 152 }
152 153
153 // make sure that the widget registers the events before we trigger them 154 // make sure that the widget registers the events before we trigger them
154 if (sliceViewer.GetLayerCount() == layerIndex) 155 if (sliceViewer.GetLayerCount() == layerIndex)
155 { 156 {
156 sliceViewer.AddLayer(layerSource.release()); 157 sliceViewer.AddLayer(layerSource);
157 } 158 }
158 else if (sliceViewer.GetLayerCount() > layerIndex) 159 else if (sliceViewer.GetLayerCount() > layerIndex)
159 { 160 {
160 sliceViewer.ReplaceLayer(layerIndex, layerSource.release()); 161 sliceViewer.ReplaceLayer(layerIndex, layerSource);
161 } 162 }
162 else 163 else
163 { 164 {
164 throw OrthancStone::StoneException(OrthancStone::ErrorCode_CanOnlyAddOneLayerAtATime); 165 throw OrthancStone::StoneException(OrthancStone::ErrorCode_CanOnlyAddOneLayerAtATime);
165 } 166 }
188 189
189 LOG(WARNING) << "Will preload: " << sliceKeyId; 190 LOG(WARNING) << "Will preload: " << sliceKeyId;
190 191
191 cachedSlices_[sliceKeyId] = boost::shared_ptr<CachedSlice>(cachedSlice); 192 cachedSlices_[sliceKeyId] = boost::shared_ptr<CachedSlice>(cachedSlice);
192 193
193 std::auto_ptr<IVolumeSlicer> layerSource(new DicomSeriesVolumeSlicer(orthancApiClient_)); 194 std::auto_ptr<IVolumeSlicer> layerSource(new DicomSeriesVolumeSlicer);
194 195 dynamic_cast<DicomSeriesVolumeSlicer*>(layerSource.get())->Connect(orthancApiClient_);
195 dynamic_cast<DicomSeriesVolumeSlicer*>(layerSource.get())->SetImageQuality(imageQuality_); 196 dynamic_cast<DicomSeriesVolumeSlicer*>(layerSource.get())->SetImageQuality(imageQuality_);
196 Register<IVolumeSlicer::GeometryReadyMessage>(*layerSource, &SmartLoader::OnLayerGeometryReady); 197 Register<IVolumeSlicer::GeometryReadyMessage>(*layerSource, &SmartLoader::OnLayerGeometryReady);
197 Register<DicomSeriesVolumeSlicer::FrameReadyMessage>(*layerSource, &SmartLoader::OnFrameReady); 198 Register<DicomSeriesVolumeSlicer::FrameReadyMessage>(*layerSource, &SmartLoader::OnFrameReady);
198 Register<IVolumeSlicer::LayerReadyMessage>(*layerSource, &SmartLoader::OnLayerReady); 199 Register<IVolumeSlicer::LayerReadyMessage>(*layerSource, &SmartLoader::OnLayerReady);
199 dynamic_cast<DicomSeriesVolumeSlicer*>(layerSource.get())->LoadFrame(instanceId, frame); 200 dynamic_cast<DicomSeriesVolumeSlicer*>(layerSource.get())->LoadFrame(instanceId, frame);