Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/Toolbox/DicomStructureSet.cpp @ 1905:e318b524ad3f
use UnionOfRectangles algorithm to render RT-STRUCT
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 31 Jan 2022 18:50:35 +0100 |
parents | 738814c24574 |
children | affde38b84de |
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 | |
1871
7053b8a0aaec
upgrade to year 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1870
diff
changeset
|
5 * Copyright (C) 2017-2022 Osimis S.A., Belgium |
7053b8a0aaec
upgrade to year 2022
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1870
diff
changeset
|
6 * Copyright (C) 2021-2022 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 "DicomStructureSetUtils.h" // TODO REMOVE |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
61 # include "UnionOfRectangles.h" |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
62 #endif |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
63 |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
64 #if defined(_MSC_VER) |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
65 # pragma warning(pop) |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
66 #endif |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
67 |
1180
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
68 #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
|
69 # 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
|
70 #endif |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
71 |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
72 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
73 #if USE_BOOST_UNION_FOR_POLYGONS == 1 |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
74 |
1895
14c8f339d480
removed redundant definitions Point2D, Point3D and Vector3D from DicomStructureSetUtils.h
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1893
diff
changeset
|
75 typedef boost::geometry::model::d2::point_xy<double> BoostPoint; |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
76 typedef boost::geometry::model::polygon<BoostPoint> BoostPolygon; |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
77 typedef boost::geometry::model::multi_polygon<BoostPolygon> BoostMultiPolygon; |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
78 |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
79 static void Union(BoostMultiPolygon& output, |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
80 std::vector<BoostPolygon>& input) |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
81 { |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
82 for (size_t i = 0; i < input.size(); i++) |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
83 { |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
84 boost::geometry::correct(input[i]); |
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 |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
87 if (input.size() == 0) |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
88 { |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
89 output.clear(); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
90 } |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
91 else if (input.size() == 1) |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
92 { |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
93 output.resize(1); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
94 output[0] = input[0]; |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
95 } |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
96 else |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
97 { |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
98 boost::geometry::union_(input[0], input[1], output); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
99 |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
100 for (size_t i = 0; i < input.size(); i++) |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
101 { |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
102 BoostMultiPolygon tmp; |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
103 boost::geometry::union_(output, input[i], tmp); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
104 output = tmp; |
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 |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
109 static BoostPolygon CreateRectangle(float x1, float y1, |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
110 float x2, float y2) |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
111 { |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
112 BoostPolygon r; |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
113 boost::geometry::append(r, BoostPoint(x1, y1)); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
114 boost::geometry::append(r, BoostPoint(x1, y2)); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
115 boost::geometry::append(r, BoostPoint(x2, y2)); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
116 boost::geometry::append(r, BoostPoint(x2, y1)); |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
117 return r; |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
118 } |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
119 |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
120 #else |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
121 |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
122 namespace OrthancStone |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
123 { |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
124 static RtStructRectangleInSlab CreateRectangle(float x1, float y1, |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
125 float x2, float y2) |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
126 { |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
127 RtStructRectangleInSlab rect; |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
128 rect.xmin = std::min(x1, x2); |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
129 rect.xmax = std::max(x1, x2); |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
130 rect.ymin = std::min(y1, y2); |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
131 rect.ymax = std::max(y1, y2); |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
132 return rect; |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
133 } |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
134 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
135 bool CompareRectanglesForProjection(const std::pair<RtStructRectangleInSlab,double>& r1, |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
136 const std::pair<RtStructRectangleInSlab, double>& r2) |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
137 { |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
138 return r1.second < r2.second; |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
139 } |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
140 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
141 bool CompareSlabsY(const RtStructRectanglesInSlab& r1, |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
142 const RtStructRectanglesInSlab& r2) |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
143 { |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
144 if ((r1.size() == 0) || (r2.size() == 0)) |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
145 return false; |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
146 |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
147 return r1[0].ymax < r2[0].ymax; |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
148 } |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
149 } |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
150 |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
151 #endif |
0 | 152 |
153 namespace OrthancStone | |
154 { | |
1504 | 155 static const Orthanc::DicomTag DICOM_TAG_CONTOUR_GEOMETRIC_TYPE(0x3006, 0x0042); |
156 static const Orthanc::DicomTag DICOM_TAG_CONTOUR_IMAGE_SEQUENCE(0x3006, 0x0016); | |
157 static const Orthanc::DicomTag DICOM_TAG_CONTOUR_SEQUENCE(0x3006, 0x0040); | |
158 static const Orthanc::DicomTag DICOM_TAG_CONTOUR_DATA(0x3006, 0x0050); | |
159 static const Orthanc::DicomTag DICOM_TAG_NUMBER_OF_CONTOUR_POINTS(0x3006, 0x0046); | |
160 static const Orthanc::DicomTag DICOM_TAG_REFERENCED_SOP_INSTANCE_UID(0x0008, 0x1155); | |
161 static const Orthanc::DicomTag DICOM_TAG_ROI_CONTOUR_SEQUENCE(0x3006, 0x0039); | |
162 static const Orthanc::DicomTag DICOM_TAG_ROI_DISPLAY_COLOR(0x3006, 0x002a); | |
163 static const Orthanc::DicomTag DICOM_TAG_ROI_NAME(0x3006, 0x0026); | |
164 static const Orthanc::DicomTag DICOM_TAG_RT_ROI_INTERPRETED_TYPE(0x3006, 0x00a4); | |
165 static const Orthanc::DicomTag DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE(0x3006, 0x0080); | |
166 static const Orthanc::DicomTag DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE(0x3006, 0x0020); | |
0 | 167 |
168 | |
169 static uint8_t ConvertColor(double v) | |
170 { | |
171 if (v < 0) | |
172 { | |
173 return 0; | |
174 } | |
175 else if (v >= 255) | |
176 { | |
177 return 255; | |
178 } | |
179 else | |
180 { | |
181 return static_cast<uint8_t>(v); | |
182 } | |
183 } | |
184 | |
185 | |
1751
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
186 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
|
187 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
|
188 const Orthanc::DicomPath& tag) |
0 | 189 { |
118
a4d0b6c82b29
using Orthanc::DicomMap instead of OrthancPlugins::DicomDatasetReader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
113
diff
changeset
|
190 std::string value; |
a4d0b6c82b29
using Orthanc::DicomMap instead of OrthancPlugins::DicomDatasetReader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
113
diff
changeset
|
191 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
|
192 GenericToolbox::FastParseVector(target, value)); |
118
a4d0b6c82b29
using Orthanc::DicomMap instead of OrthancPlugins::DicomDatasetReader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
113
diff
changeset
|
193 } |
0 | 194 |
988
4c9b4c4de814
Fixed bug in DicomStructureSet that prevented points from being added to polygons
Benjamin Golinvaux <bgo@osimis.io>
parents:
981
diff
changeset
|
195 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
|
196 { |
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 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
|
198 { |
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 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
|
200 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
|
201 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
|
202 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
|
203 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
|
204 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
|
205 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
|
206 { |
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
|
207 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
|
208 << "slice of its instance | " |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
209 << "magnitude = " << magnitude << " | " |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
210 << "projectionAlongNormal_ = " << projectionAlongNormal_ << " | " |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
211 << "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
|
212 } |
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
|
213 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
|
214 } |
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
|
215 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
|
216 { |
988
4c9b4c4de814
Fixed bug in DicomStructureSet that prevented points from being added to polygons
Benjamin Golinvaux <bgo@osimis.io>
parents:
981
diff
changeset
|
217 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
|
218 } |
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
|
219 } |
0 | 220 |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
221 void DicomStructureSet::Polygon::AddPoint(const Vector& v) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
222 { |
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
|
223 #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
|
224 // 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
|
225 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
|
226 { |
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
|
227 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
|
228 } |
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
|
229 #else |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
230 CheckPoint(v); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
231 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
|
232 #endif |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
233 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
234 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
235 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
236 bool DicomStructureSet::Polygon::UpdateReferencedSlice(const ReferencedSlices& slices) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
237 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
238 if (hasSlice_) |
0 | 239 { |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
240 return true; |
32 | 241 } |
242 else | |
243 { | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
244 ReferencedSlices::const_iterator it = slices.find(sopInstanceUid_); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
245 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
246 if (it == slices.end()) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
247 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
248 return false; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
249 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
250 else |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
251 { |
1898
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
252 // return true; // TODO - TEST |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
253 |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
254 const CoordinateSystem3D& geometry = it->second.geometry_; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
255 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
256 hasSlice_ = true; |
131 | 257 geometry_ = geometry; |
258 projectionAlongNormal_ = GeometryToolbox::ProjectAlongNormal(geometry.GetOrigin(), geometry.GetNormal()); | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
259 sliceThickness_ = it->second.thickness_; |
0 | 260 |
1610
b7630b1a0253
ISceneLayer::GetBoundingBox() returns void
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
261 extent_.Clear(); |
131 | 262 |
1571 | 263 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
|
264 { |
1571 | 265 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
|
266 { |
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
|
267 double x, y; |
1571 | 268 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
|
269 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
|
270 } |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
271 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
272 return true; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
273 } |
0 | 274 } |
275 } | |
276 | |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
277 bool DicomStructureSet::Polygon::IsOnSlice(const CoordinateSystem3D& slice, |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
278 const Vector& estimatedNormal, |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
279 double estimatedSliceThickness) const |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
280 { |
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
|
281 bool isOpposite = false; |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
282 |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
283 if (points_.empty()) |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
284 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
285 return false; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
286 } |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
287 else if (hasSlice_) |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
288 { |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
289 // Use the actual geometry of this specific slice |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
290 if (!GeometryToolbox::IsParallelOrOpposite(isOpposite, slice.GetNormal(), geometry_.GetNormal())) |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
291 { |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
292 return false; |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
293 } |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
294 else |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
295 { |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
296 double d = GeometryToolbox::ProjectAlongNormal(slice.GetOrigin(), geometry_.GetNormal()); |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
297 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
|
298 } |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
299 } |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
300 else |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
301 { |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
302 // Use the estimated geometry for the global RT-STRUCT volume |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
303 if (!GeometryToolbox::IsParallelOrOpposite(isOpposite, slice.GetNormal(), estimatedNormal)) |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
304 { |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
305 return false; |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
306 } |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
307 else |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
308 { |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
309 double d1 = GeometryToolbox::ProjectAlongNormal(slice.GetOrigin(), estimatedNormal); |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
310 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
|
311 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
|
312 } |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
313 } |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
314 } |
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
|
315 |
131 | 316 bool DicomStructureSet::Polygon::Project(double& x1, |
317 double& y1, | |
318 double& x2, | |
319 double& y2, | |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
320 const CoordinateSystem3D& slice, |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
321 const Vector& estimatedNormal, |
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
322 double estimatedSliceThickness) const |
131 | 323 { |
324 if (!hasSlice_ || | |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
325 points_.size() <= 1) |
131 | 326 { |
327 return false; | |
328 } | |
329 | |
330 double x, y; | |
1013
53cc787bd7bc
- Added an optimized ProjectPoint2 to CoordinateSystem3D. It has *not* replaced
Benjamin Golinvaux <bgo@osimis.io>
parents:
1006
diff
changeset
|
331 geometry_.ProjectPoint2(x, y, slice.GetOrigin()); |
131 | 332 |
333 bool isOpposite; | |
334 if (GeometryToolbox::IsParallelOrOpposite | |
335 (isOpposite, slice.GetNormal(), geometry_.GetAxisY())) | |
336 { | |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
337 // plane is constant Y |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
338 |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
339 if (y < extent_.GetY1() || |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
340 y > extent_.GetY2()) |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
341 { |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
342 // The polygon does not intersect the input slice |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
343 return false; |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
344 } |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
345 |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
346 bool isFirst = true; |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
347 double xmin = std::numeric_limits<double>::infinity(); |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
348 double xmax = -std::numeric_limits<double>::infinity(); |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
349 |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
350 double prevX, prevY; |
1013
53cc787bd7bc
- Added an optimized ProjectPoint2 to CoordinateSystem3D. It has *not* replaced
Benjamin Golinvaux <bgo@osimis.io>
parents:
1006
diff
changeset
|
351 geometry_.ProjectPoint2(prevX, prevY, points_[points_.size() - 1]); |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
352 |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
353 for (size_t i = 0; i < points_.size(); i++) |
131 | 354 { |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
355 // Reference: ../../Resources/Computations/IntersectSegmentAndHorizontalLine.py |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
356 double curX, curY; |
1013
53cc787bd7bc
- Added an optimized ProjectPoint2 to CoordinateSystem3D. It has *not* replaced
Benjamin Golinvaux <bgo@osimis.io>
parents:
1006
diff
changeset
|
357 geometry_.ProjectPoint2(curX, curY, points_[i]); |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
358 |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
359 // if prev* and cur* are on opposite sides of y, this means that the |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
360 // segment intersects the plane. |
1838
80e029f8ec91
fix wrong display of RTStruct when an RTStruct point has exactly the same X or Y coordinates as the origin
Alain Mazy <alain@mazy.be>
parents:
1834
diff
changeset
|
361 if ((prevY <= y && curY >= y) || |
80e029f8ec91
fix wrong display of RTStruct when an RTStruct point has exactly the same X or Y coordinates as the origin
Alain Mazy <alain@mazy.be>
parents:
1834
diff
changeset
|
362 (prevY >= y && curY <= y)) |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
363 { |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
364 double p = (curX * prevY - curY * prevX + y * (prevX - curX)) / (prevY - curY); |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
365 xmin = std::min(xmin, p); |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
366 xmax = std::max(xmax, p); |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
367 isFirst = false; |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
368 |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
369 // xmin and xmax represent the extent of the rectangle along the |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
370 // intersection between the plane and the polygon geometry |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
371 |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
372 } |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
373 |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
374 prevX = curX; |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
375 prevY = curY; |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
376 } |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
377 |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
378 // if NO segment intersects the plane |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
379 if (isFirst) |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
380 { |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
381 return false; |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
382 } |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
383 else |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
384 { |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
385 // y is the plane y coord in the polygon geometry |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
386 // xmin and xmax are ALSO expressed in the polygon geometry |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
387 |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
388 // let's convert them to 3D world geometry... |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
389 Vector p1 = (geometry_.MapSliceToWorldCoordinates(xmin, y) + |
131 | 390 sliceThickness_ / 2.0 * geometry_.GetNormal()); |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
391 Vector p2 = (geometry_.MapSliceToWorldCoordinates(xmax, y) - |
131 | 392 sliceThickness_ / 2.0 * geometry_.GetNormal()); |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
393 |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
394 // then to the cutting plane geometry... |
1013
53cc787bd7bc
- Added an optimized ProjectPoint2 to CoordinateSystem3D. It has *not* replaced
Benjamin Golinvaux <bgo@osimis.io>
parents:
1006
diff
changeset
|
395 slice.ProjectPoint2(x1, y1, p1); |
53cc787bd7bc
- Added an optimized ProjectPoint2 to CoordinateSystem3D. It has *not* replaced
Benjamin Golinvaux <bgo@osimis.io>
parents:
1006
diff
changeset
|
396 slice.ProjectPoint2(x2, y2, p2); |
131 | 397 return true; |
398 } | |
399 } | |
400 else if (GeometryToolbox::IsParallelOrOpposite | |
401 (isOpposite, slice.GetNormal(), geometry_.GetAxisX())) | |
402 { | |
1170
1644de437a7b
fixes related to swapped normal in sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
403 // plane is constant X => Sagittal view (remember that in the |
1644de437a7b
fixes related to swapped normal in sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
404 // sagittal projection, the normal must be swapped) |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
405 |
1170
1644de437a7b
fixes related to swapped normal in sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
406 |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
407 /* |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
408 Please read the comments in the section above, by taking into account |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
409 the fact that, in this case, the plane has a constant X, not Y (in |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
410 polygon geometry_ coordinates) |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
411 */ |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
412 |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
413 if (x < extent_.GetX1() || |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
414 x > extent_.GetX2()) |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
415 { |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
416 return false; |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
417 } |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
418 |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
419 bool isFirst = true; |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
420 double ymin = std::numeric_limits<double>::infinity(); |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
421 double ymax = -std::numeric_limits<double>::infinity(); |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
422 |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
423 double prevX, prevY; |
1013
53cc787bd7bc
- Added an optimized ProjectPoint2 to CoordinateSystem3D. It has *not* replaced
Benjamin Golinvaux <bgo@osimis.io>
parents:
1006
diff
changeset
|
424 geometry_.ProjectPoint2(prevX, prevY, points_[points_.size() - 1]); |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
425 |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
426 for (size_t i = 0; i < points_.size(); i++) |
131 | 427 { |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
428 // Reference: ../../Resources/Computations/IntersectSegmentAndVerticalLine.py |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
429 double curX, curY; |
1013
53cc787bd7bc
- Added an optimized ProjectPoint2 to CoordinateSystem3D. It has *not* replaced
Benjamin Golinvaux <bgo@osimis.io>
parents:
1006
diff
changeset
|
430 geometry_.ProjectPoint2(curX, curY, points_[i]); |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
431 |
1838
80e029f8ec91
fix wrong display of RTStruct when an RTStruct point has exactly the same X or Y coordinates as the origin
Alain Mazy <alain@mazy.be>
parents:
1834
diff
changeset
|
432 if ((prevX <= x && curX >= x) || |
80e029f8ec91
fix wrong display of RTStruct when an RTStruct point has exactly the same X or Y coordinates as the origin
Alain Mazy <alain@mazy.be>
parents:
1834
diff
changeset
|
433 (prevX >= x && curX <= x)) |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
434 { |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
435 double p = (curX * prevY - curY * prevX + x * (curY - prevY)) / (curX - prevX); |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
436 ymin = std::min(ymin, p); |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
437 ymax = std::max(ymax, p); |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
438 isFirst = false; |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
439 } |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
440 |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
441 prevX = curX; |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
442 prevY = curY; |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
443 } |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
444 |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
445 if (isFirst) |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
446 { |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
447 return false; |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
448 } |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
449 else |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
450 { |
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
451 Vector p1 = (geometry_.MapSliceToWorldCoordinates(x, ymin) + |
131 | 452 sliceThickness_ / 2.0 * geometry_.GetNormal()); |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
453 Vector p2 = (geometry_.MapSliceToWorldCoordinates(x, ymax) - |
131 | 454 sliceThickness_ / 2.0 * geometry_.GetNormal()); |
455 | |
1013
53cc787bd7bc
- Added an optimized ProjectPoint2 to CoordinateSystem3D. It has *not* replaced
Benjamin Golinvaux <bgo@osimis.io>
parents:
1006
diff
changeset
|
456 slice.ProjectPoint2(x1, y1, p1); |
53cc787bd7bc
- Added an optimized ProjectPoint2 to CoordinateSystem3D. It has *not* replaced
Benjamin Golinvaux <bgo@osimis.io>
parents:
1006
diff
changeset
|
457 slice.ProjectPoint2(x2, y2, p2); |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
458 |
131 | 459 return true; |
460 } | |
461 } | |
462 else | |
463 { | |
464 // Should not happen | |
465 return false; | |
466 } | |
467 } | |
468 | |
469 | |
0 | 470 const DicomStructureSet::Structure& DicomStructureSet::GetStructure(size_t index) const |
471 { | |
472 if (index >= structures_.size()) | |
473 { | |
125 | 474 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
0 | 475 } |
476 | |
477 return structures_[index]; | |
478 } | |
479 | |
480 | |
125 | 481 DicomStructureSet::Structure& DicomStructureSet::GetStructure(size_t index) |
0 | 482 { |
125 | 483 if (index >= structures_.size()) |
484 { | |
485 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
0 | 486 } |
487 | |
488 return structures_[index]; | |
489 } | |
490 | |
1504 | 491 void DicomStructureSet::Setup(const IDicomDataset& tags) |
0 | 492 { |
1751
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
493 #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
|
494 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
|
495 #endif |
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
496 |
1504 | 497 DicomDatasetReader reader(tags); |
32 | 498 |
499 size_t count, tmp; | |
1834
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
500 if (!tags.GetSequenceSize(count, Orthanc::DicomPath(DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE)) || |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
501 !tags.GetSequenceSize(tmp, Orthanc::DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE)) || |
32 | 502 tmp != count || |
1834
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
503 !tags.GetSequenceSize(tmp, Orthanc::DicomPath(DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE)) || |
32 | 504 tmp != count) |
0 | 505 { |
506 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
507 } | |
508 | |
32 | 509 structures_.resize(count); |
510 for (size_t i = 0; i < count; i++) | |
511 { | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
512 structures_[i].interpretation_ = reader.GetStringValue |
1834
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
513 (Orthanc::DicomPath(DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE, i, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
514 DICOM_TAG_RT_ROI_INTERPRETED_TYPE), |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
515 "No interpretation"); |
0 | 516 |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
517 structures_[i].name_ = reader.GetStringValue |
1834
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
518 (Orthanc::DicomPath(DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE, i, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
519 DICOM_TAG_ROI_NAME), |
949
32eaf4929b08
OrthancMultiframeVolumeLoader and OrthancSeriesVolumeProgressiveLoader now implement IGeometryProvider so that the geometry reference can be switched (CT or DOSE, for instance) + VolumeImageGeometry::SetSize renamed to VolumeImageGeometry::SetSizeInVoxels + prevent text layer update if text or properties do not change + a few stream operator<< for debug (Vector, Matrix,...) + fixed memory access aligment issues in ImageBuffer3D::ExtractSagittalSlice + fix for wrong screen Y offset of mpr slices in DicomVolumeImageMPRSlicer.
Benjamin Golinvaux <bgo@osimis.io>
parents:
841
diff
changeset
|
520 "No name"); |
0 | 521 |
522 Vector color; | |
1834
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
523 if (FastParseVector(color, tags, Orthanc::DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
524 DICOM_TAG_ROI_DISPLAY_COLOR)) && |
32 | 525 color.size() == 3) |
0 | 526 { |
32 | 527 structures_[i].red_ = ConvertColor(color[0]); |
528 structures_[i].green_ = ConvertColor(color[1]); | |
529 structures_[i].blue_ = ConvertColor(color[2]); | |
530 } | |
531 else | |
532 { | |
533 structures_[i].red_ = 255; | |
534 structures_[i].green_ = 0; | |
535 structures_[i].blue_ = 0; | |
0 | 536 } |
537 | |
32 | 538 size_t countSlices; |
1834
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
539 if (!tags.GetSequenceSize(countSlices, Orthanc::DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
540 DICOM_TAG_CONTOUR_SEQUENCE))) |
32 | 541 { |
121
e66b2c757790
displaying rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
118
diff
changeset
|
542 countSlices = 0; |
32 | 543 } |
0 | 544 |
841
266e2b0b9abc
better error reporting in DicomStructureSetLoader + fixed POST request logic
Benjamin Golinvaux <bgo@osimis.io>
parents:
804
diff
changeset
|
545 LOG(INFO) << "New RT structure: \"" << structures_[i].name_ |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
546 << "\" with interpretation \"" << structures_[i].interpretation_ |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
547 << "\" containing " << countSlices << " slices (color: " |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
548 << static_cast<int>(structures_[i].red_) << "," |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
549 << static_cast<int>(structures_[i].green_) << "," |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
550 << static_cast<int>(structures_[i].blue_) << ")"; |
0 | 551 |
1834
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
552 /** |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
553 * These temporary variables avoid allocating many vectors in |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
554 * the loop below (indeed, "Orthanc::DicomPath" handles a |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
555 * "std::vector<PrefixItem>") |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
556 **/ |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
557 Orthanc::DicomPath countPointsPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
558 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
559 DICOM_TAG_NUMBER_OF_CONTOUR_POINTS); |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
560 |
1834
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
561 Orthanc::DicomPath geometricTypePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
562 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
563 DICOM_TAG_CONTOUR_GEOMETRIC_TYPE); |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
564 |
1834
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
565 Orthanc::DicomPath imageSequencePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
566 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
567 DICOM_TAG_CONTOUR_IMAGE_SEQUENCE); |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
568 |
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
|
569 // (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155) |
1834
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
570 Orthanc::DicomPath referencedInstancePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
571 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
572 DICOM_TAG_CONTOUR_IMAGE_SEQUENCE, 0, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
573 DICOM_TAG_REFERENCED_SOP_INSTANCE_UID); |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
574 |
1834
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
575 Orthanc::DicomPath contourDataPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
576 DICOM_TAG_CONTOUR_SEQUENCE, 0, |
126522623e20
replaced OrthancStone::DicomPath by new class Orthanc::DicomPath from orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1754
diff
changeset
|
577 DICOM_TAG_CONTOUR_DATA); |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
578 |
32 | 579 for (size_t j = 0; j < countSlices; j++) |
0 | 580 { |
32 | 581 unsigned int countPoints; |
0 | 582 |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
583 countPointsPath.SetPrefixIndex(1, j); |
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
584 if (!reader.GetUnsignedIntegerValue(countPoints, countPointsPath)) |
32 | 585 { |
586 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
587 } | |
588 | |
121
e66b2c757790
displaying rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
118
diff
changeset
|
589 //LOG(INFO) << "Parsing slice containing " << countPoints << " vertices"; |
0 | 590 |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
591 geometricTypePath.SetPrefixIndex(1, j); |
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
592 std::string type = reader.GetMandatoryStringValue(geometricTypePath); |
32 | 593 if (type != "CLOSED_PLANAR") |
0 | 594 { |
173
6b0411ac843a
fix captain rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
159
diff
changeset
|
595 LOG(WARNING) << "Ignoring contour with geometry type: " << type; |
6b0411ac843a
fix captain rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
159
diff
changeset
|
596 continue; |
0 | 597 } |
598 | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
599 size_t size; |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
600 |
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
601 imageSequencePath.SetPrefixIndex(1, 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
|
602 if (!tags.GetSequenceSize(size, imageSequencePath) || size != 1) |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
603 { |
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
|
604 LOG(ERROR) << "The ContourImageSequence sequence (tag 3006,0016) must be present and contain one entry."; |
0 | 605 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
606 } | |
607 | |
786
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
608 referencedInstancePath.SetPrefixIndex(1, j); |
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
609 std::string sopInstanceUid = reader.GetMandatoryStringValue(referencedInstancePath); |
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
610 |
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
611 contourDataPath.SetPrefixIndex(1, j); |
5aa728500586
optimizing constructor of DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
738
diff
changeset
|
612 std::string slicesData = reader.GetMandatoryStringValue(contourDataPath); |
0 | 613 |
614 Vector points; | |
1751
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
615 |
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
616 if (!GenericToolbox::FastParseVector(points, slicesData) || |
32 | 617 points.size() != 3 * countPoints) |
0 | 618 { |
619 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
620 } | |
621 | |
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
|
622 // seen in real world |
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
|
623 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
|
624 { |
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
|
625 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)"; |
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
|
626 } |
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
|
627 |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
628 Polygon polygon(sopInstanceUid); |
132
35c2b85836ce
fix rtstruct projections
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
131
diff
changeset
|
629 polygon.Reserve(countPoints); |
0 | 630 |
32 | 631 for (size_t k = 0; k < countPoints; k++) |
0 | 632 { |
633 Vector v(3); | |
634 v[0] = points[3 * k]; | |
635 v[1] = points[3 * k + 1]; | |
636 v[2] = points[3 * k + 2]; | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
637 polygon.AddPoint(v); |
0 | 638 } |
639 | |
640 structures_[i].polygons_.push_back(polygon); | |
641 } | |
642 } | |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
643 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
644 EstimateGeometry(); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
645 |
1751
946eb7200b82
FastParseVector usage + timing instrumentation guarded by STONE_TIME_BLOCKING_OPS
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
646 #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
|
647 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
|
648 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
|
649 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
|
650 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
|
651 #endif |
0 | 652 } |
653 | |
654 | |
1180
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
655 #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
|
656 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
|
657 { |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
658 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
|
659 Setup(dataset); |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
660 } |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
661 #endif |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
662 |
9c8f557ea799
ParsedDicomDataset to speed up loading RT-STRUCT from parsed DICOM files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1178
diff
changeset
|
663 |
0 | 664 Vector DicomStructureSet::GetStructureCenter(size_t index) const |
665 { | |
666 const Structure& structure = GetStructure(index); | |
667 | |
668 Vector center; | |
158
a053ca7fa5c6
LinearAlgebra toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
137
diff
changeset
|
669 LinearAlgebra::AssignVector(center, 0, 0, 0); |
0 | 670 if (structure.polygons_.empty()) |
671 { | |
672 return center; | |
673 } | |
674 | |
675 double n = static_cast<double>(structure.polygons_.size()); | |
676 | |
677 for (Polygons::const_iterator polygon = structure.polygons_.begin(); | |
678 polygon != structure.polygons_.end(); ++polygon) | |
679 { | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
680 if (!polygon->GetPoints().empty()) |
0 | 681 { |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
682 center += polygon->GetPoints().front() / n; |
0 | 683 } |
684 } | |
685 | |
686 return center; | |
687 } | |
688 | |
689 | |
690 const std::string& DicomStructureSet::GetStructureName(size_t index) const | |
691 { | |
692 return GetStructure(index).name_; | |
693 } | |
694 | |
695 | |
696 const std::string& DicomStructureSet::GetStructureInterpretation(size_t index) const | |
697 { | |
698 return GetStructure(index).interpretation_; | |
699 } | |
700 | |
701 | |
804
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
702 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
|
703 { |
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
704 const Structure& s = GetStructure(index); |
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
705 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
|
706 } |
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
707 |
61ba4b504e9a
PolylineSceneLayer now has one color per chain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
794
diff
changeset
|
708 |
1885
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
709 void DicomStructureSet::GetReferencedInstances(std::set<std::string>& instances) const |
0 | 710 { |
711 for (Structures::const_iterator structure = structures_.begin(); | |
712 structure != structures_.end(); ++structure) | |
713 { | |
714 for (Polygons::const_iterator polygon = structure->polygons_.begin(); | |
715 polygon != structure->polygons_.end(); ++polygon) | |
716 { | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
717 instances.insert(polygon->GetSopInstanceUid()); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
718 } |
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 } |
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 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
723 void DicomStructureSet::AddReferencedSlice(const std::string& sopInstanceUid, |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
724 const std::string& seriesInstanceUid, |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
725 const CoordinateSystem3D& geometry, |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
726 double thickness) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
727 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
728 if (referencedSlices_.find(sopInstanceUid) != referencedSlices_.end()) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
729 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
730 // 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
|
731 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
|
732 |
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
|
733 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
734 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
735 else |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
736 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
737 if (thickness < 0) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
738 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
739 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
740 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
741 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
742 if (!referencedSlices_.empty()) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
743 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
744 const ReferencedSlice& reference = referencedSlices_.begin()->second; |
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 if (reference.seriesInstanceUid_ != seriesInstanceUid) |
0 | 747 { |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
748 LOG(ERROR) << "This RT-STRUCT refers to several different series"; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
749 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
750 } |
0 | 751 |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
752 if (!GeometryToolbox::IsParallel(reference.geometry_.GetNormal(), geometry.GetNormal())) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
753 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
754 LOG(ERROR) << "The slices in this RT-STRUCT are not parallel"; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
755 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
756 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
757 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
758 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
759 referencedSlices_[sopInstanceUid] = ReferencedSlice(seriesInstanceUid, geometry, thickness); |
0 | 760 |
131 | 761 for (Structures::iterator structure = structures_.begin(); |
762 structure != structures_.end(); ++structure) | |
763 { | |
764 for (Polygons::iterator polygon = structure->polygons_.begin(); | |
765 polygon != structure->polygons_.end(); ++polygon) | |
766 { | |
767 polygon->UpdateReferencedSlice(referencedSlices_); | |
768 } | |
769 } | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
770 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
771 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
772 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
773 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
774 void DicomStructureSet::AddReferencedSlice(const Orthanc::DicomMap& dataset) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
775 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
776 CoordinateSystem3D slice(dataset); |
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 double thickness = 1; // 1 mm by default |
0 | 779 |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
780 std::string s; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
781 Vector v; |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
988
diff
changeset
|
782 if (dataset.LookupStringValue(s, Orthanc::DICOM_TAG_SLICE_THICKNESS, false) && |
158
a053ca7fa5c6
LinearAlgebra toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
137
diff
changeset
|
783 LinearAlgebra::ParseVector(v, s) && |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
784 v.size() > 0) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
785 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
786 thickness = v[0]; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
787 } |
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 std::string instance, series; |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
988
diff
changeset
|
790 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
|
791 dataset.LookupStringValue(series, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) |
122
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 AddReferencedSlice(instance, series, slice, thickness); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
794 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
795 else |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
796 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
797 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
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 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
800 |
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 void DicomStructureSet::CheckReferencedSlices() |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
803 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
804 for (Structures::iterator structure = structures_.begin(); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
805 structure != structures_.end(); ++structure) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
806 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
807 for (Polygons::iterator polygon = structure->polygons_.begin(); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
808 polygon != structure->polygons_.end(); ++polygon) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
809 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
810 if (!polygon->UpdateReferencedSlice(referencedSlices_)) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
811 { |
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
|
812 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
|
813 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
|
814 { |
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
|
815 LOG(ERROR) << "DicomStructureSet::CheckReferencedSlices(): " |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
816 << " missing information about referenced instance " |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
817 << "(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
|
818 } |
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
|
819 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
|
820 { |
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
|
821 LOG(ERROR) << "DicomStructureSet::CheckReferencedSlices(): " |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
822 << " missing information about referenced instance " |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
823 << "(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
|
824 } |
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
|
825 //throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
0 | 826 } |
827 } | |
828 } | |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
829 } |
0 | 830 |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
831 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
832 Vector DicomStructureSet::GetNormal() const |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
833 { |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
834 if (referencedSlices_.empty()) |
122
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 Vector v; |
158
a053ca7fa5c6
LinearAlgebra toolbox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
137
diff
changeset
|
837 LinearAlgebra::AssignVector(v, 0, 0, 1); |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
838 return v; |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
839 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
840 else |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
841 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
842 return referencedSlices_.begin()->second.geometry_.GetNormal(); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
843 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
844 } |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
121
diff
changeset
|
845 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
846 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
|
847 const Structure& structure, |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
848 const CoordinateSystem3D& sourceSlice) const |
125 | 849 { |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
850 const CoordinateSystem3D slice = CoordinateSystem3D::NormalizeCuttingPlane(sourceSlice); |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
851 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
852 chains.clear(); |
125 | 853 |
854 Vector normal = GetNormal(); | |
855 | |
856 bool isOpposite; | |
857 if (GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, slice.GetNormal())) | |
858 { | |
859 // This is an axial projection | |
860 | |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
861 chains.reserve(structure.polygons_.size()); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
862 |
794 | 863 for (Polygons::const_iterator polygon = structure.polygons_.begin(); |
125 | 864 polygon != structure.polygons_.end(); ++polygon) |
865 { | |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
866 const Points& points = polygon->GetPoints(); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
867 |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
868 if (polygon->IsOnSlice(slice, GetEstimatedNormal(), GetEstimatedSliceThickness()) && |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
869 !points.empty()) |
125 | 870 { |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
871 chains.push_back(std::vector<ScenePoint2D>()); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
872 chains.back().reserve(points.size() + 1); |
125 | 873 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
874 for (Points::const_iterator p = points.begin(); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
875 p != points.end(); ++p) |
125 | 876 { |
877 double x, y; | |
1013
53cc787bd7bc
- Added an optimized ProjectPoint2 to CoordinateSystem3D. It has *not* replaced
Benjamin Golinvaux <bgo@osimis.io>
parents:
1006
diff
changeset
|
878 slice.ProjectPoint2(x, y, *p); |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
879 chains.back().push_back(ScenePoint2D(x, y)); |
125 | 880 } |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
881 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
882 double x0, y0; |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
883 slice.ProjectPoint2(x0, y0, points.front()); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
884 chains.back().push_back(ScenePoint2D(x0, y0)); |
125 | 885 } |
886 } | |
887 | |
888 return true; | |
889 } | |
890 else if (GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, slice.GetAxisX()) || | |
891 GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, slice.GetAxisY())) | |
892 { | |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
893 // Sagittal or coronal projection |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
894 |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
895 #if USE_BOOST_UNION_FOR_POLYGONS == 1 |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
896 std::vector<BoostPolygon> projected; |
1162
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
897 |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
898 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
|
899 polygon != structure.polygons_.end(); ++polygon) |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
900 { |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
901 double x1, y1, x2, y2; |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
902 |
1905
e318b524ad3f
use UnionOfRectangles algorithm to render RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1904
diff
changeset
|
903 if (polygon->Project(x1, y1, x2, y2, slice, GetEstimatedNormal(), GetEstimatedSliceThickness())) |
1162
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
904 { |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
905 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
|
906 } |
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
907 } |
1897
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 BoostMultiPolygon merged; |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
910 Union(merged, projected); |
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.resize(merged.size()); |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
913 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
|
914 { |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
915 const std::vector<BoostPoint>& outer = merged[i].outer(); |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
916 |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
917 chains[i].resize(outer.size()); |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
918 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
|
919 { |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
920 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
|
921 } |
144f8f82c15a
added ctrl key in RtViewerWasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1896
diff
changeset
|
922 } |
1898
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
923 |
1905
e318b524ad3f
use UnionOfRectangles algorithm to render RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1904
diff
changeset
|
924 #elif 1 |
1898
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
925 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
926 std::list<Extent2D> rectangles; |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
927 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
928 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
|
929 polygon != structure.polygons_.end(); ++polygon) |
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 double x1, y1, x2, y2; |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
932 |
1905
e318b524ad3f
use UnionOfRectangles algorithm to render RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1904
diff
changeset
|
933 if (polygon->Project(x1, y1, x2, y2, slice, GetEstimatedNormal(), GetEstimatedSliceThickness())) |
1898
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
934 { |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
935 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
|
936 } |
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 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
939 typedef std::list< std::vector<ScenePoint2D> > Contours; |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
940 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
941 Contours contours; |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
942 UnionOfRectangles::Apply(contours, rectangles); |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
943 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
944 chains.reserve(contours.size()); |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
945 |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
946 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
|
947 { |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
948 chains.push_back(*it); |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
949 } |
a5e54bd87b25
try to use UnionOfRectangles in DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1897
diff
changeset
|
950 |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
951 #else |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
952 // this will contain the intersection of the polygon slab with |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
953 // the cutting plane, projected on the cutting plane coord system |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
954 // (that yields a rectangle) + the Z coordinate of the polygon |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
955 // (this is required to group polygons with the same Z later) |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
956 std::vector<std::pair<RtStructRectangleInSlab, double> > projected; |
1162
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
957 |
794 | 958 for (Polygons::const_iterator polygon = structure.polygons_.begin(); |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
959 polygon != structure.polygons_.end(); ++polygon) |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
960 { |
131 | 961 double x1, y1, x2, y2; |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
962 |
1904
738814c24574
speed up rendering of axial slices of RT-STRUCT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1898
diff
changeset
|
963 if (polygon->Project(x1, y1, x2, y2, slice, GetEstimatedNormal(), GetEstimatedSliceThickness())) |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
964 { |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
965 double curZ = polygon->GetGeometryOrigin()[2]; |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
966 |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
967 // x1,y1 and x2,y2 are in "slice" coordinates (the cutting plane |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
968 // geometry) |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
969 projected.push_back(std::make_pair(CreateRectangle( |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
970 static_cast<float>(x1), |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
971 static_cast<float>(y1), |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
972 static_cast<float>(x2), |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
973 static_cast<float>(y2)),curZ)); |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
974 } |
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
975 } |
1162
709aa65aca17
recovery of USE_BOOST_UNION_FOR_POLYGONS
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1013
diff
changeset
|
976 |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
977 // projected contains a set of rectangles specified by two opposite |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
978 // corners (x1,y1,x2,y2) |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
979 // we need to merge them |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
980 // each slab yields ONE polygon! |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
981 |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
982 // we need to sorted all the rectangles that originate from the same Z |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
983 // into lanes. To make sure they are grouped together in the array, we |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
984 // sort it. |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
985 std::sort(projected.begin(), projected.end(), CompareRectanglesForProjection); |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
986 |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
987 std::vector<RtStructRectanglesInSlab> rectanglesForEachSlab; |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
988 rectanglesForEachSlab.reserve(projected.size()); |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
989 |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
990 double curZ = 0; |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
991 for (size_t i = 0; i < projected.size(); ++i) |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
992 { |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
993 #if 0 |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
994 rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
995 #else |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
996 if (i == 0) |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
997 { |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
998 curZ = projected[i].second; |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
999 rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1000 } |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1001 else |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1002 { |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1003 // this check is needed to prevent creating a new slab if |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1004 // the new polygon is at the same Z coord than last one |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1005 if (!LinearAlgebra::IsNear(curZ, projected[i].second)) |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1006 { |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1007 rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1008 curZ = projected[i].second; |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1009 } |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1010 } |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1011 #endif |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1012 |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1013 rectanglesForEachSlab.back().push_back(projected[i].first); |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1014 |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1015 // as long as they have the same y, we should put them into the same lane |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1016 // BUT in Sebastien's code, there is only one polygon per lane. |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1017 |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1018 //std::cout << "rect: xmin = " << rect.xmin << " xmax = " << rect.xmax << " ymin = " << rect.ymin << " ymax = " << rect.ymax << std::endl; |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1019 } |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1020 |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1021 // now we need to sort the slabs in increasing Y order (see ConvertListOfSlabsToSegments) |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1022 std::sort(rectanglesForEachSlab.begin(), rectanglesForEachSlab.end(), CompareSlabsY); |
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1023 |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1024 std::vector< std::pair<ScenePoint2D, ScenePoint2D> > segments; |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1025 ConvertListOfSlabsToSegments(segments, rectanglesForEachSlab, projected.size()); |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1026 |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1027 chains.resize(segments.size()); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1028 for (size_t i = 0; i < segments.size(); i++) |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1029 { |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1030 chains[i].resize(2); |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1031 chains[i][0] = segments[i].first; |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1032 chains[i][1] = segments[i].second; |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1033 } |
1000
50e5acf5553b
changed RTSTRUCT rendering from polygons to segments
Benjamin Golinvaux <bgo@osimis.io>
parents:
994
diff
changeset
|
1034 #endif |
125 | 1035 |
126
c9e88e7935a4
rt-struct projection
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
125
diff
changeset
|
1036 return true; |
125 | 1037 } |
1038 else | |
1039 { | |
1040 return false; | |
1041 } | |
0 | 1042 } |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1043 |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1044 |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1045 void DicomStructureSet::ProjectOntoLayer(PolylineSceneLayer& layer, |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1046 const CoordinateSystem3D& plane, |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1047 size_t structureIndex, |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1048 const Color& color) const |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1049 { |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1050 std::vector< std::vector<ScenePoint2D> > chains; |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1051 |
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1052 if (ProjectStructure(chains, structureIndex, plane)) |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1053 { |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1054 for (size_t j = 0; j < chains.size(); j++) |
1178
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1055 { |
1896
b3c08e607d9f
simplified signature of DicomStructureSet::ProjectStructure()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1895
diff
changeset
|
1056 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
|
1057 } |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1058 } |
3c7cdbf32e2a
DicomStructureSet::ProjectOntoLayer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1170
diff
changeset
|
1059 } |
1885
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1060 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1061 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1062 void DicomStructureSet::GetStructurePoints(std::list< std::vector<Vector> >& target, |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1063 size_t structureIndex, |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1064 const std::string& sopInstanceUid) const |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1065 { |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1066 target.clear(); |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1067 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1068 const Structure& structure = GetStructure(structureIndex); |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1069 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1070 // 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
|
1071 // from SOP Instance UID to polygons |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1072 |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1073 for (Polygons::const_iterator it = structure.polygons_.begin(); |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1074 it != structure.polygons_.end(); ++it) |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1075 { |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1076 if (it->GetSopInstanceUid() == sopInstanceUid) |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1077 { |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1078 target.push_back(it->GetPoints()); |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1079 } |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1080 } |
ddaee6b96501
retrieving rt-struct info
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
1081 } |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1082 |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1083 |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1084 void DicomStructureSet::EstimateGeometry() |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1085 { |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1086 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
|
1087 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1088 BucketAccumulator2D accumulator(0, PI, 9, /* for acos() */ |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1089 -PI, PI, 9, /* for atan() */ |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1090 true /* store values */); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1091 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1092 unsigned int countPolygons = 0; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1093 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
|
1094 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1095 const Polygons& polygons = structures_[i].polygons_; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1096 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1097 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
|
1098 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1099 countPolygons++; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1100 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1101 const Points& points = it->GetPoints(); |
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 (points.size() >= 3) |
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 // 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
|
1106 Vector normal; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1107 bool valid = false; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1108 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1109 for (size_t i = 0; i + 2 < points.size(); i++) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1110 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1111 const Vector& a = points[i]; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1112 const Vector& b = points[i + 1]; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1113 const Vector& c = points[i + 2]; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1114 LinearAlgebra::CrossProduct(normal, b - a, c - a); // (*) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1115 LinearAlgebra::NormalizeVector(normal); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1116 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1117 if (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
|
1118 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1119 valid = true; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1120 break; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1121 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1122 } |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1123 |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1124 if (valid) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1125 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1126 // 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
|
1127 double d1 = GeometryToolbox::ProjectAlongNormal(points[0], normal); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1128 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1129 for (size_t i = 1; i < points.size(); i++) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1130 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1131 double d2 = GeometryToolbox::ProjectAlongNormal(points[i], normal); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1132 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1133 if (!LinearAlgebra::IsNear(d1, d2)) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1134 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1135 valid = false; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1136 break; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1137 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1138 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1139 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1140 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1141 if (valid) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1142 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1143 if (normal[2] < 0) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1144 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1145 normal = -normal; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1146 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1147 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1148 // 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
|
1149 // 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
|
1150 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1151 const double theta = acos(normal[2]); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1152 const double phi = atan(normal[1]); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1153 accumulator.AddValue(theta, phi); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1154 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1155 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1156 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1157 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1158 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1159 size_t bestX, bestY; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1160 accumulator.FindBestBucket(bestX, bestY); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1161 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1162 if (accumulator.GetBucketContentSize(bestX, bestY) > 0) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1163 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1164 double normalTheta, normalPhi; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1165 accumulator.ComputeBestMedian(normalTheta, normalPhi); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1166 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1167 // 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
|
1168 // 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
|
1169 double sinTheta = sin(normalTheta); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1170 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
|
1171 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1172 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1173 std::vector<double> polygonsProjection; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1174 polygonsProjection.reserve(countPolygons); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1175 |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1176 for (size_t i = 0; i < structures_.size(); i++) |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1177 { |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1178 const Polygons& polygons = structures_[i].polygons_; |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1179 |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1180 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
|
1181 { |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1182 const Points& points = it->GetPoints(); |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1183 polygonsProjection.push_back(GeometryToolbox::ProjectAlongNormal(points[0], estimatedNormal_)); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1184 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1185 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1186 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1187 std::sort(polygonsProjection.begin(), polygonsProjection.end()); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1188 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1189 std::vector<double> deltas; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1190 deltas.reserve(polygonsProjection.size()); |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1191 |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1192 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
|
1193 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1194 if (!LinearAlgebra::IsNear(polygonsProjection[i], polygonsProjection[i + 1])) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1195 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1196 assert(polygonsProjection[i + 1] > polygonsProjection[i]); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1197 deltas.push_back(polygonsProjection[i + 1] - polygonsProjection[i]); |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1198 } |
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1199 } |
1892
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1200 |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1201 if (deltas.empty()) |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1202 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1203 estimatedSliceThickness_ = 1; |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1204 } |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1205 else |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1206 { |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1207 estimatedSliceThickness_ = LinearAlgebra::ComputeMedian(deltas); |
cdf91ad891a5
estimated geometry of rt-struct
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1890
diff
changeset
|
1208 } |
1890
6ce81914f7e4
added classes BucketAccumulator1D/2D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1885
diff
changeset
|
1209 } |
0 | 1210 } |