# HG changeset patch # User Alain Mazy # Date 1585554661 -7200 # Node ID a72c2c9af49a8c44d7d310715d427e975c90a59c # Parent d4e6cd35107bcd1a4f83b0a5e5946e74c395731c minimal option for GetSceneExtent, especially for masks diff -r d4e6cd35107b -r a72c2c9af49a Framework/Radiography/RadiographyDicomLayer.cpp --- a/Framework/Radiography/RadiographyDicomLayer.cpp Fri Mar 20 12:52:13 2020 +0100 +++ b/Framework/Radiography/RadiographyDicomLayer.cpp Mon Mar 30 09:51:01 2020 +0200 @@ -107,9 +107,9 @@ SetSize(image->GetWidth(), image->GetHeight()); #if __cplusplus < 201103L - source_.reset(raii.release()); + source_.reset(raii.release()); #else - source_ = std::move(raii); + source_ = std::move(raii); #endif ApplyConverter(); diff -r d4e6cd35107b -r a72c2c9af49a Framework/Radiography/RadiographyLayer.cpp --- a/Framework/Radiography/RadiographyLayer.cpp Fri Mar 20 12:52:13 2020 +0100 +++ b/Framework/Radiography/RadiographyLayer.cpp Mon Mar 30 09:51:01 2020 +0200 @@ -238,7 +238,7 @@ } } - Extent2D RadiographyLayer::GetSceneExtent() const + Extent2D RadiographyLayer::GetSceneExtent(bool /*minimal*/) const { Extent2D extent; diff -r d4e6cd35107b -r a72c2c9af49a Framework/Radiography/RadiographyLayer.h --- a/Framework/Radiography/RadiographyLayer.h Fri Mar 20 12:52:13 2020 +0100 +++ b/Framework/Radiography/RadiographyLayer.h Mon Mar 30 09:51:01 2020 +0200 @@ -344,7 +344,7 @@ return height_; } - Extent2D GetSceneExtent() const; + virtual Extent2D GetSceneExtent(bool minimal) const; virtual bool GetPixel(unsigned int& imageX, unsigned int& imageY, diff -r d4e6cd35107b -r a72c2c9af49a Framework/Radiography/RadiographyMaskLayer.cpp --- a/Framework/Radiography/RadiographyMaskLayer.cpp Fri Mar 20 12:52:13 2020 +0100 +++ b/Framework/Radiography/RadiographyMaskLayer.cpp Mon Mar 30 09:51:01 2020 +0200 @@ -75,19 +75,26 @@ BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); } - Extent2D RadiographyMaskLayer::GetMaskMinimalSceneExtent() const + Extent2D RadiographyMaskLayer::GetSceneExtent(bool minimal) const { - Extent2D sceneExtent; - - for (auto corner: corners_) + if (!minimal) { - double x = static_cast(corner.GetX()); - double y = static_cast(corner.GetY()); + return RadiographyLayer::GetSceneExtent(minimal); + } + else + { // get the extent of the in-mask area + Extent2D sceneExtent; - dicomLayer_.GetTransform().Apply(x, y); - sceneExtent.AddPoint(x, y); + for (std::vector::const_iterator& corner = corners_.begin(); corner != corners_.end(); corner++) + { + double x = static_cast(corner->GetX()); + double y = static_cast(corner->GetY()); + + dicomLayer_.GetTransform().Apply(x, y); + sceneExtent.AddPoint(x, y); + } + return sceneExtent; } - return sceneExtent; } diff -r d4e6cd35107b -r a72c2c9af49a Framework/Radiography/RadiographyMaskLayer.h --- a/Framework/Radiography/RadiographyMaskLayer.h Fri Mar 20 12:52:13 2020 +0100 +++ b/Framework/Radiography/RadiographyMaskLayer.h Mon Mar 30 09:51:01 2020 +0200 @@ -100,7 +100,7 @@ cpScene = cp; } - Extent2D GetMaskMinimalSceneExtent() const; + virtual Extent2D GetSceneExtent(bool minimal) const; virtual bool GetDefaultWindowing(float& center, float& width) const diff -r d4e6cd35107b -r a72c2c9af49a Framework/Radiography/RadiographyScene.cpp --- a/Framework/Radiography/RadiographyScene.cpp Fri Mar 20 12:52:13 2020 +0100 +++ b/Framework/Radiography/RadiographyScene.cpp Mon Mar 30 09:51:01 2020 +0200 @@ -334,7 +334,7 @@ // modify geometry to reference the top left corner double tlx = centerGeometry->GetPanX(); double tly = centerGeometry->GetPanY(); - Extent2D textExtent = alpha->GetSceneExtent(); + Extent2D textExtent = alpha->GetSceneExtent(false); tlx = tlx - (textExtent.GetWidth() / 2) * centerGeometry->GetPixelSpacingX(); tly = tly - (textExtent.GetHeight() / 2) * centerGeometry->GetPixelSpacingY(); centerGeometry->SetPan(tlx, tly); @@ -543,7 +543,7 @@ } - Extent2D RadiographyScene::GetSceneExtent() const + Extent2D RadiographyScene::GetSceneExtent(bool minimal) const { Extent2D extent; @@ -551,7 +551,7 @@ it != layers_.end(); ++it) { assert(it->second != NULL); - extent.Union(it->second->GetSceneExtent()); + extent.Union(it->second->GetSceneExtent(minimal)); } return extent; @@ -663,9 +663,10 @@ void RadiographyScene::ExtractLayerFromRenderedScene(Orthanc::ImageAccessor& layer, const Orthanc::ImageAccessor& renderedScene, size_t layerIndex, + bool isCropped, ImageInterpolation interpolation) { - Extent2D sceneExtent = GetSceneExtent(); + Extent2D sceneExtent = GetSceneExtent(isCropped); double pixelSpacingX = sceneExtent.GetWidth() / renderedScene.GetWidth(); double pixelSpacingY = sceneExtent.GetHeight() / renderedScene.GetHeight(); @@ -687,6 +688,7 @@ ImageInterpolation interpolation, bool invert, int64_t maxValue /* for inversion */, + bool autoCrop, bool applyWindowing) { if (pixelSpacingX <= 0 || @@ -695,7 +697,7 @@ throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); } - Extent2D extent = GetSceneExtent(); + Extent2D extent = GetSceneExtent(autoCrop); int w = boost::math::iround(extent.GetWidth() / pixelSpacingX); int h = boost::math::iround(extent.GetHeight() / pixelSpacingY); @@ -742,11 +744,12 @@ double pixelSpacingX, double pixelSpacingY, bool invert, + bool autoCrop, ImageInterpolation interpolation) { LOG(INFO) << "Exporting RadiographyScene to DICOM"; - std::unique_ptr rendered(ExportToImage(pixelSpacingX, pixelSpacingY, interpolation, false)); // note: we don't invert the image in the pixels data because we'll set the PhotometricDisplayMode correctly in the DICOM tags + std::unique_ptr rendered(ExportToImage(pixelSpacingX, pixelSpacingY, interpolation, autoCrop, false)); // note: we don't invert the image in the pixels data because we'll set the PhotometricDisplayMode correctly in the DICOM tags createDicomRequestContent["Tags"] = dicomTags; @@ -795,13 +798,14 @@ double pixelSpacingX, double pixelSpacingY, bool invert, + bool autoCrop, ImageInterpolation interpolation, bool usePam) { LOG(INFO) << "Exporting RadiographyScene to DICOM"; VLOG(1) << "Exporting RadiographyScene to: export to image"; - std::unique_ptr rendered(ExportToCreateDicomRequestAndImage(createDicomRequestContent, dicomTags, parentOrthancId, pixelSpacingX, pixelSpacingY, invert, interpolation)); + std::unique_ptr rendered(ExportToCreateDicomRequestAndImage(createDicomRequestContent, dicomTags, parentOrthancId, pixelSpacingX, pixelSpacingY, invert, autoCrop, interpolation)); // convert the image into base64 for inclusing in the createDicomRequest std::string base64; @@ -840,12 +844,13 @@ double pixelSpacingX, double pixelSpacingY, bool invert, + bool autoCrop, ImageInterpolation interpolation, bool usePam) { Json::Value createDicomRequestContent; - ExportToCreateDicomRequest(createDicomRequestContent, dicomTags, parentOrthancId, pixelSpacingX, pixelSpacingY, invert, interpolation, usePam); + ExportToCreateDicomRequest(createDicomRequestContent, dicomTags, parentOrthancId, pixelSpacingX, pixelSpacingY, invert, autoCrop, interpolation, usePam); orthanc.PostJsonAsyncExpectJson( "/tools/create-dicom", createDicomRequestContent, @@ -864,6 +869,7 @@ double pixelSpacingX, double pixelSpacingY, bool invert, + bool autoCrop, ImageInterpolation interpolation, bool usePam) { @@ -883,7 +889,7 @@ } } - ExportDicom(orthanc, jsonTags, parentOrthancId, pixelSpacingX, pixelSpacingY, invert, interpolation, usePam); + ExportDicom(orthanc, jsonTags, parentOrthancId, pixelSpacingX, pixelSpacingY, invert, autoCrop, interpolation, usePam); } void RadiographyScene::OnDicomExported(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) diff -r d4e6cd35107b -r a72c2c9af49a Framework/Radiography/RadiographyScene.h --- a/Framework/Radiography/RadiographyScene.h Fri Mar 20 12:52:13 2020 +0100 +++ b/Framework/Radiography/RadiographyScene.h Mon Mar 30 09:51:01 2020 +0200 @@ -280,7 +280,7 @@ void GetLayersIndexes(std::vector& output) const; - virtual Extent2D GetSceneExtent() const; + virtual Extent2D GetSceneExtent(bool minimal) const; virtual void Render(Orthanc::ImageAccessor& buffer, const AffineTransform2D& viewTransform, @@ -306,6 +306,7 @@ double pixelSpacingX, double pixelSpacingY, bool invert, + bool autoCrop, ImageInterpolation interpolation, bool usePam); @@ -315,6 +316,7 @@ double pixelSpacingX, double pixelSpacingY, bool invert, + bool autoCrop, ImageInterpolation interpolation, bool usePam); @@ -324,6 +326,7 @@ double pixelSpacingX, double pixelSpacingY, bool invert, + bool autoCrop, ImageInterpolation interpolation, bool usePam); @@ -333,14 +336,16 @@ double pixelSpacingX, double pixelSpacingY, bool invert, + bool autoCrop, ImageInterpolation interpolation); Orthanc::Image* ExportToImage(double pixelSpacingX, double pixelSpacingY, ImageInterpolation interpolation, + bool autoCrop, bool applyWindowing) { - return ExportToImage(pixelSpacingX, pixelSpacingY, interpolation, false, 0, applyWindowing); + return ExportToImage(pixelSpacingX, pixelSpacingY, interpolation, false, 0, autoCrop, applyWindowing); } Orthanc::Image* ExportToImage(double pixelSpacingX, @@ -348,11 +353,13 @@ ImageInterpolation interpolation, bool invert, int64_t maxValue /* for inversion */, + bool autoCrop, bool applyWindowing); void ExtractLayerFromRenderedScene(Orthanc::ImageAccessor& layer, const Orthanc::ImageAccessor& renderedScene, size_t layerIndex, + bool isCropped, ImageInterpolation interpolation); }; } diff -r d4e6cd35107b -r a72c2c9af49a Framework/Radiography/RadiographyWidget.h --- a/Framework/Radiography/RadiographyWidget.h Fri Mar 20 12:52:13 2020 +0100 +++ b/Framework/Radiography/RadiographyWidget.h Mon Mar 30 09:51:01 2020 +0200 @@ -53,7 +53,7 @@ protected: virtual Extent2D GetSceneExtent() { - return scene_->GetSceneExtent(); + return scene_->GetSceneExtent(false); } virtual bool RenderScene(CairoContext& context,