Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/Volumes/DicomVolumeImageReslicer.cpp @ 1619:4c9e68291467
Added code to remove the wheel callback in dtor, to prevent access to dead object
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Mon, 02 Nov 2020 17:55:35 +0100 |
parents | 8563ea5d8ae4 |
children | 9ac2a65d4172 |
rev | line source |
---|---|
815 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
1270
2d8ab34c8c91
upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
815
diff
changeset
|
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium |
815 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public License |
815 | 9 * as published by the Free Software Foundation, either version 3 of |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
15 * Lesser General Public License for more details. |
1596
4fb8fdf03314
removed annoying whitespace
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
16 * |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
18 * License along with this program. If not, see |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
19 * <http://www.gnu.org/licenses/>. |
815 | 20 **/ |
21 | |
22 | |
23 #include "DicomVolumeImageReslicer.h" | |
24 | |
1455
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1298
diff
changeset
|
25 #include <OrthancException.h> |
815 | 26 |
27 namespace OrthancStone | |
28 { | |
29 class DicomVolumeImageReslicer::Slice : public IVolumeSlicer::IExtractedSlice | |
30 { | |
31 private: | |
32 DicomVolumeImageReslicer& that_; | |
33 CoordinateSystem3D cuttingPlane_; | |
34 | |
35 public: | |
36 Slice(DicomVolumeImageReslicer& that, | |
37 const CoordinateSystem3D& cuttingPlane) : | |
38 that_(that), | |
39 cuttingPlane_(cuttingPlane) | |
40 { | |
41 } | |
42 | |
1571 | 43 virtual bool IsValid() ORTHANC_OVERRIDE |
815 | 44 { |
45 return true; | |
46 } | |
47 | |
1571 | 48 virtual uint64_t GetRevision() ORTHANC_OVERRIDE |
815 | 49 { |
50 return that_.volume_->GetRevision(); | |
51 } | |
52 | |
53 virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator, | |
1571 | 54 const CoordinateSystem3D& cuttingPlane) ORTHANC_OVERRIDE |
815 | 55 { |
56 VolumeReslicer& reslicer = that_.reslicer_; | |
57 | |
58 if (configurator == NULL) | |
59 { | |
60 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, | |
61 "Must provide a layer style configurator"); | |
62 } | |
63 | |
64 reslicer.SetOutputFormat(that_.volume_->GetPixelData().GetFormat()); | |
65 reslicer.Apply(that_.volume_->GetPixelData(), | |
66 that_.volume_->GetGeometry(), | |
67 cuttingPlane); | |
68 | |
69 if (reslicer.IsSuccess()) | |
70 { | |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1270
diff
changeset
|
71 std::unique_ptr<TextureBaseSceneLayer> layer |
815 | 72 (configurator->CreateTextureFromDicom(reslicer.GetOutputSlice(), |
73 that_.volume_->GetDicomParameters())); | |
74 if (layer.get() == NULL) | |
75 { | |
76 return NULL; | |
77 } | |
78 | |
79 double s = reslicer.GetPixelSpacing(); | |
80 layer->SetPixelSpacing(s, s); | |
81 layer->SetOrigin(reslicer.GetOutputExtent().GetX1() + 0.5 * s, | |
82 reslicer.GetOutputExtent().GetY1() + 0.5 * s); | |
83 | |
84 // TODO - Angle!! | |
85 | |
86 return layer.release(); | |
87 } | |
88 else | |
89 { | |
90 return NULL; | |
91 } | |
92 } | |
93 }; | |
94 | |
95 | |
96 DicomVolumeImageReslicer::DicomVolumeImageReslicer(const boost::shared_ptr<DicomVolumeImage>& volume) : | |
97 volume_(volume) | |
98 { | |
99 if (volume.get() == NULL) | |
100 { | |
101 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
102 } | |
103 } | |
104 | |
105 | |
106 IVolumeSlicer::IExtractedSlice* DicomVolumeImageReslicer::ExtractSlice(const CoordinateSystem3D& cuttingPlane) | |
107 { | |
108 if (volume_->HasGeometry()) | |
109 { | |
110 return new Slice(*this, cuttingPlane); | |
111 } | |
112 else | |
113 { | |
114 return new IVolumeSlicer::InvalidSlice; | |
115 } | |
116 } | |
117 } |