Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/Toolbox/DicomStructureSet.cpp @ 2154:f8cbfd7175c3
fix parsing of structure sets
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 27 Sep 2024 15:05:41 +0200 |
parents | 16c01cc201e7 |
children | 917e40af6b45 |
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 |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
286 static void AddSegmentIfIntersection(Extent2D& extent, |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
287 const CoordinateSystem3D& cuttingPlane, |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
288 const Vector& p1, |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
289 const Vector& p2, |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
290 double originDistance) |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
291 { |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
292 // Does this segment intersects the cutting plane? |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
293 double d1 = cuttingPlane.ProjectAlongNormal(p1); |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
294 double d2 = cuttingPlane.ProjectAlongNormal(p2); |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
295 |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
296 if ((d1 < originDistance && d2 > originDistance) || |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
297 (d1 > originDistance && d2 < originDistance)) |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
298 { |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
299 // This is an intersection: Add the segment |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
300 double x, y; |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
301 cuttingPlane.ProjectPoint2(x, y, p1); |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
302 extent.AddPoint(x, y); |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
303 cuttingPlane.ProjectPoint2(x, y, p2); |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
304 extent.AddPoint(x, y); |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
305 } |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
306 } |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
307 |
131 | 308 bool DicomStructureSet::Polygon::Project(double& x1, |
309 double& y1, | |
310 double& x2, | |
311 double& y2, | |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
312 const CoordinateSystem3D& cuttingPlane, |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
313 const Vector& estimatedNormal, |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
314 double estimatedSliceThickness) const |
131 | 315 { |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
316 if (points_.size() <= 1) |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
317 { |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
318 return false; |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
319 } |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
320 |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
321 Vector normal = estimatedNormal; |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
322 double thickness = estimatedSliceThickness; |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
323 if (hasSlice_) |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
324 { |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
325 normal = geometry_.GetNormal(); |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
326 thickness = sliceThickness_; |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
327 } |
1910
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
328 |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
329 bool isOpposite; |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
330 if (!GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, cuttingPlane.GetAxisX()) && |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
331 !GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, cuttingPlane.GetAxisY())) |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
332 { |
131 | 333 return false; |
334 } | |
335 | |
1910
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
336 const double d = cuttingPlane.ProjectAlongNormal(cuttingPlane.GetOrigin()); |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
337 |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
338 Extent2D extent; |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
339 AddSegmentIfIntersection(extent, cuttingPlane, points_[points_.size() - 1], points_[0], d); |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
340 for (size_t i = 1; i < points_.size(); i++) |
131 | 341 { |
1910
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
342 AddSegmentIfIntersection(extent, cuttingPlane, points_[i - 1], points_[i], d); |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
343 } |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
344 |
1910
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
345 if (extent.GetWidth() > 0 || |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
346 extent.GetHeight() > 0) |
131 | 347 { |
1910
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
348 // Let's convert them to 3D world geometry to add the slice thickness |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
349 Vector p1 = (cuttingPlane.MapSliceToWorldCoordinates(extent.GetX1(), extent.GetY1()) + |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
350 thickness / 2.0 * normal); |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
351 Vector p2 = (cuttingPlane.MapSliceToWorldCoordinates(extent.GetX2(), extent.GetY2()) - |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
352 thickness / 2.0 * normal); |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
353 |
1910
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
354 // Then back to the cutting plane geometry |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
355 cuttingPlane.ProjectPoint2(x1, y1, p1); |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
356 cuttingPlane.ProjectPoint2(x2, y2, p2); |
f81cdf283859
display RT-STRUCT before the referenced slices get loaded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1909
diff
changeset
|
357 return true; |
131 | 358 } |
359 else | |
360 { | |
361 return false; | |
362 } | |
363 } | |
364 | |
365 | |
0 | 366 const DicomStructureSet::Structure& DicomStructureSet::GetStructure(size_t index) const |
367 { | |
368 if (index >= structures_.size()) | |
369 { | |
125 | 370 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
0 | 371 } |
372 | |
373 return structures_[index]; | |
374 } | |
375 | |
376 | |
125 | 377 DicomStructureSet::Structure& DicomStructureSet::GetStructure(size_t index) |
0 | 378 { |
125 | 379 if (index >= structures_.size()) |
380 { | |
381 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
0 | 382 } |
383 | |
384 return structures_[index]; | |
385 } | |
386 | |
1504 | 387 void DicomStructureSet::Setup(const IDicomDataset& tags) |
0 | 388 { |
1751
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
389 #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
|
390 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
|
391 #endif |
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
392 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
393 std::map<int, size_t> roiNumbersIndex; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
394 |
1504 | 395 DicomDatasetReader reader(tags); |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
396 |
0 | 397 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
398 /** |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
399 * 1. Read all the available ROIs. |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
400 **/ |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
401 |
32 | 402 { |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
403 size_t count; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
404 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
|
405 { |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
406 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
1945
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
407 } |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
408 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
409 structures_.resize(count); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
410 structureNamesIndex_.clear(); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
411 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
412 for (size_t i = 0; i < count; i++) |
32 | 413 { |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
414 int roiNumber; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
415 if (!reader.GetIntegerValue |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
416 (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
|
417 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
418 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
419 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
420 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
421 if (roiNumbersIndex.find(roiNumber) != roiNumbersIndex.end()) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
422 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
423 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
424 "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
|
425 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
426 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
427 roiNumbersIndex[roiNumber] = i; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
428 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
429 structures_[i].name_ = reader.GetStringValue |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
430 (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
|
431 structures_[i].interpretation_ = "No interpretation"; |
0 | 432 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
433 if (structureNamesIndex_.find(structures_[i].name_) == structureNamesIndex_.end()) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
434 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
435 structureNamesIndex_[structures_[i].name_] = i; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
436 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
437 else |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
438 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
439 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
440 "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
|
441 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
442 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
443 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
444 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
445 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
446 /** |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
447 * 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
|
448 **/ |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
449 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
450 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
451 size_t count; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
452 if (!tags.GetSequenceSize(count, Orthanc::DicomPath(DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE))) |
32 | 453 { |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
454 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
32 | 455 } |
0 | 456 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
457 for (size_t i = 0; i < count; i++) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
458 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
459 std::string interpretation; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
460 if (reader.GetDataset().GetStringValue(interpretation, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
461 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
|
462 DICOM_TAG_RT_ROI_INTERPRETED_TYPE))) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
463 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
464 int roiNumber; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
465 if (!reader.GetIntegerValue(roiNumber, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
466 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
|
467 DICOM_TAG_REFERENCED_ROI_NUMBER))) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
468 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
469 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
470 } |
0 | 471 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
472 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
|
473 if (found == roiNumbersIndex.end()) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
474 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
475 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
476 } |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
477 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
478 structures_[found->second].interpretation_ = interpretation; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
479 } |
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 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
482 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
483 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
484 /** |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
485 * 3. Read the contours. |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
486 **/ |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
487 |
2154
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 size_t count; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
490 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
|
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 } |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
494 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
495 for (size_t i = 0; i < count; i++) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
496 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
497 int roiNumber; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
498 if (!reader.GetIntegerValue(roiNumber, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
499 Orthanc::DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
500 DICOM_TAG_REFERENCED_ROI_NUMBER))) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
501 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
502 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
503 } |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
504 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
505 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
|
506 if (found == roiNumbersIndex.end()) |
32 | 507 { |
508 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
509 } | |
2154
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 Structure& target = structures_[found->second]; |
0 | 512 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
513 Vector color; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
514 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
|
515 DICOM_TAG_ROI_DISPLAY_COLOR)) && |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
516 color.size() == 3) |
0 | 517 { |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
518 target.red_ = ConvertColor(color[0]); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
519 target.green_ = ConvertColor(color[1]); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
520 target.blue_ = ConvertColor(color[2]); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
521 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
522 else |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
523 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
524 target.red_ = 255; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
525 target.green_ = 0; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
526 target.blue_ = 0; |
0 | 527 } |
528 | |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
529 size_t countSlices; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
530 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
|
531 DICOM_TAG_CONTOUR_SEQUENCE))) |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
532 { |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
533 countSlices = 0; |
0 | 534 } |
535 | |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
536 LOG(INFO) << "New RT structure: \"" << target.name_ |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
537 << "\" with interpretation \"" << target.interpretation_ |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
538 << "\" containing " << countSlices << " slices (color: " |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
539 << static_cast<int>(target.red_) << "," |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
540 << static_cast<int>(target.green_) << "," |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
541 << static_cast<int>(target.blue_) << ")"; |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
542 |
2154
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 * These temporary variables avoid allocating many vectors in |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
545 * the loop below (indeed, "Orthanc::DicomPath" handles a |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
546 * "std::vector<PrefixItem>") |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
547 **/ |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
548 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
|
549 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
550 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
|
551 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
552 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
|
553 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
554 DICOM_TAG_CONTOUR_GEOMETRIC_TYPE); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
555 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
556 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
|
557 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
558 DICOM_TAG_CONTOUR_IMAGE_SEQUENCE); |
0 | 559 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
560 // (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
|
561 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
|
562 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
563 DICOM_TAG_CONTOUR_IMAGE_SEQUENCE, 0, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
564 DICOM_TAG_REFERENCED_SOP_INSTANCE_UID); |
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 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
|
567 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
568 DICOM_TAG_CONTOUR_DATA); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
569 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
570 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
|
571 { |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
572 unsigned int countPoints; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
573 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
574 countPointsPath.SetPrefixIndex(1, j); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
575 if (!reader.GetUnsignedIntegerValue(countPoints, countPointsPath)) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
576 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
577 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
578 } |
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 //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
|
581 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
582 geometricTypePath.SetPrefixIndex(1, j); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
583 std::string type = reader.GetMandatoryStringValue(geometricTypePath); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
584 if (type != "CLOSED_PLANAR") |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
585 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
586 LOG(WARNING) << "Ignoring contour with geometry type: " << type; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
587 continue; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
588 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
589 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
590 size_t size; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
591 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
592 imageSequencePath.SetPrefixIndex(1, j); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
593 if (!tags.GetSequenceSize(size, imageSequencePath) || size != 1) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
594 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
595 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
|
596 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
597 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
598 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
599 referencedInstancePath.SetPrefixIndex(1, j); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
600 std::string sopInstanceUid = reader.GetMandatoryStringValue(referencedInstancePath); |
0 | 601 |
2154
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
602 contourDataPath.SetPrefixIndex(1, j); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
603 std::string slicesData = reader.GetMandatoryStringValue(contourDataPath); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
604 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
605 Vector points; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
606 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
607 if (!GenericToolbox::FastParseVector(points, slicesData) || |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
608 points.size() != 3 * countPoints) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
609 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
610 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
611 } |
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 // seen in real world |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
614 if(Orthanc::Toolbox::StripSpaces(sopInstanceUid) == "") |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
615 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
616 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
|
617 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
618 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
619 Polygon polygon(sopInstanceUid); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
620 polygon.Reserve(countPoints); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
621 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
622 for (size_t k = 0; k < countPoints; k++) |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
623 { |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
624 Vector v(3); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
625 v[0] = points[3 * k]; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
626 v[1] = points[3 * k + 1]; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
627 v[2] = points[3 * k + 2]; |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
628 polygon.AddPoint(v); |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
629 } |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
630 |
f8cbfd7175c3
fix parsing of structure sets
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
631 target.polygons_.push_back(polygon); |
0 | 632 } |
633 } | |
634 } | |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
635 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
636 EstimateGeometry(); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
637 |
1751
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
638 #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
|
639 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
|
640 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
|
641 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
|
642 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
|
643 #endif |
0 | 644 } |
645 | |
646 | |
1180
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
647 #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
|
648 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
|
649 { |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
650 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
|
651 Setup(dataset); |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
652 } |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
653 #endif |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
654 |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
655 |
0 | 656 Vector DicomStructureSet::GetStructureCenter(size_t index) const |
657 { | |
658 const Structure& structure = GetStructure(index); | |
659 | |
660 Vector center; | |
158
a053ca7fa5c6
LinearAlgebra toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
137
diff
changeset
|
661 LinearAlgebra::AssignVector(center, 0, 0, 0); |
0 | 662 if (structure.polygons_.empty()) |
663 { | |
664 return center; | |
665 } | |
666 | |
667 double n = static_cast<double>(structure.polygons_.size()); | |
668 | |
669 for (Polygons::const_iterator polygon = structure.polygons_.begin(); | |
670 polygon != structure.polygons_.end(); ++polygon) | |
671 { | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
672 if (!polygon->GetPoints().empty()) |
0 | 673 { |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
674 center += polygon->GetPoints().front() / n; |
0 | 675 } |
676 } | |
677 | |
678 return center; | |
679 } | |
680 | |
681 | |
682 const std::string& DicomStructureSet::GetStructureName(size_t index) const | |
683 { | |
684 return GetStructure(index).name_; | |
685 } | |
686 | |
687 | |
688 const std::string& DicomStructureSet::GetStructureInterpretation(size_t index) const | |
689 { | |
690 return GetStructure(index).interpretation_; | |
691 } | |
692 | |
693 | |
804
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
694 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
|
695 { |
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
696 const Structure& s = GetStructure(index); |
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
697 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
|
698 } |
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
699 |
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
700 |
1885
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
701 void DicomStructureSet::GetReferencedInstances(std::set<std::string>& instances) const |
0 | 702 { |
703 for (Structures::const_iterator structure = structures_.begin(); | |
704 structure != structures_.end(); ++structure) | |
705 { | |
706 for (Polygons::const_iterator polygon = structure->polygons_.begin(); | |
707 polygon != structure->polygons_.end(); ++polygon) | |
708 { | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
709 instances.insert(polygon->GetSopInstanceUid()); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
710 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
711 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
712 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
713 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
714 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
715 void DicomStructureSet::AddReferencedSlice(const std::string& sopInstanceUid, |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
716 const std::string& seriesInstanceUid, |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
717 const CoordinateSystem3D& geometry, |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
718 double thickness) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
719 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
720 if (referencedSlices_.find(sopInstanceUid) != referencedSlices_.end()) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
721 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
722 // 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
|
723 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
|
724 |
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
|
725 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
726 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
727 else |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
728 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
729 if (thickness < 0) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
730 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
731 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
732 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
733 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
734 if (!referencedSlices_.empty()) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
735 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
736 const ReferencedSlice& reference = referencedSlices_.begin()->second; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
737 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
738 if (reference.seriesInstanceUid_ != seriesInstanceUid) |
0 | 739 { |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
740 LOG(ERROR) << "This RT-STRUCT refers to several different series"; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
741 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
742 } |
0 | 743 |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
744 if (!GeometryToolbox::IsParallel(reference.geometry_.GetNormal(), geometry.GetNormal())) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
745 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
746 LOG(ERROR) << "The slices in this RT-STRUCT are not parallel"; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
747 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
748 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
749 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
750 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
751 referencedSlices_[sopInstanceUid] = ReferencedSlice(seriesInstanceUid, geometry, thickness); |
0 | 752 |
131 | 753 for (Structures::iterator structure = structures_.begin(); |
754 structure != structures_.end(); ++structure) | |
755 { | |
756 for (Polygons::iterator polygon = structure->polygons_.begin(); | |
757 polygon != structure->polygons_.end(); ++polygon) | |
758 { | |
759 polygon->UpdateReferencedSlice(referencedSlices_); | |
760 } | |
761 } | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
762 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
763 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
764 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
765 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
766 void DicomStructureSet::AddReferencedSlice(const Orthanc::DicomMap& dataset) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
767 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
768 CoordinateSystem3D slice(dataset); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
769 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
770 double thickness = 1; // 1 mm by default |
0 | 771 |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
772 std::string s; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
773 Vector v; |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
988
diff
changeset
|
774 if (dataset.LookupStringValue(s, Orthanc::DICOM_TAG_SLICE_THICKNESS, false) && |
158
a053ca7fa5c6
LinearAlgebra toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
137
diff
changeset
|
775 LinearAlgebra::ParseVector(v, s) && |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
776 v.size() > 0) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
777 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
778 thickness = v[0]; |
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 std::string instance, series; |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
988
diff
changeset
|
782 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
|
783 dataset.LookupStringValue(series, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
784 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
785 AddReferencedSlice(instance, series, slice, thickness); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
786 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
787 else |
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
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 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
792 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
793 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
794 void DicomStructureSet::CheckReferencedSlices() |
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 for (Structures::iterator structure = structures_.begin(); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
797 structure != structures_.end(); ++structure) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
798 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
799 for (Polygons::iterator polygon = structure->polygons_.begin(); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
800 polygon != structure->polygons_.end(); ++polygon) |
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 if (!polygon->UpdateReferencedSlice(referencedSlices_)) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
803 { |
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
|
804 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
|
805 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
|
806 { |
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
|
807 LOG(ERROR) << "DicomStructureSet::CheckReferencedSlices(): " |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
808 << " missing information about referenced instance " |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
809 << "(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
|
810 } |
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
|
811 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
|
812 { |
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
|
813 LOG(ERROR) << "DicomStructureSet::CheckReferencedSlices(): " |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
814 << " missing information about referenced instance " |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
815 << "(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
|
816 } |
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
|
817 //throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
0 | 818 } |
819 } | |
820 } | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
821 } |
0 | 822 |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
823 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
824 Vector DicomStructureSet::GetNormal() const |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
825 { |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
826 if (referencedSlices_.empty()) |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
827 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
828 Vector v; |
158
a053ca7fa5c6
LinearAlgebra toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
137
diff
changeset
|
829 LinearAlgebra::AssignVector(v, 0, 0, 1); |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
830 return v; |
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 else |
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 return referencedSlices_.begin()->second.geometry_.GetNormal(); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
835 } |
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 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
838 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
|
839 const Structure& structure, |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
840 const CoordinateSystem3D& cuttingPlane) const |
125 | 841 { |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
842 const CoordinateSystem3D cutting = CoordinateSystem3D::NormalizeCuttingPlane(cuttingPlane); |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
843 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
844 chains.clear(); |
125 | 845 |
846 Vector normal = GetNormal(); | |
847 | |
848 bool isOpposite; | |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
849 if (GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, cutting.GetNormal())) |
125 | 850 { |
851 // This is an axial projection | |
852 | |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
853 chains.reserve(structure.polygons_.size()); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
854 |
794 | 855 for (Polygons::const_iterator polygon = structure.polygons_.begin(); |
125 | 856 polygon != structure.polygons_.end(); ++polygon) |
857 { | |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
858 const Points& points = polygon->GetPoints(); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
859 |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
860 if (polygon->IsOnSlice(cutting, GetEstimatedNormal(), GetEstimatedSliceThickness()) && |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
861 !points.empty()) |
125 | 862 { |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
863 chains.push_back(std::vector<ScenePoint2D>()); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
864 chains.back().reserve(points.size() + 1); |
125 | 865 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
866 for (Points::const_iterator p = points.begin(); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
867 p != points.end(); ++p) |
125 | 868 { |
869 double x, y; | |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
870 cutting.ProjectPoint2(x, y, *p); |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
871 chains.back().push_back(ScenePoint2D(x, y)); |
125 | 872 } |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
873 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
874 double x0, y0; |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
875 cutting.ProjectPoint2(x0, y0, points.front()); |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
876 chains.back().push_back(ScenePoint2D(x0, y0)); |
125 | 877 } |
878 } | |
879 | |
880 return true; | |
881 } | |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
882 else if (GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, cutting.GetAxisX()) || |
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
883 GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, cutting.GetAxisY())) |
125 | 884 { |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
885 // Sagittal or coronal projection |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
886 |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
887 #if USE_BOOST_UNION_FOR_POLYGONS == 1 |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
888 std::vector<BoostPolygon> projected; |
1162
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
889 |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
890 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
|
891 polygon != structure.polygons_.end(); ++polygon) |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
892 { |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
893 double x1, y1, x2, y2; |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
894 |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
895 if (polygon->Project(x1, y1, x2, y2, cutting, GetEstimatedNormal(), GetEstimatedSliceThickness())) |
1162
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
896 { |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
897 projected.push_back(CreateRectangle(x1, y1, x2, y2)); |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
898 } |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
899 } |
1897
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
900 |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
901 BoostMultiPolygon merged; |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
902 Union(merged, projected); |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
903 |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
904 chains.resize(merged.size()); |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
905 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
|
906 { |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
907 const std::vector<BoostPoint>& outer = merged[i].outer(); |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
908 |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
909 chains[i].resize(outer.size()); |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
910 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
|
911 { |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
912 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
|
913 } |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
914 } |
1898
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
915 |
1908
affde38b84de
moved tentative bgo reimplementation of rt-struct into graveyard
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1905
diff
changeset
|
916 #else |
1898
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
917 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
918 std::list<Extent2D> rectangles; |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
919 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
920 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
|
921 polygon != structure.polygons_.end(); ++polygon) |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
922 { |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
923 double x1, y1, x2, y2; |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
924 |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
925 if (polygon->Project(x1, y1, x2, y2, cutting, GetEstimatedNormal(), GetEstimatedSliceThickness())) |
1898
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
926 { |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
927 rectangles.push_back(Extent2D(x1, y1, x2, y2)); |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
928 } |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
929 } |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
930 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
931 typedef std::list< std::vector<ScenePoint2D> > Contours; |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
932 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
933 Contours contours; |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
934 UnionOfRectangles::Apply(contours, rectangles); |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
935 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
936 chains.reserve(contours.size()); |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
937 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
938 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
|
939 { |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
940 chains.push_back(*it); |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
941 } |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
942 |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
943 #endif |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
944 |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
945 return true; |
125 | 946 } |
947 else | |
948 { | |
949 return false; | |
950 } | |
0 | 951 } |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
952 |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
953 |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
954 void DicomStructureSet::ProjectOntoLayer(PolylineSceneLayer& layer, |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
955 const CoordinateSystem3D& cuttingPlane, |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
956 size_t structureIndex, |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
957 const Color& color) const |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
958 { |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
959 std::vector< std::vector<ScenePoint2D> > chains; |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
960 |
1909
782ba9eb6f22
improved variable names
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1908
diff
changeset
|
961 if (ProjectStructure(chains, structureIndex, cuttingPlane)) |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
962 { |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
963 for (size_t j = 0; j < chains.size(); j++) |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
964 { |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
965 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
|
966 } |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
967 } |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
968 } |
1885
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
969 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
970 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
971 void DicomStructureSet::GetStructurePoints(std::list< std::vector<Vector> >& target, |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
972 size_t structureIndex, |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
973 const std::string& sopInstanceUid) const |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
974 { |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
975 target.clear(); |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
976 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
977 const Structure& structure = GetStructure(structureIndex); |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
978 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
979 // 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
|
980 // from SOP Instance UID to polygons |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
981 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
982 for (Polygons::const_iterator it = structure.polygons_.begin(); |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
983 it != structure.polygons_.end(); ++it) |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
984 { |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
985 if (it->GetSopInstanceUid() == sopInstanceUid) |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
986 { |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
987 target.push_back(it->GetPoints()); |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
988 } |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
989 } |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
990 } |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
991 |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
992 |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
993 void DicomStructureSet::EstimateGeometry() |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
994 { |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
995 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
|
996 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
997 BucketAccumulator2D accumulator(0, PI, 9, /* for acos() */ |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
998 -PI, PI, 9, /* for atan() */ |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
999 true /* store values */); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1000 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1001 unsigned int countPolygons = 0; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1002 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
|
1003 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1004 const Polygons& polygons = structures_[i].polygons_; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1005 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1006 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
|
1007 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1008 countPolygons++; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1009 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1010 const Points& points = it->GetPoints(); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1011 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1012 if (points.size() >= 3) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1013 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1014 // 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
|
1015 Vector normal; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1016 bool valid = false; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1017 |
1916 | 1018 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
|
1019 { |
1916 | 1020 const Vector& a = points[j]; |
1021 const Vector& b = points[j + 1]; | |
1022 const Vector& c = points[j + 2]; | |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1023 LinearAlgebra::CrossProduct(normal, b - a, c - a); // (*) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1024 LinearAlgebra::NormalizeVector(normal); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1025 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1026 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
|
1027 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1028 valid = true; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1029 break; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1030 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1031 } |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1032 |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1033 if (valid) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1034 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1035 // 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
|
1036 double d1 = GeometryToolbox::ProjectAlongNormal(points[0], normal); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1037 |
1916 | 1038 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
|
1039 { |
1916 | 1040 double d2 = GeometryToolbox::ProjectAlongNormal(points[j], normal); |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1041 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1042 if (!LinearAlgebra::IsNear(d1, d2)) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1043 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1044 valid = false; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1045 break; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1046 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1047 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1048 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1049 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1050 if (valid) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1051 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1052 if (normal[2] < 0) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1053 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1054 normal = -normal; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1055 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1056 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1057 // 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
|
1058 // 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
|
1059 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1060 const double theta = acos(normal[2]); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1061 const double phi = atan(normal[1]); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1062 accumulator.AddValue(theta, phi); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1063 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1064 } |
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 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1067 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1068 size_t bestX, bestY; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1069 accumulator.FindBestBucket(bestX, bestY); |
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 if (accumulator.GetBucketContentSize(bestX, bestY) > 0) |
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 double normalTheta, normalPhi; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1074 accumulator.ComputeBestMedian(normalTheta, normalPhi); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1075 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1076 // 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
|
1077 // 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
|
1078 double sinTheta = sin(normalTheta); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1079 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
|
1080 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1081 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1082 std::vector<double> polygonsProjection; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1083 polygonsProjection.reserve(countPolygons); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1084 |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1085 for (size_t i = 0; i < structures_.size(); i++) |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1086 { |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1087 const Polygons& polygons = structures_[i].polygons_; |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1088 |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1089 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
|
1090 { |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1091 const Points& points = it->GetPoints(); |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1092 polygonsProjection.push_back(GeometryToolbox::ProjectAlongNormal(points[0], estimatedNormal_)); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1093 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1094 } |
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 std::sort(polygonsProjection.begin(), polygonsProjection.end()); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1097 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1098 std::vector<double> deltas; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1099 deltas.reserve(polygonsProjection.size()); |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1100 |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1101 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
|
1102 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1103 if (!LinearAlgebra::IsNear(polygonsProjection[i], polygonsProjection[i + 1])) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1104 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1105 assert(polygonsProjection[i + 1] > polygonsProjection[i]); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1106 deltas.push_back(polygonsProjection[i + 1] - polygonsProjection[i]); |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1107 } |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1108 } |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1109 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1110 if (deltas.empty()) |
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 estimatedSliceThickness_ = 1; |
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 else |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1115 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1116 estimatedSliceThickness_ = LinearAlgebra::ComputeMedian(deltas); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1117 } |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1118 } |
1945
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1119 |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1120 |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1121 bool DicomStructureSet::LookupStructureName(size_t& structureIndex /* out */, |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1122 const std::string& name) const |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1123 { |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1124 StructureNamesIndex::const_iterator found = structureNamesIndex_.find(name); |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1125 |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1126 if (found == structureNamesIndex_.end()) |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1127 { |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1128 return false; |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1129 } |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1130 else |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1131 { |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1132 structureIndex = found->second; |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1133 return true; |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1134 } |
98952be6fb97
rendering plugin: rendering of multiple structures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1916
diff
changeset
|
1135 } |
0 | 1136 } |