Mercurial > hg > orthanc-stone
comparison Framework/Radiography/RadiographyScene.cpp @ 1279:7ec8fea061b9 broker
integration mainline->broker
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 04 Feb 2020 15:20:08 +0100 |
parents | 0ca50d275b9a 398ea4259e65 |
children | 6ab03e429f06 |
comparison
equal
deleted
inserted
replaced
1271:0ca50d275b9a | 1279:7ec8fea061b9 |
---|---|
123 { | 123 { |
124 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | 124 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
125 } | 125 } |
126 } | 126 } |
127 | 127 |
128 RadiographyLayer& RadiographyScene::RegisterLayer(RadiographyLayer* layer) | 128 void RadiographyScene::_RegisterLayer(RadiographyLayer* layer) |
129 { | 129 { |
130 if (layer == NULL) | |
131 { | |
132 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
133 } | |
134 | |
135 std::auto_ptr<RadiographyLayer> raii(layer); | 130 std::auto_ptr<RadiographyLayer> raii(layer); |
131 | |
132 // LOG(INFO) << "Registering layer: " << countLayers_; | |
136 | 133 |
137 size_t index = nextLayerIndex_++; | 134 size_t index = nextLayerIndex_++; |
138 raii->SetIndex(index); | 135 raii->SetIndex(index); |
139 layers_[index] = raii.release(); | 136 layers_[index] = raii.release(); |
137 } | |
138 | |
139 RadiographyLayer& RadiographyScene::RegisterLayer(RadiographyLayer* layer) | |
140 { | |
141 if (layer == NULL) | |
142 { | |
143 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
144 } | |
145 | |
146 _RegisterLayer(layer); | |
140 | 147 |
141 BroadcastMessage(GeometryChangedMessage(*this, *layer)); | 148 BroadcastMessage(GeometryChangedMessage(*this, *layer)); |
142 BroadcastMessage(ContentChangedMessage(*this, *layer)); | 149 BroadcastMessage(ContentChangedMessage(*this, *layer)); |
143 Register<RadiographyLayer::LayerEditedMessage>(*layer, &RadiographyScene::OnLayerEdited); | 150 Register<RadiographyLayer::LayerEditedMessage>(*layer, &RadiographyScene::OnLayerEdited); |
144 | 151 |
218 delete found->second; | 225 delete found->second; |
219 | 226 |
220 layers_.erase(found); | 227 layers_.erase(found); |
221 | 228 |
222 LOG(INFO) << "Removing layer, there are now : " << layers_.size() << " layers"; | 229 LOG(INFO) << "Removing layer, there are now : " << layers_.size() << " layers"; |
230 | |
231 _OnLayerRemoved(); | |
223 | 232 |
224 BroadcastMessage(RadiographyScene::LayerRemovedMessage(*this, layerIndex)); | 233 BroadcastMessage(RadiographyScene::LayerRemovedMessage(*this, layerIndex)); |
225 } | 234 } |
226 } | 235 } |
227 | 236 |
554 bool applyWindowing) const | 563 bool applyWindowing) const |
555 { | 564 { |
556 // Render layers in the background-to-foreground order | 565 // Render layers in the background-to-foreground order |
557 for (size_t index = 0; index < nextLayerIndex_; index++) | 566 for (size_t index = 0; index < nextLayerIndex_; index++) |
558 { | 567 { |
559 Layers::const_iterator it = layers_.find(index); | 568 try |
560 if (it != layers_.end()) | 569 { |
561 { | 570 Layers::const_iterator it = layers_.find(index); |
562 assert(it->second != NULL); | 571 if (it != layers_.end()) |
563 it->second->Render(buffer, viewTransform, interpolation, windowingCenter_, windowingWidth_, applyWindowing); | 572 { |
573 assert(it->second != NULL); | |
574 it->second->Render(buffer, viewTransform, interpolation, windowingCenter_, windowingWidth_, applyWindowing); | |
575 } | |
576 } | |
577 catch (Orthanc::OrthancException& ex) | |
578 { | |
579 LOG(ERROR) << "RadiographyScene::Render: " << index << ", OrthancException: " << ex.GetDetails(); | |
580 throw ex; // rethrow because we want it to crash to see there's a problem ! | |
581 } | |
582 catch (...) | |
583 { | |
584 LOG(ERROR) << "RadiographyScene::Render: " << index << ", unkown exception: "; | |
585 throw; // rethrow because we want it to crash to see there's a problem ! | |
564 } | 586 } |
565 } | 587 } |
566 } | 588 } |
567 | 589 |
568 | 590 |
635 minValue = 0; | 657 minValue = 0; |
636 maxValue = 0; | 658 maxValue = 0; |
637 } | 659 } |
638 } | 660 } |
639 | 661 |
662 void RadiographyScene::ExtractLayerFromRenderedScene(Orthanc::ImageAccessor& layer, | |
663 const Orthanc::ImageAccessor& renderedScene, | |
664 size_t layerIndex, | |
665 ImageInterpolation interpolation) | |
666 { | |
667 Extent2D sceneExtent = GetSceneExtent(); | |
668 | |
669 double pixelSpacingX = sceneExtent.GetWidth() / renderedScene.GetWidth(); | |
670 double pixelSpacingY = sceneExtent.GetHeight() / renderedScene.GetHeight(); | |
671 | |
672 AffineTransform2D view = AffineTransform2D::Combine( | |
673 AffineTransform2D::CreateScaling(1.0 / pixelSpacingX, 1.0 / pixelSpacingY), | |
674 AffineTransform2D::CreateOffset(-sceneExtent.GetX1(), -sceneExtent.GetY1())); | |
675 | |
676 AffineTransform2D layerToSceneTransform = AffineTransform2D::Combine( | |
677 view, | |
678 GetLayer(layerIndex).GetTransform()); | |
679 | |
680 AffineTransform2D sceneToLayerTransform = AffineTransform2D::Invert(layerToSceneTransform); | |
681 sceneToLayerTransform.Apply(layer, renderedScene, interpolation, false); | |
682 } | |
683 | |
640 Orthanc::Image* RadiographyScene::ExportToImage(double pixelSpacingX, | 684 Orthanc::Image* RadiographyScene::ExportToImage(double pixelSpacingX, |
641 double pixelSpacingY, | 685 double pixelSpacingY, |
642 ImageInterpolation interpolation, | 686 ImageInterpolation interpolation, |
643 bool invert, | 687 bool invert, |
644 int64_t maxValue /* for inversion */, | 688 int64_t maxValue /* for inversion */, |
667 AffineTransform2D view = AffineTransform2D::Combine( | 711 AffineTransform2D view = AffineTransform2D::Combine( |
668 AffineTransform2D::CreateScaling(1.0 / pixelSpacingX, 1.0 / pixelSpacingY), | 712 AffineTransform2D::CreateScaling(1.0 / pixelSpacingX, 1.0 / pixelSpacingY), |
669 AffineTransform2D::CreateOffset(-extent.GetX1(), -extent.GetY1())); | 713 AffineTransform2D::CreateOffset(-extent.GetX1(), -extent.GetY1())); |
670 | 714 |
671 // wipe background before rendering | 715 // wipe background before rendering |
672 Orthanc::ImageProcessing::Set(layers, 0); | 716 if (GetPreferredPhotomotricDisplayMode() == RadiographyPhotometricDisplayMode_Monochrome1) |
717 { | |
718 Orthanc::ImageProcessing::Set(layers, 65535.0f); | |
719 } | |
720 else | |
721 { | |
722 Orthanc::ImageProcessing::Set(layers, 0); | |
723 } | |
673 | 724 |
674 Render(layers, view, interpolation, applyWindowing); | 725 Render(layers, view, interpolation, applyWindowing); |
675 | 726 |
676 std::auto_ptr<Orthanc::Image> rendered(new Orthanc::Image(Orthanc::PixelFormat_Grayscale16, | 727 std::auto_ptr<Orthanc::Image> rendered(new Orthanc::Image(Orthanc::PixelFormat_Grayscale16, |
677 layers.GetWidth(), layers.GetHeight(), false)); | 728 layers.GetWidth(), layers.GetHeight(), false)); |