Mercurial > hg > orthanc-stone
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); |