comparison Framework/Layers/SingleFrameRendererFactory.cpp @ 32:517c46f527cd

sync
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 19 Dec 2016 11:00:23 +0100
parents 9aace933cb64
children 6465fbd23bce
comparison
equal deleted inserted replaced
31:9aace933cb64 32:517c46f527cd
33 #include "SingleFrameRendererFactory.h" 33 #include "SingleFrameRendererFactory.h"
34 34
35 #include "FrameRenderer.h" 35 #include "FrameRenderer.h"
36 #include "../Messaging/MessagingToolbox.h" 36 #include "../Messaging/MessagingToolbox.h"
37 #include "../../Resources/Orthanc/Core/OrthancException.h" 37 #include "../../Resources/Orthanc/Core/OrthancException.h"
38 #include "../../Resources/Orthanc/Plugins/Samples/Common/FullOrthancDataset.h"
39 #include "../../Resources/Orthanc/Plugins/Samples/Common/DicomDatasetReader.h"
38 #include "../Toolbox/DicomFrameConverter.h" 40 #include "../Toolbox/DicomFrameConverter.h"
39 41
40 namespace OrthancStone 42 namespace OrthancStone
41 { 43 {
42 SingleFrameRendererFactory::SingleFrameRendererFactory(OrthancPlugins::IOrthancConnection& orthanc, 44 SingleFrameRendererFactory::SingleFrameRendererFactory(OrthancPlugins::IOrthancConnection& orthanc,
43 const std::string& instanceId, 45 const std::string& instanceId,
44 unsigned int frame) : 46 unsigned int frame) :
45 orthanc_(orthanc), 47 orthanc_(orthanc),
46 dicom_(orthanc, instanceId),
47 instance_(instanceId), 48 instance_(instanceId),
48 frame_(frame) 49 frame_(frame)
49 { 50 {
51 dicom_.reset(new OrthancPlugins::FullOrthancDataset(orthanc, "/instances/" + instanceId + "/tags"));
52
50 DicomFrameConverter converter; 53 DicomFrameConverter converter;
51 converter.ReadParameters(dicom_); 54 converter.ReadParameters(*dicom_);
52 format_ = converter.GetExpectedPixelFormat(); 55 format_ = converter.GetExpectedPixelFormat();
53 }
54
55
56 SliceGeometry SingleFrameRendererFactory::GetSliceGeometry()
57 {
58 if (dicom_.HasTag(DICOM_TAG_IMAGE_POSITION_PATIENT) &&
59 dicom_.HasTag(DICOM_TAG_IMAGE_ORIENTATION_PATIENT))
60 {
61 return SliceGeometry(dicom_);
62 }
63 else
64 {
65 return SliceGeometry();
66 }
67 } 56 }
68 57
69 58
70 bool SingleFrameRendererFactory::GetExtent(double& x1, 59 bool SingleFrameRendererFactory::GetExtent(double& x1,
71 double& y1, 60 double& y1,
73 double& y2, 62 double& y2,
74 const SliceGeometry& viewportSlice) 63 const SliceGeometry& viewportSlice)
75 { 64 {
76 // Assume that PixelSpacingX == PixelSpacingY == 1 65 // Assume that PixelSpacingX == PixelSpacingY == 1
77 66
78 unsigned int width = dicom_.GetUnsignedIntegerValue(DICOM_TAG_COLUMNS); 67 OrthancPlugins::DicomDatasetReader reader(*dicom_);
79 unsigned int height = dicom_.GetUnsignedIntegerValue(DICOM_TAG_ROWS); 68
69 unsigned int width, height;
70
71 if (!reader.GetUnsignedIntegerValue(width, OrthancPlugins::DICOM_TAG_COLUMNS) ||
72 !reader.GetUnsignedIntegerValue(height, OrthancPlugins::DICOM_TAG_ROWS))
73 {
74 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
75 }
80 76
81 x1 = 0; 77 x1 = 0;
82 y1 = 0; 78 y1 = 0;
83 x2 = static_cast<double>(width); 79 x2 = static_cast<double>(width);
84 y2 = static_cast<double>(height); 80 y2 = static_cast<double>(height);
87 } 83 }
88 84
89 85
90 ILayerRenderer* SingleFrameRendererFactory::CreateLayerRenderer(const SliceGeometry& viewportSlice) 86 ILayerRenderer* SingleFrameRendererFactory::CreateLayerRenderer(const SliceGeometry& viewportSlice)
91 { 87 {
92 SliceGeometry frameSlice(dicom_); 88 SliceGeometry frameSlice(*dicom_);
93 return FrameRenderer::CreateRenderer(MessagingToolbox::DecodeFrame(orthanc_, instance_, frame_, format_), 89 return FrameRenderer::CreateRenderer(MessagingToolbox::DecodeFrame(orthanc_, instance_, frame_, format_),
94 viewportSlice, frameSlice, dicom_, 1, 1, true); 90 viewportSlice, frameSlice, *dicom_, 1, 1, true);
95 } 91 }
96 92
97 93
98 ISliceableVolume& SingleFrameRendererFactory::GetSourceVolume() const 94 ISliceableVolume& SingleFrameRendererFactory::GetSourceVolume() const
99 { 95 {