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));