Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/Toolbox/DicomStructureSet.cpp @ 2177:4d21befb1501 default tip
clarify DICOMweb version check
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 23 Oct 2024 19:27:56 +0200 |
parents | 917e40af6b45 |
children |
rev | line source |
---|---|
0 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
2124
16c01cc201e7
updated copyright, as Osimis is not active on Orthanc anymore
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2114
diff
changeset
|
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium |
2114
c23eef785569
update year to 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2077
diff
changeset
|
6 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
0 | 7 * |
8 * 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
|
9 * modify it under the terms of the GNU Lesser General Public License |
47 | 10 * as published by the Free Software Foundation, either version 3 of |
11 * the License, or (at your option) any later version. | |
0 | 12 * |
13 * This program is distributed in the hope that it will be useful, but | |
14 * 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
|
15 * 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
|
16 * Lesser General Public License for more details. |
1596
4fb8fdf03314
removed annoying whitespace
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
17 * |
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
|
18 * 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
|
19 * 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
|
20 * <http://www.gnu.org/licenses/>. |
0 | 21 **/ |
22 | |
23 | |
1898
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
24 #define USE_BOOST_UNION_FOR_POLYGONS 0 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
25 |
0 | 26 #include "DicomStructureSet.h" |
27 | |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
28 #include "BucketAccumulator2D.h" |
1895
14c8f339d480
removed redundant definitions Point2D, Point3D and Vector3D from DicomStructureSetUtils.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1893
diff
changeset
|
29 #include "GenericToolbox.h" |
14c8f339d480
removed redundant definitions Point2D, Point3D and Vector3D from DicomStructureSetUtils.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1893
diff
changeset
|
30 #include "GeometryToolbox.h" |
14c8f339d480
removed redundant definitions Point2D, Point3D and Vector3D from DicomStructureSetUtils.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1893
diff
changeset
|
31 #include "OrthancDatasets/DicomDatasetReader.h" |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
32 |
1455
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1279
diff
changeset
|
33 #include <Logging.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1279
diff
changeset
|
34 #include <OrthancException.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1279
diff
changeset
|
35 #include <Toolbox.h> |
113
2eca030792aa
using the Orthanc Framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
110
diff
changeset
|
36 |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
37 #if defined(_MSC_VER) |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
38 # pragma warning(push) |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
39 # pragma warning(disable:4244) |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
40 #endif |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
41 |
1751
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
42 #if STONE_TIME_BLOCKING_OPS |
1895
14c8f339d480
removed redundant definitions Point2D, Point3D and Vector3D from DicomStructureSetUtils.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1893
diff
changeset
|
43 # include <boost/date_time/posix_time/posix_time.hpp> |
1751
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
44 #endif |
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
45 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
46 #if !defined(USE_BOOST_UNION_FOR_POLYGONS) |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
47 # error Macro USE_BOOST_UNION_FOR_POLYGONS must be defined |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
48 #endif |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
49 |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
50 #include <limits> |
0 | 51 #include <stdio.h> |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
52 #include <boost/math/constants/constants.hpp> |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
53 |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
54 #if USE_BOOST_UNION_FOR_POLYGONS == 1 |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
55 # include <boost/geometry.hpp> |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
56 # include <boost/geometry/geometries/point_xy.hpp> |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
57 # include <boost/geometry/geometries/polygon.hpp> |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
58 # include <boost/geometry/multi/geometries/multi_polygon.hpp> |
1898
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
59 #else |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
60 # include "UnionOfRectangles.h" |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
61 #endif |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
62 |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
63 #if defined(_MSC_VER) |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
64 # pragma warning(pop) |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
65 #endif |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
66 |
1180
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
67 #if ORTHANC_ENABLE_DCMTK == 1 |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
68 # include "ParsedDicomDataset.h" |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
69 #endif |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
70 |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
71 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
72 #if USE_BOOST_UNION_FOR_POLYGONS == 1 |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
73 |
1895
14c8f339d480
removed redundant definitions Point2D, Point3D and Vector3D from DicomStructureSetUtils.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1893
diff
changeset
|
74 typedef boost::geometry::model::d2::point_xy<double> BoostPoint; |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
75 typedef boost::geometry::model::polygon<BoostPoint> BoostPolygon; |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
76 typedef boost::geometry::model::multi_polygon<BoostPolygon> BoostMultiPolygon; |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
77 |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
78 static void Union(BoostMultiPolygon& output, |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
79 std::vector<BoostPolygon>& input) |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
80 { |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
81 for (size_t i = 0; i < input.size(); i++) |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
82 { |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
83 boost::geometry::correct(input[i]); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
84 } |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
85 |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
86 if (input.size() == 0) |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
87 { |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
88 output.clear(); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
89 } |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
90 else if (input.size() == 1) |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
91 { |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
92 output.resize(1); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
93 output[0] = input[0]; |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
94 } |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
95 else |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
96 { |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
97 boost::geometry::union_(input[0], input[1], output); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
98 |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
99 for (size_t i = 0; i < input.size(); i++) |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
100 { |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
101 BoostMultiPolygon tmp; |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
102 boost::geometry::union_(output, input[i], tmp); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
103 output = tmp; |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
104 } |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
105 } |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
106 } |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
107 |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
108 static BoostPolygon CreateRectangle(float x1, float y1, |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
109 float x2, float y2) |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
110 { |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
111 BoostPolygon r; |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
112 boost::geometry::append(r, BoostPoint(x1, y1)); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
113 boost::geometry::append(r, BoostPoint(x1, y2)); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
114 boost::geometry::append(r, BoostPoint(x2, y2)); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
115 boost::geometry::append(r, BoostPoint(x2, y1)); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
116 return r; |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
117 } |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
118 |
1908
affde38b84de
moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1905
diff
changeset
|
119 #endif |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
120 |
0 | 121 |
122 namespace OrthancStone | |
123 { | |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
124 static const Orthanc::DicomTag DICOM_TAG_CONTOUR_DATA(0x3006, 0x0050); |
1504 | 125 static const Orthanc::DicomTag DICOM_TAG_CONTOUR_GEOMETRIC_TYPE(0x3006, 0x0042); |
126 static const Orthanc::DicomTag DICOM_TAG_CONTOUR_IMAGE_SEQUENCE(0x3006, 0x0016); | |
127 static const Orthanc::DicomTag DICOM_TAG_CONTOUR_SEQUENCE(0x3006, 0x0040); | |
128 static const Orthanc::DicomTag DICOM_TAG_NUMBER_OF_CONTOUR_POINTS(0x3006, 0x0046); | |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
129 static const Orthanc::DicomTag DICOM_TAG_REFERENCED_ROI_NUMBER(0x3006, 0x0084); |
1504 | 130 static const Orthanc::DicomTag DICOM_TAG_REFERENCED_SOP_INSTANCE_UID(0x0008, 0x1155); |
131 static const Orthanc::DicomTag DICOM_TAG_ROI_CONTOUR_SEQUENCE(0x3006, 0x0039); | |
132 static const Orthanc::DicomTag DICOM_TAG_ROI_DISPLAY_COLOR(0x3006, 0x002a); | |
133 static const Orthanc::DicomTag DICOM_TAG_ROI_NAME(0x3006, 0x0026); | |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
134 static const Orthanc::DicomTag DICOM_TAG_ROI_NUMBER(0x3006, 0x0022); |
1504 | 135 static const Orthanc::DicomTag DICOM_TAG_RT_ROI_INTERPRETED_TYPE(0x3006, 0x00a4); |
136 static const Orthanc::DicomTag DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE(0x3006, 0x0080); | |
137 static const Orthanc::DicomTag DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE(0x3006, 0x0020); | |
0 | 138 |
139 | |
140 static uint8_t ConvertColor(double v) | |
141 { | |
142 if (v < 0) | |
143 { | |
144 return 0; | |
145 } | |
146 else if (v >= 255) | |
147 { | |
148 return 255; | |
149 } | |
150 else | |
151 { | |
152 return static_cast<uint8_t>(v); | |
153 } | |
154 } | |
155 | |
156 | |
1751
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
157 static bool FastParseVector(Vector& target, |
1834
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
158 const IDicomDataset& dataset, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
159 const Orthanc::DicomPath& tag) |
0 | 160 { |
118
a4d0b6c82b29
using Orthanc::DicomMap instead of OrthancPlugins::DicomDatasetReader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
113
diff
changeset
|
161 std::string value; |
a4d0b6c82b29
using Orthanc::DicomMap instead of OrthancPlugins::DicomDatasetReader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
113
diff
changeset
|
162 return (dataset.GetStringValue(value, tag) && |
1751
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
163 GenericToolbox::FastParseVector(target, value)); |
118
a4d0b6c82b29
using Orthanc::DicomMap instead of OrthancPlugins::DicomDatasetReader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
113
diff
changeset
|
164 } |
0 | 165 |
988
4c9b4c4de814
Fixed bug in DicomStructureSet that prevented points from being added to polygons
Benjamin Golinvaux <bgo@osimis.io>
parents:
981
diff
changeset
|
166 bool DicomStructureSet::Polygon::IsPointOnSliceIfAny(const Vector& v) const |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
167 { |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
168 if (hasSlice_) |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
169 { |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
170 double magnitude = |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
171 GeometryToolbox::ProjectAlongNormal(v, geometry_.GetNormal()); |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
172 bool onSlice = LinearAlgebra::IsNear( |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
173 magnitude, |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
174 projectionAlongNormal_, |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
175 sliceThickness_ / 2.0 /* in mm */); |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
176 if (!onSlice) |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
177 { |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
178 LOG(WARNING) << "This RT-STRUCT contains a point that is off the " |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
179 << "slice of its instance | " |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
180 << "magnitude = " << magnitude << " | " |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
181 << "projectionAlongNormal_ = " << projectionAlongNormal_ << " | " |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
182 << "tolerance (sliceThickness_ / 2.0) = " << (sliceThickness_ / 2.0); |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
183 } |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
184 return onSlice; |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
185 } |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
186 else |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
187 { |
988
4c9b4c4de814
Fixed bug in DicomStructureSet that prevented points from being added to polygons
Benjamin Golinvaux <bgo@osimis.io>
parents:
981
diff
changeset
|
188 return true; |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
189 } |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
190 } |
0 | 191 |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
192 void DicomStructureSet::Polygon::AddPoint(const Vector& v) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
193 { |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
194 #if 1 |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
195 // BGO 2019-09-03 |
988
4c9b4c4de814
Fixed bug in DicomStructureSet that prevented points from being added to polygons
Benjamin Golinvaux <bgo@osimis.io>
parents:
981
diff
changeset
|
196 if (IsPointOnSliceIfAny(v)) |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
197 { |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
198 points_.push_back(v); |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
199 } |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
200 #else |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
201 CheckPoint(v); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
202 points_.push_back(v); |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
203 #endif |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
204 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
205 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
206 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
207 bool DicomStructureSet::Polygon::UpdateReferencedSlice(const ReferencedSlices& slices) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
208 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
209 if (hasSlice_) |
0 | 210 { |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
211 return true; |
32 | 212 } |
213 else | |
214 { | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
215 ReferencedSlices::const_iterator it = slices.find(sopInstanceUid_); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
216 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
217 if (it == slices.end()) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
218 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
219 return false; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
220 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
221 else |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
222 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
223 const CoordinateSystem3D& geometry = it->second.geometry_; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
224 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
225 hasSlice_ = true; |
131 | 226 geometry_ = geometry; |
227 projectionAlongNormal_ = GeometryToolbox::ProjectAlongNormal(geometry.GetOrigin(), geometry.GetNormal()); | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
228 sliceThickness_ = it->second.thickness_; |
0 | 229 |
1610
b7630b1a0253
ISceneLayer::GetBoundingBox() returns void
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
230 extent_.Clear(); |
131 | 231 |
1571 | 232 for (Points::const_iterator it2 = points_.begin(); it2 != points_.end(); ++it2) |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
233 { |
1571 | 234 if (IsPointOnSliceIfAny(*it2)) |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
235 { |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
236 double x, y; |
1571 | 237 geometry.ProjectPoint2(x, y, *it2); |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
238 extent_.AddPoint(x, y); |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
239 } |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
240 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
241 return true; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
242 } |
0 | 243 } |
244 } | |
245 | |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
246 bool DicomStructureSet::Polygon::IsOnSlice(const CoordinateSystem3D& cuttingPlane, |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
247 const Vector& estimatedNormal, |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
248 double estimatedSliceThickness) const |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
249 { |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
250 bool isOpposite = false; |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
251 |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
252 if (points_.empty()) |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
253 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
254 return false; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
255 } |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
256 else if (hasSlice_) |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
257 { |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
258 // Use the actual geometry of this specific slice |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
259 if (!GeometryToolbox::IsParallelOrOpposite(isOpposite, cuttingPlane.GetNormal(), geometry_.GetNormal())) |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
260 { |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
261 return false; |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
262 } |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
263 else |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
264 { |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
265 double d = GeometryToolbox::ProjectAlongNormal(cuttingPlane.GetOrigin(), geometry_.GetNormal()); |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
266 return (LinearAlgebra::IsNear(d, projectionAlongNormal_, sliceThickness_ / 2.0)); |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
267 } |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
268 } |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
269 else |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
270 { |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
271 // Use the estimated geometry for the global RT-STRUCT volume |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
272 if (!GeometryToolbox::IsParallelOrOpposite(isOpposite, cuttingPlane.GetNormal(), estimatedNormal)) |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
273 { |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
274 return false; |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
275 } |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
276 else |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
277 { |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
278 double d1 = GeometryToolbox::ProjectAlongNormal(cuttingPlane.GetOrigin(), estimatedNormal); |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
279 double d2 = GeometryToolbox::ProjectAlongNormal(points_.front(), estimatedNormal); |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
280 return (LinearAlgebra::IsNear(d1, d2, estimatedSliceThickness / 2.0)); |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
281 } |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
282 } |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
283 } |
1910
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
284 |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
285 |
2157
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
286 void DicomStructureSet::Polygon::Project(std::list<Extent2D>& target, |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
287 const CoordinateSystem3D& cuttingPlane, |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
288 const Vector& estimatedNormal, |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
289 double estimatedSliceThickness) const |
131 | 290 { |
2157
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
291 CoordinateSystem3D geometry; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
292 double thickness = estimatedSliceThickness; |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
293 |
2157
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
294 /** |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
295 * 1. Estimate the 3D plane associated with this polygon. |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
296 **/ |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
297 |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
298 if (hasSlice_) |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
299 { |
2157
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
300 // The exact geometry is known for this slice |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
301 geometry = geometry_; |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
302 thickness = sliceThickness_; |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
303 } |
2157
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
304 else if (points_.size() < 2) |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
305 { |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
306 return; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
307 } |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
308 else |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
309 { |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
310 // Estimate the geometry |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
311 Vector origin = points_[0]; |
1910
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
312 |
2157
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
313 Vector axisX; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
314 bool found = false; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
315 for (size_t i = 1; i < points_.size(); i++) |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
316 { |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
317 axisX = points_[1] - origin; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
318 if (boost::numeric::ublas::norm_2(axisX) > 10.0 * std::numeric_limits<double>::epsilon()) |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
319 { |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
320 found = true; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
321 break; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
322 } |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
323 } |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
324 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
325 if (!found) |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
326 { |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
327 return; // The polygon is too small to extract a reliable geometry out of it |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
328 } |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
329 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
330 LinearAlgebra::NormalizeVector(axisX); |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
331 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
332 Vector axisY; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
333 LinearAlgebra::CrossProduct(axisY, axisX, estimatedNormal); |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
334 geometry = CoordinateSystem3D(origin, axisX, axisY); |
131 | 335 } |
336 | |
1910
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
337 |
2157
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
338 /** |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
339 * 2. Project the 3D cutting plane as a 2D line onto the polygon plane. |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
340 **/ |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
341 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
342 double cuttingX1, cuttingY1, cuttingX2, cuttingY2; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
343 geometry.ProjectPoint(cuttingX1, cuttingY1, cuttingPlane.GetOrigin()); |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
344 |
2157
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
345 bool isOpposite; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
346 if (GeometryToolbox::IsParallelOrOpposite(isOpposite, geometry.GetNormal(), cuttingPlane.GetAxisX())) |
131 | 347 { |
2157
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
348 geometry.ProjectPoint(cuttingX2, cuttingY2, cuttingPlane.GetOrigin() + cuttingPlane.GetAxisY()); |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
349 } |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
350 else if (GeometryToolbox::IsParallelOrOpposite(isOpposite, geometry.GetNormal(), cuttingPlane.GetAxisY())) |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
351 { |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
352 geometry.ProjectPoint(cuttingX2, cuttingY2, cuttingPlane.GetOrigin() + cuttingPlane.GetAxisX()); |
131 | 353 } |
354 else | |
355 { | |
2157
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
356 return; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
357 } |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
358 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
359 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
360 /** |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
361 * 3. Compute the intersection of the 2D cutting line with the polygon. |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
362 **/ |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
363 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
364 // Initialize the projection of a point onto a line: |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
365 // https://stackoverflow.com/a/64330724 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
366 const double abx = cuttingX2 - cuttingX1; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
367 const double aby = cuttingY2 - cuttingY1; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
368 const double denominator = abx * abx + aby * aby; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
369 if (LinearAlgebra::IsCloseToZero(denominator)) |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
370 { |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
371 return; // Should never happen |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
372 } |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
373 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
374 std::vector<double> intersections; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
375 intersections.reserve(points_.size()); |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
376 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
377 for (size_t i = 0; i < points_.size(); i++) |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
378 { |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
379 double segmentX1, segmentY1, segmentX2, segmentY2; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
380 geometry.ProjectPoint(segmentX1, segmentY1, points_[i]); |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
381 geometry.ProjectPoint(segmentX2, segmentY2, points_[(i + 1) % points_.size()]); |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
382 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
383 double x, y; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
384 if (GeometryToolbox::IntersectLineAndSegment(x, y, cuttingX1, cuttingY1, cuttingX2, cuttingY2, |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
385 segmentX1, segmentY1, segmentX2, segmentY2)) |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
386 { |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
387 // For each polygon segment that intersect the cutting line, |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
388 // register its offset over the cutting line |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
389 const double acx = x - cuttingX1; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
390 const double acy = y - cuttingY1; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
391 intersections.push_back((abx * acx + aby * acy) / denominator); |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
392 } |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
393 } |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
394 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
395 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
396 /** |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
397 * 4. Sort the intersection offsets, then generates one 2D rectangle on the |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
398 * cutting plane from each pair of successive intersections. |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
399 **/ |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
400 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
401 std::sort(intersections.begin(), intersections.end()); |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
402 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
403 if (intersections.size() % 2 == 1) |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
404 { |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
405 return; // Should never happen |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
406 } |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
407 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
408 for (size_t i = 0; i < intersections.size(); i += 2) |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
409 { |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
410 Vector p1, p2; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
411 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
412 { |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
413 // Let's convert them to 3D world geometry to add the slice thickness |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
414 const double x1 = cuttingX1 + intersections[i] * abx; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
415 const double y1 = cuttingY1 + intersections[i] * aby; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
416 const double x2 = cuttingX1 + intersections[i + 1] * abx; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
417 const double y2 = cuttingY1 + intersections[i + 1] * aby; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
418 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
419 p1 = (geometry.MapSliceToWorldCoordinates(x1, y1) + thickness / 2.0 * geometry.GetNormal()); |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
420 p2 = (geometry.MapSliceToWorldCoordinates(x2, y2) - thickness / 2.0 * geometry.GetNormal()); |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
421 } |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
422 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
423 { |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
424 // Then back to the cutting plane geometry |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
425 double x1, y1, x2, y2; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
426 cuttingPlane.ProjectPoint2(x1, y1, p1); |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
427 cuttingPlane.ProjectPoint2(x2, y2, p2); |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
428 |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
429 target.push_back(Extent2D(x1, y1, x2, y2)); |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
430 } |
131 | 431 } |
432 } | |
433 | |
434 | |
0 | 435 const DicomStructureSet::Structure& DicomStructureSet::GetStructure(size_t index) const |
436 { | |
437 if (index >= structures_.size()) | |
438 { | |
125 | 439 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
0 | 440 } |
441 | |
442 return structures_[index]; | |
443 } | |
444 | |
445 | |
125 | 446 DicomStructureSet::Structure& DicomStructureSet::GetStructure(size_t index) |
0 | 447 { |
125 | 448 if (index >= structures_.size()) |
449 { | |
450 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
0 | 451 } |
452 | |
453 return structures_[index]; | |
454 } | |
455 | |
1504 | 456 void DicomStructureSet::Setup(const IDicomDataset& tags) |
0 | 457 { |
1751
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
458 #if STONE_TIME_BLOCKING_OPS |
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
459 boost::posix_time::ptime timerStart = boost::posix_time::microsec_clock::universal_time(); |
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
460 #endif |
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
461 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
462 std::map<int, size_t> roiNumbersIndex; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
463 |
1504 | 464 DicomDatasetReader reader(tags); |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
465 |
0 | 466 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
467 /** |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
468 * 1. Read all the available ROIs. |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
469 **/ |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
470 |
32 | 471 { |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
472 size_t count; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
473 if (!tags.GetSequenceSize(count, Orthanc::DicomPath(DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE))) |
1945
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
474 { |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
475 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
1945
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
476 } |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
477 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
478 structures_.resize(count); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
479 structureNamesIndex_.clear(); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
480 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
481 for (size_t i = 0; i < count; i++) |
32 | 482 { |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
483 int roiNumber; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
484 if (!reader.GetIntegerValue |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
485 (roiNumber, Orthanc::DicomPath(DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE, i, DICOM_TAG_ROI_NUMBER))) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
486 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
487 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
488 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
489 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
490 if (roiNumbersIndex.find(roiNumber) != roiNumbersIndex.end()) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
491 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
492 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
493 "Twice the same ROI number: " + boost::lexical_cast<std::string>(roiNumber)); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
494 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
495 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
496 roiNumbersIndex[roiNumber] = i; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
497 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
498 structures_[i].name_ = reader.GetStringValue |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
499 (Orthanc::DicomPath(DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE, i, DICOM_TAG_ROI_NAME), "No name"); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
500 structures_[i].interpretation_ = "No interpretation"; |
0 | 501 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
502 if (structureNamesIndex_.find(structures_[i].name_) == structureNamesIndex_.end()) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
503 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
504 structureNamesIndex_[structures_[i].name_] = i; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
505 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
506 else |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
507 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
508 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
509 "RT-STRUCT with twice the same name for a structure: " + structures_[i].name_); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
510 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
511 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
512 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
513 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
514 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
515 /** |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
516 * 2. Read the interpretation of the ROIs (if available). |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
517 **/ |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
518 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
519 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
520 size_t count; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
521 if (!tags.GetSequenceSize(count, Orthanc::DicomPath(DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE))) |
32 | 522 { |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
523 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
32 | 524 } |
0 | 525 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
526 for (size_t i = 0; i < count; i++) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
527 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
528 std::string interpretation; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
529 if (reader.GetDataset().GetStringValue(interpretation, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
530 Orthanc::DicomPath(DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE, i, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
531 DICOM_TAG_RT_ROI_INTERPRETED_TYPE))) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
532 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
533 int roiNumber; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
534 if (!reader.GetIntegerValue(roiNumber, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
535 Orthanc::DicomPath(DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE, i, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
536 DICOM_TAG_REFERENCED_ROI_NUMBER))) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
537 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
538 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
539 } |
0 | 540 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
541 std::map<int, size_t>::const_iterator found = roiNumbersIndex.find(roiNumber); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
542 if (found == roiNumbersIndex.end()) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
543 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
544 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
545 } |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
546 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
547 structures_[found->second].interpretation_ = interpretation; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
548 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
549 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
550 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
551 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
552 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
553 /** |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
554 * 3. Read the contours. |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
555 **/ |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
556 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
557 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
558 size_t count; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
559 if (!tags.GetSequenceSize(count, Orthanc::DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE))) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
560 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
561 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
562 } |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
563 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
564 for (size_t i = 0; i < count; i++) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
565 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
566 int roiNumber; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
567 if (!reader.GetIntegerValue(roiNumber, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
568 Orthanc::DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
569 DICOM_TAG_REFERENCED_ROI_NUMBER))) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
570 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
571 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
572 } |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
573 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
574 std::map<int, size_t>::const_iterator found = roiNumbersIndex.find(roiNumber); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
575 if (found == roiNumbersIndex.end()) |
32 | 576 { |
577 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
578 } | |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
579 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
580 Structure& target = structures_[found->second]; |
0 | 581 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
582 Vector color; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
583 if (FastParseVector(color, tags, Orthanc::DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
584 DICOM_TAG_ROI_DISPLAY_COLOR)) && |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
585 color.size() == 3) |
0 | 586 { |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
587 target.red_ = ConvertColor(color[0]); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
588 target.green_ = ConvertColor(color[1]); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
589 target.blue_ = ConvertColor(color[2]); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
590 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
591 else |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
592 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
593 target.red_ = 255; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
594 target.green_ = 0; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
595 target.blue_ = 0; |
0 | 596 } |
597 | |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
598 size_t countSlices; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
599 if (!tags.GetSequenceSize(countSlices, Orthanc::DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
600 DICOM_TAG_CONTOUR_SEQUENCE))) |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
601 { |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
602 countSlices = 0; |
0 | 603 } |
604 | |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
605 LOG(INFO) << "New RT structure: \"" << target.name_ |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
606 << "\" with interpretation \"" << target.interpretation_ |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
607 << "\" containing " << countSlices << " slices (color: " |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
608 << static_cast<int>(target.red_) << "," |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
609 << static_cast<int>(target.green_) << "," |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
610 << static_cast<int>(target.blue_) << ")"; |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
611 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
612 /** |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
613 * These temporary variables avoid allocating many vectors in |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
614 * the loop below (indeed, "Orthanc::DicomPath" handles a |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
615 * "std::vector<PrefixItem>") |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
616 **/ |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
617 Orthanc::DicomPath countPointsPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
618 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
619 DICOM_TAG_NUMBER_OF_CONTOUR_POINTS); |
1751
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
620 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
621 Orthanc::DicomPath geometricTypePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
622 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
623 DICOM_TAG_CONTOUR_GEOMETRIC_TYPE); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
624 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
625 Orthanc::DicomPath imageSequencePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
626 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
627 DICOM_TAG_CONTOUR_IMAGE_SEQUENCE); |
0 | 628 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
629 // (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
630 Orthanc::DicomPath referencedInstancePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
631 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
632 DICOM_TAG_CONTOUR_IMAGE_SEQUENCE, 0, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
633 DICOM_TAG_REFERENCED_SOP_INSTANCE_UID); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
634 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
635 Orthanc::DicomPath contourDataPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
636 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
637 DICOM_TAG_CONTOUR_DATA); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
638 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
639 for (size_t j = 0; j < countSlices; j++) |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
640 { |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
641 unsigned int countPoints; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
642 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
643 countPointsPath.SetPrefixIndex(1, j); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
644 if (!reader.GetUnsignedIntegerValue(countPoints, countPointsPath)) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
645 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
646 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
647 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
648 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
649 //LOG(INFO) << "Parsing slice containing " << countPoints << " vertices"; |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
650 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
651 geometricTypePath.SetPrefixIndex(1, j); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
652 std::string type = reader.GetMandatoryStringValue(geometricTypePath); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
653 if (type != "CLOSED_PLANAR") |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
654 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
655 LOG(WARNING) << "Ignoring contour with geometry type: " << type; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
656 continue; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
657 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
658 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
659 size_t size; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
660 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
661 imageSequencePath.SetPrefixIndex(1, j); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
662 if (!tags.GetSequenceSize(size, imageSequencePath) || size != 1) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
663 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
664 LOG(ERROR) << "The ContourImageSequence sequence (tag 3006,0016) must be present and contain one entry."; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
665 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
666 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
667 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
668 referencedInstancePath.SetPrefixIndex(1, j); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
669 std::string sopInstanceUid = reader.GetMandatoryStringValue(referencedInstancePath); |
0 | 670 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
671 contourDataPath.SetPrefixIndex(1, j); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
672 std::string slicesData = reader.GetMandatoryStringValue(contourDataPath); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
673 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
674 Vector points; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
675 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
676 if (!GenericToolbox::FastParseVector(points, slicesData) || |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
677 points.size() != 3 * countPoints) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
678 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
679 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
680 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
681 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
682 // seen in real world |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
683 if(Orthanc::Toolbox::StripSpaces(sopInstanceUid) == "") |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
684 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
685 LOG(ERROR) << "WARNING. The following Dicom tag (Referenced SOP Instance UID) contains an empty value : // (3006,0039)[" << i << "] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)"; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
686 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
687 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
688 Polygon polygon(sopInstanceUid); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
689 polygon.Reserve(countPoints); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
690 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
691 for (size_t k = 0; k < countPoints; k++) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
692 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
693 Vector v(3); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
694 v[0] = points[3 * k]; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
695 v[1] = points[3 * k + 1]; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
696 v[2] = points[3 * k + 2]; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
697 polygon.AddPoint(v); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
698 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
699 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
700 target.polygons_.push_back(polygon); |
0 | 701 } |
702 } | |
703 } | |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
704 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
705 EstimateGeometry(); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
706 |
1751
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
707 #if STONE_TIME_BLOCKING_OPS |
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
708 boost::posix_time::ptime timerEnd = boost::posix_time::microsec_clock::universal_time(); |
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
709 boost::posix_time::time_duration duration = timerEnd - timerStart; |
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
710 int64_t durationMs = duration.total_milliseconds(); |
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
711 LOG(WARNING) << "DicomStructureSet::Setup took " << durationMs << " ms"; |
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
712 #endif |
0 | 713 } |
714 | |
715 | |
1180
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
716 #if ORTHANC_ENABLE_DCMTK == 1 |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
717 DicomStructureSet::DicomStructureSet(Orthanc::ParsedDicomFile& instance) |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
718 { |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
719 ParsedDicomDataset dataset(instance); |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
720 Setup(dataset); |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
721 } |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
722 #endif |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
723 |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
724 |
0 | 725 Vector DicomStructureSet::GetStructureCenter(size_t index) const |
726 { | |
727 const Structure& structure = GetStructure(index); | |
728 | |
729 Vector center; | |
158
a053ca7fa5c6
LinearAlgebra toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
137
diff
changeset
|
730 LinearAlgebra::AssignVector(center, 0, 0, 0); |
0 | 731 if (structure.polygons_.empty()) |
732 { | |
733 return center; | |
734 } | |
735 | |
736 double n = static_cast<double>(structure.polygons_.size()); | |
737 | |
738 for (Polygons::const_iterator polygon = structure.polygons_.begin(); | |
739 polygon != structure.polygons_.end(); ++polygon) | |
740 { | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
741 if (!polygon->GetPoints().empty()) |
0 | 742 { |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
743 center += polygon->GetPoints().front() / n; |
0 | 744 } |
745 } | |
746 | |
747 return center; | |
748 } | |
749 | |
750 | |
751 const std::string& DicomStructureSet::GetStructureName(size_t index) const | |
752 { | |
753 return GetStructure(index).name_; | |
754 } | |
755 | |
756 | |
757 const std::string& DicomStructureSet::GetStructureInterpretation(size_t index) const | |
758 { | |
759 return GetStructure(index).interpretation_; | |
760 } | |
761 | |
762 | |
804
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
763 Color DicomStructureSet::GetStructureColor(size_t index) const |
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
764 { |
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
765 const Structure& s = GetStructure(index); |
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
766 return Color(s.red_, s.green_, s.blue_); |
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
767 } |
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
768 |
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
769 |
1885
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
770 void DicomStructureSet::GetReferencedInstances(std::set<std::string>& instances) const |
0 | 771 { |
772 for (Structures::const_iterator structure = structures_.begin(); | |
773 structure != structures_.end(); ++structure) | |
774 { | |
775 for (Polygons::const_iterator polygon = structure->polygons_.begin(); | |
776 polygon != structure->polygons_.end(); ++polygon) | |
777 { | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
778 instances.insert(polygon->GetSopInstanceUid()); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
779 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
780 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
781 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
782 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
783 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
784 void DicomStructureSet::AddReferencedSlice(const std::string& sopInstanceUid, |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
785 const std::string& seriesInstanceUid, |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
786 const CoordinateSystem3D& geometry, |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
787 double thickness) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
788 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
789 if (referencedSlices_.find(sopInstanceUid) != referencedSlices_.end()) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
790 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
791 // This geometry is already known |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
792 LOG(ERROR) << "DicomStructureSet::AddReferencedSlice(): (referencedSlices_.find(sopInstanceUid) != referencedSlices_.end()). sopInstanceUid = " << sopInstanceUid; |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
793 |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
794 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
795 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
796 else |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
797 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
798 if (thickness < 0) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
799 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
800 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
801 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
802 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
803 if (!referencedSlices_.empty()) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
804 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
805 const ReferencedSlice& reference = referencedSlices_.begin()->second; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
806 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
807 if (reference.seriesInstanceUid_ != seriesInstanceUid) |
0 | 808 { |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
809 LOG(ERROR) << "This RT-STRUCT refers to several different series"; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
810 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
811 } |
0 | 812 |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
813 if (!GeometryToolbox::IsParallel(reference.geometry_.GetNormal(), geometry.GetNormal())) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
814 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
815 LOG(ERROR) << "The slices in this RT-STRUCT are not parallel"; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
816 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
817 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
818 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
819 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
820 referencedSlices_[sopInstanceUid] = ReferencedSlice(seriesInstanceUid, geometry, thickness); |
0 | 821 |
131 | 822 for (Structures::iterator structure = structures_.begin(); |
823 structure != structures_.end(); ++structure) | |
824 { | |
825 for (Polygons::iterator polygon = structure->polygons_.begin(); | |
826 polygon != structure->polygons_.end(); ++polygon) | |
827 { | |
828 polygon->UpdateReferencedSlice(referencedSlices_); | |
829 } | |
830 } | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
831 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
832 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
833 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
834 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
835 void DicomStructureSet::AddReferencedSlice(const Orthanc::DicomMap& dataset) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
836 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
837 CoordinateSystem3D slice(dataset); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
838 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
839 double thickness = 1; // 1 mm by default |
0 | 840 |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
841 std::string s; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
842 Vector v; |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
988
diff
changeset
|
843 if (dataset.LookupStringValue(s, Orthanc::DICOM_TAG_SLICE_THICKNESS, false) && |
158
a053ca7fa5c6
LinearAlgebra toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
137
diff
changeset
|
844 LinearAlgebra::ParseVector(v, s) && |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
845 v.size() > 0) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
846 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
847 thickness = v[0]; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
848 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
849 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
850 std::string instance, series; |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
988
diff
changeset
|
851 if (dataset.LookupStringValue(instance, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false) && |
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
988
diff
changeset
|
852 dataset.LookupStringValue(series, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
853 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
854 AddReferencedSlice(instance, series, slice, thickness); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
855 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
856 else |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
857 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
858 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
859 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
860 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
861 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
862 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
863 void DicomStructureSet::CheckReferencedSlices() |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
864 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
865 for (Structures::iterator structure = structures_.begin(); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
866 structure != structures_.end(); ++structure) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
867 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
868 for (Polygons::iterator polygon = structure->polygons_.begin(); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
869 polygon != structure->polygons_.end(); ++polygon) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
870 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
871 if (!polygon->UpdateReferencedSlice(referencedSlices_)) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
872 { |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
873 std::string sopInstanceUid = polygon->GetSopInstanceUid(); |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
874 if (Orthanc::Toolbox::StripSpaces(sopInstanceUid) == "") |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
875 { |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
876 LOG(ERROR) << "DicomStructureSet::CheckReferencedSlices(): " |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
877 << " missing information about referenced instance " |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
878 << "(sopInstanceUid is empty!)"; |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
879 } |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
880 else |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
881 { |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
882 LOG(ERROR) << "DicomStructureSet::CheckReferencedSlices(): " |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
883 << " missing information about referenced instance " |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
884 << "(sopInstanceUid = " << sopInstanceUid << ")"; |
981
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
885 } |
c20dbaab360c
Ability to cope with empty "Referenced SOP Instance UID" (dicom path (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)) + better logs + code formating
Benjamin Golinvaux <bgo@osimis.io>
parents:
959
diff
changeset
|
886 //throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
0 | 887 } |
888 } | |
889 } | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
890 } |
0 | 891 |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
892 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
893 Vector DicomStructureSet::GetNormal() const |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
894 { |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
895 if (referencedSlices_.empty()) |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
896 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
897 Vector v; |
158
a053ca7fa5c6
LinearAlgebra toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
137
diff
changeset
|
898 LinearAlgebra::AssignVector(v, 0, 0, 1); |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
899 return v; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
900 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
901 else |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
902 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
903 return referencedSlices_.begin()->second.geometry_.GetNormal(); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
904 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
905 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
906 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
907 bool DicomStructureSet::ProjectStructure(std::vector< std::vector<ScenePoint2D> >& chains, |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
908 const Structure& structure, |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
909 const CoordinateSystem3D& cuttingPlane) const |
125 | 910 { |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
911 const CoordinateSystem3D cutting = CoordinateSystem3D::NormalizeCuttingPlane(cuttingPlane); |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
912 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
913 chains.clear(); |
125 | 914 |
915 Vector normal = GetNormal(); | |
916 | |
917 bool isOpposite; | |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
918 if (GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, cutting.GetNormal())) |
125 | 919 { |
920 // This is an axial projection | |
921 | |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
922 chains.reserve(structure.polygons_.size()); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
923 |
794 | 924 for (Polygons::const_iterator polygon = structure.polygons_.begin(); |
125 | 925 polygon != structure.polygons_.end(); ++polygon) |
926 { | |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
927 const Points& points = polygon->GetPoints(); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
928 |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
929 if (polygon->IsOnSlice(cutting, GetEstimatedNormal(), GetEstimatedSliceThickness()) && |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
930 !points.empty()) |
125 | 931 { |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
932 chains.push_back(std::vector<ScenePoint2D>()); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
933 chains.back().reserve(points.size() + 1); |
125 | 934 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
935 for (Points::const_iterator p = points.begin(); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
936 p != points.end(); ++p) |
125 | 937 { |
938 double x, y; | |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
939 cutting.ProjectPoint2(x, y, *p); |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
940 chains.back().push_back(ScenePoint2D(x, y)); |
125 | 941 } |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
942 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
943 double x0, y0; |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
944 cutting.ProjectPoint2(x0, y0, points.front()); |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
945 chains.back().push_back(ScenePoint2D(x0, y0)); |
125 | 946 } |
947 } | |
948 | |
949 return true; | |
950 } | |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
951 else if (GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, cutting.GetAxisX()) || |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
952 GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, cutting.GetAxisY())) |
125 | 953 { |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
954 // Sagittal or coronal projection |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
955 |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
956 #if USE_BOOST_UNION_FOR_POLYGONS == 1 |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
957 std::vector<BoostPolygon> projected; |
1162
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
958 |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
959 for (Polygons::const_iterator polygon = structure.polygons_.begin(); |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
960 polygon != structure.polygons_.end(); ++polygon) |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
961 { |
2157
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
962 std::list<Extent2D> rectangles; |
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
963 polygon->Project(rectangles, cutting, GetEstimatedNormal(), GetEstimatedSliceThickness()); |
1162
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
964 |
2157
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
965 for (std::list<Extent2D>::const_iterator it = rectangles.begin(); it != rectangles.end(); ++it) |
1162
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
966 { |
2157
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
967 projected.push_back(CreateRectangle(it->GetX1(), it->GetY1(), it->GetX2(), it->GetY2())); |
1162
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
968 } |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
969 } |
1897
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
970 |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
971 BoostMultiPolygon merged; |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
972 Union(merged, projected); |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
973 |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
974 chains.resize(merged.size()); |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
975 for (size_t i = 0; i < merged.size(); i++) |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
976 { |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
977 const std::vector<BoostPoint>& outer = merged[i].outer(); |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
978 |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
979 chains[i].resize(outer.size()); |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
980 for (size_t j = 0; j < outer.size(); j++) |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
981 { |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
982 chains[i][j] = ScenePoint2D(outer[j].x(), outer[j].y()); |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
983 } |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
984 } |
1898
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
985 |
1908
affde38b84de
moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1905
diff
changeset
|
986 #else |
1898
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
987 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
988 std::list<Extent2D> rectangles; |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
989 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
990 for (Polygons::const_iterator polygon = structure.polygons_.begin(); |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
991 polygon != structure.polygons_.end(); ++polygon) |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
992 { |
2157
917e40af6b45
fix rendering of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2154
diff
changeset
|
993 polygon->Project(rectangles, cutting, GetEstimatedNormal(), GetEstimatedSliceThickness()); |
1898
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
994 } |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
995 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
996 typedef std::list< std::vector<ScenePoint2D> > Contours; |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
997 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
998 Contours contours; |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
999 UnionOfRectangles::Apply(contours, rectangles); |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
1000 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
1001 chains.reserve(contours.size()); |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
1002 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
1003 for (Contours::const_iterator it = contours.begin(); it != contours.end(); ++it) |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
1004 { |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
1005 chains.push_back(*it); |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
1006 } |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
1007 |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1008 #endif |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1009 |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
1010 return true; |
125 | 1011 } |
1012 else | |
1013 { | |
1014 return false; | |
1015 } | |
0 | 1016 } |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1017 |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1018 |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1019 void DicomStructureSet::ProjectOntoLayer(PolylineSceneLayer& layer, |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
1020 const CoordinateSystem3D& cuttingPlane, |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1021 size_t structureIndex, |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1022 const Color& color) const |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1023 { |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1024 std::vector< std::vector<ScenePoint2D> > chains; |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1025 |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
1026 if (ProjectStructure(chains, structureIndex, cuttingPlane)) |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1027 { |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1028 for (size_t j = 0; j < chains.size(); j++) |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1029 { |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1030 layer.AddChain(chains[j], false, color.GetRed(), color.GetGreen(), color.GetBlue()); |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1031 } |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1032 } |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1033 } |
1885
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1034 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1035 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1036 void DicomStructureSet::GetStructurePoints(std::list< std::vector<Vector> >& target, |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1037 size_t structureIndex, |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1038 const std::string& sopInstanceUid) const |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1039 { |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1040 target.clear(); |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1041 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1042 const Structure& structure = GetStructure(structureIndex); |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1043 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1044 // TODO - Could be optimized by adding a multimap on "Structure", mapping |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1045 // from SOP Instance UID to polygons |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1046 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1047 for (Polygons::const_iterator it = structure.polygons_.begin(); |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1048 it != structure.polygons_.end(); ++it) |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1049 { |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1050 if (it->GetSopInstanceUid() == sopInstanceUid) |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1051 { |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1052 target.push_back(it->GetPoints()); |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1053 } |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1054 } |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1055 } |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1056 |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1057 |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1058 void DicomStructureSet::EstimateGeometry() |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1059 { |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1060 static const double PI = boost::math::constants::pi<double>(); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1061 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1062 BucketAccumulator2D accumulator(0, PI, 9, /* for acos() */ |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1063 -PI, PI, 9, /* for atan() */ |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1064 true /* store values */); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1065 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1066 unsigned int countPolygons = 0; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1067 for (size_t i = 0; i < structures_.size(); i++) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1068 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1069 const Polygons& polygons = structures_[i].polygons_; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1070 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1071 for (Polygons::const_iterator it = polygons.begin(); it != polygons.end(); ++it) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1072 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1073 countPolygons++; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1074 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1075 const Points& points = it->GetPoints(); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1076 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1077 if (points.size() >= 3) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1078 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1079 // Compute the normal of the polygon using 3 successive points |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1080 Vector normal; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1081 bool valid = false; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1082 |
1916 | 1083 for (size_t j = 0; j + 2 < points.size(); j++) |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1084 { |
1916 | 1085 const Vector& a = points[j]; |
1086 const Vector& b = points[j + 1]; | |
1087 const Vector& c = points[j + 2]; | |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1088 LinearAlgebra::CrossProduct(normal, b - a, c - a); // (*) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1089 LinearAlgebra::NormalizeVector(normal); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1090 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1091 if (LinearAlgebra::IsNear(boost::numeric::ublas::norm_2(normal), 1.0)) // (**) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1092 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1093 valid = true; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1094 break; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1095 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1096 } |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1097 |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1098 if (valid) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1099 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1100 // Check that all the points of the polygon lie in the plane defined by the normal |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1101 double d1 = GeometryToolbox::ProjectAlongNormal(points[0], normal); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1102 |
1916 | 1103 for (size_t j = 1; j < points.size(); j++) |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1104 { |
1916 | 1105 double d2 = GeometryToolbox::ProjectAlongNormal(points[j], normal); |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1106 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1107 if (!LinearAlgebra::IsNear(d1, d2)) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1108 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1109 valid = false; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1110 break; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1111 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1112 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1113 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1114 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1115 if (valid) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1116 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1117 if (normal[2] < 0) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1118 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1119 normal = -normal; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1120 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1121 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1122 // The normal is a non-zero unit vector because of (*) and (**), so "r == 1" |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1123 // https://en.wikipedia.org/wiki/Vector_fields_in_cylindrical_and_spherical_coordinates#Vector_fields_2 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1124 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1125 const double theta = acos(normal[2]); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1126 const double phi = atan(normal[1]); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1127 accumulator.AddValue(theta, phi); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1128 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1129 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1130 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1131 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1132 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1133 size_t bestX, bestY; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1134 accumulator.FindBestBucket(bestX, bestY); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1135 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1136 if (accumulator.GetBucketContentSize(bestX, bestY) > 0) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1137 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1138 double normalTheta, normalPhi; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1139 accumulator.ComputeBestMedian(normalTheta, normalPhi); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1140 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1141 // Back to (x,y,z) normal, taking "r == 1" |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1142 // https://en.wikipedia.org/wiki/Vector_fields_in_cylindrical_and_spherical_coordinates#Vector_fields_2 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1143 double sinTheta = sin(normalTheta); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1144 estimatedNormal_ = LinearAlgebra::CreateVector(sinTheta * cos(normalPhi), sinTheta * sin(normalPhi), cos(normalTheta)); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1145 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1146 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1147 std::vector<double> polygonsProjection; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1148 polygonsProjection.reserve(countPolygons); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1149 |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1150 for (size_t i = 0; i < structures_.size(); i++) |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1151 { |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1152 const Polygons& polygons = structures_[i].polygons_; |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1153 |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1154 for (Polygons::const_iterator it = polygons.begin(); it != polygons.end(); ++it) |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1155 { |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1156 const Points& points = it->GetPoints(); |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1157 polygonsProjection.push_back(GeometryToolbox::ProjectAlongNormal(points[0], estimatedNormal_)); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1158 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1159 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1160 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1161 std::sort(polygonsProjection.begin(), polygonsProjection.end()); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1162 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1163 std::vector<double> deltas; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1164 deltas.reserve(polygonsProjection.size()); |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1165 |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1166 for (size_t i = 0; i + 1 < polygonsProjection.size(); i++) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1167 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1168 if (!LinearAlgebra::IsNear(polygonsProjection[i], polygonsProjection[i + 1])) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1169 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1170 assert(polygonsProjection[i + 1] > polygonsProjection[i]); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1171 deltas.push_back(polygonsProjection[i + 1] - polygonsProjection[i]); |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1172 } |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1173 } |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1174 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1175 if (deltas.empty()) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1176 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1177 estimatedSliceThickness_ = 1; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1178 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1179 else |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1180 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1181 estimatedSliceThickness_ = LinearAlgebra::ComputeMedian(deltas); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1182 } |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1183 } |
1945
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1184 |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1185 |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1186 bool DicomStructureSet::LookupStructureName(size_t& structureIndex /* out */, |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1187 const std::string& name) const |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1188 { |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1189 StructureNamesIndex::const_iterator found = structureNamesIndex_.find(name); |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1190 |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1191 if (found == structureNamesIndex_.end()) |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1192 { |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1193 return false; |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1194 } |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1195 else |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1196 { |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1197 structureIndex = found->second; |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1198 return true; |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1199 } |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1200 } |
0 | 1201 } |